projen
Version:
CDK for software projects
124 lines • 12.2 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
var desc = Object.getOwnPropertyDescriptor(m, k);
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
desc = { enumerable: true, get: function() { return m[k]; } };
}
Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
if (k2 === undefined) k2 = k;
o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
o["default"] = v;
});
var __importStar = (this && this.__importStar) || (function () {
var ownKeys = function(o) {
ownKeys = Object.getOwnPropertyNames || function (o) {
var ar = [];
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
return ar;
};
return ownKeys(o);
};
return function (mod) {
if (mod && mod.__esModule) return mod;
var result = {};
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
__setModuleDefault(result, mod);
return result;
};
})();
Object.defineProperty(exports, "__esModule", { value: true });
exports.CliError = void 0;
exports.installPackage = installPackage;
exports.renderInstallArgs = renderInstallArgs;
exports.findJsiiFilePath = findJsiiFilePath;
const fs = __importStar(require("fs"));
const path = __importStar(require("path"));
const logging = __importStar(require("../logging"));
const exec_1 = require("../util/exec");
/**
* 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`)
*/
async 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
await exec_1.npm.run(["init", "--yes"], { cwd: baseDir });
}
logging.info(`installing module ${spec}...`);
await exec_1.npm.run(renderInstallArgs(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 the arguments to install an npm package (the args following `npm`).
*
* 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 arguments for `npm` (e.g. ["install", ..., "foo@^1.2"])
*/
function renderInstallArgs(dir, module) {
// --save is needed to override any global save: false config
// --save-dev to install as dev dependency
// --include=dev to force saving the dependencies with NODE_ENV=production
return [
"install",
"--save",
"--save-dev",
"-f",
"--no-package-lock",
"--include=dev",
`--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 &&
["MODULE_NOT_FOUND", "ERR_PACKAGE_PATH_NOT_EXPORTED"].includes(error.code)) {
// 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGkvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFVQSx3Q0FpQ0M7QUFjRCw4Q0FjQztBQUVELDRDQXlCQztBQWxHRCx1Q0FBeUI7QUFDekIsMkNBQTZCO0FBQzdCLG9EQUFzQztBQUN0Qyx1Q0FBbUM7QUFFbkM7Ozs7R0FJRztBQUNJLEtBQUssVUFBVSxjQUFjLENBQ2xDLE9BQWUsRUFDZixJQUFZLEVBQ1osUUFBUSxHQUFHLEtBQUs7SUFFaEIsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDM0QsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRTFELElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBQ3hCLHNEQUFzRDtRQUN0RCxNQUFNLFVBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQsT0FBTyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsSUFBSSxLQUFLLENBQUMsQ0FBQztJQUM3QyxNQUFNLFVBQUcsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFbEUsc0NBQXNDO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMxRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUN6RSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQ2pELENBQUM7SUFFRixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsa0ZBQWtGO0lBQ2xGLDZCQUE2QjtJQUM3QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN4QixFQUFFLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQWdCLGlCQUFpQixDQUFDLEdBQVcsRUFBRSxNQUFjO0lBQzNELDZEQUE2RDtJQUM3RCwwQ0FBMEM7SUFDMUMsMEVBQTBFO0lBQzFFLE9BQU87UUFDTCxTQUFTO1FBQ1QsUUFBUTtRQUNSLFlBQVk7UUFDWixJQUFJO1FBQ0osbUJBQW1CO1FBQ25CLGVBQWU7UUFDZixZQUFZLEdBQUcsRUFBRTtRQUNqQixNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FDOUIsT0FBZSxFQUNmLFVBQWtCO0lBRWxCLElBQUksQ0FBQztRQUNILE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FDakIsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFVBQVUsUUFBUSxFQUFFO1lBQ3JDLEtBQUssRUFBRSxDQUFDLE9BQU8sQ0FBQztTQUNqQixDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFBQyxPQUFPLEtBQWMsRUFBRSxDQUFDO1FBQ3hCLElBQ0UsS0FBSyxZQUFZLEtBQUs7WUFDdEIsTUFBTSxJQUFJLEtBQUs7WUFDZixDQUFDLGtCQUFrQixFQUFFLCtCQUErQixDQUFDLENBQUMsUUFBUSxDQUM1RCxLQUFLLENBQUMsSUFBVyxDQUNsQixFQUNELENBQUM7WUFDRCwyQ0FBMkM7WUFDM0MsT0FBTyxTQUFTLENBQUM7UUFDbkIsQ0FBQzthQUFNLENBQUM7WUFDTiw2QkFBNkI7WUFDN0IsTUFBTSxLQUFLLENBQUM7UUFDZCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFhLFFBQVMsU0FBUSxLQUFLO0lBQ2pDLFlBQVksR0FBRyxLQUFlO1FBQzVCLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7SUFDekIsQ0FBQztDQUNGO0FBTEQsNEJBS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIGxvZ2dpbmcgZnJvbSBcIi4uL2xvZ2dpbmdcIjtcbmltcG9ydCB7IG5wbSB9IGZyb20gXCIuLi91dGlsL2V4ZWNcIjtcblxuLyoqXG4gKiBJbnN0YWxscyB0aGUgbnBtIG1vZHVsZSAodGhyb3VnaCBgbnBtIGluc3RhbGxgKSB0byBub2RlX21vZHVsZXMgdW5kZXIgYHByb2plY3REaXJgLlxuICogQHBhcmFtIHNwZWMgVGhlIG5wbSBwYWNrYWdlIHNwZWMgKGUuZy4gYGZvb0BeMS4yYCBvciBgZm9vQC92YXIvZm9sZGVycy84ay9xY3cwbHM1cHZfcGgwMDAwZ24vVC9wcm9qZW4tUll1ckN3L3BrZy50Z3pgKVxuICogQHJldHVybnMgVGhlIGluc3RhbGxlZCBwYWNrYWdlIG5hbWUgKGUuZy4gYEBmb28vYmFyYClcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGluc3RhbGxQYWNrYWdlKFxuICBiYXNlRGlyOiBzdHJpbmcsXG4gIHNwZWM6IHN0cmluZyxcbiAgaXNQcm9qZW4gPSBmYWxzZSxcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHBhdGguam9pbihiYXNlRGlyLCBcInBhY2thZ2UuanNvblwiKTtcbiAgY29uc3QgcGFja2FnZUpzb25FeGlzdGVkID0gZnMuZXhpc3RzU3luYyhwYWNrYWdlSnNvblBhdGgpO1xuXG4gIGlmICghcGFja2FnZUpzb25FeGlzdGVkKSB7XG4gICAgLy8gTWFrZSBzdXJlIHdlIGhhdmUgYSBwYWNrYWdlLmpzb24gdG8gcmVhZCBmcm9tIGxhdGVyXG4gICAgYXdhaXQgbnBtLnJ1bihbXCJpbml0XCIsIFwiLS15ZXNcIl0sIHsgY3dkOiBiYXNlRGlyIH0pO1xuICB9XG5cbiAgbG9nZ2luZy5pbmZvKGBpbnN0YWxsaW5nIG1vZHVsZSAke3NwZWN9Li4uYCk7XG4gIGF3YWl0IG5wbS5ydW4ocmVuZGVySW5zdGFsbEFyZ3MoYmFzZURpciwgc3BlYyksIHsgY3dkOiBiYXNlRGlyIH0pO1xuXG4gIC8vIEdldCB0aGUgdHJ1ZSBpbnN0YWxsZWQgcGFja2FnZSBuYW1lXG4gIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCBcInV0Zi04XCIpKTtcbiAgY29uc3QgcGFja2FnZU5hbWUgPSBPYmplY3Qua2V5cyhwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMpLmZpbmQoKG5hbWUpID0+XG4gICAgaXNQcm9qZW4gPyBuYW1lID09PSBcInByb2plblwiIDogbmFtZSAhPT0gXCJwcm9qZW5cIixcbiAgKTtcblxuICBpZiAoIXBhY2thZ2VOYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSBwYWNrYWdlIG5hbWUgZnJvbSBzcGVjICR7c3BlY31gKTtcbiAgfVxuXG4gIC8vIGlmIHBhY2thZ2UuanNvbiBkaWQgbm90IGV4aXN0IGJlZm9yZSBjYWxsaW5nIGBucG0gaW5zdGFsbGAsIHdlIHNob3VsZCByZW1vdmUgaXRcbiAgLy8gc28gd2UgY2FuIHN0YXJ0IG9mZiBjbGVhbi5cbiAgaWYgKCFwYWNrYWdlSnNvbkV4aXN0ZWQpIHtcbiAgICBmcy5ybVN5bmMocGFja2FnZUpzb25QYXRoLCB7IGZvcmNlOiB0cnVlLCByZWN1cnNpdmU6IHRydWUgfSk7XG4gIH1cblxuICByZXR1cm4gcGFja2FnZU5hbWU7XG59XG5cbi8qKlxuICogUmVuZGVyIHRoZSBhcmd1bWVudHMgdG8gaW5zdGFsbCBhbiBucG0gcGFja2FnZSAodGhlIGFyZ3MgZm9sbG93aW5nIGBucG1gKS5cbiAqXG4gKiBFbmdpbmUgY2hlY2tzIGFyZSBpZ25vcmVkIGF0IHRoaXMgcG9pbnQgc28gdGhhdCB0aGUgbW9kdWxlIGNhbiBiZSBpbnN0YWxsZWRcbiAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGVudmlyb25tZW50LiBUaGlzIHdhcyBuZWVkZWQgdG8gdW5ibG9jayB0aGUgdXBncmFkZSBvZiB0aGVcbiAqIG1pbmltdW0gbm9kZSB2ZXJzaW9uIG9mIHByb2plbiwgYnV0IGFsc28gb2theSBnZW5lcmFsbHkgYmVjYXVzZSBlbmdpbmUgY2hlY2tzXG4gKiB3aWxsIGJlIHBlcmZvcm1lZCBsYXRlciBhbmQgZm9yIGFsbCBldGVybml0eS5cbiAqXG4gKiBAcGFyYW0gZGlyIEJhc2UgZGlyZWN0b3J5XG4gKiBAcGFyYW0gbW9kdWxlIFRoZSBtb2R1bGUgdG8gaW5zdGFsbCAoZS5nLiBmb29AXjEuMilcbiAqIEByZXR1cm5zIFRoZSBhcmd1bWVudHMgZm9yIGBucG1gIChlLmcuIFtcImluc3RhbGxcIiwgLi4uLCBcImZvb0BeMS4yXCJdKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVySW5zdGFsbEFyZ3MoZGlyOiBzdHJpbmcsIG1vZHVsZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICAvLyAtLXNhdmUgaXMgbmVlZGVkIHRvIG92ZXJyaWRlIGFueSBnbG9iYWwgc2F2ZTogZmFsc2UgY29uZmlnXG4gIC8vIC0tc2F2ZS1kZXYgdG8gaW5zdGFsbCBhcyBkZXYgZGVwZW5kZW5jeVxuICAvLyAtLWluY2x1ZGU9ZGV2IHRvIGZvcmNlIHNhdmluZyB0aGUgZGVwZW5kZW5jaWVzIHdpdGggTk9ERV9FTlY9cHJvZHVjdGlvblxuICByZXR1cm4gW1xuICAgIFwiaW5zdGFsbFwiLFxuICAgIFwiLS1zYXZlXCIsXG4gICAgXCItLXNhdmUtZGV2XCIsXG4gICAgXCItZlwiLFxuICAgIFwiLS1uby1wYWNrYWdlLWxvY2tcIixcbiAgICBcIi0taW5jbHVkZT1kZXZcIixcbiAgICBgLS1wcmVmaXg9JHtkaXJ9YCxcbiAgICBtb2R1bGUsXG4gIF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kSnNpaUZpbGVQYXRoKFxuICBiYXNlRGlyOiBzdHJpbmcsXG4gIG1vZHVsZU5hbWU6IHN0cmluZyxcbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHBhdGguZGlybmFtZShcbiAgICAgIHJlcXVpcmUucmVzb2x2ZShgJHttb2R1bGVOYW1lfS8uanNpaWAsIHtcbiAgICAgICAgcGF0aHM6IFtiYXNlRGlyXSxcbiAgICAgIH0pLFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycm9yOiB1bmtub3duKSB7XG4gICAgaWYgKFxuICAgICAgZXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICAgXCJjb2RlXCIgaW4gZXJyb3IgJiZcbiAgICAgIFtcIk1PRFVMRV9OT1RfRk9VTkRcIiwgXCJFUlJfUEFDS0FHRV9QQVRIX05PVF9FWFBPUlRFRFwiXS5pbmNsdWRlcyhcbiAgICAgICAgZXJyb3IuY29kZSBhcyBhbnksXG4gICAgICApXG4gICAgKSB7XG4gICAgICAvLyB0aGUgcHJvdmlkZWQgbW9kdWxlIGlzIG5vdCBhIGpzaWkgbW9kdWxlXG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB1bmV4cGVjdGVkIGVycm9yLCB0aHJvdyBpdFxuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGlFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IoLi4ubGluZXM6IHN0cmluZ1tdKSB7XG4gICAgc3VwZXIobGluZXMuam9pbihcIlxcblwiKSk7XG4gICAgdGhpcy5uYW1lID0gXCJDbGlFcnJvclwiO1xuICB9XG59XG4iXX0=