projen
Version:
CDK for software projects
137 lines • 21.4 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.Projenrc = void 0;
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
const fs_1 = require("fs");
const path_1 = require("path");
const javascript_1 = require("../javascript");
const typescript_runner_1 = require("./typescript-runner");
const render_options_1 = require("../javascript/render-options");
const projenrc_1 = require("../projenrc");
const DEFAULT_FILENAME = ".projenrc.ts";
/**
* A projenrc file written in TypeScript
*
* This component is used within TypeScriptProject.
*/
class Projenrc extends projenrc_1.ProjenrcFile {
static [JSII_RTTI_SYMBOL_1] = { fqn: "projen.typescript.Projenrc", version: "0.103.12" };
filePath;
tsconfig;
_projenCodeDir;
_tsProject;
_runner;
constructor(project, options = {}) {
super(project);
this._tsProject = project;
this.filePath = options.filename ?? DEFAULT_FILENAME;
this._projenCodeDir = options.projenCodeDir ?? "projenrc";
// Give the projenrc source tree its own `tsconfig.json` so the eslint
// project service (and editors) resolve it as the nearest config for those
// files. This avoids listing the whole tree under `allowDefaultProject`,
// which only permits a small number of loose files (and rejects `**`
// globs). It extends the root config and is type-check only.
const baseTsconfig = project.tsconfig ?? project.tsconfigDev;
this.tsconfig = new javascript_1.TypescriptConfig(project, {
fileName: `${this._projenCodeDir}/tsconfig.json`,
include: ["**/*.ts", path_1.posix.relative(this._projenCodeDir, this.filePath)],
extends: javascript_1.TypescriptConfigExtends.fromTypescriptConfigs([baseTsconfig]),
compilerOptions: {
noEmit: true,
rootDir: path_1.posix.relative(this._projenCodeDir, ".") || ".",
},
});
// A runner is a future component, make sure it is attached
this._runner = this.getRunner(options).tryAttach(this._tsProject);
this.addDefaultTask();
}
projectCreation(initProject) {
this.generateProjenrc(initProject);
}
addDefaultTask() {
// Render the run config for the entrypoint
const { dependencies, steps } = this._runner.configFor(this.filePath);
// Request runner dependencies
for (const dep of dependencies) {
this._tsProject.deps.requestDependency(dep);
}
// Add runner steps
this._tsProject.defaultTask?.addSteps(...steps);
}
getRunner(options) {
// use a provide runner as is
if (options.runner) {
return options.runner;
}
// swc implies ts-node runner for backwards compatibility
if (options.swc) {
return typescript_runner_1.TypeScriptRunner.tsNode({
swc: true,
typeCheck: true,
tsconfig: this.tsconfig.fileName,
}).tryAttach(this._tsProject);
}
// we use the project's default runner with the correct tsconfig and type-checking enabled
return this._tsProject.runner.copy({
tsconfig: this.tsconfig.fileName,
typeCheck: true,
});
}
preSynthesize() {
super.preSynthesize();
this._tsProject.addPackageIgnore(`/${this.filePath}`);
this._tsProject.addPackageIgnore(`/${this._projenCodeDir}`);
// The projenrc entrypoint lives at the repository root and is not covered
// by any `tsconfig.json`. Register only this single file with the eslint
// project service's default project (the projenrc source tree is covered
// by its own tsconfig). `allowDefaultProject` does not permit `**` globs.
this._tsProject.eslint?.allowDefaultProjectFiles(this.filePath);
this._tsProject.eslint?.addLintPattern(this._projenCodeDir);
this._tsProject.eslint?.addLintPattern(this.filePath);
this._tsProject.eslint?.allowDevDeps(this.filePath);
this._tsProject.eslint?.allowDevDeps(`${this._projenCodeDir}/**/*.ts`);
this._tsProject.eslint?.addIgnorePattern(`!${this.filePath}`);
this._tsProject.eslint?.addIgnorePattern(`!${this._projenCodeDir}/**/*.ts`);
this._tsProject.eslint?.addOverride({
files: [this.filePath],
rules: {
"@typescript-eslint/no-require-imports": "off",
"import/no-extraneous-dependencies": "off",
},
});
this._tsProject.biome?.addFilePattern(this.filePath);
this._tsProject.biome?.addFilePattern(`${this._projenCodeDir}/**`);
this._tsProject.jest?.discoverTestMatchPatternsForDirs([this._projenCodeDir], {
fileExtensionPattern: this._tsProject.tsconfig?.compilerOptions?.allowJs
? undefined
: "ts?(x)",
});
}
generateProjenrc(bootstrap) {
const rcfile = (0, path_1.resolve)(this.project.outdir, this.filePath);
if ((0, fs_1.existsSync)(rcfile)) {
return; // already exists
}
const parts = bootstrap.fqn.split(".");
const moduleName = parts[0];
const importName = parts[1];
const className = parts.slice(1).join(".");
const { renderedOptions, imports } = (0, render_options_1.renderJavaScriptOptions)({
args: bootstrap.args,
type: bootstrap.type,
comments: bootstrap.comments,
});
imports.add(moduleName, importName);
const lines = new Array();
lines.push(...imports.asEsmImports());
lines.push();
lines.push(`const project = new ${className}(${renderedOptions});`);
lines.push();
lines.push("project.synth();");
(0, fs_1.mkdirSync)((0, path_1.dirname)(rcfile), { recursive: true });
(0, fs_1.writeFileSync)(rcfile, lines.join("\n"));
this.project.logger.info(`Project definition file was created at ${rcfile}`);
}
}
exports.Projenrc = Projenrc;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVucmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdHlwZXNjcmlwdC9wcm9qZW5yYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsMkJBQTBEO0FBQzFELCtCQUErQztBQUUvQyw4Q0FBMEU7QUFFMUUsMkRBQXVEO0FBQ3ZELGlFQUF1RTtBQUV2RSwwQ0FBMkM7QUFpQzNDLE1BQU0sZ0JBQWdCLEdBQUcsY0FBYyxDQUFDO0FBRXhDOzs7O0dBSUc7QUFDSCxNQUFhLFFBQVMsU0FBUSx1QkFBWTs7SUFDeEIsUUFBUSxDQUFTO0lBQ2pCLFFBQVEsQ0FBbUI7SUFFMUIsY0FBYyxDQUFTO0lBQ3ZCLFVBQVUsQ0FBb0I7SUFDOUIsT0FBTyxDQUFtQjtJQUUzQyxZQUFZLE9BQTBCLEVBQUUsVUFBMkIsRUFBRTtRQUNuRSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixJQUFJLENBQUMsVUFBVSxHQUFHLE9BQU8sQ0FBQztRQUUxQixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksZ0JBQWdCLENBQUM7UUFDckQsSUFBSSxDQUFDLGNBQWMsR0FBRyxPQUFPLENBQUMsYUFBYSxJQUFJLFVBQVUsQ0FBQztRQUUxRCxzRUFBc0U7UUFDdEUsMkVBQTJFO1FBQzNFLHlFQUF5RTtRQUN6RSxxRUFBcUU7UUFDckUsNkRBQTZEO1FBQzdELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxRQUFRLElBQUksT0FBTyxDQUFDLFdBQVcsQ0FBQztRQUM3RCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksNkJBQWdCLENBQUMsT0FBTyxFQUFFO1lBQzVDLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxjQUFjLGdCQUFnQjtZQUNoRCxPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsWUFBSyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN4RSxPQUFP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Q0FBQyxDQUFDLENBQUM7UUFDeEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUN0QiwwQ0FBMEMsTUFBTSxFQUFFLENBQ25ELENBQUM7SUFDSixDQUFDOztBQW5KSCw0QkFvSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jLCBta2RpclN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IGRpcm5hbWUsIHBvc2l4LCByZXNvbHZlIH0gZnJvbSBcInBhdGhcIjtcbmltcG9ydCB0eXBlIHsgSW52ZW50b3J5UHJvamVjdFR5cGUgfSBmcm9tIFwiLi4vaW52ZW50b3J5XCI7XG5pbXBvcnQgeyBUeXBlc2NyaXB0Q29uZmlnLCBUeXBlc2NyaXB0Q29uZmlnRXh0ZW5kcyB9IGZyb20gXCIuLi9qYXZhc2NyaXB0XCI7XG5pbXBvcnQgdHlwZSB7IFR5cGVTY3JpcHRQcm9qZWN0IH0gZnJvbSBcIi4vdHlwZXNjcmlwdFwiO1xuaW1wb3J0IHsgVHlwZVNjcmlwdFJ1bm5lciB9IGZyb20gXCIuL3R5cGVzY3JpcHQtcnVubmVyXCI7XG5pbXBvcnQgeyByZW5kZXJKYXZhU2NyaXB0T3B0aW9ucyB9IGZyb20gXCIuLi9qYXZhc2NyaXB0L3JlbmRlci1vcHRpb25zXCI7XG5pbXBvcnQgdHlwZSB7IEluaXRQcm9qZWN0IH0gZnJvbSBcIi4uL3Byb2plY3RcIjtcbmltcG9ydCB7IFByb2plbnJjRmlsZSB9IGZyb20gXCIuLi9wcm9qZW5yY1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIFByb2plbnJjT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgcHJvamVucmMgZmlsZS5cbiAgICogQGRlZmF1bHQgXCIucHJvamVucmMudHNcIlxuICAgKi9cbiAgcmVhZG9ubHkgZmlsZW5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZGlyZWN0b3J5IHRyZWUgdGhhdCBtYXkgY29udGFpbiAqLnRzIGZpbGVzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbVxuICAgKiB5b3VyIHByb2plbnJjIHR5cGVzY3JpcHQgZmlsZS5cbiAgICpcbiAgICogQGRlZmF1bHQgXCJwcm9qZW5yY1wiXG4gICAqL1xuICByZWFkb25seSBwcm9qZW5Db2RlRGlyPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIHVzZSBgU1dDYCBmb3IgdHMtbm9kZS5cbiAgICpcbiAgICogQGRlZmF1bHQgZmFsc2VcbiAgICogQGRlcHJlY2F0ZWQgVXNlIGBydW5uZXI6IFR5cGVTY3JpcHRSdW5uZXIudHNOb2RlKHsgc3djOiB0cnVlIH0pYCBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3djPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIHJ1bm5lciB0byB1c2UgZm9yIGV4ZWN1dGluZyBUeXBlU2NyaXB0IGZpbGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIHRoZSBwcm9qZWN0J3MgcnVubmVyXG4gICAqL1xuICByZWFkb25seSBydW5uZXI/OiBUeXBlU2NyaXB0UnVubmVyO1xufVxuXG5jb25zdCBERUZBVUxUX0ZJTEVOQU1FID0gXCIucHJvamVucmMudHNcIjtcblxuLyoqXG4gKiBBIHByb2plbnJjIGZpbGUgd3JpdHRlbiBpbiBUeXBlU2NyaXB0XG4gKlxuICogVGhpcyBjb21wb25lbnQgaXMgdXNlZCB3aXRoaW4gVHlwZVNjcmlwdFByb2plY3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBQcm9qZW5yYyBleHRlbmRzIFByb2plbnJjRmlsZSB7XG4gIHB1YmxpYyByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuICBwdWJsaWMgcmVhZG9ubHkgdHNjb25maWc6IFR5cGVzY3JpcHRDb25maWc7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfcHJvamVuQ29kZURpcjogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IF90c1Byb2plY3Q6IFR5cGVTY3JpcHRQcm9qZWN0O1xuICBwcml2YXRlIHJlYWRvbmx5IF9ydW5uZXI6IFR5cGVTY3JpcHRSdW5uZXI7XG5cbiAgY29uc3RydWN0b3IocHJvamVjdDogVHlwZVNjcmlwdFByb2plY3QsIG9wdGlvbnM6IFByb2plbnJjT3B0aW9ucyA9IHt9KSB7XG4gICAgc3VwZXIocHJvamVjdCk7XG4gICAgdGhpcy5fdHNQcm9qZWN0ID0gcHJvamVjdDtcblxuICAgIHRoaXMuZmlsZVBhdGggPSBvcHRpb25zLmZpbGVuYW1lID8/IERFRkFVTFRfRklMRU5BTUU7XG4gICAgdGhpcy5fcHJvamVuQ29kZURpciA9IG9wdGlvbnMucHJvamVuQ29kZURpciA/PyBcInByb2plbnJjXCI7XG5cbiAgICAvLyBHaXZlIHRoZSBwcm9qZW5yYyBzb3VyY2UgdHJlZSBpdHMgb3duIGB0c2NvbmZpZy5qc29uYCBzbyB0aGUgZXNsaW50XG4gICAgLy8gcHJvamVjdCBzZXJ2aWNlIChhbmQgZWRpdG9ycykgcmVzb2x2ZSBpdCBhcyB0aGUgbmVhcmVzdCBjb25maWcgZm9yIHRob3NlXG4gICAgLy8gZmlsZXMuIFRoaXMgYXZvaWRzIGxpc3RpbmcgdGhlIHdob2xlIHRyZWUgdW5kZXIgYGFsbG93RGVmYXVsdFByb2plY3RgLFxuICAgIC8vIHdoaWNoIG9ubHkgcGVybWl0cyBhIHNtYWxsIG51bWJlciBvZiBsb29zZSBmaWxlcyAoYW5kIHJlamVjdHMgYCoqYFxuICAgIC8vIGdsb2JzKS4gSXQgZXh0ZW5kcyB0aGUgcm9vdCBjb25maWcgYW5kIGlzIHR5cGUtY2hlY2sgb25seS5cbiAgICBjb25zdCBiYXNlVHNjb25maWcgPSBwcm9qZWN0LnRzY29uZmlnID8/IHByb2plY3QudHNjb25maWdEZXY7XG4gICAgdGhpcy50c2NvbmZpZyA9IG5ldyBUeXBlc2NyaXB0Q29uZmlnKHByb2plY3QsIHtcbiAgICAgIGZpbGVOYW1lOiBgJHt0aGlzLl9wcm9qZW5Db2RlRGlyfS90c2NvbmZpZy5qc29uYCxcbiAgICAgIGluY2x1ZGU6IFtcIioqLyoudHNcIiwgcG9zaXgucmVsYXRpdmUodGhpcy5fcHJvamVuQ29kZURpciwgdGhpcy5maWxlUGF0aCldLFxuICAgICAgZXh0ZW5kczogVHlwZXNjcmlwdENvbmZpZ0V4dGVuZHMuZnJvbVR5cGVzY3JpcHRDb25maWdzKFtiYXNlVHNjb25maWddKSxcbiAgICAgIGNvbXBpbGVyT3B0aW9uczoge1xuICAgICAgICBub0VtaXQ6IHRydWUsXG4gICAgICAgIHJvb3REaXI6IHBvc2l4LnJlbGF0aXZlKHRoaXMuX3Byb2plbkNvZGVEaXIsIFwiLlwiKSB8fCBcIi5cIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBBIHJ1bm5lciBpcyBhIGZ1dHVyZSBjb21wb25lbnQsIG1ha2Ugc3VyZSBpdCBpcyBhdHRhY2hlZFxuICAgIHRoaXMuX3J1bm5lciA9IHRoaXMuZ2V0UnVubmVyKG9wdGlvbnMpLnRyeUF0dGFjaCh0aGlzLl90c1Byb2plY3QpO1xuXG4gICAgdGhpcy5hZGREZWZhdWx0VGFzaygpO1xuICB9XG5cbiAgcHVibGljIHByb2plY3RDcmVhdGlvbihpbml0UHJvamVjdDogSW5pdFByb2plY3QpIHtcbiAgICB0aGlzLmdlbmVyYXRlUHJvamVucmMoaW5pdFByb2plY3QpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGREZWZhdWx0VGFzaygpIHtcbiAgICAvLyBSZW5kZXIgdGhlIHJ1biBjb25maWcgZm9yIHRoZSBlbnRyeXBvaW50XG4gICAgY29uc3QgeyBkZXBlbmRlbmNpZXMsIHN0ZXBzIH0gPSB0aGlzLl9ydW5uZXIuY29uZmlnRm9yKHRoaXMuZmlsZVBhdGgpO1xuXG4gICAgLy8gUmVxdWVzdCBydW5uZXIgZGVwZW5kZW5jaWVzXG4gICAgZm9yIChjb25zdCBkZXAgb2YgZGVwZW5kZW5jaWVzKSB7XG4gICAgICB0aGlzLl90c1Byb2plY3QuZGVwcy5yZXF1ZXN0RGVwZW5kZW5jeShkZXApO1xuICAgIH1cblxuICAgIC8vIEFkZCBydW5uZXIgc3RlcHNcbiAgICB0aGlzLl90c1Byb2plY3QuZGVmYXVsdFRhc2s/LmFkZFN0ZXBzKC4uLnN0ZXBzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UnVubmVyKG9wdGlvbnM6IFByb2plbnJjT3B0aW9ucyk6IFR5cGVTY3JpcHRSdW5uZXIge1xuICAgIC8vIHVzZSBhIHByb3ZpZGUgcnVubmVyIGFzIGlzXG4gICAgaWYgKG9wdGlvbnMucnVubmVyKSB7XG4gICAgICByZXR1cm4gb3B0aW9ucy5ydW5uZXI7XG4gICAgfVxuXG4gICAgLy8gc3djIGltcGxpZXMgdHMtbm9kZSBydW5uZXIgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgaWYgKG9wdGlvbnMuc3djKSB7XG4gICAgICByZXR1cm4gVHlwZVNjcmlwdFJ1bm5lci50c05vZGUoe1xuICAgICAgICBzd2M6IHRydWUsXG4gICAgICAgIHR5cGVDaGVjazogdHJ1ZSxcbiAgICAgICAgdHNjb25maWc6IHRoaXMudHNjb25maWcuZmlsZU5hbWUsXG4gICAgICB9KS50cnlBdHRhY2godGhpcy5fdHNQcm9qZWN0KTtcbiAgICB9XG5cbiAgICAvLyB3ZSB1c2UgdGhlIHByb2plY3QncyBkZWZhdWx0IHJ1bm5lciB3aXRoIHRoZSBjb3JyZWN0IHRzY29uZmlnIGFuZCB0eXBlLWNoZWNraW5nIGVuYWJsZWRcbiAgICByZXR1cm4gdGhpcy5fdHNQcm9qZWN0LnJ1bm5lci5jb3B5KHtcbiAgICAgIHRzY29uZmlnOiB0aGlzLnRzY29uZmlnLmZpbGVOYW1lLFxuICAgICAgdHlwZUNoZWNrOiB0cnVlLFxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIHByZVN5bnRoZXNpemUoKTogdm9pZCB7XG4gICAgc3VwZXIucHJlU3ludGhlc2l6ZSgpO1xuXG4gICAgdGhpcy5fdHNQcm9qZWN0LmFkZFBhY2thZ2VJZ25vcmUoYC8ke3RoaXMuZmlsZVBhdGh9YCk7XG4gICAgdGhpcy5fdHNQcm9qZWN0LmFkZFBhY2thZ2VJZ25vcmUoYC8ke3RoaXMuX3Byb2plbkNvZGVEaXJ9YCk7XG5cbiAgICAvLyBUaGUgcHJvamVucmMgZW50cnlwb2ludCBsaXZlcyBhdCB0aGUgcmVwb3NpdG9yeSByb290IGFuZCBpcyBub3QgY292ZXJlZFxuICAgIC8vIGJ5IGFueSBgdHNjb25maWcuanNvbmAuIFJlZ2lzdGVyIG9ubHkgdGhpcyBzaW5nbGUgZmlsZSB3aXRoIHRoZSBlc2xpbnRcbiAgICAvLyBwcm9qZWN0IHNlcnZpY2UncyBkZWZhdWx0IHByb2plY3QgKHRoZSBwcm9qZW5yYyBzb3VyY2UgdHJlZSBpcyBjb3ZlcmVkXG4gICAgLy8gYnkgaXRzIG93biB0c2NvbmZpZykuIGBhbGxvd0RlZmF1bHRQcm9qZWN0YCBkb2VzIG5vdCBwZXJtaXQgYCoqYCBnbG9icy5cbiAgICB0aGlzLl90c1Byb2plY3QuZXNsaW50Py5hbGxvd0RlZmF1bHRQcm9qZWN0RmlsZXModGhpcy5maWxlUGF0aCk7XG5cbiAgICB0aGlzLl90c1Byb2plY3QuZXNsaW50Py5hZGRMaW50UGF0dGVybih0aGlzLl9wcm9qZW5Db2RlRGlyKTtcbiAgICB0aGlzLl90c1Byb2plY3QuZXNsaW50Py5hZGRMaW50UGF0dGVybih0aGlzLmZpbGVQYXRoKTtcbiAgICB0aGlzLl90c1Byb2plY3QuZXNsaW50Py5hbGxvd0RldkRlcHModGhpcy5maWxlUGF0aCk7XG4gICAgdGhpcy5fdHNQcm9qZWN0LmVzbGludD8uYWxsb3dEZXZEZXBzKGAke3RoaXMuX3Byb2plbkNvZGVEaXJ9LyoqLyoudHNgKTtcbiAgICB0aGlzLl90c1Byb2plY3QuZXNsaW50Py5hZGRJZ25vcmVQYXR0ZXJuKGAhJHt0aGlzLmZpbGVQYXRofWApO1xuICAgIHRoaXMuX3RzUHJvamVjdC5lc2xpbnQ/LmFkZElnbm9yZVBhdHRlcm4oYCEke3RoaXMuX3Byb2plbkNvZGVEaXJ9LyoqLyoudHNgKTtcblxuICAgIHRoaXMuX3RzUHJvamVjdC5lc2xpbnQ/LmFkZE92ZXJyaWRlKHtcbiAgICAgIGZpbGVzOiBbdGhpcy5maWxlUGF0aF0sXG4gICAgICBydWxlczoge1xuICAgICAgICBcIkB0eXBlc2NyaXB0LWVzbGludC9uby1yZXF1aXJlLWltcG9ydHNcIjogXCJvZmZcIixcbiAgICAgICAgXCJpbXBvcnQvbm8tZXh0cmFuZW91cy1kZXBlbmRlbmNpZXNcIjogXCJvZmZcIixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICB0aGlzLl90c1Byb2plY3QuYmlvbWU/LmFkZEZpbGVQYXR0ZXJuKHRoaXMuZmlsZVBhdGgpO1xuICAgIHRoaXMuX3RzUHJvamVjdC5iaW9tZT8uYWRkRmlsZVBhdHRlcm4oYCR7dGhpcy5fcHJvamVuQ29kZURpcn0vKipgKTtcblxuICAgIHRoaXMuX3RzUHJvamVjdC5qZXN0Py5kaXNjb3ZlclRlc3RNYXRjaFBhdHRlcm5zRm9yRGlycyhcbiAgICAgIFt0aGlzLl9wcm9qZW5Db2RlRGlyXSxcbiAgICAgIHtcbiAgICAgICAgZmlsZUV4dGVuc2lvblBhdHRlcm46IHRoaXMuX3RzUHJvamVjdC50c2NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5hbGxvd0pzXG4gICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICA6IFwidHM/KHgpXCIsXG4gICAgICB9LFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGdlbmVyYXRlUHJvamVucmMoYm9vdHN0cmFwOiBJbml0UHJvamVjdCkge1xuICAgIGNvbnN0IHJjZmlsZSA9IHJlc29sdmUodGhpcy5wcm9qZWN0Lm91dGRpciwgdGhpcy5maWxlUGF0aCk7XG4gICAgaWYgKGV4aXN0c1N5bmMocmNmaWxlKSkge1xuICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IGV4aXN0c1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnRzID0gYm9vdHN0cmFwLmZxbi5zcGxpdChcIi5cIik7XG4gICAgY29uc3QgbW9kdWxlTmFtZSA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IGltcG9ydE5hbWUgPSBwYXJ0c1sxXTtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBwYXJ0cy5zbGljZSgxKS5qb2luKFwiLlwiKTtcblxuICAgIGNvbnN0IHsgcmVuZGVyZWRPcHRpb25zLCBpbXBvcnRzIH0gPSByZW5kZXJKYXZhU2NyaXB0T3B0aW9ucyh7XG4gICAgICBhcmdzOiBib290c3RyYXAuYXJncyxcbiAgICAgIHR5cGU6IGJvb3RzdHJhcC50eXBlIGFzIEludmVudG9yeVByb2plY3RUeXBlLFxuICAgICAgY29tbWVudHM6IGJvb3RzdHJhcC5jb21tZW50cyxcbiAgICB9KTtcblxuICAgIGltcG9ydHMuYWRkKG1vZHVsZU5hbWUsIGltcG9ydE5hbWUpO1xuXG4gICAgY29uc3QgbGluZXMgPSBuZXcgQXJyYXk8c3RyaW5nPigpO1xuICAgIGxpbmVzLnB1c2goLi4uaW1wb3J0cy5hc0VzbUltcG9ydHMoKSk7XG4gICAgbGluZXMucHVzaCgpO1xuICAgIGxpbmVzLnB1c2goYGNvbnN0IHByb2plY3QgPSBuZXcgJHtjbGFzc05hbWV9KCR7cmVuZGVyZWRPcHRpb25zfSk7YCk7XG4gICAgbGluZXMucHVzaCgpO1xuICAgIGxpbmVzLnB1c2goXCJwcm9qZWN0LnN5bnRoKCk7XCIpO1xuXG4gICAgbWtkaXJTeW5jKGRpcm5hbWUocmNmaWxlKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgd3JpdGVGaWxlU3luYyhyY2ZpbGUsIGxpbmVzLmpvaW4oXCJcXG5cIikpO1xuICAgIHRoaXMucHJvamVjdC5sb2dnZXIuaW5mbyhcbiAgICAgIGBQcm9qZWN0IGRlZmluaXRpb24gZmlsZSB3YXMgY3JlYXRlZCBhdCAke3JjZmlsZX1gLFxuICAgICk7XG4gIH1cbn1cbiJdfQ==