projen 0.99.79 → 0.100.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.jsii +1677 -3664
- package/BREAKING_CHANGES.md +855 -0
- package/lib/ai-instructions.d.ts +0 -1
- package/lib/ai-instructions.js +6 -12
- package/lib/awscdk/auto-discover.js +7 -14
- package/lib/awscdk/awscdk-app-java.d.ts +0 -7
- package/lib/awscdk/awscdk-app-java.js +28 -21
- package/lib/awscdk/awscdk-app-py.d.ts +0 -12
- package/lib/awscdk/awscdk-app-py.js +27 -24
- package/lib/awscdk/awscdk-app-ts.d.ts +0 -5
- package/lib/awscdk/awscdk-app-ts.js +57 -31
- package/lib/awscdk/awscdk-construct.d.ts +0 -26
- package/lib/awscdk/awscdk-construct.js +4 -44
- package/lib/awscdk/awscdk-deps-java.js +2 -6
- package/lib/awscdk/awscdk-deps-js.js +2 -7
- package/lib/awscdk/awscdk-deps-py.js +2 -7
- package/lib/awscdk/awscdk-deps.d.ts +1 -90
- package/lib/awscdk/awscdk-deps.js +68 -114
- package/lib/awscdk/cdk-config.d.ts +0 -21
- package/lib/awscdk/cdk-config.js +44 -51
- package/lib/awscdk/cdk-tasks.js +26 -4
- package/lib/awscdk/integration-test.js +10 -15
- package/lib/awscdk/internal.js +5 -2
- package/lib/awscdk/lambda-extension.js +4 -16
- package/lib/awscdk/lambda-function.d.ts +0 -10
- package/lib/awscdk/lambda-function.js +88 -78
- package/lib/awscdk/private/feature-flags-v2.const.d.ts +1 -1
- package/lib/awscdk/private/feature-flags-v2.const.js +2 -2
- package/lib/build/build-workflow.js +51 -6
- package/lib/builtin-example.task.d.ts +1 -0
- package/lib/builtin-example.task.js +2 -1
- package/lib/cdk/auto-discover-base.js +43 -8
- package/lib/cdk/construct-lib.js +2 -4
- package/lib/cdk/integration-test-base.js +26 -4
- package/lib/cdk/jsii-build.d.ts +0 -1
- package/lib/cdk/jsii-build.js +15 -7
- package/lib/cdk/jsii-docgen.js +2 -4
- package/lib/cdk/jsii-project.d.ts +12 -9
- package/lib/cdk/jsii-project.js +22 -7
- package/lib/cdk8s/auto-discover.js +3 -6
- package/lib/cdk8s/cdk8s-app-py.js +7 -4
- package/lib/cdk8s/cdk8s-app-ts.js +43 -6
- package/lib/cdk8s/cdk8s-construct.js +44 -5
- package/lib/cdk8s/cdk8s-deps-py.js +2 -4
- package/lib/cdk8s/cdk8s-deps.js +50 -5
- package/lib/cdk8s/integration-test.js +2 -4
- package/lib/cdktf/cdktf-construct.js +36 -5
- package/lib/circleci/circleci.js +66 -44
- package/lib/cleanup.js +38 -5
- package/lib/cli/cmds/new.js +51 -20
- package/lib/cli/cmds/run-task.js +107 -0
- package/lib/cli/{synth.d.ts → cmds/synth.d.ts} +0 -5
- package/lib/cli/cmds/synth.js +90 -0
- package/lib/cli/index.js +47 -22
- package/lib/cli/macros.js +35 -2
- package/lib/{task-runtime.d.ts → cli/task-runtime.d.ts} +13 -2
- package/lib/cli/task-runtime.js +411 -0
- package/lib/cli/util.js +37 -4
- package/lib/component.js +3 -4
- package/lib/dependencies.js +43 -12
- package/lib/dev-env.js +10 -4
- package/lib/docker-compose/docker-compose-service.js +54 -4
- package/lib/docker-compose/docker-compose.js +8 -4
- package/lib/file.js +60 -5
- package/lib/gitattributes.js +7 -5
- package/lib/github/actions-provider.js +3 -7
- package/lib/github/auto-approve.js +3 -4
- package/lib/github/auto-merge.js +3 -5
- package/lib/github/auto-queue.js +36 -5
- package/lib/github/dependabot.js +13 -4
- package/lib/github/dependency-review.js +2 -4
- package/lib/github/github-credentials.js +37 -5
- package/lib/github/github-project.d.ts +1 -32
- package/lib/github/github-project.js +30 -8
- package/lib/github/github.d.ts +0 -9
- package/lib/github/github.js +27 -14
- package/lib/github/index.js +24 -2
- package/lib/github/merge-queue.js +3 -4
- package/lib/github/mergify.d.ts +0 -7
- package/lib/github/mergify.js +6 -13
- package/lib/github/pr-template.js +2 -4
- package/lib/github/pull-request-backport.js +4 -4
- package/lib/github/pull-request-lint.js +4 -4
- package/lib/github/stale.js +2 -4
- package/lib/github/task-workflow-job.js +20 -4
- package/lib/github/task-workflow.js +4 -4
- package/lib/github/workflow-actions.d.ts +0 -8
- package/lib/github/workflow-actions.js +2 -14
- package/lib/github/workflow-jobs.js +2 -4
- package/lib/github/workflow-steps.js +2 -4
- package/lib/github/workflows-model.d.ts +0 -8
- package/lib/github/workflows-model.js +1 -1
- package/lib/github/workflows.js +39 -6
- package/lib/gitlab/configuration-model.d.ts +0 -4
- package/lib/gitlab/configuration-model.js +1 -1
- package/lib/gitlab/configuration.js +125 -41
- package/lib/gitlab/gitlab-configuration.js +3 -5
- package/lib/gitlab/nested-configuration.js +3 -4
- package/lib/gitpod.js +11 -7
- package/lib/ignore-file.js +5 -4
- package/lib/index.d.ts +1 -2
- package/lib/index.js +38 -18
- package/lib/ini.js +36 -5
- package/lib/inventory.d.ts +32 -23
- package/lib/inventory.js +37 -4
- package/lib/java/java-project.js +26 -4
- package/lib/java/junit.js +2 -4
- package/lib/java/maven-compile.js +2 -4
- package/lib/java/maven-packaging.js +6 -4
- package/lib/java/maven-sample.js +2 -4
- package/lib/java/pom.js +45 -12
- package/lib/java/projenrc.js +10 -4
- package/lib/javascript/biome/biome.js +48 -6
- package/lib/javascript/bundler.d.ts +0 -8
- package/lib/javascript/bundler.js +48 -11
- package/lib/javascript/eslint.d.ts +0 -13
- package/lib/javascript/eslint.js +38 -37
- package/lib/javascript/index.js +24 -2
- package/lib/javascript/jest.d.ts +0 -20
- package/lib/javascript/jest.js +71 -15
- package/lib/javascript/license-checker.js +3 -4
- package/lib/javascript/node-package.d.ts +0 -28
- package/lib/javascript/node-package.js +137 -38
- package/lib/javascript/node-project.d.ts +6 -76
- package/lib/javascript/node-project.js +90 -82
- package/lib/javascript/npm-config.js +7 -9
- package/lib/javascript/prettier.js +16 -4
- package/lib/javascript/projenrc.js +3 -4
- package/lib/javascript/render-options.d.ts +2 -2
- package/lib/javascript/render-options.js +36 -5
- package/lib/javascript/typescript-config.js +45 -8
- package/lib/javascript/upgrade-dependencies.js +56 -36
- package/lib/javascript/util.js +35 -2
- package/lib/javascript/yarnrc.d.ts +1 -28
- package/lib/javascript/yarnrc.js +3 -45
- package/lib/json-patch.js +3 -4
- package/lib/json.js +4 -5
- package/lib/license.js +37 -5
- package/lib/logger.js +14 -11
- package/lib/logging.js +10 -7
- package/lib/makefile.js +7 -4
- package/lib/object-file.js +19 -4
- package/lib/project-build.js +26 -4
- package/lib/project-tree.js +3 -4
- package/lib/project.d.ts +0 -35
- package/lib/project.js +105 -58
- package/lib/projects.js +37 -6
- package/lib/projenrc-json.d.ts +0 -10
- package/lib/projenrc-json.js +4 -13
- package/lib/projenrc.js +2 -4
- package/lib/python/index.js +24 -2
- package/lib/python/pip.js +5 -4
- package/lib/python/poetry.js +63 -7
- package/lib/python/projenrc.js +10 -4
- package/lib/python/pyproject-toml-file.js +2 -4
- package/lib/python/pytest-sample.js +2 -4
- package/lib/python/pytest.d.ts +0 -12
- package/lib/python/pytest.js +3 -5
- package/lib/python/python-project.js +33 -10
- package/lib/python/python-sample.js +2 -4
- package/lib/python/requirements-file.js +4 -5
- package/lib/python/setuppy.d.ts +0 -8
- package/lib/python/setuppy.js +3 -4
- package/lib/python/setuptools.js +8 -4
- package/lib/python/uv.js +11 -4
- package/lib/python/venv.js +45 -6
- package/lib/readme.js +2 -4
- package/lib/release/bump-version.js +36 -3
- package/lib/release/bump-version.task.js +35 -2
- package/lib/release/commit-tag-version.js +39 -3
- package/lib/release/publisher.d.ts +0 -49
- package/lib/release/publisher.js +24 -22
- package/lib/release/release-trigger.js +33 -4
- package/lib/release/release.d.ts +0 -24
- package/lib/release/release.js +66 -31
- package/lib/release/tag-version.js +35 -2
- package/lib/release/update-changelog.js +36 -3
- package/lib/renovatebot.js +14 -4
- package/lib/run-projenrc-json.task.js +35 -2
- package/lib/run-task.cjs +12567 -271
- package/lib/sample-file.js +43 -9
- package/lib/smithy/smithy-build.js +46 -1
- package/lib/source-code.js +6 -5
- package/lib/task-runner.d.ts +25 -0
- package/lib/task-runner.js +92 -0
- package/lib/task.d.ts +0 -7
- package/lib/task.js +13 -13
- package/lib/tasks.d.ts +5 -9
- package/lib/tasks.js +64 -23
- package/lib/testing.js +2 -4
- package/lib/textfile.js +3 -4
- package/lib/toml.js +36 -5
- package/lib/typescript/projenrc-ts.js +8 -4
- package/lib/typescript/projenrc.js +6 -4
- package/lib/typescript/typescript-typedoc.js +2 -4
- package/lib/typescript/typescript.d.ts +0 -10
- package/lib/typescript/typescript.js +75 -29
- package/lib/util/synth.js +39 -6
- package/lib/util.js +38 -5
- package/lib/version.d.ts +0 -4
- package/lib/version.js +24 -10
- package/lib/vscode/devcontainer.js +11 -4
- package/lib/vscode/extensions.js +17 -18
- package/lib/vscode/launch-config.js +5 -6
- package/lib/vscode/settings.js +4 -4
- package/lib/vscode/vscode.js +5 -4
- package/lib/web/next.js +38 -8
- package/lib/web/postcss.js +5 -4
- package/lib/web/react.d.ts +0 -14
- package/lib/web/react.js +51 -25
- package/lib/web/tailwind.js +4 -4
- package/lib/xmlfile.js +2 -4
- package/lib/yaml.js +40 -5
- package/package.json +9 -10
- package/lib/cli/synth.js +0 -105
- package/lib/cli/tasks.js +0 -71
- package/lib/semver.d.ts +0 -34
- package/lib/semver.js +0 -56
- package/lib/task-runtime.js +0 -317
- /package/lib/cli/{tasks.d.ts → cmds/run-task.d.ts} +0 -0
package/lib/cli/tasks.js
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.discoverTaskCommands = discoverTaskCommands;
|
|
4
|
-
const chalk = require("chalk");
|
|
5
|
-
const helpers_1 = require("yargs/helpers");
|
|
6
|
-
const logging = require("../logging");
|
|
7
|
-
/**
|
|
8
|
-
* Reads .projen/tasks.json and adds CLI commands for all tasks.
|
|
9
|
-
* @param ya yargs
|
|
10
|
-
*/
|
|
11
|
-
function discoverTaskCommands(runtime, ya) {
|
|
12
|
-
const tasks = runtime.manifest.tasks ?? {};
|
|
13
|
-
for (const task of Object.values(tasks)) {
|
|
14
|
-
ya.command(task.name, task.description ?? "", taskCommandHandler(task));
|
|
15
|
-
}
|
|
16
|
-
function taskCommandHandler(task) {
|
|
17
|
-
return (args) => {
|
|
18
|
-
const taskReceivesArgs = task.steps?.reduce((receiveArgs, step) => receiveArgs || (step.receiveArgs ?? false), false);
|
|
19
|
-
let taskArgs = [];
|
|
20
|
-
if (taskReceivesArgs) {
|
|
21
|
-
args.help(false);
|
|
22
|
-
args.strict(false);
|
|
23
|
-
args.strictCommands(false);
|
|
24
|
-
taskArgs = (0, helpers_1.hideBin)(process.argv).slice(1);
|
|
25
|
-
}
|
|
26
|
-
args.option("inspect", {
|
|
27
|
-
alias: "i",
|
|
28
|
-
desc: "show all steps in this task",
|
|
29
|
-
});
|
|
30
|
-
const argv = args.argv;
|
|
31
|
-
if (argv.inspect) {
|
|
32
|
-
return inspectTask(task.name);
|
|
33
|
-
}
|
|
34
|
-
else {
|
|
35
|
-
try {
|
|
36
|
-
runtime.runTask(task.name, [], taskArgs);
|
|
37
|
-
}
|
|
38
|
-
catch (e) {
|
|
39
|
-
logging.error(e.message);
|
|
40
|
-
process.exit(1);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
function inspectTask(name, indent = 0) {
|
|
46
|
-
const writeln = (s) => console.log(" ".repeat(indent) + s);
|
|
47
|
-
const task = runtime.tryFindTask(name);
|
|
48
|
-
if (!task) {
|
|
49
|
-
throw new Error(`${name}: unable to resolve subtask with name "${name}"`);
|
|
50
|
-
}
|
|
51
|
-
if (task.description) {
|
|
52
|
-
writeln(`${chalk.underline("description")}: ${task.description}`);
|
|
53
|
-
}
|
|
54
|
-
for (const [k, v] of Object.entries(task.env ?? {})) {
|
|
55
|
-
writeln(`${chalk.underline("env")}: ${k}=${v}`);
|
|
56
|
-
}
|
|
57
|
-
for (const step of task.steps ?? []) {
|
|
58
|
-
if (step.spawn) {
|
|
59
|
-
writeln(`- ${chalk.bold(step.spawn)}`);
|
|
60
|
-
inspectTask(step.spawn, indent + 2);
|
|
61
|
-
}
|
|
62
|
-
else if (step.exec) {
|
|
63
|
-
writeln(`- exec: ${step.exec}`);
|
|
64
|
-
}
|
|
65
|
-
else if (step.builtin) {
|
|
66
|
-
writeln(`- builtin: ${step.builtin}`);
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFza3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpL3Rhc2tzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBV0Esb0RBbUVDO0FBOUVELCtCQUErQjtBQUUvQiwyQ0FBd0M7QUFDeEMsc0NBQXNDO0FBSXRDOzs7R0FHRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLE9BQW9CLEVBQUUsRUFBYztJQUN2RSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7SUFDM0MsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDeEMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksRUFBRSxFQUFFLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVELFNBQVMsa0JBQWtCLENBQUMsSUFBYztRQUN4QyxPQUFPLENBQUMsSUFBZ0IsRUFBRSxFQUFFO1lBQzFCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQ3pDLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsV0FBVyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxLQUFLLENBQUMsRUFDakUsS0FBSyxDQUNOLENBQUM7WUFDRixJQUFJLFFBQVEsR0FBMkIsRUFBRSxDQUFDO1lBQzFDLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztnQkFDckIsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0IsUUFBUSxHQUFHLElBQUEsaUJBQU8sRUFBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFFRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtnQkFDckIsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsSUFBSSxFQUFFLDZCQUE2QjthQUNwQyxDQUFDLENBQUM7WUFFSCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1lBRXZCLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUNqQixPQUFPLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQztvQkFDSCxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUMzQyxDQUFDO2dCQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7b0JBQ2hCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDO29CQUN6QixPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsQixDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUMsQ0FBQztJQUNKLENBQUM7SUFFRCxTQUFTLFdBQVcsQ0FBQyxJQUFZLEVBQUUsTUFBTSxHQUFHLENBQUM7UUFDM0MsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVuRSxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsR0FBRyxJQUFJLDBDQUEwQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQzVFLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNyQixPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBQ3BFLENBQUM7UUFFRCxLQUFLLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDcEQsT0FBTyxDQUFDLEdBQUcsS0FBSyxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBRUQsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLEVBQUUsRUFBRSxDQUFDO1lBQ3BDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNmLE9BQU8sQ0FBQyxLQUFLLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdkMsV0FBVyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3JCLE9BQU8sQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ2xDLENBQUM7aUJBQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ3hCLE9BQU8sQ0FBQyxjQUFjLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB0eXBlICogYXMgeWFyZ3MgZnJvbSBcInlhcmdzXCI7XG5pbXBvcnQgeyBoaWRlQmluIH0gZnJvbSBcInlhcmdzL2hlbHBlcnNcIjtcbmltcG9ydCAqIGFzIGxvZ2dpbmcgZnJvbSBcIi4uL2xvZ2dpbmdcIjtcbmltcG9ydCB0eXBlIHsgVGFza1NwZWMgfSBmcm9tIFwiLi4vdGFzay1tb2RlbFwiO1xuaW1wb3J0IHR5cGUgeyBUYXNrUnVudGltZSB9IGZyb20gXCIuLi90YXNrLXJ1bnRpbWVcIjtcblxuLyoqXG4gKiBSZWFkcyAucHJvamVuL3Rhc2tzLmpzb24gYW5kIGFkZHMgQ0xJIGNvbW1hbmRzIGZvciBhbGwgdGFza3MuXG4gKiBAcGFyYW0geWEgeWFyZ3NcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2NvdmVyVGFza0NvbW1hbmRzKHJ1bnRpbWU6IFRhc2tSdW50aW1lLCB5YTogeWFyZ3MuQXJndikge1xuICBjb25zdCB0YXNrcyA9IHJ1bnRpbWUubWFuaWZlc3QudGFza3MgPz8ge307XG4gIGZvciAoY29uc3QgdGFzayBvZiBPYmplY3QudmFsdWVzKHRhc2tzKSkge1xuICAgIHlhLmNvbW1hbmQodGFzay5uYW1lLCB0YXNrLmRlc2NyaXB0aW9uID8/IFwiXCIsIHRhc2tDb21tYW5kSGFuZGxlcih0YXNrKSk7XG4gIH1cblxuICBmdW5jdGlvbiB0YXNrQ29tbWFuZEhhbmRsZXIodGFzazogVGFza1NwZWMpIHtcbiAgICByZXR1cm4gKGFyZ3M6IHlhcmdzLkFyZ3YpID0+IHtcbiAgICAgIGNvbnN0IHRhc2tSZWNlaXZlc0FyZ3MgPSB0YXNrLnN0ZXBzPy5yZWR1Y2UoXG4gICAgICAgIChyZWNlaXZlQXJncywgc3RlcCkgPT4gcmVjZWl2ZUFyZ3MgfHwgKHN0ZXAucmVjZWl2ZUFyZ3MgPz8gZmFsc2UpLFxuICAgICAgICBmYWxzZSxcbiAgICAgICk7XG4gICAgICBsZXQgdGFza0FyZ3M6IEFycmF5PHN0cmluZyB8IG51bWJlcj4gPSBbXTtcbiAgICAgIGlmICh0YXNrUmVjZWl2ZXNBcmdzKSB7XG4gICAgICAgIGFyZ3MuaGVscChmYWxzZSk7XG4gICAgICAgIGFyZ3Muc3RyaWN0KGZhbHNlKTtcbiAgICAgICAgYXJncy5zdHJpY3RDb21tYW5kcyhmYWxzZSk7XG4gICAgICAgIHRhc2tBcmdzID0gaGlkZUJpbihwcm9jZXNzLmFyZ3YpLnNsaWNlKDEpO1xuICAgICAgfVxuXG4gICAgICBhcmdzLm9wdGlvbihcImluc3BlY3RcIiwge1xuICAgICAgICBhbGlhczogXCJpXCIsXG4gICAgICAgIGRlc2M6IFwic2hvdyBhbGwgc3RlcHMgaW4gdGhpcyB0YXNrXCIsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgYXJndiA9IGFyZ3MuYXJndjtcblxuICAgICAgaWYgKGFyZ3YuaW5zcGVjdCkge1xuICAgICAgICByZXR1cm4gaW5zcGVjdFRhc2sodGFzay5uYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcnVudGltZS5ydW5UYXNrKHRhc2submFtZSwgW10sIHRhc2tBcmdzKTtcbiAgICAgICAgfSBjYXRjaCAoZTogYW55KSB7XG4gICAgICAgICAgbG9nZ2luZy5lcnJvcihlLm1lc3NhZ2UpO1xuICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBpbnNwZWN0VGFzayhuYW1lOiBzdHJpbmcsIGluZGVudCA9IDApIHtcbiAgICBjb25zdCB3cml0ZWxuID0gKHM6IHN0cmluZykgPT4gY29uc29sZS5sb2coXCIgXCIucmVwZWF0KGluZGVudCkgKyBzKTtcblxuICAgIGNvbnN0IHRhc2sgPSBydW50aW1lLnRyeUZpbmRUYXNrKG5hbWUpO1xuICAgIGlmICghdGFzaykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke25hbWV9OiB1bmFibGUgdG8gcmVzb2x2ZSBzdWJ0YXNrIHdpdGggbmFtZSBcIiR7bmFtZX1cImApO1xuICAgIH1cblxuICAgIGlmICh0YXNrLmRlc2NyaXB0aW9uKSB7XG4gICAgICB3cml0ZWxuKGAke2NoYWxrLnVuZGVybGluZShcImRlc2NyaXB0aW9uXCIpfTogJHt0YXNrLmRlc2NyaXB0aW9ufWApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHRhc2suZW52ID8/IHt9KSkge1xuICAgICAgd3JpdGVsbihgJHtjaGFsay51bmRlcmxpbmUoXCJlbnZcIil9OiAke2t9PSR7dn1gKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IHN0ZXAgb2YgdGFzay5zdGVwcyA/PyBbXSkge1xuICAgICAgaWYgKHN0ZXAuc3Bhd24pIHtcbiAgICAgICAgd3JpdGVsbihgLSAke2NoYWxrLmJvbGQoc3RlcC5zcGF3bil9YCk7XG4gICAgICAgIGluc3BlY3RUYXNrKHN0ZXAuc3Bhd24sIGluZGVudCArIDIpO1xuICAgICAgfSBlbHNlIGlmIChzdGVwLmV4ZWMpIHtcbiAgICAgICAgd3JpdGVsbihgLSBleGVjOiAke3N0ZXAuZXhlY31gKTtcbiAgICAgIH0gZWxzZSBpZiAoc3RlcC5idWlsdGluKSB7XG4gICAgICAgIHdyaXRlbG4oYC0gYnVpbHRpbjogJHtzdGVwLmJ1aWx0aW59YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
package/lib/semver.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @deprecated This class will be removed in upcoming releases. if you wish to
|
|
3
|
-
* specify semver requirements in `deps`, `devDeps`, etc, specify them like so
|
|
4
|
-
* `express@^2.1`.
|
|
5
|
-
*/
|
|
6
|
-
export declare class Semver {
|
|
7
|
-
readonly spec: string;
|
|
8
|
-
static of(spec: string): Semver;
|
|
9
|
-
/**
|
|
10
|
-
* Latest version.
|
|
11
|
-
*/
|
|
12
|
-
static latest(): Semver;
|
|
13
|
-
/**
|
|
14
|
-
* Accept only an exact version
|
|
15
|
-
*/
|
|
16
|
-
static pinned(version: string): Semver;
|
|
17
|
-
/**
|
|
18
|
-
* Accept any minor version.
|
|
19
|
-
*
|
|
20
|
-
* >= version
|
|
21
|
-
* < next major version
|
|
22
|
-
*/
|
|
23
|
-
static caret(version: string): Semver;
|
|
24
|
-
/**
|
|
25
|
-
* Accept patches.
|
|
26
|
-
*
|
|
27
|
-
* >= version
|
|
28
|
-
* < next minor version
|
|
29
|
-
*/
|
|
30
|
-
static tilde(version: string): Semver;
|
|
31
|
-
readonly mode?: string;
|
|
32
|
-
private constructor();
|
|
33
|
-
get version(): string | undefined;
|
|
34
|
-
}
|
package/lib/semver.js
DELETED
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var _a;
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.Semver = void 0;
|
|
5
|
-
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
-
const semver = require("semver");
|
|
7
|
-
/**
|
|
8
|
-
* @deprecated This class will be removed in upcoming releases. if you wish to
|
|
9
|
-
* specify semver requirements in `deps`, `devDeps`, etc, specify them like so
|
|
10
|
-
* `express@^2.1`.
|
|
11
|
-
*/
|
|
12
|
-
class Semver {
|
|
13
|
-
static of(spec) {
|
|
14
|
-
return new Semver(spec);
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Latest version.
|
|
18
|
-
*/
|
|
19
|
-
static latest() {
|
|
20
|
-
return new Semver("*");
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Accept only an exact version
|
|
24
|
-
*/
|
|
25
|
-
static pinned(version) {
|
|
26
|
-
return new Semver(version);
|
|
27
|
-
}
|
|
28
|
-
/**
|
|
29
|
-
* Accept any minor version.
|
|
30
|
-
*
|
|
31
|
-
* >= version
|
|
32
|
-
* < next major version
|
|
33
|
-
*/
|
|
34
|
-
static caret(version) {
|
|
35
|
-
return new Semver(`^${version}`);
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Accept patches.
|
|
39
|
-
*
|
|
40
|
-
* >= version
|
|
41
|
-
* < next minor version
|
|
42
|
-
*/
|
|
43
|
-
static tilde(version) {
|
|
44
|
-
return new Semver(`~${version}`);
|
|
45
|
-
}
|
|
46
|
-
constructor(spec) {
|
|
47
|
-
this.spec = spec;
|
|
48
|
-
}
|
|
49
|
-
get version() {
|
|
50
|
-
return semver.minVersion(this.spec)?.version;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
exports.Semver = Semver;
|
|
54
|
-
_a = JSII_RTTI_SYMBOL_1;
|
|
55
|
-
Semver[_a] = { fqn: "projen.Semver", version: "0.99.79" };
|
|
56
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VtdmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3NlbXZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLGlDQUFpQztBQUVqQzs7OztHQUlHO0FBQ0gsTUFBYSxNQUFNO0lBQ1YsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFZO1FBQzNCLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLE1BQU07UUFDbEIsT0FBTyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN6QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQWU7UUFDbEMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQWU7UUFDakMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFlO1FBQ2pDLE9BQU8sSUFBSSxNQUFNLENBQUMsSUFBSSxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFJRCxZQUFvQyxJQUFZO1FBQVosU0FBSSxHQUFKLElBQUksQ0FBUTtJQUFHLENBQUM7SUFFcEQsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDO0lBQy9DLENBQUM7O0FBN0NILHdCQThDQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIHNlbXZlciBmcm9tIFwic2VtdmVyXCI7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVGhpcyBjbGFzcyB3aWxsIGJlIHJlbW92ZWQgaW4gdXBjb21pbmcgcmVsZWFzZXMuIGlmIHlvdSB3aXNoIHRvXG4gKiBzcGVjaWZ5IHNlbXZlciByZXF1aXJlbWVudHMgaW4gYGRlcHNgLCBgZGV2RGVwc2AsIGV0Yywgc3BlY2lmeSB0aGVtIGxpa2Ugc29cbiAqIGBleHByZXNzQF4yLjFgLlxuICovXG5leHBvcnQgY2xhc3MgU2VtdmVyIHtcbiAgcHVibGljIHN0YXRpYyBvZihzcGVjOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFNlbXZlcihzcGVjKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMYXRlc3QgdmVyc2lvbi5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgbGF0ZXN0KCkge1xuICAgIHJldHVybiBuZXcgU2VtdmVyKFwiKlwiKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQgb25seSBhbiBleGFjdCB2ZXJzaW9uXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHBpbm5lZCh2ZXJzaW9uOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gbmV3IFNlbXZlcih2ZXJzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBY2NlcHQgYW55IG1pbm9yIHZlcnNpb24uXG4gICAqXG4gICAqID49IHZlcnNpb25cbiAgICogPCBuZXh0IG1ham9yIHZlcnNpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2FyZXQodmVyc2lvbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBTZW12ZXIoYF4ke3ZlcnNpb259YCk7XG4gIH1cblxuICAvKipcbiAgICogQWNjZXB0IHBhdGNoZXMuXG4gICAqXG4gICAqID49IHZlcnNpb25cbiAgICogPCBuZXh0IG1pbm9yIHZlcnNpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdGlsZGUodmVyc2lvbjogc3RyaW5nKSB7XG4gICAgcmV0dXJuIG5ldyBTZW12ZXIoYH4ke3ZlcnNpb259YCk7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgbW9kZT86IHN0cmluZztcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKHB1YmxpYyByZWFkb25seSBzcGVjOiBzdHJpbmcpIHt9XG5cbiAgcHVibGljIGdldCB2ZXJzaW9uKCkge1xuICAgIHJldHVybiBzZW12ZXIubWluVmVyc2lvbih0aGlzLnNwZWMpPy52ZXJzaW9uO1xuICB9XG59XG4iXX0=
|
package/lib/task-runtime.js
DELETED
|
@@ -1,317 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var _a;
|
|
3
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
-
exports.TaskRuntime = void 0;
|
|
5
|
-
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
-
const child_process_1 = require("child_process");
|
|
7
|
-
const fs_1 = require("fs");
|
|
8
|
-
const path_1 = require("path");
|
|
9
|
-
const path = require("path");
|
|
10
|
-
const util_1 = require("util");
|
|
11
|
-
const chalk_1 = require("chalk");
|
|
12
|
-
const common_1 = require("./common");
|
|
13
|
-
const logging = require("./logging");
|
|
14
|
-
// avoids a (false positive) esbuild warning about incorrect imports
|
|
15
|
-
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
16
|
-
const parseConflictJSON = require("parse-conflict-json");
|
|
17
|
-
const ENV_TRIM_LEN = 20;
|
|
18
|
-
const ARGS_MARKER = "$@";
|
|
19
|
-
const QUOTED_ARGS_MARKER = `"${ARGS_MARKER}"`;
|
|
20
|
-
/**
|
|
21
|
-
* The runtime component of the tasks engine.
|
|
22
|
-
*/
|
|
23
|
-
class TaskRuntime {
|
|
24
|
-
constructor(workdir) {
|
|
25
|
-
this.workdir = (0, path_1.resolve)(workdir);
|
|
26
|
-
const manifestPath = (0, path_1.join)(this.workdir, TaskRuntime.MANIFEST_FILE);
|
|
27
|
-
this.manifest = (0, fs_1.existsSync)(manifestPath)
|
|
28
|
-
? parseConflictJSON((0, fs_1.readFileSync)(manifestPath, "utf-8"), undefined, "theirs")
|
|
29
|
-
: { tasks: {} };
|
|
30
|
-
}
|
|
31
|
-
/**
|
|
32
|
-
* The tasks in this project.
|
|
33
|
-
*/
|
|
34
|
-
get tasks() {
|
|
35
|
-
return Object.values(this.manifest.tasks ?? {});
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Find a task by name, or `undefined` if not found.
|
|
39
|
-
*/
|
|
40
|
-
tryFindTask(name) {
|
|
41
|
-
if (!this.manifest.tasks) {
|
|
42
|
-
return undefined;
|
|
43
|
-
}
|
|
44
|
-
return this.manifest.tasks[name];
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* Runs the task.
|
|
48
|
-
* @param name The task name.
|
|
49
|
-
*/
|
|
50
|
-
runTask(name, parents = [], args = [], env = {}) {
|
|
51
|
-
const task = this.tryFindTask(name);
|
|
52
|
-
if (!task) {
|
|
53
|
-
throw new Error(`cannot find command ${task}`);
|
|
54
|
-
}
|
|
55
|
-
new RunTask(this, task, parents, args, env);
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
exports.TaskRuntime = TaskRuntime;
|
|
59
|
-
_a = JSII_RTTI_SYMBOL_1;
|
|
60
|
-
TaskRuntime[_a] = { fqn: "projen.TaskRuntime", version: "0.99.79" };
|
|
61
|
-
/**
|
|
62
|
-
* The project-relative path of the tasks manifest file.
|
|
63
|
-
*/
|
|
64
|
-
TaskRuntime.MANIFEST_FILE = path.posix.join(common_1.PROJEN_DIR, "tasks.json");
|
|
65
|
-
class RunTask {
|
|
66
|
-
constructor(runtime, task, parents = [], args = [], envParam = {}) {
|
|
67
|
-
this.runtime = runtime;
|
|
68
|
-
this.task = task;
|
|
69
|
-
this.env = {};
|
|
70
|
-
this.workdir = task.cwd ?? this.runtime.workdir;
|
|
71
|
-
this.parents = parents;
|
|
72
|
-
if (!task.steps || task.steps.length === 0) {
|
|
73
|
-
this.logDebug((0, chalk_1.gray)("No actions have been specified for this task."));
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
this.env = this.resolveEnvironment(envParam, parents);
|
|
77
|
-
const envlogs = [];
|
|
78
|
-
for (const [k, v] of Object.entries(this.env)) {
|
|
79
|
-
const vv = v ?? "";
|
|
80
|
-
const trimmed = vv.length > ENV_TRIM_LEN ? vv.substr(0, ENV_TRIM_LEN) + "..." : vv;
|
|
81
|
-
envlogs.push(`${k}=${trimmed}`);
|
|
82
|
-
}
|
|
83
|
-
if (envlogs.length) {
|
|
84
|
-
this.logDebug((0, chalk_1.gray)(`${(0, chalk_1.underline)("env")}: ${envlogs.join(" ")}`));
|
|
85
|
-
}
|
|
86
|
-
// evaluate condition
|
|
87
|
-
if (!this.evalCondition(task)) {
|
|
88
|
-
this.log("condition exited with non-zero - skipping");
|
|
89
|
-
return;
|
|
90
|
-
}
|
|
91
|
-
// verify we required environment variables are defined
|
|
92
|
-
const merged = { ...process.env, ...this.env };
|
|
93
|
-
const missing = new Array();
|
|
94
|
-
for (const name of task.requiredEnv ?? []) {
|
|
95
|
-
if (!(name in merged)) {
|
|
96
|
-
missing.push(name);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
if (missing.length > 0) {
|
|
100
|
-
throw new Error(`missing required environment variables: ${missing.join(",")}`);
|
|
101
|
-
}
|
|
102
|
-
for (const step of task.steps) {
|
|
103
|
-
// evaluate step condition
|
|
104
|
-
if (!this.evalCondition(step)) {
|
|
105
|
-
this.log("condition exited with non-zero - skipping");
|
|
106
|
-
continue;
|
|
107
|
-
}
|
|
108
|
-
const argsList = [
|
|
109
|
-
...(step.args || []),
|
|
110
|
-
...(step.receiveArgs ? args : []),
|
|
111
|
-
].map((a) => a.toString());
|
|
112
|
-
if (step.say) {
|
|
113
|
-
logging.info(this.fmtLog(step.say));
|
|
114
|
-
}
|
|
115
|
-
if (step.spawn) {
|
|
116
|
-
this.runtime.runTask(step.spawn, [...this.parents, this.task.name], argsList, step.env);
|
|
117
|
-
}
|
|
118
|
-
const execs = step.exec ? [step.exec] : [];
|
|
119
|
-
// Parse step-specific environment variables
|
|
120
|
-
const env = this.evalEnvironment(step.env ?? {});
|
|
121
|
-
if (step.builtin) {
|
|
122
|
-
execs.push(this.renderBuiltin(step.builtin));
|
|
123
|
-
}
|
|
124
|
-
for (const exec of execs) {
|
|
125
|
-
let hasError = false;
|
|
126
|
-
let command = exec;
|
|
127
|
-
if (command.includes(QUOTED_ARGS_MARKER)) {
|
|
128
|
-
// Poorly imitate bash quoted variable expansion. If "$@" is encountered in bash, elements of the arg array
|
|
129
|
-
// that contain whitespace will be single quoted ('arg'). This preserves whitespace in things like filenames.
|
|
130
|
-
// Imitate that behavior here by single quoting every element of the arg array when a quoted arg marker ("$@")
|
|
131
|
-
// is encountered.
|
|
132
|
-
command = command.replace(QUOTED_ARGS_MARKER, argsList.map((arg) => `'${arg}'`).join(" "));
|
|
133
|
-
}
|
|
134
|
-
else if (command.includes(ARGS_MARKER)) {
|
|
135
|
-
command = command.replace(ARGS_MARKER, argsList.join(" "));
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
command = [command, ...argsList].join(" ");
|
|
139
|
-
}
|
|
140
|
-
const cwd = step.cwd;
|
|
141
|
-
try {
|
|
142
|
-
const result = this.shell({
|
|
143
|
-
command,
|
|
144
|
-
cwd,
|
|
145
|
-
extraEnv: env,
|
|
146
|
-
});
|
|
147
|
-
hasError = result.status !== 0;
|
|
148
|
-
}
|
|
149
|
-
catch (e) {
|
|
150
|
-
// This is the error 'shx' will throw
|
|
151
|
-
if (e?.message?.startsWith("non-zero exit code:")) {
|
|
152
|
-
hasError = true;
|
|
153
|
-
}
|
|
154
|
-
throw e;
|
|
155
|
-
}
|
|
156
|
-
if (hasError) {
|
|
157
|
-
throw new Error(`Task "${this.fullname}" failed when executing "${command}" (cwd: ${(0, path_1.resolve)(cwd ?? this.workdir)})`);
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Determines if a task should be executed based on "condition".
|
|
164
|
-
*
|
|
165
|
-
* @returns true if the task should be executed or false if the condition
|
|
166
|
-
* evaluates to false (exits with non-zero), indicating that the task should
|
|
167
|
-
* be skipped.
|
|
168
|
-
*/
|
|
169
|
-
evalCondition(taskOrStep) {
|
|
170
|
-
// no condition, carry on
|
|
171
|
-
if (!taskOrStep.condition) {
|
|
172
|
-
return true;
|
|
173
|
-
}
|
|
174
|
-
this.log((0, chalk_1.gray)(`${(0, chalk_1.underline)("condition")}: ${taskOrStep.condition}`));
|
|
175
|
-
const result = this.shell({
|
|
176
|
-
command: taskOrStep.condition,
|
|
177
|
-
logprefix: "condition: ",
|
|
178
|
-
quiet: true,
|
|
179
|
-
});
|
|
180
|
-
if (result.status === 0) {
|
|
181
|
-
return true;
|
|
182
|
-
}
|
|
183
|
-
else {
|
|
184
|
-
return false;
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
/**
|
|
188
|
-
* Evaluates environment variables from shell commands (e.g. `$(xx)`)
|
|
189
|
-
*/
|
|
190
|
-
evalEnvironment(env) {
|
|
191
|
-
const output = {};
|
|
192
|
-
for (const [key, value] of Object.entries(env ?? {})) {
|
|
193
|
-
if (String(value).startsWith("$(") && String(value).endsWith(")")) {
|
|
194
|
-
const query = value.substring(2, value.length - 1);
|
|
195
|
-
const result = this.shellEval({ command: query });
|
|
196
|
-
if (result.status !== 0) {
|
|
197
|
-
const error = result.error
|
|
198
|
-
? result.error.stack
|
|
199
|
-
: result.stderr?.toString().trim() ||
|
|
200
|
-
result.stdout?.toString().trim() ||
|
|
201
|
-
`command exited with code ${result.status}`;
|
|
202
|
-
logging.warn(this.fmtLog(`${(0, chalk_1.underline)(key)}: unable to evaluate "${query}". Environment variable will be skipped. Check that the command exists and runs successfully.`));
|
|
203
|
-
logging.warn(this.fmtLog(`${(0, chalk_1.underline)(key)}: ${error}`));
|
|
204
|
-
}
|
|
205
|
-
else {
|
|
206
|
-
output[key] = result.stdout.toString("utf-8").trim();
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
output[key] = value;
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
return output;
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Renders the runtime environment for a task. Namely, it supports this syntax
|
|
217
|
-
* `$(xx)` for allowing environment to be evaluated by executing a shell
|
|
218
|
-
* command and obtaining its result.
|
|
219
|
-
*/
|
|
220
|
-
resolveEnvironment(envParam, parents) {
|
|
221
|
-
let env = this.runtime.manifest.env ?? {};
|
|
222
|
-
// add env from all parent tasks one by one
|
|
223
|
-
for (const parent of parents) {
|
|
224
|
-
env = {
|
|
225
|
-
...env,
|
|
226
|
-
...(this.runtime.tryFindTask(parent)?.env ?? {}),
|
|
227
|
-
};
|
|
228
|
-
}
|
|
229
|
-
// apply task environment, then the specific env last
|
|
230
|
-
env = {
|
|
231
|
-
...env,
|
|
232
|
-
...(this.task.env ?? {}),
|
|
233
|
-
...envParam,
|
|
234
|
-
};
|
|
235
|
-
return this.evalEnvironment(env ?? {});
|
|
236
|
-
}
|
|
237
|
-
/**
|
|
238
|
-
* Returns the "full name" of the task which includes all it's parent task names concatenated by chevrons.
|
|
239
|
-
*/
|
|
240
|
-
get fullname() {
|
|
241
|
-
return [...this.parents, this.task.name].join(" » ");
|
|
242
|
-
}
|
|
243
|
-
log(...args) {
|
|
244
|
-
logging.verbose(this.fmtLog(...args));
|
|
245
|
-
}
|
|
246
|
-
logDebug(...args) {
|
|
247
|
-
logging.debug(this.fmtLog(...args));
|
|
248
|
-
}
|
|
249
|
-
fmtLog(...args) {
|
|
250
|
-
return (0, util_1.format)(`${(0, chalk_1.underline)(this.fullname)} |`, ...args);
|
|
251
|
-
}
|
|
252
|
-
shell(options) {
|
|
253
|
-
const quiet = options.quiet ?? false;
|
|
254
|
-
if (!quiet) {
|
|
255
|
-
const log = new Array();
|
|
256
|
-
if (options.logprefix) {
|
|
257
|
-
log.push(options.logprefix);
|
|
258
|
-
}
|
|
259
|
-
log.push(options.command);
|
|
260
|
-
if (options.cwd) {
|
|
261
|
-
log.push(`(cwd: ${options.cwd})`);
|
|
262
|
-
}
|
|
263
|
-
this.log(log.join(" "));
|
|
264
|
-
}
|
|
265
|
-
const cwd = options.cwd ?? this.workdir;
|
|
266
|
-
if (!(0, fs_1.existsSync)(cwd) || !(0, fs_1.statSync)(cwd).isDirectory()) {
|
|
267
|
-
throw new Error(`invalid workdir (cwd): ${cwd} must be an existing directory`);
|
|
268
|
-
}
|
|
269
|
-
const env = {
|
|
270
|
-
...process.env,
|
|
271
|
-
...this.env,
|
|
272
|
-
...options.extraEnv,
|
|
273
|
-
};
|
|
274
|
-
// On Windows the default shell (cmd.exe) does not understand the POSIX-style
|
|
275
|
-
// commands projen tasks are written in (`cat`, `cp`, `mkdir -p`, `rm -rf`,
|
|
276
|
-
// `&&` chains, `$VAR`, ...). Run the command through dax's cross-platform
|
|
277
|
-
// shell instead, which ships built-in implementations of the common
|
|
278
|
-
// commands. dax executes commands asynchronously, but the task runtime is
|
|
279
|
-
// synchronous (tasks run during synthesis), so we drive dax from a
|
|
280
|
-
// synchronous child `node` process.
|
|
281
|
-
if (process.platform === "win32") {
|
|
282
|
-
const dax = require.resolve("dax");
|
|
283
|
-
const runner = `const { CommandBuilder } = require(${JSON.stringify(dax)}); new CommandBuilder().command(process.argv[1]).noThrow().spawn().then((r) => process.exit(r.code), (e) => { console.error(e?.stack ?? String(e)); process.exit(1); });`;
|
|
284
|
-
return (0, child_process_1.spawnSync)(process.execPath, ["-e", runner, options.command], {
|
|
285
|
-
...options,
|
|
286
|
-
cwd,
|
|
287
|
-
shell: false,
|
|
288
|
-
stdio: "inherit",
|
|
289
|
-
env,
|
|
290
|
-
...options.spawnOptions,
|
|
291
|
-
});
|
|
292
|
-
}
|
|
293
|
-
return (0, child_process_1.spawnSync)(options.command, {
|
|
294
|
-
...options,
|
|
295
|
-
cwd,
|
|
296
|
-
shell: true,
|
|
297
|
-
stdio: "inherit",
|
|
298
|
-
env,
|
|
299
|
-
...options.spawnOptions,
|
|
300
|
-
});
|
|
301
|
-
}
|
|
302
|
-
shellEval(options) {
|
|
303
|
-
return this.shell({
|
|
304
|
-
quiet: true,
|
|
305
|
-
...options,
|
|
306
|
-
spawnOptions: {
|
|
307
|
-
stdio: ["inherit", "pipe", "pipe"],
|
|
308
|
-
},
|
|
309
|
-
});
|
|
310
|
-
}
|
|
311
|
-
renderBuiltin(builtin) {
|
|
312
|
-
const moduleRoot = (0, path_1.dirname)(require.resolve("../package.json"));
|
|
313
|
-
const program = require.resolve((0, path_1.join)(moduleRoot, "lib", `${builtin}.task.js`));
|
|
314
|
-
return `"${process.execPath}" "${program}"`;
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFzay1ydW50aW1lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3Rhc2stcnVudGltZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUNBLGlEQUEwQztBQUMxQywyQkFBd0Q7QUFDeEQsK0JBQThDO0FBQzlDLDZCQUE2QjtBQUM3QiwrQkFBOEI7QUFDOUIsaUNBQXdDO0FBQ3hDLHFDQUFzQztBQUN0QyxxQ0FBcUM7QUFHckMsb0VBQW9FO0FBQ3BFLGlFQUFpRTtBQUNqRSxNQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBRXpELE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztBQUN4QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFDekIsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLFdBQVcsR0FBRyxDQUFDO0FBRTlDOztHQUVHO0FBQ0gsTUFBYSxXQUFXO0lBbUJ0QixZQUFZLE9BQWU7UUFDekIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFBLGNBQU8sRUFBQyxPQUFPLENBQUMsQ0FBQztRQUNoQyxNQUFNLFlBQVksR0FBRyxJQUFBLFdBQUksRUFBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUEsZUFBVSxFQUFDLFlBQVksQ0FBQztZQUN0QyxDQUFDLENBQUMsaUJBQWlCLENBQ2YsSUFBQSxpQkFBWSxFQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsRUFDbkMsU0FBUyxFQUNULFFBQVEsQ0FDVDtZQUNILENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLEtBQUs7UUFDZCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVEOztP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Q0FDOUMsQ0FBQztRQUNGLE9BQU8sSUFBSSxPQUFPLENBQUMsUUFBUSxNQUFNLE9BQU8sR0FBRyxDQUFDO0lBQzlDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgU3Bhd25PcHRpb25zIH0gZnJvbSBcImNoaWxkX3Byb2Nlc3NcIjtcbmltcG9ydCB7IHNwYXduU3luYyB9IGZyb20gXCJjaGlsZF9wcm9jZXNzXCI7XG5pbXBvcnQgeyBleGlzdHNTeW5jLCByZWFkRmlsZVN5bmMsIHN0YXRTeW5jIH0gZnJvbSBcImZzXCI7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSBcInBhdGhcIjtcbmltcG9ydCB7IGZvcm1hdCB9IGZyb20gXCJ1dGlsXCI7XG5pbXBvcnQgeyBncmF5LCB1bmRlcmxpbmUgfSBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IFBST0pFTl9ESVIgfSBmcm9tIFwiLi9jb21tb25cIjtcbmltcG9ydCAqIGFzIGxvZ2dpbmcgZnJvbSBcIi4vbG9nZ2luZ1wiO1xuaW1wb3J0IHR5cGUgeyBUYXNrc01hbmlmZXN0LCBUYXNrU3BlYywgVGFza1N0ZXAgfSBmcm9tIFwiLi90YXNrLW1vZGVsXCI7XG5cbi8vIGF2b2lkcyBhIChmYWxzZSBwb3NpdGl2ZSkgZXNidWlsZCB3YXJuaW5nIGFib3V0IGluY29ycmVjdCBpbXBvcnRzXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXJlcXVpcmUtaW1wb3J0c1xuY29uc3QgcGFyc2VDb25mbGljdEpTT04gPSByZXF1aXJlKFwicGFyc2UtY29uZmxpY3QtanNvblwiKTtcblxuY29uc3QgRU5WX1RSSU1fTEVOID0gMjA7XG5jb25zdCBBUkdTX01BUktFUiA9IFwiJEBcIjtcbmNvbnN0IFFVT1RFRF9BUkdTX01BUktFUiA9IGBcIiR7QVJHU19NQVJLRVJ9XCJgO1xuXG4vKipcbiAqIFRoZSBydW50aW1lIGNvbXBvbmVudCBvZiB0aGUgdGFza3MgZW5naW5lLlxuICovXG5leHBvcnQgY2xhc3MgVGFza1J1bnRpbWUge1xuICAvKipcbiAgICogVGhlIHByb2plY3QtcmVsYXRpdmUgcGF0aCBvZiB0aGUgdGFza3MgbWFuaWZlc3QgZmlsZS5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgTUFOSUZFU1RfRklMRSA9IHBhdGgucG9zaXguam9pbihcbiAgICBQUk9KRU5fRElSLFxuICAgIFwidGFza3MuanNvblwiLFxuICApO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGVudHMgb2YgdGFza3MuanNvblxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IG1hbmlmZXN0OiBUYXNrc01hbmlmZXN0O1xuXG4gIC8qKlxuICAgKiBUaGUgcm9vdCBkaXJlY3Rvcnkgb2YgdGhlIHByb2plY3QgYW5kIHRoZSBjd2QgZm9yIGV4ZWN1dGluZyB0YXNrcy5cbiAgICovXG4gIHB1YmxpYyByZWFkb25seSB3b3JrZGlyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iod29ya2Rpcjogc3RyaW5nKSB7XG4gICAgdGhpcy53b3JrZGlyID0gcmVzb2x2ZSh3b3JrZGlyKTtcbiAgICBjb25zdCBtYW5pZmVzdFBhdGggPSBqb2luKHRoaXMud29ya2RpciwgVGFza1J1bnRpbWUuTUFOSUZFU1RfRklMRSk7XG4gICAgdGhpcy5tYW5pZmVzdCA9IGV4aXN0c1N5bmMobWFuaWZlc3RQYXRoKVxuICAgICAgPyBwYXJzZUNvbmZsaWN0SlNPTihcbiAgICAgICAgICByZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCBcInV0Zi04XCIpLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBcInRoZWlyc1wiLFxuICAgICAgICApXG4gICAgICA6IHsgdGFza3M6IHt9IH07XG4gIH1cblxuICAvKipcbiAgICogVGhlIHRhc2tzIGluIHRoaXMgcHJvamVjdC5cbiAgICovXG4gIHB1YmxpYyBnZXQgdGFza3MoKTogVGFza1NwZWNbXSB7XG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy5tYW5pZmVzdC50YXNrcyA/PyB7fSk7XG4gIH1cblxuICAvKipcbiAgICogRmluZCBhIHRhc2sgYnkgbmFtZSwgb3IgYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLlxuICAgKi9cbiAgcHVibGljIHRyeUZpbmRUYXNrKG5hbWU6IHN0cmluZyk6IFRhc2tTcGVjIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoIXRoaXMubWFuaWZlc3QudGFza3MpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hbmlmZXN0LnRhc2tzW25hbWVdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgdGhlIHRhc2suXG4gICAqIEBwYXJhbSBuYW1lIFRoZSB0YXNrIG5hbWUuXG4gICAqL1xuICBwdWJsaWMgcnVuVGFzayhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcGFyZW50czogc3RyaW5nW10gPSBbXSxcbiAgICBhcmdzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+ID0gW10sXG4gICAgZW52OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApIHtcbiAgICBjb25zdCB0YXNrID0gdGhpcy50cnlGaW5kVGFzayhuYW1lKTtcbiAgICBpZiAoIXRhc2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgY2Fubm90IGZpbmQgY29tbWFuZCAke3Rhc2t9YCk7XG4gICAgfVxuXG4gICAgbmV3IFJ1blRhc2sodGhpcywgdGFzaywgcGFyZW50cywgYXJncywgZW52KTtcbiAgfVxufVxuXG5jbGFzcyBSdW5UYXNrIHtcbiAgcHJpdmF0ZSByZWFkb25seSBlbnY6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB8IHVuZGVmaW5lZCB9ID0ge307XG4gIHByaXZhdGUgcmVhZG9ubHkgcGFyZW50czogc3RyaW5nW107XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3b3JrZGlyOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSByZWFkb25seSBydW50aW1lOiBUYXNrUnVudGltZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHRhc2s6IFRhc2tTcGVjLFxuICAgIHBhcmVudHM6IHN0cmluZ1tdID0gW10sXG4gICAgYXJnczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiA9IFtdLFxuICAgIGVudlBhcmFtOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSA9IHt9LFxuICApIHtcbiAgICB0aGlzLndvcmtkaXIgPSB0YXNrLmN3ZCA/PyB0aGlzLnJ1bnRpbWUud29ya2RpcjtcblxuICAgIHRoaXMucGFyZW50cyA9IHBhcmVudHM7XG5cbiAgICBpZiAoIXRhc2suc3RlcHMgfHwgdGFzay5zdGVwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9nRGVidWcoZ3JheShcIk5vIGFjdGlvbnMgaGF2ZSBiZWVuIHNwZWNpZmllZCBmb3IgdGhpcyB0YXNrLlwiKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5lbnYgPSB0aGlzLnJlc29sdmVFbnZpcm9ubWVudChlbnZQYXJhbSwgcGFyZW50cyk7XG5cbiAgICBjb25zdCBlbnZsb2dzID0gW107XG4gICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5lbnYpKSB7XG4gICAgICBjb25zdCB2diA9IHYgPz8gXCJcIjtcbiAgICAgIGNvbnN0IHRyaW1tZWQgPVxuICAgICAgICB2di5sZW5ndGggPiBFTlZfVFJJTV9MRU4gPyB2di5zdWJzdHIoMCwgRU5WX1RSSU1fTEVOKSArIFwiLi4uXCIgOiB2djtcbiAgICAgIGVudmxvZ3MucHVzaChgJHtrfT0ke3RyaW1tZWR9YCk7XG4gICAgfVxuXG4gICAgaWYgKGVudmxvZ3MubGVuZ3RoKSB7XG4gICAgICB0aGlzLmxvZ0RlYnVnKGdyYXkoYCR7dW5kZXJsaW5lKFwiZW52XCIpfTogJHtlbnZsb2dzLmpvaW4oXCIgXCIpfWApKTtcbiAgICB9XG5cbiAgICAvLyBldmFsdWF0ZSBjb25kaXRpb25cbiAgICBpZiAoIXRoaXMuZXZhbENvbmRpdGlvbih0YXNrKSkge1xuICAgICAgdGhpcy5sb2coXCJjb25kaXRpb24gZXhpdGVkIHdpdGggbm9uLXplcm8gLSBza2lwcGluZ1wiKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyB2ZXJpZnkgd2UgcmVxdWlyZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSBkZWZpbmVkXG4gICAgY29uc3QgbWVyZ2VkID0geyAuLi5wcm9jZXNzLmVudiwgLi4udGhpcy5lbnYgfTtcbiAgICBjb25zdCBtaXNzaW5nID0gbmV3IEFycmF5PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdGFzay5yZXF1aXJlZEVudiA/PyBbXSkge1xuICAgICAgaWYgKCEobmFtZSBpbiBtZXJnZWQpKSB7XG4gICAgICAgIG1pc3NpbmcucHVzaChuYW1lKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBtaXNzaW5nIHJlcXVpcmVkIGVudmlyb25tZW50IHZhcmlhYmxlczogJHttaXNzaW5nLmpvaW4oXCIsXCIpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGZvciAoY29uc3Qgc3RlcCBvZiB0YXNrLnN0ZXBzKSB7XG4gICAgICAvLyBldmFsdWF0ZSBzdGVwIGNvbmRpdGlvblxuICAgICAgaWYgKCF0aGlzLmV2YWxDb25kaXRpb24oc3RlcCkpIHtcbiAgICAgICAgdGhpcy5sb2coXCJjb25kaXRpb24gZXhpdGVkIHdpdGggbm9uLXplcm8gLSBza2lwcGluZ1wiKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFyZ3NMaXN0OiBzdHJpbmdbXSA9IFtcbiAgICAgICAgLi4uKHN0ZXAuYXJncyB8fCBbXSksXG4gICAgICAgIC4uLihzdGVwLnJlY2VpdmVBcmdzID8gYXJncyA6IFtdKSxcbiAgICAgIF0ubWFwKChhKSA9PiBhLnRvU3RyaW5nKCkpO1xuXG4gICAgICBpZiAoc3RlcC5zYXkpIHtcbiAgICAgICAgbG9nZ2luZy5pbmZvKHRoaXMuZm10TG9nKHN0ZXAuc2F5KSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGVwLnNwYXduKSB7XG4gICAgICAgIHRoaXMucnVudGltZS5ydW5UYXNrKFxuICAgICAgICAgIHN0ZXAuc3Bhd24sXG4gICAgICAgICAgWy4uLnRoaXMucGFyZW50cywgdGhpcy50YXNrLm5hbWVdLFxuICAgICAgICAgIGFyZ3NMaXN0LFxuICAgICAgICAgIHN0ZXAuZW52LFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBleGVjcyA9IHN0ZXAuZXhlYyA/IFtzdGVwLmV4ZWNdIDogW107XG5cbiAgICAgIC8vIFBhcnNlIHN0ZXAtc3BlY2lmaWMgZW52aXJvbm1lbnQgdmFyaWFibGVzXG4gICAgICBjb25zdCBlbnYgPSB0aGlzLmV2YWxFbnZpcm9ubWVudChzdGVwLmVudiA/PyB7fSk7XG5cbiAgICAgIGlmIChzdGVwLmJ1aWx0aW4pIHtcbiAgICAgICAgZXhlY3MucHVzaCh0aGlzLnJlbmRlckJ1aWx0aW4oc3RlcC5idWlsdGluKSk7XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3QgZXhlYyBvZiBleGVjcykge1xuICAgICAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTtcblxuICAgICAgICBsZXQgY29tbWFuZCA9IGV4ZWM7XG5cbiAgICAgICAgaWYgKGNvbW1hbmQuaW5jbHVkZXMoUVVPVEVEX0FSR1NfTUFSS0VSKSkge1xuICAgICAgICAgIC8vIFBvb3JseSBpbWl0YXRlIGJhc2ggcXVvdGVkIHZhcmlhYmxlIGV4cGFuc2lvbi4gSWYgXCIkQFwiIGlzIGVuY291bnRlcmVkIGluIGJhc2gsIGVsZW1lbnRzIG9mIHRoZSBhcmcgYXJyYXlcbiAgICAgICAgICAvLyB0aGF0IGNvbnRhaW4gd2hpdGVzcGFjZSB3aWxsIGJlIHNpbmdsZSBxdW90ZWQgKCdhcmcnKS4gVGhpcyBwcmVzZXJ2ZXMgd2hpdGVzcGFjZSBpbiB0aGluZ3MgbGlrZSBmaWxlbmFtZXMuXG4gICAgICAgICAgLy8gSW1pdGF0ZSB0aGF0IGJlaGF2aW9yIGhlcmUgYnkgc2luZ2xlIHF1b3RpbmcgZXZlcnkgZWxlbWVudCBvZiB0aGUgYXJnIGFycmF5IHdoZW4gYSBxdW90ZWQgYXJnIG1hcmtlciAoXCIkQFwiKVxuICAgICAgICAgIC8vIGlzIGVuY291bnRlcmVkLlxuICAgICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnJlcGxhY2UoXG4gICAgICAgICAgICBRVU9URURfQVJHU19NQVJLRVIsXG4gICAgICAgICAgICBhcmdzTGlzdC5tYXAoKGFyZykgPT4gYCcke2FyZ30nYCkuam9pbihcIiBcIiksXG4gICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLmluY2x1ZGVzKEFSR1NfTUFSS0VSKSkge1xuICAgICAgICAgIGNvbW1hbmQgPSBjb21tYW5kLnJlcGxhY2UoQVJHU19NQVJLRVIsIGFyZ3NMaXN0LmpvaW4oXCIgXCIpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb21tYW5kID0gW2NvbW1hbmQsIC4uLmFyZ3NMaXN0XS5qb2luKFwiIFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGN3ZCA9IHN0ZXAuY3dkO1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuc2hlbGwoe1xuICAgICAgICAgICAgY29tbWFuZCxcbiAgICAgICAgICAgIGN3ZCxcbiAgICAgICAgICAgIGV4dHJhRW52OiBlbnYsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaGFzRXJyb3IgPSByZXN1bHQuc3RhdHVzICE9PSAwO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZXJyb3IgJ3NoeCcgd2lsbCB0aHJvd1xuICAgICAgICAgIGlmICgoZSBhcyBhbnkpPy5tZXNzYWdlPy5zdGFydHNXaXRoKFwibm9uLXplcm8gZXhpdCBjb2RlOlwiKSkge1xuICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChoYXNFcnJvcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBUYXNrIFwiJHtcbiAgICAgICAgICAgICAgdGhpcy5mdWxsbmFtZVxuICAgICAgICAgICAgfVwiIGZhaWxlZCB3aGVuIGV4ZWN1dGluZyBcIiR7Y29tbWFuZH1cIiAoY3dkOiAke3Jlc29sdmUoXG4gICAgICAgICAgICAgIGN3ZCA/PyB0aGlzLndvcmtkaXIsXG4gICAgICAgICAgICApfSlgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lcyBpZiBhIHRhc2sgc2hvdWxkIGJlIGV4ZWN1dGVkIGJhc2VkIG9uIFwiY29uZGl0aW9uXCIuXG4gICAqXG4gICAqIEByZXR1cm5zIHRydWUgaWYgdGhlIHRhc2sgc2hvdWxkIGJlIGV4ZWN1dGVkIG9yIGZhbHNlIGlmIHRoZSBjb25kaXRpb25cbiAgICogZXZhbHVhdGVzIHRvIGZhbHNlIChleGl0cyB3aXRoIG5vbi16ZXJvKSwgaW5kaWNhdGluZyB0aGF0IHRoZSB0YXNrIHNob3VsZFxuICAgKiBiZSBza2lwcGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBldmFsQ29uZGl0aW9uKHRhc2tPclN0ZXA6IFRhc2tTcGVjIHwgVGFza1N0ZXApIHtcbiAgICAvLyBubyBjb25kaXRpb24sIGNhcnJ5IG9uXG4gICAgaWYgKCF0YXNrT3JTdGVwLmNvbmRpdGlvbikge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdGhpcy5sb2coZ3JheShgJHt1bmRlcmxpbmUoXCJjb25kaXRpb25cIil9OiAke3Rhc2tPclN0ZXAuY29uZGl0aW9ufWApKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNoZWxsKHtcbiAgICAgIGNvbW1hbmQ6IHRhc2tPclN0ZXAuY29uZGl0aW9uLFxuICAgICAgbG9ncHJlZml4OiBcImNvbmRpdGlvbjogXCIsXG4gICAgICBxdWlldDogdHJ1ZSxcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LnN0YXR1cyA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXZhbHVhdGVzIGVudmlyb25tZW50IHZhcmlhYmxlcyBmcm9tIHNoZWxsIGNvbW1hbmRzIChlLmcuIGAkKHh4KWApXG4gICAqL1xuICBwcml2YXRlIGV2YWxFbnZpcm9ubWVudChlbnY6IHsgW25hbWU6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgY29uc3Qgb3V0cHV0OiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfCB1bmRlZmluZWQgfSA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52ID8/IHt9KSkge1xuICAgICAgaWYgKFN0cmluZyh2YWx1ZSkuc3RhcnRzV2l0aChcIiQoXCIpICYmIFN0cmluZyh2YWx1ZSkuZW5kc1dpdGgoXCIpXCIpKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gdmFsdWUuc3Vic3RyaW5nKDIsIHZhbHVlLmxlbmd0aCAtIDEpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLnNoZWxsRXZhbCh7IGNvbW1hbmQ6IHF1ZXJ5IH0pO1xuICAgICAgICBpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzdWx0LmVycm9yXG4gICAgICAgICAgICA/IHJlc3VsdC5lcnJvci5zdGFja1xuICAgICAgICAgICAgOiByZXN1bHQuc3RkZXJyPy50b1N0cmluZygpLnRyaW0oKSB8fFxuICAgICAgICAgICAgICByZXN1bHQuc3Rkb3V0Py50b1N0cmluZygpLnRyaW0oKSB8fFxuICAgICAgICAgICAgICBgY29tbWFuZCBleGl0ZWQgd2l0aCBjb2RlICR7cmVzdWx0LnN0YXR1c31gO1xuXG4gICAgICAgICAgbG9nZ2luZy53YXJuKFxuICAgICAgICAgICAgdGhpcy5mbXRMb2coXG4gICAgICAgICAgICAgIGAke3VuZGVybGluZShrZXkpfTogdW5hYmxlIHRvIGV2YWx1YXRlIFwiJHtxdWVyeX1cIi4gRW52aXJvbm1lbnQgdmFyaWFibGUgd2lsbCBiZSBza2lwcGVkLiBDaGVjayB0aGF0IHRoZSBjb21tYW5kIGV4aXN0cyBhbmQgcnVucyBzdWNjZXNzZnVsbHkuYCxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgKTtcbiAgICAgICAgICBsb2dnaW5nLndhcm4odGhpcy5mbXRMb2coYCR7dW5kZXJsaW5lKGtleSl9OiAke2Vycm9yfWApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXRwdXRba2V5XSA9IHJlc3VsdC5zdGRvdXQudG9TdHJpbmcoXCJ1dGYtOFwiKS50cmltKCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICAvKipcbiAgICogUmVuZGVycyB0aGUgcnVudGltZSBlbnZpcm9ubWVudCBmb3IgYSB0YXNrLiBOYW1lbHksIGl0IHN1cHBvcnRzIHRoaXMgc3ludGF4XG4gICAqIGAkKHh4KWAgZm9yIGFsbG93aW5nIGVudmlyb25tZW50IHRvIGJlIGV2YWx1YXRlZCBieSBleGVjdXRpbmcgYSBzaGVsbFxuICAgKiBjb21tYW5kIGFuZCBvYnRhaW5pbmcgaXRzIHJlc3VsdC5cbiAgICovXG4gIHByaXZhdGUgcmVzb2x2ZUVudmlyb25tZW50KFxuICAgIGVudlBhcmFtOiB7IFtuYW1lOiBzdHJpbmddOiBzdHJpbmcgfSxcbiAgICBwYXJlbnRzOiBzdHJpbmdbXSxcbiAgKSB7XG4gICAgbGV0IGVudiA9IHRoaXMucnVudGltZS5tYW5pZmVzdC5lbnYgPz8ge307XG5cbiAgICAvLyBhZGQgZW52IGZyb20gYWxsIHBhcmVudCB0YXNrcyBvbmUgYnkgb25lXG4gICAgZm9yIChjb25zdCBwYXJlbnQgb2YgcGFyZW50cykge1xuICAgICAgZW52ID0ge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIC4uLih0aGlzLnJ1bnRpbWUudHJ5RmluZFRhc2socGFyZW50KT8uZW52ID8/IHt9KSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gYXBwbHkgdGFzayBlbnZpcm9ubWVudCwgdGhlbiB0aGUgc3BlY2lmaWMgZW52IGxhc3RcbiAgICBlbnYgPSB7XG4gICAgICAuLi5lbnYsXG4gICAgICAuLi4odGhpcy50YXNrLmVudiA/PyB7fSksXG4gICAgICAuLi5lbnZQYXJhbSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXZhbEVudmlyb25tZW50KGVudiA/PyB7fSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgXCJmdWxsIG5hbWVcIiBvZiB0aGUgdGFzayB3aGljaCBpbmNsdWRlcyBhbGwgaXQncyBwYXJlbnQgdGFzayBuYW1lcyBjb25jYXRlbmF0ZWQgYnkgY2hldnJvbnMuXG4gICAqL1xuICBwcml2YXRlIGdldCBmdWxsbmFtZSgpIHtcbiAgICByZXR1cm4gWy4uLnRoaXMucGFyZW50cywgdGhpcy50YXNrLm5hbWVdLmpvaW4oXCIgwrsgXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2coLi4uYXJnczogYW55W10pIHtcbiAgICBsb2dnaW5nLnZlcmJvc2UodGhpcy5mbXRMb2coLi4uYXJncykpO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2dEZWJ1ZyguLi5hcmdzOiBhbnlbXSkge1xuICAgIGxvZ2dpbmcuZGVidWcodGhpcy5mbXRMb2coLi4uYXJncykpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbXRMb2coLi4uYXJnczogYW55W10pIHtcbiAgICByZXR1cm4gZm9ybWF0KGAke3VuZGVybGluZSh0aGlzLmZ1bGxuYW1lKX0gfGAsIC4uLmFyZ3MpO1xuICB9XG5cbiAgcHJpdmF0ZSBzaGVsbChvcHRpb25zOiBTaGVsbE9wdGlvbnMpIHtcbiAgICBjb25zdCBxdWlldCA9IG9wdGlvbnMucXVpZXQgPz8gZmFsc2U7XG4gICAgaWYgKCFxdWlldCkge1xuICAgICAgY29uc3QgbG9nID0gbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgICAgaWYgKG9wdGlvbnMubG9ncHJlZml4KSB7XG4gICAgICAgIGxvZy5wdXNoKG9wdGlvbnMubG9ncHJlZml4KTtcbiAgICAgIH1cblxuICAgICAgbG9nLnB1c2gob3B0aW9ucy5jb21tYW5kKTtcblxuICAgICAgaWYgKG9wdGlvbnMuY3dkKSB7XG4gICAgICAgIGxvZy5wdXNoKGAoY3dkOiAke29wdGlvbnMuY3dkfSlgKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5sb2cobG9nLmpvaW4oXCIgXCIpKTtcbiAgICB9XG5cbiAgICBjb25zdCBjd2QgPSBvcHRpb25zLmN3ZCA/PyB0aGlzLndvcmtkaXI7XG4gICAgaWYgKCFleGlzdHNTeW5jKGN3ZCkgfHwgIXN0YXRTeW5jKGN3ZCkuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgaW52YWxpZCB3b3JrZGlyIChjd2QpOiAke2N3ZH0gbXVzdCBiZSBhbiBleGlzdGluZyBkaXJlY3RvcnlgLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbnYgPSB7XG4gICAgICAuLi5wcm9jZXNzLmVudixcbiAgICAgIC4uLnRoaXMuZW52LFxuICAgICAgLi4ub3B0aW9ucy5leHRyYUVudixcbiAgICB9O1xuXG4gICAgLy8gT24gV2luZG93cyB0aGUgZGVmYXVsdCBzaGVsbCAoY21kLmV4ZSkgZG9lcyBub3QgdW5kZXJzdGFuZCB0aGUgUE9TSVgtc3R5bGVcbiAgICAvLyBjb21tYW5kcyBwcm9qZW4gdGFza3MgYXJlIHdyaXR0ZW4gaW4gKGBjYXRgLCBgY3BgLCBgbWtkaXIgLXBgLCBgcm0gLXJmYCxcbiAgICAvLyBgJiZgIGNoYWlucywgYCRWQVJgLCAuLi4pLiBSdW4gdGhlIGNvbW1hbmQgdGhyb3VnaCBkYXgncyBjcm9zcy1wbGF0Zm9ybVxuICAgIC8vIHNoZWxsIGluc3RlYWQsIHdoaWNoIHNoaXBzIGJ1aWx0LWluIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgY29tbW9uXG4gICAgLy8gY29tbWFuZHMuIGRheCBleGVjdXRlcyBjb21tYW5kcyBhc3luY2hyb25vdXNseSwgYnV0IHRoZSB0YXNrIHJ1bnRpbWUgaXNcbiAgICAvLyBzeW5jaHJvbm91cyAodGFza3MgcnVuIGR1cmluZyBzeW50aGVzaXMpLCBzbyB3ZSBkcml2ZSBkYXggZnJvbSBhXG4gICAgLy8gc3luY2hyb25vdXMgY2hpbGQgYG5vZGVgIHByb2Nlc3MuXG4gICAgaWYgKHByb2Nlc3MucGxhdGZvcm0gPT09IFwid2luMzJcIikge1xuICAgICAgY29uc3QgZGF4ID0gcmVxdWlyZS5yZXNvbHZlKFwiZGF4XCIpO1xuICAgICAgY29uc3QgcnVubmVyID0gYGNvbnN0IHsgQ29tbWFuZEJ1aWxkZXIgfSA9IHJlcXVpcmUoJHtKU09OLnN0cmluZ2lmeShcbiAgICAgICAgZGF4LFxuICAgICAgKX0pOyBuZXcgQ29tbWFuZEJ1aWxkZXIoKS5jb21tYW5kKHByb2Nlc3MuYXJndlsxXSkubm9UaHJvdygpLnNwYXduKCkudGhlbigocikgPT4gcHJvY2Vzcy5leGl0KHIuY29kZSksIChlKSA9PiB7IGNvbnNvbGUuZXJyb3IoZT8uc3RhY2sgPz8gU3RyaW5nKGUpKTsgcHJvY2Vzcy5leGl0KDEpOyB9KTtgO1xuXG4gICAgICByZXR1cm4gc3Bhd25TeW5jKHByb2Nlc3MuZXhlY1BhdGgsIFtcIi1lXCIsIHJ1bm5lciwgb3B0aW9ucy5jb21tYW5kXSwge1xuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICBjd2QsXG4gICAgICAgIHNoZWxsOiBmYWxzZSxcbiAgICAgICAgc3RkaW86IFwiaW5oZXJpdFwiLFxuICAgICAgICBlbnYsXG4gICAgICAgIC4uLm9wdGlvbnMuc3Bhd25PcHRpb25zLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNwYXduU3luYyhvcHRpb25zLmNvbW1hbmQsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICBjd2QsXG4gICAgICBzaGVsbDogdHJ1ZSxcbiAgICAgIHN0ZGlvOiBcImluaGVyaXRcIixcbiAgICAgIGVudixcbiAgICAgIC4uLm9wdGlvbnMuc3Bhd25PcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzaGVsbEV2YWwob3B0aW9uczogU2hlbGxPcHRpb25zKSB7XG4gICAgcmV0dXJuIHRoaXMuc2hlbGwoe1xuICAgICAgcXVpZXQ6IHRydWUsXG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgc3Bhd25PcHRpb25zOiB7XG4gICAgICAgIHN0ZGlvOiBbXCJpbmhlcml0XCIsIFwicGlwZVwiLCBcInBpcGVcIl0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW5kZXJCdWlsdGluKGJ1aWx0aW46IHN0cmluZykge1xuICAgIGNvbnN0IG1vZHVsZVJvb3QgPSBkaXJuYW1lKHJlcXVpcmUucmVzb2x2ZShcIi4uL3BhY2thZ2UuanNvblwiKSk7XG4gICAgY29uc3QgcHJvZ3JhbSA9IHJlcXVpcmUucmVzb2x2ZShcbiAgICAgIGpvaW4obW9kdWxlUm9vdCwgXCJsaWJcIiwgYCR7YnVpbHRpbn0udGFzay5qc2ApLFxuICAgICk7XG4gICAgcmV0dXJuIGBcIiR7cHJvY2Vzcy5leGVjUGF0aH1cIiBcIiR7cHJvZ3JhbX1cImA7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFNoZWxsT3B0aW9ucyB7XG4gIHJlYWRvbmx5IGNvbW1hbmQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEBkZWZhdWx0IC0gcHJvamVjdCBkaXJcbiAgICovXG4gIHJlYWRvbmx5IGN3ZD86IHN0cmluZztcbiAgcmVhZG9ubHkgbG9ncHJlZml4Pzogc3RyaW5nO1xuICByZWFkb25seSBzcGF3bk9wdGlvbnM/OiBTcGF3bk9wdGlvbnM7XG4gIC8qKiBAZGVmYXVsdCBmYWxzZSAqL1xuICByZWFkb25seSBxdWlldD86IGJvb2xlYW47XG4gIHJlYWRvbmx5IGV4dHJhRW52PzogeyBbbmFtZTogc3RyaW5nXTogc3RyaW5nIHwgdW5kZWZpbmVkIH07XG59XG4iXX0=
|
|
File without changes
|