gitlab-ci-local 4.65.1 → 4.66.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/README.md +20 -19
- package/dist/index.js +340 -0
- package/dist/index.js.map +480 -0
- package/package.json +26 -80
- package/src/argv.js +0 -307
- package/src/commander.js +0 -247
- package/src/data-expander.js +0 -220
- package/src/executor.js +0 -104
- package/src/git-data.js +0 -168
- package/src/gitlab-preset.js +0 -24
- package/src/global.js +0 -40
- package/src/handler.js +0 -119
- package/src/index.js +0 -364
- package/src/job.js +0 -1463
- package/src/mutex.js +0 -20
- package/src/parallel.js +0 -46
- package/src/parser-includes.js +0 -387
- package/src/parser.js +0 -357
- package/src/predefined-variables.js +0 -67
- package/src/producers.js +0 -42
- package/src/schema/index.js +0 -19
- package/src/schema/schema.js +0 -3190
- package/src/schema-error.js +0 -114
- package/src/state.js +0 -22
- package/src/utils.js +0 -485
- package/src/validator.js +0 -151
- package/src/variables-from-files.js +0 -143
- package/src/write-streams.js +0 -51
package/src/validator.js
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
import Ajv from "ajv";
|
|
2
|
-
import assert from "assert";
|
|
3
|
-
import chalk from "chalk-template";
|
|
4
|
-
import schema from "./schema/index.js";
|
|
5
|
-
import { betterAjvErrors } from "./schema-error.js";
|
|
6
|
-
import terminalLink from "terminal-link";
|
|
7
|
-
const MAX_ERRORS = 5;
|
|
8
|
-
export class Validator {
|
|
9
|
-
static jsonSchemaValidation({ pathToExpandedGitLabCi, gitLabCiConfig, argv }) {
|
|
10
|
-
const ajv = new Ajv({
|
|
11
|
-
verbose: true,
|
|
12
|
-
allErrors: true,
|
|
13
|
-
allowUnionTypes: true,
|
|
14
|
-
validateFormats: false,
|
|
15
|
-
strictTypes: false, // to suppress the missing types defined in the gitlab-ci json schema
|
|
16
|
-
keywords: ["markdownDescription"],
|
|
17
|
-
});
|
|
18
|
-
const validate = ajv.compile(schema);
|
|
19
|
-
const valid = validate(gitLabCiConfig);
|
|
20
|
-
if (valid)
|
|
21
|
-
return;
|
|
22
|
-
const betterErrors = betterAjvErrors({
|
|
23
|
-
data: gitLabCiConfig,
|
|
24
|
-
errors: validate.errors,
|
|
25
|
-
}).filter(betterError => !argv.ignoreSchemaPaths.includes(betterError.schemaPath));
|
|
26
|
-
let e = "";
|
|
27
|
-
for (let i = 0, len = betterErrors.length; i < len; i++) {
|
|
28
|
-
if (i + 1 > MAX_ERRORS) {
|
|
29
|
-
e += `\t... and ${len - MAX_ERRORS} more`;
|
|
30
|
-
break;
|
|
31
|
-
}
|
|
32
|
-
e += chalk `\t• {redBright ${betterErrors[i].message}} at {blueBright ${betterErrors[i].path}} {grey [${betterErrors[i].schemaPath}]}\n`;
|
|
33
|
-
}
|
|
34
|
-
assert(valid || betterErrors.length == 0, chalk `
|
|
35
|
-
{reset Invalid .gitlab-ci.yml configuration!
|
|
36
|
-
${e.trimEnd()}
|
|
37
|
-
|
|
38
|
-
For further troubleshooting, consider either of the following:
|
|
39
|
-
\t• Copy the content of {blueBright ${terminalLink(".gitlab-ci-local/expanded-gitlab-ci.yml", pathToExpandedGitLabCi)}} to the ${terminalLink("pipeline editor", "https://docs.gitlab.com/ee/ci/pipeline_editor/")} to debug it
|
|
40
|
-
\t• Use --ignore-schema-paths "#/definitions/tags/minItems" --ignore-schema-paths "#/additionalProperties" to partially disable certain validation rule
|
|
41
|
-
\t• Use --json-schema-validation=false to disable schema validation (not recommended)}
|
|
42
|
-
`);
|
|
43
|
-
}
|
|
44
|
-
static needs(jobs, stages) {
|
|
45
|
-
const warnings = [];
|
|
46
|
-
for (const job of jobs) {
|
|
47
|
-
if (job.needs === null || job.needs.length === 0)
|
|
48
|
-
continue;
|
|
49
|
-
for (const [i, need] of job.needs.entries()) {
|
|
50
|
-
if (need.pipeline) {
|
|
51
|
-
warnings.push(`${job.name}.needs[${i}].job:${need.job} ignored, pipeline key not supported`);
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
if (need.project) {
|
|
55
|
-
warnings.push(`${job.name}.needs[${i}] ignored, project key not supported`);
|
|
56
|
-
continue;
|
|
57
|
-
}
|
|
58
|
-
const needJob = jobs.find(j => j.baseName === need.job);
|
|
59
|
-
if (need.optional && !needJob)
|
|
60
|
-
continue;
|
|
61
|
-
assert(needJob != null, chalk `needs: [{blueBright ${need.job}}] for {blueBright ${job.baseName}} could not be found`);
|
|
62
|
-
const needJobStageIndex = stages.indexOf(needJob.stage);
|
|
63
|
-
const jobStageIndex = stages.indexOf(job.stage);
|
|
64
|
-
assert(needJobStageIndex <= jobStageIndex, chalk `needs: [{blueBright ${needJob.name}}] for {blueBright ${job.name}} is in a future stage`);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return warnings;
|
|
68
|
-
}
|
|
69
|
-
static dependencies(jobs, stages) {
|
|
70
|
-
for (const job of jobs) {
|
|
71
|
-
if (job.dependencies === null || job.dependencies.length === 0)
|
|
72
|
-
continue;
|
|
73
|
-
const undefDeps = job.dependencies.filter((j) => !jobs.some(n => n.baseName === j));
|
|
74
|
-
assert(undefDeps.length !== job.dependencies.length, chalk `dependencies: [{blueBright ${undefDeps.join(",")}}] for {blueBright ${job.name}} cannot be found`);
|
|
75
|
-
for (const dep of job.dependencies) {
|
|
76
|
-
const depJob = jobs.find(j => j.baseName === dep);
|
|
77
|
-
assert(depJob != null, chalk `dependencies: [{blueBright ${dep}}] for {blueBright ${job.baseName}} could not be found`);
|
|
78
|
-
const depJobStageIndex = stages.indexOf(depJob.stage);
|
|
79
|
-
const jobStageIndex = stages.indexOf(job.stage);
|
|
80
|
-
assert(depJobStageIndex <= jobStageIndex, chalk `dependencies: [{blueBright ${depJob.name}}] for {blueBright ${job.name}} is in a future stage`);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
static dependenciesContainment(jobs) {
|
|
85
|
-
for (const job of jobs) {
|
|
86
|
-
const needs = job.needs;
|
|
87
|
-
const dependencies = job.dependencies;
|
|
88
|
-
if (needs && needs.length === 0)
|
|
89
|
-
continue;
|
|
90
|
-
if (!dependencies || !needs)
|
|
91
|
-
continue;
|
|
92
|
-
const everyIncluded = dependencies.every((dep) => {
|
|
93
|
-
return needs.some(n => n.job === dep);
|
|
94
|
-
});
|
|
95
|
-
const assertMsg = `${job.formattedJobName} needs: '${needs.map(n => n.job).join(",")}' doesn't fully contain dependencies: '${dependencies.join(",")}'`;
|
|
96
|
-
assert(everyIncluded, assertMsg);
|
|
97
|
-
}
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* These jobs named are reserved keywords in GitLab CI but does not prevent the pipeline from running
|
|
101
|
-
* https://github.com/firecow/gitlab-ci-local/issues/1263
|
|
102
|
-
* @param jobsNames
|
|
103
|
-
* @private
|
|
104
|
-
*/
|
|
105
|
-
static potentialIllegalJobName(jobsNames) {
|
|
106
|
-
const warnings = [];
|
|
107
|
-
for (const jobName of jobsNames) {
|
|
108
|
-
if (new Set(["types", "true", "false", "nil"]).has(jobName)) {
|
|
109
|
-
warnings.push(`Job name "${jobName}" is a reserved keyword. (https://docs.gitlab.com/ee/ci/jobs/#job-name-limitations)`);
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return warnings;
|
|
113
|
-
}
|
|
114
|
-
static scriptBlank(jobs) {
|
|
115
|
-
for (const job of jobs) {
|
|
116
|
-
if (job.trigger)
|
|
117
|
-
continue; // Jobs with trigger are allowed to have empty script
|
|
118
|
-
assert(job.scripts.length > 0, chalk `{blue ${job.name}} has empty script`);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
static arrayOfStrings(jobs) {
|
|
122
|
-
for (const job of jobs) {
|
|
123
|
-
if (job.trigger)
|
|
124
|
-
continue;
|
|
125
|
-
job.beforeScripts.forEach((s) => assert(typeof s === "string", chalk `{blue ${job.name}} before_script contains non string value`));
|
|
126
|
-
job.afterScripts.forEach((s) => assert(typeof s === "string", chalk `{blue ${job.name}} after_script contains non string value`));
|
|
127
|
-
job.scripts.forEach((s) => assert(typeof s === "string", chalk `{blue ${job.name}} script contains non string value`));
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
static async run(jobs, stages) {
|
|
131
|
-
const warnings = [];
|
|
132
|
-
this.scriptBlank(jobs);
|
|
133
|
-
this.arrayOfStrings(jobs);
|
|
134
|
-
warnings.push(...this.needs(jobs, stages));
|
|
135
|
-
this.dependencies(jobs, stages);
|
|
136
|
-
this.dependenciesContainment(jobs);
|
|
137
|
-
warnings.push(...this.potentialIllegalJobName(jobs.map(j => j.baseName)));
|
|
138
|
-
warnings.push(...this.artifacts(jobs));
|
|
139
|
-
return warnings;
|
|
140
|
-
}
|
|
141
|
-
static artifacts(jobs) {
|
|
142
|
-
const warnings = [];
|
|
143
|
-
for (const job of jobs) {
|
|
144
|
-
if (job.artifacts === null) {
|
|
145
|
-
warnings.push(`${job.name}.artifacts is null, ignoring.`);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
return warnings;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidmFsaWRhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sR0FBRyxNQUFNLEtBQUssQ0FBQztBQUV0QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkMsT0FBTyxNQUFNLE1BQU0sbUJBQW1CLENBQUM7QUFDdkMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sWUFBWSxNQUFNLGVBQWUsQ0FBQztBQUd6QyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUM7QUFFckIsTUFBTSxPQUFPLFNBQVM7SUFDbEIsTUFBTSxDQUFDLG9CQUFvQixDQUFFLEVBQUMsc0JBQXNCLEVBQUUsY0FBYyxFQUFFLElBQUksRUFJekU7UUFDRyxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQztZQUNoQixPQUFPLEVBQUUsSUFBSTtZQUNiLFNBQVMsRUFBRSxJQUFJO1lBQ2YsZUFBZSxFQUFFLElBQUk7WUFDckIsZUFBZSxFQUFFLEtBQUs7WUFDdEIsV0FBVyxFQUFFLEtBQUssRUFBRSxxRUFBcUU7WUFDekYsUUFBUSxFQUFFLENBQUMscUJBQXFCLENBQUM7U0FDcEMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdkMsSUFBSSxLQUFLO1lBQUUsT0FBTztRQUNsQixNQUFNLFlBQVksR0FBRyxlQUFlLENBQUM7WUFDakMsSUFBSSxFQUFFLGNBQWM7WUFDcEIsTUFBTSxFQUFFLFFBQVEsQ0FBQyxNQUFNO1NBQzFCLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FB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QUFDO1lBQzlELENBQUM7UUFDTCxDQUFDO1FBQ0QsT0FBTyxRQUFRLENBQUM7SUFDcEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IEFqdiBmcm9tIFwiYWp2XCI7XG5pbXBvcnQge0pvYn0gZnJvbSBcIi4vam9iLmpzXCI7XG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGstdGVtcGxhdGVcIjtcbmltcG9ydCBzY2hlbWEgZnJvbSBcIi4vc2NoZW1hL2luZGV4LmpzXCI7XG5pbXBvcnQge2JldHRlckFqdkVycm9yc30gZnJvbSBcIi4vc2NoZW1hLWVycm9yLmpzXCI7XG5pbXBvcnQgdGVybWluYWxMaW5rIGZyb20gXCJ0ZXJtaW5hbC1saW5rXCI7XG5pbXBvcnQge0FyZ3Z9IGZyb20gXCIuL2FyZ3YuanNcIjtcblxuY29uc3QgTUFYX0VSUk9SUyA9IDU7XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0b3Ige1xuICAgIHN0YXRpYyBqc29uU2NoZW1hVmFsaWRhdGlvbiAoe3BhdGhUb0V4cGFuZGVkR2l0TGFiQ2ksIGdpdExhYkNpQ29uZmlnLCBhcmd2fToge1xuICAgICAgICBwYXRoVG9FeHBhbmRlZEdpdExhYkNpOiBzdHJpbmc7XG4gICAgICAgIGdpdExhYkNpQ29uZmlnOiBvYmplY3Q7XG4gICAgICAgIGFyZ3Y6IEFyZ3Y7XG4gICAgfSkge1xuICAgICAgICBjb25zdCBhanYgPSBuZXcgQWp2KHtcbiAgICAgICAgICAgIHZlcmJvc2U6IHRydWUsXG4gICAgICAgICAgICBhbGxFcnJvcnM6IHRydWUsXG4gICAgICAgICAgICBhbGxvd1VuaW9uVHlwZXM6IHRydWUsXG4gICAgICAgICAgICB2YWxpZGF0ZUZvcm1hdHM6IGZhbHNlLFxuICAgICAgICAgICAgc3RyaWN0VHlwZXM6IGZhbHNlLCAvLyB0byBzdXBwcmVzcyB0aGUgbWlzc2luZyB0eXBlcyBkZWZpbmVkIGluIHRoZSBnaXRsYWItY2kganNvbiBzY2hlbWFcbiAgICAgICAgICAgIGtleXdvcmRzOiBbXCJtYXJrZG93bkRlc2NyaXB0aW9uXCJdLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgdmFsaWRhdGUgPSBhanYuY29tcGlsZShzY2hlbWEpO1xuICAgICAgICBjb25zdCB2YWxpZCA9IHZhbGlkYXRlKGdpdExhYkNpQ29uZmlnKTtcbiAgICAgICAgaWYgKHZhbGlkKSByZXR1cm47XG4gICAgICAgIGNvbnN0IGJldHRlckVycm9ycyA9IGJldHRlckFqdkVycm9ycyh7XG4gICAgICAgICAgICBkYXRhOiBnaXRMYWJDaUNvbmZpZyxcbiAgICAgICAgICAgIGVycm9yczogdmFsaWRhdGUuZXJyb3JzLFxuICAgICAgICB9KS5maWx0ZXIoYmV0dGVyRXJyb3IgPT4gIWFyZ3YuaWdub3JlU2NoZW1hUGF0aHMuaW5jbHVkZXMoYmV0dGVyRXJyb3Iuc2NoZW1hUGF0aCkpO1xuXG4gICAgICAgIGxldCBlOiBzdHJpbmcgPSBcIlwiO1xuICAgICAgICBmb3IgKGxldCBpID0gMCwgbGVuID0gYmV0dGVyRXJyb3JzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoaSArIDEgPiBNQVhfRVJST1JTKSB7XG4gICAgICAgICAgICAgICAgZSArPSBgXFx0Li4uIGFuZCAke2xlbiAtIE1BWF9FUlJPUlN9IG1vcmVgO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZSArPSBjaGFsa2BcXHTigKIge3JlZEJyaWdodCAke2JldHRlckVycm9yc1tpXS5tZXNzYWdlfX0gYXQge2JsdWVCcmlnaHQgJHtiZXR0ZXJFcnJvcnNbaV0ucGF0aH19IHtncmV5IFske2JldHRlckVycm9yc1tpXS5zY2hlbWFQYXRofV19XFxuYDtcbiAgICAgICAgfVxuXG4gICAgICAgIGFzc2VydCh2YWxpZCB8fCBiZXR0ZXJFcnJvcnMubGVuZ3RoID09IDAsIGNoYWxrYFxue3Jlc2V0IEludmFsaWQgLmdpdGxhYi1jaS55bWwgY29uZmlndXJhdGlvbiFcbiR7ZS50cmltRW5kKCl9XG5cbkZvciBmdXJ0aGVyIHRyb3VibGVzaG9vdGluZywgY29uc2lkZXIgZWl0aGVyIG9mIHRoZSBmb2xsb3dpbmc6XG5cXHTigKIgQ29weSB0aGUgY29udGVudCBvZiB7Ymx1ZUJyaWdodCAke3Rlcm1pbmFsTGluayhcIi5naXRsYWItY2ktbG9jYWwvZXhwYW5kZWQtZ2l0bGFiLWNpLnltbFwiLCBwYXRoVG9FeHBhbmRlZEdpdExhYkNpKX19IHRvIHRoZSAke3Rlcm1pbmFsTGluayhcInBpcGVsaW5lIGVkaXRvclwiLCBcImh0dHBzOi8vZG9jcy5naXRsYWIuY29tL2VlL2NpL3BpcGVsaW5lX2VkaXRvci9cIil9IHRvIGRlYnVnIGl0XG5cXHTigKIgVXNlIC0taWdub3JlLXNjaGVtYS1wYXRocyBcIiMvZGVmaW5pdGlvbnMvdGFncy9taW5JdGVtc1wiIC0taWdub3JlLXNjaGVtYS1wYXRocyBcIiMvYWRkaXRpb25hbFByb3BlcnRpZXNcIiB0byBwYXJ0aWFsbHkgZGlzYWJsZSBjZXJ0YWluIHZhbGlkYXRpb24gcnVsZVxuXFx04oCiIFVzZSAtLWpzb24tc2NoZW1hLXZhbGlkYXRpb249ZmFsc2UgdG8gZGlzYWJsZSBzY2hlbWEgdmFsaWRhdGlvbiAobm90IHJlY29tbWVuZGVkKX1cbmApO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIG5lZWRzIChqb2JzOiBSZWFkb25seUFycmF5PEpvYj4sIHN0YWdlczogcmVhZG9ubHkgc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gICAgICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG4gICAgICAgICAgICBpZiAoam9iLm5lZWRzID09PSBudWxsIHx8IGpvYi5uZWVkcy5sZW5ndGggPT09IDApIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtpLCBuZWVkXSBvZiBqb2IubmVlZHMuZW50cmllcygpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWQucGlwZWxpbmUpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaChgJHtqb2IubmFtZX0ubmVlZHNbJHtpfV0uam9iOiR7bmVlZC5qb2J9IGlnbm9yZWQsIHBpcGVsaW5lIGtleSBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobmVlZC5wcm9qZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHdhcm5pbmdzLnB1c2goYCR7am9iLm5hbWV9Lm5lZWRzWyR7aX1dIGlnbm9yZWQsIHByb2plY3Qga2V5IG5vdCBzdXBwb3J0ZWRgKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG5lZWRKb2IgPSBqb2JzLmZpbmQoaiA9PiBqLmJhc2VOYW1lID09PSBuZWVkLmpvYik7XG4gICAgICAgICAgICAgICAgaWYgKG5lZWQub3B0aW9uYWwgJiYgIW5lZWRKb2IpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGFzc2VydChuZWVkSm9iICE9IG51bGwsIGNoYWxrYG5lZWRzOiBbe2JsdWVCcmlnaHQgJHtuZWVkLmpvYn19XSBmb3Ige2JsdWVCcmlnaHQgJHtqb2IuYmFzZU5hbWV9fSBjb3VsZCBub3QgYmUgZm91bmRgKTtcbiAgICAgICAgICAgICAgICBjb25zdCBuZWVkSm9iU3RhZ2VJbmRleCA9IHN0YWdlcy5pbmRleE9mKG5lZWRKb2Iuc3RhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGpvYlN0YWdlSW5kZXggPSBzdGFnZXMuaW5kZXhPZihqb2Iuc3RhZ2UpO1xuICAgICAgICAgICAgICAgIGFzc2VydChuZWVkSm9iU3RhZ2VJbmRleCA8PSBqb2JTdGFnZUluZGV4LCBjaGFsa2BuZWVkczogW3tibHVlQnJpZ2h0ICR7bmVlZEpvYi5uYW1lfX1dIGZvciB7Ymx1ZUJyaWdodCAke2pvYi5uYW1lfX0gaXMgaW4gYSBmdXR1cmUgc3RhZ2VgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YXJuaW5ncztcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBkZXBlbmRlbmNpZXMgKGpvYnM6IFJlYWRvbmx5QXJyYXk8Sm9iPiwgc3RhZ2VzOiByZWFkb25seSBzdHJpbmdbXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG4gICAgICAgICAgICBpZiAoam9iLmRlcGVuZGVuY2llcyA9PT0gbnVsbCB8fCBqb2IuZGVwZW5kZW5jaWVzLmxlbmd0aCA9PT0gMCkgY29udGludWU7XG5cbiAgICAgICAgICAgIGNvbnN0IHVuZGVmRGVwcyA9IGpvYi5kZXBlbmRlbmNpZXMuZmlsdGVyKChqKSA9PiAham9icy5zb21lKG4gPT4gbi5iYXNlTmFtZSA9PT0gaikpO1xuICAgICAgICAgICAgYXNzZXJ0KHVuZGVmRGVwcy5sZW5ndGggIT09IGpvYi5kZXBlbmRlbmNpZXMubGVuZ3RoLCBjaGFsa2BkZXBlbmRlbmNpZXM6IFt7Ymx1ZUJyaWdodCAke3VuZGVmRGVwcy5qb2luKFwiLFwiKX19XSBmb3Ige2JsdWVCcmlnaHQgJHtqb2IubmFtZX19IGNhbm5vdCBiZSBmb3VuZGApO1xuXG4gICAgICAgICAgICBmb3IgKGNvbnN0IGRlcCBvZiBqb2IuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVwSm9iID0gam9icy5maW5kKGogPT4gai5iYXNlTmFtZSA9PT0gZGVwKTtcbiAgICAgICAgICAgICAgICBhc3NlcnQoZGVwSm9iICE9IG51bGwsIGNoYWxrYGRlcGVuZGVuY2llczogW3tibHVlQnJpZ2h0ICR7ZGVwfX1dIGZvciB7Ymx1ZUJyaWdodCAke2pvYi5iYXNlTmFtZX19IGNvdWxkIG5vdCBiZSBmb3VuZGApO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRlcEpvYlN0YWdlSW5kZXggPSBzdGFnZXMuaW5kZXhPZihkZXBKb2Iuc3RhZ2UpO1xuICAgICAgICAgICAgICAgIGNvbnN0IGpvYlN0YWdlSW5kZXggPSBzdGFnZXMuaW5kZXhPZihqb2Iuc3RhZ2UpO1xuICAgICAgICAgICAgICAgIGFzc2VydChkZXBKb2JTdGFnZUluZGV4IDw9IGpvYlN0YWdlSW5kZXgsIGNoYWxrYGRlcGVuZGVuY2llczogW3tibHVlQnJpZ2h0ICR7ZGVwSm9iLm5hbWV9fV0gZm9yIHtibHVlQnJpZ2h0ICR7am9iLm5hbWV9fSBpcyBpbiBhIGZ1dHVyZSBzdGFnZWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgZGVwZW5kZW5jaWVzQ29udGFpbm1lbnQgKGpvYnM6IFJlYWRvbmx5QXJyYXk8Sm9iPikge1xuICAgICAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG4gICAgICAgICAgICBjb25zdCBuZWVkcyA9IGpvYi5uZWVkcztcbiAgICAgICAgICAgIGNvbnN0IGRlcGVuZGVuY2llcyA9IGpvYi5kZXBlbmRlbmNpZXM7XG4gICAgICAgICAgICBpZiAobmVlZHMgJiYgbmVlZHMubGVuZ3RoID09PSAwKSBjb250aW51ZTtcbiAgICAgICAgICAgIGlmICghZGVwZW5kZW5jaWVzIHx8ICFuZWVkcykgY29udGludWU7XG5cblxuICAgICAgICAgICAgY29uc3QgZXZlcnlJbmNsdWRlZCA9IGRlcGVuZGVuY2llcy5ldmVyeSgoZGVwOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmVlZHMuc29tZShuID0+IG4uam9iID09PSBkZXApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBhc3NlcnRNc2cgPSBgJHtqb2IuZm9ybWF0dGVkSm9iTmFtZX0gbmVlZHM6ICcke25lZWRzLm1hcChuID0+IG4uam9iKS5qb2luKFwiLFwiKX0nIGRvZXNuJ3QgZnVsbHkgY29udGFpbiBkZXBlbmRlbmNpZXM6ICcke2RlcGVuZGVuY2llcy5qb2luKFwiLFwiKX0nYDtcbiAgICAgICAgICAgIGFzc2VydChldmVyeUluY2x1ZGVkLCBhc3NlcnRNc2cpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhlc2Ugam9icyBuYW1lZCBhcmUgcmVzZXJ2ZWQga2V5d29yZHMgaW4gR2l0TGFiIENJIGJ1dCBkb2VzIG5vdCBwcmV2ZW50IHRoZSBwaXBlbGluZSBmcm9tIHJ1bm5pbmdcbiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vZmlyZWNvdy9naXRsYWItY2ktbG9jYWwvaXNzdWVzLzEyNjNcbiAgICAgKiBAcGFyYW0gam9ic05hbWVzXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBwcml2YXRlIHN0YXRpYyBwb3RlbnRpYWxJbGxlZ2FsSm9iTmFtZSAoam9ic05hbWVzOiBzdHJpbmdbXSkge1xuICAgICAgICBjb25zdCB3YXJuaW5ncyA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IGpvYk5hbWUgb2Ygam9ic05hbWVzKSB7XG4gICAgICAgICAgICBpZiAobmV3IFNldChbXCJ0eXBlc1wiLCBcInRydWVcIiwgXCJmYWxzZVwiLCBcIm5pbFwiXSkuaGFzKGpvYk5hbWUpKSB7XG4gICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaChgSm9iIG5hbWUgXCIke2pvYk5hbWV9XCIgaXMgYSByZXNlcnZlZCBrZXl3b3JkLiAoaHR0cHM6Ly9kb2NzLmdpdGxhYi5jb20vZWUvY2kvam9icy8jam9iLW5hbWUtbGltaXRhdGlvbnMpYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHdhcm5pbmdzO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RhdGljIHNjcmlwdEJsYW5rIChqb2JzOiBSZWFkb25seUFycmF5PEpvYj4pIHtcbiAgICAgICAgZm9yIChjb25zdCBqb2Igb2Ygam9icykge1xuICAgICAgICAgICAgaWYgKGpvYi50cmlnZ2VyKSBjb250aW51ZTsgLy8gSm9icyB3aXRoIHRyaWdnZXIgYXJlIGFsbG93ZWQgdG8gaGF2ZSBlbXB0eSBzY3JpcHRcbiAgICAgICAgICAgIGFzc2VydChqb2Iuc2NyaXB0cy5sZW5ndGggPiAwLCBjaGFsa2B7Ymx1ZSAke2pvYi5uYW1lfX0gaGFzIGVtcHR5IHNjcmlwdGApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXJyYXlPZlN0cmluZ3MgKGpvYnM6IFJlYWRvbmx5QXJyYXk8Sm9iPikge1xuICAgICAgICBmb3IgKGNvbnN0IGpvYiBvZiBqb2JzKSB7XG4gICAgICAgICAgICBpZiAoam9iLnRyaWdnZXIpIGNvbnRpbnVlO1xuICAgICAgICAgICAgam9iLmJlZm9yZVNjcmlwdHMuZm9yRWFjaCgoczogYW55KSA9PiBhc3NlcnQodHlwZW9mIHMgPT09IFwic3RyaW5nXCIsIGNoYWxrYHtibHVlICR7am9iLm5hbWV9fSBiZWZvcmVfc2NyaXB0IGNvbnRhaW5zIG5vbiBzdHJpbmcgdmFsdWVgKSk7XG4gICAgICAgICAgICBqb2IuYWZ0ZXJTY3JpcHRzLmZvckVhY2goKHM6IGFueSkgPT4gYXNzZXJ0KHR5cGVvZiBzID09PSBcInN0cmluZ1wiLCBjaGFsa2B7Ymx1ZSAke2pvYi5uYW1lfX0gYWZ0ZXJfc2NyaXB0IGNvbnRhaW5zIG5vbiBzdHJpbmcgdmFsdWVgKSk7XG4gICAgICAgICAgICBqb2Iuc2NyaXB0cy5mb3JFYWNoKChzOiBhbnkpID0+IGFzc2VydCh0eXBlb2YgcyA9PT0gXCJzdHJpbmdcIiwgY2hhbGtge2JsdWUgJHtqb2IubmFtZX19IHNjcmlwdCBjb250YWlucyBub24gc3RyaW5nIHZhbHVlYCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIGFzeW5jIHJ1biAoam9iczogUmVhZG9ubHlBcnJheTxKb2I+LCBzdGFnZXM6IHJlYWRvbmx5IHN0cmluZ1tdKSB7XG4gICAgICAgIGNvbnN0IHdhcm5pbmdzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLnNjcmlwdEJsYW5rKGpvYnMpO1xuICAgICAgICB0aGlzLmFycmF5T2ZTdHJpbmdzKGpvYnMpO1xuICAgICAgICB3YXJuaW5ncy5wdXNoKC4uLnRoaXMubmVlZHMoam9icywgc3RhZ2VzKSk7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzKGpvYnMsIHN0YWdlcyk7XG4gICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzQ29udGFpbm1lbnQoam9icyk7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goLi4udGhpcy5wb3RlbnRpYWxJbGxlZ2FsSm9iTmFtZShqb2JzLm1hcChqID0+IGouYmFzZU5hbWUpKSk7XG4gICAgICAgIHdhcm5pbmdzLnB1c2goLi4udGhpcy5hcnRpZmFjdHMoam9icykpO1xuICAgICAgICByZXR1cm4gd2FybmluZ3M7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzdGF0aWMgYXJ0aWZhY3RzIChqb2JzOiBSZWFkb25seUFycmF5PEpvYj4pIHtcbiAgICAgICAgY29uc3Qgd2FybmluZ3M6IHN0cmluZ1tdID0gW107XG4gICAgICAgIGZvciAoY29uc3Qgam9iIG9mIGpvYnMpIHtcbiAgICAgICAgICAgIGlmIChqb2IuYXJ0aWZhY3RzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgd2FybmluZ3MucHVzaChgJHtqb2IubmFtZX0uYXJ0aWZhY3RzIGlzIG51bGwsIGlnbm9yaW5nLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YXJuaW5ncztcbiAgICB9XG59XG4iXX0=
|
|
@@ -1,143 +0,0 @@
|
|
|
1
|
-
import fs from "fs-extra";
|
|
2
|
-
import * as yaml from "js-yaml";
|
|
3
|
-
import chalk from "chalk-template";
|
|
4
|
-
import assert from "assert";
|
|
5
|
-
import { Utils } from "./utils.js";
|
|
6
|
-
import dotenv from "dotenv";
|
|
7
|
-
import deepExtend from "deep-extend";
|
|
8
|
-
export class VariablesFromFiles {
|
|
9
|
-
static async init(argv, writeStreams, gitData) {
|
|
10
|
-
const cwd = argv.cwd;
|
|
11
|
-
const stateDir = argv.stateDir;
|
|
12
|
-
const homeDir = argv.home;
|
|
13
|
-
const remoteVariables = argv.remoteVariables;
|
|
14
|
-
const autoCompleting = argv.autoCompleting;
|
|
15
|
-
const homeVariablesFile = `${homeDir}/${stateDir}/variables.yml`;
|
|
16
|
-
const variables = {};
|
|
17
|
-
let remoteFileData = {};
|
|
18
|
-
let homeFileData = {};
|
|
19
|
-
if (remoteVariables && !autoCompleting) {
|
|
20
|
-
for (let i = 0; i < remoteVariables.length; i++) {
|
|
21
|
-
const match = /(?<url>git@.*?)=(?<file>.*?)=(?<ref>.*)/.exec(remoteVariables[i]);
|
|
22
|
-
assert(match != null, "--remote-variables is malformed use 'git@gitlab.com:firecow/example.git=gitlab-variables.yml=master' syntax");
|
|
23
|
-
const url = match.groups?.url;
|
|
24
|
-
const file = match.groups?.file;
|
|
25
|
-
const ref = match.groups?.ref;
|
|
26
|
-
const res = await Utils.bash(`set -eou pipefail; git archive --remote=${url} ${ref} ${file} | tar -xO ${file}`, cwd);
|
|
27
|
-
const loadedYaml = yaml.load(`${res.stdout}`);
|
|
28
|
-
// Check if loadedYaml is an object
|
|
29
|
-
if (typeof loadedYaml === "object" && loadedYaml !== null) {
|
|
30
|
-
remoteFileData = deepExtend(remoteFileData, loadedYaml);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
if (await fs.pathExists(homeVariablesFile)) {
|
|
35
|
-
homeFileData = yaml.load(await fs.readFile(homeVariablesFile, "utf8"), { schema: yaml.FAILSAFE_SCHEMA });
|
|
36
|
-
}
|
|
37
|
-
const unpack = (v) => {
|
|
38
|
-
if (typeof v === "string") {
|
|
39
|
-
const catchAll = { values: {}, type: null };
|
|
40
|
-
catchAll.values = {};
|
|
41
|
-
catchAll.values["*"] = v;
|
|
42
|
-
return catchAll;
|
|
43
|
-
}
|
|
44
|
-
else {
|
|
45
|
-
v.type = v.type ?? "variable";
|
|
46
|
-
}
|
|
47
|
-
return v;
|
|
48
|
-
};
|
|
49
|
-
const addToVariables = async (key, val, scopePriority, isDotEnv = false) => {
|
|
50
|
-
const { type, values } = unpack(val);
|
|
51
|
-
for (const [matcher, content] of Object.entries(values)) {
|
|
52
|
-
assert(typeof content == "string", `${key}.${matcher} content must be text or multiline text`);
|
|
53
|
-
if (isDotEnv || type === "variable" || (type === null && !/^[/~]/.exec(content))) {
|
|
54
|
-
const regexp = matcher === "*" ? /.*/g : new RegExp(`^${matcher.replace(/\*/g, ".*")}$`, "g");
|
|
55
|
-
variables[key] = variables[key] ?? { type: "variable", environments: [] };
|
|
56
|
-
variables[key].environments.push({ content, regexp, regexpPriority: matcher.length, scopePriority });
|
|
57
|
-
}
|
|
58
|
-
else if (type === null && /^[/~]/.exec(content)) {
|
|
59
|
-
const fileSource = content.replace(/^~\/(.*)/, `${homeDir}/$1`);
|
|
60
|
-
const regexp = matcher === "*" ? /.*/g : new RegExp(`^${matcher.replace(/\*/g, ".*")}$`, "g");
|
|
61
|
-
variables[key] = variables[key] ?? { type: "file", environments: [] };
|
|
62
|
-
if (fs.existsSync(fileSource)) {
|
|
63
|
-
variables[key].environments.push({ content, regexp, regexpPriority: matcher.length, scopePriority, fileSource });
|
|
64
|
-
}
|
|
65
|
-
else {
|
|
66
|
-
variables[key].environments.push({ content: `warn: ${key} is pointing to invalid path\n`, regexp, regexpPriority: matcher.length, scopePriority });
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
else if (type === "file") {
|
|
70
|
-
const regexp = matcher === "*" ? /.*/g : new RegExp(`^${matcher.replace(/\*/g, ".*")}$`, "g");
|
|
71
|
-
variables[key] = variables[key] ?? { type: "file", environments: [] };
|
|
72
|
-
variables[key].environments.push({ content, regexp, regexpPriority: matcher.length, scopePriority });
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
assert(false, `${key} was not handled properly`);
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
const addVariableFileToVariables = async (fileData, filePriority) => {
|
|
80
|
-
for (const [globalKey, globalEntry] of Object.entries(fileData?.global ?? {})) {
|
|
81
|
-
await addToVariables(globalKey, globalEntry, 1 + filePriority);
|
|
82
|
-
}
|
|
83
|
-
const groupUrl = `${gitData.remote.host}/${gitData.remote.group}/`;
|
|
84
|
-
for (const [groupKey, groupEntries] of Object.entries(fileData?.group ?? {})) {
|
|
85
|
-
if (!groupUrl.includes(this.normalizeProjectKey(groupKey, writeStreams)))
|
|
86
|
-
continue;
|
|
87
|
-
assert(groupEntries != null, "groupEntries cannot be null/undefined");
|
|
88
|
-
assert(Utils.isObject(groupEntries), "group entries in variable files must be an object");
|
|
89
|
-
for (const [k, v] of Object.entries(groupEntries)) {
|
|
90
|
-
await addToVariables(k, v, 2 + filePriority);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
const projectUrl = `${gitData.remote.host}/${gitData.remote.group}/${gitData.remote.project}.git`;
|
|
94
|
-
for (const [projectKey, projectEntries] of Object.entries(fileData?.project ?? [])) {
|
|
95
|
-
if (!projectUrl.includes(this.normalizeProjectKey(projectKey, writeStreams)))
|
|
96
|
-
continue;
|
|
97
|
-
assert(projectEntries != null, "projectEntries cannot be null/undefined");
|
|
98
|
-
assert(Utils.isObject(projectEntries), "project entries in variable files must be an object");
|
|
99
|
-
for (const [k, v] of Object.entries(projectEntries)) {
|
|
100
|
-
await addToVariables(k, v, 3 + filePriority);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
};
|
|
104
|
-
await addVariableFileToVariables(remoteFileData, 0);
|
|
105
|
-
await addVariableFileToVariables(homeFileData, 10);
|
|
106
|
-
const projectVariablesFile = `${argv.cwd}/${argv.variablesFile}`;
|
|
107
|
-
if (fs.existsSync(projectVariablesFile)) {
|
|
108
|
-
let isDotEnvFormat = false;
|
|
109
|
-
const projectVariablesFileRawContent = await fs.readFile(projectVariablesFile, "utf8");
|
|
110
|
-
let projectVariablesFileData;
|
|
111
|
-
try {
|
|
112
|
-
projectVariablesFileData = yaml.load(projectVariablesFileRawContent, { schema: yaml.FAILSAFE_SCHEMA }) ?? {};
|
|
113
|
-
if (typeof (projectVariablesFileData) === "string") {
|
|
114
|
-
isDotEnvFormat = true;
|
|
115
|
-
projectVariablesFileData = dotenv.parse(projectVariablesFileRawContent);
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
catch (e) {
|
|
119
|
-
if (e instanceof yaml.YAMLException) {
|
|
120
|
-
isDotEnvFormat = true;
|
|
121
|
-
projectVariablesFileData = dotenv.parse(projectVariablesFileRawContent);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
assert(projectVariablesFileData != null, "projectEntries cannot be null/undefined");
|
|
125
|
-
assert(Utils.isObject(projectVariablesFileData), `${argv.cwd}/.gitlab-ci-local-variables.yml must contain an object`);
|
|
126
|
-
for (const [k, v] of Object.entries(projectVariablesFileData)) {
|
|
127
|
-
await addToVariables(k, v, 24, isDotEnvFormat);
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
for (const varObj of Object.values(variables)) {
|
|
131
|
-
varObj.environments.sort((a, b) => b.scopePriority - a.scopePriority);
|
|
132
|
-
varObj.environments.sort((a, b) => b.regexpPriority - a.regexpPriority);
|
|
133
|
-
}
|
|
134
|
-
return variables;
|
|
135
|
-
}
|
|
136
|
-
static normalizeProjectKey(key, writeStreams) {
|
|
137
|
-
if (!key.includes(":"))
|
|
138
|
-
return key;
|
|
139
|
-
writeStreams.stderr(chalk `{yellow WARNING: Interpreting '${key}' as '${key.replace(":", "/")}'}\n`);
|
|
140
|
-
return key.replace(":", "/");
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLWZyb20tZmlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2YXJpYWJsZXMtZnJvbS1maWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUIsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDakMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sVUFBVSxNQUFNLGFBQWEsQ0FBQztBQWFyQyxNQUFNLE9BQU8sa0JBQWtCO0lBRTNCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFFLElBQVUsRUFBRSxZQUEwQixFQUFFLE9BQWdCO1FBQ3ZFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDckIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzFCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDN0MsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMzQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsT0FBTyxJQUFJLFFBQVEsZ0JBQWdCLENBQUM7UUFDakUsTUFBTSxTQUFTLEdBQW1DLEVBQUUsQ0FBQztRQUNyRCxJQUFJLGNBQWMsR0FBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxZQUFZLEdBQVEsRUFBRSxDQUFDO1FBRTNCLElBQUksZUFBZSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztnQkFDOUMsTUFBTSxLQUFLLEdBQUcseUNBQXlDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNqRixNQUFNLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRSw2R0FBNkcsQ0FBQyxDQUFDO2dCQUNySSxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQztnQkFDOUIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7Z0JBQ2hDLE1BQU0sR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDO2dCQUM5QixNQUFNLEdBQUcsR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsMkNBQTJDLEdBQUcsSUFBSSxHQUFHLElBQUksSUFBSSxjQUFjLElBQUksRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDO2dCQUNySCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7Z0JBQzlDLG1DQUFtQztnQkFDbkMsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksVUFBVSxLQUFLLElBQUksRUFBRSxDQUFDO29CQUN4RCxjQUFjLEdBQUcsVUFBVSxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFDNUQsQ0FBQztZQUNMLENBQUM7UUFDTCxDQUFDO1FBRUQsSUFBSSxNQUFNLEVBQUUsQ0FBQyxVQUFVLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO1lBQ3pDLFlBQVksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFDLENBQUMsQ0FBQztRQUMzRyxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsQ0FBQyxDQUFNLEVBQW1ELEVBQUU7WUFDdkUsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztnQkFDeEIsTUFBTSxRQUFRLEdBQW9ELEVBQUMsTUFBTSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFDLENBQUM7Z0JBQzNGLFFBQVEsQ0FBQyxNQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUNyQixRQUFRLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDekIsT0FBTyxRQUFRLENBQUM7WUFDcEIsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxVQUFVLENBQUM7WUFDbEMsQ0FBQztZQUNELE9BQU8sQ0FBQyxDQUFDO1FBQ2IsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxjQUFjLEdBQUcsS0FBSyxFQUFFLEdBQVcsRUFBRSxHQUFRLEVBQUUsYUFBcUIsRUFBRSxRQUFRLEdBQUcsS0FBSyxFQUFFLEVBQUU7WUFDNUYsTUFBTSxFQUFDLElBQUksRUFBRSxNQUFNLEVBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkMsS0FBSyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDdEQsTUFBTSxDQUFDLE9BQU8sT0FBTyxJQUFJLFFBQVEsRUFBRSxHQUFHLEdBQUcsSUFBSSxPQUFPLHlDQUF5QyxDQUFDLENBQUM7Z0JBQy9GLElBQUksUUFBUSxJQUFJLElBQUksS0FBSyxVQUFVLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQy9FLE1BQU0sTUFBTSxHQUFHLE9BQU8sS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO29CQUM5RixTQUFTLENBQUMsR0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFDLENBQUM7b0JBQ3hFLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUMsQ0FBQyxDQUFDO2dCQUN2RyxDQUFDO3FCQUFNLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7b0JBQ2hELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEdBQUcsT0FBTyxLQUFLLENBQUMsQ0FBQztvQkFDaEUsTUFBTSxNQUFNLEdBQUcsT0FBTyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7b0JBQzlGLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUMsQ0FBQztvQkFDcEUsSUFBSSxFQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7d0JBQzVCLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsVUFBVSxFQUFDLENBQUMsQ0FBQztvQkFDbkgsQ0FBQzt5QkFBTSxDQUFDO3dCQUNKLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLEVBQUMsT0FBTyxFQUFFLFNBQVMsR0FBRyxnQ0FBZ0MsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFDLENBQUMsQ0FBQztvQkFDckosQ0FBQztnQkFDTCxDQUFDO3FCQUFNLElBQUksSUFBSSxLQUFLLE1BQU0sRUFBRSxDQUFDO29CQUN6QixNQUFNLE1BQU0sR0FBRyxPQUFPLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztvQkFDOUYsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBQyxDQUFDO29CQUNwRSxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFDLENBQUMsQ0FBQztnQkFDdkcsQ0FBQztxQkFBTSxDQUFDO29CQUNKLE1BQU0sQ0FBQyxLQUFLLEVBQUUsR0FBRyxHQUFHLDJCQUEyQixDQUFDLENBQUM7Z0JBQ3JELENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBRUYsTUFBTSwwQkFBMEIsR0FBRyxLQUFLLEVBQUUsUUFBYSxFQUFFLFlBQW9CLEVBQUUsRUFBRTtZQUM3RSxLQUFLLE1BQU0sQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsTUFBTSxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQzVFLE1BQU0sY0FBYyxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO1lBQ25FLENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxHQUFHLENBQUM7WUFDbkUsS0FBSyxNQUFNLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO2dCQUMzRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO29CQUFFLFNBQVM7Z0JBQ25GLE1BQU0sQ0FBQyxZQUFZLElBQUksSUFBSSxFQUFFLHVDQUF1QyxDQUFDLENBQUM7Z0JBQ3RFLE1BQU0sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxFQUFFLG1EQUFtRCxDQUFDLENBQUM7Z0JBQzFGLEtBQUssTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7b0JBQ2hELE1BQU0sY0FBYyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO2dCQUNqRCxDQUFDO1lBQ0wsQ0FBQztZQUVELE1BQU0sVUFBVSxHQUFHLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxPQUFPLE1BQU0sQ0FBQztZQUNsRyxLQUFLLE1BQU0sQ0FBQyxVQUFVLEVBQUUsY0FBYyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pGLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxVQUFVLEVBQUUsWUFBWSxDQUFDLENBQUM7b0JBQUUsU0FBUztnQkFDdkYsTUFBTSxDQUFDLGNBQWMsSUFBSSxJQUFJLEVBQUUseUNBQXlDLENBQUMsQ0FBQztnQkFDMUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUscURBQXFELENBQUMsQ0FBQztnQkFDOUYsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztvQkFDbEQsTUFBTSxjQUFjLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUM7Z0JBQ2pELENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBRUYsTUFBTSwwQkFBMEIsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDcEQsTUFBTSwwQkFBMEIsQ0FBQyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFbkQsTUFBTSxvQkFBb0IsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ2pFLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7WUFDdEMsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO1lBQzNCLE1BQU0sOEJBQThCLEdBQUcsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLG9CQUFvQixFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3ZGLElBQUksd0JBQXdCLENBQUM7WUFDN0IsSUFBSSxDQUFDO2dCQUNELHdCQUF3QixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsOEJBQThCLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGVBQWUsRUFBQyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUUzRyxJQUFJLE9BQU0sQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUNoRCxjQUFjLEdBQUcsSUFBSSxDQUFDO29CQUN0Qix3QkFBd0IsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUM7Z0JBQzVFLENBQUM7WUFDTCxDQUFDO1lBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztnQkFDVCxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQ2xDLGNBQWMsR0FBRyxJQUFJLENBQUM7b0JBQ3RCLHdCQUF3QixHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsOEJBQThCLENBQUMsQ0FBQztnQkFDNUUsQ0FBQztZQUNMLENBQUM7WUFDRCxNQUFNLENBQUMsd0JBQXdCLElBQUksSUFBSSxFQUFFLHlDQUF5QyxDQUFDLENBQUM7WUFDcEYsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsd0JBQXdCLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLHdEQUF3RCxDQUFDLENBQUM7WUFDdEgsS0FBSyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsd0JBQXdCLENBQUMsRUFBRSxDQUFDO2dCQUM1RCxNQUFNLGNBQWMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNuRCxDQUFDO1FBQ0wsQ0FBQztRQUVELEtBQUssTUFBTSxNQUFNLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDdEUsTUFBTSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsY0FBYyxHQUFHLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBRSxHQUFXLEVBQUUsWUFBMEI7UUFDL0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDbkMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUEsa0NBQWtDLEdBQUcsU0FBUyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEcsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1dyaXRlU3RyZWFtc30gZnJvbSBcIi4vd3JpdGUtc3RyZWFtcy5qc1wiO1xuaW1wb3J0IHtHaXREYXRhfSBmcm9tIFwiLi9naXQtZGF0YS5qc1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tIFwianMteWFtbFwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsay10ZW1wbGF0ZVwiO1xuaW1wb3J0IHtBcmd2fSBmcm9tIFwiLi9hcmd2LmpzXCI7XG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7VXRpbHN9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5pbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcbmltcG9ydCBkZWVwRXh0ZW5kIGZyb20gXCJkZWVwLWV4dGVuZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENJQ0RWYXJpYWJsZSB7XG4gICAgdHlwZTogXCJmaWxlXCIgfCBcInZhcmlhYmxlXCI7XG4gICAgZW52aXJvbm1lbnRzOiB7XG4gICAgICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICAgICAgcmVnZXhwOiBSZWdFeHA7XG4gICAgICAgIHJlZ2V4cFByaW9yaXR5OiBudW1iZXI7XG4gICAgICAgIHNjb3BlUHJpb3JpdHk6IG51bWJlcjtcbiAgICAgICAgZmlsZVNvdXJjZT86IHN0cmluZztcbiAgICB9W107XG59XG5cbmV4cG9ydCBjbGFzcyBWYXJpYWJsZXNGcm9tRmlsZXMge1xuXG4gICAgc3RhdGljIGFzeW5jIGluaXQgKGFyZ3Y6IEFyZ3YsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBnaXREYXRhOiBHaXREYXRhKTogUHJvbWlzZTx7W25hbWU6IHN0cmluZ106IENJQ0RWYXJpYWJsZX0+IHtcbiAgICAgICAgY29uc3QgY3dkID0gYXJndi5jd2Q7XG4gICAgICAgIGNvbnN0IHN0YXRlRGlyID0gYXJndi5zdGF0ZURpcjtcbiAgICAgICAgY29uc3QgaG9tZURpciA9IGFyZ3YuaG9tZTtcbiAgICAgICAgY29uc3QgcmVtb3RlVmFyaWFibGVzID0gYXJndi5yZW1vdGVWYXJpYWJsZXM7XG4gICAgICAgIGNvbnN0IGF1dG9Db21wbGV0aW5nID0gYXJndi5hdXRvQ29tcGxldGluZztcbiAgICAgICAgY29uc3QgaG9tZVZhcmlhYmxlc0ZpbGUgPSBgJHtob21lRGlyfS8ke3N0YXRlRGlyfS92YXJpYWJsZXMueW1sYDtcbiAgICAgICAgY29uc3QgdmFyaWFibGVzOiB7W25hbWU6IHN0cmluZ106IENJQ0RWYXJpYWJsZX0gPSB7fTtcbiAgICAgICAgbGV0IHJlbW90ZUZpbGVEYXRhOiBhbnkgPSB7fTtcbiAgICAgICAgbGV0IGhvbWVGaWxlRGF0YTogYW55ID0ge307XG5cbiAgICAgICAgaWYgKHJlbW90ZVZhcmlhYmxlcyAmJiAhYXV0b0NvbXBsZXRpbmcpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3RlVmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvKD88dXJsPmdpdEAuKj8pPSg/PGZpbGU+Lio/KT0oPzxyZWY+LiopLy5leGVjKHJlbW90ZVZhcmlhYmxlc1tpXSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KG1hdGNoICE9IG51bGwsIFwiLS1yZW1vdGUtdmFyaWFibGVzIGlzIG1hbGZvcm1lZCB1c2UgJ2dpdEBnaXRsYWIuY29tOmZpcmVjb3cvZXhhbXBsZS5naXQ9Z2l0bGFiLXZhcmlhYmxlcy55bWw9bWFzdGVyJyBzeW50YXhcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gbWF0Y2guZ3JvdXBzPy51cmw7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IG1hdGNoLmdyb3Vwcz8uZmlsZTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWYgPSBtYXRjaC5ncm91cHM/LnJlZjtcbiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBVdGlscy5iYXNoKGBzZXQgLWVvdSBwaXBlZmFpbDsgZ2l0IGFyY2hpdmUgLS1yZW1vdGU9JHt1cmx9ICR7cmVmfSAke2ZpbGV9IHwgdGFyIC14TyAke2ZpbGV9YCwgY3dkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWRZYW1sID0geWFtbC5sb2FkKGAke3Jlcy5zdGRvdXR9YCk7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbG9hZGVkWWFtbCBpcyBhbiBvYmplY3RcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxvYWRlZFlhbWwgPT09IFwib2JqZWN0XCIgJiYgbG9hZGVkWWFtbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdGVGaWxlRGF0YSA9IGRlZXBFeHRlbmQocmVtb3RlRmlsZURhdGEsIGxvYWRlZFlhbWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhd2FpdCBmcy5wYXRoRXhpc3RzKGhvbWVWYXJpYWJsZXNGaWxlKSkge1xuICAgICAgICAgICAgaG9tZUZpbGVEYXRhID0geWFtbC5sb2FkKGF3YWl0IGZzLnJlYWRGaWxlKGhvbWVWYXJpYWJsZXNGaWxlLCBcInV0ZjhcIiksIHtzY2hlbWE6IHlhbWwuRkFJTFNBRkVfU0NIRU1BfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1bnBhY2sgPSAodjogYW55KToge3ZhbHVlczogYW55OyB0eXBlOiBcImZpbGVcIiB8IFwidmFyaWFibGVcIiB8IG51bGx9ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhdGNoQWxsOiB7dmFsdWVzOiBhbnk7IHR5cGU6IFwiZmlsZVwiIHwgXCJ2YXJpYWJsZVwiIHwgbnVsbH0gPSB7dmFsdWVzOiB7fSwgdHlwZTogbnVsbH07XG4gICAgICAgICAgICAgICAgY2F0Y2hBbGwudmFsdWVzID0ge307XG4gICAgICAgICAgICAgICAgY2F0Y2hBbGwudmFsdWVzW1wiKlwiXSA9IHY7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhdGNoQWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2LnR5cGUgPSB2LnR5cGUgPz8gXCJ2YXJpYWJsZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGFkZFRvVmFyaWFibGVzID0gYXN5bmMgKGtleTogc3RyaW5nLCB2YWw6IGFueSwgc2NvcGVQcmlvcml0eTogbnVtYmVyLCBpc0RvdEVudiA9IGZhbHNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7dHlwZSwgdmFsdWVzfSA9IHVucGFjayh2YWwpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbbWF0Y2hlciwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgY29udGVudCA9PSBcInN0cmluZ1wiLCBgJHtrZXl9LiR7bWF0Y2hlcn0gY29udGVudCBtdXN0IGJlIHRleHQgb3IgbXVsdGlsaW5lIHRleHRgKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNEb3RFbnYgfHwgdHlwZSA9PT0gXCJ2YXJpYWJsZVwiIHx8ICh0eXBlID09PSBudWxsICYmICEvXlsvfl0vLmV4ZWMoY29udGVudCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4cCA9IG1hdGNoZXIgPT09IFwiKlwiID8gLy4qL2cgOiBuZXcgUmVnRXhwKGBeJHttYXRjaGVyLnJlcGxhY2UoL1xcKi9nLCBcIi4qXCIpfSRgLCBcImdcIik7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlc1trZXldID0gdmFyaWFibGVzW2tleV0gPz8ge3R5cGU6IFwidmFyaWFibGVcIiwgZW52aXJvbm1lbnRzOiBbXX07XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlc1trZXldLmVudmlyb25tZW50cy5wdXNoKHtjb250ZW50LCByZWdleHAsIHJlZ2V4cFByaW9yaXR5OiBtYXRjaGVyLmxlbmd0aCwgc2NvcGVQcmlvcml0eX0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gbnVsbCAmJiAvXlsvfl0vLmV4ZWMoY29udGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZVNvdXJjZSA9IGNvbnRlbnQucmVwbGFjZSgvXn5cXC8oLiopLywgYCR7aG9tZURpcn0vJDFgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVnZXhwID0gbWF0Y2hlciA9PT0gXCIqXCIgPyAvLiovZyA6IG5ldyBSZWdFeHAoYF4ke21hdGNoZXIucmVwbGFjZSgvXFwqL2csIFwiLipcIil9JGAsIFwiZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzW2tleV0gPSB2YXJpYWJsZXNba2V5XSA/PyB7dHlwZTogXCJmaWxlXCIsIGVudmlyb25tZW50czogW119O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlU291cmNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzW2tleV0uZW52aXJvbm1lbnRzLnB1c2goe2NvbnRlbnQsIHJlZ2V4cCwgcmVnZXhwUHJpb3JpdHk6IG1hdGNoZXIubGVuZ3RoLCBzY29wZVByaW9yaXR5LCBmaWxlU291cmNlfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXNba2V5XS5lbnZpcm9ubWVudHMucHVzaCh7Y29udGVudDogYHdhcm46ICR7a2V5fSBpcyBwb2ludGluZyB0byBpbnZhbGlkIHBhdGhcXG5gLCByZWdleHAsIHJlZ2V4cFByaW9yaXR5OiBtYXRjaGVyLmxlbmd0aCwgc2NvcGVQcmlvcml0eX0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleHAgPSBtYXRjaGVyID09PSBcIipcIiA/IC8uKi9nIDogbmV3IFJlZ0V4cChgXiR7bWF0Y2hlci5yZXBsYWNlKC9cXCovZywgXCIuKlwiKX0kYCwgXCJnXCIpO1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXNba2V5XSA9IHZhcmlhYmxlc1trZXldID8/IHt0eXBlOiBcImZpbGVcIiwgZW52aXJvbm1lbnRzOiBbXX07XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlc1trZXldLmVudmlyb25tZW50cy5wdXNoKHtjb250ZW50LCByZWdleHAsIHJlZ2V4cFByaW9yaXR5OiBtYXRjaGVyLmxlbmd0aCwgc2NvcGVQcmlvcml0eX0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgYCR7a2V5fSB3YXMgbm90IGhhbmRsZWQgcHJvcGVybHlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYWRkVmFyaWFibGVGaWxlVG9WYXJpYWJsZXMgPSBhc3luYyAoZmlsZURhdGE6IGFueSwgZmlsZVByaW9yaXR5OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2dsb2JhbEtleSwgZ2xvYmFsRW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGZpbGVEYXRhPy5nbG9iYWwgPz8ge30pKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYWRkVG9WYXJpYWJsZXMoZ2xvYmFsS2V5LCBnbG9iYWxFbnRyeSwgMSArIGZpbGVQcmlvcml0eSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGdyb3VwVXJsID0gYCR7Z2l0RGF0YS5yZW1vdGUuaG9zdH0vJHtnaXREYXRhLnJlbW90ZS5ncm91cH0vYDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2dyb3VwS2V5LCBncm91cEVudHJpZXNdIG9mIE9iamVjdC5lbnRyaWVzKGZpbGVEYXRhPy5ncm91cCA/PyB7fSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWdyb3VwVXJsLmluY2x1ZGVzKHRoaXMubm9ybWFsaXplUHJvamVjdEtleShncm91cEtleSwgd3JpdGVTdHJlYW1zKSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGFzc2VydChncm91cEVudHJpZXMgIT0gbnVsbCwgXCJncm91cEVudHJpZXMgY2Fubm90IGJlIG51bGwvdW5kZWZpbmVkXCIpO1xuICAgICAgICAgICAgICAgIGFzc2VydChVdGlscy5pc09iamVjdChncm91cEVudHJpZXMpLCBcImdyb3VwIGVudHJpZXMgaW4gdmFyaWFibGUgZmlsZXMgbXVzdCBiZSBhbiBvYmplY3RcIik7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoZ3JvdXBFbnRyaWVzKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhZGRUb1ZhcmlhYmxlcyhrLCB2LCAyICsgZmlsZVByaW9yaXR5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByb2plY3RVcmwgPSBgJHtnaXREYXRhLnJlbW90ZS5ob3N0fS8ke2dpdERhdGEucmVtb3RlLmdyb3VwfS8ke2dpdERhdGEucmVtb3RlLnByb2plY3R9LmdpdGA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0S2V5LCBwcm9qZWN0RW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMoZmlsZURhdGE/LnByb2plY3QgPz8gW10pKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9qZWN0VXJsLmluY2x1ZGVzKHRoaXMubm9ybWFsaXplUHJvamVjdEtleShwcm9qZWN0S2V5LCB3cml0ZVN0cmVhbXMpKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHByb2plY3RFbnRyaWVzICE9IG51bGwsIFwicHJvamVjdEVudHJpZXMgY2Fubm90IGJlIG51bGwvdW5kZWZpbmVkXCIpO1xuICAgICAgICAgICAgICAgIGFzc2VydChVdGlscy5pc09iamVjdChwcm9qZWN0RW50cmllcyksIFwicHJvamVjdCBlbnRyaWVzIGluIHZhcmlhYmxlIGZpbGVzIG11c3QgYmUgYW4gb2JqZWN0XCIpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHByb2plY3RFbnRyaWVzKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhZGRUb1ZhcmlhYmxlcyhrLCB2LCAzICsgZmlsZVByaW9yaXR5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgYWRkVmFyaWFibGVGaWxlVG9WYXJpYWJsZXMocmVtb3RlRmlsZURhdGEsIDApO1xuICAgICAgICBhd2FpdCBhZGRWYXJpYWJsZUZpbGVUb1ZhcmlhYmxlcyhob21lRmlsZURhdGEsIDEwKTtcblxuICAgICAgICBjb25zdCBwcm9qZWN0VmFyaWFibGVzRmlsZSA9IGAke2FyZ3YuY3dkfS8ke2FyZ3YudmFyaWFibGVzRmlsZX1gO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwcm9qZWN0VmFyaWFibGVzRmlsZSkpIHtcbiAgICAgICAgICAgIGxldCBpc0RvdEVudkZvcm1hdCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcHJvamVjdFZhcmlhYmxlc0ZpbGVSYXdDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocHJvamVjdFZhcmlhYmxlc0ZpbGUsIFwidXRmOFwiKTtcbiAgICAgICAgICAgIGxldCBwcm9qZWN0VmFyaWFibGVzRmlsZURhdGE7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHByb2plY3RWYXJpYWJsZXNGaWxlRGF0YSA9IHlhbWwubG9hZChwcm9qZWN0VmFyaWFibGVzRmlsZVJhd0NvbnRlbnQsIHtzY2hlbWE6IHlhbWwuRkFJTFNBRkVfU0NIRU1BfSkgPz8ge307XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHByb2plY3RWYXJpYWJsZXNGaWxlRGF0YSkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNEb3RFbnZGb3JtYXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0VmFyaWFibGVzRmlsZURhdGEgPSBkb3RlbnYucGFyc2UocHJvamVjdFZhcmlhYmxlc0ZpbGVSYXdDb250ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiB5YW1sLllBTUxFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgaXNEb3RFbnZGb3JtYXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0VmFyaWFibGVzRmlsZURhdGEgPSBkb3RlbnYucGFyc2UocHJvamVjdFZhcmlhYmxlc0ZpbGVSYXdDb250ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQocHJvamVjdFZhcmlhYmxlc0ZpbGVEYXRhICE9IG51bGwsIFwicHJvamVjdEVudHJpZXMgY2Fubm90IGJlIG51bGwvdW5kZWZpbmVkXCIpO1xuICAgICAgICAgICAgYXNzZXJ0KFV0aWxzLmlzT2JqZWN0KHByb2plY3RWYXJpYWJsZXNGaWxlRGF0YSksIGAke2FyZ3YuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsLXZhcmlhYmxlcy55bWwgbXVzdCBjb250YWluIGFuIG9iamVjdGApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMocHJvamVjdFZhcmlhYmxlc0ZpbGVEYXRhKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGFkZFRvVmFyaWFibGVzKGssIHYsIDI0LCBpc0RvdEVudkZvcm1hdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHZhck9iaiBvZiBPYmplY3QudmFsdWVzKHZhcmlhYmxlcykpIHtcbiAgICAgICAgICAgIHZhck9iai5lbnZpcm9ubWVudHMuc29ydCgoYSwgYikgPT4gYi5zY29wZVByaW9yaXR5IC0gYS5zY29wZVByaW9yaXR5KTtcbiAgICAgICAgICAgIHZhck9iai5lbnZpcm9ubWVudHMuc29ydCgoYSwgYikgPT4gYi5yZWdleHBQcmlvcml0eSAtIGEucmVnZXhwUHJpb3JpdHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlcztcbiAgICB9XG5cbiAgICBzdGF0aWMgbm9ybWFsaXplUHJvamVjdEtleSAoa2V5OiBzdHJpbmcsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoXCI6XCIpKSByZXR1cm4ga2V5O1xuICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYHt5ZWxsb3cgV0FSTklORzogSW50ZXJwcmV0aW5nICcke2tleX0nIGFzICcke2tleS5yZXBsYWNlKFwiOlwiLCBcIi9cIil9J31cXG5gKTtcbiAgICAgICAgcmV0dXJuIGtleS5yZXBsYWNlKFwiOlwiLCBcIi9cIik7XG4gICAgfVxufVxuIl19
|
package/src/write-streams.js
DELETED
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
class AbstractWriteStreams {
|
|
2
|
-
memoStdout = (() => {
|
|
3
|
-
const cache = new Map();
|
|
4
|
-
return (message) => {
|
|
5
|
-
if (cache.has(message))
|
|
6
|
-
return;
|
|
7
|
-
cache.set(message, null);
|
|
8
|
-
this.stdout(message);
|
|
9
|
-
};
|
|
10
|
-
})();
|
|
11
|
-
}
|
|
12
|
-
export class WriteStreamsProcess extends AbstractWriteStreams {
|
|
13
|
-
stderr(txt) {
|
|
14
|
-
process.stderr.write(txt);
|
|
15
|
-
}
|
|
16
|
-
stdout(txt) {
|
|
17
|
-
process.stdout.write(txt);
|
|
18
|
-
}
|
|
19
|
-
flush() {
|
|
20
|
-
// Process write streams flushes themselves.
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
export class WriteStreamsMock extends AbstractWriteStreams {
|
|
24
|
-
currentStderr = "";
|
|
25
|
-
currentStdout = "";
|
|
26
|
-
stderrLines = [];
|
|
27
|
-
stdoutLines = [];
|
|
28
|
-
stderr(txt) {
|
|
29
|
-
this.currentStderr += txt;
|
|
30
|
-
if (txt.endsWith("\n")) {
|
|
31
|
-
this.stderrLines.push(this.currentStderr.slice(0, -1));
|
|
32
|
-
this.currentStderr = "";
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
stdout(txt) {
|
|
36
|
-
this.currentStdout += txt;
|
|
37
|
-
if (txt.endsWith("\n")) {
|
|
38
|
-
this.stdoutLines.push(this.currentStdout.slice(0, -1));
|
|
39
|
-
this.currentStdout = "";
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
flush() {
|
|
43
|
-
if (this.currentStdout.length != 0) {
|
|
44
|
-
this.stdout("\n");
|
|
45
|
-
}
|
|
46
|
-
if (this.currentStderr.length != 0) {
|
|
47
|
-
this.stderr("\n");
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JpdGUtc3RyZWFtcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndyaXRlLXN0cmVhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBT0EsTUFBZSxvQkFBb0I7SUFLL0IsVUFBVSxHQUFHLENBQUMsR0FBRyxFQUFFO1FBQ2YsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUN4QixPQUFPLENBQUMsT0FBZSxFQUFFLEVBQUU7WUFDdkIsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQztnQkFBRSxPQUFPO1lBQy9CLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDekIsQ0FBQyxDQUFDO0lBQ04sQ0FBQyxDQUFDLEVBQUUsQ0FBQztDQUNSO0FBRUQsTUFBTSxPQUFPLG1CQUFvQixTQUFRLG9CQUFvQjtJQUN6RCxNQUFNLENBQUUsR0FBVztRQUNmLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxNQUFNLENBQUUsR0FBVztRQUNmLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxLQUFLO1FBQ0QsNENBQTRDO0lBQ2hELENBQUM7Q0FDSjtBQUVELE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxvQkFBb0I7SUFDOUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztJQUNuQixhQUFhLEdBQUcsRUFBRSxDQUFDO0lBRWxCLFdBQVcsR0FBYSxFQUFFLENBQUM7SUFDM0IsV0FBVyxHQUFhLEVBQUUsQ0FBQztJQUVwQyxNQUFNLENBQUUsR0FBVztRQUNmLElBQUksQ0FBQyxhQUFhLElBQUksR0FBRyxDQUFDO1FBQzFCLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDNUIsQ0FBQztJQUNMLENBQUM7SUFFRCxNQUFNLENBQUUsR0FBVztRQUNmLElBQUksQ0FBQyxhQUFhLElBQUksR0FBRyxDQUFDO1FBQzFCLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDNUIsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLO1FBQ0QsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RCLENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEIsQ0FBQztJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgV3JpdGVTdHJlYW1zIHtcbiAgICBzdGRvdXQ6ICh0eHQ6IHN0cmluZykgPT4gdm9pZDtcbiAgICBtZW1vU3Rkb3V0OiAodHh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgc3RkZXJyOiAodHh0OiBzdHJpbmcpID0+IHZvaWQ7XG4gICAgZmx1c2g6ICgpID0+IHZvaWQ7XG59XG5cbmFic3RyYWN0IGNsYXNzIEFic3RyYWN0V3JpdGVTdHJlYW1zIGltcGxlbWVudHMgV3JpdGVTdHJlYW1zIHtcbiAgICBhYnN0cmFjdCBzdGRvdXQgKHR4dDogc3RyaW5nKTogdm9pZDtcbiAgICBhYnN0cmFjdCBzdGRlcnIgKHR4dDogc3RyaW5nKTogdm9pZDtcbiAgICBhYnN0cmFjdCBmbHVzaCAoKTogdm9pZDtcblxuICAgIG1lbW9TdGRvdXQgPSAoKCkgPT4ge1xuICAgICAgICBjb25zdCBjYWNoZSA9IG5ldyBNYXAoKTtcbiAgICAgICAgcmV0dXJuIChtZXNzYWdlOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChjYWNoZS5oYXMobWVzc2FnZSkpIHJldHVybjtcbiAgICAgICAgICAgIGNhY2hlLnNldChtZXNzYWdlLCBudWxsKTtcbiAgICAgICAgICAgIHRoaXMuc3Rkb3V0KG1lc3NhZ2UpO1xuICAgICAgICB9O1xuICAgIH0pKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBXcml0ZVN0cmVhbXNQcm9jZXNzIGV4dGVuZHMgQWJzdHJhY3RXcml0ZVN0cmVhbXMge1xuICAgIHN0ZGVyciAodHh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgcHJvY2Vzcy5zdGRlcnIud3JpdGUodHh0KTtcbiAgICB9XG5cbiAgICBzdGRvdXQgKHR4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHByb2Nlc3Muc3Rkb3V0LndyaXRlKHR4dCk7XG4gICAgfVxuXG4gICAgZmx1c2ggKCk6IHZvaWQge1xuICAgICAgICAvLyBQcm9jZXNzIHdyaXRlIHN0cmVhbXMgZmx1c2hlcyB0aGVtc2VsdmVzLlxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdyaXRlU3RyZWFtc01vY2sgZXh0ZW5kcyBBYnN0cmFjdFdyaXRlU3RyZWFtcyB7XG4gICAgcHJpdmF0ZSBjdXJyZW50U3RkZXJyID0gXCJcIjtcbiAgICBwcml2YXRlIGN1cnJlbnRTdGRvdXQgPSBcIlwiO1xuXG4gICAgcmVhZG9ubHkgc3RkZXJyTGluZXM6IHN0cmluZ1tdID0gW107XG4gICAgcmVhZG9ubHkgc3Rkb3V0TGluZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICBzdGRlcnIgKHR4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudFN0ZGVyciArPSB0eHQ7XG4gICAgICAgIGlmICh0eHQuZW5kc1dpdGgoXCJcXG5cIikpIHtcbiAgICAgICAgICAgIHRoaXMuc3RkZXJyTGluZXMucHVzaCh0aGlzLmN1cnJlbnRTdGRlcnIuc2xpY2UoMCwgLTEpKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZGVyciA9IFwiXCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGRvdXQgKHR4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY3VycmVudFN0ZG91dCArPSB0eHQ7XG4gICAgICAgIGlmICh0eHQuZW5kc1dpdGgoXCJcXG5cIikpIHtcbiAgICAgICAgICAgIHRoaXMuc3Rkb3V0TGluZXMucHVzaCh0aGlzLmN1cnJlbnRTdGRvdXQuc2xpY2UoMCwgLTEpKTtcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZG91dCA9IFwiXCI7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmbHVzaCAoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGRvdXQubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3Rkb3V0KFwiXFxuXCIpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmN1cnJlbnRTdGRlcnIubGVuZ3RoICE9IDApIHtcbiAgICAgICAgICAgIHRoaXMuc3RkZXJyKFwiXFxuXCIpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
|