UNPKG

projen

Version:

CDK for software projects

136 lines • 14.9 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.Tasks = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const fs = require("fs"); const path = require("path"); const component_1 = require("./component"); const json_1 = require("./json"); const logging_1 = require("./logging"); const task_1 = require("./task"); const task_runtime_1 = require("./task-runtime"); /** * Defines project tasks. * * Tasks extend the projen CLI by adding subcommands to it. Task definitions are * synthesized into `.projen/tasks.json`. */ class Tasks extends component_1.Component { constructor(project) { super(project); this._tasks = {}; this._env = {}; new json_1.JsonFile(project, task_runtime_1.TaskRuntime.MANIFEST_FILE, { omitEmpty: true, obj: { tasks: (() => this.renderTasks()), env: (() => this.renderEnv()), }, }); } /** * All tasks. */ get all() { return Object.values(this._tasks); } /** * Adds a task to a project. * @param name The name of the task * @param options Task options. */ addTask(name, options = {}) { const task = new task_1.Task(name, options); if (this._tasks[name]) { throw new Error(`A task with the name ${name} already exists. To override it, call removeTask first and then create the new task.`); } this._tasks[name] = task; return task; } /** * Removes a task from a project. * * @param name The name of the task to remove. * * @returns The `Task` that was removed, otherwise `undefined`. */ removeTask(name) { const dependentTasks = this.all.filter((task) => task.steps.find((step) => step.spawn == name)); if (dependentTasks.length > 0) { const errList = dependentTasks.map((depTask) => depTask.name).join(", "); throw new Error(`Unable to remove task "${name}" because the following tasks depend on it: ${errList}`); } const task = this._tasks[name]; if (task) { delete this._tasks[name]; return task; } else { return undefined; } } /** * Adds global environment. * @param name Environment variable name * @param value Value */ addEnvironment(name, value) { this._env[name] = value; } /** * Returns a copy of the currently global environment for this project. */ get env() { return { ...this._env, }; } /** * Finds a task by name. Returns `undefined` if the task cannot be found. * @param name The name of the task */ tryFind(name) { return this._tasks[name]; } synthesize() { if (this.project.ejected) { // Insert a task-runner script so that tasks can be run after ejecting fs.mkdirSync(path.join(this.project.outdir, "scripts"), { recursive: true, }); fs.copyFileSync(path.join(__dirname, "..", "lib", "run-task.cjs"), path.join(this.project.outdir, "scripts", "run-task.cjs")); fs.chmodSync(path.join(this.project.outdir, "scripts", "run-task.cjs"), "755"); } } renderTasks() { const tasks = {}; for (const task of Object.values(this._tasks).sort((x, y) => x.name.localeCompare(y.name))) { tasks[task.name] = task._renderSpec(); } return tasks; } renderEnv() { return Object.keys(this._env).reduce((prev, curr) => ({ ...prev, [curr]: this.getEnvString(curr, this._env[curr]), }), {}); } /** * Ensure that environment variables are persisted as strings * to prevent type errors when parsing from tasks.json in future */ getEnvString(name, value) { if (typeof value !== "string" && value !== undefined) { (0, logging_1.warn)(`Received non-string value for environment variable ${name}. Value will be stringified.`); return String(value); } else { return value; } } } exports.Tasks = Tasks; _a = JSII_RTTI_SYMBOL_1; Tasks[_a] = { fqn: "projen.Tasks", version: "0.99.51" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdGFza3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSx5QkFBeUI7QUFDekIsNkJBQTZCO0FBQzdCLDJDQUF3QztBQUN4QyxpQ0FBa0M7QUFDbEMsdUNBQWlDO0FBR2pDLGlDQUE4QjtBQUU5QixpREFBNkM7QUFFN0M7Ozs7O0dBS0c7QUFDSCxNQUFhLEtBQU0sU0FBUSxxQkFBUztJQUlsQyxZQUFZLE9BQWdCO1FBQzFCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUVmLElBQUksQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksQ0FBQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRWYsSUFBSSxlQUFRLENBQUMsT0FBTyxFQUFFLDBCQUFXLENBQUMsYUFBYSxFQUFFO1lBQy9DLFNBQVMsRUFBRSxJQUFJO1lBQ2YsR0FBRyxFQUFFO2dCQUNILEtBQUssRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBUTtnQkFDeEMsR0FBRyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFRO2FBQ3BCO1NBQ25CLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNILElBQVcsR0FBRztRQUNaLE9BQU8sTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxPQUFPLENBQUMsSUFBWSxFQUFFLFVBQXVCLEVBQUU7UUFDcEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxXQUFJLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3JDLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQ2Isd0JBQXdCLElBQUksc0ZBQXNGLENBQ25I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Q0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN4QyxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRU8sU0FBUztRQUNmLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUNsQyxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDZixHQUFHLElBQUk7WUFDUCxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDakQsQ0FBQyxFQUNGLEVBQUUsQ0FDSCxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7T0FHRztJQUNLLFlBQVksQ0FBQyxJQUFZLEVBQUUsS0FBVTtRQUMzQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDckQsSUFBQSxjQUFJLEVBQ0Ysc0RBQXNELElBQUksOEJBQThCLENBQ3pGLENBQUM7WUFDRixPQUFPLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QixDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7O0FBbEpILHNCQW1KQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgQ29tcG9uZW50IH0gZnJvbSBcIi4vY29tcG9uZW50XCI7XG5pbXBvcnQgeyBKc29uRmlsZSB9IGZyb20gXCIuL2pzb25cIjtcbmltcG9ydCB7IHdhcm4gfSBmcm9tIFwiLi9sb2dnaW5nXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tIFwiLi9wcm9qZWN0XCI7XG5pbXBvcnQgdHlwZSB7IFRhc2tPcHRpb25zIH0gZnJvbSBcIi4vdGFza1wiO1xuaW1wb3J0IHsgVGFzayB9IGZyb20gXCIuL3Rhc2tcIjtcbmltcG9ydCB0eXBlIHsgVGFza3NNYW5pZmVzdCwgVGFza1NwZWMgfSBmcm9tIFwiLi90YXNrLW1vZGVsXCI7XG5pbXBvcnQgeyBUYXNrUnVudGltZSB9IGZyb20gXCIuL3Rhc2stcnVudGltZVwiO1xuXG4vKipcbiAqIERlZmluZXMgcHJvamVjdCB0YXNrcy5cbiAqXG4gKiBUYXNrcyBleHRlbmQgdGhlIHByb2plbiBDTEkgYnkgYWRkaW5nIHN1YmNvbW1hbmRzIHRvIGl0LiBUYXNrIGRlZmluaXRpb25zIGFyZVxuICogc3ludGhlc2l6ZWQgaW50byBgLnByb2plbi90YXNrcy5qc29uYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhc2tzIGV4dGVuZHMgQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfdGFza3M6IHsgW25hbWU6IHN0cmluZ106IFRhc2sgfTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfTtcblxuICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0KSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG5cbiAgICB0aGlzLl90YXNrcyA9IHt9O1xuICAgIHRoaXMuX2VudiA9IHt9O1xuXG4gICAgbmV3IEpzb25GaWxlKHByb2plY3QsIFRhc2tSdW50aW1lLk1BTklGRVNUX0ZJTEUsIHtcbiAgICAgIG9taXRFbXB0eTogdHJ1ZSxcbiAgICAgIG9iajoge1xuICAgICAgICB0YXNrczogKCgpID0+IHRoaXMucmVuZGVyVGFza3MoKSkgYXMgYW55LFxuICAgICAgICBlbnY6ICgoKSA9PiB0aGlzLnJlbmRlckVudigpKSBhcyBhbnksXG4gICAgICB9IGFzIFRhc2tzTWFuaWZlc3QsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsIHRhc2tzLlxuICAgKi9cbiAgcHVibGljIGdldCBhbGwoKSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5fdGFza3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSB0YXNrIHRvIGEgcHJvamVjdC5cbiAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHRhc2tcbiAgICogQHBhcmFtIG9wdGlvbnMgVGFzayBvcHRpb25zLlxuICAgKi9cbiAgcHVibGljIGFkZFRhc2sobmFtZTogc3RyaW5nLCBvcHRpb25zOiBUYXNrT3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgdGFzayA9IG5ldyBUYXNrKG5hbWUsIG9wdGlvbnMpO1xuICAgIGlmICh0aGlzLl90YXNrc1tuYW1lXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQSB0YXNrIHdpdGggdGhlIG5hbWUgJHtuYW1lfSBhbHJlYWR5IGV4aXN0cy4gVG8gb3ZlcnJpZGUgaXQsIGNhbGwgcmVtb3ZlVGFzayBmaXJzdCBhbmQgdGhlbiBjcmVhdGUgdGhlIG5ldyB0YXNrLmAsXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLl90YXNrc1tuYW1lXSA9IHRhc2s7XG4gICAgcmV0dXJuIHRhc2s7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhIHRhc2sgZnJvbSBhIHByb2plY3QuXG4gICAqXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0YXNrIHRvIHJlbW92ZS5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGBUYXNrYCB0aGF0IHdhcyByZW1vdmVkLCBvdGhlcndpc2UgYHVuZGVmaW5lZGAuXG4gICAqL1xuICBwdWJsaWMgcmVtb3ZlVGFzayhuYW1lOiBzdHJpbmcpOiB1bmRlZmluZWQgfCBUYXNrIHtcbiAgICBjb25zdCBkZXBlbmRlbnRUYXNrcyA9IHRoaXMuYWxsLmZpbHRlcigodGFzaykgPT5cbiAgICAgIHRhc2suc3RlcHMuZmluZCgoc3RlcCkgPT4gc3RlcC5zcGF3biA9PSBuYW1lKSxcbiAgICApO1xuICAgIGlmIChkZXBlbmRlbnRUYXNrcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBlcnJMaXN0ID0gZGVwZW5kZW50VGFza3MubWFwKChkZXBUYXNrKSA9PiBkZXBUYXNrLm5hbWUpLmpvaW4oXCIsIFwiKTtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFVuYWJsZSB0byByZW1vdmUgdGFzayBcIiR7bmFtZX1cIiBiZWNhdXNlIHRoZSBmb2xsb3dpbmcgdGFza3MgZGVwZW5kIG9uIGl0OiAke2Vyckxpc3R9YCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgdGFzayA9IHRoaXMuX3Rhc2tzW25hbWVdO1xuICAgIGlmICh0YXNrKSB7XG4gICAgICBkZWxldGUgdGhpcy5fdGFza3NbbmFtZV07XG4gICAgICByZXR1cm4gdGFzaztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBnbG9iYWwgZW52aXJvbm1lbnQuXG4gICAqIEBwYXJhbSBuYW1lIEVudmlyb25tZW50IHZhcmlhYmxlIG5hbWVcbiAgICogQHBhcmFtIHZhbHVlIFZhbHVlXG4gICAqL1xuICBwdWJsaWMgYWRkRW52aXJvbm1lbnQobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fZW52W25hbWVdID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGNvcHkgb2YgdGhlIGN1cnJlbnRseSBnbG9iYWwgZW52aXJvbm1lbnQgZm9yIHRoaXMgcHJvamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgZW52KCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLl9lbnYsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGaW5kcyBhIHRhc2sgYnkgbmFtZS4gUmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgdGFzayBjYW5ub3QgYmUgZm91bmQuXG4gICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSB0YXNrXG4gICAqL1xuICBwdWJsaWMgdHJ5RmluZChuYW1lOiBzdHJpbmcpOiB1bmRlZmluZWQgfCBUYXNrIHtcbiAgICByZXR1cm4gdGhpcy5fdGFza3NbbmFtZV07XG4gIH1cblxuICBwdWJsaWMgc3ludGhlc2l6ZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wcm9qZWN0LmVqZWN0ZWQpIHtcbiAgICAgIC8vIEluc2VydCBhIHRhc2stcnVubmVyIHNjcmlwdCBzbyB0aGF0IHRhc2tzIGNhbiBiZSBydW4gYWZ0ZXIgZWplY3RpbmdcbiAgICAgIGZzLm1rZGlyU3luYyhwYXRoLmpvaW4odGhpcy5wcm9qZWN0Lm91dGRpciwgXCJzY3JpcHRzXCIpLCB7XG4gICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgICAgZnMuY29weUZpbGVTeW5jKFxuICAgICAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCBcIi4uXCIsIFwibGliXCIsIFwicnVuLXRhc2suY2pzXCIpLFxuICAgICAgICBwYXRoLmpvaW4odGhpcy5wcm9qZWN0Lm91dGRpciwgXCJzY3JpcHRzXCIsIFwicnVuLXRhc2suY2pzXCIpLFxuICAgICAgKTtcbiAgICAgIGZzLmNobW9kU3luYyhcbiAgICAgICAgcGF0aC5qb2luKHRoaXMucHJvamVjdC5vdXRkaXIsIFwic2NyaXB0c1wiLCBcInJ1bi10YXNrLmNqc1wiKSxcbiAgICAgICAgXCI3NTVcIixcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJUYXNrcygpIHtcbiAgICBjb25zdCB0YXNrczogeyBbbmFtZTogc3RyaW5nXTogVGFza1NwZWMgfSA9IHt9O1xuICAgIGZvciAoY29uc3QgdGFzayBvZiBPYmplY3QudmFsdWVzKHRoaXMuX3Rhc2tzKS5zb3J0KCh4LCB5KSA9PlxuICAgICAgeC5uYW1lLmxvY2FsZUNvbXBhcmUoeS5uYW1lKSxcbiAgICApKSB7XG4gICAgICB0YXNrc1t0YXNrLm5hbWVdID0gdGFzay5fcmVuZGVyU3BlYygpO1xuICAgIH1cblxuICAgIHJldHVybiB0YXNrcztcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRW52KCkge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9lbnYpLnJlZHVjZShcbiAgICAgIChwcmV2LCBjdXJyKSA9PiAoe1xuICAgICAgICAuLi5wcmV2LFxuICAgICAgICBbY3Vycl06IHRoaXMuZ2V0RW52U3RyaW5nKGN1cnIsIHRoaXMuX2VudltjdXJyXSksXG4gICAgICB9KSxcbiAgICAgIHt9LFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogRW5zdXJlIHRoYXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBwZXJzaXN0ZWQgYXMgc3RyaW5nc1xuICAgKiB0byBwcmV2ZW50IHR5cGUgZXJyb3JzIHdoZW4gcGFyc2luZyBmcm9tIHRhc2tzLmpzb24gaW4gZnV0dXJlXG4gICAqL1xuICBwcml2YXRlIGdldEVudlN0cmluZyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSBcInN0cmluZ1wiICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHdhcm4oXG4gICAgICAgIGBSZWNlaXZlZCBub24tc3RyaW5nIHZhbHVlIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZSAke25hbWV9LiBWYWx1ZSB3aWxsIGJlIHN0cmluZ2lmaWVkLmAsXG4gICAgICApO1xuICAgICAgcmV0dXJuIFN0cmluZyh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==