UNPKG

projen

Version:

CDK for software projects

105 lines • 15.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.synth = synth; const child_process_1 = require("child_process"); const fs = require("fs"); const os = require("os"); const path = require("path"); const common_1 = require("../common"); const logging = require("../logging"); const project_1 = require("../project"); const projenModule = path.dirname(require.resolve("../../package.json")); async function synth(runtime, options) { const workdir = runtime.workdir; const rcfile = path.resolve(workdir, options.rcfile ?? common_1.DEFAULT_PROJEN_RC_JS_FILENAME); // TODO: support non javascript projenrc (e.g. java projects) // if --rc points to .projenrc.js, then behave as if it wasn't specified. if (rcfile === path.resolve(workdir, common_1.DEFAULT_PROJEN_RC_JS_FILENAME)) { delete options.rcfile; } // if there are no tasks, we assume this is not a projen project (modern // projects must at least have the "default" task). if (runtime.tasks.length === 0 && !fs.existsSync(rcfile)) { logging.error('Unable to find projen project. Use "projen new" to create a new project.'); process.exit(1); } // run synth once const success = await trySynth(); if (options.watch) { // if we are in watch mode, start the watch loop watchLoop(); } else if (!success) { // make sure exit code is non-zero if we are not in watch mode process.exit(1); } async function trySynth() { // determine if post synthesis tasks should be executed (e.g. "yarn install"). process.env.PROJEN_DISABLE_POST = (!options.post).toString(); try { const defaultTask = runtime.tasks.find((t) => t.name === project_1.Project.DEFAULT_TASK); // if "--rc" is specified, ignore the default task if (defaultTask) { if (!options.rcfile) { runtime.runTask(defaultTask.name); return true; } else { logging.warn("Default task skipped. Trying legacy synthesis since --rc is specified"); } } // for backwards compatibility, if there is a .projenrc.js file, default to "node .projenrc.js" if (tryLegacySynth()) { return true; } throw new Error('Unable to find a task named "default"'); } catch (e) { logging.error(`Synthesis failed: ${e.message}`); return false; } } function watchLoop() { logging.info(`Watching for changes in ${workdir}...`); const watch = fs.watch(workdir, { recursive: true }); watch.on("change", (event) => { // we only care about "change" events if (event !== "change") { return; } process.stdout.write("\x1Bc"); // clear screen watch.close(); trySynth() .then(() => watchLoop()) .catch(() => watchLoop()); }); } function tryLegacySynth() { const rcdir = path.dirname(rcfile); if (!fs.existsSync(rcfile)) { return false; } // if node_modules/projen is not a directory or does not exist, create a // temporary symlink to the projen that we are currently running in order to // allow .projenrc.js to `require()` it. const nodeModules = path.resolve(rcdir, "node_modules"); const projenModulePath = path.resolve(nodeModules, "projen"); if (!fs.existsSync(path.join(projenModulePath, "package.json")) || !fs.statSync(projenModulePath).isDirectory()) { fs.rmSync(projenModulePath, { force: true, recursive: true }); fs.mkdirSync(nodeModules, { recursive: true }); fs.symlinkSync(projenModule, projenModulePath, os.platform() === "win32" ? "junction" : null); } const ret = (0, child_process_1.spawnSync)(process.execPath, [rcfile], { stdio: ["inherit", "inherit", "pipe"], }); if (ret.error) { throw new Error(`Synthesis failed: ${ret.error}`); } else if (ret.status !== 0) { logging.error(ret.stderr.toString()); throw new Error(`Synthesis failed: calling "${process.execPath} ${rcfile}" exited with status=${ret.status}`); } return true; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL3N5bnRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBK0JBLHNCQXdIQztBQXZKRCxpREFBMEM7QUFDMUMseUJBQXlCO0FBQ3pCLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFDN0Isc0NBQTBEO0FBQzFELHNDQUFzQztBQUN0Qyx3Q0FBcUM7QUFHckMsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztBQXNCbEUsS0FBSyxVQUFVLEtBQUssQ0FBQyxPQUFvQixFQUFFLE9BQXFCO0lBQ3JFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUM7SUFDaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FDekIsT0FBTyxFQUNQLE9BQU8sQ0FBQyxNQUFNLElBQUksc0NBQTZCLENBQ2hELENBQUMsQ0FBQyw2REFBNkQ7SUFFaEUseUVBQXlFO0lBQ3pFLElBQUksTUFBTSxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLHNDQUE2QixDQUFDLEVBQUUsQ0FBQztRQUNwRSxPQUFRLE9BQWUsQ0FBQyxNQUFNLENBQUM7SUFDakMsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSxtREFBbUQ7SUFDbkQsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDekQsT0FBTyxDQUFDLEtBQUssQ0FDWCwwRUFBMEUsQ0FDM0UsQ0FBQztRQUNGLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVELGlCQUFpQjtJQUNqQixNQUFNLE9BQU8sR0FBRyxNQUFNLFFBQVEsRUFBRSxDQUFDO0lBRWpDLElBQUksT0FBTyxDQUFD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O0lBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3blN5bmMgfSBmcm9tIFwiY2hpbGRfcHJvY2Vzc1wiO1xuaW1wb3J0ICogYXMgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgKiBhcyBvcyBmcm9tIFwib3NcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IERFRkFVTFRfUFJPSkVOX1JDX0pTX0ZJTEVOQU1FIH0gZnJvbSBcIi4uL2NvbW1vblwiO1xuaW1wb3J0ICogYXMgbG9nZ2luZyBmcm9tIFwiLi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHsgUHJvamVjdCB9IGZyb20gXCIuLi9wcm9qZWN0XCI7XG5pbXBvcnQgeyBUYXNrUnVudGltZSB9IGZyb20gXCIuLi90YXNrLXJ1bnRpbWVcIjtcblxuY29uc3QgcHJvamVuTW9kdWxlID0gcGF0aC5kaXJuYW1lKHJlcXVpcmUucmVzb2x2ZShcIi4uLy4uL3BhY2thZ2UuanNvblwiKSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3ludGhPcHRpb25zIHtcbiAgLyoqXG4gICAqIEV4ZWN1dGUgcG9zdCBzeW50aGVzaXMgY29tbWFuZHMuXG4gICAqIEBkZWZhdWx0IHRydWVcbiAgICovXG4gIHJlYWRvbmx5IHBvc3Q/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTdGFydCB3YXRjaGluZyAucHJvamVucmMuanMgYW5kIHJlLXN5bnRoIHdoZW4gY2hhbmdlZC5cbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICovXG4gIHJlYWRvbmx5IHdhdGNoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIG5hbWUgb2YgdGhlIC5wcm9qZW5yYy5qcyBmaWxlICB0byB1c2UgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdC5cbiAgICogQGRlZmF1bHQgXCIucHJvamVucmMuanNcIlxuICAgKi9cbiAgcmVhZG9ubHkgcmNmaWxlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3ludGgocnVudGltZTogVGFza1J1bnRpbWUsIG9wdGlvbnM6IFN5bnRoT3B0aW9ucykge1xuICBjb25zdCB3b3JrZGlyID0gcnVudGltZS53b3JrZGlyO1xuICBjb25zdCByY2ZpbGUgPSBwYXRoLnJlc29sdmUoXG4gICAgd29ya2RpcixcbiAgICBvcHRpb25zLnJjZmlsZSA/PyBERUZBVUxUX1BST0pFTl9SQ19KU19GSUxFTkFNRSxcbiAgKTsgLy8gVE9ETzogc3VwcG9ydCBub24gamF2YXNjcmlwdCBwcm9qZW5yYyAoZS5nLiBqYXZhIHByb2plY3RzKVxuXG4gIC8vIGlmIC0tcmMgcG9pbnRzIHRvIC5wcm9qZW5yYy5qcywgdGhlbiBiZWhhdmUgYXMgaWYgaXQgd2Fzbid0IHNwZWNpZmllZC5cbiAgaWYgKHJjZmlsZSA9PT0gcGF0aC5yZXNvbHZlKHdvcmtkaXIsIERFRkFVTFRfUFJPSkVOX1JDX0pTX0ZJTEVOQU1FKSkge1xuICAgIGRlbGV0ZSAob3B0aW9ucyBhcyBhbnkpLnJjZmlsZTtcbiAgfVxuXG4gIC8vIGlmIHRoZXJlIGFyZSBubyB0YXNrcywgd2UgYXNzdW1lIHRoaXMgaXMgbm90IGEgcHJvamVuIHByb2plY3QgKG1vZGVyblxuICAvLyBwcm9qZWN0cyBtdXN0IGF0IGxlYXN0IGhhdmUgdGhlIFwiZGVmYXVsdFwiIHRhc2spLlxuICBpZiAocnVudGltZS50YXNrcy5sZW5ndGggPT09IDAgJiYgIWZzLmV4aXN0c1N5bmMocmNmaWxlKSkge1xuICAgIGxvZ2dpbmcuZXJyb3IoXG4gICAgICAnVW5hYmxlIHRvIGZpbmQgcHJvamVuIHByb2plY3QuIFVzZSBcInByb2plbiBuZXdcIiB0byBjcmVhdGUgYSBuZXcgcHJvamVjdC4nLFxuICAgICk7XG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgLy8gcnVuIHN5bnRoIG9uY2VcbiAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IHRyeVN5bnRoKCk7XG5cbiAgaWYgKG9wdGlvbnMud2F0Y2gpIHtcbiAgICAvLyBpZiB3ZSBhcmUgaW4gd2F0Y2ggbW9kZSwgc3RhcnQgdGhlIHdhdGNoIGxvb3BcbiAgICB3YXRjaExvb3AoKTtcbiAgfSBlbHNlIGlmICghc3VjY2Vzcykge1xuICAgIC8vIG1ha2Ugc3VyZSBleGl0IGNvZGUgaXMgbm9uLXplcm8gaWYgd2UgYXJlIG5vdCBpbiB3YXRjaCBtb2RlXG4gICAgcHJvY2Vzcy5leGl0KDEpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdHJ5U3ludGgoKSB7XG4gICAgLy8gZGV0ZXJtaW5lIGlmIHBvc3Qgc3ludGhlc2lzIHRhc2tzIHNob3VsZCBiZSBleGVjdXRlZCAoZS5nLiBcInlhcm4gaW5zdGFsbFwiKS5cbiAgICBwcm9jZXNzLmVudi5QUk9KRU5fRElTQUJMRV9QT1NUID0gKCFvcHRpb25zLnBvc3QpLnRvU3RyaW5nKCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGRlZmF1bHRUYXNrID0gcnVudGltZS50YXNrcy5maW5kKFxuICAgICAgICAodCkgPT4gdC5uYW1lID09PSBQcm9qZWN0LkRFRkFVTFRfVEFTSyxcbiAgICAgICk7XG5cbiAgICAgIC8vIGlmIFwiLS1yY1wiIGlzIHNwZWNpZmllZCwgaWdub3JlIHRoZSBkZWZhdWx0IHRhc2tcbiAgICAgIGlmIChkZWZhdWx0VGFzaykge1xuICAgICAgICBpZiAoIW9wdGlvbnMucmNmaWxlKSB7XG4gICAgICAgICAgcnVudGltZS5ydW5UYXNrKGRlZmF1bHRUYXNrLm5hbWUpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dpbmcud2FybihcbiAgICAgICAgICAgIFwiRGVmYXVsdCB0YXNrIHNraXBwZWQuIFRyeWluZyBsZWdhY3kgc3ludGhlc2lzIHNpbmNlIC0tcmMgaXMgc3BlY2lmaWVkXCIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGlmIHRoZXJlIGlzIGEgLnByb2plbnJjLmpzIGZpbGUsIGRlZmF1bHQgdG8gXCJub2RlIC5wcm9qZW5yYy5qc1wiXG4gICAgICBpZiAodHJ5TGVnYWN5U3ludGgoKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBhIHRhc2sgbmFtZWQgXCJkZWZhdWx0XCInKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBsb2dnaW5nLmVycm9yKGBTeW50aGVzaXMgZmFpbGVkOiAkeyhlIGFzIGFueSkubWVzc2FnZX1gKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiB3YXRjaExvb3AoKSB7XG4gICAgbG9nZ2luZy5pbmZvKGBXYXRjaGluZyBmb3IgY2hhbmdlcyBpbiAke3dvcmtkaXJ9Li4uYCk7XG4gICAgY29uc3Qgd2F0Y2ggPSBmcy53YXRjaCh3b3JrZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICB3YXRjaC5vbihcImNoYW5nZVwiLCAoZXZlbnQpID0+IHtcbiAgICAgIC8vIHdlIG9ubHkgY2FyZSBhYm91dCBcImNoYW5nZVwiIGV2ZW50c1xuICAgICAgaWYgKGV2ZW50ICE9PSBcImNoYW5nZVwiKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcHJvY2Vzcy5zdGRvdXQud3JpdGUoXCJcXHgxQmNcIik7IC8vIGNsZWFyIHNjcmVlblxuICAgICAgd2F0Y2guY2xvc2UoKTtcbiAgICAgIHRyeVN5bnRoKClcbiAgICAgICAgLnRoZW4oKCkgPT4gd2F0Y2hMb29wKCkpXG4gICAgICAgIC5jYXRjaCgoKSA9PiB3YXRjaExvb3AoKSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiB0cnlMZWdhY3lTeW50aCgpIHtcbiAgICBjb25zdCByY2RpciA9IHBhdGguZGlybmFtZShyY2ZpbGUpO1xuXG4gICAgaWYgKCFmcy5leGlzdHNTeW5jKHJjZmlsZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBpZiBub2RlX21vZHVsZXMvcHJvamVuIGlzIG5vdCBhIGRpcmVjdG9yeSBvciBkb2VzIG5vdCBleGlzdCwgY3JlYXRlIGFcbiAgICAvLyB0ZW1wb3Jhcnkgc3ltbGluayB0byB0aGUgcHJvamVuIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBydW5uaW5nIGluIG9yZGVyIHRvXG4gICAgLy8gYWxsb3cgLnByb2plbnJjLmpzIHRvIGByZXF1aXJlKClgIGl0LlxuICAgIGNvbnN0IG5vZGVNb2R1bGVzID0gcGF0aC5yZXNvbHZlKHJjZGlyLCBcIm5vZGVfbW9kdWxlc1wiKTtcbiAgICBjb25zdCBwcm9qZW5Nb2R1bGVQYXRoID0gcGF0aC5yZXNvbHZlKG5vZGVNb2R1bGVzLCBcInByb2plblwiKTtcbiAgICBpZiAoXG4gICAgICAhZnMuZXhpc3RzU3luYyhwYXRoLmpvaW4ocHJvamVuTW9kdWxlUGF0aCwgXCJwYWNrYWdlLmpzb25cIikpIHx8XG4gICAgICAhZnMuc3RhdFN5bmMocHJvamVuTW9kdWxlUGF0aCkuaXNEaXJlY3RvcnkoKVxuICAgICkge1xuICAgICAgZnMucm1TeW5jKHByb2plbk1vZHVsZVBhdGgsIHsgZm9yY2U6IHRydWUsIHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGZzLm1rZGlyU3luYyhub2RlTW9kdWxlcywgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICBmcy5zeW1saW5rU3luYyhcbiAgICAgICAgcHJvamVuTW9kdWxlLFxuICAgICAgICBwcm9qZW5Nb2R1bGVQYXRoLFxuICAgICAgICBvcy5wbGF0Zm9ybSgpID09PSBcIndpbjMyXCIgPyBcImp1bmN0aW9uXCIgOiBudWxsLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXQgPSBzcGF3blN5bmMocHJvY2Vzcy5leGVjUGF0aCwgW3JjZmlsZV0sIHtcbiAgICAgIHN0ZGlvOiBbXCJpbmhlcml0XCIsIFwiaW5oZXJpdFwiLCBcInBpcGVcIl0sXG4gICAgfSk7XG4gICAgaWYgKHJldC5lcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBTeW50aGVzaXMgZmFpbGVkOiAke3JldC5lcnJvcn1gKTtcbiAgICB9IGVsc2UgaWYgKHJldC5zdGF0dXMgIT09IDApIHtcbiAgICAgIGxvZ2dpbmcuZXJyb3IocmV0LnN0ZGVyci50b1N0cmluZygpKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFN5bnRoZXNpcyBmYWlsZWQ6IGNhbGxpbmcgXCIke3Byb2Nlc3MuZXhlY1BhdGh9ICR7cmNmaWxlfVwiIGV4aXRlZCB3aXRoIHN0YXR1cz0ke3JldC5zdGF0dXN9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiJdfQ==