@nikovirtala/projen-constructs 0.1.5 → 0.1.6

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.
@@ -1,137 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ProjenProjectClass = void 0;
4
- const projen_1 = require("projen");
5
- class CodeBuffer {
6
- constructor(indent = " ") {
7
- this.indent = indent;
8
- this.lines = [];
9
- this.indentLevel = 0;
10
- }
11
- flush() {
12
- const current = this.lines;
13
- this.reset();
14
- return current;
15
- }
16
- line(code) {
17
- const prefix = this.indent.repeat(this.indentLevel);
18
- this.lines.push((prefix + (code ?? "")).trimEnd());
19
- }
20
- open(code) {
21
- if (code) {
22
- this.line(code);
23
- }
24
- this.indentLevel++;
25
- }
26
- close(code) {
27
- if (this.indentLevel === 0) {
28
- throw new Error("Cannot decrease indent level below zero");
29
- }
30
- this.indentLevel--;
31
- if (code) {
32
- this.line(code);
33
- }
34
- }
35
- reset() {
36
- this.lines = [];
37
- this.indentLevel = 0;
38
- }
39
- }
40
- class TypeScriptClassRenderer {
41
- constructor(indent = 4) {
42
- this.buffer = new CodeBuffer(" ".repeat(indent));
43
- }
44
- render(options) {
45
- this.buffer.flush();
46
- const customOptions = options.customOptions ?? ["mise", "vitest", "vitestOptions"];
47
- const imports = this.extractImports(options);
48
- this.renderImports(imports);
49
- this.buffer.line();
50
- this.renderExport(options);
51
- this.buffer.line();
52
- this.renderClass(options, customOptions);
53
- this.buffer.line();
54
- return this.buffer.flush().join("\n");
55
- }
56
- extractImports(options) {
57
- const imports = new Map();
58
- const baseModule = options.baseClass.split(".")[0];
59
- const optionsFileName = this.getOptionsFileName(options.optionsInterface);
60
- // Projen imports
61
- imports.set("projen", new Set([baseModule]));
62
- // Config imports
63
- imports.set("../config", new Set(["applyDefaultConfig", options.defaultConfig]));
64
- // Utils imports
65
- imports.set("../utils", new Set(["deepMerge"]));
66
- // Options interface import (type-only)
67
- imports.set(`./${optionsFileName}.generated`, new Set([options.optionsInterface]));
68
- return imports;
69
- }
70
- renderImports(imports) {
71
- const sortedModules = Array.from(imports.keys()).sort((a, b) => {
72
- // Sort: external packages first, then relative imports
73
- const aIsRelative = a.startsWith(".");
74
- const bIsRelative = b.startsWith(".");
75
- if (aIsRelative !== bIsRelative) {
76
- return aIsRelative ? 1 : -1;
77
- }
78
- return a.localeCompare(b);
79
- });
80
- for (const mod of sortedModules) {
81
- const names = Array.from(imports.get(mod) || []).sort();
82
- const isTypeOnly = mod.includes(".generated");
83
- const importStmt = isTypeOnly ? "import type" : "import";
84
- this.buffer.line(`${importStmt} { ${names.join(", ")} } from "${mod}";`);
85
- }
86
- }
87
- renderExport(options) {
88
- const optionsFileName = this.getOptionsFileName(options.optionsInterface);
89
- this.buffer.line(`export { ${options.optionsInterface} } from "./${optionsFileName}.generated";`);
90
- }
91
- renderClass(options, customOptions) {
92
- this.buffer.open(`export class ${options.name} extends ${options.baseClass} {`);
93
- this.renderConstructor(options, customOptions);
94
- this.buffer.close("}");
95
- }
96
- renderConstructor(options, customOptions) {
97
- this.buffer.open(`constructor(options: ${options.optionsInterface}) {`);
98
- this.buffer.line(`const { ${customOptions.join(", ")}, ...baseOptions } = options;`);
99
- this.buffer.line();
100
- this.buffer.line(`super(deepMerge<${options.baseOptionsType}>(${options.defaultConfig}, baseOptions));`);
101
- this.buffer.line();
102
- this.buffer.line("applyDefaultConfig(this, vitest, vitestOptions, mise);");
103
- this.buffer.close("}");
104
- }
105
- getOptionsFileName(optionsInterface) {
106
- // Map known interfaces to their file names
107
- const mapping = {
108
- TypeScriptProjectOptions: "typescript-options",
109
- JsiiProjectOptions: "jsii-options",
110
- AwsCdkTypeScriptAppProjectOptions: "awscdk-typescript-app-options",
111
- AwsCdkConstructLibraryProjectOptions: "awscdk-construct-library-options",
112
- };
113
- return mapping[optionsInterface] || optionsInterface.toLowerCase();
114
- }
115
- }
116
- class ProjenProjectClass extends projen_1.Component {
117
- constructor(project, options) {
118
- super(project);
119
- this.options = options;
120
- this.renderer = new TypeScriptClassRenderer(options.indent);
121
- }
122
- preSynthesize() {
123
- const content = this.renderer.render(this.options);
124
- new TypeScriptClassFile(this.project, this.options.filePath, content, {
125
- readonly: this.options.readonly ?? true,
126
- });
127
- }
128
- }
129
- exports.ProjenProjectClass = ProjenProjectClass;
130
- class TypeScriptClassFile extends projen_1.TextFile {
131
- constructor(project, filePath, content, options = {}) {
132
- super(project, filePath, options);
133
- this.addLine(`// ${this.marker}`);
134
- this.addLine(content);
135
- }
136
- }
137
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVuLXByb2plY3QtY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvcHJvamVuLXByb2plY3QtY2xhc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbUNBQTZDO0FBOEM3QyxNQUFNLFVBQVU7SUFJWixZQUE2QixTQUFTLEdBQUc7UUFBWixXQUFNLEdBQU4sTUFBTSxDQUFNO1FBSGpDLFVBQUssR0FBRyxFQUFjLENBQUM7UUFDdkIsZ0JBQVcsR0FBRyxDQUFDLENBQUM7SUFFb0IsQ0FBQztJQUU3QyxLQUFLO1FBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDYixPQUFPLE9BQU8sQ0FBQztJQUNuQixDQUFDO0lBRUQsSUFBSSxDQUFDLElBQWE7UUFDZCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxJQUFJLENBQUMsSUFBYTtRQUNkLElBQUksSUFBSSxFQUFFLENBQUM7WUFDUCxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BCLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFhO1FBQ2YsSUFBSSxJQUFJLENBQUMsV0FBVyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztRQUMvRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ25CLElBQUksSUFBSSxF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LEdBQVAsT0FBTyxDQUEyQjtRQUduRCxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksdUJBQXVCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxhQUFhO1FBQ1QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBRW5ELElBQUksbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUU7WUFDbEUsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUk7U0FDMUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztDQUNKO0FBbEJELGdEQWtCQztBQUVELE1BQU0sbUJBQW9CLFNBQVEsaUJBQVE7SUFDdEMsWUFBWSxPQUFnQixFQUFFLFFBQWdCLEVBQUUsT0FBZSxFQUFFLFVBQTZCLEVBQUU7UUFDNUYsS0FBSyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDbEMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ2xDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDMUIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9qZWN0LCBTb3VyY2VDb2RlT3B0aW9ucyB9IGZyb20gXCJwcm9qZW5cIjtcbmltcG9ydCB7IENvbXBvbmVudCwgVGV4dEZpbGUgfSBmcm9tIFwicHJvamVuXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVuUHJvamVjdENsYXNzT3B0aW9ucyBleHRlbmRzIFNvdXJjZUNvZGVPcHRpb25zIHtcbiAgICAvKipcbiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzXG4gICAgICovXG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGJhc2UgY2xhc3MgdG8gZXh0ZW5kIChlLmcuLCBcInR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RcIilcbiAgICAgKi9cbiAgICByZWFkb25seSBiYXNlQ2xhc3M6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBvcHRpb25zIGludGVyZmFjZSBuYW1lIChlLmcuLCBcIlR5cGVTY3JpcHRQcm9qZWN0T3B0aW9uc1wiKVxuICAgICAqL1xuICAgIHJlYWRvbmx5IG9wdGlvbnNJbnRlcmZhY2U6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIFRoZSBiYXNlIG9wdGlvbnMgdHlwZSAoZS5nLiwgXCJ0eXBlc2NyaXB0LlR5cGVTY3JpcHRQcm9qZWN0T3B0aW9uc1wiKVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGJhc2VPcHRpb25zVHlwZTogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogVGhlIGRlZmF1bHQgY29uZmlnIGNvbnN0YW50IG5hbWUgKGUuZy4sIFwidHlwZXNjcmlwdFByb2plY3REZWZhdWx0T3B0aW9uc1wiKVxuICAgICAqL1xuICAgIHJlYWRvbmx5IGRlZmF1bHRDb25maWc6IHN0cmluZztcblxuICAgIC8qKlxuICAgICAqIE91dHB1dCBmaWxlIHBhdGhcbiAgICAgKi9cbiAgICByZWFkb25seSBmaWxlUGF0aDogc3RyaW5nO1xuXG4gICAgLyoqXG4gICAgICogQ3VzdG9tIG9wdGlvbnMgdG8gZXh0cmFjdCBmcm9tIGNvbnN0cnVjdG9yXG4gICAgICogQGRlZmF1bHQgW1wibWlzZVwiLCBcInZpdGVzdFwiLCBcInZpdGVzdE9wdGlvbnNcIl1cbiAgICAgKi9cbiAgICByZWFkb25seSBjdXN0b21PcHRpb25zPzogc3RyaW5nW107XG5cbiAgICAvKipcbiAgICAgKiBJbmRlbnRhdGlvbiBzaXplXG4gICAgICogQGRlZmF1bHQgNFxuICAgICAqL1xuICAgIHJlYWRvbmx5IGluZGVudD86IG51bWJlcjtcbn1cblxuY2xhc3MgQ29kZUJ1ZmZlciB7XG4gICAgcHJpdmF0ZSBsaW5lcyA9IFtdIGFzIHN0cmluZ1tdO1xuICAgIHByaXZhdGUgaW5kZW50TGV2ZWwgPSAwO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBpbmRlbnQgPSBcIiBcIikge31cblxuICAgIGZsdXNoKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgY29uc3QgY3VycmVudCA9IHRoaXMubGluZXM7XG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgfVxuXG4gICAgbGluZShjb2RlPzogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IHByZWZpeCA9IHRoaXMuaW5kZW50LnJlcGVhdCh0aGlzLmluZGVudExldmVsKTtcbiAgICAgICAgdGhpcy5saW5lcy5wdXNoKChwcmVmaXggKyAoY29kZSA/PyBcIlwiKSkudHJpbUVuZCgpKTtcbiAgICB9XG5cbiAgICBvcGVuKGNvZGU/OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMubGluZShjb2RlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGVudExldmVsKys7XG4gICAgfVxuXG4gICAgY2xvc2UoY29kZT86IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy5pbmRlbnRMZXZlbCA9PT0gMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGRlY3JlYXNlIGluZGVudCBsZXZlbCBiZWxvdyB6ZXJvXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZW50TGV2ZWwtLTtcbiAgICAgICAgaWYgKGNvZGUpIHtcbiAgICAgICAgICAgIHRoaXMubGluZShjb2RlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVzZXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMubGluZXMgPSBbXSBhcyBzdHJpbmdbXTtcbiAgICAgICAgdGhpcy5pbmRlbnRMZXZlbCA9IDA7XG4gICAgfVxufVxuXG5jbGFzcyBUeXBlU2NyaXB0Q2xhc3NSZW5kZXJlciB7XG4gICAgcHJpdmF0ZSBidWZmZXI6IENvZGVCdWZmZXI7XG5cbiAgICBjb25zdHJ1Y3RvcihpbmRlbnQgPSA0KSB7XG4gICAgICAgIHRoaXMuYnVmZmVyID0gbmV3IENvZGVCdWZmZXIoXCIgXCIucmVwZWF0KGluZGVudCkpO1xuICAgIH1cblxuICAgIHJlbmRlcihvcHRpb25zOiBQcm9qZW5Qcm9qZWN0Q2xhc3NPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgdGhpcy5idWZmZXIuZmx1c2goKTtcblxuICAgICAgICBjb25zdCBjdXN0b21PcHRpb25zID0gb3B0aW9ucy5jdXN0b21PcHRpb25zID8/IFtcIm1pc2VcIiwgXCJ2aXRlc3RcIiwgXCJ2aXRlc3RPcHRpb25zXCJdO1xuICAgICAgICBjb25zdCBpbXBvcnRzID0gdGhpcy5leHRyYWN0SW1wb3J0cyhvcHRpb25zKTtcblxuICAgICAgICB0aGlzLnJlbmRlckltcG9ydHMoaW1wb3J0cyk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJFeHBvcnQob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoKTtcbiAgICAgICAgdGhpcy5yZW5kZXJDbGFzcyhvcHRpb25zLCBjdXN0b21PcHRpb25zKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZSgpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5mbHVzaCgpLmpvaW4oXCJcXG5cIik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBleHRyYWN0SW1wb3J0cyhvcHRpb25zOiBQcm9qZW5Qcm9qZWN0Q2xhc3NPcHRpb25zKTogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+IHtcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IG5ldyBNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj4oKTtcbiAgICAgICAgY29uc3QgYmFzZU1vZHVsZSA9IG9wdGlvbnMuYmFzZUNsYXNzLnNwbGl0KFwiLlwiKVswXTtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVOYW1lID0gdGhpcy5nZXRPcHRpb25zRmlsZU5hbWUob3B0aW9ucy5vcHRpb25zSW50ZXJmYWNlKTtcblxuICAgICAgICAvLyBQcm9qZW4gaW1wb3J0c1xuICAgICAgICBpbXBvcnRzLnNldChcInByb2plblwiLCBuZXcgU2V0KFtiYXNlTW9kdWxlXSkpO1xuXG4gICAgICAgIC8vIENvbmZpZyBpbXBvcnRzXG4gICAgICAgIGltcG9ydHMuc2V0KFwiLi4vY29uZmlnXCIsIG5ldyBTZXQoW1wiYXBwbHlEZWZhdWx0Q29uZmlnXCIsIG9wdGlvbnMuZGVmYXVsdENvbmZpZ10pKTtcblxuICAgICAgICAvLyBVdGlscyBpbXBvcnRzXG4gICAgICAgIGltcG9ydHMuc2V0KFwiLi4vdXRpbHNcIiwgbmV3IFNldChbXCJkZWVwTWVyZ2VcIl0pKTtcblxuICAgICAgICAvLyBPcHRpb25zIGludGVyZmFjZSBpbXBvcnQgKHR5cGUtb25seSlcbiAgICAgICAgaW1wb3J0cy5zZXQoYC4vJHtvcHRpb25zRmlsZU5hbWV9LmdlbmVyYXRlZGAsIG5ldyBTZXQoW29wdGlvbnMub3B0aW9uc0ludGVyZmFjZV0pKTtcblxuICAgICAgICByZXR1cm4gaW1wb3J0cztcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlckltcG9ydHMoaW1wb3J0czogTWFwPHN0cmluZywgU2V0PHN0cmluZz4+KSB7XG4gICAgICAgIGNvbnN0IHNvcnRlZE1vZHVsZXMgPSBBcnJheS5mcm9tKGltcG9ydHMua2V5cygpKS5zb3J0KChhLCBiKSA9PiB7XG4gICAgICAgICAgICAvLyBTb3J0OiBleHRlcm5hbCBwYWNrYWdlcyBmaXJzdCwgdGhlbiByZWxhdGl2ZSBpbXBvcnRzXG4gICAgICAgICAgICBjb25zdCBhSXNSZWxhdGl2ZSA9IGEuc3RhcnRzV2l0aChcIi5cIik7XG4gICAgICAgICAgICBjb25zdCBiSXNSZWxhdGl2ZSA9IGIuc3RhcnRzV2l0aChcIi5cIik7XG4gICAgICAgICAgICBpZiAoYUlzUmVsYXRpdmUgIT09IGJJc1JlbGF0aXZlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFJc1JlbGF0aXZlID8gMSA6IC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGEubG9jYWxlQ29tcGFyZShiKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm9yIChjb25zdCBtb2Qgb2Ygc29ydGVkTW9kdWxlcykge1xuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBBcnJheS5mcm9tKGltcG9ydHMuZ2V0KG1vZCkgfHwgW10pLnNvcnQoKTtcbiAgICAgICAgICAgIGNvbnN0IGlzVHlwZU9ubHkgPSBtb2QuaW5jbHVkZXMoXCIuZ2VuZXJhdGVkXCIpO1xuICAgICAgICAgICAgY29uc3QgaW1wb3J0U3RtdCA9IGlzVHlwZU9ubHkgPyBcImltcG9ydCB0eXBlXCIgOiBcImltcG9ydFwiO1xuICAgICAgICAgICAgdGhpcy5idWZmZXIubGluZShgJHtpbXBvcnRTdG10fSB7ICR7bmFtZXMuam9pbihcIiwgXCIpfSB9IGZyb20gXCIke21vZH1cIjtgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyRXhwb3J0KG9wdGlvbnM6IFByb2plblByb2plY3RDbGFzc09wdGlvbnMpIHtcbiAgICAgICAgY29uc3Qgb3B0aW9uc0ZpbGVOYW1lID0gdGhpcy5nZXRPcHRpb25zRmlsZU5hbWUob3B0aW9ucy5vcHRpb25zSW50ZXJmYWNlKTtcbiAgICAgICAgdGhpcy5idWZmZXIubGluZShgZXhwb3J0IHsgJHtvcHRpb25zLm9wdGlvbnNJbnRlcmZhY2V9IH0gZnJvbSBcIi4vJHtvcHRpb25zRmlsZU5hbWV9LmdlbmVyYXRlZFwiO2ApO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyQ2xhc3Mob3B0aW9uczogUHJvamVuUHJvamVjdENsYXNzT3B0aW9ucywgY3VzdG9tT3B0aW9uczogc3RyaW5nW10pIHtcbiAgICAgICAgdGhpcy5idWZmZXIub3BlbihgZXhwb3J0IGNsYXNzICR7b3B0aW9ucy5uYW1lfSBleHRlbmRzICR7b3B0aW9ucy5iYXNlQ2xhc3N9IHtgKTtcbiAgICAgICAgdGhpcy5yZW5kZXJDb25zdHJ1Y3RvcihvcHRpb25zLCBjdXN0b21PcHRpb25zKTtcbiAgICAgICAgdGhpcy5idWZmZXIuY2xvc2UoXCJ9XCIpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyQ29uc3RydWN0b3Iob3B0aW9uczogUHJvamVuUHJvamVjdENsYXNzT3B0aW9ucywgY3VzdG9tT3B0aW9uczogc3RyaW5nW10pIHtcbiAgICAgICAgdGhpcy5idWZmZXIub3BlbihgY29uc3RydWN0b3Iob3B0aW9uczogJHtvcHRpb25zLm9wdGlvbnNJbnRlcmZhY2V9KSB7YCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYGNvbnN0IHsgJHtjdXN0b21PcHRpb25zLmpvaW4oXCIsIFwiKX0sIC4uLmJhc2VPcHRpb25zIH0gPSBvcHRpb25zO2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoYHN1cGVyKGRlZXBNZXJnZTwke29wdGlvbnMuYmFzZU9wdGlvbnNUeXBlfT4oJHtvcHRpb25zLmRlZmF1bHRDb25maWd9LCBiYXNlT3B0aW9ucykpO2ApO1xuICAgICAgICB0aGlzLmJ1ZmZlci5saW5lKCk7XG4gICAgICAgIHRoaXMuYnVmZmVyLmxpbmUoXCJhcHBseURlZmF1bHRDb25maWcodGhpcywgdml0ZXN0LCB2aXRlc3RPcHRpb25zLCBtaXNlKTtcIik7XG4gICAgICAgIHRoaXMuYnVmZmVyLmNsb3NlKFwifVwiKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE9wdGlvbnNGaWxlTmFtZShvcHRpb25zSW50ZXJmYWNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICAvLyBNYXAga25vd24gaW50ZXJmYWNlcyB0byB0aGVpciBmaWxlIG5hbWVzXG4gICAgICAgIGNvbnN0IG1hcHBpbmc6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAgICAgICBUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnM6IFwidHlwZXNjcmlwdC1vcHRpb25zXCIsXG4gICAgICAgICAgICBKc2lpUHJvamVjdE9wdGlvbnM6IFwianNpaS1vcHRpb25zXCIsXG4gICAgICAgICAgICBBd3NDZGtUeXBlU2NyaXB0QXBwUHJvamVjdE9wdGlvbnM6IFwiYXdzY2RrLXR5cGVzY3JpcHQtYXBwLW9wdGlvbnNcIixcbiAgICAgICAgICAgIEF3c0Nka0NvbnN0cnVjdExpYnJhcnlQcm9qZWN0T3B0aW9uczogXCJhd3NjZGstY29uc3RydWN0LWxpYnJhcnktb3B0aW9uc1wiLFxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBtYXBwaW5nW29wdGlvbnNJbnRlcmZhY2VdIHx8IG9wdGlvbnNJbnRlcmZhY2UudG9Mb3dlckNhc2UoKTtcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9qZW5Qcm9qZWN0Q2xhc3MgZXh0ZW5kcyBDb21wb25lbnQge1xuICAgIHByaXZhdGUgcmVuZGVyZXI6IFR5cGVTY3JpcHRDbGFzc1JlbmRlcmVyO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByb2plY3Q6IFByb2plY3QsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgb3B0aW9uczogUHJvamVuUHJvamVjdENsYXNzT3B0aW9ucyxcbiAgICApIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCk7XG4gICAgICAgIHRoaXMucmVuZGVyZXIgPSBuZXcgVHlwZVNjcmlwdENsYXNzUmVuZGVyZXIob3B0aW9ucy5pbmRlbnQpO1xuICAgIH1cblxuICAgIHByZVN5bnRoZXNpemUoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnJlbmRlcmVyLnJlbmRlcih0aGlzLm9wdGlvbnMpO1xuXG4gICAgICAgIG5ldyBUeXBlU2NyaXB0Q2xhc3NGaWxlKHRoaXMucHJvamVjdCwgdGhpcy5vcHRpb25zLmZpbGVQYXRoLCBjb250ZW50LCB7XG4gICAgICAgICAgICByZWFkb25seTogdGhpcy5vcHRpb25zLnJlYWRvbmx5ID8/IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuY2xhc3MgVHlwZVNjcmlwdENsYXNzRmlsZSBleHRlbmRzIFRleHRGaWxlIHtcbiAgICBjb25zdHJ1Y3Rvcihwcm9qZWN0OiBQcm9qZWN0LCBmaWxlUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIG9wdGlvbnM6IFNvdXJjZUNvZGVPcHRpb25zID0ge30pIHtcbiAgICAgICAgc3VwZXIocHJvamVjdCwgZmlsZVBhdGgsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmFkZExpbmUoYC8vICR7dGhpcy5tYXJrZXJ9YCk7XG4gICAgICAgIHRoaXMuYWRkTGluZShjb250ZW50KTtcbiAgICB9XG59XG4iXX0=