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/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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLWZyb20tZmlsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ2YXJpYWJsZXMtZnJvbS1maWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDMUIsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFDaEMsT0FBTyxLQUFLLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDakMsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sVUFBVSxNQUFNLGFBQWEsQ0FBQztBQWFyQyxNQUFNLE9BQU8sa0JBQWtCO0lBRTNCLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFFLElBQVUsRUFBRSxZQUEwQixFQUFFLE9BQWdCO1FBQ3ZFLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUM7UUFDckIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztRQUMvQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDO1FBQzFCLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUM7UUFDN0MsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMzQyxNQUFNLGlCQUFpQixHQUFHLEdBQUcsT0FBTyxJQUFJLFFBQVEsZ0JBQWdCLENBQUM7UUFDakUsTUFBTSxTQUFTLEdBQW1DLEVBQUUsQ0FBQztRQUNyRCxJQUFJLGNBQWMsR0FBUSxFQUFFLENBQUM7UUFDN0IsSUFBSSxZQUFZLEdBQVEsRUFBRSxDQUFDO1FBRTNCLElBQUksZUFBZSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVB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LENBQUMsQ0FBQztRQUM1RSxDQUFDO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQztJQUVELE1BQU0sQ0FBQyxtQkFBbUIsQ0FBRSxHQUFXLEVBQUUsWUFBMEI7UUFDL0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDO1lBQUUsT0FBTyxHQUFHLENBQUM7UUFDbkMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUEsa0NBQWtDLEdBQUcsU0FBUyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEcsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNqQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1dyaXRlU3RyZWFtc30gZnJvbSBcIi4vd3JpdGUtc3RyZWFtcy5qc1wiO1xuaW1wb3J0IHtHaXREYXRhfSBmcm9tIFwiLi9naXQtZGF0YS5qc1wiO1xuaW1wb3J0IGZzIGZyb20gXCJmcy1leHRyYVwiO1xuaW1wb3J0ICogYXMgeWFtbCBmcm9tIFwianMteWFtbFwiO1xuaW1wb3J0IGNoYWxrIGZyb20gXCJjaGFsay10ZW1wbGF0ZVwiO1xuaW1wb3J0IHtBcmd2fSBmcm9tIFwiLi9hcmd2LmpzXCI7XG5pbXBvcnQgYXNzZXJ0IGZyb20gXCJhc3NlcnRcIjtcbmltcG9ydCB7VXRpbHN9IGZyb20gXCIuL3V0aWxzLmpzXCI7XG5pbXBvcnQgZG90ZW52IGZyb20gXCJkb3RlbnZcIjtcbmltcG9ydCBkZWVwRXh0ZW5kIGZyb20gXCJkZWVwLWV4dGVuZFwiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENJQ0RWYXJpYWJsZSB7XG4gICAgdHlwZTogXCJmaWxlXCIgfCBcInZhcmlhYmxlXCI7XG4gICAgZW52aXJvbm1lbnRzOiB7XG4gICAgICAgIGNvbnRlbnQ6IHN0cmluZztcbiAgICAgICAgcmVnZXhwOiBSZWdFeHA7XG4gICAgICAgIHJlZ2V4cFByaW9yaXR5OiBudW1iZXI7XG4gICAgICAgIHNjb3BlUHJpb3JpdHk6IG51bWJlcjtcbiAgICAgICAgZmlsZVNvdXJjZT86IHN0cmluZztcbiAgICB9W107XG59XG5cbmV4cG9ydCBjbGFzcyBWYXJpYWJsZXNGcm9tRmlsZXMge1xuXG4gICAgc3RhdGljIGFzeW5jIGluaXQgKGFyZ3Y6IEFyZ3YsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zLCBnaXREYXRhOiBHaXREYXRhKTogUHJvbWlzZTx7W25hbWU6IHN0cmluZ106IENJQ0RWYXJpYWJsZX0+IHtcbiAgICAgICAgY29uc3QgY3dkID0gYXJndi5jd2Q7XG4gICAgICAgIGNvbnN0IHN0YXRlRGlyID0gYXJndi5zdGF0ZURpcjtcbiAgICAgICAgY29uc3QgaG9tZURpciA9IGFyZ3YuaG9tZTtcbiAgICAgICAgY29uc3QgcmVtb3RlVmFyaWFibGVzID0gYXJndi5yZW1vdGVWYXJpYWJsZXM7XG4gICAgICAgIGNvbnN0IGF1dG9Db21wbGV0aW5nID0gYXJndi5hdXRvQ29tcGxldGluZztcbiAgICAgICAgY29uc3QgaG9tZVZhcmlhYmxlc0ZpbGUgPSBgJHtob21lRGlyfS8ke3N0YXRlRGlyfS92YXJpYWJsZXMueW1sYDtcbiAgICAgICAgY29uc3QgdmFyaWFibGVzOiB7W25hbWU6IHN0cmluZ106IENJQ0RWYXJpYWJsZX0gPSB7fTtcbiAgICAgICAgbGV0IHJlbW90ZUZpbGVEYXRhOiBhbnkgPSB7fTtcbiAgICAgICAgbGV0IGhvbWVGaWxlRGF0YTogYW55ID0ge307XG5cbiAgICAgICAgaWYgKHJlbW90ZVZhcmlhYmxlcyAmJiAhYXV0b0NvbXBsZXRpbmcpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVtb3RlVmFyaWFibGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSAvKD88dXJsPmdpdEAuKj8pPSg/PGZpbGU+Lio/KT0oPzxyZWY+LiopLy5leGVjKHJlbW90ZVZhcmlhYmxlc1tpXSk7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KG1hdGNoICE9IG51bGwsIFwiLS1yZW1vdGUtdmFyaWFibGVzIGlzIG1hbGZvcm1lZCB1c2UgJ2dpdEBnaXRsYWIuY29tOmZpcmVjb3cvZXhhbXBsZS5naXQ9Z2l0bGFiLXZhcmlhYmxlcy55bWw9bWFzdGVyJyBzeW50YXhcIik7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gbWF0Y2guZ3JvdXBzPy51cmw7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IG1hdGNoLmdyb3Vwcz8uZmlsZTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWYgPSBtYXRjaC5ncm91cHM/LnJlZjtcbiAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBhd2FpdCBVdGlscy5iYXNoKGBzZXQgLWVvdSBwaXBlZmFpbDsgZ2l0IGFyY2hpdmUgLS1yZW1vdGU9JHt1cmx9ICR7cmVmfSAke2ZpbGV9IHwgdGFyIC14TyAke2ZpbGV9YCwgY3dkKTtcbiAgICAgICAgICAgICAgICBjb25zdCBsb2FkZWRZYW1sID0geWFtbC5sb2FkKGAke3Jlcy5zdGRvdXR9YCk7XG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgbG9hZGVkWWFtbCBpcyBhbiBvYmplY3RcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGxvYWRlZFlhbWwgPT09IFwib2JqZWN0XCIgJiYgbG9hZGVkWWFtbCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICByZW1vdGVGaWxlRGF0YSA9IGRlZXBFeHRlbmQocmVtb3RlRmlsZURhdGEsIGxvYWRlZFlhbWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhd2FpdCBmcy5wYXRoRXhpc3RzKGhvbWVWYXJpYWJsZXNGaWxlKSkge1xuICAgICAgICAgICAgaG9tZUZpbGVEYXRhID0geWFtbC5sb2FkKGF3YWl0IGZzLnJlYWRGaWxlKGhvbWVWYXJpYWJsZXNGaWxlLCBcInV0ZjhcIiksIHtzY2hlbWE6IHlhbWwuRkFJTFNBRkVfU0NIRU1BfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB1bnBhY2sgPSAodjogYW55KToge3ZhbHVlczogYW55OyB0eXBlOiBcImZpbGVcIiB8IFwidmFyaWFibGVcIiB8IG51bGx9ID0+IHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhdGNoQWxsOiB7dmFsdWVzOiBhbnk7IHR5cGU6IFwiZmlsZVwiIHwgXCJ2YXJpYWJsZVwiIHwgbnVsbH0gPSB7dmFsdWVzOiB7fSwgdHlwZTogbnVsbH07XG4gICAgICAgICAgICAgICAgY2F0Y2hBbGwudmFsdWVzID0ge307XG4gICAgICAgICAgICAgICAgY2F0Y2hBbGwudmFsdWVzW1wiKlwiXSA9IHY7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNhdGNoQWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2LnR5cGUgPSB2LnR5cGUgPz8gXCJ2YXJpYWJsZVwiO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGFkZFRvVmFyaWFibGVzID0gYXN5bmMgKGtleTogc3RyaW5nLCB2YWw6IGFueSwgc2NvcGVQcmlvcml0eTogbnVtYmVyLCBpc0RvdEVudiA9IGZhbHNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB7dHlwZSwgdmFsdWVzfSA9IHVucGFjayh2YWwpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbbWF0Y2hlciwgY29udGVudF0gb2YgT2JqZWN0LmVudHJpZXModmFsdWVzKSkge1xuICAgICAgICAgICAgICAgIGFzc2VydCh0eXBlb2YgY29udGVudCA9PSBcInN0cmluZ1wiLCBgJHtrZXl9LiR7bWF0Y2hlcn0gY29udGVudCBtdXN0IGJlIHRleHQgb3IgbXVsdGlsaW5lIHRleHRgKTtcbiAgICAgICAgICAgICAgICBpZiAoaXNEb3RFbnYgfHwgdHlwZSA9PT0gXCJ2YXJpYWJsZVwiIHx8ICh0eXBlID09PSBudWxsICYmICEvXlsvfl0vLmV4ZWMoY29udGVudCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4cCA9IG1hdGNoZXIgPT09IFwiKlwiID8gLy4qL2cgOiBuZXcgUmVnRXhwKGBeJHttYXRjaGVyLnJlcGxhY2UoL1xcKi9nLCBcIi4qXCIpfSRgLCBcImdcIik7XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlc1trZXldID0gdmFyaWFibGVzW2tleV0gPz8ge3R5cGU6IFwidmFyaWFibGVcIiwgZW52aXJvbm1lbnRzOiBbXX07XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlc1trZXldLmVudmlyb25tZW50cy5wdXNoKHtjb250ZW50LCByZWdleHAsIHJlZ2V4cFByaW9yaXR5OiBtYXRjaGVyLmxlbmd0aCwgc2NvcGVQcmlvcml0eX0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gbnVsbCAmJiAvXlsvfl0vLmV4ZWMoY29udGVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsZVNvdXJjZSA9IGNvbnRlbnQucmVwbGFjZSgvXn5cXC8oLiopLywgYCR7aG9tZURpcn0vJDFgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVnZXhwID0gbWF0Y2hlciA9PT0gXCIqXCIgPyAvLiovZyA6IG5ldyBSZWdFeHAoYF4ke21hdGNoZXIucmVwbGFjZSgvXFwqL2csIFwiLipcIil9JGAsIFwiZ1wiKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzW2tleV0gPSB2YXJpYWJsZXNba2V5XSA/PyB7dHlwZTogXCJmaWxlXCIsIGVudmlyb25tZW50czogW119O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhmaWxlU291cmNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzW2tleV0uZW52aXJvbm1lbnRzLnB1c2goe2NvbnRlbnQsIHJlZ2V4cCwgcmVnZXhwUHJpb3JpdHk6IG1hdGNoZXIubGVuZ3RoLCBzY29wZVByaW9yaXR5LCBmaWxlU291cmNlfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXNba2V5XS5lbnZpcm9ubWVudHMucHVzaCh7Y29udGVudDogYHdhcm46ICR7a2V5fSBpcyBwb2ludGluZyB0byBpbnZhbGlkIHBhdGhcXG5gLCByZWdleHAsIHJlZ2V4cFByaW9yaXR5OiBtYXRjaGVyLmxlbmd0aCwgc2NvcGVQcmlvcml0eX0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSBcImZpbGVcIikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleHAgPSBtYXRjaGVyID09PSBcIipcIiA/IC8uKi9nIDogbmV3IFJlZ0V4cChgXiR7bWF0Y2hlci5yZXBsYWNlKC9cXCovZywgXCIuKlwiKX0kYCwgXCJnXCIpO1xuICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXNba2V5XSA9IHZhcmlhYmxlc1trZXldID8/IHt0eXBlOiBcImZpbGVcIiwgZW52aXJvbm1lbnRzOiBbXX07XG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlc1trZXldLmVudmlyb25tZW50cy5wdXNoKHtjb250ZW50LCByZWdleHAsIHJlZ2V4cFByaW9yaXR5OiBtYXRjaGVyLmxlbmd0aCwgc2NvcGVQcmlvcml0eX0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFzc2VydChmYWxzZSwgYCR7a2V5fSB3YXMgbm90IGhhbmRsZWQgcHJvcGVybHlgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgYWRkVmFyaWFibGVGaWxlVG9WYXJpYWJsZXMgPSBhc3luYyAoZmlsZURhdGE6IGFueSwgZmlsZVByaW9yaXR5OiBudW1iZXIpID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2dsb2JhbEtleSwgZ2xvYmFsRW50cnldIG9mIE9iamVjdC5lbnRyaWVzKGZpbGVEYXRhPy5nbG9iYWwgPz8ge30pKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgYWRkVG9WYXJpYWJsZXMoZ2xvYmFsS2V5LCBnbG9iYWxFbnRyeSwgMSArIGZpbGVQcmlvcml0eSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGdyb3VwVXJsID0gYCR7Z2l0RGF0YS5yZW1vdGUuaG9zdH0vJHtnaXREYXRhLnJlbW90ZS5ncm91cH0vYDtcbiAgICAgICAgICAgIGZvciAoY29uc3QgW2dyb3VwS2V5LCBncm91cEVudHJpZXNdIG9mIE9iamVjdC5lbnRyaWVzKGZpbGVEYXRhPy5ncm91cCA/PyB7fSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoIWdyb3VwVXJsLmluY2x1ZGVzKHRoaXMubm9ybWFsaXplUHJvamVjdEtleShncm91cEtleSwgd3JpdGVTdHJlYW1zKSkpIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIGFzc2VydChncm91cEVudHJpZXMgIT0gbnVsbCwgXCJncm91cEVudHJpZXMgY2Fubm90IGJlIG51bGwvdW5kZWZpbmVkXCIpO1xuICAgICAgICAgICAgICAgIGFzc2VydChVdGlscy5pc09iamVjdChncm91cEVudHJpZXMpLCBcImdyb3VwIGVudHJpZXMgaW4gdmFyaWFibGUgZmlsZXMgbXVzdCBiZSBhbiBvYmplY3RcIik7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoZ3JvdXBFbnRyaWVzKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhZGRUb1ZhcmlhYmxlcyhrLCB2LCAyICsgZmlsZVByaW9yaXR5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHByb2plY3RVcmwgPSBgJHtnaXREYXRhLnJlbW90ZS5ob3N0fS8ke2dpdERhdGEucmVtb3RlLmdyb3VwfS8ke2dpdERhdGEucmVtb3RlLnByb2plY3R9LmdpdGA7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtwcm9qZWN0S2V5LCBwcm9qZWN0RW50cmllc10gb2YgT2JqZWN0LmVudHJpZXMoZmlsZURhdGE/LnByb2plY3QgPz8gW10pKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFwcm9qZWN0VXJsLmluY2x1ZGVzKHRoaXMubm9ybWFsaXplUHJvamVjdEtleShwcm9qZWN0S2V5LCB3cml0ZVN0cmVhbXMpKSkgY29udGludWU7XG4gICAgICAgICAgICAgICAgYXNzZXJ0KHByb2plY3RFbnRyaWVzICE9IG51bGwsIFwicHJvamVjdEVudHJpZXMgY2Fubm90IGJlIG51bGwvdW5kZWZpbmVkXCIpO1xuICAgICAgICAgICAgICAgIGFzc2VydChVdGlscy5pc09iamVjdChwcm9qZWN0RW50cmllcyksIFwicHJvamVjdCBlbnRyaWVzIGluIHZhcmlhYmxlIGZpbGVzIG11c3QgYmUgYW4gb2JqZWN0XCIpO1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKHByb2plY3RFbnRyaWVzKSkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhZGRUb1ZhcmlhYmxlcyhrLCB2LCAzICsgZmlsZVByaW9yaXR5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgYWRkVmFyaWFibGVGaWxlVG9WYXJpYWJsZXMocmVtb3RlRmlsZURhdGEsIDApO1xuICAgICAgICBhd2FpdCBhZGRWYXJpYWJsZUZpbGVUb1ZhcmlhYmxlcyhob21lRmlsZURhdGEsIDEwKTtcblxuICAgICAgICBjb25zdCBwcm9qZWN0VmFyaWFibGVzRmlsZSA9IGAke2FyZ3YuY3dkfS8ke2FyZ3YudmFyaWFibGVzRmlsZX1gO1xuICAgICAgICBpZiAoZnMuZXhpc3RzU3luYyhwcm9qZWN0VmFyaWFibGVzRmlsZSkpIHtcbiAgICAgICAgICAgIGxldCBpc0RvdEVudkZvcm1hdCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcHJvamVjdFZhcmlhYmxlc0ZpbGVSYXdDb250ZW50ID0gYXdhaXQgZnMucmVhZEZpbGUocHJvamVjdFZhcmlhYmxlc0ZpbGUsIFwidXRmOFwiKTtcbiAgICAgICAgICAgIGxldCBwcm9qZWN0VmFyaWFibGVzRmlsZURhdGE7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHByb2plY3RWYXJpYWJsZXNGaWxlRGF0YSA9IHlhbWwubG9hZChwcm9qZWN0VmFyaWFibGVzRmlsZVJhd0NvbnRlbnQsIHtzY2hlbWE6IHlhbWwuRkFJTFNBRkVfU0NIRU1BfSkgPz8ge307XG5cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mKHByb2plY3RWYXJpYWJsZXNGaWxlRGF0YSkgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgaXNEb3RFbnZGb3JtYXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0VmFyaWFibGVzRmlsZURhdGEgPSBkb3RlbnYucGFyc2UocHJvamVjdFZhcmlhYmxlc0ZpbGVSYXdDb250ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiB5YW1sLllBTUxFeGNlcHRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgaXNEb3RFbnZGb3JtYXQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBwcm9qZWN0VmFyaWFibGVzRmlsZURhdGEgPSBkb3RlbnYucGFyc2UocHJvamVjdFZhcmlhYmxlc0ZpbGVSYXdDb250ZW50KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBhc3NlcnQocHJvamVjdFZhcmlhYmxlc0ZpbGVEYXRhICE9IG51bGwsIFwicHJvamVjdEVudHJpZXMgY2Fubm90IGJlIG51bGwvdW5kZWZpbmVkXCIpO1xuICAgICAgICAgICAgYXNzZXJ0KFV0aWxzLmlzT2JqZWN0KHByb2plY3RWYXJpYWJsZXNGaWxlRGF0YSksIGAke2FyZ3YuY3dkfS8uZ2l0bGFiLWNpLWxvY2FsLXZhcmlhYmxlcy55bWwgbXVzdCBjb250YWluIGFuIG9iamVjdGApO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMocHJvamVjdFZhcmlhYmxlc0ZpbGVEYXRhKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGFkZFRvVmFyaWFibGVzKGssIHYsIDI0LCBpc0RvdEVudkZvcm1hdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGNvbnN0IHZhck9iaiBvZiBPYmplY3QudmFsdWVzKHZhcmlhYmxlcykpIHtcbiAgICAgICAgICAgIHZhck9iai5lbnZpcm9ubWVudHMuc29ydCgoYSwgYikgPT4gYi5zY29wZVByaW9yaXR5IC0gYS5zY29wZVByaW9yaXR5KTtcbiAgICAgICAgICAgIHZhck9iai5lbnZpcm9ubWVudHMuc29ydCgoYSwgYikgPT4gYi5yZWdleHBQcmlvcml0eSAtIGEucmVnZXhwUHJpb3JpdHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhcmlhYmxlcztcbiAgICB9XG5cbiAgICBzdGF0aWMgbm9ybWFsaXplUHJvamVjdEtleSAoa2V5OiBzdHJpbmcsIHdyaXRlU3RyZWFtczogV3JpdGVTdHJlYW1zKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFrZXkuaW5jbHVkZXMoXCI6XCIpKSByZXR1cm4ga2V5O1xuICAgICAgICB3cml0ZVN0cmVhbXMuc3RkZXJyKGNoYWxrYHt5ZWxsb3cgV0FSTklORzogSW50ZXJwcmV0aW5nICcke2tleX0nIGFzICcke2tleS5yZXBsYWNlKFwiOlwiLCBcIi9cIil9J31cXG5gKTtcbiAgICAgICAgcmV0dXJuIGtleS5yZXBsYWNlKFwiOlwiLCBcIi9cIik7XG4gICAgfVxufVxuIl19
@@ -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