@decohere/create 0.0.1-dev.48 → 0.0.1-dev.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/commonjs/src/cli.js +9 -3
- package/commonjs/src/scaffold.js +48 -0
- package/commonjs/src/templates.js +64 -0
- package/es6/src/cli.js +9 -3
- package/es6/src/scaffold.js +38 -0
- package/es6/src/templates.js +40 -0
- package/package.json +3 -8
- package/types/src/scaffold.d.ts +4 -0
- package/types/src/templates.d.ts +4 -0
- package/commonjs/src/domain/prompt.js +0 -64
- package/commonjs/src/models/compose.model.js +0 -138
- package/commonjs/src/models/config-yaml.model.js +0 -88
- package/commonjs/src/models/const.js +0 -31
- package/commonjs/src/models/dev-container.model.js +0 -100
- package/commonjs/src/models/docker-image.model.js +0 -221
- package/commonjs/src/models/env-file.model.js +0 -47
- package/commonjs/src/models/gitignore.model.js +0 -31
- package/commonjs/src/models/launch-json.model.js +0 -74
- package/commonjs/src/models/package-json.model.js +0 -133
- package/commonjs/src/models/project.model.js +0 -134
- package/commonjs/src/models/source-file.js +0 -6
- package/commonjs/src/models/tsconfig.model.js +0 -34
- package/commonjs/src/models/vscode-settings.model.js +0 -31
- package/commonjs/src/program.js +0 -135
- package/commonjs/src/resolve-target-dir.js +0 -19
- package/commonjs/src/runner.js +0 -144
- package/commonjs/src/services/scaffold.service.js +0 -62
- package/commonjs/src/version.js +0 -50
- package/commonjs/src/webapi/api-name.js +0 -95
- package/commonjs/src/webapi/const.js +0 -50
- package/commonjs/src/webapi/create-api.js +0 -285
- package/commonjs/src/webapi/features/auth.feature.js +0 -463
- package/commonjs/src/webapi/features/auth0-cli.js +0 -406
- package/commonjs/src/webapi/features/biome-format.js +0 -49
- package/commonjs/src/webapi/features/database.feature.js +0 -273
- package/commonjs/src/webapi/features/finalize.feature.js +0 -91
- package/commonjs/src/webapi/features/postman.feature.js +0 -319
- package/commonjs/src/webapi/models/api-package-json.model.js +0 -63
- package/commonjs/src/webapi/models/auth-config.model.js +0 -26
- package/commonjs/src/webapi/models/controller-source-file.model.js +0 -188
- package/commonjs/src/webapi/models/github-ci.model.js +0 -193
- package/commonjs/src/webapi/models/main-source-file.model.js +0 -165
- package/commonjs/src/webapi/models/production-dockerfile.model.js +0 -138
- package/commonjs/src/webapi/models/sample-files.model.js +0 -60
- package/commonjs/src/webapi/models/webapi-image.model.js +0 -22
- package/commonjs/src/webapi/postman/hello-openapi.js +0 -175
- package/commonjs/src/webapi/postman/local-view.js +0 -184
- package/commonjs/src/webapi/postman/openapi-to-postman.js +0 -202
- package/es6/src/domain/prompt.js +0 -43
- package/es6/src/models/compose.model.js +0 -132
- package/es6/src/models/config-yaml.model.js +0 -76
- package/es6/src/models/const.js +0 -21
- package/es6/src/models/dev-container.model.js +0 -90
- package/es6/src/models/docker-image.model.js +0 -185
- package/es6/src/models/env-file.model.js +0 -43
- package/es6/src/models/gitignore.model.js +0 -21
- package/es6/src/models/launch-json.model.js +0 -64
- package/es6/src/models/package-json.model.js +0 -129
- package/es6/src/models/project.model.js +0 -119
- package/es6/src/models/source-file.js +0 -3
- package/es6/src/models/tsconfig.model.js +0 -24
- package/es6/src/models/vscode-settings.model.js +0 -21
- package/es6/src/program.js +0 -76
- package/es6/src/resolve-target-dir.js +0 -9
- package/es6/src/runner.js +0 -146
- package/es6/src/services/scaffold.service.js +0 -52
- package/es6/src/version.js +0 -32
- package/es6/src/webapi/api-name.js +0 -59
- package/es6/src/webapi/const.js +0 -20
- package/es6/src/webapi/create-api.js +0 -265
- package/es6/src/webapi/features/auth.feature.js +0 -412
- package/es6/src/webapi/features/auth0-cli.js +0 -348
- package/es6/src/webapi/features/biome-format.js +0 -42
- package/es6/src/webapi/features/database.feature.js +0 -263
- package/es6/src/webapi/features/finalize.feature.js +0 -81
- package/es6/src/webapi/features/postman.feature.js +0 -253
- package/es6/src/webapi/models/api-package-json.model.js +0 -58
- package/es6/src/webapi/models/auth-config.model.js +0 -22
- package/es6/src/webapi/models/controller-source-file.model.js +0 -179
- package/es6/src/webapi/models/github-ci.model.js +0 -186
- package/es6/src/webapi/models/main-source-file.model.js +0 -161
- package/es6/src/webapi/models/production-dockerfile.model.js +0 -126
- package/es6/src/webapi/models/sample-files.model.js +0 -42
- package/es6/src/webapi/models/webapi-image.model.js +0 -12
- package/es6/src/webapi/postman/hello-openapi.js +0 -168
- package/es6/src/webapi/postman/local-view.js +0 -169
- package/es6/src/webapi/postman/openapi-to-postman.js +0 -179
- package/pack-builder-tgz.mjs +0 -177
- package/types/src/domain/prompt.d.ts +0 -4
- package/types/src/models/compose.model.d.ts +0 -59
- package/types/src/models/config-yaml.model.d.ts +0 -27
- package/types/src/models/const.d.ts +0 -19
- package/types/src/models/dev-container.model.d.ts +0 -33
- package/types/src/models/docker-image.model.d.ts +0 -56
- package/types/src/models/env-file.model.d.ts +0 -15
- package/types/src/models/gitignore.model.d.ts +0 -6
- package/types/src/models/launch-json.model.d.ts +0 -7
- package/types/src/models/package-json.model.d.ts +0 -32
- package/types/src/models/project.model.d.ts +0 -60
- package/types/src/models/source-file.d.ts +0 -11
- package/types/src/models/tsconfig.model.d.ts +0 -5
- package/types/src/models/vscode-settings.model.d.ts +0 -7
- package/types/src/program.d.ts +0 -3
- package/types/src/resolve-target-dir.d.ts +0 -5
- package/types/src/runner.d.ts +0 -15
- package/types/src/services/scaffold.service.d.ts +0 -22
- package/types/src/version.d.ts +0 -4
- package/types/src/webapi/api-name.d.ts +0 -14
- package/types/src/webapi/const.d.ts +0 -17
- package/types/src/webapi/create-api.d.ts +0 -15
- package/types/src/webapi/features/auth.feature.d.ts +0 -10
- package/types/src/webapi/features/auth0-cli.d.ts +0 -72
- package/types/src/webapi/features/biome-format.d.ts +0 -5
- package/types/src/webapi/features/database.feature.d.ts +0 -5
- package/types/src/webapi/features/finalize.feature.d.ts +0 -2
- package/types/src/webapi/features/postman.feature.d.ts +0 -16
- package/types/src/webapi/models/api-package-json.model.d.ts +0 -18
- package/types/src/webapi/models/auth-config.model.d.ts +0 -26
- package/types/src/webapi/models/controller-source-file.model.d.ts +0 -45
- package/types/src/webapi/models/github-ci.model.d.ts +0 -9
- package/types/src/webapi/models/main-source-file.model.d.ts +0 -54
- package/types/src/webapi/models/production-dockerfile.model.d.ts +0 -20
- package/types/src/webapi/models/sample-files.model.d.ts +0 -7
- package/types/src/webapi/models/webapi-image.model.d.ts +0 -5
- package/types/src/webapi/postman/hello-openapi.d.ts +0 -19
- package/types/src/webapi/postman/local-view.d.ts +0 -17
- package/types/src/webapi/postman/openapi-to-postman.d.ts +0 -62
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
function _export(target, all) {
|
|
6
|
-
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
get: Object.getOwnPropertyDescriptor(all, name).get
|
|
9
|
-
});
|
|
10
|
-
}
|
|
11
|
-
_export(exports, {
|
|
12
|
-
get ControllerMethod () {
|
|
13
|
-
return ControllerMethod;
|
|
14
|
-
},
|
|
15
|
-
get ControllerSourceFile () {
|
|
16
|
-
return ControllerSourceFile;
|
|
17
|
-
}
|
|
18
|
-
});
|
|
19
|
-
const _const = require("../../models/const.js");
|
|
20
|
-
/** Tracks named imports from a single module path, split into values and types. */ class ImportGroup {
|
|
21
|
-
_values = [];
|
|
22
|
-
_types = [];
|
|
23
|
-
add(name, typeOnly = false) {
|
|
24
|
-
if (typeOnly) {
|
|
25
|
-
// Value import already present — value wins, skip
|
|
26
|
-
if (!this._values.includes(name) && !this._types.includes(name)) {
|
|
27
|
-
this._types.push(name);
|
|
28
|
-
}
|
|
29
|
-
} else {
|
|
30
|
-
// Promote: remove from types if it was previously type-only
|
|
31
|
-
const typeIdx = this._types.indexOf(name);
|
|
32
|
-
if (typeIdx !== -1) this._types.splice(typeIdx, 1);
|
|
33
|
-
if (!this._values.includes(name)) this._values.push(name);
|
|
34
|
-
}
|
|
35
|
-
return this;
|
|
36
|
-
}
|
|
37
|
-
render(from) {
|
|
38
|
-
const values = [
|
|
39
|
-
...this._values
|
|
40
|
-
].sort();
|
|
41
|
-
const types = [
|
|
42
|
-
...this._types
|
|
43
|
-
].sort().map((n)=>`type ${n}`);
|
|
44
|
-
return `import { ${[
|
|
45
|
-
...values,
|
|
46
|
-
...types
|
|
47
|
-
].join(", ")} } from "${from}";`;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
class ControllerMethod {
|
|
51
|
-
name;
|
|
52
|
-
_httpDecorator;
|
|
53
|
-
_params;
|
|
54
|
-
_extraDecorators = [];
|
|
55
|
-
_body;
|
|
56
|
-
_isAsync;
|
|
57
|
-
constructor(name, _httpDecorator, _params, isAsync, body){
|
|
58
|
-
this.name = name;
|
|
59
|
-
this._httpDecorator = _httpDecorator;
|
|
60
|
-
this._params = _params;
|
|
61
|
-
this._isAsync = isAsync;
|
|
62
|
-
this._body = body;
|
|
63
|
-
}
|
|
64
|
-
addDecorator(decorator) {
|
|
65
|
-
this._extraDecorators.push(decorator);
|
|
66
|
-
return this;
|
|
67
|
-
}
|
|
68
|
-
/** Replace the method body lines (used by features that extend generated behaviour). */ setBody(body) {
|
|
69
|
-
this._body = body;
|
|
70
|
-
return this;
|
|
71
|
-
}
|
|
72
|
-
setAsync(isAsync = true) {
|
|
73
|
-
this._isAsync = isAsync;
|
|
74
|
-
return this;
|
|
75
|
-
}
|
|
76
|
-
render() {
|
|
77
|
-
const lines = [];
|
|
78
|
-
for (const d of this._extraDecorators){
|
|
79
|
-
lines.push(`\t${d}`);
|
|
80
|
-
}
|
|
81
|
-
lines.push(`\t${this._httpDecorator}`);
|
|
82
|
-
const asyncKw = this._isAsync ? "async " : "";
|
|
83
|
-
lines.push(`\tpublic ${asyncKw}${this.name}(${this._params}) {`);
|
|
84
|
-
for (const line of this._body){
|
|
85
|
-
lines.push(`\t\t${line}`);
|
|
86
|
-
}
|
|
87
|
-
lines.push("\t}");
|
|
88
|
-
return lines;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
class ControllerSourceFile {
|
|
92
|
-
key = _const.WELL_KNOWN_FILES.CONTROLLER_TS;
|
|
93
|
-
_cortexImports = new ImportGroup().add("Controller").add("Delete").add("Field").add("Get").add("Param").add("Post").add("Put").add("Query");
|
|
94
|
-
_extraImportGroups = new Map();
|
|
95
|
-
_classDecorators = [];
|
|
96
|
-
_ctorParams = [
|
|
97
|
-
"private readonly sample: SampleService"
|
|
98
|
-
];
|
|
99
|
-
_methods = new Map([
|
|
100
|
-
[
|
|
101
|
-
"getAll",
|
|
102
|
-
new ControllerMethod("getAll", "@Get()", '@Query("filter") filter: string', true, [
|
|
103
|
-
"const greeting = await this.sample.getGreeting();",
|
|
104
|
-
"return { filter, message: greeting };"
|
|
105
|
-
])
|
|
106
|
-
],
|
|
107
|
-
[
|
|
108
|
-
"getOne",
|
|
109
|
-
new ControllerMethod("getOne", '@Get("/:id")', '@Param("id") id: string', false, // biome-ignore lint/suspicious/noTemplateCurlyInString: template literal in generated code
|
|
110
|
-
[
|
|
111
|
-
"return { id, message: `Hello ${id}!` };"
|
|
112
|
-
])
|
|
113
|
-
],
|
|
114
|
-
[
|
|
115
|
-
"create",
|
|
116
|
-
new ControllerMethod("create", "@Post()", "body: HelloBody", false, [
|
|
117
|
-
"return { message: body.message };"
|
|
118
|
-
])
|
|
119
|
-
],
|
|
120
|
-
[
|
|
121
|
-
"update",
|
|
122
|
-
new ControllerMethod("update", '@Put("/:id")', '@Param("id") id: string, body: HelloBody', false, [
|
|
123
|
-
"return { id, message: body.message };"
|
|
124
|
-
])
|
|
125
|
-
],
|
|
126
|
-
[
|
|
127
|
-
"remove",
|
|
128
|
-
new ControllerMethod("remove", '@Delete("/:id")', '@Param("id") id: string', false, [
|
|
129
|
-
"return { id, deleted: true };"
|
|
130
|
-
])
|
|
131
|
-
]
|
|
132
|
-
]);
|
|
133
|
-
/** Retrieve a method by name to mutate its decorators. */ getMethod(name) {
|
|
134
|
-
const m = this._methods.get(name);
|
|
135
|
-
if (m == null) throw new Error(`No method '${name}' on ControllerSourceFile`);
|
|
136
|
-
return m;
|
|
137
|
-
}
|
|
138
|
-
/** Add a class-level decorator (e.g. `@Authorize`). */ addDecorator(decorator) {
|
|
139
|
-
this._classDecorators.push(decorator);
|
|
140
|
-
return this;
|
|
141
|
-
}
|
|
142
|
-
/** Add a named import from `@decohere/cortex`. */ addCortexImport(name, typeOnly = false) {
|
|
143
|
-
this._cortexImports.add(name, typeOnly);
|
|
144
|
-
return this;
|
|
145
|
-
}
|
|
146
|
-
/** Add a named import from any other module. */ addImport(name, from, typeOnly = false) {
|
|
147
|
-
const group = this._extraImportGroups.get(from) ?? new ImportGroup();
|
|
148
|
-
group.add(name, typeOnly);
|
|
149
|
-
this._extraImportGroups.set(from, group);
|
|
150
|
-
return this;
|
|
151
|
-
}
|
|
152
|
-
/** Add a constructor parameter (e.g. an injected dependency). */ addConstructorParam(param) {
|
|
153
|
-
this._ctorParams.push(param);
|
|
154
|
-
return this;
|
|
155
|
-
}
|
|
156
|
-
files() {
|
|
157
|
-
const lines = [
|
|
158
|
-
this._cortexImports.render("@decohere/cortex"),
|
|
159
|
-
'import { SampleService } from "../services/sample.service.js";'
|
|
160
|
-
];
|
|
161
|
-
for (const [from, group] of this._extraImportGroups){
|
|
162
|
-
lines.push(group.render(from));
|
|
163
|
-
}
|
|
164
|
-
lines.push("", "class HelloBody {", '\t@Field("body", "message")', "\tpublic message!: string;", "}", "");
|
|
165
|
-
for (const d of this._classDecorators){
|
|
166
|
-
lines.push(d);
|
|
167
|
-
}
|
|
168
|
-
lines.push('@Controller({ prefix: "/hello" })', "export class HelloController {", "");
|
|
169
|
-
lines.push("\tpublic constructor(");
|
|
170
|
-
for (const p of this._ctorParams){
|
|
171
|
-
lines.push(`\t\t${p},`);
|
|
172
|
-
}
|
|
173
|
-
lines.push("\t) {}");
|
|
174
|
-
lines.push("");
|
|
175
|
-
for (const method of this._methods.values()){
|
|
176
|
-
lines.push(...method.render(), "");
|
|
177
|
-
}
|
|
178
|
-
lines.push("}", "");
|
|
179
|
-
return [
|
|
180
|
-
{
|
|
181
|
-
filePath: "src/controllers/hello.controller.ts",
|
|
182
|
-
content: lines.join("\n")
|
|
183
|
-
}
|
|
184
|
-
];
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9jb250cm9sbGVyLXNvdXJjZS1maWxlLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5cbi8qKiBUcmFja3MgbmFtZWQgaW1wb3J0cyBmcm9tIGEgc2luZ2xlIG1vZHVsZSBwYXRoLCBzcGxpdCBpbnRvIHZhbHVlcyBhbmQgdHlwZXMuICovXG5jbGFzcyBJbXBvcnRHcm91cCB7XG5cdHByaXZhdGUgcmVhZG9ubHkgX3ZhbHVlczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBfdHlwZXM6IHN0cmluZ1tdID0gW107XG5cblx0cHVibGljIGFkZChuYW1lOiBzdHJpbmcsIHR5cGVPbmx5ID0gZmFsc2UpOiB0aGlzIHtcblx0XHRpZiAodHlwZU9ubHkpIHtcblx0XHRcdC8vIFZhbHVlIGltcG9ydCBhbHJlYWR5IHByZXNlbnQg4oCUIHZhbHVlIHdpbnMsIHNraXBcblx0XHRcdGlmICghdGhpcy5fdmFsdWVzLmluY2x1ZGVzKG5hbWUpICYmICF0aGlzLl90eXBlcy5pbmNsdWRlcyhuYW1lKSkge1xuXHRcdFx0XHR0aGlzLl90eXBlcy5wdXNoKG5hbWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBQcm9tb3RlOiByZW1vdmUgZnJvbSB0eXBlcyBpZiBpdCB3YXMgcHJldmlvdXNseSB0eXBlLW9ubHlcblx0XHRcdGNvbnN0IHR5cGVJZHggPSB0aGlzLl90eXBlcy5pbmRleE9mKG5hbWUpO1xuXHRcdFx0aWYgKHR5cGVJZHggIT09IC0xKSB0aGlzLl90eXBlcy5zcGxpY2UodHlwZUlkeCwgMSk7XG5cdFx0XHRpZiAoIXRoaXMuX3ZhbHVlcy5pbmNsdWRlcyhuYW1lKSkgdGhpcy5fdmFsdWVzLnB1c2gobmFtZSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHJlbmRlcihmcm9tOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHZhbHVlcyA9IFsuLi50aGlzLl92YWx1ZXNdLnNvcnQoKTtcblx0XHRjb25zdCB0eXBlcyA9IFsuLi50aGlzLl90eXBlc10uc29ydCgpLm1hcCgobikgPT4gYHR5cGUgJHtufWApO1xuXHRcdHJldHVybiBgaW1wb3J0IHsgJHtbLi4udmFsdWVzLCAuLi50eXBlc10uam9pbihcIiwgXCIpfSB9IGZyb20gXCIke2Zyb219XCI7YDtcblx0fVxufVxuXG4vKipcbiAqIEEgY29udHJvbGxlciBtZXRob2QuIEZlYXR1cmVzIGNhbGwgYGFkZERlY29yYXRvcigpYCB0byBwcmVwZW5kIGRlY29yYXRvcnNcbiAqIGJlZm9yZSB0aGUgSFRUUCB2ZXJiIGRlY29yYXRvciAoZS5nLiBgQEFsbG93QW5vbnltb3VzYCBiZWZvcmUgYEBHZXQoKWApLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbGxlck1ldGhvZCB7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2V4dHJhRGVjb3JhdG9yczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSBfYm9keTogc3RyaW5nW107XG5cdHByaXZhdGUgX2lzQXN5bmM6IGJvb2xlYW47XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHB1YmxpYyByZWFkb25seSBuYW1lOiBzdHJpbmcsXG5cdFx0cHJpdmF0ZSByZWFkb25seSBfaHR0cERlY29yYXRvcjogc3RyaW5nLFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgX3BhcmFtczogc3RyaW5nLFxuXHRcdGlzQXN5bmM6IGJvb2xlYW4sXG5cdFx0Ym9keTogc3RyaW5nW10sXG5cdCkge1xuXHRcdHRoaXMuX2lzQXN5bmMgPSBpc0FzeW5jO1xuXHRcdHRoaXMuX2JvZHkgPSBib2R5O1xuXHR9XG5cblx0cHVibGljIGFkZERlY29yYXRvcihkZWNvcmF0b3I6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2V4dHJhRGVjb3JhdG9ycy5wdXNoKGRlY29yYXRvcik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKiogUmVwbGFjZSB0aGUgbWV0aG9kIGJvZHkgbGluZXMgKHVzZWQgYnkgZmVhdHVyZXMgdGhhdCBleHRlbmQgZ2VuZXJhdGVkIGJlaGF2aW91cikuICovXG5cdHB1YmxpYyBzZXRCb2R5KGJvZHk6IHN0cmluZ1tdKTogdGhpcyB7XG5cdFx0dGhpcy5fYm9keSA9IGJvZHk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgc2V0QXN5bmMoaXNBc3luYyA9IHRydWUpOiB0aGlzIHtcblx0XHR0aGlzLl9pc0FzeW5jID0gaXNBc3luYztcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyByZW5kZXIoKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgZCBvZiB0aGlzLl9leHRyYURlY29yYXRvcnMpIHtcblx0XHRcdGxpbmVzLnB1c2goYFxcdCR7ZH1gKTtcblx0XHR9XG5cdFx0bGluZXMucHVzaChgXFx0JHt0aGlzLl9odHRwRGVjb3JhdG9yfWApO1xuXHRcdGNvbnN0IGFzeW5jS3cgPSB0aGlzLl9pc0FzeW5jID8gXCJhc3luYyBcIiA6IFwiXCI7XG5cdFx0bGluZXMucHVzaChgXFx0cHVibGljICR7YXN5bmNLd30ke3RoaXMubmFtZX0oJHt0aGlzLl9wYXJhbXN9KSB7YCk7XG5cdFx0Zm9yIChjb25zdCBsaW5lIG9mIHRoaXMuX2JvZHkpIHtcblx0XHRcdGxpbmVzLnB1c2goYFxcdFxcdCR7bGluZX1gKTtcblx0XHR9XG5cdFx0bGluZXMucHVzaChcIlxcdH1cIik7XG5cdFx0cmV0dXJuIGxpbmVzO1xuXHR9XG59XG5cbi8qKlxuICogTW9kZWwgZm9yIGBwcm9qZWN0cy9hcGkvc3JjL2NvbnRyb2xsZXJzL2hlbGxvLmNvbnRyb2xsZXIudHNgLlxuICpcbiAqIFByZS1pbml0aWFsaXNlZCB3aXRoIGFsbCByb3V0ZXMgYW5kIHRoZWlyIEhUVFAgZGVjb3JhdG9ycy4gRmVhdHVyZXMgbXV0YXRlXG4gKiB0aGUgbW9kZWwgdmlhIGBnZXRNZXRob2QobmFtZSkuYWRkRGVjb3JhdG9yKC4uLilgLCBgYWRkRGVjb3JhdG9yKC4uLilgIChjbGFzc1xuICogbGV2ZWwpLCBgYWRkQ29ydGV4SW1wb3J0KC4uLilgLCBgYWRkSW1wb3J0KC4uLilgLCBhbmQgYGFkZENvbnN0cnVjdG9yUGFyYW0oLi4uKWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250cm9sbGVyU291cmNlRmlsZSBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5DT05UUk9MTEVSX1RTO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX2NvcnRleEltcG9ydHMgPSBuZXcgSW1wb3J0R3JvdXAoKVxuXHRcdC5hZGQoXCJDb250cm9sbGVyXCIpXG5cdFx0LmFkZChcIkRlbGV0ZVwiKVxuXHRcdC5hZGQoXCJGaWVsZFwiKVxuXHRcdC5hZGQoXCJHZXRcIilcblx0XHQuYWRkKFwiUGFyYW1cIilcblx0XHQuYWRkKFwiUG9zdFwiKVxuXHRcdC5hZGQoXCJQdXRcIilcblx0XHQuYWRkKFwiUXVlcnlcIik7XG5cblx0cHJpdmF0ZSByZWFkb25seSBfZXh0cmFJbXBvcnRHcm91cHMgPSBuZXcgTWFwPHN0cmluZywgSW1wb3J0R3JvdXA+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2NsYXNzRGVjb3JhdG9yczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBfY3RvclBhcmFtczogc3RyaW5nW10gPSBbXCJwcml2YXRlIHJlYWRvbmx5IHNhbXBsZTogU2FtcGxlU2VydmljZVwiXTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9tZXRob2RzID0gbmV3IE1hcDxzdHJpbmcsIENvbnRyb2xsZXJNZXRob2Q+KFtcblx0XHRbXG5cdFx0XHRcImdldEFsbFwiLFxuXHRcdFx0bmV3IENvbnRyb2xsZXJNZXRob2QoXCJnZXRBbGxcIiwgXCJAR2V0KClcIiwgJ0BRdWVyeShcImZpbHRlclwiKSBmaWx0ZXI6IHN0cmluZycsIHRydWUsIFtcblx0XHRcdFx0XCJjb25zdCBncmVldGluZyA9IGF3YWl0IHRoaXMuc2FtcGxlLmdldEdyZWV0aW5nKCk7XCIsXG5cdFx0XHRcdFwicmV0dXJuIHsgZmlsdGVyLCBtZXNzYWdlOiBncmVldGluZyB9O1wiLFxuXHRcdFx0XSksXG5cdFx0XSxcblx0XHRbXG5cdFx0XHRcImdldE9uZVwiLFxuXHRcdFx0bmV3IENvbnRyb2xsZXJNZXRob2QoXG5cdFx0XHRcdFwiZ2V0T25lXCIsXG5cdFx0XHRcdCdAR2V0KFwiLzppZFwiKScsXG5cdFx0XHRcdCdAUGFyYW0oXCJpZFwiKSBpZDogc3RyaW5nJyxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9UZW1wbGF0ZUN1cmx5SW5TdHJpbmc6IHRlbXBsYXRlIGxpdGVyYWwgaW4gZ2VuZXJhdGVkIGNvZGVcblx0XHRcdFx0W1wicmV0dXJuIHsgaWQsIG1lc3NhZ2U6IGBIZWxsbyAke2lkfSFgIH07XCJdLFxuXHRcdFx0KSxcblx0XHRdLFxuXHRcdFtcblx0XHRcdFwiY3JlYXRlXCIsXG5cdFx0XHRuZXcgQ29udHJvbGxlck1ldGhvZChcImNyZWF0ZVwiLCBcIkBQb3N0KClcIiwgXCJib2R5OiBIZWxsb0JvZHlcIiwgZmFsc2UsIFtcblx0XHRcdFx0XCJyZXR1cm4geyBtZXNzYWdlOiBib2R5Lm1lc3NhZ2UgfTtcIixcblx0XHRcdF0pLFxuXHRcdF0sXG5cdFx0W1xuXHRcdFx0XCJ1cGRhdGVcIixcblx0XHRcdG5ldyBDb250cm9sbGVyTWV0aG9kKFxuXHRcdFx0XHRcInVwZGF0ZVwiLFxuXHRcdFx0XHQnQFB1dChcIi86aWRcIiknLFxuXHRcdFx0XHQnQFBhcmFtKFwiaWRcIikgaWQ6IHN0cmluZywgYm9keTogSGVsbG9Cb2R5Jyxcblx0XHRcdFx0ZmFsc2UsXG5cdFx0XHRcdFtcInJldHVybiB7IGlkLCBtZXNzYWdlOiBib2R5Lm1lc3NhZ2UgfTtcIl0sXG5cdFx0XHQpLFxuXHRcdF0sXG5cdFx0W1xuXHRcdFx0XCJyZW1vdmVcIixcblx0XHRcdG5ldyBDb250cm9sbGVyTWV0aG9kKFwicmVtb3ZlXCIsICdARGVsZXRlKFwiLzppZFwiKScsICdAUGFyYW0oXCJpZFwiKSBpZDogc3RyaW5nJywgZmFsc2UsIFtcblx0XHRcdFx0XCJyZXR1cm4geyBpZCwgZGVsZXRlZDogdHJ1ZSB9O1wiLFxuXHRcdFx0XSksXG5cdFx0XSxcblx0XSk7XG5cblx0LyoqIFJldHJpZXZlIGEgbWV0aG9kIGJ5IG5hbWUgdG8gbXV0YXRlIGl0cyBkZWNvcmF0b3JzLiAqL1xuXHRwdWJsaWMgZ2V0TWV0aG9kKG5hbWU6IHN0cmluZyk6IENvbnRyb2xsZXJNZXRob2Qge1xuXHRcdGNvbnN0IG0gPSB0aGlzLl9tZXRob2RzLmdldChuYW1lKTtcblx0XHRpZiAobSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoYE5vIG1ldGhvZCAnJHtuYW1lfScgb24gQ29udHJvbGxlclNvdXJjZUZpbGVgKTtcblx0XHRyZXR1cm4gbTtcblx0fVxuXG5cdC8qKiBBZGQgYSBjbGFzcy1sZXZlbCBkZWNvcmF0b3IgKGUuZy4gYEBBdXRob3JpemVgKS4gKi9cblx0cHVibGljIGFkZERlY29yYXRvcihkZWNvcmF0b3I6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2NsYXNzRGVjb3JhdG9ycy5wdXNoKGRlY29yYXRvcik7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKiogQWRkIGEgbmFtZWQgaW1wb3J0IGZyb20gYEBkZWNvaGVyZS9jb3J0ZXhgLiAqL1xuXHRwdWJsaWMgYWRkQ29ydGV4SW1wb3J0KG5hbWU6IHN0cmluZywgdHlwZU9ubHkgPSBmYWxzZSk6IHRoaXMge1xuXHRcdHRoaXMuX2NvcnRleEltcG9ydHMuYWRkKG5hbWUsIHR5cGVPbmx5KTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGQgYSBuYW1lZCBpbXBvcnQgZnJvbSBhbnkgb3RoZXIgbW9kdWxlLiAqL1xuXHRwdWJsaWMgYWRkSW1wb3J0KG5hbWU6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0eXBlT25seSA9IGZhbHNlKTogdGhpcyB7XG5cdFx0Y29uc3QgZ3JvdXAgPSB0aGlzLl9leHRyYUltcG9ydEdyb3Vwcy5nZXQoZnJvbSkgPz8gbmV3IEltcG9ydEdyb3VwKCk7XG5cdFx0Z3JvdXAuYWRkKG5hbWUsIHR5cGVPbmx5KTtcblx0XHR0aGlzLl9leHRyYUltcG9ydEdyb3Vwcy5zZXQoZnJvbSwgZ3JvdXApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqIEFkZCBhIGNvbnN0cnVjdG9yIHBhcmFtZXRlciAoZS5nLiBhbiBpbmplY3RlZCBkZXBlbmRlbmN5KS4gKi9cblx0cHVibGljIGFkZENvbnN0cnVjdG9yUGFyYW0ocGFyYW06IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2N0b3JQYXJhbXMucHVzaChwYXJhbSk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG5cdFx0XHR0aGlzLl9jb3J0ZXhJbXBvcnRzLnJlbmRlcihcIkBkZWNvaGVyZS9jb3J0ZXhcIiksXG5cdFx0XHQnaW1wb3J0IHsgU2FtcGxlU2VydmljZSB9IGZyb20gXCIuLi9zZXJ2aWNlcy9zYW1wbGUuc2VydmljZS5qc1wiOycsXG5cdFx0XTtcblxuXHRcdGZvciAoY29uc3QgW2Zyb20sIGdyb3VwXSBvZiB0aGlzLl9leHRyYUltcG9ydEdyb3Vwcykge1xuXHRcdFx0bGluZXMucHVzaChncm91cC5yZW5kZXIoZnJvbSkpO1xuXHRcdH1cblxuXHRcdGxpbmVzLnB1c2goXG5cdFx0XHRcIlwiLFxuXHRcdFx0XCJjbGFzcyBIZWxsb0JvZHkge1wiLFxuXHRcdFx0J1xcdEBGaWVsZChcImJvZHlcIiwgXCJtZXNzYWdlXCIpJyxcblx0XHRcdFwiXFx0cHVibGljIG1lc3NhZ2UhOiBzdHJpbmc7XCIsXG5cdFx0XHRcIn1cIixcblx0XHRcdFwiXCIsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgZCBvZiB0aGlzLl9jbGFzc0RlY29yYXRvcnMpIHtcblx0XHRcdGxpbmVzLnB1c2goZCk7XG5cdFx0fVxuXHRcdGxpbmVzLnB1c2goJ0BDb250cm9sbGVyKHsgcHJlZml4OiBcIi9oZWxsb1wiIH0pJywgXCJleHBvcnQgY2xhc3MgSGVsbG9Db250cm9sbGVyIHtcIiwgXCJcIik7XG5cblx0XHRsaW5lcy5wdXNoKFwiXFx0cHVibGljIGNvbnN0cnVjdG9yKFwiKTtcblx0XHRmb3IgKGNvbnN0IHAgb2YgdGhpcy5fY3RvclBhcmFtcykge1xuXHRcdFx0bGluZXMucHVzaChgXFx0XFx0JHtwfSxgKTtcblx0XHR9XG5cdFx0bGluZXMucHVzaChcIlxcdCkge31cIik7XG5cdFx0bGluZXMucHVzaChcIlwiKTtcblxuXHRcdGZvciAoY29uc3QgbWV0aG9kIG9mIHRoaXMuX21ldGhvZHMudmFsdWVzKCkpIHtcblx0XHRcdGxpbmVzLnB1c2goLi4ubWV0aG9kLnJlbmRlcigpLCBcIlwiKTtcblx0XHR9XG5cblx0XHRsaW5lcy5wdXNoKFwifVwiLCBcIlwiKTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcInNyYy9jb250cm9sbGVycy9oZWxsby5jb250cm9sbGVyLnRzXCIsXG5cdFx0XHRcdGNvbnRlbnQ6IGxpbmVzLmpvaW4oXCJcXG5cIiksXG5cdFx0XHR9LFxuXHRcdF07XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJDb250cm9sbGVyTWV0aG9kIiwiQ29udHJvbGxlclNvdXJjZUZpbGUiLCJJbXBvcnRHcm91cCIsIl92YWx1ZXMiLCJfdHlwZXMiLCJhZGQiLCJuYW1lIiwidHlwZU9ubHkiLCJpbmNsdWRlcyIsInB1c2giLCJ0eXBlSWR4IiwiaW5kZXhPZiIsInNwbGljZSIsInJlbmRlciIsImZyb20iLCJ2YWx1ZXMiLCJzb3J0IiwidHlwZXMiLCJtYXAiLCJuIiwiam9pbiIsIl9leHRyYURlY29yYXRvcnMiLCJfYm9keSIsIl9pc0FzeW5jIiwiX2h0dHBEZWNvcmF0b3IiLCJfcGFyYW1zIiwiaXNBc3luYyIsImJvZHkiLCJhZGREZWNvcmF0b3IiLCJkZWNvcmF0b3IiLCJzZXRCb2R5Iiwic2V0QXN5bmMiLCJsaW5lcyIsImQiLCJhc3luY0t3IiwibGluZSIsImtleSIsIldFTExfS05PV05fRklMRVMiLCJDT05UUk9MTEVSX1RTIiwiX2NvcnRleEltcG9ydHMiLCJfZXh0cmFJbXBvcnRHcm91cHMiLCJNYXAiLCJfY2xhc3NEZWNvcmF0b3JzIiwiX2N0b3JQYXJhbXMiLCJfbWV0aG9kcyIsImdldE1ldGhvZCIsIm0iLCJnZXQiLCJFcnJvciIsImFkZENvcnRleEltcG9ydCIsImFkZEltcG9ydCIsImdyb3VwIiwic2V0IiwiYWRkQ29uc3RydWN0b3JQYXJhbSIsInBhcmFtIiwiZmlsZXMiLCJwIiwibWV0aG9kIiwiZmlsZVBhdGgiLCJjb250ZW50Il0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztRQWtDYUE7ZUFBQUE7O1FBdURBQztlQUFBQTs7O3VCQXpGb0I7QUFHakMsaUZBQWlGLEdBQ2pGLE1BQU1DO0lBQ1lDLFVBQW9CLEVBQUUsQ0FBQztJQUN2QkMsU0FBbUIsRUFBRSxDQUFDO0lBRWhDQyxJQUFJQyxJQUFZLEVBQUVDLFdBQVcsS0FBSyxFQUFRO1FBQ2hELElBQUlBLFVBQVU7WUFDYixrREFBa0Q7WUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQ0osT0FBTyxDQUFDSyxRQUFRLENBQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUNGLE1BQU0sQ0FBQ0ksUUFBUSxDQUFDRixPQUFPO2dCQUNoRSxJQUFJLENBQUNGLE1BQU0sQ0FBQ0ssSUFBSSxDQUFD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
|
|
@@ -1,193 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "GithubCiWorkflows", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return GithubCiWorkflows;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _const = require("../../models/const.js");
|
|
12
|
-
class GithubCiWorkflows {
|
|
13
|
-
key = _const.WELL_KNOWN_FILES.GITHUB_CI;
|
|
14
|
-
files() {
|
|
15
|
-
return [
|
|
16
|
-
{
|
|
17
|
-
filePath: ".github/actions/setup-node-pnpm/action.yml",
|
|
18
|
-
content: `name: Setup Node + pnpm
|
|
19
|
-
description: Install pnpm and Node, configure npm registry auth, install deps
|
|
20
|
-
inputs:
|
|
21
|
-
node-version:
|
|
22
|
-
description: Node.js version
|
|
23
|
-
required: false
|
|
24
|
-
default: "24"
|
|
25
|
-
pnpm-version:
|
|
26
|
-
description: pnpm version
|
|
27
|
-
required: false
|
|
28
|
-
default: "10"
|
|
29
|
-
install:
|
|
30
|
-
description: Run pnpm install --frozen-lockfile
|
|
31
|
-
required: false
|
|
32
|
-
default: "true"
|
|
33
|
-
|
|
34
|
-
runs:
|
|
35
|
-
using: composite
|
|
36
|
-
steps:
|
|
37
|
-
- uses: pnpm/action-setup@v4
|
|
38
|
-
with:
|
|
39
|
-
version: \${{ inputs.pnpm-version }}
|
|
40
|
-
|
|
41
|
-
- uses: actions/setup-node@v4
|
|
42
|
-
with:
|
|
43
|
-
node-version: \${{ inputs.node-version }}
|
|
44
|
-
cache: pnpm
|
|
45
|
-
cache-dependency-path: pnpm-lock.yaml
|
|
46
|
-
|
|
47
|
-
- name: Configure npm auth
|
|
48
|
-
shell: bash
|
|
49
|
-
run: |
|
|
50
|
-
if [[ -n "\${NODE_AUTH_TOKEN:-}" ]]; then
|
|
51
|
-
echo "//registry.npmjs.org/:_authToken=\${NODE_AUTH_TOKEN}" >> .npmrc
|
|
52
|
-
fi
|
|
53
|
-
|
|
54
|
-
- name: Install dependencies
|
|
55
|
-
if: inputs.install == 'true'
|
|
56
|
-
shell: bash
|
|
57
|
-
run: |
|
|
58
|
-
if [[ -f pnpm-lock.yaml ]]; then
|
|
59
|
-
pnpm install --frozen-lockfile
|
|
60
|
-
else
|
|
61
|
-
pnpm install
|
|
62
|
-
fi
|
|
63
|
-
`
|
|
64
|
-
},
|
|
65
|
-
{
|
|
66
|
-
filePath: ".github/workflows/ci.yml",
|
|
67
|
-
content: `name: CI
|
|
68
|
-
on:
|
|
69
|
-
push:
|
|
70
|
-
branches:
|
|
71
|
-
- "*"
|
|
72
|
-
pull_request:
|
|
73
|
-
workflow_dispatch:
|
|
74
|
-
concurrency:
|
|
75
|
-
group: ci-\${{ github.ref }}
|
|
76
|
-
cancel-in-progress: true
|
|
77
|
-
env:
|
|
78
|
-
NODE_AUTH_TOKEN: \${{ secrets.NODE_AUTH_TOKEN }}
|
|
79
|
-
SCRIBE_LOG_LEVEL: info
|
|
80
|
-
|
|
81
|
-
jobs:
|
|
82
|
-
lint:
|
|
83
|
-
runs-on: ubuntu-latest
|
|
84
|
-
timeout-minutes: 15
|
|
85
|
-
permissions:
|
|
86
|
-
contents: read
|
|
87
|
-
steps:
|
|
88
|
-
- uses: actions/checkout@v4
|
|
89
|
-
with:
|
|
90
|
-
fetch-depth: 1
|
|
91
|
-
|
|
92
|
-
- uses: ./.github/actions/setup-node-pnpm
|
|
93
|
-
|
|
94
|
-
- name: Lint and typecheck
|
|
95
|
-
run: |
|
|
96
|
-
set +e
|
|
97
|
-
pnpm run lint:check &
|
|
98
|
-
lint_pid=$!
|
|
99
|
-
pnpm run typecheck &
|
|
100
|
-
tsc_pid=$!
|
|
101
|
-
wait "$lint_pid"
|
|
102
|
-
lint_code=$?
|
|
103
|
-
wait "$tsc_pid"
|
|
104
|
-
tsc_code=$?
|
|
105
|
-
set -e
|
|
106
|
-
if [[ "$lint_code" -ne 0 || "$tsc_code" -ne 0 ]]; then
|
|
107
|
-
exit 1
|
|
108
|
-
fi
|
|
109
|
-
|
|
110
|
-
test:
|
|
111
|
-
runs-on: ubuntu-latest
|
|
112
|
-
timeout-minutes: 20
|
|
113
|
-
permissions:
|
|
114
|
-
contents: read
|
|
115
|
-
steps:
|
|
116
|
-
- uses: actions/checkout@v4
|
|
117
|
-
with:
|
|
118
|
-
fetch-depth: 1
|
|
119
|
-
|
|
120
|
-
- uses: ./.github/actions/setup-node-pnpm
|
|
121
|
-
|
|
122
|
-
- name: Test
|
|
123
|
-
run: pnpm test
|
|
124
|
-
|
|
125
|
-
- name: Build (default branch)
|
|
126
|
-
if: github.ref == format('refs/heads/{0}', github.event.repository.default_branch)
|
|
127
|
-
run: pnpm run build
|
|
128
|
-
|
|
129
|
-
ci:
|
|
130
|
-
needs: [lint, test]
|
|
131
|
-
if: always()
|
|
132
|
-
runs-on: ubuntu-latest
|
|
133
|
-
timeout-minutes: 5
|
|
134
|
-
steps:
|
|
135
|
-
- name: Aggregate
|
|
136
|
-
run: |
|
|
137
|
-
if [[ "\${{ needs.lint.result }}" != "success" || "\${{ needs.test.result }}" != "success" ]]; then
|
|
138
|
-
echo "CI failed (lint=\${{ needs.lint.result }} test=\${{ needs.test.result }})"
|
|
139
|
-
exit 1
|
|
140
|
-
fi
|
|
141
|
-
echo "CI passed"
|
|
142
|
-
`
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
filePath: ".github/workflows/publish.yml",
|
|
146
|
-
content: `name: Publish
|
|
147
|
-
|
|
148
|
-
on:
|
|
149
|
-
workflow_run:
|
|
150
|
-
workflows: ["CI"]
|
|
151
|
-
types: [completed]
|
|
152
|
-
|
|
153
|
-
concurrency:
|
|
154
|
-
group: publish-\${{ github.event.workflow_run.head_branch }}
|
|
155
|
-
cancel-in-progress: false
|
|
156
|
-
|
|
157
|
-
env:
|
|
158
|
-
NODE_AUTH_TOKEN: \${{ secrets.NODE_AUTH_TOKEN }}
|
|
159
|
-
SCRIBE_LOG_LEVEL: info
|
|
160
|
-
|
|
161
|
-
jobs:
|
|
162
|
-
publish:
|
|
163
|
-
if: >
|
|
164
|
-
github.event.workflow_run.conclusion == 'success' &&
|
|
165
|
-
github.event.workflow_run.head_branch == github.event.repository.default_branch
|
|
166
|
-
runs-on: ubuntu-latest
|
|
167
|
-
timeout-minutes: 30
|
|
168
|
-
permissions:
|
|
169
|
-
contents: read
|
|
170
|
-
id-token: write
|
|
171
|
-
steps:
|
|
172
|
-
- uses: actions/checkout@v4
|
|
173
|
-
with:
|
|
174
|
-
ref: \${{ github.event.workflow_run.head_sha }}
|
|
175
|
-
fetch-depth: 1
|
|
176
|
-
|
|
177
|
-
- uses: ./.github/actions/setup-node-pnpm
|
|
178
|
-
|
|
179
|
-
- name: Build release
|
|
180
|
-
run: pnpm run build
|
|
181
|
-
|
|
182
|
-
- name: Publish packages
|
|
183
|
-
run: pnpm exec forge publish --configuration release
|
|
184
|
-
# Skips packages with "private": true (e.g. the webapi app).
|
|
185
|
-
# Optional registry images: add \`pnpm exec forge docker --configuration release --push\`
|
|
186
|
-
# after configuring GHCR/OIDC — not enabled by default (PaaS builds the Dockerfile).
|
|
187
|
-
`
|
|
188
|
-
}
|
|
189
|
-
];
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9naXRodWItY2kubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgV0VMTF9LTk9XTl9GSUxFUyB9IGZyb20gXCIuLi8uLi9tb2RlbHMvY29uc3QuanNcIjtcbmltcG9ydCB0eXBlIHsgS2V5ZWRNb2RlbCwgU291cmNlRmlsZSB9IGZyb20gXCIuLi8uLi9tb2RlbHMvc291cmNlLWZpbGUuanNcIjtcblxuLyoqXG4gKiBNaW5pbWFsIEdpdEh1YiBBY3Rpb25zIGZvciBzY2FmZm9sZGVkIGFwcHM6IGxpbnQg4oilIHRlc3QsIGJ1aWxkIGdhdGUgb24gZGVmYXVsdCBicmFuY2gsXG4gKiBucG0gcHVibGlzaCBhZnRlciBDSSAoc2tpcHMgcHJpdmF0ZSBwYWNrYWdlcykuIE5vIGRlZmF1bHQgZm9yZ2UgZG9ja2VyIC0tcHVzaC5cbiAqL1xuZXhwb3J0IGNsYXNzIEdpdGh1YkNpV29ya2Zsb3dzIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkdJVEhVQl9DSTtcblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCIuZ2l0aHViL2FjdGlvbnMvc2V0dXAtbm9kZS1wbnBtL2FjdGlvbi55bWxcIixcblx0XHRcdFx0Y29udGVudDogYG5hbWU6IFNldHVwIE5vZGUgKyBwbnBtXG5kZXNjcmlwdGlvbjogSW5zdGFsbCBwbnBtIGFuZCBOb2RlLCBjb25maWd1cmUgbnBtIHJlZ2lzdHJ5IGF1dGgsIGluc3RhbGwgZGVwc1xuaW5wdXRzOlxuICBub2RlLXZlcnNpb246XG4gICAgZGVzY3JpcHRpb246IE5vZGUuanMgdmVyc2lvblxuICAgIHJlcXVpcmVkOiBmYWxzZVxuICAgIGRlZmF1bHQ6IFwiMjRcIlxuICBwbnBtLXZlcnNpb246XG4gICAgZGVzY3JpcHRpb246IHBucG0gdmVyc2lvblxuICAgIHJlcXVpcmVkOiBmYWxzZVxuICAgIGRlZmF1bHQ6IFwiMTBcIlxuICBpbnN0YWxsOlxuICAgIGRlc2NyaXB0aW9uOiBSdW4gcG5wbSBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlXG4gICAgcmVxdWlyZWQ6IGZhbHNlXG4gICAgZGVmYXVsdDogXCJ0cnVlXCJcblxucnVuczpcbiAgdXNpbmc6IGNvbXBvc2l0ZVxuICBzdGVwczpcbiAgICAtIHVzZXM6IHBucG0vYWN0aW9uLXNldHVwQHY0XG4gICAgICB3aXRoOlxuICAgICAgICB2ZXJzaW9uOiBcXCR7eyBpbnB1dHMucG5wbS12ZXJzaW9uIH19XG5cbiAgICAtIHVzZXM6IGFjdGlvbnMvc2V0dXAtbm9kZUB2NFxuICAgICAgd2l0aDpcbiAgICAgICAgbm9kZS12ZXJzaW9uOiBcXCR7eyBpbnB1dHMubm9kZS12ZXJzaW9uIH19XG4gICAgICAgIGNhY2hlOiBwbnBtXG4gICAgICAgIGNhY2hlLWRlcGVuZGVuY3ktcGF0aDogcG5wbS1sb2NrLnlhbWxcblxuICAgIC0gbmFtZTogQ29uZmlndXJlIG5wbSBhdXRoXG4gICAgICBzaGVsbDogYmFzaFxuICAgICAgcnVuOiB8XG4gICAgICAgIGlmIFtbIC1uIFwiXFwke05PREVfQVVUSF9UT0tFTjotfVwiIF1dOyB0aGVuXG4gICAgICAgICAgZWNobyBcIi8vcmVnaXN0cnkubnBtanMub3JnLzpfYXV0aFRva2VuPVxcJHtOT0RFX0FVVEhfVE9LRU59XCIgPj4gLm5wbXJjXG4gICAgICAgIGZpXG5cbiAgICAtIG5hbWU6IEluc3RhbGwgZGVwZW5kZW5jaWVzXG4gICAgICBpZjogaW5wdXRzLmluc3RhbGwgPT0gJ3RydWUnXG4gICAgICBzaGVsbDogYmFzaFxuICAgICAgcnVuOiB8XG4gICAgICAgIGlmIFtbIC1mIHBucG0tbG9jay55YW1sIF1dOyB0aGVuXG4gICAgICAgICAgcG5wbSBpbnN0YWxsIC0tZnJvemVuLWxvY2tmaWxlXG4gICAgICAgIGVsc2VcbiAgICAgICAgICBwbnBtIGluc3RhbGxcbiAgICAgICAgZmlcbmAsXG5cdFx0XHR9LFxuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCIuZ2l0aHViL3dvcmtmbG93cy9jaS55bWxcIixcblx0XHRcdFx0Y29udGVudDogYG5hbWU6IENJXG5vbjpcbiAgcHVzaDpcbiAgICBicmFuY2hlczpcbiAgICAgIC0gXCIqXCJcbiAgcHVsbF9yZXF1ZXN0OlxuICB3b3JrZmxvd19kaXNwYXRjaDpcbmNvbmN1cnJlbmN5OlxuICBncm91cDogY2ktXFwke3sgZ2l0aHViLnJlZiB9fVxuICBjYW5jZWwtaW4tcHJvZ3Jlc3M6IHRydWVcbmVudjpcbiAgTk9ERV9BVVRIX1RPS0VOOiBcXCR7eyBzZWNyZXRzLk5PREVfQVVUSF9UT0tFTiB9fVxuICBTQ1JJQkVfTE9HX0xFVkVMOiBpbmZvXG5cbmpvYnM6XG4gIGxpbnQ6XG4gICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdFxuICAgIHRpbWVvdXQtbWludXRlczogMTVcbiAgICBwZXJtaXNzaW9uczpcbiAgICAgIGNvbnRlbnRzOiByZWFkXG4gICAgc3RlcHM6XG4gICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjRcbiAgICAgICAgd2l0aDpcbiAgICAgICAgICBmZXRjaC1kZXB0aDogMVxuXG4gICAgICAtIHVzZXM6IC4vLmdpdGh1Yi9hY3Rpb25zL3NldHVwLW5vZGUtcG5wbVxuXG4gICAgICAtIG5hbWU6IExpbnQgYW5kIHR5cGVjaGVja1xuICAgICAgICBydW46IHxcbiAgICAgICAgICBzZXQgK2VcbiAgICAgICAgICBwbnBtIHJ1biBsaW50OmNoZWNrICZcbiAgICAgICAgICBsaW50X3BpZD0kIVxuICAgICAgICAgIHBucG0gcnVuIHR5cGVjaGVjayAmXG4gICAgICAgICAgdHNjX3BpZD0kIVxuICAgICAgICAgIHdhaXQgXCIkbGludF9waWRcIlxuICAgICAgICAgIGxpbnRfY29kZT0kP1xuICAgICAgICAgIHdhaXQgXCIkdHNjX3BpZFwiXG4gICAgICAgICAgdHNjX2NvZGU9JD9cbiAgICAgICAgICBzZXQgLWVcbiAgICAgICAgICBpZiBbWyBcIiRsaW50X2NvZGVcIiAtbmUgMCB8fCBcIiR0c2NfY29kZVwiIC1uZSAwIF1dOyB0aGVuXG4gICAgICAgICAgICBleGl0IDFcbiAgICAgICAgICBmaVxuXG4gIHRlc3Q6XG4gICAgcnVucy1vbjogdWJ1bnR1LWxhdGVzdFxuICAgIHRpbWVvdXQtbWludXRlczogMjBcbiAgICBwZXJtaXNzaW9uczpcbiAgICAgIGNvbnRlbnRzOiByZWFkXG4gICAgc3RlcHM6XG4gICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjRcbiAgICAgICAgd2l0aDpcbiAgICAgICAgICBmZXRjaC1kZXB0aDogMVxuXG4gICAgICAtIHVzZXM6IC4vLmdpdGh1Yi9hY3Rpb25zL3NldHVwLW5vZGUtcG5wbVxuXG4gICAgICAtIG5hbWU6IFRlc3RcbiAgICAgICAgcnVuOiBwbnBtIHRlc3RcblxuICAgICAgLSBuYW1lOiBCdWlsZCAoZGVmYXVsdCBicmFuY2gpXG4gICAgICAgIGlmOiBnaXRodWIucmVmID09IGZvcm1hdCgncmVmcy9oZWFkcy97MH0nLCBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5kZWZhdWx0X2JyYW5jaClcbiAgICAgICAgcnVuOiBwbnBtIHJ1biBidWlsZFxuXG4gIGNpOlxuICAgIG5lZWRzOiBbbGludCwgdGVzdF1cbiAgICBpZjogYWx3YXlzKClcbiAgICBydW5zLW9uOiB1YnVudHUtbGF0ZXN0XG4gICAgdGltZW91dC1taW51dGVzOiA1XG4gICAgc3RlcHM6XG4gICAgICAtIG5hbWU6IEFnZ3JlZ2F0ZVxuICAgICAgICBydW46IHxcbiAgICAgICAgICBpZiBbWyBcIlxcJHt7IG5lZWRzLmxpbnQucmVzdWx0IH19XCIgIT0gXCJzdWNjZXNzXCIgfHwgXCJcXCR7eyBuZWVkcy50ZXN0LnJlc3VsdCB9fVwiICE9IFwic3VjY2Vzc1wiIF1dOyB0aGVuXG4gICAgICAgICAgICBlY2hvIFwiQ0kgZmFpbGVkIChsaW50PVxcJHt7IG5lZWRzLmxpbnQucmVzdWx0IH19IHRlc3Q9XFwke3sgbmVlZHMudGVzdC5yZXN1bHQgfX0pXCJcbiAgICAgICAgICAgIGV4aXQgMVxuICAgICAgICAgIGZpXG4gICAgICAgICAgZWNobyBcIkNJIHBhc3NlZFwiXG5gLFxuXHRcdFx0fSxcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwiLmdpdGh1Yi93b3JrZmxvd3MvcHVibGlzaC55bWxcIixcblx0XHRcdFx0Y29udGVudDogYG5hbWU6IFB1Ymxpc2hcblxub246XG4gIHdvcmtmbG93X3J1bjpcbiAgICB3b3JrZmxvd3M6IFtcIkNJXCJdXG4gICAgdHlwZXM6IFtjb21wbGV0ZWRdXG5cbmNvbmN1cnJlbmN5OlxuICBncm91cDogcHVibGlzaC1cXCR7eyBnaXRodWIuZXZlbnQud29ya2Zsb3dfcnVuLmhlYWRfYnJhbmNoIH19XG4gIGNhbmNlbC1pbi1wcm9ncmVzczogZmFsc2VcblxuZW52OlxuICBOT0RFX0FVVEhfVE9LRU46IFxcJHt7IHNlY3JldHMuTk9ERV9BVVRIX1RPS0VOIH19XG4gIFNDUklCRV9MT0dfTEVWRUw6IGluZm9cblxuam9iczpcbiAgcHVibGlzaDpcbiAgICBpZjogPlxuICAgICAgZ2l0aHViLmV2ZW50LndvcmtmbG93X3J1bi5jb25jbHVzaW9uID09ICdzdWNjZXNzJyAmJlxuICAgICAgZ2l0aHViLmV2ZW50LndvcmtmbG93X3J1bi5oZWFkX2JyYW5jaCA9PSBnaXRodWIuZXZlbnQucmVwb3NpdG9yeS5kZWZhdWx0X2JyYW5jaFxuICAgIHJ1bnMtb246IHVidW50dS1sYXRlc3RcbiAgICB0aW1lb3V0LW1pbnV0ZXM6IDMwXG4gICAgcGVybWlzc2lvbnM6XG4gICAgICBjb250ZW50czogcmVhZFxuICAgICAgaWQtdG9rZW46IHdyaXRlXG4gICAgc3RlcHM6XG4gICAgICAtIHVzZXM6IGFjdGlvbnMvY2hlY2tvdXRAdjRcbiAgICAgICAgd2l0aDpcbiAgICAgICAgICByZWY6IFxcJHt7IGdpdGh1Yi5ldmVudC53b3JrZmxvd19ydW4uaGVhZF9zaGEgfX1cbiAgICAgICAgICBmZXRjaC1kZXB0aDogMVxuXG4gICAgICAtIHVzZXM6IC4vLmdpdGh1Yi9hY3Rpb25zL3NldHVwLW5vZGUtcG5wbVxuXG4gICAgICAtIG5hbWU6IEJ1aWxkIHJlbGVhc2VcbiAgICAgICAgcnVuOiBwbnBtIHJ1biBidWlsZFxuXG4gICAgICAtIG5hbWU6IFB1Ymxpc2ggcGFja2FnZXNcbiAgICAgICAgcnVuOiBwbnBtIGV4ZWMgZm9yZ2UgcHVibGlzaCAtLWNvbmZpZ3VyYXRpb24gcmVsZWFzZVxuICAgICAgICAjIFNraXBzIHBhY2thZ2VzIHdpdGggXCJwcml2YXRlXCI6IHRydWUgKGUuZy4gdGhlIHdlYmFwaSBhcHApLlxuICAgICAgICAjIE9wdGlvbmFsIHJlZ2lzdHJ5IGltYWdlczogYWRkIFxcYHBucG0gZXhlYyBmb3JnZSBkb2NrZXIgLS1jb25maWd1cmF0aW9uIHJlbGVhc2UgLS1wdXNoXFxgXG4gICAgICAgICMgYWZ0ZXIgY29uZmlndXJpbmcgR0hDUi9PSURDIOKAlCBub3QgZW5hYmxlZCBieSBkZWZhdWx0IChQYWFTIGJ1aWxkcyB0aGUgRG9ja2VyZmlsZSkuXG5gLFxuXHRcdFx0fSxcblx0XHRdO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiR2l0aHViQ2lXb3JrZmxvd3MiLCJrZXkiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiR0lUSFVCX0NJIiwiZmlsZXMiLCJmaWxlUGF0aCIsImNvbnRlbnQiXSwibWFwcGluZ3MiOiI7Ozs7K0JBT2FBOzs7ZUFBQUE7Ozt1QkFQb0I7QUFPMUIsTUFBTUE7SUFDSUMsTUFBTUMsdUJBQWdCLENBQUNDLFNBQVMsQ0FBQztJQUUxQ0MsUUFBc0I7UUFDNUIsT0FBTztZQUNOO2dCQUNDQyxVQUFVO2dCQUNWQyxTQUFTLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQTZDZCxDQUFDO1lBQ0U7WUFDQTtnQkFDQ0QsVUFBVTtnQkFDVkMsU0FBUyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUEyRWQsQ0FBQztZQUNFO1lBQ0E7Z0JBQ0NELFVBQVU7Z0JBQ1ZDLFNBQVMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF5Q2QsQ0FBQztZQUNFO1NBQ0E7SUFDRjtBQUNEIn0=
|
|
@@ -1,165 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "MainSourceFile", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return MainSourceFile;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _const = require("../../models/const.js");
|
|
12
|
-
/** Tracks named imports from a single module path, split into values and types. */ class ImportGroup {
|
|
13
|
-
_values = [];
|
|
14
|
-
_types = [];
|
|
15
|
-
add(name, typeOnly = false) {
|
|
16
|
-
if (typeOnly) {
|
|
17
|
-
// Value import already present — value wins, skip
|
|
18
|
-
if (!this._values.includes(name) && !this._types.includes(name)) {
|
|
19
|
-
this._types.push(name);
|
|
20
|
-
}
|
|
21
|
-
} else {
|
|
22
|
-
// Promote: remove from types if it was previously type-only
|
|
23
|
-
const typeIdx = this._types.indexOf(name);
|
|
24
|
-
if (typeIdx !== -1) this._types.splice(typeIdx, 1);
|
|
25
|
-
if (!this._values.includes(name)) this._values.push(name);
|
|
26
|
-
}
|
|
27
|
-
return this;
|
|
28
|
-
}
|
|
29
|
-
render(from) {
|
|
30
|
-
const values = [
|
|
31
|
-
...this._values
|
|
32
|
-
].sort();
|
|
33
|
-
const types = [
|
|
34
|
-
...this._types
|
|
35
|
-
].sort().map((n)=>`type ${n}`);
|
|
36
|
-
return `import { ${[
|
|
37
|
-
...values,
|
|
38
|
-
...types
|
|
39
|
-
].join(", ")} } from "${from}";`;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
class MainSourceFile {
|
|
43
|
-
appName;
|
|
44
|
-
key = _const.WELL_KNOWN_FILES.MAIN_TS;
|
|
45
|
-
_sideEffectImports = [];
|
|
46
|
-
_extraImports = new Map();
|
|
47
|
-
_builderCalls = [];
|
|
48
|
-
_entities = [];
|
|
49
|
-
_repositories = [];
|
|
50
|
-
_services = [];
|
|
51
|
-
_dataSourceName;
|
|
52
|
-
_typeOrmSeed;
|
|
53
|
-
constructor(appName){
|
|
54
|
-
this.appName = appName;
|
|
55
|
-
}
|
|
56
|
-
/** Adds a bare side-effect import, e.g. `@decohere/cortex/auth`. */ addSideEffectImport(path) {
|
|
57
|
-
if (!this._sideEffectImports.includes(path)) this._sideEffectImports.push(path);
|
|
58
|
-
return this;
|
|
59
|
-
}
|
|
60
|
-
/** Adds a named import, e.g. `import { Foo } from "bar"`. */ addImport(name, from, typeOnly = false) {
|
|
61
|
-
const group = this._extraImports.get(from) ?? new ImportGroup();
|
|
62
|
-
group.add(name, typeOnly);
|
|
63
|
-
this._extraImports.set(from, group);
|
|
64
|
-
return this;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* Adds a builder call inserted after `.withConfiguration()` and before
|
|
68
|
-
* `.withServices()`. Pass the call without leading dot, e.g. `.withAuth()`.
|
|
69
|
-
*/ addBuilderCall(call) {
|
|
70
|
-
this._builderCalls.push(call);
|
|
71
|
-
return this;
|
|
72
|
-
}
|
|
73
|
-
/** Adds a TypeORM entity — import and entry in `withTypeOrm({ entities })`. */ addEntity(entity) {
|
|
74
|
-
this._entities.push(entity);
|
|
75
|
-
return this;
|
|
76
|
-
}
|
|
77
|
-
/** Adds a TypeORM repository — import and entry in `withTypeOrm({ repositories })`. */ addRepository(repo) {
|
|
78
|
-
this._repositories.push(repo);
|
|
79
|
-
return this;
|
|
80
|
-
}
|
|
81
|
-
/** Adds a service registered in `.withServices()`. */ addService(service) {
|
|
82
|
-
this._services.push(service);
|
|
83
|
-
return this;
|
|
84
|
-
}
|
|
85
|
-
/**
|
|
86
|
-
* Datasource name passed to `withTypeOrm({ name })`. Must match
|
|
87
|
-
* `database.dataSources[].name` in config.yaml.
|
|
88
|
-
*/ setDataSourceName(name) {
|
|
89
|
-
this._dataSourceName = name;
|
|
90
|
-
return this;
|
|
91
|
-
}
|
|
92
|
-
/**
|
|
93
|
-
* Inline seed callback body for `withTypeOrm({ seed })`.
|
|
94
|
-
* Receives `dataSource` in scope. Example: `await dataSource.getRepository(User).save(...)`.
|
|
95
|
-
*/ setTypeOrmSeed(seedBody) {
|
|
96
|
-
this._typeOrmSeed = seedBody;
|
|
97
|
-
return this;
|
|
98
|
-
}
|
|
99
|
-
files() {
|
|
100
|
-
const imports = [
|
|
101
|
-
'import "@decohere/scribe-pino";',
|
|
102
|
-
'import "@decohere/cortex/http";'
|
|
103
|
-
];
|
|
104
|
-
for (const path of this._sideEffectImports){
|
|
105
|
-
imports.push(`import "${path}";`);
|
|
106
|
-
}
|
|
107
|
-
imports.push('import "@decohere/protocol";', 'import { YamlDataSource } from "@decohere/protocol";', 'import { Builder } from "@decohere/cortex";', 'import { FastifyProvider } from "@decohere/cortex/providers";', 'import { scribe } from "@decohere/scribe";', 'import { SampleService } from "./services/sample.service.js";');
|
|
108
|
-
for (const e of this._entities){
|
|
109
|
-
imports.push(`import { ${e.className} } from "${e.importPath}";`);
|
|
110
|
-
}
|
|
111
|
-
for (const r of this._repositories){
|
|
112
|
-
imports.push(`import { ${r.className} } from "${r.importPath}";`);
|
|
113
|
-
}
|
|
114
|
-
for (const s of this._services){
|
|
115
|
-
imports.push(`import { ${s.className} } from "${s.importPath}";`);
|
|
116
|
-
}
|
|
117
|
-
for (const [from, group] of this._extraImports){
|
|
118
|
-
imports.push(group.render(from));
|
|
119
|
-
}
|
|
120
|
-
imports.push('import { HelloController } from "./controllers/hello.controller.js";');
|
|
121
|
-
const serviceRegs = [
|
|
122
|
-
"cb.registerSingleton(SampleService);",
|
|
123
|
-
...this._services.map((s)=>s.scope === "request" ? `cb.registerRequestScoped(${s.className});` : `cb.registerSingleton(${s.className});`)
|
|
124
|
-
].join(" ");
|
|
125
|
-
const builderCalls = [
|
|
126
|
-
`\t.withHttpProvider(FastifyProvider)`,
|
|
127
|
-
`\t.withConfiguration(YamlDataSource)`,
|
|
128
|
-
...this._builderCalls.map((c)=>`\t${c}`),
|
|
129
|
-
`\t.withServices((cb) => { ${serviceRegs} })`
|
|
130
|
-
];
|
|
131
|
-
if (this._entities.length > 0) {
|
|
132
|
-
const entities = this._entities.map((e)=>e.className).join(", ");
|
|
133
|
-
const repos = this._repositories.map((r)=>r.className).join(", ");
|
|
134
|
-
const named = this._dataSourceName != null ? `name: "${this._dataSourceName}", ` : "";
|
|
135
|
-
if (this._typeOrmSeed) {
|
|
136
|
-
builderCalls.push(`\t.withTypeOrm({ ${named}entities: [${entities}], repositories: [${repos}], seed: async (dataSource) => { ${this._typeOrmSeed} } })`);
|
|
137
|
-
} else {
|
|
138
|
-
builderCalls.push(`\t.withTypeOrm({ ${named}entities: [${entities}], repositories: [${repos}] })`);
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
builderCalls.push(`\t.withControllers(HelloController)`);
|
|
142
|
-
const content = [
|
|
143
|
-
...imports,
|
|
144
|
-
"",
|
|
145
|
-
"scribe.extend.withPinoPretty();",
|
|
146
|
-
"",
|
|
147
|
-
`const app = await Builder.create({ applicationName: "${this.appName}" })`,
|
|
148
|
-
...builderCalls,
|
|
149
|
-
`\t.build();`,
|
|
150
|
-
"",
|
|
151
|
-
"await app.start({ port: Number(process.env.PORT) || 3000 });",
|
|
152
|
-
"",
|
|
153
|
-
"export default app;",
|
|
154
|
-
""
|
|
155
|
-
].join("\n");
|
|
156
|
-
return [
|
|
157
|
-
{
|
|
158
|
-
filePath: "src/main.ts",
|
|
159
|
-
content
|
|
160
|
-
}
|
|
161
|
-
];
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9tYWluLXNvdXJjZS1maWxlLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFR5cGVPcm1JbXBvcnQgPSB7IGNsYXNzTmFtZTogc3RyaW5nOyBpbXBvcnRQYXRoOiBzdHJpbmcgfTtcbmV4cG9ydCB0eXBlIFNlcnZpY2VJbXBvcnQgPSBUeXBlT3JtSW1wb3J0ICYgeyBzY29wZT86IFwic2luZ2xldG9uXCIgfCBcInJlcXVlc3RcIiB9O1xuXG4vKiogVHJhY2tzIG5hbWVkIGltcG9ydHMgZnJvbSBhIHNpbmdsZSBtb2R1bGUgcGF0aCwgc3BsaXQgaW50byB2YWx1ZXMgYW5kIHR5cGVzLiAqL1xuY2xhc3MgSW1wb3J0R3JvdXAge1xuXHRwcml2YXRlIHJlYWRvbmx5IF92YWx1ZXM6IHN0cmluZ1tdID0gW107XG5cdHByaXZhdGUgcmVhZG9ubHkgX3R5cGVzOiBzdHJpbmdbXSA9IFtdO1xuXG5cdHB1YmxpYyBhZGQobmFtZTogc3RyaW5nLCB0eXBlT25seSA9IGZhbHNlKTogdGhpcyB7XG5cdFx0aWYgKHR5cGVPbmx5KSB7XG5cdFx0XHQvLyBWYWx1ZSBpbXBvcnQgYWxyZWFkeSBwcmVzZW50IOKAlCB2YWx1ZSB3aW5zLCBza2lwXG5cdFx0XHRpZiAoIXRoaXMuX3ZhbHVlcy5pbmNsdWRlcyhuYW1lKSAmJiAhdGhpcy5fdHlwZXMuaW5jbHVkZXMobmFtZSkpIHtcblx0XHRcdFx0dGhpcy5fdHlwZXMucHVzaChuYW1lKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gUHJvbW90ZTogcmVtb3ZlIGZyb20gdHlwZXMgaWYgaXQgd2FzIHByZXZpb3VzbHkgdHlwZS1vbmx5XG5cdFx0XHRjb25zdCB0eXBlSWR4ID0gdGhpcy5fdHlwZXMuaW5kZXhPZihuYW1lKTtcblx0XHRcdGlmICh0eXBlSWR4ICE9PSAtMSkgdGhpcy5fdHlwZXMuc3BsaWNlKHR5cGVJZHgsIDEpO1xuXHRcdFx0aWYgKCF0aGlzLl92YWx1ZXMuaW5jbHVkZXMobmFtZSkpIHRoaXMuX3ZhbHVlcy5wdXNoKG5hbWUpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyByZW5kZXIoZnJvbTogc3RyaW5nKTogc3RyaW5nIHtcblx0XHRjb25zdCB2YWx1ZXMgPSBbLi4udGhpcy5fdmFsdWVzXS5zb3J0KCk7XG5cdFx0Y29uc3QgdHlwZXMgPSBbLi4udGhpcy5fdHlwZXNdLnNvcnQoKS5tYXAoKG4pID0+IGB0eXBlICR7bn1gKTtcblx0XHRyZXR1cm4gYGltcG9ydCB7ICR7Wy4uLnZhbHVlcywgLi4udHlwZXNdLmpvaW4oXCIsIFwiKX0gfSBmcm9tIFwiJHtmcm9tfVwiO2A7XG5cdH1cbn1cblxuLyoqXG4gKiBNb2RlbCBmb3IgYHByb2plY3RzL2FwaS9zcmMvbWFpbi50c2AuXG4gKlxuICogU3RhcnRzIHdpdGggdGhlIG1pbmltYWwgSFRUUCArIFlBTUwgY29uZmlnIHNldHVwLiBGZWF0dXJlcyBtdXRhdGUgdGhlIG1vZGVsXG4gKiBieSBjYWxsaW5nIGFkZFNpZGVFZmZlY3RJbXBvcnQgLyBhZGRJbXBvcnQgLyBhZGRCdWlsZGVyQ2FsbCAvIGFkZEVudGl0eSAvXG4gKiBhZGRSZXBvc2l0b3J5LiBmaWxlcygpIHJlbmRlcnMgd2hhdGV2ZXIgaGFzIGJlZW4gYWNjdW11bGF0ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBNYWluU291cmNlRmlsZSBpbXBsZW1lbnRzIEtleWVkTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkga2V5ID0gV0VMTF9LTk9XTl9GSUxFUy5NQUlOX1RTO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX3NpZGVFZmZlY3RJbXBvcnRzOiBzdHJpbmdbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9leHRyYUltcG9ydHMgPSBuZXcgTWFwPHN0cmluZywgSW1wb3J0R3JvdXA+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2J1aWxkZXJDYWxsczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBfZW50aXRpZXM6IFR5cGVPcm1JbXBvcnRbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9yZXBvc2l0b3JpZXM6IFR5cGVPcm1JbXBvcnRbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9zZXJ2aWNlczogU2VydmljZUltcG9ydFtdID0gW107XG5cdHByaXZhdGUgX2RhdGFTb3VyY2VOYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cdHByaXZhdGUgX3R5cGVPcm1TZWVkOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgYXBwTmFtZTogc3RyaW5nKSB7fVxuXG5cdC8qKiBBZGRzIGEgYmFyZSBzaWRlLWVmZmVjdCBpbXBvcnQsIGUuZy4gYEBkZWNvaGVyZS9jb3J0ZXgvYXV0aGAuICovXG5cdHB1YmxpYyBhZGRTaWRlRWZmZWN0SW1wb3J0KHBhdGg6IHN0cmluZyk6IHRoaXMge1xuXHRcdGlmICghdGhpcy5fc2lkZUVmZmVjdEltcG9ydHMuaW5jbHVkZXMocGF0aCkpIHRoaXMuX3NpZGVFZmZlY3RJbXBvcnRzLnB1c2gocGF0aCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKiogQWRkcyBhIG5hbWVkIGltcG9ydCwgZS5nLiBgaW1wb3J0IHsgRm9vIH0gZnJvbSBcImJhclwiYC4gKi9cblx0cHVibGljIGFkZEltcG9ydChuYW1lOiBzdHJpbmcsIGZyb206IHN0cmluZywgdHlwZU9ubHkgPSBmYWxzZSk6IHRoaXMge1xuXHRcdGNvbnN0IGdyb3VwID0gdGhpcy5fZXh0cmFJbXBvcnRzLmdldChmcm9tKSA/PyBuZXcgSW1wb3J0R3JvdXAoKTtcblx0XHRncm91cC5hZGQobmFtZSwgdHlwZU9ubHkpO1xuXHRcdHRoaXMuX2V4dHJhSW1wb3J0cy5zZXQoZnJvbSwgZ3JvdXApO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqXG5cdCAqIEFkZHMgYSBidWlsZGVyIGNhbGwgaW5zZXJ0ZWQgYWZ0ZXIgYC53aXRoQ29uZmlndXJhdGlvbigpYCBhbmQgYmVmb3JlXG5cdCAqIGAud2l0aFNlcnZpY2VzKClgLiBQYXNzIHRoZSBjYWxsIHdpdGhvdXQgbGVhZGluZyBkb3QsIGUuZy4gYC53aXRoQXV0aCgpYC5cblx0ICovXG5cdHB1YmxpYyBhZGRCdWlsZGVyQ2FsbChjYWxsOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9idWlsZGVyQ2FsbHMucHVzaChjYWxsKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgVHlwZU9STSBlbnRpdHkg4oCUIGltcG9ydCBhbmQgZW50cnkgaW4gYHdpdGhUeXBlT3JtKHsgZW50aXRpZXMgfSlgLiAqL1xuXHRwdWJsaWMgYWRkRW50aXR5KGVudGl0eTogVHlwZU9ybUltcG9ydCk6IHRoaXMge1xuXHRcdHRoaXMuX2VudGl0aWVzLnB1c2goZW50aXR5KTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgVHlwZU9STSByZXBvc2l0b3J5IOKAlCBpbXBvcnQgYW5kIGVudHJ5IGluIGB3aXRoVHlwZU9ybSh7IHJlcG9zaXRvcmllcyB9KWAuICovXG5cdHB1YmxpYyBhZGRSZXBvc2l0b3J5KHJlcG86IFR5cGVPcm1JbXBvcnQpOiB0aGlzIHtcblx0XHR0aGlzLl9yZXBvc2l0b3JpZXMucHVzaChyZXBvKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgc2VydmljZSByZWdpc3RlcmVkIGluIGAud2l0aFNlcnZpY2VzKClgLiAqL1xuXHRwdWJsaWMgYWRkU2VydmljZShzZXJ2aWNlOiBTZXJ2aWNlSW1wb3J0KTogdGhpcyB7XG5cdFx0dGhpcy5fc2VydmljZXMucHVzaChzZXJ2aWNlKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBEYXRhc291cmNlIG5hbWUgcGFzc2VkIHRvIGB3aXRoVHlwZU9ybSh7IG5hbWUgfSlgLiBNdXN0IG1hdGNoXG5cdCAqIGBkYXRhYmFzZS5kYXRhU291cmNlc1tdLm5hbWVgIGluIGNvbmZpZy55YW1sLlxuXHQgKi9cblx0cHVibGljIHNldERhdGFTb3VyY2VOYW1lKG5hbWU6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2RhdGFTb3VyY2VOYW1lID0gbmFtZTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBJbmxpbmUgc2VlZCBjYWxsYmFjayBib2R5IGZvciBgd2l0aFR5cGVPcm0oeyBzZWVkIH0pYC5cblx0ICogUmVjZWl2ZXMgYGRhdGFTb3VyY2VgIGluIHNjb3BlLiBFeGFtcGxlOiBgYXdhaXQgZGF0YVNvdXJjZS5nZXRSZXBvc2l0b3J5KFVzZXIpLnNhdmUoLi4uKWAuXG5cdCAqL1xuXHRwdWJsaWMgc2V0VHlwZU9ybVNlZWQoc2VlZEJvZHk6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX3R5cGVPcm1TZWVkID0gc2VlZEJvZHk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtcblx0XHRcdCdpbXBvcnQgXCJAZGVjb2hlcmUvc2NyaWJlLXBpbm9cIjsnLFxuXHRcdFx0J2ltcG9ydCBcIkBkZWNvaGVyZS9jb3J0ZXgvaHR0cFwiOycsXG5cdFx0XTtcblxuXHRcdGZvciAoY29uc3QgcGF0aCBvZiB0aGlzLl9zaWRlRWZmZWN0SW1wb3J0cykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgXCIke3BhdGh9XCI7YCk7XG5cdFx0fVxuXG5cdFx0aW1wb3J0cy5wdXNoKFxuXHRcdFx0J2ltcG9ydCBcIkBkZWNvaGVyZS9wcm90b2NvbFwiOycsXG5cdFx0XHQnaW1wb3J0IHsgWWFtbERhdGFTb3VyY2UgfSBmcm9tIFwiQGRlY29oZXJlL3Byb3RvY29sXCI7Jyxcblx0XHRcdCdpbXBvcnQgeyBCdWlsZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9jb3J0ZXhcIjsnLFxuXHRcdFx0J2ltcG9ydCB7IEZhc3RpZnlQcm92aWRlciB9IGZyb20gXCJAZGVjb2hlcmUvY29ydGV4L3Byb3ZpZGVyc1wiOycsXG5cdFx0XHQnaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIkBkZWNvaGVyZS9zY3JpYmVcIjsnLFxuXHRcdFx0J2ltcG9ydCB7IFNhbXBsZVNlcnZpY2UgfSBmcm9tIFwiLi9zZXJ2aWNlcy9zYW1wbGUuc2VydmljZS5qc1wiOycsXG5cdFx0KTtcblxuXHRcdGZvciAoY29uc3QgZSBvZiB0aGlzLl9lbnRpdGllcykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgeyAke2UuY2xhc3NOYW1lfSB9IGZyb20gXCIke2UuaW1wb3J0UGF0aH1cIjtgKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IHIgb2YgdGhpcy5fcmVwb3NpdG9yaWVzKSB7XG5cdFx0XHRpbXBvcnRzLnB1c2goYGltcG9ydCB7ICR7ci5jbGFzc05hbWV9IH0gZnJvbSBcIiR7ci5pbXBvcnRQYXRofVwiO2ApO1xuXHRcdH1cblxuXHRcdGZvciAoY29uc3QgcyBvZiB0aGlzLl9zZXJ2aWNlcykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgeyAke3MuY2xhc3NOYW1lfSB9IGZyb20gXCIke3MuaW1wb3J0UGF0aH1cIjtgKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IFtmcm9tLCBncm91cF0gb2YgdGhpcy5fZXh0cmFJbXBvcnRzKSB7XG5cdFx0XHRpbXBvcnRzLnB1c2goZ3JvdXAucmVuZGVyKGZyb20pKTtcblx0XHR9XG5cblx0XHRpbXBvcnRzLnB1c2goJ2ltcG9ydCB7IEhlbGxvQ29udHJvbGxlciB9IGZyb20gXCIuL2NvbnRyb2xsZXJzL2hlbGxvLmNvbnRyb2xsZXIuanNcIjsnKTtcblxuXHRcdGNvbnN0IHNlcnZpY2VSZWdzID0gW1xuXHRcdFx0XCJjYi5yZWdpc3RlclNpbmdsZXRvbihTYW1wbGVTZXJ2aWNlKTtcIixcblx0XHRcdC4uLnRoaXMuX3NlcnZpY2VzLm1hcCgocykgPT5cblx0XHRcdFx0cy5zY29wZSA9PT0gXCJyZXF1ZXN0XCJcblx0XHRcdFx0XHQ/IGBjYi5yZWdpc3RlclJlcXVlc3RTY29wZWQoJHtzLmNsYXNzTmFtZX0pO2Bcblx0XHRcdFx0XHQ6IGBjYi5yZWdpc3RlclNpbmdsZXRvbigke3MuY2xhc3NOYW1lfSk7YCxcblx0XHRcdCksXG5cdFx0XS5qb2luKFwiIFwiKTtcblxuXHRcdGNvbnN0IGJ1aWxkZXJDYWxsczogc3RyaW5nW10gPSBbXG5cdFx0XHRgXFx0LndpdGhIdHRwUHJvdmlkZXIoRmFzdGlmeVByb3ZpZGVyKWAsXG5cdFx0XHRgXFx0LndpdGhDb25maWd1cmF0aW9uKFlhbWxEYXRhU291cmNlKWAsXG5cdFx0XHQuLi50aGlzLl9idWlsZGVyQ2FsbHMubWFwKChjKSA9PiBgXFx0JHtjfWApLFxuXHRcdFx0YFxcdC53aXRoU2VydmljZXMoKGNiKSA9PiB7ICR7c2VydmljZVJlZ3N9IH0pYCxcblx0XHRdO1xuXG5cdFx0aWYgKHRoaXMuX2VudGl0aWVzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGVudGl0aWVzID0gdGhpcy5fZW50aXRpZXMubWFwKChlKSA9PiBlLmNsYXNzTmFtZSkuam9pbihcIiwgXCIpO1xuXHRcdFx0Y29uc3QgcmVwb3MgPSB0aGlzLl9yZXBvc2l0b3JpZXMubWFwKChyKSA9PiByLmNsYXNzTmFtZSkuam9pbihcIiwgXCIpO1xuXHRcdFx0Y29uc3QgbmFtZWQgPSB0aGlzLl9kYXRhU291cmNlTmFtZSAhPSBudWxsID8gYG5hbWU6IFwiJHt0aGlzLl9kYXRhU291cmNlTmFtZX1cIiwgYCA6IFwiXCI7XG5cdFx0XHRpZiAodGhpcy5fdHlwZU9ybVNlZWQpIHtcblx0XHRcdFx0YnVpbGRlckNhbGxzLnB1c2goXG5cdFx0XHRcdFx0YFxcdC53aXRoVHlwZU9ybSh7ICR7bmFtZWR9ZW50aXRpZXM6IFske2VudGl0aWVzfV0sIHJlcG9zaXRvcmllczogWyR7cmVwb3N9XSwgc2VlZDogYXN5bmMgKGRhdGFTb3VyY2UpID0+IHsgJHt0aGlzLl90eXBlT3JtU2VlZH0gfSB9KWAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRidWlsZGVyQ2FsbHMucHVzaChcblx0XHRcdFx0XHRgXFx0LndpdGhUeXBlT3JtKHsgJHtuYW1lZH1lbnRpdGllczogWyR7ZW50aXRpZXN9XSwgcmVwb3NpdG9yaWVzOiBbJHtyZXBvc31dIH0pYCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRidWlsZGVyQ2FsbHMucHVzaChgXFx0LndpdGhDb250cm9sbGVycyhIZWxsb0NvbnRyb2xsZXIpYCk7XG5cblx0XHRjb25zdCBjb250ZW50ID0gW1xuXHRcdFx0Li4uaW1wb3J0cyxcblx0XHRcdFwiXCIsXG5cdFx0XHRcInNjcmliZS5leHRlbmQud2l0aFBpbm9QcmV0dHkoKTtcIixcblx0XHRcdFwiXCIsXG5cdFx0XHRgY29uc3QgYXBwID0gYXdhaXQgQnVpbGRlci5jcmVhdGUoeyBhcHBsaWNhdGlvbk5hbWU6IFwiJHt0aGlzLmFwcE5hbWV9XCIgfSlgLFxuXHRcdFx0Li4uYnVpbGRlckNhbGxzLFxuXHRcdFx0YFxcdC5idWlsZCgpO2AsXG5cdFx0XHRcIlwiLFxuXHRcdFx0XCJhd2FpdCBhcHAuc3RhcnQoeyBwb3J0OiBOdW1iZXIocHJvY2Vzcy5lbnYuUE9SVCkgfHwgMzAwMCB9KTtcIixcblx0XHRcdFwiXCIsXG5cdFx0XHRcImV4cG9ydCBkZWZhdWx0IGFwcDtcIixcblx0XHRcdFwiXCIsXG5cdFx0XS5qb2luKFwiXFxuXCIpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwic3JjL21haW4udHNcIixcblx0XHRcdFx0Y29udGVudCxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIk1haW5Tb3VyY2VGaWxlIiwiSW1wb3J0R3JvdXAiLCJfdmFsdWVzIiwiX3R5cGVzIiwiYWRkIiwibmFtZSIsInR5cGVPbmx5IiwiaW5jbHVkZXMiLCJwdXNoIiwidHlwZUlkeCIsImluZGV4T2YiLCJzcGxpY2UiLCJyZW5kZXIiLCJmcm9tIiwidmFsdWVzIiwic29ydCIsInR5cGVzIiwibWFwIiwibiIsImpvaW4iLCJrZXkiLCJXRUxMX0tOT1dOX0ZJTEVTIiwiTUFJTl9UUyIsIl9zaWRlRWZmZWN0SW1wb3J0cyIsIl9leHRyYUltcG9ydHMiLCJNYXAiLCJfYnVpbGRlckNhbGxzIiwiX2VudGl0aWVzIiwiX3JlcG9zaXRvcmllcyIsIl9zZXJ2aWNlcyIsIl9kYXRhU291cmNlTmFtZSIsIl90eXBlT3JtU2VlZCIsImFwcE5hbWUiLCJhZGRTaWRlRWZmZWN0SW1wb3J0IiwicGF0aCIsImFkZEltcG9ydCIsImdyb3VwIiwiZ2V0Iiwic2V0IiwiYWRkQnVpbGRlckNhbGwiLCJjYWxsIiwiYWRkRW50aXR5IiwiZW50aXR5IiwiYWRkUmVwb3NpdG9yeSIsInJlcG8iLCJhZGRTZXJ2aWNlIiwic2VydmljZSIsInNldERhdGFTb3VyY2VOYW1lIiwic2V0VHlwZU9ybVNlZWQiLCJzZWVkQm9keSIsImZpbGVzIiwiaW1wb3J0cyIsImUiLCJjbGFzc05hbWUiLCJpbXBvcnRQYXRoIiwiciIsInMiLCJzZXJ2aWNlUmVncyIsInNjb3BlIiwiYnVpbGRlckNhbGxzIiwiYyIsImxlbmd0aCIsImVudGl0aWVzIiwicmVwb3MiLCJuYW1lZCIsImNvbnRlbnQiLCJmaWxlUGF0aCJdLCJtYXBwaW5ncyI6Ijs7OzsrQkF3Q2FBOzs7ZUFBQUE7Ozt1QkF4Q29CO0FBTWpDLGlGQUFpRixHQUNqRixNQUFNQztJQUNZQyxVQUFvQixFQUFFLENBQUM7SUFDdkJDLFNBQW1CLEVBQUUsQ0FBQztJQUVoQ0Ms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
|