projen
Version:
CDK for software projects
105 lines • 15.7 kB
JavaScript
;
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/PyBERUZBVUxUX1BST0pFTl9SQ19KU19GSUxFTkFNRVxuICApOyAvLyBUT0RPOiBzdXBwb3J0IG5vbiBqYXZhc2NyaXB0IHByb2plbnJjIChlLmcuIGphdmEgcHJvamVjdHMpXG5cbiAgLy8gaWYgLS1yYyBwb2ludHMgdG8gLnByb2plbnJjLmpzLCB0aGVuIGJlaGF2ZSBhcyBpZiBpdCB3YXNuJ3Qgc3BlY2lmaWVkLlxuICBpZiAocmNmaWxlID09PSBwYXRoLnJlc29sdmUod29ya2RpciwgREVGQVVMVF9QUk9KRU5fUkNfSlNfRklMRU5BTUUpKSB7XG4gICAgZGVsZXRlIChvcHRpb25zIGFzIGFueSkucmNmaWxlO1xuICB9XG5cbiAgLy8gaWYgdGhlcmUgYXJlIG5vIHRhc2tzLCB3ZSBhc3N1bWUgdGhpcyBpcyBub3QgYSBwcm9qZW4gcHJvamVjdCAobW9kZXJuXG4gIC8vIHByb2plY3RzIG11c3QgYXQgbGVhc3QgaGF2ZSB0aGUgXCJkZWZhdWx0XCIgdGFzaykuXG4gIGlmIChydW50aW1lLnRhc2tzLmxlbmd0aCA9PT0gMCAmJiAhZnMuZXhpc3RzU3luYyhyY2ZpbGUpKSB7XG4gICAgbG9nZ2luZy5lcnJvcihcbiAgICAgICdVbmFibGUgdG8gZmluZCBwcm9qZW4gcHJvamVjdC4gVXNlIFwicHJvamVuIG5ld1wiIHRvIGNyZWF0ZSBhIG5ldyBwcm9qZWN0LidcbiAgICApO1xuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIC8vIHJ1biBzeW50aCBvbmNlXG4gIGNvbnN0IHN1Y2Nlc3MgPSBhd2FpdCB0cnlTeW50aCgpO1xuXG4gIGlmIChvcHRpb25zLndhdGNoKSB7XG4gICAgLy8gaWYgd2UgYXJlIGluIHdhdGNoIG1vZGUsIHN0YXJ0IHRoZSB3YXRjaCBsb29wXG4gICAgd2F0Y2hMb29wKCk7XG4gIH0gZWxzZSBpZiAoIXN1Y2Nlc3MpIHtcbiAgICAvLyBtYWtlIHN1cmUgZXhpdCBjb2RlIGlzIG5vbi16ZXJvIGlmIHdlIGFyZSBub3QgaW4gd2F0Y2ggbW9kZVxuICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIHRyeVN5bnRoKCkge1xuICAgIC8vIGRldGVybWluZSBpZiBwb3N0IHN5bnRoZXNpcyB0YXNrcyBzaG91bGQgYmUgZXhlY3V0ZWQgKGUuZy4gXCJ5YXJuIGluc3RhbGxcIikuXG4gICAgcHJvY2Vzcy5lbnYuUFJPSkVOX0RJU0FCTEVfUE9TVCA9ICghb3B0aW9ucy5wb3N0KS50b1N0cmluZygpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkZWZhdWx0VGFzayA9IHJ1bnRpbWUudGFza3MuZmluZChcbiAgICAgICAgKHQpID0+IHQubmFtZSA9PT0gUHJvamVjdC5ERUZBVUxUX1RBU0tcbiAgICAgICk7XG5cbiAgICAgIC8vIGlmIFwiLS1yY1wiIGlzIHNwZWNpZmllZCwgaWdub3JlIHRoZSBkZWZhdWx0IHRhc2tcbiAgICAgIGlmIChkZWZhdWx0VGFzaykge1xuICAgICAgICBpZiAoIW9wdGlvbnMucmNmaWxlKSB7XG4gICAgICAgICAgcnVudGltZS5ydW5UYXNrKGRlZmF1bHRUYXNrLm5hbWUpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZ2dpbmcud2FybihcbiAgICAgICAgICAgIFwiRGVmYXVsdCB0YXNrIHNraXBwZWQuIFRyeWluZyBsZWdhY3kgc3ludGhlc2lzIHNpbmNlIC0tcmMgaXMgc3BlY2lmaWVkXCJcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgaWYgdGhlcmUgaXMgYSAucHJvamVucmMuanMgZmlsZSwgZGVmYXVsdCB0byBcIm5vZGUgLnByb2plbnJjLmpzXCJcbiAgICAgIGlmICh0cnlMZWdhY3lTeW50aCgpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIGEgdGFzayBuYW1lZCBcImRlZmF1bHRcIicpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxvZ2dpbmcuZXJyb3IoYFN5bnRoZXNpcyBmYWlsZWQ6ICR7KGUgYXMgYW55KS5tZXNzYWdlfWApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHdhdGNoTG9vcCgpIHtcbiAgICBsb2dnaW5nLmluZm8oYFdhdGNoaW5nIGZvciBjaGFuZ2VzIGluICR7d29ya2Rpcn0uLi5gKTtcbiAgICBjb25zdCB3YXRjaCA9IGZzLndhdGNoKHdvcmtkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgIHdhdGNoLm9uKFwiY2hhbmdlXCIsIChldmVudCkgPT4ge1xuICAgICAgLy8gd2Ugb25seSBjYXJlIGFib3V0IFwiY2hhbmdlXCIgZXZlbnRzXG4gICAgICBpZiAoZXZlbnQgIT09IFwiY2hhbmdlXCIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBwcm9jZXNzLnN0ZG91dC53cml0ZShcIlxceDFCY1wiKTsgLy8gY2xlYXIgc2NyZWVuXG4gICAgICB3YXRjaC5jbG9zZSgpO1xuICAgICAgdHJ5U3ludGgoKVxuICAgICAgICAudGhlbigoKSA9PiB3YXRjaExvb3AoKSlcbiAgICAgICAgLmNhdGNoKCgpID0+IHdhdGNoTG9vcCgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRyeUxlZ2FjeVN5bnRoKCkge1xuICAgIGNvbnN0IHJjZGlyID0gcGF0aC5kaXJuYW1lKHJjZmlsZSk7XG5cbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMocmNmaWxlKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIGlmIG5vZGVfbW9kdWxlcy9wcm9qZW4gaXMgbm90IGEgZGlyZWN0b3J5IG9yIGRvZXMgbm90IGV4aXN0LCBjcmVhdGUgYVxuICAgIC8vIHRlbXBvcmFyeSBzeW1saW5rIHRvIHRoZSBwcm9qZW4gdGhhdCB3ZSBhcmUgY3VycmVudGx5IHJ1bm5pbmcgaW4gb3JkZXIgdG9cbiAgICAvLyBhbGxvdyAucHJvamVucmMuanMgdG8gYHJlcXVpcmUoKWAgaXQuXG4gICAgY29uc3Qgbm9kZU1vZHVsZXMgPSBwYXRoLnJlc29sdmUocmNkaXIsIFwibm9kZV9tb2R1bGVzXCIpO1xuICAgIGNvbnN0IHByb2plbk1vZHVsZVBhdGggPSBwYXRoLnJlc29sdmUobm9kZU1vZHVsZXMsIFwicHJvamVuXCIpO1xuICAgIGlmIChcbiAgICAgICFmcy5leGlzdHNTeW5jKHBhdGguam9pbihwcm9qZW5Nb2R1bGVQYXRoLCBcInBhY2thZ2UuanNvblwiKSkgfHxcbiAgICAgICFmcy5zdGF0U3luYyhwcm9qZW5Nb2R1bGVQYXRoKS5pc0RpcmVjdG9yeSgpXG4gICAgKSB7XG4gICAgICBmcy5ybVN5bmMocHJvamVuTW9kdWxlUGF0aCwgeyBmb3JjZTogdHJ1ZSwgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgZnMubWtkaXJTeW5jKG5vZGVNb2R1bGVzLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGZzLnN5bWxpbmtTeW5jKFxuICAgICAgICBwcm9qZW5Nb2R1bGUsXG4gICAgICAgIHByb2plbk1vZHVsZVBhdGgsXG4gICAgICAgIG9zLnBsYXRmb3JtKCkgPT09IFwid2luMzJcIiA/IFwianVuY3Rpb25cIiA6IG51bGxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgcmV0ID0gc3Bhd25TeW5jKHByb2Nlc3MuZXhlY1BhdGgsIFtyY2ZpbGVdLCB7XG4gICAgICBzdGRpbzogW1wiaW5oZXJpdFwiLCBcImluaGVyaXRcIiwgXCJwaXBlXCJdLFxuICAgIH0pO1xuICAgIGlmIChyZXQuZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgU3ludGhlc2lzIGZhaWxlZDogJHtyZXQuZXJyb3J9YCk7XG4gICAgfSBlbHNlIGlmIChyZXQuc3RhdHVzICE9PSAwKSB7XG4gICAgICBsb2dnaW5nLmVycm9yKHJldC5zdGRlcnIudG9TdHJpbmcoKSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBTeW50aGVzaXMgZmFpbGVkOiBjYWxsaW5nIFwiJHtwcm9jZXNzLmV4ZWNQYXRofSAke3JjZmlsZX1cIiBleGl0ZWQgd2l0aCBzdGF0dXM9JHtyZXQuc3RhdHVzfWBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cbiJdfQ==