cdk8s-cli 2.0.123 → 2.1.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/.projenrc.ts +15 -1
- package/lib/cli/cmds/synth.js +38 -11
- package/lib/config.d.ts +13 -0
- package/lib/config.js +4 -1
- package/lib/plugins/_manager.d.ts +80 -0
- package/lib/plugins/_manager.js +124 -0
- package/lib/plugins/index.d.ts +1 -0
- package/lib/plugins/index.js +6 -0
- package/lib/plugins/validation.d.ts +233 -0
- package/lib/plugins/validation.js +242 -0
- package/lib/util.d.ts +19 -2
- package/lib/util.js +69 -13
- package/package.json +15 -11
package/.projenrc.ts
CHANGED
|
@@ -14,6 +14,9 @@ const project = new typescript.TypeScriptProject({
|
|
|
14
14
|
authorUrl: 'https://aws.amazon.com',
|
|
15
15
|
minNodeVersion: '14.17.0',
|
|
16
16
|
|
|
17
|
+
// no need, we are configuring explicit exports.
|
|
18
|
+
entrypoint: '',
|
|
19
|
+
|
|
17
20
|
keywords: [
|
|
18
21
|
'k8s',
|
|
19
22
|
'cdk8s',
|
|
@@ -53,11 +56,14 @@ const project = new typescript.TypeScriptProject({
|
|
|
53
56
|
'json2jsii',
|
|
54
57
|
'colors',
|
|
55
58
|
'ajv',
|
|
59
|
+
'table',
|
|
60
|
+
'semver',
|
|
56
61
|
],
|
|
57
62
|
devDeps: [
|
|
58
63
|
'@cdk8s/projen-common',
|
|
59
64
|
'@types/fs-extra@^8',
|
|
60
65
|
'@types/json-schema',
|
|
66
|
+
'@types/semver',
|
|
61
67
|
'glob',
|
|
62
68
|
'@types/glob',
|
|
63
69
|
'typescript-json-schema',
|
|
@@ -80,6 +86,14 @@ const project = new typescript.TypeScriptProject({
|
|
|
80
86
|
},
|
|
81
87
|
});
|
|
82
88
|
|
|
89
|
+
//
|
|
90
|
+
// see https://nodejs.org/api/packages.html#exports
|
|
91
|
+
project.addFields({
|
|
92
|
+
exports: {
|
|
93
|
+
'./plugins': './lib/plugins/index.js',
|
|
94
|
+
},
|
|
95
|
+
});
|
|
96
|
+
|
|
83
97
|
// ignore integration tests since they need to executed after packaging
|
|
84
98
|
// and are defined in a separate tasks.
|
|
85
99
|
project.jest?.addIgnorePattern('/test/integ/');
|
|
@@ -91,7 +105,7 @@ new Cdk8sCommon(project);
|
|
|
91
105
|
// add @types/node as a regular dependency since it's needed to during "import"
|
|
92
106
|
// to compile the generated jsii code.
|
|
93
107
|
project.deps.removeDependency('@types/node', DependencyType.BUILD);
|
|
94
|
-
project.deps.addDependency('@types/node@^
|
|
108
|
+
project.deps.addDependency('@types/node@^14', DependencyType.RUNTIME);
|
|
95
109
|
|
|
96
110
|
const schemas = project.addTask('schemas');
|
|
97
111
|
schemas.exec('ts-node scripts/crd.schema.ts');
|
package/lib/cli/cmds/synth.js
CHANGED
|
@@ -23,9 +23,10 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
const
|
|
27
|
-
const
|
|
26
|
+
const fs = __importStar(require("fs"));
|
|
27
|
+
const yaml = __importStar(require("yaml"));
|
|
28
28
|
const config_1 = require("../../config");
|
|
29
|
+
const _manager_1 = require("../../plugins/_manager");
|
|
29
30
|
const util_1 = require("../../util");
|
|
30
31
|
const config = (0, config_1.readConfigSync)();
|
|
31
32
|
class Command {
|
|
@@ -36,29 +37,55 @@ class Command {
|
|
|
36
37
|
this.builder = (args) => args
|
|
37
38
|
.option('app', { default: config.app, required: true, desc: 'Command to use in order to execute cdk8s app', alias: 'a' })
|
|
38
39
|
.option('output', { default: config.output, required: false, desc: 'Output directory', alias: 'o' })
|
|
39
|
-
.option('stdout', { type: 'boolean', required: false, desc: 'Write synthesized manifests to STDOUT instead of the output directory', alias: 'p' })
|
|
40
|
+
.option('stdout', { type: 'boolean', required: false, desc: 'Write synthesized manifests to STDOUT instead of the output directory', alias: 'p' })
|
|
41
|
+
.option('plugins-dir', { default: config.pluginsDirectory, required: false, desc: 'Directory to store cdk8s plugins.' })
|
|
42
|
+
.option('validate', { type: 'boolean', default: true, required: false, desc: 'Apply validation plugins on the resulting manifests (use --no-validate to disable)' })
|
|
43
|
+
.option('validation-reports-output-file', { required: false, desc: 'File to write a JSON representation of the validation reports to' });
|
|
40
44
|
}
|
|
45
|
+
;
|
|
41
46
|
async handler(argv) {
|
|
42
47
|
const command = argv.app;
|
|
43
48
|
const outdir = argv.output;
|
|
44
49
|
const stdout = argv.stdout;
|
|
45
|
-
|
|
50
|
+
const validate = argv.validate;
|
|
51
|
+
const pluginsDir = argv.pluginsDir;
|
|
52
|
+
const reportFile = argv.validationReportsOutputFile;
|
|
53
|
+
if (outdir && outdir !== config.output && stdout) {
|
|
46
54
|
throw new Error('\'--output\' and \'--stdout\' are mutually exclusive. Please only use one.');
|
|
47
55
|
}
|
|
48
|
-
|
|
56
|
+
if (outdir) {
|
|
57
|
+
fs.rmSync(outdir, { recursive: true, force: true });
|
|
58
|
+
}
|
|
59
|
+
const validations = validate ? await fetchValidations() : undefined;
|
|
49
60
|
if (stdout) {
|
|
50
61
|
await (0, util_1.mkdtemp)(async (tempDir) => {
|
|
51
|
-
await (0, util_1.synthApp)(command, tempDir);
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
62
|
+
const app = await (0, util_1.synthApp)(command, tempDir, stdout, validate);
|
|
63
|
+
for (const f of app.manifests) {
|
|
64
|
+
fs.createReadStream(f).pipe(process.stdout);
|
|
65
|
+
}
|
|
66
|
+
if (validations) {
|
|
67
|
+
const pluginManager = new _manager_1.PluginManager(pluginsDir);
|
|
68
|
+
await (0, util_1.validateApp)(app, stdout, validations, pluginManager, reportFile);
|
|
55
69
|
}
|
|
56
70
|
});
|
|
57
71
|
}
|
|
58
72
|
else {
|
|
59
|
-
await (0, util_1.synthApp)(command, outdir);
|
|
73
|
+
const manifests = await (0, util_1.synthApp)(command, outdir, stdout, validate);
|
|
74
|
+
if (validations) {
|
|
75
|
+
const pluginManager = new _manager_1.PluginManager(pluginsDir);
|
|
76
|
+
await (0, util_1.validateApp)(manifests, stdout, validations, pluginManager, reportFile);
|
|
77
|
+
}
|
|
60
78
|
}
|
|
61
79
|
}
|
|
62
80
|
}
|
|
81
|
+
async function fetchValidations() {
|
|
82
|
+
if (typeof (config.validations) === 'string') {
|
|
83
|
+
const content = await (0, util_1.download)(config.validations);
|
|
84
|
+
return yaml.parse(content);
|
|
85
|
+
}
|
|
86
|
+
else {
|
|
87
|
+
return config.validations;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
63
90
|
module.exports = new Command();
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ludGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NtZHMvc3ludGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFFN0IseUNBQWdFO0FBQ2hFLHFEQUF1RDtBQUN2RCxxQ0FBc0U7QUFFdEUsTUFBTSxNQUFNLEdBQUcsSUFBQSx1QkFBYyxHQUFFLENBQUM7QUFFaEMsTUFBTSxPQUFPO0lBQWI7UUFDa0IsWUFBTyxHQUFHLE9BQU8sQ0FBQztRQUNsQixhQUFRLEdBQUcsOERBQThELENBQUM7UUFDMUUsWUFBTyxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFekIsWUFBTyxHQUFHLENBQUMsSUFBZ0IsRUFBRSxFQUFFLENBQUMsSUFBSTthQUNqRCxNQUFNLENBQUMsS0FBSyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsOENBQThDLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO2FBQ3hILE1BQU0sQ0FBQyxRQUFRLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUM7YUFDbkcsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsdUVBQXVFLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxDQUFDO2FBQ2pKLE1BQU0sQ0FBQyxhQUFhLEVBQUUsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLG1DQUFtQyxFQUFFLENBQUM7YUFDdkgsTUFBTSxD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QUdELE1BQU0sQ0FBQyxPQUFPLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIHlhbWwgZnJvbSAneWFtbCc7XG5pbXBvcnQgKiBhcyB5YXJncyBmcm9tICd5YXJncyc7XG5pbXBvcnQgeyByZWFkQ29uZmlnU3luYywgVmFsaWRhdGlvbkNvbmZpZyB9IGZyb20gJy4uLy4uL2NvbmZpZyc7XG5pbXBvcnQgeyBQbHVnaW5NYW5hZ2VyIH0gZnJvbSAnLi4vLi4vcGx1Z2lucy9fbWFuYWdlcic7XG5pbXBvcnQgeyBzeW50aEFwcCwgbWtkdGVtcCwgZG93bmxvYWQsIHZhbGlkYXRlQXBwIH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmNvbnN0IGNvbmZpZyA9IHJlYWRDb25maWdTeW5jKCk7XG5cbmNsYXNzIENvbW1hbmQgaW1wbGVtZW50cyB5YXJncy5Db21tYW5kTW9kdWxlIHtcbiAgcHVibGljIHJlYWRvbmx5IGNvbW1hbmQgPSAnc3ludGgnO1xuICBwdWJsaWMgcmVhZG9ubHkgZGVzY3JpYmUgPSAnU3ludGhlc2l6ZXMgS3ViZXJuZXRlcyBtYW5pZmVzdHMgZm9yIGFsbCBjaGFydHMgaW4geW91ciBhcHAuJztcbiAgcHVibGljIHJlYWRvbmx5IGFsaWFzZXMgPSBbJ3N5bnRoZXNpemUnXTtcblxuICBwdWJsaWMgcmVhZG9ubHkgYnVpbGRlciA9IChhcmdzOiB5YXJncy5Bcmd2KSA9PiBhcmdzXG4gICAgLm9wdGlvbignYXBwJywgeyBkZWZhdWx0OiBjb25maWcuYXBwLCByZXF1aXJlZDogdHJ1ZSwgZGVzYzogJ0NvbW1hbmQgdG8gdXNlIGluIG9yZGVyIHRvIGV4ZWN1dGUgY2RrOHMgYXBwJywgYWxpYXM6ICdhJyB9KVxuICAgIC5vcHRpb24oJ291dHB1dCcsIHsgZGVmYXVsdDogY29uZmlnLm91dHB1dCwgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjOiAnT3V0cHV0IGRpcmVjdG9yeScsIGFsaWFzOiAnbycgfSlcbiAgICAub3B0aW9uKCdzdGRvdXQnLCB7IHR5cGU6ICdib29sZWFuJywgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjOiAnV3JpdGUgc3ludGhlc2l6ZWQgbWFuaWZlc3RzIHRvIFNURE9VVCBpbnN0ZWFkIG9mIHRoZSBvdXRwdXQgZGlyZWN0b3J5JywgYWxpYXM6ICdwJyB9KVxuICAgIC5vcHRpb24oJ3BsdWdpbnMtZGlyJywgeyBkZWZhdWx0OiBjb25maWcucGx1Z2luc0RpcmVjdG9yeSwgcmVxdWlyZWQ6IGZhbHNlLCBkZXNjOiAnRGlyZWN0b3J5IHRvIHN0b3JlIGNkazhzIHBsdWdpbnMuJyB9KVxuICAgIC5vcHRpb24oJ3ZhbGlkYXRlJywgeyB0eXBlOiAnYm9vbGVhbicsIGRlZmF1bHQ6IHRydWUsIHJlcXVpcmVkOiBmYWxzZSwgZGVzYzogJ0FwcGx5IHZhbGlkYXRpb24gcGx1Z2lucyBvbiB0aGUgcmVzdWx0aW5nIG1hbmlmZXN0cyAodXNlIC0tbm8tdmFsaWRhdGUgdG8gZGlzYWJsZSknIH0pXG4gICAgLm9wdGlvbigndmFsaWRhdGlvbi1yZXBvcnRzLW91dHB1dC1maWxlJywgeyByZXF1aXJlZDogZmFsc2UsIGRlc2M6ICdGaWxlIHRvIHdyaXRlIGEgSlNPTiByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsaWRhdGlvbiByZXBvcnRzIHRvJyB9KTtcbiAgO1xuXG4gIHB1YmxpYyBhc3luYyBoYW5kbGVyKGFyZ3Y6IGFueSkge1xuXG4gICAgY29uc3QgY29tbWFuZCA9IGFyZ3YuYXBwO1xuICAgIGNvbnN0IG91dGRpciA9IGFyZ3Yub3V0cHV0O1xuICAgIGNvbnN0IHN0ZG91dCA9IGFyZ3Yuc3Rkb3V0O1xuICAgIGNvbnN0IHZhbGlkYXRlID0gYXJndi52YWxpZGF0ZTtcbiAgICBjb25zdCBwbHVnaW5zRGlyID0gYXJndi5wbHVnaW5zRGlyO1xuICAgIGNvbnN0IHJlcG9ydEZpbGUgPSBhcmd2LnZhbGlkYXRpb25SZXBvcnRzT3V0cHV0RmlsZTtcblxuICAgIGlmIChvdXRkaXIgJiYgb3V0ZGlyICE9PSBjb25maWcub3V0cHV0ICYmIHN0ZG91dCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdcXCctLW91dHB1dFxcJyBhbmQgXFwnLS1zdGRvdXRcXCcgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZS4gUGxlYXNlIG9ubHkgdXNlIG9uZS4nKTtcbiAgICB9XG5cbiAgICBpZiAob3V0ZGlyKSB7XG4gICAgICBmcy5ybVN5bmMob3V0ZGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG4gICAgfVxuXG4gICAgY29uc3QgdmFsaWRhdGlvbnMgPSB2YWxpZGF0ZSA/IGF3YWl0IGZldGNoVmFsaWRhdGlvbnMoKSA6IHVuZGVmaW5lZDtcblxuICAgIGlmIChzdGRvdXQpIHtcbiAgICAgIGF3YWl0IG1rZHRlbXAoYXN5bmMgdGVtcERpciA9PiB7XG4gICAgICAgIGNvbnN0IGFwcCA9IGF3YWl0IHN5bnRoQXBwKGNvbW1hbmQsIHRlbXBEaXIsIHN0ZG91dCwgdmFsaWRhdGUpO1xuICAgICAgICBmb3IgKGNvbnN0IGYgb2YgYXBwLm1hbmlmZXN0cykge1xuICAgICAgICAgIGZzLmNyZWF0ZVJlYWRTdHJlYW0oZikucGlwZShwcm9jZXNzLnN0ZG91dCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHZhbGlkYXRpb25zKSB7XG4gICAgICAgICAgY29uc3QgcGx1Z2luTWFuYWdlciA9IG5ldyBQbHVnaW5NYW5hZ2VyKHBsdWdpbnNEaXIpO1xuICAgICAgICAgIGF3YWl0IHZhbGlkYXRlQXBwKGFwcCwgc3Rkb3V0LCB2YWxpZGF0aW9ucywgcGx1Z2luTWFuYWdlciwgcmVwb3J0RmlsZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtYW5pZmVzdHMgPSBhd2FpdCBzeW50aEFwcChjb21tYW5kLCBvdXRkaXIsIHN0ZG91dCwgdmFsaWRhdGUpO1xuICAgICAgaWYgKHZhbGlkYXRpb25zKSB7XG4gICAgICAgIGNvbnN0IHBsdWdpbk1hbmFnZXIgPSBuZXcgUGx1Z2luTWFuYWdlcihwbHVnaW5zRGlyKTtcbiAgICAgICAgYXdhaXQgdmFsaWRhdGVBcHAobWFuaWZlc3RzLCBzdGRvdXQsIHZhbGlkYXRpb25zLCBwbHVnaW5NYW5hZ2VyLCByZXBvcnRGaWxlKTtcbiAgICAgIH1cbiAgICB9XG5cblxuICB9XG5cbn1cblxuYXN5bmMgZnVuY3Rpb24gZmV0Y2hWYWxpZGF0aW9ucygpOiBQcm9taXNlPFZhbGlkYXRpb25Db25maWdbXSB8IHVuZGVmaW5lZD4ge1xuICBpZiAodHlwZW9mKGNvbmZpZy52YWxpZGF0aW9ucykgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgY29udGVudCA9IGF3YWl0IGRvd25sb2FkKGNvbmZpZy52YWxpZGF0aW9ucyk7XG4gICAgcmV0dXJuIHlhbWwucGFyc2UoY29udGVudCkgYXMgVmFsaWRhdGlvbkNvbmZpZ1tdO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBjb25maWcudmFsaWRhdGlvbnM7XG4gIH1cbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBDb21tYW5kKCk7XG4iXX0=
|
package/lib/config.d.ts
CHANGED
|
@@ -3,10 +3,23 @@ export interface ImportSpec {
|
|
|
3
3
|
readonly moduleNamePrefix?: string;
|
|
4
4
|
readonly source: string;
|
|
5
5
|
}
|
|
6
|
+
export interface ValidationConfig {
|
|
7
|
+
readonly package: string;
|
|
8
|
+
readonly version: string;
|
|
9
|
+
readonly class: string;
|
|
10
|
+
readonly installEnv?: {
|
|
11
|
+
[key: string]: any;
|
|
12
|
+
};
|
|
13
|
+
readonly properties?: {
|
|
14
|
+
[key: string]: any;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
6
17
|
export interface Config {
|
|
7
18
|
readonly app?: string;
|
|
8
19
|
readonly language?: Language;
|
|
9
20
|
readonly output?: string;
|
|
10
21
|
readonly imports?: string[];
|
|
22
|
+
readonly pluginsDirectory?: string;
|
|
23
|
+
readonly validations?: string | ValidationConfig[];
|
|
11
24
|
}
|
|
12
25
|
export declare function readConfigSync(): Config;
|
package/lib/config.js
CHANGED
|
@@ -24,11 +24,14 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
26
|
exports.readConfigSync = void 0;
|
|
27
|
+
const os = __importStar(require("os"));
|
|
28
|
+
const path = __importStar(require("path"));
|
|
27
29
|
const fs = __importStar(require("fs-extra"));
|
|
28
30
|
const yaml = __importStar(require("yaml"));
|
|
29
31
|
const CONFIG_FILE = 'cdk8s.yaml';
|
|
30
32
|
const DEFAULTS = {
|
|
31
33
|
output: 'dist',
|
|
34
|
+
pluginsDirectory: path.join(os.homedir(), '.cdk8s', 'plugins'),
|
|
32
35
|
};
|
|
33
36
|
function readConfigSync() {
|
|
34
37
|
let config = DEFAULTS;
|
|
@@ -41,4 +44,4 @@ function readConfigSync() {
|
|
|
41
44
|
return config;
|
|
42
45
|
}
|
|
43
46
|
exports.readConfigSync = readConfigSync;
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
47
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsNkNBQStCO0FBQy9CLDJDQUE2QjtBQUc3QixNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUM7QUF5QmpDLE1BQU0sUUFBUSxHQUFXO0lBQ3ZCLE1BQU0sRUFBRSxNQUFNO0lBQ2QsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQztDQUMvRCxDQUFDO0FBRUYsU0FBZ0IsY0FBYztJQUM1QixJQUFJLE1BQU0sR0FBVyxRQUFRLENBQUM7SUFDOUIsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxFQUFFO1FBQzlCLE1BQU0sR0FBRztZQUNQLEdBQUcsTUFBTTtZQUNULEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxPQUFPLENBQUMsQ0FBQztTQUNyRCxDQUFDO0tBQ0g7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBVEQsd0NBU0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICd5YW1sJztcbmltcG9ydCB7IExhbmd1YWdlIH0gZnJvbSAnLi9pbXBvcnQvYmFzZSc7XG5cbmNvbnN0IENPTkZJR19GSUxFID0gJ2NkazhzLnlhbWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEltcG9ydFNwZWMge1xuICByZWFkb25seSBtb2R1bGVOYW1lUHJlZml4Pzogc3RyaW5nO1xuICByZWFkb25seSBzb3VyY2U6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uQ29uZmlnIHtcblxuICByZWFkb25seSBwYWNrYWdlOiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZztcbiAgcmVhZG9ubHkgY2xhc3M6IHN0cmluZztcbiAgcmVhZG9ubHkgaW5zdGFsbEVudj86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG4gIHJlYWRvbmx5IHByb3BlcnRpZXM/OiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbmZpZyB7XG4gIHJlYWRvbmx5IGFwcD86IHN0cmluZztcbiAgcmVhZG9ubHkgbGFuZ3VhZ2U/OiBMYW5ndWFnZTtcbiAgcmVhZG9ubHkgb3V0cHV0Pzogc3RyaW5nO1xuICByZWFkb25seSBpbXBvcnRzPzogc3RyaW5nW107XG4gIHJlYWRvbmx5IHBsdWdpbnNEaXJlY3Rvcnk/OiBzdHJpbmc7XG4gIHJlYWRvbmx5IHZhbGlkYXRpb25zPzogc3RyaW5nIHwgVmFsaWRhdGlvbkNvbmZpZ1tdO1xufVxuXG5jb25zdCBERUZBVUxUUzogQ29uZmlnID0ge1xuICBvdXRwdXQ6ICdkaXN0JyxcbiAgcGx1Z2luc0RpcmVjdG9yeTogcGF0aC5qb2luKG9zLmhvbWVkaXIoKSwgJy5jZGs4cycsICdwbHVnaW5zJyksXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvbmZpZ1N5bmMoKTogQ29uZmlnIHtcbiAgbGV0IGNvbmZpZzogQ29uZmlnID0gREVGQVVMVFM7XG4gIGlmIChmcy5leGlzdHNTeW5jKENPTkZJR19GSUxFKSkge1xuICAgIGNvbmZpZyA9IHtcbiAgICAgIC4uLmNvbmZpZyxcbiAgICAgIC4uLnlhbWwucGFyc2UoZnMucmVhZEZpbGVTeW5jKENPTkZJR19GSUxFLCAndXRmLTgnKSksXG4gICAgfTtcbiAgfVxuICByZXR1cm4gY29uZmlnO1xufSJdfQ==
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/**
|
|
3
|
+
* Information about a loaded plugin.
|
|
4
|
+
*/
|
|
5
|
+
export interface Plugin {
|
|
6
|
+
/**
|
|
7
|
+
* The instance of the plugin class.
|
|
8
|
+
*/
|
|
9
|
+
readonly instance: unknown;
|
|
10
|
+
/**
|
|
11
|
+
* The plugin class name.
|
|
12
|
+
*/
|
|
13
|
+
readonly class: string;
|
|
14
|
+
/**
|
|
15
|
+
* The plugin package.
|
|
16
|
+
*/
|
|
17
|
+
readonly package: Package;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Information about a plugin package.
|
|
21
|
+
*/
|
|
22
|
+
export interface Package {
|
|
23
|
+
/**
|
|
24
|
+
* The plugin module.
|
|
25
|
+
*/
|
|
26
|
+
readonly module: ReturnType<NodeRequire>;
|
|
27
|
+
/**
|
|
28
|
+
* The npm package of the plugin.
|
|
29
|
+
*/
|
|
30
|
+
readonly pkg: string;
|
|
31
|
+
/**
|
|
32
|
+
* The version of the plugin.
|
|
33
|
+
*/
|
|
34
|
+
readonly version: string;
|
|
35
|
+
/**
|
|
36
|
+
* The path of the plugin on the local system (after its installed).
|
|
37
|
+
*/
|
|
38
|
+
readonly path: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Options for loading a plugin.
|
|
42
|
+
*/
|
|
43
|
+
export interface PluginManagerLoadOptions {
|
|
44
|
+
/**
|
|
45
|
+
* The plugin package name.
|
|
46
|
+
*/
|
|
47
|
+
readonly pkg: string;
|
|
48
|
+
/**
|
|
49
|
+
* The plugin package version.
|
|
50
|
+
*/
|
|
51
|
+
readonly version: string;
|
|
52
|
+
/**
|
|
53
|
+
* The plugin package class.
|
|
54
|
+
*/
|
|
55
|
+
readonly class: string;
|
|
56
|
+
/**
|
|
57
|
+
* Installation environment (passed on to npm install)
|
|
58
|
+
*/
|
|
59
|
+
readonly installEnv?: {
|
|
60
|
+
[key: string]: any;
|
|
61
|
+
};
|
|
62
|
+
/**
|
|
63
|
+
* Plugin instantiation properties.
|
|
64
|
+
*/
|
|
65
|
+
readonly properties?: {
|
|
66
|
+
[key: string]: any;
|
|
67
|
+
};
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* A `PluginManager` is responsible for loading (and installing) plugins.
|
|
71
|
+
*/
|
|
72
|
+
export declare class PluginManager {
|
|
73
|
+
private readonly dir;
|
|
74
|
+
constructor(dir: string);
|
|
75
|
+
load(options: PluginManagerLoadOptions): Plugin;
|
|
76
|
+
private loadPackage;
|
|
77
|
+
private installPackage;
|
|
78
|
+
private require;
|
|
79
|
+
private pluginDir;
|
|
80
|
+
}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.PluginManager = void 0;
|
|
27
|
+
const child = __importStar(require("child_process"));
|
|
28
|
+
const path = __importStar(require("path"));
|
|
29
|
+
const url = __importStar(require("url"));
|
|
30
|
+
const fs = __importStar(require("fs-extra"));
|
|
31
|
+
const semver = __importStar(require("semver"));
|
|
32
|
+
const MODULE_NOT_FOUND_ERROR_CODE = 'MODULE_NOT_FOUND'; // TODO is there a known constant we can use here?
|
|
33
|
+
/**
|
|
34
|
+
* A `PluginManager` is responsible for loading (and installing) plugins.
|
|
35
|
+
*/
|
|
36
|
+
class PluginManager {
|
|
37
|
+
constructor(dir) {
|
|
38
|
+
this.dir = dir;
|
|
39
|
+
}
|
|
40
|
+
load(options) {
|
|
41
|
+
var _a, _b;
|
|
42
|
+
const pkg = this.loadPackage(options.pkg, options.version, (_a = options.installEnv) !== null && _a !== void 0 ? _a : {});
|
|
43
|
+
const clazz = pkg.module[options.class];
|
|
44
|
+
if (!clazz) {
|
|
45
|
+
throw new Error(`Unable to locate class '${options.class}' in package '${options.pkg}@${options.version}'. Are you sure you exported it?`);
|
|
46
|
+
}
|
|
47
|
+
return { instance: new clazz((_b = options.properties) !== null && _b !== void 0 ? _b : {}), class: options.class, package: pkg };
|
|
48
|
+
}
|
|
49
|
+
loadPackage(pkg, version, installEnv) {
|
|
50
|
+
if (isRange(version)) {
|
|
51
|
+
// we forbid version ranges because it might give the false impression we will be installing
|
|
52
|
+
// the latest version (which we will not because it would mean contacting NPM on every synth)
|
|
53
|
+
throw new Error(`Unsupported version spec for package ${pkg}: ${version}. Cannot be a range.`);
|
|
54
|
+
}
|
|
55
|
+
const proto = url.parse(pkg).protocol;
|
|
56
|
+
if (proto) {
|
|
57
|
+
// urls are not supported because they don't provide a name with which we can 'require' the module.
|
|
58
|
+
// if needed, we can make the loader smarter and enable this, but not for now.
|
|
59
|
+
throw new Error(`Unsupported package reference: ${pkg}. Can either be an NPM package name, or a local path to a directory`);
|
|
60
|
+
}
|
|
61
|
+
const local = path.isAbsolute(pkg)
|
|
62
|
+
// assume relative paths start with '.' because otherise they
|
|
63
|
+
// are easily confused with npm package names.
|
|
64
|
+
|| pkg.startsWith(`.${path.sep}`);
|
|
65
|
+
// local plugins are loaded directly, npm packages are loaded
|
|
66
|
+
// from the plugins directory.
|
|
67
|
+
const modulePath = local ? path.resolve(process.cwd(), pkg) : this.pluginDir(pkg, version);
|
|
68
|
+
const pluginName = local ? modulePath : pkg;
|
|
69
|
+
try {
|
|
70
|
+
return this.require(modulePath, version, pluginName);
|
|
71
|
+
}
|
|
72
|
+
catch (e) {
|
|
73
|
+
if (![MODULE_NOT_FOUND_ERROR_CODE].includes(e.code)) {
|
|
74
|
+
// some unexpected error
|
|
75
|
+
throw e;
|
|
76
|
+
}
|
|
77
|
+
if (local) {
|
|
78
|
+
// if a local plugin is missing, nothing we can do about it
|
|
79
|
+
throw e;
|
|
80
|
+
}
|
|
81
|
+
// otherwise, we install from npm and re-require.
|
|
82
|
+
this.installPackage(pkg, version, installEnv);
|
|
83
|
+
return this.require(modulePath, version, pluginName);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
installPackage(pkg, version, env) {
|
|
87
|
+
const pluginDir = path.join(this.dir, pkg, version);
|
|
88
|
+
fs.mkdirpSync(pluginDir);
|
|
89
|
+
const command = [
|
|
90
|
+
'npm',
|
|
91
|
+
'install', `${pkg}@${version}`,
|
|
92
|
+
'--no-save',
|
|
93
|
+
'--prefix', pluginDir,
|
|
94
|
+
].join(' ');
|
|
95
|
+
const finalEnv = { ...process.env };
|
|
96
|
+
for (const [key, value] of Object.entries(env)) {
|
|
97
|
+
finalEnv[key] = typeof value === 'string' ? key : JSON.stringify(value);
|
|
98
|
+
}
|
|
99
|
+
console.log(`Installing validation plugin: ${pkg}@${version} (this may take a while the first time around)`);
|
|
100
|
+
child.execSync(command, { stdio: ['ignore', 'pipe', 'pipe'], env: finalEnv });
|
|
101
|
+
}
|
|
102
|
+
require(spec, version, pluginName) {
|
|
103
|
+
const modulePath = require.resolve(spec);
|
|
104
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
105
|
+
const module = require(modulePath);
|
|
106
|
+
return { version, pkg: pluginName !== null && pluginName !== void 0 ? pluginName : spec, path: modulePath, module };
|
|
107
|
+
}
|
|
108
|
+
pluginDir(pkg, version) {
|
|
109
|
+
return path.join(this.dir, pkg, version, 'node_modules', pkg);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
exports.PluginManager = PluginManager;
|
|
113
|
+
/**
|
|
114
|
+
* Checks if a given version represents a range, or a pinned version.
|
|
115
|
+
* For example:
|
|
116
|
+
*
|
|
117
|
+
* - '1.x expands to '>=1.0.0 <2.0.0-0'
|
|
118
|
+
* - `~1.2' expands to '>=1.2.0 <1.3.0-0'
|
|
119
|
+
* - '1.2.3' expands to '1.2.3'
|
|
120
|
+
*/
|
|
121
|
+
function isRange(version) {
|
|
122
|
+
return new semver.Range(version).range !== version;
|
|
123
|
+
}
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX21hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGx1Z2lucy9fbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLHFEQUF1QztBQUN2QywyQ0FBNkI7QUFDN0IseUNBQTJCO0FBQzNCLDZDQUErQjtBQUMvQiwrQ0FBaUM7QUFFakMsTUFBTSwyQkFBMkIsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLGtEQUFrRDtBQW1GMUc7O0dBRUc7QUFDSCxNQUFhLGFBQWE7SUFFeEIsWUFBNkIsR0FBVztRQUFYLFFBQUcsR0FBSCxHQUFHLENBQVE7SUFBRyxDQUFDO0lBRXJDLElBQUksQ0FBQyxPQUFpQzs7UUFFM0MsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsTUFBQSxPQUFPLENBQUMsVUFBVSxtQ0FBSSxFQUFFLENBQUMsQ0FBQztRQUVyRixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1YsTUFBTSxJQUFJLEtBQUssQ0FBQywyQkFBMkIsT0FBTyxDQUFDLEtBQUssaUJBQWlCLE9BQU8sQ0FBQyxHQUFHLElBQUksT0FBTyxDQUFDLE9BQU8sa0NBQWtDLENBQUMsQ0FBQztTQUM1STtRQUVELE9BQU8sRUFBRSxRQUFRLEVBQUUsSUFBSSxLQUFLLENBQUMsTUFBQSxPQUFPLENBQUMsVUFBVSxtQ0FBSSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUM7SUFDL0YsQ0FBQztJQUVPLFdBQVcsQ0FBQyxHQUFXLEVBQUUsT0FBZSxFQUFFLFVBQWtDO1FBRWxGLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FB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RUFBRSxNQUFNLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNoRixDQUFDO0lBRU8sT0FBTyxDQUFDLElBQVksRUFBRSxPQUFlLEVBQUUsVUFBa0I7UUFFL0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6QyxpRUFBaUU7UUFDakUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRW5DLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsYUFBVixVQUFVLGNBQVYsVUFBVSxHQUFJLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQ3hFLENBQUM7SUFFTyxTQUFTLENBQUMsR0FBVyxFQUFFLE9BQWU7UUFDNUMsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxjQUFjLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDaEUsQ0FBQztDQUVGO0FBakdELHNDQWlHQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFTLE9BQU8sQ0FBQyxPQUFlO0lBQzlCLE9BQU8sSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssS0FBSyxPQUFPLENBQUM7QUFDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGNoaWxkIGZyb20gJ2NoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHVybCBmcm9tICd1cmwnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5cbmNvbnN0IE1PRFVMRV9OT1RfRk9VTkRfRVJST1JfQ09ERSA9ICdNT0RVTEVfTk9UX0ZPVU5EJzsgLy8gVE9ETyBpcyB0aGVyZSBhIGtub3duIGNvbnN0YW50IHdlIGNhbiB1c2UgaGVyZT9cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCBhIGxvYWRlZCBwbHVnaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luIHtcblxuICAvKipcbiAgICogVGhlIGluc3RhbmNlIG9mIHRoZSBwbHVnaW4gY2xhc3MuXG4gICAqL1xuICByZWFkb25seSBpbnN0YW5jZTogdW5rbm93bjtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBjbGFzcyBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgY2xhc3M6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwYWNrYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFja2FnZTogUGFja2FnZTtcblxufVxuXG4vKipcbiAqIEluZm9ybWF0aW9uIGFib3V0IGEgcGx1Z2luIHBhY2thZ2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGFja2FnZSB7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gbW9kdWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgbW9kdWxlOiBSZXR1cm5UeXBlPE5vZGVSZXF1aXJlPjtcblxuICAvKipcbiAgICAqIFRoZSBucG0gcGFja2FnZSBvZiB0aGUgcGx1Z2luLlxuICAgICovXG4gIHJlYWRvbmx5IHBrZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgICogVGhlIHZlcnNpb24gb2YgdGhlIHBsdWdpbi5cbiAgICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAgKiBUaGUgcGF0aCBvZiB0aGUgcGx1Z2luIG9uIHRoZSBsb2NhbCBzeXN0ZW0gKGFmdGVyIGl0cyBpbnN0YWxsZWQpLlxuICAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGxvYWRpbmcgYSBwbHVnaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUGx1Z2luTWFuYWdlckxvYWRPcHRpb25zIHtcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwYWNrYWdlIG5hbWUuXG4gICAqL1xuICByZWFkb25seSBwa2c6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHBsdWdpbiBwYWNrYWdlIHZlcnNpb24uXG4gICAqL1xuICByZWFkb25seSB2ZXJzaW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwbHVnaW4gcGFja2FnZSBjbGFzcy5cbiAgICovXG4gIHJlYWRvbmx5IGNsYXNzOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEluc3RhbGxhdGlvbiBlbnZpcm9ubWVudCAocGFzc2VkIG9uIHRvIG5wbSBpbnN0YWxsKVxuICAgKi9cbiAgcmVhZG9ubHkgaW5zdGFsbEVudj86IHsgW2tleTogc3RyaW5nXTogYW55IH07XG5cbiAgLyoqXG4gICAqIFBsdWdpbiBpbnN0YW50aWF0aW9uIHByb3BlcnRpZXMuXG4gICAqL1xuICByZWFkb25seSBwcm9wZXJ0aWVzPzogeyBba2V5OiBzdHJpbmddOiBhbnkgfTtcblxufVxuXG4vKipcbiAqIEEgYFBsdWdpbk1hbmFnZXJgIGlzIHJlc3BvbnNpYmxlIGZvciBsb2FkaW5nIChhbmQgaW5zdGFsbGluZykgcGx1Z2lucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFBsdWdpbk1hbmFnZXIge1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgZGlyOiBzdHJpbmcpIHt9XG5cbiAgcHVibGljIGxvYWQob3B0aW9uczogUGx1Z2luTWFuYWdlckxvYWRPcHRpb25zKTogUGx1Z2luIHtcblxuICAgIGNvbnN0IHBrZyA9IHRoaXMubG9hZFBhY2thZ2Uob3B0aW9ucy5wa2csIG9wdGlvbnMudmVyc2lvbiwgb3B0aW9ucy5pbnN0YWxsRW52ID8/IHt9KTtcblxuICAgIGNvbnN0IGNsYXp6ID0gcGtnLm1vZHVsZVtvcHRpb25zLmNsYXNzXTtcbiAgICBpZiAoIWNsYXp6KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsb2NhdGUgY2xhc3MgJyR7b3B0aW9ucy5jbGFzc30nIGluIHBhY2thZ2UgJyR7b3B0aW9ucy5wa2d9QCR7b3B0aW9ucy52ZXJzaW9ufScuIEFyZSB5b3Ugc3VyZSB5b3UgZXhwb3J0ZWQgaXQ/YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgaW5zdGFuY2U6IG5ldyBjbGF6eihvcHRpb25zLnByb3BlcnRpZXMgPz8ge30pLCBjbGFzczogb3B0aW9ucy5jbGFzcywgcGFja2FnZTogcGtnIH07XG4gIH1cblxuICBwcml2YXRlIGxvYWRQYWNrYWdlKHBrZzogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIGluc3RhbGxFbnY6IHsgW2tleTogc3RyaW5nXTogYW55IH0pOiBQYWNrYWdlIHtcblxuICAgIGlmIChpc1JhbmdlKHZlcnNpb24pKSB7XG4gICAgICAvLyB3ZSBmb3JiaWQgdmVyc2lvbiByYW5nZXMgYmVjYXVzZSBpdCBtaWdodCBnaXZlIHRoZSBmYWxzZSBpbXByZXNzaW9uIHdlIHdpbGwgYmUgaW5zdGFsbGluZ1xuICAgICAgLy8gdGhlIGxhdGVzdCB2ZXJzaW9uICh3aGljaCB3ZSB3aWxsIG5vdCBiZWNhdXNlIGl0IHdvdWxkIG1lYW4gY29udGFjdGluZyBOUE0gb24gZXZlcnkgc3ludGgpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHZlcnNpb24gc3BlYyBmb3IgcGFja2FnZSAke3BrZ306ICR7dmVyc2lvbn0uIENhbm5vdCBiZSBhIHJhbmdlLmApO1xuICAgIH1cblxuICAgIGNvbnN0IHByb3RvID0gdXJsLnBhcnNlKHBrZykucHJvdG9jb2w7XG5cbiAgICBpZiAocHJvdG8pIHtcbiAgICAgIC8vIHVybHMgYXJlIG5vdCBzdXBwb3J0ZWQgYmVjYXVzZSB0aGV5IGRvbid0IHByb3ZpZGUgYSBuYW1lIHdpdGggd2hpY2ggd2UgY2FuICdyZXF1aXJlJyB0aGUgbW9kdWxlLlxuICAgICAgLy8gaWYgbmVlZGVkLCB3ZSBjYW4gbWFrZSB0aGUgbG9hZGVyIHNtYXJ0ZXIgYW5kIGVuYWJsZSB0aGlzLCBidXQgbm90IGZvciBub3cuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIHBhY2thZ2UgcmVmZXJlbmNlOiAke3BrZ30uIENhbiBlaXRoZXIgYmUgYW4gTlBNIHBhY2thZ2UgbmFtZSwgb3IgYSBsb2NhbCBwYXRoIHRvIGEgZGlyZWN0b3J5YCk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9jYWwgPSBwYXRoLmlzQWJzb2x1dGUocGtnKVxuICAgICAgLy8gYXNzdW1lIHJlbGF0aXZlIHBhdGhzIHN0YXJ0IHdpdGggJy4nIGJlY2F1c2Ugb3RoZXJpc2UgdGhleVxuICAgICAgLy8gYXJlIGVhc2lseSBjb25mdXNlZCB3aXRoIG5wbSBwYWNrYWdlIG5hbWVzLlxuICAgICAgfHwgcGtnLnN0YXJ0c1dpdGgoYC4ke3BhdGguc2VwfWApO1xuXG4gICAgLy8gbG9jYWwgcGx1Z2lucyBhcmUgbG9hZGVkIGRpcmVjdGx5LCBucG0gcGFja2FnZXMgYXJlIGxvYWRlZFxuICAgIC8vIGZyb20gdGhlIHBsdWdpbnMgZGlyZWN0b3J5LlxuICAgIGNvbnN0IG1vZHVsZVBhdGggPSBsb2NhbCA/IHBhdGgucmVzb2x2ZShwcm9jZXNzLmN3ZCgpLCBwa2cpIDogdGhpcy5wbHVnaW5EaXIocGtnLCB2ZXJzaW9uKTtcbiAgICBjb25zdCBwbHVnaW5OYW1lID0gbG9jYWwgPyBtb2R1bGVQYXRoIDogcGtnO1xuXG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVpcmUobW9kdWxlUGF0aCwgdmVyc2lvbiwgcGx1Z2luTmFtZSk7XG4gICAgfSBjYXRjaCAoZTogYW55KSB7XG5cbiAgICAgIGlmICghW01PRFVMRV9OT1RfRk9VTkRfRVJST1JfQ09ERV0uaW5jbHVkZXMoZS5jb2RlKSkge1xuICAgICAgICAvLyBzb21lIHVuZXhwZWN0ZWQgZXJyb3JcbiAgICAgICAgdGhyb3cgZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGxvY2FsKSB7XG4gICAgICAgIC8vIGlmIGEgbG9jYWwgcGx1Z2luIGlzIG1pc3NpbmcsIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IGl0XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG5cbiAgICAgIC8vIG90aGVyd2lzZSwgd2UgaW5zdGFsbCBmcm9tIG5wbSBhbmQgcmUtcmVxdWlyZS5cbiAgICAgIHRoaXMuaW5zdGFsbFBhY2thZ2UocGtnLCB2ZXJzaW9uLCBpbnN0YWxsRW52KTtcbiAgICAgIHJldHVybiB0aGlzLnJlcXVpcmUobW9kdWxlUGF0aCwgdmVyc2lvbiwgcGx1Z2luTmFtZSk7XG4gICAgfVxuXG4gIH1cblxuICBwcml2YXRlIGluc3RhbGxQYWNrYWdlKHBrZzogc3RyaW5nLCB2ZXJzaW9uOiBzdHJpbmcsIGVudjogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkge1xuXG4gICAgY29uc3QgcGx1Z2luRGlyID0gcGF0aC5qb2luKHRoaXMuZGlyLCBwa2csIHZlcnNpb24pO1xuICAgIGZzLm1rZGlycFN5bmMocGx1Z2luRGlyKTtcblxuICAgIGNvbnN0IGNvbW1hbmQgPSBbXG4gICAgICAnbnBtJyxcbiAgICAgICdpbnN0YWxsJywgYCR7cGtnfUAke3ZlcnNpb259YCxcbiAgICAgICctLW5vLXNhdmUnLFxuICAgICAgJy0tcHJlZml4JywgcGx1Z2luRGlyLFxuICAgIF0uam9pbignICcpO1xuXG4gICAgY29uc3QgZmluYWxFbnYgPSB7IC4uLnByb2Nlc3MuZW52IH07XG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoZW52KSkge1xuICAgICAgZmluYWxFbnZba2V5XSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBrZXkgOiBKU09OLnN0cmluZ2lmeSh2YWx1ZSk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGBJbnN0YWxsaW5nIHZhbGlkYXRpb24gcGx1Z2luOiAke3BrZ31AJHt2ZXJzaW9ufSAodGhpcyBtYXkgdGFrZSBhIHdoaWxlIHRoZSBmaXJzdCB0aW1lIGFyb3VuZClgKTtcbiAgICBjaGlsZC5leGVjU3luYyhjb21tYW5kLCB7IHN0ZGlvOiBbJ2lnbm9yZScsICdwaXBlJywgJ3BpcGUnXSwgZW52OiBmaW5hbEVudiB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcmVxdWlyZShzcGVjOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgcGx1Z2luTmFtZTogc3RyaW5nKTogUGFja2FnZSB7XG5cbiAgICBjb25zdCBtb2R1bGVQYXRoID0gcmVxdWlyZS5yZXNvbHZlKHNwZWMpO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcbiAgICBjb25zdCBtb2R1bGUgPSByZXF1aXJlKG1vZHVsZVBhdGgpO1xuXG4gICAgcmV0dXJuIHsgdmVyc2lvbiwgcGtnOiBwbHVnaW5OYW1lID8/IHNwZWMsIHBhdGg6IG1vZHVsZVBhdGgsIG1vZHVsZSB9O1xuICB9XG5cbiAgcHJpdmF0ZSBwbHVnaW5EaXIocGtnOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZykge1xuICAgIHJldHVybiBwYXRoLmpvaW4odGhpcy5kaXIsIHBrZywgdmVyc2lvbiwgJ25vZGVfbW9kdWxlcycsIHBrZyk7XG4gIH1cblxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGdpdmVuIHZlcnNpb24gcmVwcmVzZW50cyBhIHJhbmdlLCBvciBhIHBpbm5lZCB2ZXJzaW9uLlxuICogRm9yIGV4YW1wbGU6XG4gKlxuICogICAtICcxLnggZXhwYW5kcyB0byAnPj0xLjAuMCA8Mi4wLjAtMCdcbiAqICAgLSBgfjEuMicgZXhwYW5kcyB0byAnPj0xLjIuMCA8MS4zLjAtMCdcbiAqICAgLSAnMS4yLjMnIGV4cGFuZHMgdG8gJzEuMi4zJ1xuICovXG5mdW5jdGlvbiBpc1JhbmdlKHZlcnNpb246IHN0cmluZykge1xuICByZXR1cm4gbmV3IHNlbXZlci5SYW5nZSh2ZXJzaW9uKS5yYW5nZSAhPT0gdmVyc2lvbjtcbn0iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { Validation, ValidationContext, ValidationViolation, ValidationViolatingResource } from './validation';
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ValidationContext = void 0;
|
|
4
|
+
var validation_1 = require("./validation");
|
|
5
|
+
Object.defineProperty(exports, "ValidationContext", { enumerable: true, get: function () { return validation_1.ValidationContext; } });
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGx1Z2lucy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBK0c7QUFBMUYsK0dBQUEsaUJBQWlCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBWYWxpZGF0aW9uLCBWYWxpZGF0aW9uQ29udGV4dCwgVmFsaWRhdGlvblZpb2xhdGlvbiwgVmFsaWRhdGlvblZpb2xhdGluZ1Jlc291cmNlIH0gZnJvbSAnLi92YWxpZGF0aW9uJzsiXX0=
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { ValidationConfig } from '../config';
|
|
2
|
+
import { SynthesizedApp } from '../util';
|
|
3
|
+
import { PluginManager } from './_manager';
|
|
4
|
+
/**
|
|
5
|
+
* Context available to plugins during validation.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ValidationContext {
|
|
8
|
+
/**
|
|
9
|
+
* The list of manifests to validate.
|
|
10
|
+
*/
|
|
11
|
+
readonly manifests: readonly string[];
|
|
12
|
+
/**
|
|
13
|
+
* The NodeJS package name of the plugin running the validation.
|
|
14
|
+
*/
|
|
15
|
+
readonly pkg: string;
|
|
16
|
+
/**
|
|
17
|
+
* The version of the NodeJS package that runs the validation.
|
|
18
|
+
*/
|
|
19
|
+
readonly version: string;
|
|
20
|
+
/**
|
|
21
|
+
* Construct metadata of resources in the application.
|
|
22
|
+
*/
|
|
23
|
+
readonly metadata: {
|
|
24
|
+
readonly [key: string]: ResourceConstructMetadata;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Whether or not the synth command was executed with --stdout.
|
|
28
|
+
*/
|
|
29
|
+
readonly stdout?: boolean | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Report emitted by the validation.
|
|
32
|
+
*
|
|
33
|
+
* Plugins should interact with this object to generate the report.
|
|
34
|
+
*/
|
|
35
|
+
readonly report: ValidationReport;
|
|
36
|
+
/**
|
|
37
|
+
* Logger for the validation.
|
|
38
|
+
*
|
|
39
|
+
* Plugins should interact with this object to log messages during validation.
|
|
40
|
+
*/
|
|
41
|
+
readonly logger: ValidationLogger;
|
|
42
|
+
constructor(
|
|
43
|
+
/**
|
|
44
|
+
* The list of manifests to validate.
|
|
45
|
+
*/
|
|
46
|
+
manifests: readonly string[],
|
|
47
|
+
/**
|
|
48
|
+
* The NodeJS package name of the plugin running the validation.
|
|
49
|
+
*/
|
|
50
|
+
pkg: string,
|
|
51
|
+
/**
|
|
52
|
+
* The version of the NodeJS package that runs the validation.
|
|
53
|
+
*/
|
|
54
|
+
version: string,
|
|
55
|
+
/**
|
|
56
|
+
* Construct metadata of resources in the application.
|
|
57
|
+
*/
|
|
58
|
+
metadata?: {
|
|
59
|
+
readonly [key: string]: ResourceConstructMetadata;
|
|
60
|
+
},
|
|
61
|
+
/**
|
|
62
|
+
* Whether or not the synth command was executed with --stdout.
|
|
63
|
+
*/
|
|
64
|
+
stdout?: boolean | undefined);
|
|
65
|
+
parseManifest(manifestPath: string): any[];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Logger available to plugins during validation. Use this instead of `console.log`.
|
|
69
|
+
*/
|
|
70
|
+
export declare class ValidationLogger {
|
|
71
|
+
/**
|
|
72
|
+
* Log a message.
|
|
73
|
+
*/
|
|
74
|
+
log(message: string): void;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Contract between cdk8s and third-parties looking to implement validation plugins.
|
|
78
|
+
*/
|
|
79
|
+
export interface Validation {
|
|
80
|
+
/**
|
|
81
|
+
* Run the validation logic.
|
|
82
|
+
*
|
|
83
|
+
* - Use `context.manifests` to retrieve the list of manifests to validate.
|
|
84
|
+
* - Use `context.report` to access and build the resulting report.
|
|
85
|
+
*
|
|
86
|
+
* Make sure to call `context.report.pass()` or `context.report.fail()` before returning, otherwise the validation is considered incomplete.
|
|
87
|
+
*/
|
|
88
|
+
validate(context: ValidationContext): Promise<void>;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Resource violating a specific rule.
|
|
92
|
+
*/
|
|
93
|
+
export interface ValidationViolatingResource {
|
|
94
|
+
/**
|
|
95
|
+
* The resource name.
|
|
96
|
+
*/
|
|
97
|
+
readonly resourceName: string;
|
|
98
|
+
/**
|
|
99
|
+
* The locations in its config that pose the violations.
|
|
100
|
+
*/
|
|
101
|
+
readonly locations: readonly string[];
|
|
102
|
+
/**
|
|
103
|
+
* The manifest this resource is defined in.
|
|
104
|
+
*/
|
|
105
|
+
readonly manifestPath: string;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Construct violating a specific rule.
|
|
109
|
+
*/
|
|
110
|
+
export interface ValidationViolatingConstruct extends ValidationViolatingResource {
|
|
111
|
+
/**
|
|
112
|
+
* The construct path as defined in the application.
|
|
113
|
+
*/
|
|
114
|
+
readonly constructPath?: string;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Violation produced by the validation plugin.
|
|
118
|
+
*/
|
|
119
|
+
export interface ValidationViolation {
|
|
120
|
+
/**
|
|
121
|
+
* The name of the rule.
|
|
122
|
+
*/
|
|
123
|
+
readonly ruleName: string;
|
|
124
|
+
/**
|
|
125
|
+
* The recommendation to resolve the violation.
|
|
126
|
+
*/
|
|
127
|
+
readonly recommendation: string;
|
|
128
|
+
/**
|
|
129
|
+
* How to fix the recommendation.
|
|
130
|
+
*/
|
|
131
|
+
readonly fix: string;
|
|
132
|
+
/**
|
|
133
|
+
* The resources violating this rule.
|
|
134
|
+
*/
|
|
135
|
+
readonly violatingResources: readonly ValidationViolatingResource[];
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Validation produced by the validation plugin, in construct terms.
|
|
139
|
+
*/
|
|
140
|
+
export interface ValidationViolationConstructAware extends Omit<ValidationViolation, 'violatingResources'> {
|
|
141
|
+
/**
|
|
142
|
+
* The constructs violating this rule.
|
|
143
|
+
*/
|
|
144
|
+
readonly violatingConstructs: readonly ValidationViolatingConstruct[];
|
|
145
|
+
}
|
|
146
|
+
export declare type ValidationReportStatus = 'success' | 'failure';
|
|
147
|
+
/**
|
|
148
|
+
* Summary of the report.
|
|
149
|
+
*/
|
|
150
|
+
export interface ValidationReportSummary {
|
|
151
|
+
readonly status: ValidationReportStatus;
|
|
152
|
+
readonly plugin: string;
|
|
153
|
+
readonly version: string;
|
|
154
|
+
readonly metadata?: {
|
|
155
|
+
readonly [key: string]: string;
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* JSON representation of the report.
|
|
160
|
+
*/
|
|
161
|
+
export interface ValidationReportJson {
|
|
162
|
+
/**
|
|
163
|
+
* Report title.
|
|
164
|
+
*/
|
|
165
|
+
readonly title: string;
|
|
166
|
+
/**
|
|
167
|
+
* List of violations in the rerpot.
|
|
168
|
+
*/
|
|
169
|
+
readonly violations: readonly ValidationViolationConstructAware[];
|
|
170
|
+
/**
|
|
171
|
+
* Report summary.
|
|
172
|
+
*/
|
|
173
|
+
readonly summary: ValidationReportSummary;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* The report emitted by the plugin after evaluation.
|
|
177
|
+
*/
|
|
178
|
+
export declare class ValidationReport {
|
|
179
|
+
private readonly pkg;
|
|
180
|
+
private readonly version;
|
|
181
|
+
private readonly metadata;
|
|
182
|
+
private readonly stdout;
|
|
183
|
+
private readonly violations;
|
|
184
|
+
private _summary?;
|
|
185
|
+
constructor(pkg: string, version: string, metadata: {
|
|
186
|
+
readonly [key: string]: ResourceConstructMetadata;
|
|
187
|
+
}, stdout: boolean);
|
|
188
|
+
/**
|
|
189
|
+
* Add a violation to the report.
|
|
190
|
+
*/
|
|
191
|
+
addViolation(violation: ValidationViolation): void;
|
|
192
|
+
/**
|
|
193
|
+
* Submit the report with a status and additional metadata.
|
|
194
|
+
*/
|
|
195
|
+
submit(status: ValidationReportStatus, metadata?: {
|
|
196
|
+
readonly [key: string]: string;
|
|
197
|
+
}): void;
|
|
198
|
+
/**
|
|
199
|
+
* Whether or not the report was successfull.
|
|
200
|
+
*/
|
|
201
|
+
get success(): boolean;
|
|
202
|
+
/**
|
|
203
|
+
* Transform the report to a well formatted table string.
|
|
204
|
+
*/
|
|
205
|
+
toString(): string;
|
|
206
|
+
/**
|
|
207
|
+
* Transform the report into a JSON object.
|
|
208
|
+
*/
|
|
209
|
+
toJson(): ValidationReportJson;
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Utiliy class for loading validation plugins.
|
|
213
|
+
*/
|
|
214
|
+
export declare class ValidationPlugin {
|
|
215
|
+
/**
|
|
216
|
+
* Load the validation plugin and create the necessary context for its execution.
|
|
217
|
+
*/
|
|
218
|
+
static load(validation: ValidationConfig, app: SynthesizedApp, stdout: boolean, pluginManager: PluginManager): {
|
|
219
|
+
plugin: Validation;
|
|
220
|
+
context: ValidationContext;
|
|
221
|
+
};
|
|
222
|
+
private static loadConstructMetadata;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Construct related metadata on resources.
|
|
226
|
+
*/
|
|
227
|
+
interface ResourceConstructMetadata {
|
|
228
|
+
/**
|
|
229
|
+
* The path of the construct in the application.
|
|
230
|
+
*/
|
|
231
|
+
readonly path: string;
|
|
232
|
+
}
|
|
233
|
+
export {};
|
|
@@ -0,0 +1,242 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
+
if (mod && mod.__esModule) return mod;
|
|
20
|
+
var result = {};
|
|
21
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
+
__setModuleDefault(result, mod);
|
|
23
|
+
return result;
|
|
24
|
+
};
|
|
25
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
+
exports.ValidationPlugin = exports.ValidationReport = exports.ValidationLogger = exports.ValidationContext = void 0;
|
|
27
|
+
const fs = __importStar(require("fs"));
|
|
28
|
+
const os = __importStar(require("os"));
|
|
29
|
+
const table_1 = require("table");
|
|
30
|
+
const yaml = __importStar(require("yaml"));
|
|
31
|
+
/**
|
|
32
|
+
* Context available to plugins during validation.
|
|
33
|
+
*/
|
|
34
|
+
class ValidationContext {
|
|
35
|
+
constructor(
|
|
36
|
+
/**
|
|
37
|
+
* The list of manifests to validate.
|
|
38
|
+
*/
|
|
39
|
+
manifests,
|
|
40
|
+
/**
|
|
41
|
+
* The NodeJS package name of the plugin running the validation.
|
|
42
|
+
*/
|
|
43
|
+
pkg,
|
|
44
|
+
/**
|
|
45
|
+
* The version of the NodeJS package that runs the validation.
|
|
46
|
+
*/
|
|
47
|
+
version,
|
|
48
|
+
/**
|
|
49
|
+
* Construct metadata of resources in the application.
|
|
50
|
+
*/
|
|
51
|
+
metadata = {},
|
|
52
|
+
/**
|
|
53
|
+
* Whether or not the synth command was executed with --stdout.
|
|
54
|
+
*/
|
|
55
|
+
stdout) {
|
|
56
|
+
var _a;
|
|
57
|
+
this.manifests = manifests;
|
|
58
|
+
this.pkg = pkg;
|
|
59
|
+
this.version = version;
|
|
60
|
+
this.metadata = metadata;
|
|
61
|
+
this.stdout = stdout;
|
|
62
|
+
this.report = new ValidationReport(this.pkg, this.version, (_a = this.metadata) !== null && _a !== void 0 ? _a : {}, stdout !== null && stdout !== void 0 ? stdout : false);
|
|
63
|
+
this.logger = new ValidationLogger();
|
|
64
|
+
}
|
|
65
|
+
parseManifest(manifestPath) {
|
|
66
|
+
const parsed = yaml.parseAllDocuments(fs.readFileSync(manifestPath, { encoding: 'utf-8' }));
|
|
67
|
+
const resources = Array.isArray(parsed) ? parsed : [parsed];
|
|
68
|
+
return resources.map(r => r.toJS());
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
exports.ValidationContext = ValidationContext;
|
|
72
|
+
/**
|
|
73
|
+
* Logger available to plugins during validation. Use this instead of `console.log`.
|
|
74
|
+
*/
|
|
75
|
+
class ValidationLogger {
|
|
76
|
+
/**
|
|
77
|
+
* Log a message.
|
|
78
|
+
*/
|
|
79
|
+
log(message) {
|
|
80
|
+
console.log(message);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
exports.ValidationLogger = ValidationLogger;
|
|
84
|
+
/**
|
|
85
|
+
* The report emitted by the plugin after evaluation.
|
|
86
|
+
*/
|
|
87
|
+
class ValidationReport {
|
|
88
|
+
constructor(pkg, version, metadata, stdout) {
|
|
89
|
+
this.pkg = pkg;
|
|
90
|
+
this.version = version;
|
|
91
|
+
this.metadata = metadata;
|
|
92
|
+
this.stdout = stdout;
|
|
93
|
+
this.violations = [];
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Add a violation to the report.
|
|
97
|
+
*/
|
|
98
|
+
addViolation(violation) {
|
|
99
|
+
var _a;
|
|
100
|
+
if (this._summary) {
|
|
101
|
+
throw new Error('Violations cannot be added to report after its submitted');
|
|
102
|
+
}
|
|
103
|
+
const violatingConstructs = [];
|
|
104
|
+
for (const resource of violation.violatingResources) {
|
|
105
|
+
const constructPath = (_a = this.metadata[resource.resourceName]) === null || _a === void 0 ? void 0 : _a.path;
|
|
106
|
+
violatingConstructs.push({
|
|
107
|
+
...resource,
|
|
108
|
+
// augment with construct metadata
|
|
109
|
+
constructPath: constructPath,
|
|
110
|
+
// if synth is executed with --stdout, the manifest path
|
|
111
|
+
// here is temporary and will be deleted once the command finishes.
|
|
112
|
+
manifestPath: this.stdout ? 'STDOUT' : resource.manifestPath,
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
this.violations.push({
|
|
116
|
+
ruleName: violation.ruleName,
|
|
117
|
+
recommendation: violation.recommendation,
|
|
118
|
+
violatingConstructs: violatingConstructs,
|
|
119
|
+
fix: violation.fix,
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Submit the report with a status and additional metadata.
|
|
124
|
+
*/
|
|
125
|
+
submit(status, metadata) {
|
|
126
|
+
this._summary = { status, plugin: this.pkg, version: this.version, metadata };
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Whether or not the report was successfull.
|
|
130
|
+
*/
|
|
131
|
+
get success() {
|
|
132
|
+
if (!this._summary) {
|
|
133
|
+
throw new Error('Unable to determine report status: Report is incomplete. Call \'report.submit\'');
|
|
134
|
+
}
|
|
135
|
+
return this._summary.status === 'success';
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* Transform the report to a well formatted table string.
|
|
139
|
+
*/
|
|
140
|
+
toString() {
|
|
141
|
+
var _a, _b;
|
|
142
|
+
const json = this.toJson();
|
|
143
|
+
const output = [json.title];
|
|
144
|
+
output.push('-'.repeat(json.title.length));
|
|
145
|
+
output.push('');
|
|
146
|
+
output.push('(Summary)');
|
|
147
|
+
output.push('');
|
|
148
|
+
output.push((0, table_1.table)([
|
|
149
|
+
['Status', json.summary.status],
|
|
150
|
+
['Plugin', json.summary.plugin],
|
|
151
|
+
['Version', json.summary.version],
|
|
152
|
+
...Object.entries((_a = json.summary.metadata) !== null && _a !== void 0 ? _a : {}),
|
|
153
|
+
]));
|
|
154
|
+
if (json.violations) {
|
|
155
|
+
output.push('');
|
|
156
|
+
output.push('(Violations)');
|
|
157
|
+
}
|
|
158
|
+
for (const violation of json.violations) {
|
|
159
|
+
const occurrences = violation.violatingConstructs.flatMap(c => c.locations).length;
|
|
160
|
+
const title = reset(red(bright(`${violation.ruleName} (${occurrences} occurrences)`)));
|
|
161
|
+
output.push('');
|
|
162
|
+
output.push(title);
|
|
163
|
+
output.push('');
|
|
164
|
+
output.push(' Occurrences:');
|
|
165
|
+
for (const construct of violation.violatingConstructs) {
|
|
166
|
+
output.push('');
|
|
167
|
+
output.push(` - Construct Path: ${(_b = construct.constructPath) !== null && _b !== void 0 ? _b : 'N/A'}`);
|
|
168
|
+
output.push(` - Manifest Path: ${construct.manifestPath}`);
|
|
169
|
+
output.push(` - Resource Name: ${construct.resourceName}`);
|
|
170
|
+
if (construct.locations) {
|
|
171
|
+
output.push(' - Locations:');
|
|
172
|
+
for (const location of construct.locations) {
|
|
173
|
+
output.push(` > ${location}`);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
output.push('');
|
|
178
|
+
output.push(` Recommendation: ${violation.recommendation}`);
|
|
179
|
+
output.push(` How to fix: ${violation.fix}`);
|
|
180
|
+
}
|
|
181
|
+
return output.join(os.EOL);
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Transform the report into a JSON object.
|
|
185
|
+
*/
|
|
186
|
+
toJson() {
|
|
187
|
+
if (!this._summary) {
|
|
188
|
+
throw new Error('Unable to determine report result: Report is incomplete. Call \'report.submit\'');
|
|
189
|
+
}
|
|
190
|
+
return {
|
|
191
|
+
title: `Validation Report (${this.pkg}@${this.version})`,
|
|
192
|
+
violations: this.violations,
|
|
193
|
+
summary: this._summary,
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
exports.ValidationReport = ValidationReport;
|
|
198
|
+
/**
|
|
199
|
+
* Utiliy class for loading validation plugins.
|
|
200
|
+
*/
|
|
201
|
+
class ValidationPlugin {
|
|
202
|
+
/**
|
|
203
|
+
* Load the validation plugin and create the necessary context for its execution.
|
|
204
|
+
*/
|
|
205
|
+
static load(validation, app, stdout, pluginManager) {
|
|
206
|
+
const plugin = pluginManager.load({
|
|
207
|
+
pkg: validation.package,
|
|
208
|
+
version: validation.version,
|
|
209
|
+
class: validation.class,
|
|
210
|
+
properties: validation.properties,
|
|
211
|
+
installEnv: validation.installEnv,
|
|
212
|
+
});
|
|
213
|
+
if (typeof (plugin.instance.validate) !== 'function') {
|
|
214
|
+
throw new Error(`Instance of class '${validation.class}' from package '${validation.package}@${validation.version}' is not a validation plugin. Are you sure you specified the correct class?`);
|
|
215
|
+
}
|
|
216
|
+
const metadata = app.constructMetadata ? this.loadConstructMetadata(app.constructMetadata) : {};
|
|
217
|
+
const context = new ValidationContext(app.manifests, plugin.package.pkg, plugin.package.version, metadata, stdout);
|
|
218
|
+
return { plugin: plugin.instance, context };
|
|
219
|
+
}
|
|
220
|
+
static loadConstructMetadata(constructMetadataPath) {
|
|
221
|
+
const contents = JSON.parse(fs.readFileSync(constructMetadataPath, { encoding: 'utf-8' }));
|
|
222
|
+
const resources = {};
|
|
223
|
+
if (contents.version !== '1.0.0') {
|
|
224
|
+
throw new Error(`Unexpected version of construct metadata at ${constructMetadataPath}: ${contents.version}. Supported versions are: [1.0.0]`);
|
|
225
|
+
}
|
|
226
|
+
for (const [name, metadata] of Object.entries(contents.resources)) {
|
|
227
|
+
resources[name] = { path: metadata.path };
|
|
228
|
+
}
|
|
229
|
+
return resources;
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
exports.ValidationPlugin = ValidationPlugin;
|
|
233
|
+
function reset(s) {
|
|
234
|
+
return `${s}\x1b[0m`;
|
|
235
|
+
}
|
|
236
|
+
function red(s) {
|
|
237
|
+
return `\x1b[31m${s}`;
|
|
238
|
+
}
|
|
239
|
+
function bright(s) {
|
|
240
|
+
return `\x1b[1m${s}`;
|
|
241
|
+
}
|
|
242
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wbHVnaW5zL3ZhbGlkYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBeUI7QUFDekIsdUNBQXlCO0FBQ3pCLGlDQUE4QjtBQUM5QiwyQ0FBNkI7QUFLN0I7O0dBRUc7QUFDSCxNQUFhLGlCQUFpQjtJQWdCNUI7SUFFRTs7T0FFRztJQUNhLFNBQTRCO0lBRTVDOztPQUVHO0lBQ2EsR0FBVztJQUUzQjs7T0FFRztJQUNhLE9BQWU7SUFFL0I7O09BRUc7SUFDYSxXQUFnRSxFQUFFO0lBRWxGOztPQUVHO0lBQ2EsTUFBZ0I7O1FBcEJoQixjQUFTLEdBQVQsU0FBUyxDQUFtQjtRQUs1QixRQUFHLEdBQUgsR0FBRyxDQUFRO1FBS1gsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUtmLGFBQVEsR0FBUixRQUFRLENBQTBEO1FBS2xFLFdBQU0sR0FBTixNQUFNLENBQVU7UUFFaEMsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFBLElBQUksQ0FBQyxRQUFRLG1DQUFJLEVBQUUsRUFBRSxNQUFNLGFBQU4sTUFBTSxjQUFOLE1BQU0sR0FBSSxLQUFLLENBQUMsQ0FBQztRQUNqRyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRU0sYUFBYSxDQUFDLFlBQW9CO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUYsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFD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QztJQUU1RCxDQUFDO0lBRU8sTUFBTSxDQUFDLHFCQUFxQixDQUFDLHFCQUE2QjtRQUNoRSxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMscUJBQXFCLEVBQUUsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzNGLE1BQU0sU0FBUyxHQUFpRCxFQUFFLENBQUM7UUFDbkUsSUFBSSxRQUFRLENBQUMsT0FBTyxLQUFLLE9BQU8sRUFBRTtZQUNoQyxNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxxQkFBcUIsS0FBSyxRQUFRLENBQUMsT0FBTyxtQ0FBbUMsQ0FBQyxDQUFDO1NBQy9JO1FBQ0QsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ2pFLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRyxRQUFnQixDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3BEO1FBQ0QsT0FBTyxTQUFTLENBQUM7SUFFbkIsQ0FBQztDQUVGO0FBMUNELDRDQTBDQztBQWNELFNBQVMsS0FBSyxDQUFDLENBQVM7SUFDdEIsT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDO0FBQ3ZCLENBQUM7QUFFRCxTQUFTLEdBQUcsQ0FBQyxDQUFTO0lBQ3BCLE9BQU8sV0FBVyxDQUFDLEVBQUUsQ0FBQztBQUN4QixDQUFDO0FBRUQsU0FBUyxNQUFNLENBQUMsQ0FBUztJQUN2QixPQUFPLFVBQVUsQ0FBQyxFQUFFLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCB7IHRhYmxlIH0gZnJvbSAndGFibGUnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICd5YW1sJztcbmltcG9ydCB7IFZhbGlkYXRpb25Db25maWcgfSBmcm9tICcuLi9jb25maWcnO1xuaW1wb3J0IHsgU3ludGhlc2l6ZWRBcHAgfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7IFBsdWdpbk1hbmFnZXIgfSBmcm9tICcuL19tYW5hZ2VyJztcblxuLyoqXG4gKiBDb250ZXh0IGF2YWlsYWJsZSB0byBwbHVnaW5zIGR1cmluZyB2YWxpZGF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkNvbnRleHQge1xuXG4gIC8qKlxuICAgKiBSZXBvcnQgZW1pdHRlZCBieSB0aGUgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogUGx1Z2lucyBzaG91bGQgaW50ZXJhY3Qgd2l0aCB0aGlzIG9iamVjdCB0byBnZW5lcmF0ZSB0aGUgcmVwb3J0LlxuICAgKi9cbiAgcHVibGljIHJlYWRvbmx5IHJlcG9ydDogVmFsaWRhdGlvblJlcG9ydDtcblxuICAvKipcbiAgICogTG9nZ2VyIGZvciB0aGUgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogUGx1Z2lucyBzaG91bGQgaW50ZXJhY3Qgd2l0aCB0aGlzIG9iamVjdCB0byBsb2cgbWVzc2FnZXMgZHVyaW5nIHZhbGlkYXRpb24uXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgbG9nZ2VyOiBWYWxpZGF0aW9uTG9nZ2VyO1xuXG4gIGNvbnN0cnVjdG9yKFxuXG4gICAgLyoqXG4gICAgICogVGhlIGxpc3Qgb2YgbWFuaWZlc3RzIHRvIHZhbGlkYXRlLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBtYW5pZmVzdHM6IHJlYWRvbmx5IHN0cmluZ1tdLFxuXG4gICAgLyoqXG4gICAgICogVGhlIE5vZGVKUyBwYWNrYWdlIG5hbWUgb2YgdGhlIHBsdWdpbiBydW5uaW5nIHRoZSB2YWxpZGF0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBwa2c6IHN0cmluZyxcblxuICAgIC8qKlxuICAgICAqIFRoZSB2ZXJzaW9uIG9mIHRoZSBOb2RlSlMgcGFja2FnZSB0aGF0IHJ1bnMgdGhlIHZhbGlkYXRpb24uXG4gICAgICovXG4gICAgcHVibGljIHJlYWRvbmx5IHZlcnNpb246IHN0cmluZyxcblxuICAgIC8qKlxuICAgICAqIENvbnN0cnVjdCBtZXRhZGF0YSBvZiByZXNvdXJjZXMgaW4gdGhlIGFwcGxpY2F0aW9uLlxuICAgICAqL1xuICAgIHB1YmxpYyByZWFkb25seSBtZXRhZGF0YToge3JlYWRvbmx5IFtrZXk6IHN0cmluZ106IFJlc291cmNlQ29uc3RydWN0TWV0YWRhdGF9ID0ge30sXG5cbiAgICAvKipcbiAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgc3ludGggY29tbWFuZCB3YXMgZXhlY3V0ZWQgd2l0aCAtLXN0ZG91dC5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgc3Rkb3V0PzogYm9vbGVhbikge1xuXG4gICAgdGhpcy5yZXBvcnQgPSBuZXcgVmFsaWRhdGlvblJlcG9ydCh0aGlzLnBrZywgdGhpcy52ZXJzaW9uLCB0aGlzLm1ldGFkYXRhID8/IHt9LCBzdGRvdXQgPz8gZmFsc2UpO1xuICAgIHRoaXMubG9nZ2VyID0gbmV3IFZhbGlkYXRpb25Mb2dnZXIoKTtcbiAgfVxuXG4gIHB1YmxpYyBwYXJzZU1hbmlmZXN0KG1hbmlmZXN0UGF0aDogc3RyaW5nKTogYW55W10ge1xuICAgIGNvbnN0IHBhcnNlZCA9IHlhbWwucGFyc2VBbGxEb2N1bWVudHMoZnMucmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgeyBlbmNvZGluZzogJ3V0Zi04JyB9KSk7XG4gICAgY29uc3QgcmVzb3VyY2VzID0gQXJyYXkuaXNBcnJheShwYXJzZWQpID8gcGFyc2VkIDogW3BhcnNlZF07XG4gICAgcmV0dXJuIHJlc291cmNlcy5tYXAociA9PiByLnRvSlMoKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBMb2dnZXIgYXZhaWxhYmxlIHRvIHBsdWdpbnMgZHVyaW5nIHZhbGlkYXRpb24uIFVzZSB0aGlzIGluc3RlYWQgb2YgYGNvbnNvbGUubG9nYC5cbiAqL1xuZXhwb3J0IGNsYXNzIFZhbGlkYXRpb25Mb2dnZXIge1xuXG4gIC8qKlxuICAgKiBMb2cgYSBtZXNzYWdlLlxuICAgKi9cbiAgcHVibGljIGxvZyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbnRyYWN0IGJldHdlZW4gY2RrOHMgYW5kIHRoaXJkLXBhcnRpZXMgbG9va2luZyB0byBpbXBsZW1lbnQgdmFsaWRhdGlvbiBwbHVnaW5zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb24ge1xuXG4gIC8qKlxuICAgKiBSdW4gdGhlIHZhbGlkYXRpb24gbG9naWMuXG4gICAqXG4gICAqIC0gVXNlIGBjb250ZXh0Lm1hbmlmZXN0c2AgdG8gcmV0cmlldmUgdGhlIGxpc3Qgb2YgbWFuaWZlc3RzIHRvIHZhbGlkYXRlLlxuICAgKiAtIFVzZSBgY29udGV4dC5yZXBvcnRgIHRvIGFjY2VzcyBhbmQgYnVpbGQgdGhlIHJlc3VsdGluZyByZXBvcnQuXG4gICAqXG4gICAqIE1ha2Ugc3VyZSB0byBjYWxsIGBjb250ZXh0LnJlcG9ydC5wYXNzKClgIG9yIGBjb250ZXh0LnJlcG9ydC5mYWlsKClgIGJlZm9yZSByZXR1cm5pbmcsIG90aGVyd2lzZSB0aGUgdmFsaWRhdGlvbiBpcyBjb25zaWRlcmVkIGluY29tcGxldGUuXG4gICAqL1xuICB2YWxpZGF0ZShjb250ZXh0OiBWYWxpZGF0aW9uQ29udGV4dCk6IFByb21pc2U8dm9pZD47XG5cbn1cblxuLyoqXG4gKiBSZXNvdXJjZSB2aW9sYXRpbmcgYSBzcGVjaWZpYyBydWxlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25WaW9sYXRpbmdSZXNvdXJjZSB7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZSBuYW1lLlxuICAgKi9cbiAgcmVhZG9ubHkgcmVzb3VyY2VOYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBsb2NhdGlvbnMgaW4gaXRzIGNvbmZpZyB0aGF0IHBvc2UgdGhlIHZpb2xhdGlvbnMuXG4gICAqL1xuICByZWFkb25seSBsb2NhdGlvbnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXG4gIC8qKlxuICAgKiBUaGUgbWFuaWZlc3QgdGhpcyByZXNvdXJjZSBpcyBkZWZpbmVkIGluLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFuaWZlc3RQYXRoOiBzdHJpbmc7XG5cbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3QgdmlvbGF0aW5nIGEgc3BlY2lmaWMgcnVsZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uVmlvbGF0aW5nQ29uc3RydWN0IGV4dGVuZHMgVmFsaWRhdGlvblZpb2xhdGluZ1Jlc291cmNlIHtcblxuICAvKipcbiAgICogVGhlIGNvbnN0cnVjdCBwYXRoIGFzIGRlZmluZWQgaW4gdGhlIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgY29uc3RydWN0UGF0aD86IHN0cmluZztcblxufVxuXG4vKipcbiAqIFZpb2xhdGlvbiBwcm9kdWNlZCBieSB0aGUgdmFsaWRhdGlvbiBwbHVnaW4uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmFsaWRhdGlvblZpb2xhdGlvbiB7XG5cbiAgLyoqXG4gICAqIFRoZSBuYW1lIG9mIHRoZSBydWxlLlxuICAgKi9cbiAgcmVhZG9ubHkgcnVsZU5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHJlY29tbWVuZGF0aW9uIHRvIHJlc29sdmUgdGhlIHZpb2xhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHJlY29tbWVuZGF0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEhvdyB0byBmaXggdGhlIHJlY29tbWVuZGF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgZml4OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXNvdXJjZXMgdmlvbGF0aW5nIHRoaXMgcnVsZS5cbiAgICovXG4gIHJlYWRvbmx5IHZpb2xhdGluZ1Jlc291cmNlczogcmVhZG9ubHkgVmFsaWRhdGlvblZpb2xhdGluZ1Jlc291cmNlW107XG5cbn1cblxuLyoqXG4gKiBWYWxpZGF0aW9uIHByb2R1Y2VkIGJ5IHRoZSB2YWxpZGF0aW9uIHBsdWdpbiwgaW4gY29uc3RydWN0IHRlcm1zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25WaW9sYXRpb25Db25zdHJ1Y3RBd2FyZSBleHRlbmRzIE9taXQ8VmFsaWRhdGlvblZpb2xhdGlvbiwgJ3Zpb2xhdGluZ1Jlc291cmNlcyc+IHtcblxuICAvKipcbiAgICogVGhlIGNvbnN0cnVjdHMgdmlvbGF0aW5nIHRoaXMgcnVsZS5cbiAgICovXG4gIHJlYWRvbmx5IHZpb2xhdGluZ0NvbnN0cnVjdHM6IHJlYWRvbmx5IFZhbGlkYXRpb25WaW9sYXRpbmdDb25zdHJ1Y3RbXTtcbn1cblxuLy8gd2UgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYW4gZW51bSBzbyB0aGF0XG4vLyBwbHVnaW5zIGRvbid0IGhhdmUgdG8gaW1wb3J0IHRoZSBjbGkgYXQgcnVudGltZS5cbmV4cG9ydCB0eXBlIFZhbGlkYXRpb25SZXBvcnRTdGF0dXMgPSAnc3VjY2VzcycgfCAnZmFpbHVyZSc7XG5cbi8qKlxuICogU3VtbWFyeSBvZiB0aGUgcmVwb3J0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZhbGlkYXRpb25SZXBvcnRTdW1tYXJ5IHtcblxuICByZWFkb25seSBzdGF0dXM6IFZhbGlkYXRpb25SZXBvcnRTdGF0dXM7XG5cbiAgcmVhZG9ubHkgcGx1Z2luOiBzdHJpbmc7XG5cbiAgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IG1ldGFkYXRhPzogeyByZWFkb25seSBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcblxufVxuXG4vKipcbiAqIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlcG9ydC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uUmVwb3J0SnNvbiB7XG5cbiAgLyoqXG4gICAqIFJlcG9ydCB0aXRsZS5cbiAgICovXG4gIHJlYWRvbmx5IHRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIExpc3Qgb2YgdmlvbGF0aW9ucyBpbiB0aGUgcmVycG90LlxuICAgKi9cbiAgcmVhZG9ubHkgdmlvbGF0aW9uczogcmVhZG9ubHkgVmFsaWRhdGlvblZpb2xhdGlvbkNvbnN0cnVjdEF3YXJlW107XG5cbiAgLyoqXG4gICAqIFJlcG9ydCBzdW1tYXJ5LlxuICAgKi9cbiAgcmVhZG9ubHkgc3VtbWFyeTogVmFsaWRhdGlvblJlcG9ydFN1bW1hcnk7XG5cbn1cblxuLyoqXG4gKiBUaGUgcmVwb3J0IGVtaXR0ZWQgYnkgdGhlIHBsdWdpbiBhZnRlciBldmFsdWF0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvblJlcG9ydCB7XG5cbiAgcHJpdmF0ZSByZWFkb25seSB2aW9sYXRpb25zOiBWYWxpZGF0aW9uVmlvbGF0aW9uQ29uc3RydWN0QXdhcmVbXSA9IFtdO1xuXG4gIHByaXZhdGUgX3N1bW1hcnk/OiBWYWxpZGF0aW9uUmVwb3J0U3VtbWFyeTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHBrZzogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgdmVyc2lvbjogc3RyaW5nLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWV0YWRhdGE6IHtyZWFkb25seSBba2V5OiBzdHJpbmddOiBSZXNvdXJjZUNvbnN0cnVjdE1ldGFkYXRhfSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0ZG91dDogYm9vbGVhbikge1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIHZpb2xhdGlvbiB0byB0aGUgcmVwb3J0LlxuICAgKi9cbiAgcHVibGljIGFkZFZpb2xhdGlvbih2aW9sYXRpb246IFZhbGlkYXRpb25WaW9sYXRpb24pIHtcbiAgICBpZiAodGhpcy5fc3VtbWFyeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdWaW9sYXRpb25zIGNhbm5vdCBiZSBhZGRlZCB0byByZXBvcnQgYWZ0ZXIgaXRzIHN1Ym1pdHRlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHZpb2xhdGluZ0NvbnN0cnVjdHM6IFZhbGlkYXRpb25WaW9sYXRpbmdDb25zdHJ1Y3RbXSA9IFtdO1xuXG4gICAgZm9yIChjb25zdCByZXNvdXJjZSBvZiB2aW9sYXRpb24udmlvbGF0aW5nUmVzb3VyY2VzKSB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RQYXRoID0gdGhpcy5tZXRhZGF0YVtyZXNvdXJjZS5yZXNvdXJjZU5hbWVdPy5wYXRoO1xuICAgICAgdmlvbGF0aW5nQ29uc3RydWN0cy5wdXNoKHtcbiAgICAgICAgLi4ucmVzb3VyY2UsXG5cbiAgICAgICAgLy8gYXVnbWVudCB3aXRoIGNvbnN0cnVjdCBtZXRhZGF0YVxuICAgICAgICBjb25zdHJ1Y3RQYXRoOiBjb25zdHJ1Y3RQYXRoLFxuXG4gICAgICAgIC8vIGlmIHN5bnRoIGlzIGV4ZWN1dGVkIHdpdGggLS1zdGRvdXQsIHRoZSBtYW5pZmVzdCBwYXRoXG4gICAgICAgIC8vIGhlcmUgaXMgdGVtcG9yYXJ5IGFuZCB3aWxsIGJlIGRlbGV0ZWQgb25jZSB0aGUgY29tbWFuZCBmaW5pc2hlcy5cbiAgICAgICAgbWFuaWZlc3RQYXRoOiB0aGlzLnN0ZG91dCA/ICdTVERPVVQnIDogcmVzb3VyY2UubWFuaWZlc3RQYXRoLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy52aW9sYXRpb25zLnB1c2goe1xuICAgICAgcnVsZU5hbWU6IHZpb2xhdGlvbi5ydWxlTmFtZSxcbiAgICAgIHJlY29tbWVuZGF0aW9uOiB2aW9sYXRpb24ucmVjb21tZW5kYXRpb24sXG4gICAgICB2aW9sYXRpbmdDb25zdHJ1Y3RzOiB2aW9sYXRpbmdDb25zdHJ1Y3RzLFxuICAgICAgZml4OiB2aW9sYXRpb24uZml4LFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFN1Ym1pdCB0aGUgcmVwb3J0IHdpdGggYSBzdGF0dXMgYW5kIGFkZGl0aW9uYWwgbWV0YWRhdGEuXG4gICAqL1xuICBwdWJsaWMgc3VibWl0KHN0YXR1czogVmFsaWRhdGlvblJlcG9ydFN0YXR1cywgbWV0YWRhdGE/OiB7IHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgdGhpcy5fc3VtbWFyeSA9IHsgc3RhdHVzLCBwbHVnaW46IHRoaXMucGtnLCB2ZXJzaW9uOiB0aGlzLnZlcnNpb24sIG1ldGFkYXRhIH07XG4gIH1cblxuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhlIHJlcG9ydCB3YXMgc3VjY2Vzc2Z1bGwuXG4gICAqL1xuICBwdWJsaWMgZ2V0IHN1Y2Nlc3MoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9zdW1tYXJ5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBkZXRlcm1pbmUgcmVwb3J0IHN0YXR1czogUmVwb3J0IGlzIGluY29tcGxldGUuIENhbGwgXFwncmVwb3J0LnN1Ym1pdFxcJycpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fc3VtbWFyeS5zdGF0dXMgPT09ICdzdWNjZXNzJztcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFuc2Zvcm0gdGhlIHJlcG9ydCB0byBhIHdlbGwgZm9ybWF0dGVkIHRhYmxlIHN0cmluZy5cbiAgICovXG4gIHB1YmxpYyB0b1N0cmluZygpOiBzdHJpbmcge1xuXG4gICAgY29uc3QganNvbiA9IHRoaXMudG9Kc29uKCk7XG4gICAgY29uc3Qgb3V0cHV0ID0gW2pzb24udGl0bGVdO1xuXG4gICAgb3V0cHV0LnB1c2goJy0nLnJlcGVhdChqc29uLnRpdGxlLmxlbmd0aCkpO1xuICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICBvdXRwdXQucHVzaCgnKFN1bW1hcnkpJyk7XG4gICAgb3V0cHV0LnB1c2goJycpO1xuICAgIG91dHB1dC5wdXNoKHRhYmxlKFtcbiAgICAgIFsnU3RhdHVzJywganNvbi5zdW1tYXJ5LnN0YXR1c10sXG4gICAgICBbJ1BsdWdpbicsIGpzb24uc3VtbWFyeS5wbHVnaW5dLFxuICAgICAgWydWZXJzaW9uJywganNvbi5zdW1tYXJ5LnZlcnNpb25dLFxuICAgICAgLi4uT2JqZWN0LmVudHJpZXMoanNvbi5zdW1tYXJ5Lm1ldGFkYXRhID8/IHt9KSxcbiAgICBdKSk7XG5cbiAgICBpZiAoanNvbi52aW9sYXRpb25zKSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgICBvdXRwdXQucHVzaCgnKFZpb2xhdGlvbnMpJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgdmlvbGF0aW9uIG9mIGpzb24udmlvbGF0aW9ucykge1xuICAgICAgY29uc3Qgb2NjdXJyZW5jZXMgPSB2aW9sYXRpb24udmlvbGF0aW5nQ29uc3RydWN0cy5mbGF0TWFwKGMgPT4gYy5sb2NhdGlvbnMpLmxlbmd0aDtcbiAgICAgIGNvbnN0IHRpdGxlID0gcmVzZXQocmVkKGJyaWdodChgJHt2aW9sYXRpb24ucnVsZU5hbWV9ICgke29jY3VycmVuY2VzfSBvY2N1cnJlbmNlcylgKSkpO1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgICAgb3V0cHV0LnB1c2godGl0bGUpO1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgICAgb3V0cHV0LnB1c2goJyAgT2NjdXJyZW5jZXM6Jyk7XG4gICAgICBmb3IgKGNvbnN0IGNvbnN0cnVjdCBvZiB2aW9sYXRpb24udmlvbGF0aW5nQ29uc3RydWN0cykge1xuICAgICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgICAgIG91dHB1dC5wdXNoKGAgICAgLSBDb25zdHJ1Y3QgUGF0aDogJHtjb25zdHJ1Y3QuY29uc3RydWN0UGF0aCA/PyAnTi9BJ31gKTtcbiAgICAgICAgb3V0cHV0LnB1c2goYCAgICAtIE1hbmlmZXN0IFBhdGg6ICR7Y29uc3RydWN0Lm1hbmlmZXN0UGF0aH1gKTtcbiAgICAgICAgb3V0cHV0LnB1c2goYCAgICAtIFJlc291cmNlIE5hbWU6ICR7Y29uc3RydWN0LnJlc291cmNlTmFtZX1gKTtcbiAgICAgICAgaWYgKGNvbnN0cnVjdC5sb2NhdGlvbnMpIHtcbiAgICAgICAgICBvdXRwdXQucHVzaCgnICAgIC0gTG9jYXRpb25zOicpO1xuICAgICAgICAgIGZvciAoY29uc3QgbG9jYXRpb24gb2YgY29uc3RydWN0LmxvY2F0aW9ucykge1xuICAgICAgICAgICAgb3V0cHV0LnB1c2goYCAgICAgID4gJHtsb2NhdGlvbn1gKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICAgIG91dHB1dC5wdXNoKGAgIFJlY29tbWVuZGF0aW9uOiAke3Zpb2xhdGlvbi5yZWNvbW1lbmRhdGlvbn1gKTtcbiAgICAgIG91dHB1dC5wdXNoKGAgIEhvdyB0byBmaXg6ICR7dmlvbGF0aW9uLmZpeH1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0LmpvaW4ob3MuRU9MKTtcblxuICB9XG5cbiAgLyoqXG4gICAqIFRyYW5zZm9ybSB0aGUgcmVwb3J0IGludG8gYSBKU09OIG9iamVjdC5cbiAgICovXG4gIHB1YmxpYyB0b0pzb24oKTogVmFsaWRhdGlvblJlcG9ydEpzb24ge1xuICAgIGlmICghdGhpcy5fc3VtbWFyeSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZGV0ZXJtaW5lIHJlcG9ydCByZXN1bHQ6IFJlcG9ydCBpcyBpbmNvbXBsZXRlLiBDYWxsIFxcJ3JlcG9ydC5zdWJtaXRcXCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIHRpdGxlOiBgVmFsaWRhdGlvbiBSZXBvcnQgKCR7dGhpcy5wa2d9QCR7dGhpcy52ZXJzaW9ufSlgLFxuICAgICAgdmlvbGF0aW9uczogdGhpcy52aW9sYXRpb25zLFxuICAgICAgc3VtbWFyeTogdGhpcy5fc3VtbWFyeSxcbiAgICB9O1xuICB9XG5cbn1cblxuLyoqXG4gKiBVdGlsaXkgY2xhc3MgZm9yIGxvYWRpbmcgdmFsaWRhdGlvbiBwbHVnaW5zLlxuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvblBsdWdpbiB7XG5cbiAgLyoqXG4gICAqIExvYWQgdGhlIHZhbGlkYXRpb24gcGx1Z2luIGFuZCBjcmVhdGUgdGhlIG5lY2Vzc2FyeSBjb250ZXh0IGZvciBpdHMgZXhlY3V0aW9uLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBsb2FkKFxuICAgIHZhbGlkYXRpb246IFZhbGlkYXRpb25Db25maWcsXG4gICAgYXBwOiBTeW50aGVzaXplZEFwcCxcbiAgICBzdGRvdXQ6IGJvb2xlYW4sXG4gICAgcGx1Z2luTWFuYWdlcjogUGx1Z2luTWFuYWdlcik6IHsgcGx1Z2luOiBWYWxpZGF0aW9uOyBjb250ZXh0OiBWYWxpZGF0aW9uQ29udGV4dCB9IHtcblxuICAgIGNvbnN0IHBsdWdpbiA9IHBsdWdpbk1hbmFnZXIubG9hZCh7XG4gICAgICBwa2c6IHZhbGlkYXRpb24ucGFja2FnZSxcbiAgICAgIHZlcnNpb246IHZhbGlkYXRpb24udmVyc2lvbixcbiAgICAgIGNsYXNzOiB2YWxpZGF0aW9uLmNsYXNzLFxuICAgICAgcHJvcGVydGllczogdmFsaWRhdGlvbi5wcm9wZXJ0aWVzLFxuICAgICAgaW5zdGFsbEVudjogdmFsaWRhdGlvbi5pbnN0YWxsRW52LFxuICAgIH0pO1xuXG4gICAgaWYgKHR5cGVvZigocGx1Z2luLmluc3RhbmNlIGFzIGFueSkudmFsaWRhdGUpICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEluc3RhbmNlIG9mIGNsYXNzICcke3ZhbGlkYXRpb24uY2xhc3N9JyBmcm9tIHBhY2thZ2UgJyR7dmFsaWRhdGlvbi5wYWNrYWdlfUAke3ZhbGlkYXRpb24udmVyc2lvbn0nIGlzIG5vdCBhIHZhbGlkYXRpb24gcGx1Z2luLiBBcmUgeW91IHN1cmUgeW91IHNwZWNpZmllZCB0aGUgY29ycmVjdCBjbGFzcz9gKTtcbiAgICB9XG5cbiAgICBjb25zdCBtZXRhZGF0YSA9IGFwcC5jb25zdHJ1Y3RNZXRhZGF0YSA/IHRoaXMubG9hZENvbnN0cnVjdE1ldGFkYXRhKGFwcC5jb25zdHJ1Y3RNZXRhZGF0YSkgOiB7fTtcbiAgICBjb25zdCBjb250ZXh0ID0gbmV3IFZhbGlkYXRpb25Db250ZXh0KGFwcC5tYW5pZmVzdHMsIHBsdWdpbi5wYWNrYWdlLnBrZywgcGx1Z2luLnBhY2thZ2UudmVyc2lvbiwgbWV0YWRhdGEsIHN0ZG91dCk7XG4gICAgcmV0dXJuIHsgcGx1Z2luOiBwbHVnaW4uaW5zdGFuY2UgYXMgVmFsaWRhdGlvbiwgY29udGV4dCB9O1xuXG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBsb2FkQ29uc3RydWN0TWV0YWRhdGEoY29uc3RydWN0TWV0YWRhdGFQYXRoOiBzdHJpbmcpOiB7IHJlYWRvbmx5IFtrZXk6IHN0cmluZ106IFJlc291cmNlQ29uc3RydWN0TWV0YWRhdGEgfSB7XG4gICAgY29uc3QgY29udGVudHMgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYyhjb25zdHJ1Y3RNZXRhZGF0YVBhdGgsIHsgZW5jb2Rpbmc6ICd1dGYtOCcgfSkpO1xuICAgIGNvbnN0IHJlc291cmNlczogeyBba2V5OiBzdHJpbmddOiBSZXNvdXJjZUNvbnN0cnVjdE1ldGFkYXRhIH0gPSB7fTtcbiAgICBpZiAoY29udGVudHMudmVyc2lvbiAhPT0gJzEuMC4wJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHZlcnNpb24gb2YgY29uc3RydWN0IG1ldGFkYXRhIGF0ICR7Y29uc3RydWN0TWV0YWRhdGFQYXRofTogJHtjb250ZW50cy52ZXJzaW9ufS4gU3VwcG9ydGVkIHZlcnNpb25zIGFyZTogWzEuMC4wXWApO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBtZXRhZGF0YV0gb2YgT2JqZWN0LmVudHJpZXMoY29udGVudHMucmVzb3VyY2VzKSkge1xuICAgICAgcmVzb3VyY2VzW25hbWVdID0geyBwYXRoOiAobWV0YWRhdGEgYXMgYW55KS5wYXRoIH07XG4gICAgfVxuICAgIHJldHVybiByZXNvdXJjZXM7XG5cbiAgfVxuXG59XG5cbi8qKlxuICogQ29uc3RydWN0IHJlbGF0ZWQgbWV0YWRhdGEgb24gcmVzb3VyY2VzLlxuICovXG5pbnRlcmZhY2UgUmVzb3VyY2VDb25zdHJ1Y3RNZXRhZGF0YSB7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9mIHRoZSBjb25zdHJ1Y3QgaW4gdGhlIGFwcGxpY2F0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG59XG5cbmZ1bmN0aW9uIHJlc2V0KHM6IHN0cmluZykge1xuICByZXR1cm4gYCR7c31cXHgxYlswbWA7XG59XG5cbmZ1bmN0aW9uIHJlZChzOiBzdHJpbmcpIHtcbiAgcmV0dXJuIGBcXHgxYlszMW0ke3N9YDtcbn1cblxuZnVuY3Rpb24gYnJpZ2h0KHM6IHN0cmluZykge1xuICByZXR1cm4gYFxceDFiWzFtJHtzfWA7XG59Il19
|
package/lib/util.d.ts
CHANGED
|
@@ -1,10 +1,27 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { SpawnOptions } from 'child_process';
|
|
3
|
+
import { ValidationConfig } from './config';
|
|
4
|
+
import { PluginManager } from './plugins/_manager';
|
|
3
5
|
import { SafeReviver } from './reviver';
|
|
4
6
|
export declare function shell(program: string, args?: string[], options?: SpawnOptions): Promise<string>;
|
|
5
7
|
export declare function mkdtemp(closure: (dir: string) => Promise<void>): Promise<void>;
|
|
6
|
-
export declare function synthApp(command: string, outdir: string): Promise<
|
|
8
|
+
export declare function synthApp(command: string, outdir: string, stdout: boolean, metadata: boolean): Promise<SynthesizedApp>;
|
|
9
|
+
export declare function validateApp(app: SynthesizedApp, stdout: boolean, validations: ValidationConfig[], pluginManager: PluginManager, reportsFile?: string): Promise<void>;
|
|
7
10
|
export declare function safeParseJson(text: string, reviver: SafeReviver): any;
|
|
8
11
|
export declare function safeParseYaml(text: string, reviver: SafeReviver): any[];
|
|
9
12
|
export declare function download(url: string): Promise<string>;
|
|
10
|
-
export declare function
|
|
13
|
+
export declare function findManifests(directory: string): Promise<string[]>;
|
|
14
|
+
export declare function findConstructMetadata(directory: string): string | undefined;
|
|
15
|
+
/**
|
|
16
|
+
* Result of synthesizing an application.
|
|
17
|
+
*/
|
|
18
|
+
export interface SynthesizedApp {
|
|
19
|
+
/**
|
|
20
|
+
* The list of manifests produced by the app.
|
|
21
|
+
*/
|
|
22
|
+
readonly manifests: readonly string[];
|
|
23
|
+
/**
|
|
24
|
+
* The construct metadata file (if exists).
|
|
25
|
+
*/
|
|
26
|
+
readonly constructMetadata?: string;
|
|
27
|
+
}
|
package/lib/util.js
CHANGED
|
@@ -23,7 +23,7 @@ var __importStar = (this && this.__importStar) || function (mod) {
|
|
|
23
23
|
return result;
|
|
24
24
|
};
|
|
25
25
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
26
|
-
exports.
|
|
26
|
+
exports.findConstructMetadata = exports.findManifests = exports.download = exports.safeParseYaml = exports.safeParseJson = exports.validateApp = exports.synthApp = exports.mkdtemp = exports.shell = void 0;
|
|
27
27
|
const child_process_1 = require("child_process");
|
|
28
28
|
const fs_1 = require("fs");
|
|
29
29
|
const http = __importStar(require("http"));
|
|
@@ -33,6 +33,7 @@ const path = __importStar(require("path"));
|
|
|
33
33
|
const url_1 = require("url");
|
|
34
34
|
const fs = __importStar(require("fs-extra"));
|
|
35
35
|
const yaml = __importStar(require("yaml"));
|
|
36
|
+
const validation_1 = require("./plugins/validation");
|
|
36
37
|
async function shell(program, args = [], options = {}) {
|
|
37
38
|
var _a;
|
|
38
39
|
const command = `"${program} ${args.join(' ')}" at ${path.resolve((_a = options.cwd) !== null && _a !== void 0 ? _a : '.')}`;
|
|
@@ -63,12 +64,17 @@ async function mkdtemp(closure) {
|
|
|
63
64
|
}
|
|
64
65
|
}
|
|
65
66
|
exports.mkdtemp = mkdtemp;
|
|
66
|
-
async function synthApp(command, outdir) {
|
|
67
|
+
async function synthApp(command, outdir, stdout, metadata) {
|
|
68
|
+
var _a;
|
|
69
|
+
console.log('Synthesizing application');
|
|
67
70
|
await shell(command, [], {
|
|
68
71
|
shell: true,
|
|
69
72
|
env: {
|
|
70
73
|
...process.env,
|
|
71
74
|
CDK8S_OUTDIR: outdir,
|
|
75
|
+
// record metadata so that the validation report
|
|
76
|
+
// has contruct aware context.
|
|
77
|
+
CDK8S_RECORD_CONSTRUCT_METADATA: (_a = process.env.CDK8S_RECORD_CONSTRUCT_METADATA) !== null && _a !== void 0 ? _a : (metadata ? 'true' : 'false'),
|
|
72
78
|
},
|
|
73
79
|
});
|
|
74
80
|
if (!await fs.pathExists(outdir)) {
|
|
@@ -76,18 +82,62 @@ async function synthApp(command, outdir) {
|
|
|
76
82
|
process.exit(1);
|
|
77
83
|
}
|
|
78
84
|
let found = false;
|
|
79
|
-
const yamlFiles = await
|
|
85
|
+
const yamlFiles = await findManifests(outdir);
|
|
80
86
|
if (yamlFiles === null || yamlFiles === void 0 ? void 0 : yamlFiles.length) {
|
|
81
|
-
|
|
82
|
-
|
|
87
|
+
if (!stdout) {
|
|
88
|
+
for (const yamlFile of yamlFiles) {
|
|
89
|
+
console.log(` - ${yamlFile}`);
|
|
90
|
+
}
|
|
83
91
|
}
|
|
84
92
|
found = true;
|
|
85
93
|
}
|
|
86
94
|
if (!found) {
|
|
87
95
|
console.error('No manifests synthesized');
|
|
88
96
|
}
|
|
97
|
+
const constructMetadata = findConstructMetadata(outdir);
|
|
98
|
+
return { manifests: yamlFiles, constructMetadata };
|
|
89
99
|
}
|
|
90
100
|
exports.synthApp = synthApp;
|
|
101
|
+
async function validateApp(app, stdout, validations, pluginManager, reportsFile) {
|
|
102
|
+
const validators = [];
|
|
103
|
+
for (const validation of validations) {
|
|
104
|
+
const { plugin, context } = validation_1.ValidationPlugin.load(validation, app, stdout, pluginManager);
|
|
105
|
+
validators.push({ plugin, context });
|
|
106
|
+
}
|
|
107
|
+
const reports = [];
|
|
108
|
+
let success = true;
|
|
109
|
+
console.log('Performing validations');
|
|
110
|
+
for (const validator of validators) {
|
|
111
|
+
await validator.plugin.validate(validator.context);
|
|
112
|
+
const report = validator.context.report;
|
|
113
|
+
success = success && report.success;
|
|
114
|
+
reports.push(report);
|
|
115
|
+
}
|
|
116
|
+
console.log('Validations finished');
|
|
117
|
+
// now we can print them. we don't incrementally print
|
|
118
|
+
// so to not clutter the terminal in case of errors.
|
|
119
|
+
for (const report of reports) {
|
|
120
|
+
console.log('');
|
|
121
|
+
console.log(report.toString());
|
|
122
|
+
console.log('');
|
|
123
|
+
}
|
|
124
|
+
if (reportsFile) {
|
|
125
|
+
if (fs.existsSync(reportsFile)) {
|
|
126
|
+
throw new Error(`Unable to write validation reports file. Already exists: ${reportsFile}`);
|
|
127
|
+
}
|
|
128
|
+
// write the reports in JSON to a file
|
|
129
|
+
fs.writeFileSync(reportsFile, JSON.stringify({
|
|
130
|
+
reports: reports.map(r => r.toJson()),
|
|
131
|
+
}, null, 2));
|
|
132
|
+
}
|
|
133
|
+
// exit with failure if any report resulted in a failure
|
|
134
|
+
if (!success) {
|
|
135
|
+
console.error('Validation failed. See above reports for details');
|
|
136
|
+
process.exit(2);
|
|
137
|
+
}
|
|
138
|
+
console.log('Validations ended succesfully');
|
|
139
|
+
}
|
|
140
|
+
exports.validateApp = validateApp;
|
|
91
141
|
function safeParseJson(text, reviver) {
|
|
92
142
|
const json = JSON.parse(text);
|
|
93
143
|
reviver.sanitize(json);
|
|
@@ -151,26 +201,32 @@ async function download(url) {
|
|
|
151
201
|
});
|
|
152
202
|
}
|
|
153
203
|
exports.download = download;
|
|
154
|
-
async function
|
|
204
|
+
async function findManifests(directory) {
|
|
155
205
|
// Ensure path is valid
|
|
156
206
|
try {
|
|
157
|
-
await fs_1.promises.access(
|
|
207
|
+
await fs_1.promises.access(directory);
|
|
158
208
|
}
|
|
159
209
|
catch {
|
|
160
210
|
return [];
|
|
161
211
|
}
|
|
162
212
|
// Read Path contents
|
|
163
|
-
const entries = await fs_1.promises.readdir(
|
|
213
|
+
const entries = await fs_1.promises.readdir(directory, { withFileTypes: true });
|
|
164
214
|
// Get files within the current directory
|
|
165
215
|
const files = entries
|
|
166
|
-
.filter(file => (!file.isDirectory() && file.name.endsWith('.
|
|
167
|
-
.map(file => (
|
|
216
|
+
.filter(file => (!file.isDirectory() && file.name.endsWith('.yaml')))
|
|
217
|
+
.map(file => (directory + '/' + file.name));
|
|
168
218
|
// Get sub-folders within the current folder
|
|
169
219
|
const folders = entries.filter(folder => folder.isDirectory());
|
|
170
220
|
for (const folder of folders) {
|
|
171
|
-
files.push(...await
|
|
221
|
+
files.push(...await findManifests(`${directory}/${folder.name}`));
|
|
172
222
|
}
|
|
173
223
|
return files;
|
|
174
224
|
}
|
|
175
|
-
exports.
|
|
176
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQW9EO0FBQ3BELDJCQUE4QjtBQUM5QiwyQ0FBNkI7QUFDN0IsNkNBQStCO0FBQy9CLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsNkJBQTRCO0FBQzVCLDZDQUErQjtBQUMvQiwyQ0FBNkI7QUFHdEIsS0FBSyxVQUFVLEtBQUssQ0FBQyxPQUFlLEVBQUUsT0FBaUIsRUFBRSxFQUFFLFVBQXdCLEVBQUc7O0lBQzNGLE1BQU0sT0FBTyxHQUFHLElBQUksT0FBTyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFBLE9BQU8sQ0FBQyxHQUFHLG1DQUFJLEdBQUcsQ0FBQyxFQUFFLENBQUM7SUFDeEYsT0FBTyxJQUFJLE9BQU8sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRTs7UUFDNUIsTUFBTSxLQUFLLEdBQUcsSUFBQSxxQkFBSyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsRUFBRSxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxFQUFFLENBQUMsQ0FBQztRQUMxRixNQUFNLElBQUksR0FBRyxJQUFJLEtBQUssRUFBVSxDQUFDO1FBQ2pDLE1BQUEsS0FBSyxDQUFDLE1BQU0sMENBQUUsRUFBRSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUVwRCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxXQUFXLE9BQU8sWUFBWSxHQUFHLEVBQUUsQ0FBQyxD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QUMsQ0FBQztTQUN4RSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFN0MsNENBQTRDO0lBQzVDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUUvRCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtRQUM1QixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxRQUFRLENBQUMsR0FBRyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztLQUM3RDtJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQXhCRCw0QkF3QkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBzcGF3biwgU3Bhd25PcHRpb25zIH0gZnJvbSAnY2hpbGRfcHJvY2Vzcyc7XG5pbXBvcnQgeyBwcm9taXNlcyB9IGZyb20gJ2ZzJztcbmltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgKiBhcyBodHRwcyBmcm9tICdodHRwcyc7XG5pbXBvcnQgKiBhcyBvcyBmcm9tICdvcyc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgcGFyc2UgfSBmcm9tICd1cmwnO1xuaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMtZXh0cmEnO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tICd5YW1sJztcbmltcG9ydCB7IFNhZmVSZXZpdmVyIH0gZnJvbSAnLi9yZXZpdmVyJztcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHNoZWxsKHByb2dyYW06IHN0cmluZywgYXJnczogc3RyaW5nW10gPSBbXSwgb3B0aW9uczogU3Bhd25PcHRpb25zID0geyB9KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgY29tbWFuZCA9IGBcIiR7cHJvZ3JhbX0gJHthcmdzLmpvaW4oJyAnKX1cIiBhdCAke3BhdGgucmVzb2x2ZShvcHRpb25zLmN3ZCA/PyAnLicpfWA7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgob2ssIGtvKSA9PiB7XG4gICAgY29uc3QgY2hpbGQgPSBzcGF3bihwcm9ncmFtLCBhcmdzLCB7IHN0ZGlvOiBbJ2luaGVyaXQnLCAncGlwZScsICdpbmhlcml0J10sIC4uLm9wdGlvbnMgfSk7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBBcnJheTxCdWZmZXI+KCk7XG4gICAgY2hpbGQuc3Rkb3V0Py5vbignZGF0YScsIGNodW5rID0+IGRhdGEucHVzaChjaHVuaykpO1xuXG4gICAgY2hpbGQub25jZSgnZXJyb3InLCBlcnIgPT4ga28obmV3IEVycm9yKGBjb21tYW5kICR7Y29tbWFuZH0gZmFpbGVkOiAke2Vycn1gKSkpO1xuICAgIGNoaWxkLm9uY2UoJ2V4aXQnLCBjb2RlID0+IHtcbiAgICAgIGlmIChjb2RlID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvayhCdWZmZXIuY29uY2F0KGRhdGEpLnRvU3RyaW5nKCd1dGYtOCcpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBrbyhuZXcgRXJyb3IoYGNvbW1hbmQgJHtjb21tYW5kfSByZXR1cm5lZCBhIG5vbi16ZXJvIGV4aXQgY29kZSAke2NvZGV9YCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIG1rZHRlbXAoY2xvc3VyZTogKGRpcjogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+KSB7XG4gIGNvbnN0IHdvcmtkaXIgPSBhd2FpdCBmcy5ta2R0ZW1wKHBhdGguam9pbihvcy50bXBkaXIoKSwgJ2NkazhzLScpKTtcbiAgdHJ5IHtcbiAgICBhd2FpdCBjbG9zdXJlKHdvcmtkaXIpO1xuICB9IGZpbmFsbHkge1xuICAgIGF3YWl0IGZzLnJlbW92ZSh3b3JrZGlyKTtcbiAgfVxufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc3ludGhBcHAoY29tbWFuZDogc3RyaW5nLCBvdXRkaXI6IHN0cmluZykge1xuICBhd2FpdCBzaGVsbChjb21tYW5kLCBbXSwge1xuICAgIHNoZWxsOiB0cnVlLFxuICAgIGVudjoge1xuICAgICAgLi4ucHJvY2Vzcy5lbnYsXG4gICAgICBDREs4U19PVVRESVI6IG91dGRpcixcbiAgICB9LFxuICB9KTtcblxuICBpZiAoIWF3YWl0IGZzLnBhdGhFeGlzdHMob3V0ZGlyKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVSUk9SOiBzeW50aGVzaXMgZmFpbGVkLCBhcHAgZXhwZWN0ZWQgdG8gY3JlYXRlIFwiJHtvdXRkaXJ9XCJgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgY29uc3QgeWFtbEZpbGVzID0gYXdhaXQgZ2V0RmlsZXMob3V0ZGlyKTtcbiAgaWYgKHlhbWxGaWxlcz8ubGVuZ3RoKSB7XG4gICAgZm9yIChjb25zdCB5YW1sRmlsZSBvZiB5YW1sRmlsZXMpIHtcbiAgICAgIGNvbnNvbGUubG9nKHlhbWxGaWxlKTtcbiAgICB9XG4gICAgZm91bmQgPSB0cnVlO1xuICB9XG5cbiAgaWYgKCFmb3VuZCkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ05vIG1hbmlmZXN0cyBzeW50aGVzaXplZCcpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYWZlUGFyc2VKc29uKHRleHQ6IHN0cmluZywgcmV2aXZlcjogU2FmZVJldml2ZXIpOiBhbnkge1xuICBjb25zdCBqc29uID0gSlNPTi5wYXJzZSh0ZXh0KTtcbiAgcmV2aXZlci5zYW5pdGl6ZShqc29uKTtcbiAgcmV0dXJuIGpzb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzYWZlUGFyc2VZYW1sKHRleHQ6IHN0cmluZywgcmV2aXZlcjogU2FmZVJldml2ZXIpOiBhbnlbXSB7XG5cbiAgLy8gcGFyc2VBbGxEb2N1bWVudHMgZG9lc250IGFjY2VwdCBhIHJldml2ZXJcbiAgLy8gc28gd2UgZmlyc3QgcGFyc2Ugbm9ybWFsbHkgYW5kIHRoYW4gdHJhbnNmb3JtXG4gIC8vIHRvIEpTIHVzaW5nIHRoZSByZXZpdmVyLlxuICBjb25zdCBwYXJzZWQgPSB5YW1sLnBhcnNlQWxsRG9jdW1lbnRzKHRleHQpO1xuICBjb25zdCBkb2NzID0gW107XG4gIGZvciAoY29uc3QgZG9jIG9mIHBhcnNlZCkge1xuICAgIGNvbnN0IGpzb24gPSBkb2MudG9KUygpO1xuICAgIHJldml2ZXIuc2FuaXRpemUoanNvbik7XG4gICAgZG9jcy5wdXNoKGpzb24pO1xuICB9XG4gIHJldHVybiBkb2NzO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZG93bmxvYWQodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICBsZXQgY2xpZW50OiB0eXBlb2YgaHR0cCB8IHR5cGVvZiBodHRwcztcbiAgY29uc3QgcHJvdG8gPSBwYXJzZSh1cmwpLnByb3RvY29sO1xuXG4gIGlmICghcHJvdG8gfHwgcHJvdG8gPT09ICdmaWxlOicpIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGUodXJsLCAndXRmLTgnKTtcbiAgfVxuXG4gIHN3aXRjaCAocHJvdG8pIHtcbiAgICBjYXNlICdodHRwczonOlxuICAgICAgY2xpZW50ID0gaHR0cHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2h0dHA6JzpcbiAgICAgIGNsaWVudCA9IGh0dHA7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHByb3RvY29sICR7cHJvdG99YCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKG9rLCBrbykgPT4ge1xuICAgIGNvbnN0IHJlcSA9IGNsaWVudC5nZXQodXJsLCByZXMgPT4ge1xuICAgICAgc3dpdGNoIChyZXMuc3RhdHVzQ29kZSkge1xuICAgICAgICBjYXNlIDIwMDoge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgQXJyYXk8QnVmZmVyPigpO1xuICAgICAgICAgIHJlcy5vbignZGF0YScsIGNodW5rID0+IGRhdGEucHVzaChjaHVuaykpO1xuICAgICAgICAgIHJlcy5vbmNlKCdlbmQnLCAoKSA9PiBvayhCdWZmZXIuY29uY2F0KGRhdGEpLnRvU3RyaW5nKCd1dGYtOCcpKSk7XG4gICAgICAgICAgcmVzLm9uY2UoJ2Vycm9yJywga28pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAzMDE6XG4gICAgICAgIGNhc2UgMzAyOiB7XG4gICAgICAgICAgaWYgKHJlcy5oZWFkZXJzLmxvY2F0aW9uKSB7XG4gICAgICAgICAgICBvayhkb3dubG9hZChyZXMuaGVhZGVycy5sb2NhdGlvbikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBrbyhuZXcgRXJyb3IoYCR7cmVzLnN0YXR1c01lc3NhZ2V9OiAke3VybH1gKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlcS5vbmNlKCdlcnJvcicsIGtvKTtcbiAgICByZXEuZW5kKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RmlsZXMoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgLy8gRW5zdXJlIHBhdGggaXMgdmFsaWRcbiAgdHJ5IHtcbiAgICBhd2FpdCBwcm9taXNlcy5hY2Nlc3MoZmlsZVBhdGgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICAvLyBSZWFkIFBhdGggY29udGVudHNcbiAgY29uc3QgZW50cmllcyA9IGF3YWl0IHByb21pc2VzLnJlYWRkaXIoZmlsZVBhdGgsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcblxuICAvLyBHZXQgZmlsZXMgd2l0aGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeVxuICBjb25zdCBmaWxlcyA9IGVudHJpZXNcbiAgICAuZmlsdGVyKGZpbGUgPT4gKCFmaWxlLmlzRGlyZWN0b3J5KCkgJiYgZmlsZS5uYW1lLmVuZHNXaXRoKCcuazhzLnlhbWwnKSkpXG4gICAgLm1hcChmaWxlID0+IChmaWxlUGF0aCArICcvJyArIGZpbGUubmFtZSkpO1xuXG4gIC8vIEdldCBzdWItZm9sZGVycyB3aXRoaW4gdGhlIGN1cnJlbnQgZm9sZGVyXG4gIGNvbnN0IGZvbGRlcnMgPSBlbnRyaWVzLmZpbHRlcihmb2xkZXIgPT4gZm9sZGVyLmlzRGlyZWN0b3J5KCkpO1xuXG4gIGZvciAoY29uc3QgZm9sZGVyIG9mIGZvbGRlcnMpIHtcbiAgICBmaWxlcy5wdXNoKC4uLmF3YWl0IGdldEZpbGVzKGAke2ZpbGVQYXRofS8ke2ZvbGRlci5uYW1lfWApKTtcbiAgfVxuXG4gIHJldHVybiBmaWxlcztcbn0iXX0=
|
|
225
|
+
exports.findManifests = findManifests;
|
|
226
|
+
function findConstructMetadata(directory) {
|
|
227
|
+
// this file is optionally created during synthesis
|
|
228
|
+
const p = path.join(directory, 'construct-metadata.json');
|
|
229
|
+
return fs.existsSync(p) ? p : undefined;
|
|
230
|
+
}
|
|
231
|
+
exports.findConstructMetadata = findConstructMetadata;
|
|
232
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsaURBQW9EO0FBQ3BELDJCQUE4QjtBQUM5QiwyQ0FBNkI7QUFDN0IsNkNBQStCO0FBQy9CLHVDQUF5QjtBQUN6QiwyQ0FBNkI7QUFDN0IsNkJBQTRCO0FBQzVCLDZDQUErQjtBQUMvQiwyQ0FBNkI7QUFHN0IscURBQXlHO0FBR2xHLEtBQUssVUFBVSxLQUFLLENBQUMsT0FBZSxFQUFFLE9BQWlCLEVBQUUsRUFBRSxVQUF3QixFQUFHOztJQUMzRixNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBQSxPQUFPLENBQUMsR0FBRyxtQ0FBSSxHQUFHLENBQUMsRUFBRSxDQUFDO0lBQ3hGLE9BQU8sSUFBSSxPQUFPLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUU7O1FBQzVCLE1BQU0sS0FBSyxHQUFHLElBQUEscUJBQUssRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsRUFBRSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDMUYsTUFBTSxJQUFJLEdBQUcsSUFBSSxLQUFLLEVBQVUsQ0FBQztRQUNqQyxNQUFBLEtBQUssQ0FBQyxNQUFNLDBDQUFFLEVBQUUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFFcEQsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsV0FBVyxPQUFPLFlBQVksR0FB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QUNwRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFOUMsNENBQTRDO0lBQzVDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztJQUUvRCxLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtRQUM1QixLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsTUFBTSxhQUFhLENBQUMsR0FBRyxTQUFTLElBQUksTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNuRTtJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQXhCRCxzQ0F3QkM7QUFFRCxTQUFnQixxQkFBcUIsQ0FBQyxTQUFpQjtJQUNyRCxtREFBbUQ7SUFDbkQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUseUJBQXlCLENBQUMsQ0FBQztJQUMxRCxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzFDLENBQUM7QUFKRCxzREFJQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHNwYXduLCBTcGF3bk9wdGlvbnMgfSBmcm9tICdjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IHByb21pc2VzIH0gZnJvbSAnZnMnO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJztcbmltcG9ydCAqIGFzIG9zIGZyb20gJ29zJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBwYXJzZSB9IGZyb20gJ3VybCc7XG5pbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyB5YW1sIGZyb20gJ3lhbWwnO1xuaW1wb3J0IHsgVmFsaWRhdGlvbkNvbmZpZyB9IGZyb20gJy4vY29uZmlnJztcbmltcG9ydCB7IFBsdWdpbk1hbmFnZXIgfSBmcm9tICcuL3BsdWdpbnMvX21hbmFnZXInO1xuaW1wb3J0IHsgVmFsaWRhdGlvblBsdWdpbiwgVmFsaWRhdGlvbkNvbnRleHQsIFZhbGlkYXRpb25SZXBvcnQsIFZhbGlkYXRpb24gfSBmcm9tICcuL3BsdWdpbnMvdmFsaWRhdGlvbic7XG5pbXBvcnQgeyBTYWZlUmV2aXZlciB9IGZyb20gJy4vcmV2aXZlcic7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBzaGVsbChwcm9ncmFtOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdID0gW10sIG9wdGlvbnM6IFNwYXduT3B0aW9ucyA9IHsgfSk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IGNvbW1hbmQgPSBgXCIke3Byb2dyYW19ICR7YXJncy5qb2luKCcgJyl9XCIgYXQgJHtwYXRoLnJlc29sdmUob3B0aW9ucy5jd2QgPz8gJy4nKX1gO1xuICByZXR1cm4gbmV3IFByb21pc2UoKG9rLCBrbykgPT4ge1xuICAgIGNvbnN0IGNoaWxkID0gc3Bhd24ocHJvZ3JhbSwgYXJncywgeyBzdGRpbzogWydpbmhlcml0JywgJ3BpcGUnLCAnaW5oZXJpdCddLCAuLi5vcHRpb25zIH0pO1xuICAgIGNvbnN0IGRhdGEgPSBuZXcgQXJyYXk8QnVmZmVyPigpO1xuICAgIGNoaWxkLnN0ZG91dD8ub24oJ2RhdGEnLCBjaHVuayA9PiBkYXRhLnB1c2goY2h1bmspKTtcblxuICAgIGNoaWxkLm9uY2UoJ2Vycm9yJywgZXJyID0+IGtvKG5ldyBFcnJvcihgY29tbWFuZCAke2NvbW1hbmR9IGZhaWxlZDogJHtlcnJ9YCkpKTtcbiAgICBjaGlsZC5vbmNlKCdleGl0JywgY29kZSA9PiB7XG4gICAgICBpZiAoY29kZSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb2soQnVmZmVyLmNvbmNhdChkYXRhKS50b1N0cmluZygndXRmLTgnKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ga28obmV3IEVycm9yKGBjb21tYW5kICR7Y29tbWFuZH0gcmV0dXJuZWQgYSBub24temVybyBleGl0IGNvZGUgJHtjb2RlfWApKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBta2R0ZW1wKGNsb3N1cmU6IChkaXI6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPikge1xuICBjb25zdCB3b3JrZGlyID0gYXdhaXQgZnMubWtkdGVtcChwYXRoLmpvaW4ob3MudG1wZGlyKCksICdjZGs4cy0nKSk7XG4gIHRyeSB7XG4gICAgYXdhaXQgY2xvc3VyZSh3b3JrZGlyKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBhd2FpdCBmcy5yZW1vdmUod29ya2Rpcik7XG4gIH1cbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN5bnRoQXBwKGNvbW1hbmQ6IHN0cmluZywgb3V0ZGlyOiBzdHJpbmcsIHN0ZG91dDogYm9vbGVhbiwgbWV0YWRhdGE6IGJvb2xlYW4pOiBQcm9taXNlPFN5bnRoZXNpemVkQXBwPiB7XG4gIGNvbnNvbGUubG9nKCdTeW50aGVzaXppbmcgYXBwbGljYXRpb24nKTtcbiAgYXdhaXQgc2hlbGwoY29tbWFuZCwgW10sIHtcbiAgICBzaGVsbDogdHJ1ZSxcbiAgICBlbnY6IHtcbiAgICAgIC4uLnByb2Nlc3MuZW52LFxuICAgICAgQ0RLOFNfT1VURElSOiBvdXRkaXIsXG4gICAgICAvLyByZWNvcmQgbWV0YWRhdGEgc28gdGhhdCB0aGUgdmFsaWRhdGlvbiByZXBvcnRcbiAgICAgIC8vIGhhcyBjb250cnVjdCBhd2FyZSBjb250ZXh0LlxuICAgICAgQ0RLOFNfUkVDT1JEX0NPTlNUUlVDVF9NRVRBREFUQTogcHJvY2Vzcy5lbnYuQ0RLOFNfUkVDT1JEX0NPTlNUUlVDVF9NRVRBREFUQSA/PyAobWV0YWRhdGEgPyAndHJ1ZScgOiAnZmFsc2UnKSxcbiAgICB9LFxuICB9KTtcblxuICBpZiAoIWF3YWl0IGZzLnBhdGhFeGlzdHMob3V0ZGlyKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoYEVSUk9SOiBzeW50aGVzaXMgZmFpbGVkLCBhcHAgZXhwZWN0ZWQgdG8gY3JlYXRlIFwiJHtvdXRkaXJ9XCJgKTtcbiAgICBwcm9jZXNzLmV4aXQoMSk7XG4gIH1cblxuICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgY29uc3QgeWFtbEZpbGVzID0gYXdhaXQgZmluZE1hbmlmZXN0cyhvdXRkaXIpO1xuICBpZiAoeWFtbEZpbGVzPy5sZW5ndGgpIHtcbiAgICBpZiAoIXN0ZG91dCkge1xuICAgICAgZm9yIChjb25zdCB5YW1sRmlsZSBvZiB5YW1sRmlsZXMpIHtcbiAgICAgICAgY29uc29sZS5sb2coYCAgLSAke3lhbWxGaWxlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICBmb3VuZCA9IHRydWU7XG4gIH1cblxuICBpZiAoIWZvdW5kKSB7XG4gICAgY29uc29sZS5lcnJvcignTm8gbWFuaWZlc3RzIHN5bnRoZXNpemVkJyk7XG4gIH1cblxuICBjb25zdCBjb25zdHJ1Y3RNZXRhZGF0YSA9IGZpbmRDb25zdHJ1Y3RNZXRhZGF0YShvdXRkaXIpO1xuXG4gIHJldHVybiB7IG1hbmlmZXN0czogeWFtbEZpbGVzLCBjb25zdHJ1Y3RNZXRhZGF0YSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdmFsaWRhdGVBcHAoXG4gIGFwcDogU3ludGhlc2l6ZWRBcHAsXG4gIHN0ZG91dDogYm9vbGVhbixcbiAgdmFsaWRhdGlvbnM6IFZhbGlkYXRpb25Db25maWdbXSxcbiAgcGx1Z2luTWFuYWdlcjogUGx1Z2luTWFuYWdlcixcbiAgcmVwb3J0c0ZpbGU/OiBzdHJpbmcpIHtcblxuICBjb25zdCB2YWxpZGF0b3JzOiB7IHBsdWdpbjogVmFsaWRhdGlvbjsgY29udGV4dDogVmFsaWRhdGlvbkNvbnRleHR9W10gPSBbXTtcblxuICBmb3IgKGNvbnN0IHZhbGlkYXRpb24gb2YgdmFsaWRhdGlvbnMpIHtcbiAgICBjb25zdCB7IHBsdWdpbiwgY29udGV4dCB9ID0gVmFsaWRhdGlvblBsdWdpbi5sb2FkKHZhbGlkYXRpb24sIGFwcCwgc3Rkb3V0LCBwbHVnaW5NYW5hZ2VyKTtcbiAgICB2YWxpZGF0b3JzLnB1c2goeyBwbHVnaW4sIGNvbnRleHQgfSk7XG4gIH1cblxuICBjb25zdCByZXBvcnRzOiBWYWxpZGF0aW9uUmVwb3J0W10gPSBbXTtcbiAgbGV0IHN1Y2Nlc3MgPSB0cnVlO1xuXG4gIGNvbnNvbGUubG9nKCdQZXJmb3JtaW5nIHZhbGlkYXRpb25zJyk7XG5cbiAgZm9yIChjb25zdCB2YWxpZGF0b3Igb2YgdmFsaWRhdG9ycykge1xuICAgIGF3YWl0IHZhbGlkYXRvci5wbHVnaW4udmFsaWRhdGUodmFsaWRhdG9yLmNvbnRleHQpO1xuICAgIGNvbnN0IHJlcG9ydCA9IHZhbGlkYXRvci5jb250ZXh0LnJlcG9ydDtcbiAgICBzdWNjZXNzID0gc3VjY2VzcyAmJiByZXBvcnQuc3VjY2VzcztcbiAgICByZXBvcnRzLnB1c2gocmVwb3J0KTtcbiAgfVxuXG4gIGNvbnNvbGUubG9nKCdWYWxpZGF0aW9ucyBmaW5pc2hlZCcpO1xuXG4gIC8vIG5vdyB3ZSBjYW4gcHJpbnQgdGhlbS4gd2UgZG9uJ3QgaW5jcmVtZW50YWxseSBwcmludFxuICAvLyBzbyB0byBub3QgY2x1dHRlciB0aGUgdGVybWluYWwgaW4gY2FzZSBvZiBlcnJvcnMuXG4gIGZvciAoY29uc3QgcmVwb3J0IG9mIHJlcG9ydHMpIHtcbiAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgY29uc29sZS5sb2cocmVwb3J0LnRvU3RyaW5nKCkpO1xuICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgfVxuXG4gIGlmIChyZXBvcnRzRmlsZSkge1xuXG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocmVwb3J0c0ZpbGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byB3cml0ZSB2YWxpZGF0aW9uIHJlcG9ydHMgZmlsZS4gQWxyZWFkeSBleGlzdHM6ICR7cmVwb3J0c0ZpbGV9YCk7XG4gICAgfVxuICAgIC8vIHdyaXRlIHRoZSByZXBvcnRzIGluIEpTT04gdG8gYSBmaWxlXG4gICAgZnMud3JpdGVGaWxlU3luYyhyZXBvcnRzRmlsZSwgSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgcmVwb3J0czogcmVwb3J0cy5tYXAociA9PiByLnRvSnNvbigpKSxcbiAgICB9LCBudWxsLCAyKSk7XG4gIH1cblxuICAvLyBleGl0IHdpdGggZmFpbHVyZSBpZiBhbnkgcmVwb3J0IHJlc3VsdGVkIGluIGEgZmFpbHVyZVxuICBpZiAoIXN1Y2Nlc3MpIHtcbiAgICBjb25zb2xlLmVycm9yKCdWYWxpZGF0aW9uIGZhaWxlZC4gU2VlIGFib3ZlIHJlcG9ydHMgZm9yIGRldGFpbHMnKTtcbiAgICBwcm9jZXNzLmV4aXQoMik7XG4gIH1cblxuICBjb25zb2xlLmxvZygnVmFsaWRhdGlvbnMgZW5kZWQgc3VjY2VzZnVsbHknKTtcblxufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FmZVBhcnNlSnNvbih0ZXh0OiBzdHJpbmcsIHJldml2ZXI6IFNhZmVSZXZpdmVyKTogYW55IHtcbiAgY29uc3QganNvbiA9IEpTT04ucGFyc2UodGV4dCk7XG4gIHJldml2ZXIuc2FuaXRpemUoanNvbik7XG4gIHJldHVybiBqc29uO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2FmZVBhcnNlWWFtbCh0ZXh0OiBzdHJpbmcsIHJldml2ZXI6IFNhZmVSZXZpdmVyKTogYW55W10ge1xuXG4gIC8vIHBhcnNlQWxsRG9jdW1lbnRzIGRvZXNudCBhY2NlcHQgYSByZXZpdmVyXG4gIC8vIHNvIHdlIGZpcnN0IHBhcnNlIG5vcm1hbGx5IGFuZCB0aGFuIHRyYW5zZm9ybVxuICAvLyB0byBKUyB1c2luZyB0aGUgcmV2aXZlci5cbiAgY29uc3QgcGFyc2VkID0geWFtbC5wYXJzZUFsbERvY3VtZW50cyh0ZXh0KTtcbiAgY29uc3QgZG9jcyA9IFtdO1xuICBmb3IgKGNvbnN0IGRvYyBvZiBwYXJzZWQpIHtcbiAgICBjb25zdCBqc29uID0gZG9jLnRvSlMoKTtcbiAgICByZXZpdmVyLnNhbml0aXplKGpzb24pO1xuICAgIGRvY3MucHVzaChqc29uKTtcbiAgfVxuICByZXR1cm4gZG9jcztcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRvd25sb2FkKHVybDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcblxuICBsZXQgY2xpZW50OiB0eXBlb2YgaHR0cCB8IHR5cGVvZiBodHRwcztcbiAgY29uc3QgcHJvdG8gPSBwYXJzZSh1cmwpLnByb3RvY29sO1xuXG4gIGlmICghcHJvdG8gfHwgcHJvdG8gPT09ICdmaWxlOicpIHtcbiAgICByZXR1cm4gZnMucmVhZEZpbGUodXJsLCAndXRmLTgnKTtcbiAgfVxuXG4gIHN3aXRjaCAocHJvdG8pIHtcbiAgICBjYXNlICdodHRwczonOlxuICAgICAgY2xpZW50ID0gaHR0cHM7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2h0dHA6JzpcbiAgICAgIGNsaWVudCA9IGh0dHA7XG4gICAgICBicmVhaztcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuc3VwcG9ydGVkIHByb3RvY29sICR7cHJvdG99YCk7XG4gIH1cblxuICByZXR1cm4gbmV3IFByb21pc2UoKG9rLCBrbykgPT4ge1xuICAgIGNvbnN0IHJlcSA9IGNsaWVudC5nZXQodXJsLCByZXMgPT4ge1xuICAgICAgc3dpdGNoIChyZXMuc3RhdHVzQ29kZSkge1xuICAgICAgICBjYXNlIDIwMDoge1xuICAgICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgQXJyYXk8QnVmZmVyPigpO1xuICAgICAgICAgIHJlcy5vbignZGF0YScsIGNodW5rID0+IGRhdGEucHVzaChjaHVuaykpO1xuICAgICAgICAgIHJlcy5vbmNlKCdlbmQnLCAoKSA9PiBvayhCdWZmZXIuY29uY2F0KGRhdGEpLnRvU3RyaW5nKCd1dGYtOCcpKSk7XG4gICAgICAgICAgcmVzLm9uY2UoJ2Vycm9yJywga28pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAzMDE6XG4gICAgICAgIGNhc2UgMzAyOiB7XG4gICAgICAgICAgaWYgKHJlcy5oZWFkZXJzLmxvY2F0aW9uKSB7XG4gICAgICAgICAgICBvayhkb3dubG9hZChyZXMuaGVhZGVycy5sb2NhdGlvbikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBrbyhuZXcgRXJyb3IoYCR7cmVzLnN0YXR1c01lc3NhZ2V9OiAke3VybH1gKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJlcS5vbmNlKCdlcnJvcicsIGtvKTtcbiAgICByZXEuZW5kKCk7XG4gIH0pO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZE1hbmlmZXN0cyhkaXJlY3Rvcnk6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgLy8gRW5zdXJlIHBhdGggaXMgdmFsaWRcbiAgdHJ5IHtcbiAgICBhd2FpdCBwcm9taXNlcy5hY2Nlc3MoZGlyZWN0b3J5KTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8gUmVhZCBQYXRoIGNvbnRlbnRzXG4gIGNvbnN0IGVudHJpZXMgPSBhd2FpdCBwcm9taXNlcy5yZWFkZGlyKGRpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXG4gIC8vIEdldCBmaWxlcyB3aXRoaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5XG4gIGNvbnN0IGZpbGVzID0gZW50cmllc1xuICAgIC5maWx0ZXIoZmlsZSA9PiAoIWZpbGUuaXNEaXJlY3RvcnkoKSAmJiBmaWxlLm5hbWUuZW5kc1dpdGgoJy55YW1sJykpKVxuICAgIC5tYXAoZmlsZSA9PiAoZGlyZWN0b3J5ICsgJy8nICsgZmlsZS5uYW1lKSk7XG5cbiAgLy8gR2V0IHN1Yi1mb2xkZXJzIHdpdGhpbiB0aGUgY3VycmVudCBmb2xkZXJcbiAgY29uc3QgZm9sZGVycyA9IGVudHJpZXMuZmlsdGVyKGZvbGRlciA9PiBmb2xkZXIuaXNEaXJlY3RvcnkoKSk7XG5cbiAgZm9yIChjb25zdCBmb2xkZXIgb2YgZm9sZGVycykge1xuICAgIGZpbGVzLnB1c2goLi4uYXdhaXQgZmluZE1hbmlmZXN0cyhgJHtkaXJlY3Rvcnl9LyR7Zm9sZGVyLm5hbWV9YCkpO1xuICB9XG5cbiAgcmV0dXJuIGZpbGVzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmluZENvbnN0cnVjdE1ldGFkYXRhKGRpcmVjdG9yeTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgLy8gdGhpcyBmaWxlIGlzIG9wdGlvbmFsbHkgY3JlYXRlZCBkdXJpbmcgc3ludGhlc2lzXG4gIGNvbnN0IHAgPSBwYXRoLmpvaW4oZGlyZWN0b3J5LCAnY29uc3RydWN0LW1ldGFkYXRhLmpzb24nKTtcbiAgcmV0dXJuIGZzLmV4aXN0c1N5bmMocCkgPyBwIDogdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqIFJlc3VsdCBvZiBzeW50aGVzaXppbmcgYW4gYXBwbGljYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3ludGhlc2l6ZWRBcHAge1xuXG4gIC8qKlxuICAgKiBUaGUgbGlzdCBvZiBtYW5pZmVzdHMgcHJvZHVjZWQgYnkgdGhlIGFwcC5cbiAgICovXG4gIHJlYWRvbmx5IG1hbmlmZXN0czogcmVhZG9ubHkgc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFRoZSBjb25zdHJ1Y3QgbWV0YWRhdGEgZmlsZSAoaWYgZXhpc3RzKS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnN0cnVjdE1ldGFkYXRhPzogc3RyaW5nO1xufSJdfQ==
|
package/package.json
CHANGED
|
@@ -41,11 +41,12 @@
|
|
|
41
41
|
"organization": false
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
|
-
"@cdk8s/projen-common": "^0.0.
|
|
44
|
+
"@cdk8s/projen-common": "^0.0.102",
|
|
45
45
|
"@types/fs-extra": "^8",
|
|
46
46
|
"@types/glob": "^7.2.0",
|
|
47
47
|
"@types/jest": "^26.0.24",
|
|
48
48
|
"@types/json-schema": "^7.0.11",
|
|
49
|
+
"@types/semver": "^7.3.12",
|
|
49
50
|
"@typescript-eslint/eslint-plugin": "^5",
|
|
50
51
|
"@typescript-eslint/parser": "^5",
|
|
51
52
|
"eslint": "^8",
|
|
@@ -57,7 +58,7 @@
|
|
|
57
58
|
"jest-junit": "^13",
|
|
58
59
|
"json-schema": "^0.4.0",
|
|
59
60
|
"npm-check-updates": "^15",
|
|
60
|
-
"projen": "^0.62.
|
|
61
|
+
"projen": "^0.62.26",
|
|
61
62
|
"standard-version": "^9",
|
|
62
63
|
"ts-jest": "^27",
|
|
63
64
|
"ts-node": "^10.9.1",
|
|
@@ -65,18 +66,20 @@
|
|
|
65
66
|
"typescript-json-schema": "^0.54.0"
|
|
66
67
|
},
|
|
67
68
|
"dependencies": {
|
|
68
|
-
"@types/node": "^
|
|
69
|
+
"@types/node": "^14",
|
|
69
70
|
"ajv": "^8.11.0",
|
|
70
|
-
"cdk8s": "^2.5.
|
|
71
|
-
"cdk8s-plus-22": "^2.0.0-rc.
|
|
71
|
+
"cdk8s": "^2.5.3",
|
|
72
|
+
"cdk8s-plus-22": "^2.0.0-rc.134",
|
|
72
73
|
"codemaker": "^1.69.0",
|
|
73
74
|
"colors": "1.4.0",
|
|
74
|
-
"constructs": "^10.1.
|
|
75
|
+
"constructs": "^10.1.117",
|
|
75
76
|
"fs-extra": "^8",
|
|
76
77
|
"jsii-pacmak": "^1.69.0",
|
|
77
|
-
"jsii-srcmak": "^0.1.
|
|
78
|
-
"json2jsii": "^0.3.
|
|
78
|
+
"jsii-srcmak": "^0.1.690",
|
|
79
|
+
"json2jsii": "^0.3.137",
|
|
80
|
+
"semver": "^7.3.7",
|
|
79
81
|
"sscaff": "^1.2.274",
|
|
82
|
+
"table": "^6.8.0",
|
|
80
83
|
"yaml": "2.0.0-11",
|
|
81
84
|
"yargs": "^15"
|
|
82
85
|
},
|
|
@@ -92,9 +95,8 @@
|
|
|
92
95
|
"engines": {
|
|
93
96
|
"node": ">= 14.17.0"
|
|
94
97
|
},
|
|
95
|
-
"main": "lib/index.js",
|
|
96
98
|
"license": "Apache-2.0",
|
|
97
|
-
"version": "2.0
|
|
99
|
+
"version": "2.1.0",
|
|
98
100
|
"jest": {
|
|
99
101
|
"testMatch": [
|
|
100
102
|
"<rootDir>/src/**/__tests__/**/*.ts?(x)",
|
|
@@ -137,7 +139,9 @@
|
|
|
137
139
|
}
|
|
138
140
|
}
|
|
139
141
|
},
|
|
140
|
-
"
|
|
142
|
+
"exports": {
|
|
143
|
+
"./plugins": "./lib/plugins/index.js"
|
|
144
|
+
},
|
|
141
145
|
"resolutions": {
|
|
142
146
|
"@types/responselike": "1.0.0",
|
|
143
147
|
"got": "12.3.1"
|