UNPKG

projen

Version:

CDK for software projects

82 lines 10.2 kB
"use strict"; 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) { // --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 `npm 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 && 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jbGkvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFVQSx3Q0FpQ0M7QUFjRCxvREFLQztBQUVELDRDQXVCQztBQXZGRCx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLHNDQUFzQztBQUN0QyxrQ0FBK0I7QUFFL0I7Ozs7R0FJRztBQUNILFNBQWdCLGNBQWMsQ0FDNUIsT0FBZSxFQUNmLElBQVksRUFDWixRQUFRLEdBQUcsS0FBSztJQUVoQixNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztJQUMzRCxNQUFNLGtCQUFrQixHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFMUQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDeEIsc0RBQXNEO1FBQ3RELElBQUEsV0FBSSxFQUFDLGdCQUFnQixFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELE9BQU8sQ0FBQyxJQUFJLENBQUMscUJBQXFCLElBQUksS0FBSyxDQUFDLENBQUM7SUFDN0MsSUFBQSxXQUFJLEVBQUMsb0JBQW9CLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFFNUQsc0NBQXNDO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMxRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUN6RSxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxRQUFRLENBQ2pELENBQUM7SUFFRixJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUN0RSxDQUFDO0lBRUQsa0ZBQWtGO0lBQ2xGLDZCQUE2QjtJQUM3QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztRQUN4QixFQUFFLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7SUFDL0QsQ0FBQztJQUVELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLEdBQVcsRUFBRSxNQUFjO0lBQzlELDZEQUE2RDtJQUM3RCwwQ0FBMEM7SUFDMUMsMEVBQTBFO0lBQzFFLE9BQU8sOEVBQThFLEdBQUcsS0FBSyxNQUFNLEVBQUUsQ0FBQztBQUN4RyxDQUFDO0FBRUQsU0FBZ0IsZ0JBQWdCLENBQzlCLE9BQWUsRUFDZixVQUFrQjtJQUVsQixJQUFJLENBQUM7UUFDSCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQ2pCLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxVQUFVLFFBQVEsRUFBRTtZQUNyQyxLQUFLLEVBQUUsQ0FBQyxPQUFPLENBQUM7U0FDakIsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBQUMsT0FBTyxLQUFjLEVBQUUsQ0FBQztRQUN4QixJQUNFLEtBQUssWUFBWSxLQUFLO1lBQ3RCLE1BQU0sSUFBSSxLQUFLO1lBQ2YsS0FBSyxDQUFDLElBQUksS0FBSyxrQkFBa0IsRUFDakMsQ0FBQztZQUNELDJDQUEyQztZQUMzQyxPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO2FBQU0sQ0FBQztZQUNOLDZCQUE2QjtZQUM3QixNQUFNLEtBQUssQ0FBQztRQUNkLENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQztBQUVELE1BQWEsUUFBUyxTQUFRLEtBQUs7SUFDakMsWUFBWSxHQUFHLEtBQWU7UUFDNUIsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxHQUFHLFVBQVUsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUFMRCw0QkFLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0ICogYXMgbG9nZ2luZyBmcm9tIFwiLi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHsgZXhlYyB9IGZyb20gXCIuLi91dGlsXCI7XG5cbi8qKlxuICogSW5zdGFsbHMgdGhlIG5wbSBtb2R1bGUgKHRocm91Z2ggYG5wbSBpbnN0YWxsYCkgdG8gbm9kZV9tb2R1bGVzIHVuZGVyIGBwcm9qZWN0RGlyYC5cbiAqIEBwYXJhbSBzcGVjIFRoZSBucG0gcGFja2FnZSBzcGVjIChlLmcuIGBmb29AXjEuMmAgb3IgYGZvb0AvdmFyL2ZvbGRlcnMvOGsvcWN3MGxzNXB2X3BoMDAwMGduL1QvcHJvamVuLVJZdXJDdy9wa2cudGd6YClcbiAqIEByZXR1cm5zIFRoZSBpbnN0YWxsZWQgcGFja2FnZSBuYW1lIChlLmcuIGBAZm9vL2JhcmApXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnN0YWxsUGFja2FnZShcbiAgYmFzZURpcjogc3RyaW5nLFxuICBzcGVjOiBzdHJpbmcsXG4gIGlzUHJvamVuID0gZmFsc2UsXG4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSBwYXRoLmpvaW4oYmFzZURpciwgXCJwYWNrYWdlLmpzb25cIik7XG4gIGNvbnN0IHBhY2thZ2VKc29uRXhpc3RlZCA9IGZzLmV4aXN0c1N5bmMocGFja2FnZUpzb25QYXRoKTtcblxuICBpZiAoIXBhY2thZ2VKc29uRXhpc3RlZCkge1xuICAgIC8vIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgcGFja2FnZS5qc29uIHRvIHJlYWQgZnJvbSBsYXRlclxuICAgIGV4ZWMoXCJucG0gaW5pdCAtLXllc1wiLCB7IGN3ZDogYmFzZURpciB9KTtcbiAgfVxuXG4gIGxvZ2dpbmcuaW5mbyhgaW5zdGFsbGluZyBtb2R1bGUgJHtzcGVjfS4uLmApO1xuICBleGVjKHJlbmRlckluc3RhbGxDb21tYW5kKGJhc2VEaXIsIHNwZWMpLCB7IGN3ZDogYmFzZURpciB9KTtcblxuICAvLyBHZXQgdGhlIHRydWUgaW5zdGFsbGVkIHBhY2thZ2UgbmFtZVxuICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKHBhY2thZ2VKc29uUGF0aCwgXCJ1dGYtOFwiKSk7XG4gIGNvbnN0IHBhY2thZ2VOYW1lID0gT2JqZWN0LmtleXMocGFja2FnZUpzb24uZGV2RGVwZW5kZW5jaWVzKS5maW5kKChuYW1lKSA9PlxuICAgIGlzUHJvamVuID8gbmFtZSA9PT0gXCJwcm9qZW5cIiA6IG5hbWUgIT09IFwicHJvamVuXCIsXG4gICk7XG5cbiAgaWYgKCFwYWNrYWdlTmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHJlc29sdmUgcGFja2FnZSBuYW1lIGZyb20gc3BlYyAke3NwZWN9YCk7XG4gIH1cblxuICAvLyBpZiBwYWNrYWdlLmpzb24gZGlkIG5vdCBleGlzdCBiZWZvcmUgY2FsbGluZyBgbnBtIGluc3RhbGxgLCB3ZSBzaG91bGQgcmVtb3ZlIGl0XG4gIC8vIHNvIHdlIGNhbiBzdGFydCBvZmYgY2xlYW4uXG4gIGlmICghcGFja2FnZUpzb25FeGlzdGVkKSB7XG4gICAgZnMucm1TeW5jKHBhY2thZ2VKc29uUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgcmV0dXJuIHBhY2thZ2VOYW1lO1xufVxuXG4vKipcbiAqIFJlbmRlciBhIGNvbW1hbmQgdG8gaW5zdGFsbCBhbiBucG0gcGFja2FnZS5cbiAqXG4gKiBFbmdpbmUgY2hlY2tzIGFyZSBpZ25vcmVkIGF0IHRoaXMgcG9pbnQgc28gdGhhdCB0aGUgbW9kdWxlIGNhbiBiZSBpbnN0YWxsZWRcbiAqIHJlZ2FyZGxlc3Mgb2YgdGhlIGVudmlyb25tZW50LiBUaGlzIHdhcyBuZWVkZWQgdG8gdW5ibG9jayB0aGUgdXBncmFkZSBvZiB0aGVcbiAqIG1pbmltdW0gbm9kZSB2ZXJzaW9uIG9mIHByb2plbiwgYnV0IGFsc28gb2theSBnZW5lcmFsbHkgYmVjYXVzZSBlbmdpbmUgY2hlY2tzXG4gKiB3aWxsIGJlIHBlcmZvcm1lZCBsYXRlciBhbmQgZm9yIGFsbCBldGVybml0eS5cbiAqXG4gKiBAcGFyYW0gZGlyIEJhc2UgZGlyZWN0b3J5XG4gKiBAcGFyYW0gbW9kdWxlIFRoZSBtb2R1bGUgdG8gaW5zdGFsbCAoZS5nLiBmb29AXjEuMilcbiAqIEByZXR1cm5zIFRoZSBzdHJpbmcgdGhhdCBpbmNsdWRlcyB0aGUgaW5zdGFsbCBjb21tYW5kIChcIm5wbSBpbnN0YWxsIC4uLlwiKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVuZGVySW5zdGFsbENvbW1hbmQoZGlyOiBzdHJpbmcsIG1vZHVsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gLS1zYXZlIGlzIG5lZWRlZCB0byBvdmVycmlkZSBhbnkgZ2xvYmFsIHNhdmU6IGZhbHNlIGNvbmZpZ1xuICAvLyAtLXNhdmUtZGV2IHRvIGluc3RhbGwgYXMgZGV2IGRlcGVuZGVuY3lcbiAgLy8gLS1pbmNsdWRlPWRldiB0byBmb3JjZSBzYXZpbmcgdGhlIGRlcGVuZGVuY2llcyB3aXRoIE5PREVfRU5WPXByb2R1Y3Rpb25cbiAgcmV0dXJuIGBucG0gaW5zdGFsbCAtLXNhdmUgLS1zYXZlLWRldiAtZiAtLW5vLXBhY2thZ2UtbG9jayAtLWluY2x1ZGU9ZGV2IC0tcHJlZml4PVwiJHtkaXJ9XCIgJHttb2R1bGV9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRKc2lpRmlsZVBhdGgoXG4gIGJhc2VEaXI6IHN0cmluZyxcbiAgbW9kdWxlTmFtZTogc3RyaW5nLFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gcGF0aC5kaXJuYW1lKFxuICAgICAgcmVxdWlyZS5yZXNvbHZlKGAke21vZHVsZU5hbWV9Ly5qc2lpYCwge1xuICAgICAgICBwYXRoczogW2Jhc2VEaXJdLFxuICAgICAgfSksXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3I6IHVua25vd24pIHtcbiAgICBpZiAoXG4gICAgICBlcnJvciBpbnN0YW5jZW9mIEVycm9yICYmXG4gICAgICBcImNvZGVcIiBpbiBlcnJvciAmJlxuICAgICAgZXJyb3IuY29kZSA9PT0gXCJNT0RVTEVfTk9UX0ZPVU5EXCJcbiAgICApIHtcbiAgICAgIC8vIHRoZSBwcm92aWRlZCBtb2R1bGUgaXMgbm90IGEganNpaSBtb2R1bGVcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHVuZXhwZWN0ZWQgZXJyb3IsIHRocm93IGl0XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENsaUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvciguLi5saW5lczogc3RyaW5nW10pIHtcbiAgICBzdXBlcihsaW5lcy5qb2luKFwiXFxuXCIpKTtcbiAgICB0aGlzLm5hbWUgPSBcIkNsaUVycm9yXCI7XG4gIH1cbn1cbiJdfQ==