-
-
Notifications
You must be signed in to change notification settings - Fork 601
/
resolve-packages.ts
93 lines (81 loc) · 2.53 KB
/
resolve-packages.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
import chalk from "chalk";
import * as path from "path";
import isLocalPath from "./is-local-path";
import modifyConfigHelper from "./modify-config-helper";
import { getPathToGlobalPackages } from "./package-manager";
import { spawnChild } from "./package-manager";
interface IChildProcess {
status: number;
}
/**
*
* Attaches a promise to the installation of the package
*
* @param {Function} child - The function to attach a promise to
* @returns {Promise} promise - Returns a promise to the installation
*/
export function processPromise(child: IChildProcess): Promise<any> {
return new Promise((resolve: (_?: void) => void, reject: (_?: void) => void) => {
if (child.status !== 0) {
reject();
} else {
resolve();
}
});
}
/**
*
* Resolves and installs the packages, later sending them to @creator
*
* @param {String[]} pkg - The dependencies to be installed
* @returns {Function|Error} creator - Builds
* a webpack configuration through yeoman or throws an error
*/
export function resolvePackages(pkg: string[]): Function | void {
Error.stackTraceLimit = 30;
const packageLocations: string[] = [];
function invokeGeneratorIfReady(): Function {
if (packageLocations.length === pkg.length) {
return modifyConfigHelper("init", null, null, packageLocations);
}
}
pkg.forEach((scaffold: string) => {
// Resolve paths to modules on local filesystem
if (isLocalPath(scaffold)) {
let absolutePath: string = scaffold;
try {
absolutePath = path.resolve(process.cwd(), scaffold);
require.resolve(absolutePath);
packageLocations.push(absolutePath);
} catch (err) {
console.error(`Cannot find a generator at ${absolutePath}.`);
console.error("\nReason:\n");
console.error(chalk.bold.red(err));
process.exitCode = 1;
}
invokeGeneratorIfReady();
return;
}
// Resolve modules on npm registry
processPromise(spawnChild(scaffold))
.then((_: void) => {
try {
const globalPath: string = getPathToGlobalPackages();
packageLocations.push(path.resolve(globalPath, scaffold));
} catch (err) {
console.error("Package wasn't validated correctly..");
console.error("Submit an issue for", pkg, "if this persists");
console.error("\nReason: \n");
console.error(chalk.bold.red(err));
process.exitCode = 1;
}
})
.catch((err: string) => {
console.error("Package couldn't be installed, aborting..");
console.error("\nReason: \n");
console.error(chalk.bold.red(err));
process.exitCode = 1;
})
.then(invokeGeneratorIfReady);
});
}