projen
Version:
CDK for software projects
79 lines • 9.62 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.CliError = void 0;
exports.installPackage = installPackage;
exports.renderInstallCommand = renderInstallCommand;
exports.findJsiiFilePath = findJsiiFilePath;
const fs = require("fs");
const path = require("path");
const logging = require("../logging");
const util_1 = require("../util");
/**
* Installs the npm module (through `npm install`) to node_modules under `projectDir`.
* @param spec The npm package spec (e.g. `foo@^1.2` or `foo@/var/folders/8k/qcw0ls5pv_ph0000gn/T/projen-RYurCw/pkg.tgz`)
* @returns The installed package name (e.g. `@foo/bar`)
*/
function installPackage(baseDir, spec, isProjen = false) {
const packageJsonPath = path.join(baseDir, "package.json");
const packageJsonExisted = fs.existsSync(packageJsonPath);
if (!packageJsonExisted) {
// Make sure we have a package.json to read from later
(0, util_1.exec)("npm init --yes", { cwd: baseDir });
}
logging.info(`installing module ${spec}...`);
(0, util_1.exec)(renderInstallCommand(baseDir, spec), { cwd: baseDir });
// Get the true installed package name
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, "utf-8"));
const packageName = Object.keys(packageJson.devDependencies).find((name) => isProjen ? name === "projen" : name !== "projen");
if (!packageName) {
throw new Error(`Unable to resolve package name from spec ${spec}`);
}
// if package.json did not exist before calling `npm install`, we should remove it
// so we can start off clean.
if (!packageJsonExisted) {
fs.rmSync(packageJsonPath, { force: true, recursive: true });
}
return packageName;
}
/**
* Render a command to install an npm package.
*
* Engine checks are ignored at this point so that the module can be installed
* regardless of the environment. This was needed to unblock the upgrade of the
* minimum node version of projen, but also okay generally because engine checks
* will be performed later and for all eternity.
*
* @param dir Base directory
* @param module The module to install (e.g. foo@^1.2)
* @returns The string that includes the install command ("npm install ...")
*/
function renderInstallCommand(dir, module) {
return `npm install --save --save-dev -f --no-package-lock --prefix="${dir}" ${module}`;
}
function findJsiiFilePath(baseDir, moduleName) {
try {
return path.dirname(require.resolve(`${moduleName}/.jsii`, {
paths: [baseDir],
}));
}
catch (error) {
if (error instanceof Error &&
"code" in error &&
error.code === "MODULE_NOT_FOUND") {
// the provided module is not a jsii module
return undefined;
}
else {
// unexpected error, throw it
throw error;
}
}
}
class CliError extends Error {
constructor(...lines) {
super(lines.join("\n"));
this.name = "CliError";
}
}
exports.CliError = CliError;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGkvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFVQSx3Q0FpQ0M7QUFjRCxvREFFQztBQUVELDRDQXVCQztBQXBGRCx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLHNDQUFzQztBQUN0QyxrQ0FBK0I7QUFFL0I7Ozs7R0FJRztBQUNILFNBQWdCLGNBQWMsQ0FDNUIsT0FBZSxFQUNmLElBQVksRUFDWixRQUFRLEdBQUcsS0FBSztJQUVoQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztJQUMzRCxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFMUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDeEIsc0RBQXNEO1FBQ3RELElBQUEsV0FBSSxFQUFDLGdCQUFnQixFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksS0FBSyxDQUFDLENBQUM7SUFDN0MsSUFBQSxXQUFJLEVBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFNUQsc0NBQXNDO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMxRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUN6RSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQ2pELENBQUM7SUFFRixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsa0ZBQWtGO0lBQ2xGLDZCQUE2QjtJQUM3QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN4QixFQUFFLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLEdBQVcsRUFBRSxNQUFjO0lBQzlELE9BQU8sZ0VBQWdFLEdBQUcsS0FBSyxNQUFNLEVBQUUsQ0FBQztBQUMxRixDQUFDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQzlCLE9BQWUsRUFDZixVQUFrQjtJQUVsQixJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQ2pCLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxVQUFVLFFBQVEsRUFBRTtZQUNyQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7U0FDakIsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztRQUN4QixJQUNFLEtBQUssWUFBWSxLQUFLO1lBQ3RCLE1BQU0sSUFBSSxLQUFLO1lBQ2YsS0FBSyxDQUFDLElBQUksS0FBSyxrQkFBa0IsRUFDakMsQ0FBQztZQUNELDJDQUEyQztZQUMzQyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO2FBQU0sQ0FBQztZQUNOLDZCQUE2QjtZQUM3QixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQWEsUUFBUyxTQUFRLEtBQUs7SUFDakMsWUFBWSxHQUFHLEtBQWU7UUFDNUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUFMRCw0QkFLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgbG9nZ2luZyBmcm9tIFwiLi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gXCIuLi91dGlsXCI7XG5cbi8qKlxuICogSW5zdGFsbHMgdGhlIG5wbSBtb2R1bGUgKHRocm91Z2ggYG5wbSBpbnN0YWxsYCkgdG8gbm9kZV9tb2R1bGVzIHVuZGVyIGBwcm9qZWN0RGlyYC5cbiAqIEBwYXJhbSBzcGVjIFRoZSBucG0gcGFja2FnZSBzcGVjIChlLmcuIGBmb29AXjEuMmAgb3IgYGZvb0AvdmFyL2ZvbGRlcnMvOGsvcWN3MGxzNXB2X3BoMDAwMGduL1QvcHJvamVuLVJZdXJDdy9wa2cudGd6YClcbiAqIEByZXR1cm5zIFRoZSBpbnN0YWxsZWQgcGFja2FnZSBuYW1lIChlLmcuIGBAZm9vL2JhcmApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsUGFja2FnZShcbiAgYmFzZURpcjogc3RyaW5nLFxuICBzcGVjOiBzdHJpbmcsXG4gIGlzUHJvamVuID0gZmFsc2Vcbik6IHN0cmluZyB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihiYXNlRGlyLCBcInBhY2thZ2UuanNvblwiKTtcbiAgY29uc3QgcGFja2FnZUpzb25FeGlzdGVkID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuXG4gIGlmICghcGFja2FnZUpzb25FeGlzdGVkKSB7XG4gICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBwYWNrYWdlLmpzb24gdG8gcmVhZCBmcm9tIGxhdGVyXG4gICAgZXhlYyhcIm5wbSBpbml0IC0teWVzXCIsIHsgY3dkOiBiYXNlRGlyIH0pO1xuICB9XG5cbiAgbG9nZ2luZy5pbmZvKGBpbnN0YWxsaW5nIG1vZHVsZSAke3NwZWN9Li4uYCk7XG4gIGV4ZWMocmVuZGVySW5zdGFsbENvbW1hbmQoYmFzZURpciwgc3BlYyksIHsgY3dkOiBiYXNlRGlyIH0pO1xuXG4gIC8vIEdldCB0aGUgdHJ1ZSBpbnN0YWxsZWQgcGFja2FnZSBuYW1lXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCBcInV0Zi04XCIpKTtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMpLmZpbmQoKG5hbWUpID0+XG4gICAgaXNQcm9qZW4gPyBuYW1lID09PSBcInByb2plblwiIDogbmFtZSAhPT0gXCJwcm9qZW5cIlxuICApO1xuXG4gIGlmICghcGFja2FnZU5hbWUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZXNvbHZlIHBhY2thZ2UgbmFtZSBmcm9tIHNwZWMgJHtzcGVjfWApO1xuICB9XG5cbiAgLy8gaWYgcGFja2FnZS5qc29uIGRpZCBub3QgZXhpc3QgYmVmb3JlIGNhbGxpbmcgYG5wbSBpbnN0YWxsYCwgd2Ugc2hvdWxkIHJlbW92ZSBpdFxuICAvLyBzbyB3ZSBjYW4gc3RhcnQgb2ZmIGNsZWFuLlxuICBpZiAoIXBhY2thZ2VKc29uRXhpc3RlZCkge1xuICAgIGZzLnJtU3luYyhwYWNrYWdlSnNvblBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgfVxuXG4gIHJldHVybiBwYWNrYWdlTmFtZTtcbn1cblxuLyoqXG4gKiBSZW5kZXIgYSBjb21tYW5kIHRvIGluc3RhbGwgYW4gbnBtIHBhY2thZ2UuXG4gKlxuICogRW5naW5lIGNoZWNrcyBhcmUgaWdub3JlZCBhdCB0aGlzIHBvaW50IHNvIHRoYXQgdGhlIG1vZHVsZSBjYW4gYmUgaW5zdGFsbGVkXG4gKiByZWdhcmRsZXNzIG9mIHRoZSBlbnZpcm9ubWVudC4gVGhpcyB3YXMgbmVlZGVkIHRvIHVuYmxvY2sgdGhlIHVwZ3JhZGUgb2YgdGhlXG4gKiBtaW5pbXVtIG5vZGUgdmVyc2lvbiBvZiBwcm9qZW4sIGJ1dCBhbHNvIG9rYXkgZ2VuZXJhbGx5IGJlY2F1c2UgZW5naW5lIGNoZWNrc1xuICogd2lsbCBiZSBwZXJmb3JtZWQgbGF0ZXIgYW5kIGZvciBhbGwgZXRlcm5pdHkuXG4gKlxuICogQHBhcmFtIGRpciBCYXNlIGRpcmVjdG9yeVxuICogQHBhcmFtIG1vZHVsZSBUaGUgbW9kdWxlIHRvIGluc3RhbGwgKGUuZy4gZm9vQF4xLjIpXG4gKiBAcmV0dXJucyBUaGUgc3RyaW5nIHRoYXQgaW5jbHVkZXMgdGhlIGluc3RhbGwgY29tbWFuZCAoXCJucG0gaW5zdGFsbCAuLi5cIilcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmRlckluc3RhbGxDb21tYW5kKGRpcjogc3RyaW5nLCBtb2R1bGU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgbnBtIGluc3RhbGwgLS1zYXZlIC0tc2F2ZS1kZXYgLWYgLS1uby1wYWNrYWdlLWxvY2sgLS1wcmVmaXg9XCIke2Rpcn1cIiAke21vZHVsZX1gO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZEpzaWlGaWxlUGF0aChcbiAgYmFzZURpcjogc3RyaW5nLFxuICBtb2R1bGVOYW1lOiBzdHJpbmdcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZShcbiAgICAgIHJlcXVpcmUucmVzb2x2ZShgJHttb2R1bGVOYW1lfS8uanNpaWAsIHtcbiAgICAgICAgcGF0aHM6IFtiYXNlRGlyXSxcbiAgICAgIH0pXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBpZiAoXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICBcImNvZGVcIiBpbiBlcnJvciAmJlxuICAgICAgZXJyb3IuY29kZSA9PT0gXCJNT0RVTEVfTk9UX0ZPVU5EXCJcbiAgICApIHtcbiAgICAgIC8vIHRoZSBwcm92aWRlZCBtb2R1bGUgaXMgbm90IGEganNpaSBtb2R1bGVcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVuZXhwZWN0ZWQgZXJyb3IsIHRocm93IGl0XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvciguLi5saW5lczogc3RyaW5nW10pIHtcbiAgICBzdXBlcihsaW5lcy5qb2luKFwiXFxuXCIpKTtcbiAgICB0aGlzLm5hbWUgPSBcIkNsaUVycm9yXCI7XG4gIH1cbn1cbiJdfQ==