@nikovirtala/projen-constructs 0.1.3 → 0.1.5
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/.jsii +182 -182
- package/README.md +22 -20
- package/lib/components/vitest.js +1 -1
- package/lib/projects/awscdk-construct-library.generated.js +20 -0
- package/lib/projects/awscdk-typescript-app-options.generated.d.ts +24 -24
- package/lib/projects/awscdk-typescript-app-options.generated.js +1 -1
- package/lib/projects/awscdk-typescript-app.generated.js +20 -0
- package/lib/projects/index.d.ts +4 -4
- package/lib/projects/index.js +5 -5
- package/lib/projects/jsii.generated.js +20 -0
- package/lib/projects/typescript.generated.js +20 -0
- package/lib/projen-project-class.d.ts +44 -0
- package/lib/projen-project-class.js +137 -0
- package/package.json +1 -1
- package/lib/projects/awscdk-app-options.generated.d.ts +0 -1098
- package/lib/projects/awscdk-app-options.generated.js +0 -3
- package/lib/projects/awscdk-construct-library.js +0 -19
- package/lib/projects/awscdk-typescript-app.js +0 -19
- package/lib/projects/jsii.js +0 -19
- package/lib/projects/typescript.js +0 -19
- /package/lib/projects/{awscdk-construct-library.d.ts → awscdk-construct-library.generated.d.ts} +0 -0
- /package/lib/projects/{awscdk-typescript-app.d.ts → awscdk-typescript-app.generated.d.ts} +0 -0
- /package/lib/projects/{jsii.d.ts → jsii.generated.d.ts} +0 -0
- /package/lib/projects/{typescript.d.ts → typescript.generated.d.ts} +0 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.JsiiProject = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
// ~~ Generated by projen. To modify, edit .projenrc.ts and run "npx projen".
|
|
7
|
+
const projen_1 = require("projen");
|
|
8
|
+
const config_1 = require("../config");
|
|
9
|
+
const utils_1 = require("../utils");
|
|
10
|
+
class JsiiProject extends projen_1.cdk.JsiiProject {
|
|
11
|
+
constructor(options) {
|
|
12
|
+
const { mise, vitest, vitestOptions, ...baseOptions } = options;
|
|
13
|
+
super((0, utils_1.deepMerge)(config_1.jsiiProjectDefaultOptions, baseOptions));
|
|
14
|
+
(0, config_1.applyDefaultConfig)(this, vitest, vitestOptions, mise);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.JsiiProject = JsiiProject;
|
|
18
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
19
|
+
JsiiProject[_a] = { fqn: "@nikovirtala/projen-constructs.JsiiProject", version: "0.1.5" };
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNpaS5nZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvamVjdHMvanNpaS5nZW5lcmF0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2RUFBNkU7QUFDN0UsbUNBQTZCO0FBQzdCLHNDQUEwRTtBQUMxRSxvQ0FBcUM7QUFLckMsTUFBYSxXQUFZLFNBQVEsWUFBRyxDQUFDLFdBQVc7SUFDNUMsWUFBWSxPQUEyQjtRQUNuQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsR0FBRyxXQUFXLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFaEUsS0FBSyxDQUFDLElBQUEsaUJBQVMsRUFBeUIsa0NBQXlCLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUVqRixJQUFBLDJCQUFrQixFQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFELENBQUM7O0FBUEwsa0NBUUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyB+fiBHZW5lcmF0ZWQgYnkgcHJvamVuLiBUbyBtb2RpZnksIGVkaXQgLnByb2plbnJjLnRzIGFuZCBydW4gXCJucHggcHJvamVuXCIuXG5pbXBvcnQgeyBjZGsgfSBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgeyBhcHBseURlZmF1bHRDb25maWcsIGpzaWlQcm9qZWN0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgSnNpaVByb2plY3RPcHRpb25zIH0gZnJvbSBcIi4vanNpaS1vcHRpb25zLmdlbmVyYXRlZFwiO1xuXG5leHBvcnQgeyBKc2lpUHJvamVjdE9wdGlvbnMgfSBmcm9tIFwiLi9qc2lpLW9wdGlvbnMuZ2VuZXJhdGVkXCI7XG5cbmV4cG9ydCBjbGFzcyBKc2lpUHJvamVjdCBleHRlbmRzIGNkay5Kc2lpUHJvamVjdCB7XG4gICAgY29uc3RydWN0b3Iob3B0aW9uczogSnNpaVByb2plY3RPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IHsgbWlzZSwgdml0ZXN0LCB2aXRlc3RPcHRpb25zLCAuLi5iYXNlT3B0aW9ucyB9ID0gb3B0aW9ucztcblxuICAgICAgICBzdXBlcihkZWVwTWVyZ2U8Y2RrLkpzaWlQcm9qZWN0T3B0aW9ucz4oanNpaVByb2plY3REZWZhdWx0T3B0aW9ucywgYmFzZU9wdGlvbnMpKTtcblxuICAgICAgICBhcHBseURlZmF1bHRDb25maWcodGhpcywgdml0ZXN0LCB2aXRlc3RPcHRpb25zLCBtaXNlKTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var _a;
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.TypeScriptProject = void 0;
|
|
5
|
+
const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti");
|
|
6
|
+
// ~~ Generated by projen. To modify, edit .projenrc.ts and run "npx projen".
|
|
7
|
+
const projen_1 = require("projen");
|
|
8
|
+
const config_1 = require("../config");
|
|
9
|
+
const utils_1 = require("../utils");
|
|
10
|
+
class TypeScriptProject extends projen_1.typescript.TypeScriptProject {
|
|
11
|
+
constructor(options) {
|
|
12
|
+
const { mise, vitest, vitestOptions, ...baseOptions } = options;
|
|
13
|
+
super((0, utils_1.deepMerge)(config_1.typescriptProjectDefaultOptions, baseOptions));
|
|
14
|
+
(0, config_1.applyDefaultConfig)(this, vitest, vitestOptions, mise);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
exports.TypeScriptProject = TypeScriptProject;
|
|
18
|
+
_a = JSII_RTTI_SYMBOL_1;
|
|
19
|
+
TypeScriptProject[_a] = { fqn: "@nikovirtala/projen-constructs.TypeScriptProject", version: "0.1.5" };
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNjcmlwdC5nZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvamVjdHMvdHlwZXNjcmlwdC5nZW5lcmF0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSw2RUFBNkU7QUFDN0UsbUNBQW9DO0FBQ3BDLHNDQUFnRjtBQUNoRixvQ0FBcUM7QUFLckMsTUFBYSxpQkFBa0IsU0FBUSxtQkFBVSxDQUFDLGlCQUFpQjtJQUMvRCxZQUFZLE9BQWlDO1FBQ3pDLE1BQU0sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxHQUFHLFdBQVcsRUFBRSxHQUFHLE9BQU8sQ0FBQztRQUVoRSxLQUFLLENBQUMsSUFBQSxpQkFBUyxFQUFzQyx3Q0FBK0IsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBRXBHLElBQUEsMkJBQWtCLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDMUQsQ0FBQzs7QUFQTCw4Q0FRQyIsInNvdXJjZXNDb250ZW50IjpbIi8vIH5+IEdlbmVyYXRlZCBieSBwcm9qZW4uIFRvIG1vZGlmeSwgZWRpdCAucHJvamVucmMudHMgYW5kIHJ1biBcIm5weCBwcm9qZW5cIi5cbmltcG9ydCB7IHR5cGVzY3JpcHQgfSBmcm9tIFwicHJvamVuXCI7XG5pbXBvcnQgeyBhcHBseURlZmF1bHRDb25maWcsIHR5cGVzY3JpcHRQcm9qZWN0RGVmYXVsdE9wdGlvbnMgfSBmcm9tIFwiLi4vY29uZmlnXCI7XG5pbXBvcnQgeyBkZWVwTWVyZ2UgfSBmcm9tIFwiLi4vdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgVHlwZVNjcmlwdFByb2plY3RPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXNjcmlwdC1vcHRpb25zLmdlbmVyYXRlZFwiO1xuXG5leHBvcnQgeyBUeXBlU2NyaXB0UHJvamVjdE9wdGlvbnMgfSBmcm9tIFwiLi90eXBlc2NyaXB0LW9wdGlvbnMuZ2VuZXJhdGVkXCI7XG5cbmV4cG9ydCBjbGFzcyBUeXBlU2NyaXB0UHJvamVjdCBleHRlbmRzIHR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3Qge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnM6IFR5cGVTY3JpcHRQcm9qZWN0T3B0aW9ucykge1xuICAgICAgICBjb25zdCB7IG1pc2UsIHZpdGVzdCwgdml0ZXN0T3B0aW9ucywgLi4uYmFzZU9wdGlvbnMgfSA9IG9wdGlvbnM7XG5cbiAgICAgICAgc3VwZXIoZGVlcE1lcmdlPHR5cGVzY3JpcHQuVHlwZVNjcmlwdFByb2plY3RPcHRpb25zPih0eXBlc2NyaXB0UHJvamVjdERlZmF1bHRPcHRpb25zLCBiYXNlT3B0aW9ucykpO1xuXG4gICAgICAgIGFwcGx5RGVmYXVsdENvbmZpZyh0aGlzLCB2aXRlc3QsIHZpdGVzdE9wdGlvbnMsIG1pc2UpO1xuICAgIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Project, SourceCodeOptions } from "projen";
|
|
2
|
+
import { Component } from "projen";
|
|
3
|
+
export interface ProjenProjectClassOptions extends SourceCodeOptions {
|
|
4
|
+
/**
|
|
5
|
+
* The name of the generated class
|
|
6
|
+
*/
|
|
7
|
+
readonly name: string;
|
|
8
|
+
/**
|
|
9
|
+
* The base class to extend (e.g., "typescript.TypeScriptProject")
|
|
10
|
+
*/
|
|
11
|
+
readonly baseClass: string;
|
|
12
|
+
/**
|
|
13
|
+
* The options interface name (e.g., "TypeScriptProjectOptions")
|
|
14
|
+
*/
|
|
15
|
+
readonly optionsInterface: string;
|
|
16
|
+
/**
|
|
17
|
+
* The base options type (e.g., "typescript.TypeScriptProjectOptions")
|
|
18
|
+
*/
|
|
19
|
+
readonly baseOptionsType: string;
|
|
20
|
+
/**
|
|
21
|
+
* The default config constant name (e.g., "typescriptProjectDefaultOptions")
|
|
22
|
+
*/
|
|
23
|
+
readonly defaultConfig: string;
|
|
24
|
+
/**
|
|
25
|
+
* Output file path
|
|
26
|
+
*/
|
|
27
|
+
readonly filePath: string;
|
|
28
|
+
/**
|
|
29
|
+
* Custom options to extract from constructor
|
|
30
|
+
* @default ["mise", "vitest", "vitestOptions"]
|
|
31
|
+
*/
|
|
32
|
+
readonly customOptions?: string[];
|
|
33
|
+
/**
|
|
34
|
+
* Indentation size
|
|
35
|
+
* @default 4
|
|
36
|
+
*/
|
|
37
|
+
readonly indent?: number;
|
|
38
|
+
}
|
|
39
|
+
export declare class ProjenProjectClass extends Component {
|
|
40
|
+
private readonly options;
|
|
41
|
+
private renderer;
|
|
42
|
+
constructor(project: Project, options: ProjenProjectClassOptions);
|
|
43
|
+
preSynthesize(): void;
|
|
44
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
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=
|