@decohere/create 0.0.1-dev.16 → 0.0.1-dev.18
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 +26 -5
- package/commonjs/src/models/compose.model.js +82 -0
- package/commonjs/src/models/config-yaml.model.js +34 -0
- package/commonjs/src/models/const.js +29 -0
- package/commonjs/src/models/container-image.model.js +88 -0
- package/commonjs/src/models/dev-container.model.js +73 -0
- package/commonjs/src/models/env-file.model.js +33 -0
- package/commonjs/src/models/gitignore.model.js +32 -0
- package/commonjs/src/models/launch-json.model.js +52 -0
- package/commonjs/src/models/package-json.model.js +64 -0
- package/commonjs/src/models/project.model.js +126 -0
- package/commonjs/src/models/source-file.js +6 -0
- package/commonjs/src/models/tsconfig.model.js +34 -0
- package/commonjs/src/models/vscode-settings.model.js +31 -0
- package/commonjs/src/services/scaffold.service.js +62 -0
- package/commonjs/src/webapi/create-api.js +169 -0
- package/commonjs/src/webapi/features/auth.feature.js +166 -0
- package/commonjs/src/webapi/features/auth0-cli.js +151 -0
- package/commonjs/src/webapi/features/database.feature.js +151 -0
- package/commonjs/src/webapi/features/finalize.feature.js +46 -0
- package/commonjs/src/webapi/features/postman.feature.js +309 -0
- package/commonjs/src/webapi/models/api-package-json.model.js +57 -0
- package/commonjs/src/webapi/models/auth-config.model.js +23 -0
- package/commonjs/src/webapi/models/controller-source-file.model.js +180 -0
- package/commonjs/src/webapi/models/main-source-file.model.js +132 -0
- package/commonjs/src/webapi/models/sample-files.model.js +60 -0
- package/commonjs/v1/cli.js +15 -0
- package/commonjs/v1/domain/class-model.js +106 -0
- package/commonjs/v1/domain/compose.model.js +74 -0
- package/commonjs/v1/domain/context.js +53 -0
- package/commonjs/v1/domain/devcontainer.model.js +116 -0
- package/commonjs/v1/domain/dockerfile.model.js +62 -0
- package/commonjs/v1/domain/feature.js +19 -0
- package/commonjs/v1/domain/import-map.js +74 -0
- package/commonjs/v1/domain/index.js +68 -0
- package/commonjs/v1/domain/prompt.js +45 -0
- package/commonjs/v1/domain/workflow.js +37 -0
- package/commonjs/v1/features/api-core/feature.js +103 -0
- package/commonjs/v1/features/api-core/hello-controller.model.js +100 -0
- package/commonjs/v1/features/api-core/main-ts.model.js +85 -0
- package/commonjs/v1/features/api-core/scaffold-files.template.js +158 -0
- package/commonjs/v1/features/auth0/auth0-cli.js +151 -0
- package/commonjs/v1/features/auth0/feature.js +187 -0
- package/commonjs/v1/features/auth0/models.js +14 -0
- package/commonjs/v1/features/auth0/prod-config.template.js +19 -0
- package/commonjs/v1/features/cli-core/feature.js +37 -0
- package/commonjs/v1/features/cli-core/scaffold-files.template.js +103 -0
- package/commonjs/v1/features/devcontainer/feature.js +38 -0
- package/commonjs/v1/features/finalize/feature.js +48 -0
- package/commonjs/v1/features/postgresql/feature.js +81 -0
- package/commonjs/v1/features/postgresql/models.js +14 -0
- package/commonjs/v1/features/postman/collection.template.js +80 -0
- package/commonjs/v1/features/postman/environment.template.js +24 -0
- package/commonjs/v1/features/postman/feature.js +192 -0
- package/commonjs/v1/features/typeorm/feature.js +66 -0
- package/commonjs/v1/features/typeorm/scaffold-files.template.js +80 -0
- package/commonjs/v1/scaffold.js +50 -0
- package/commonjs/v1/version.js +32 -0
- package/commonjs/v1/workflows/api.js +29 -0
- package/commonjs/v1/workflows/cli.js +19 -0
- package/es6/src/cli.js +26 -5
- package/es6/src/models/compose.model.js +77 -0
- package/es6/src/models/config-yaml.model.js +30 -0
- package/es6/src/models/const.js +19 -0
- package/es6/src/models/container-image.model.js +84 -0
- package/es6/src/models/dev-container.model.js +68 -0
- package/es6/src/models/env-file.model.js +29 -0
- package/es6/src/models/gitignore.model.js +22 -0
- package/es6/src/models/launch-json.model.js +42 -0
- package/es6/src/models/package-json.model.js +60 -0
- package/es6/src/models/project.model.js +111 -0
- package/es6/src/models/source-file.js +3 -0
- package/es6/src/models/tsconfig.model.js +24 -0
- package/es6/src/models/vscode-settings.model.js +21 -0
- package/es6/src/services/scaffold.service.js +52 -0
- package/es6/src/webapi/create-api.js +151 -0
- package/es6/src/webapi/features/auth.feature.js +115 -0
- package/es6/src/webapi/features/auth0-cli.js +116 -0
- package/es6/src/webapi/features/database.feature.js +141 -0
- package/es6/src/webapi/features/finalize.feature.js +36 -0
- package/es6/src/webapi/features/postman.feature.js +258 -0
- package/es6/src/webapi/models/api-package-json.model.js +52 -0
- package/es6/src/webapi/models/auth-config.model.js +19 -0
- package/es6/src/webapi/models/controller-source-file.model.js +171 -0
- package/es6/src/webapi/models/main-source-file.model.js +128 -0
- package/es6/src/webapi/models/sample-files.model.js +42 -0
- package/es6/v1/cli.js +11 -0
- package/es6/v1/domain/class-model.js +104 -0
- package/es6/v1/domain/compose.model.js +61 -0
- package/es6/v1/domain/context.js +37 -0
- package/es6/v1/domain/devcontainer.model.js +104 -0
- package/es6/v1/domain/dockerfile.model.js +52 -0
- package/es6/v1/domain/feature.js +9 -0
- package/es6/v1/domain/import-map.js +64 -0
- package/es6/v1/domain/index.js +11 -0
- package/es6/v1/domain/prompt.js +27 -0
- package/es6/v1/domain/workflow.js +24 -0
- package/es6/v1/features/api-core/feature.js +93 -0
- package/es6/v1/features/api-core/hello-controller.model.js +96 -0
- package/es6/v1/features/api-core/main-ts.model.js +74 -0
- package/es6/v1/features/api-core/scaffold-files.template.js +116 -0
- package/es6/v1/features/auth0/auth0-cli.js +116 -0
- package/es6/v1/features/auth0/feature.js +136 -0
- package/es6/v1/features/auth0/models.js +4 -0
- package/es6/v1/features/auth0/prod-config.template.js +9 -0
- package/es6/v1/features/cli-core/feature.js +27 -0
- package/es6/v1/features/cli-core/scaffold-files.template.js +73 -0
- package/es6/v1/features/devcontainer/feature.js +28 -0
- package/es6/v1/features/finalize/feature.js +38 -0
- package/es6/v1/features/postgresql/feature.js +71 -0
- package/es6/v1/features/postgresql/models.js +4 -0
- package/es6/v1/features/postman/collection.template.js +70 -0
- package/es6/v1/features/postman/environment.template.js +14 -0
- package/es6/v1/features/postman/feature.js +141 -0
- package/es6/v1/features/typeorm/feature.js +56 -0
- package/es6/v1/features/typeorm/scaffold-files.template.js +56 -0
- package/es6/v1/scaffold.js +40 -0
- package/es6/v1/version.js +22 -0
- package/es6/v1/workflows/api.js +25 -0
- package/es6/v1/workflows/cli.js +9 -0
- package/package.json +2 -2
- package/types/src/models/compose.model.d.ts +32 -0
- package/types/src/models/config-yaml.model.d.ts +16 -0
- package/types/src/models/const.d.ts +17 -0
- package/types/src/models/container-image.model.d.ts +15 -0
- package/types/src/models/dev-container.model.d.ts +21 -0
- package/types/src/models/env-file.model.d.ts +14 -0
- package/types/src/models/gitignore.model.d.ts +6 -0
- package/types/src/models/launch-json.model.d.ts +5 -0
- package/types/src/models/package-json.model.d.ts +18 -0
- package/types/src/models/project.model.d.ts +55 -0
- package/types/src/models/source-file.d.ts +11 -0
- package/types/src/models/tsconfig.model.d.ts +5 -0
- package/types/src/models/vscode-settings.model.d.ts +7 -0
- package/types/src/services/scaffold.service.d.ts +22 -0
- package/types/src/webapi/create-api.d.ts +7 -0
- package/types/src/webapi/features/auth.feature.d.ts +7 -0
- package/types/src/webapi/features/auth0-cli.d.ts +22 -0
- package/types/src/webapi/features/database.feature.d.ts +5 -0
- package/types/src/webapi/features/finalize.feature.d.ts +2 -0
- package/types/src/webapi/features/postman.feature.d.ts +7 -0
- package/types/src/webapi/models/api-package-json.model.d.ts +17 -0
- package/types/src/webapi/models/auth-config.model.d.ts +18 -0
- package/types/src/webapi/models/controller-source-file.model.d.ts +42 -0
- package/types/src/webapi/models/main-source-file.model.d.ts +36 -0
- package/types/src/webapi/models/sample-files.model.d.ts +7 -0
- package/types/v1/cli.d.ts +2 -0
- package/types/v1/domain/class-model.d.ts +70 -0
- package/types/v1/domain/compose.model.d.ts +25 -0
- package/types/v1/domain/context.d.ts +36 -0
- package/types/v1/domain/devcontainer.model.d.ts +35 -0
- package/types/v1/domain/dockerfile.model.d.ts +11 -0
- package/types/v1/domain/feature.d.ts +29 -0
- package/types/v1/domain/import-map.d.ts +24 -0
- package/types/v1/domain/index.d.ts +12 -0
- package/types/v1/domain/prompt.d.ts +2 -0
- package/types/v1/domain/workflow.d.ts +14 -0
- package/types/v1/features/api-core/feature.d.ts +2 -0
- package/types/v1/features/api-core/hello-controller.model.d.ts +9 -0
- package/types/v1/features/api-core/main-ts.model.d.ts +31 -0
- package/types/v1/features/api-core/scaffold-files.template.d.ts +10 -0
- package/types/v1/features/auth0/auth0-cli.d.ts +22 -0
- package/types/v1/features/auth0/feature.d.ts +2 -0
- package/types/v1/features/auth0/models.d.ts +5 -0
- package/types/v1/features/auth0/prod-config.template.d.ts +1 -0
- package/types/v1/features/cli-core/feature.d.ts +2 -0
- package/types/v1/features/cli-core/scaffold-files.template.d.ts +6 -0
- package/types/v1/features/devcontainer/feature.d.ts +2 -0
- package/types/v1/features/finalize/feature.d.ts +2 -0
- package/types/v1/features/postgresql/feature.d.ts +2 -0
- package/types/v1/features/postgresql/models.d.ts +6 -0
- package/types/v1/features/postman/collection.template.d.ts +1 -0
- package/types/v1/features/postman/environment.template.d.ts +6 -0
- package/types/v1/features/postman/feature.d.ts +2 -0
- package/types/v1/features/typeorm/feature.d.ts +2 -0
- package/types/v1/features/typeorm/scaffold-files.template.d.ts +9 -0
- package/types/v1/scaffold.d.ts +3 -0
- package/types/v1/version.d.ts +2 -0
- package/types/v1/workflows/api.d.ts +8 -0
- package/types/v1/workflows/cli.d.ts +1 -0
- package/commonjs/src/scaffold.js +0 -89
- package/commonjs/src/templates.js +0 -305
- package/es6/src/scaffold.js +0 -79
- package/es6/src/templates.js +0 -245
- package/types/src/scaffold.d.ts +0 -6
- package/types/src/templates.d.ts +0 -20
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { WELL_KNOWN_FILES } from "../../models/const.js";
|
|
2
|
+
/** Tracks named imports from a single module path, split into values and types. */ class ImportGroup {
|
|
3
|
+
_values = [];
|
|
4
|
+
_types = [];
|
|
5
|
+
add(name, typeOnly = false) {
|
|
6
|
+
if (typeOnly) {
|
|
7
|
+
// Value import already present — value wins, skip
|
|
8
|
+
if (!this._values.includes(name) && !this._types.includes(name)) {
|
|
9
|
+
this._types.push(name);
|
|
10
|
+
}
|
|
11
|
+
} else {
|
|
12
|
+
// Promote: remove from types if it was previously type-only
|
|
13
|
+
const typeIdx = this._types.indexOf(name);
|
|
14
|
+
if (typeIdx !== -1) this._types.splice(typeIdx, 1);
|
|
15
|
+
if (!this._values.includes(name)) this._values.push(name);
|
|
16
|
+
}
|
|
17
|
+
return this;
|
|
18
|
+
}
|
|
19
|
+
render(from) {
|
|
20
|
+
const values = [
|
|
21
|
+
...this._values
|
|
22
|
+
].sort();
|
|
23
|
+
const types = [
|
|
24
|
+
...this._types
|
|
25
|
+
].sort().map((n)=>`type ${n}`);
|
|
26
|
+
return `import { ${[
|
|
27
|
+
...values,
|
|
28
|
+
...types
|
|
29
|
+
].join(", ")} } from "${from}";`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* A controller method. Features call `addDecorator()` to prepend decorators
|
|
34
|
+
* before the HTTP verb decorator (e.g. `@AllowAnonymous` before `@Get()`).
|
|
35
|
+
*/ export class ControllerMethod {
|
|
36
|
+
name;
|
|
37
|
+
_httpDecorator;
|
|
38
|
+
_params;
|
|
39
|
+
_isAsync;
|
|
40
|
+
_body;
|
|
41
|
+
_extraDecorators = [];
|
|
42
|
+
constructor(name, _httpDecorator, _params, _isAsync, _body){
|
|
43
|
+
this.name = name;
|
|
44
|
+
this._httpDecorator = _httpDecorator;
|
|
45
|
+
this._params = _params;
|
|
46
|
+
this._isAsync = _isAsync;
|
|
47
|
+
this._body = _body;
|
|
48
|
+
}
|
|
49
|
+
addDecorator(decorator) {
|
|
50
|
+
this._extraDecorators.push(decorator);
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
render() {
|
|
54
|
+
const lines = [];
|
|
55
|
+
for (const d of this._extraDecorators){
|
|
56
|
+
lines.push(`\t${d}`);
|
|
57
|
+
}
|
|
58
|
+
lines.push(`\t${this._httpDecorator}`);
|
|
59
|
+
const asyncKw = this._isAsync ? "async " : "";
|
|
60
|
+
lines.push(`\tpublic ${asyncKw}${this.name}(${this._params}) {`);
|
|
61
|
+
for (const line of this._body){
|
|
62
|
+
lines.push(`\t\t${line}`);
|
|
63
|
+
}
|
|
64
|
+
lines.push("\t}");
|
|
65
|
+
return lines;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Model for `projects/api/src/controllers/hello.controller.ts`.
|
|
70
|
+
*
|
|
71
|
+
* Pre-initialised with all routes and their HTTP decorators. Features mutate
|
|
72
|
+
* the model via `getMethod(name).addDecorator(...)`, `addDecorator(...)` (class
|
|
73
|
+
* level), `addCortexImport(...)`, `addImport(...)`, and `addConstructorParam(...)`.
|
|
74
|
+
*/ export class ControllerSourceFile {
|
|
75
|
+
key = WELL_KNOWN_FILES.CONTROLLER_TS;
|
|
76
|
+
_cortexImports = new ImportGroup().add("Controller").add("Delete").add("Field").add("Get").add("Param").add("Post").add("Put").add("Query");
|
|
77
|
+
_extraImportGroups = new Map();
|
|
78
|
+
_classDecorators = [];
|
|
79
|
+
_ctorParams = [
|
|
80
|
+
"private readonly sample: SampleService"
|
|
81
|
+
];
|
|
82
|
+
_methods = new Map([
|
|
83
|
+
[
|
|
84
|
+
"getAll",
|
|
85
|
+
new ControllerMethod("getAll", "@Get()", '@Query("filter") filter: string', true, [
|
|
86
|
+
"const greeting = await this.sample.getGreeting();",
|
|
87
|
+
"return { filter, message: greeting };"
|
|
88
|
+
])
|
|
89
|
+
],
|
|
90
|
+
[
|
|
91
|
+
"getOne",
|
|
92
|
+
new ControllerMethod("getOne", '@Get("/:id")', '@Param("id") id: string', false, // biome-ignore lint/suspicious/noTemplateCurlyInString: template literal in generated code
|
|
93
|
+
[
|
|
94
|
+
"return { id, message: `Hello ${id}!` };"
|
|
95
|
+
])
|
|
96
|
+
],
|
|
97
|
+
[
|
|
98
|
+
"create",
|
|
99
|
+
new ControllerMethod("create", '@Post("/")', "body: HelloBody", false, [
|
|
100
|
+
"return { message: body.message };"
|
|
101
|
+
])
|
|
102
|
+
],
|
|
103
|
+
[
|
|
104
|
+
"update",
|
|
105
|
+
new ControllerMethod("update", '@Put("/:id")', '@Param("id") id: string, body: HelloBody', false, [
|
|
106
|
+
"return { id, message: body.message };"
|
|
107
|
+
])
|
|
108
|
+
],
|
|
109
|
+
[
|
|
110
|
+
"remove",
|
|
111
|
+
new ControllerMethod("remove", '@Delete("/:id")', '@Param("id") id: string', false, [
|
|
112
|
+
"return { id, deleted: true };"
|
|
113
|
+
])
|
|
114
|
+
]
|
|
115
|
+
]);
|
|
116
|
+
/** Retrieve a method by name to mutate its decorators. */ getMethod(name) {
|
|
117
|
+
const m = this._methods.get(name);
|
|
118
|
+
if (m == null) throw new Error(`No method '${name}' on ControllerSourceFile`);
|
|
119
|
+
return m;
|
|
120
|
+
}
|
|
121
|
+
/** Add a class-level decorator (e.g. `@Authorize`). */ addDecorator(decorator) {
|
|
122
|
+
this._classDecorators.push(decorator);
|
|
123
|
+
return this;
|
|
124
|
+
}
|
|
125
|
+
/** Add a named import from `@decohere/cortex`. */ addCortexImport(name, typeOnly = false) {
|
|
126
|
+
this._cortexImports.add(name, typeOnly);
|
|
127
|
+
return this;
|
|
128
|
+
}
|
|
129
|
+
/** Add a named import from any other module. */ addImport(name, from, typeOnly = false) {
|
|
130
|
+
const group = this._extraImportGroups.get(from) ?? new ImportGroup();
|
|
131
|
+
group.add(name, typeOnly);
|
|
132
|
+
this._extraImportGroups.set(from, group);
|
|
133
|
+
return this;
|
|
134
|
+
}
|
|
135
|
+
/** Add a constructor parameter (e.g. an injected dependency). */ addConstructorParam(param) {
|
|
136
|
+
this._ctorParams.push(param);
|
|
137
|
+
return this;
|
|
138
|
+
}
|
|
139
|
+
files() {
|
|
140
|
+
const lines = [
|
|
141
|
+
this._cortexImports.render("@decohere/cortex"),
|
|
142
|
+
'import { SampleService } from "../sample.service.js";'
|
|
143
|
+
];
|
|
144
|
+
for (const [from, group] of this._extraImportGroups){
|
|
145
|
+
lines.push(group.render(from));
|
|
146
|
+
}
|
|
147
|
+
lines.push("", "class HelloBody {", '\t@Field("body", "message")', "\tpublic message!: string;", "}", "");
|
|
148
|
+
for (const d of this._classDecorators){
|
|
149
|
+
lines.push(d);
|
|
150
|
+
}
|
|
151
|
+
lines.push('@Controller({ prefix: "/hello" })', "export class HelloController {", "");
|
|
152
|
+
lines.push("\tpublic constructor(");
|
|
153
|
+
for (const p of this._ctorParams){
|
|
154
|
+
lines.push(`\t\t${p},`);
|
|
155
|
+
}
|
|
156
|
+
lines.push("\t) {}");
|
|
157
|
+
lines.push("");
|
|
158
|
+
for (const method of this._methods.values()){
|
|
159
|
+
lines.push(...method.render(), "");
|
|
160
|
+
}
|
|
161
|
+
lines.push("}", "");
|
|
162
|
+
return [
|
|
163
|
+
{
|
|
164
|
+
filePath: "src/controllers/hello.controller.ts",
|
|
165
|
+
content: lines.join("\n")
|
|
166
|
+
}
|
|
167
|
+
];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9jb250cm9sbGVyLXNvdXJjZS1maWxlLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5cbi8qKiBUcmFja3MgbmFtZWQgaW1wb3J0cyBmcm9tIGEgc2luZ2xlIG1vZHVsZSBwYXRoLCBzcGxpdCBpbnRvIHZhbHVlcyBhbmQgdHlwZXMuICovXG5jbGFzcyBJbXBvcnRHcm91cCB7XG5cdHByaXZhdGUgcmVhZG9ubHkgX3ZhbHVlczogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBfdHlwZXM6IHN0cmluZ1tdID0gW107XG5cblx0cHVibGljIGFkZChuYW1lOiBzdHJpbmcsIHR5cGVPbmx5ID0gZmFsc2UpOiB0aGlzIHtcblx0XHRpZiAodHlwZU9ubHkpIHtcblx0XHRcdC8vIFZhbHVlIGltcG9ydCBhbHJlYWR5IHByZXNlbnQg4oCUIHZhbHVlIHdpbnMsIHNraXBcblx0XHRcdGlmICghdGhpcy5fdmFsdWVzLmluY2x1ZGVzKG5hbWUpICYmICF0aGlzLl90eXBlcy5pbmNsdWRlcyhuYW1lKSkge1xuXHRcdFx0XHR0aGlzLl90eXBlcy5wdXNoKG5hbWUpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHQvLyBQcm9tb3RlOiByZW1vdmUgZnJvbSB0eXBlcyBpZiBpdCB3YXMgcHJldmlvdXNseSB0eXBlLW9ubHlcblx0XHRcdGNvbnN0IHR5cGVJZHggPSB0aGlzLl90eXBlcy5pbmRleE9mKG5hbWUpO1xuXHRcdFx0aWYgKHR5cGVJZHggIT09IC0xKSB0aGlzLl90eXBlcy5zcGxpY2UodHlwZUlkeCwgMSk7XG5cdFx0XHRpZiAoIXRoaXMuX3ZhbHVlcy5pbmNsdWRlcyhuYW1lKSkgdGhpcy5fdmFsdWVzLnB1c2gobmFtZSk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHJlbmRlcihmcm9tOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRcdGNvbnN0IHZhbHVlcyA9IFsuLi50aGlzLl92YWx1ZXNdLnNvcnQoKTtcblx0XHRjb25zdCB0eXBlcyA9IFsuLi50aGlzLl90eXBlc10uc29ydCgpLm1hcCgobikgPT4gYHR5cGUgJHtufWApO1xuXHRcdHJldHVybiBgaW1wb3J0IHsgJHtbLi4udmFsdWVzLCAuLi50eXBlc10uam9pbihcIiwgXCIpfSB9IGZyb20gXCIke2Zyb219XCI7YDtcblx0fVxufVxuXG4vKipcbiAqIEEgY29udHJvbGxlciBtZXRob2QuIEZlYXR1cmVzIGNhbGwgYGFkZERlY29yYXRvcigpYCB0byBwcmVwZW5kIGRlY29yYXRvcnNcbiAqIGJlZm9yZSB0aGUgSFRUUCB2ZXJiIGRlY29yYXRvciAoZS5nLiBgQEFsbG93QW5vbnltb3VzYCBiZWZvcmUgYEBHZXQoKWApLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbGxlck1ldGhvZCB7XG5cdHByaXZhdGUgcmVhZG9ubHkgX2V4dHJhRGVjb3JhdG9yczogc3RyaW5nW10gPSBbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IoXG5cdFx0cHVibGljIHJlYWRvbmx5IG5hbWU6IHN0cmluZyxcblx0XHRwcml2YXRlIHJlYWRvbmx5IF9odHRwRGVjb3JhdG9yOiBzdHJpbmcsXG5cdFx0cHJpdmF0ZSByZWFkb25seSBfcGFyYW1zOiBzdHJpbmcsXG5cdFx0cHJpdmF0ZSByZWFkb25seSBfaXNBc3luYzogYm9vbGVhbixcblx0XHRwcml2YXRlIHJlYWRvbmx5IF9ib2R5OiBzdHJpbmdbXSxcblx0KSB7fVxuXG5cdHB1YmxpYyBhZGREZWNvcmF0b3IoZGVjb3JhdG9yOiBzdHJpbmcpOiB0aGlzIHtcblx0XHR0aGlzLl9leHRyYURlY29yYXRvcnMucHVzaChkZWNvcmF0b3IpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHJlbmRlcigpOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG5cdFx0Zm9yIChjb25zdCBkIG9mIHRoaXMuX2V4dHJhRGVjb3JhdG9ycykge1xuXHRcdFx0bGluZXMucHVzaChgXFx0JHtkfWApO1xuXHRcdH1cblx0XHRsaW5lcy5wdXNoKGBcXHQke3RoaXMuX2h0dHBEZWNvcmF0b3J9YCk7XG5cdFx0Y29uc3QgYXN5bmNLdyA9IHRoaXMuX2lzQXN5bmMgPyBcImFzeW5jIFwiIDogXCJcIjtcblx0XHRsaW5lcy5wdXNoKGBcXHRwdWJsaWMgJHthc3luY0t3fSR7dGhpcy5uYW1lfSgke3RoaXMuX3BhcmFtc30pIHtgKTtcblx0XHRmb3IgKGNvbnN0IGxpbmUgb2YgdGhpcy5fYm9keSkge1xuXHRcdFx0bGluZXMucHVzaChgXFx0XFx0JHtsaW5lfWApO1xuXHRcdH1cblx0XHRsaW5lcy5wdXNoKFwiXFx0fVwiKTtcblx0XHRyZXR1cm4gbGluZXM7XG5cdH1cbn1cblxuLyoqXG4gKiBNb2RlbCBmb3IgYHByb2plY3RzL2FwaS9zcmMvY29udHJvbGxlcnMvaGVsbG8uY29udHJvbGxlci50c2AuXG4gKlxuICogUHJlLWluaXRpYWxpc2VkIHdpdGggYWxsIHJvdXRlcyBhbmQgdGhlaXIgSFRUUCBkZWNvcmF0b3JzLiBGZWF0dXJlcyBtdXRhdGVcbiAqIHRoZSBtb2RlbCB2aWEgYGdldE1ldGhvZChuYW1lKS5hZGREZWNvcmF0b3IoLi4uKWAsIGBhZGREZWNvcmF0b3IoLi4uKWAgKGNsYXNzXG4gKiBsZXZlbCksIGBhZGRDb3J0ZXhJbXBvcnQoLi4uKWAsIGBhZGRJbXBvcnQoLi4uKWAsIGFuZCBgYWRkQ29uc3RydWN0b3JQYXJhbSguLi4pYC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyb2xsZXJTb3VyY2VGaWxlIGltcGxlbWVudHMgS2V5ZWRNb2RlbCB7XG5cdHB1YmxpYyByZWFkb25seSBrZXkgPSBXRUxMX0tOT1dOX0ZJTEVTLkNPTlRST0xMRVJfVFM7XG5cblx0cHJpdmF0ZSByZWFkb25seSBfY29ydGV4SW1wb3J0cyA9IG5ldyBJbXBvcnRHcm91cCgpXG5cdFx0LmFkZChcIkNvbnRyb2xsZXJcIilcblx0XHQuYWRkKFwiRGVsZXRlXCIpXG5cdFx0LmFkZChcIkZpZWxkXCIpXG5cdFx0LmFkZChcIkdldFwiKVxuXHRcdC5hZGQoXCJQYXJhbVwiKVxuXHRcdC5hZGQoXCJQb3N0XCIpXG5cdFx0LmFkZChcIlB1dFwiKVxuXHRcdC5hZGQoXCJRdWVyeVwiKTtcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9leHRyYUltcG9ydEdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCBJbXBvcnRHcm91cD4oKTtcblx0cHJpdmF0ZSByZWFkb25seSBfY2xhc3NEZWNvcmF0b3JzOiBzdHJpbmdbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9jdG9yUGFyYW1zOiBzdHJpbmdbXSA9IFtcInByaXZhdGUgcmVhZG9ubHkgc2FtcGxlOiBTYW1wbGVTZXJ2aWNlXCJdO1xuXG5cdHByaXZhdGUgcmVhZG9ubHkgX21ldGhvZHMgPSBuZXcgTWFwPHN0cmluZywgQ29udHJvbGxlck1ldGhvZD4oW1xuXHRcdFtcblx0XHRcdFwiZ2V0QWxsXCIsXG5cdFx0XHRuZXcgQ29udHJvbGxlck1ldGhvZChcImdldEFsbFwiLCBcIkBHZXQoKVwiLCAnQFF1ZXJ5KFwiZmlsdGVyXCIpIGZpbHRlcjogc3RyaW5nJywgdHJ1ZSwgW1xuXHRcdFx0XHRcImNvbnN0IGdyZWV0aW5nID0gYXdhaXQgdGhpcy5zYW1wbGUuZ2V0R3JlZXRpbmcoKTtcIixcblx0XHRcdFx0XCJyZXR1cm4geyBmaWx0ZXIsIG1lc3NhZ2U6IGdyZWV0aW5nIH07XCIsXG5cdFx0XHRdKSxcblx0XHRdLFxuXHRcdFtcblx0XHRcdFwiZ2V0T25lXCIsXG5cdFx0XHRuZXcgQ29udHJvbGxlck1ldGhvZChcblx0XHRcdFx0XCJnZXRPbmVcIixcblx0XHRcdFx0J0BHZXQoXCIvOmlkXCIpJyxcblx0XHRcdFx0J0BQYXJhbShcImlkXCIpIGlkOiBzdHJpbmcnLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RlbXBsYXRlQ3VybHlJblN0cmluZzogdGVtcGxhdGUgbGl0ZXJhbCBpbiBnZW5lcmF0ZWQgY29kZVxuXHRcdFx0XHRbXCJyZXR1cm4geyBpZCwgbWVzc2FnZTogYEhlbGxvICR7aWR9IWAgfTtcIl0sXG5cdFx0XHQpLFxuXHRcdF0sXG5cdFx0W1xuXHRcdFx0XCJjcmVhdGVcIixcblx0XHRcdG5ldyBDb250cm9sbGVyTWV0aG9kKFwiY3JlYXRlXCIsICdAUG9zdChcIi9cIiknLCBcImJvZHk6IEhlbGxvQm9keVwiLCBmYWxzZSwgW1xuXHRcdFx0XHRcInJldHVybiB7IG1lc3NhZ2U6IGJvZHkubWVzc2FnZSB9O1wiLFxuXHRcdFx0XSksXG5cdFx0XSxcblx0XHRbXG5cdFx0XHRcInVwZGF0ZVwiLFxuXHRcdFx0bmV3IENvbnRyb2xsZXJNZXRob2QoXG5cdFx0XHRcdFwidXBkYXRlXCIsXG5cdFx0XHRcdCdAUHV0KFwiLzppZFwiKScsXG5cdFx0XHRcdCdAUGFyYW0oXCJpZFwiKSBpZDogc3RyaW5nLCBib2R5OiBIZWxsb0JvZHknLFxuXHRcdFx0XHRmYWxzZSxcblx0XHRcdFx0W1wicmV0dXJuIHsgaWQsIG1lc3NhZ2U6IGJvZHkubWVzc2FnZSB9O1wiXSxcblx0XHRcdCksXG5cdFx0XSxcblx0XHRbXG5cdFx0XHRcInJlbW92ZVwiLFxuXHRcdFx0bmV3IENvbnRyb2xsZXJNZXRob2QoXCJyZW1vdmVcIiwgJ0BEZWxldGUoXCIvOmlkXCIpJywgJ0BQYXJhbShcImlkXCIpIGlkOiBzdHJpbmcnLCBmYWxzZSwgW1xuXHRcdFx0XHRcInJldHVybiB7IGlkLCBkZWxldGVkOiB0cnVlIH07XCIsXG5cdFx0XHRdKSxcblx0XHRdLFxuXHRdKTtcblxuXHQvKiogUmV0cmlldmUgYSBtZXRob2QgYnkgbmFtZSB0byBtdXRhdGUgaXRzIGRlY29yYXRvcnMuICovXG5cdHB1YmxpYyBnZXRNZXRob2QobmFtZTogc3RyaW5nKTogQ29udHJvbGxlck1ldGhvZCB7XG5cdFx0Y29uc3QgbSA9IHRoaXMuX21ldGhvZHMuZ2V0KG5hbWUpO1xuXHRcdGlmIChtID09IG51bGwpIHRocm93IG5ldyBFcnJvcihgTm8gbWV0aG9kICcke25hbWV9JyBvbiBDb250cm9sbGVyU291cmNlRmlsZWApO1xuXHRcdHJldHVybiBtO1xuXHR9XG5cblx0LyoqIEFkZCBhIGNsYXNzLWxldmVsIGRlY29yYXRvciAoZS5nLiBgQEF1dGhvcml6ZWApLiAqL1xuXHRwdWJsaWMgYWRkRGVjb3JhdG9yKGRlY29yYXRvcjogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fY2xhc3NEZWNvcmF0b3JzLnB1c2goZGVjb3JhdG9yKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGQgYSBuYW1lZCBpbXBvcnQgZnJvbSBgQGRlY29oZXJlL2NvcnRleGAuICovXG5cdHB1YmxpYyBhZGRDb3J0ZXhJbXBvcnQobmFtZTogc3RyaW5nLCB0eXBlT25seSA9IGZhbHNlKTogdGhpcyB7XG5cdFx0dGhpcy5fY29ydGV4SW1wb3J0cy5hZGQobmFtZSwgdHlwZU9ubHkpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqIEFkZCBhIG5hbWVkIGltcG9ydCBmcm9tIGFueSBvdGhlciBtb2R1bGUuICovXG5cdHB1YmxpYyBhZGRJbXBvcnQobmFtZTogc3RyaW5nLCBmcm9tOiBzdHJpbmcsIHR5cGVPbmx5ID0gZmFsc2UpOiB0aGlzIHtcblx0XHRjb25zdCBncm91cCA9IHRoaXMuX2V4dHJhSW1wb3J0R3JvdXBzLmdldChmcm9tKSA/PyBuZXcgSW1wb3J0R3JvdXAoKTtcblx0XHRncm91cC5hZGQobmFtZSwgdHlwZU9ubHkpO1xuXHRcdHRoaXMuX2V4dHJhSW1wb3J0R3JvdXBzLnNldChmcm9tLCBncm91cCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKiogQWRkIGEgY29uc3RydWN0b3IgcGFyYW1ldGVyIChlLmcuIGFuIGluamVjdGVkIGRlcGVuZGVuY3kpLiAqL1xuXHRwdWJsaWMgYWRkQ29uc3RydWN0b3JQYXJhbShwYXJhbTogc3RyaW5nKTogdGhpcyB7XG5cdFx0dGhpcy5fY3RvclBhcmFtcy5wdXNoKHBhcmFtKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdHB1YmxpYyBmaWxlcygpOiBTb3VyY2VGaWxlW10ge1xuXHRcdGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcblx0XHRcdHRoaXMuX2NvcnRleEltcG9ydHMucmVuZGVyKFwiQGRlY29oZXJlL2NvcnRleFwiKSxcblx0XHRcdCdpbXBvcnQgeyBTYW1wbGVTZXJ2aWNlIH0gZnJvbSBcIi4uL3NhbXBsZS5zZXJ2aWNlLmpzXCI7Jyxcblx0XHRdO1xuXG5cdFx0Zm9yIChjb25zdCBbZnJvbSwgZ3JvdXBdIG9mIHRoaXMuX2V4dHJhSW1wb3J0R3JvdXBzKSB7XG5cdFx0XHRsaW5lcy5wdXNoKGdyb3VwLnJlbmRlcihmcm9tKSk7XG5cdFx0fVxuXG5cdFx0bGluZXMucHVzaChcblx0XHRcdFwiXCIsXG5cdFx0XHRcImNsYXNzIEhlbGxvQm9keSB7XCIsXG5cdFx0XHQnXFx0QEZpZWxkKFwiYm9keVwiLCBcIm1lc3NhZ2VcIiknLFxuXHRcdFx0XCJcXHRwdWJsaWMgbWVzc2FnZSE6IHN0cmluZztcIixcblx0XHRcdFwifVwiLFxuXHRcdFx0XCJcIixcblx0XHQpO1xuXG5cdFx0Zm9yIChjb25zdCBkIG9mIHRoaXMuX2NsYXNzRGVjb3JhdG9ycykge1xuXHRcdFx0bGluZXMucHVzaChkKTtcblx0XHR9XG5cdFx0bGluZXMucHVzaCgnQENvbnRyb2xsZXIoeyBwcmVmaXg6IFwiL2hlbGxvXCIgfSknLCBcImV4cG9ydCBjbGFzcyBIZWxsb0NvbnRyb2xsZXIge1wiLCBcIlwiKTtcblxuXHRcdGxpbmVzLnB1c2goXCJcXHRwdWJsaWMgY29uc3RydWN0b3IoXCIpO1xuXHRcdGZvciAoY29uc3QgcCBvZiB0aGlzLl9jdG9yUGFyYW1zKSB7XG5cdFx0XHRsaW5lcy5wdXNoKGBcXHRcXHQke3B9LGApO1xuXHRcdH1cblx0XHRsaW5lcy5wdXNoKFwiXFx0KSB7fVwiKTtcblx0XHRsaW5lcy5wdXNoKFwiXCIpO1xuXG5cdFx0Zm9yIChjb25zdCBtZXRob2Qgb2YgdGhpcy5fbWV0aG9kcy52YWx1ZXMoKSkge1xuXHRcdFx0bGluZXMucHVzaCguLi5tZXRob2QucmVuZGVyKCksIFwiXCIpO1xuXHRcdH1cblxuXHRcdGxpbmVzLnB1c2goXCJ9XCIsIFwiXCIpO1xuXG5cdFx0cmV0dXJuIFtcblx0XHRcdHtcblx0XHRcdFx0ZmlsZVBhdGg6IFwic3JjL2NvbnRyb2xsZXJzL2hlbGxvLmNvbnRyb2xsZXIudHNcIixcblx0XHRcdFx0Y29udGVudDogbGluZXMuam9pbihcIlxcblwiKSxcblx0XHRcdH0sXG5cdFx0XTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIldFTExfS05PV05fRklMRVMiLCJJbXBvcnRHcm91cCIsIl92YWx1ZXMiLCJfdHlwZXMiLCJhZGQiLCJuYW1lIiwidHlwZU9ubHkiLCJpbmNsdWRlcyIsInB1c2giLCJ0eXBlSWR4IiwiaW5kZXhPZiIsInNwbGljZSIsInJlbmRlciIsImZyb20iLCJ2YWx1ZXMiLCJzb3J0IiwidHlwZXMiLCJtYXAiLCJuIiwiam9pbiIsIkNvbnRyb2xsZXJNZXRob2QiLCJfZXh0cmFEZWNvcmF0b3JzIiwiX2h0dHBEZWNvcmF0b3IiLCJfcGFyYW1zIiwiX2lzQXN5bmMiLCJfYm9keSIsImFkZERlY29yYXRvciIsImRlY29yYXRvciIsImxpbmVzIiwiZCIsImFzeW5jS3ciLCJsaW5lIiwiQ29udHJvbGxlclNvdXJjZUZpbGUiLCJrZXkiLCJDT05UUk9MTEVSX1RTIiwiX2NvcnRleEltcG9ydHMiLCJfZXh0cmFJbXBvcnRHcm91cHMiLCJNYXAiLCJfY2xhc3NEZWNvcmF0b3JzIiwiX2N0b3JQYXJhbXMiLCJfbWV0aG9kcyIsImdldE1ldGhvZCIsIm0iLCJnZXQiLCJFcnJvciIsImFkZENvcnRleEltcG9ydCIsImFkZEltcG9ydCIsImdyb3VwIiwic2V0IiwiYWRkQ29uc3RydWN0b3JQYXJhbSIsInBhcmFtIiwiZmlsZXMiLCJwIiwibWV0aG9kIiwiZmlsZVBhdGgiLCJjb250ZW50Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxnQkFBZ0IsUUFBUSx3QkFBd0I7QUFHekQsaUZBQWlGLEdBQ2pGLE1BQU1DO0lBQ1lDLFVBQW9CLEVBQUUsQ0FBQztJQUN2QkMsU0FBbUIsRUFBRSxDQUFDO0lBRWhDQyxJQUFJQyxJQUFZLEVBQUVDLFdBQVcsS0FBSyxFQUFRO1FBQ2hELElBQUlBLFVBQVU7WUFDYixrREFBa0Q7WUFDbEQsSUFBSSxDQUFDLElBQUksQ0FBQ0osT0FBTyxDQUFDSyxRQUFRLENBQUNGLFNBQVMsQ0FBQyxJQUFJLENBQUNGLE1BQU0sQ0FBQ0ksUUFBUSxDQUFDRixPQUFPO2dCQUNoRSxJQUFJLENBQUNGLE1BQU0sQ0FBQ0ssSUFBSSxDQUFDSDtZQUNsQjtRQUNELE9BQU87WUFDTiw0REFBNEQ7WUFDNUQsTUFBTUksVUFBVSxJQUFJLENBQUNOLE1BQU0sQ0FBQ08sT0FBTyxDQUFDTDtZQUNwQyxJQUFJSSxZQUFZLENBQUMsR0FBRyxJQUFJLENBQUNOLE1BQU0sQ0FBQ1EsTUFBTSxDQUFDRixTQUFTO1lBQ2hELElBQUksQ0FBQyxJQUFJLENBQUNQLE9BQU8sQ0FBQ0ssUUFBUSxDQUFDRixPQUFPLElBQUksQ0FBQ0gsT0FBTyxDQUFDTSxJQUFJLENBQUNIO1FBQ3JEO1FBQ0EsT0FBTyxJQUFJO0lBQ1o7SUFFT08sT0FBT0MsSUFBWSxFQUFVO1FBQ25DLE1BQU1DLFNBQVM7ZUFBSSxJQUFJLENBQUNaLE9BQU87U0FBQyxDQUFDYSxJQUFJO1FBQ3JDLE1BQU1DLFFBQVE7ZUFBSSxJQUFJLENBQUNiLE1BQU07U0FBQyxDQUFDWSxJQUFJLEdBQUdFLEdBQUcsQ0FBQyxDQUFDQyxJQUFNLENBQUMsS0FBSyxFQUFFQSxHQUFHO1FBQzVELE9BQU8sQ0FBQyxTQUFTLEVBQUU7ZUFBSUo7ZUFBV0U7U0FBTSxDQUFDRyxJQUFJLENBQUMsTUFBTSxTQUFTLEVBQUVOLEtBQUssRUFBRSxDQUFDO0lBQ3hFO0FBQ0Q7QUFFQTs7O0NBR0MsR0FDRCxPQUFPLE1BQU1POzs7Ozs7SUFDS0MsbUJBQTZCLEVBQUUsQ0FBQztJQUVqRCxZQUNDLEFBQWdCaEIsSUFBWSxFQUM1QixBQUFpQmlCLGNBQXNCLEVBQ3ZDLEFBQWlCQyxPQUFlLEVBQ2hDLEFBQWlCQyxRQUFpQixFQUNsQyxBQUFpQkMsS0FBZSxDQUMvQjthQUxlcEIsT0FBQUE7YUFDQ2lCLGlCQUFBQTthQUNBQyxVQUFBQTthQUNBQyxXQUFBQTthQUNBQyxRQUFBQTtJQUNmO0lBRUlDLGFBQWFDLFNBQWlCLEVBQVE7UUFDNUMsSUFBSSxDQUFDTixnQkFBZ0IsQ0FBQ2IsSUFBSSxDQUFDbUI7UUFDM0IsT0FBTyxJQUFJO0lBQ1o7SUFFT2YsU0FBbUI7UUFDekIsTUFBTWdCLFFBQWtCLEVBQUU7UUFDMUIsS0FBSyxNQUFNQyxLQUFLLElBQUksQ0FBQ1IsZ0JBQWdCLENBQUU7WUFDdENPLE1BQU1wQixJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUVxQixHQUFHO1FBQ3BCO1FBQ0FELE1BQU1wQixJQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDYyxjQUFjLEVBQUU7UUFDckMsTUFBTVEsVUFBVSxJQUFJLENBQUNOLFFBQVEsR0FBRyxXQUFXO1FBQzNDSSxNQUFNcEIsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFc0IsVUFBVSxJQUFJLENBQUN6QixJQUFJLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQ2tCLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDL0QsS0FBSyxNQUFNUSxRQUFRLElBQUksQ0FBQ04sS0FBSyxDQUFFO1lBQzlCRyxNQUFNcEIsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFdUIsTUFBTTtRQUN6QjtRQUNBSCxNQUFNcEIsSUFBSSxDQUFDO1FBQ1gsT0FBT29CO0lBQ1I7QUFDRDtBQUVBOzs7Ozs7Q0FNQyxHQUNELE9BQU8sTUFBTUk7SUFDSUMsTUFBTWpDLGlCQUFpQmtDLGFBQWEsQ0FBQztJQUVwQ0MsaUJBQWlCLElBQUlsQyxjQUNwQ0csR0FBRyxDQUFDLGNBQ0pBLEdBQUcsQ0FBQyxVQUNKQSxHQUFHLENBQUMsU0FDSkEsR0FBRyxDQUFDLE9BQ0pBLEdBQUcsQ0FBQyxTQUNKQSxHQUFHLENBQUMsUUFDSkEsR0FBRyxDQUFDLE9BQ0pBLEdBQUcsQ0FBQyxTQUFTO0lBRUVnQyxxQkFBcUIsSUFBSUMsTUFBMkI7SUFDcERDLG1CQUE2QixFQUFFLENBQUM7SUFDaENDLGNBQXdCO1FBQUM7S0FBeUMsQ0FBQztJQUVuRUMsV0FBVyxJQUFJSCxJQUE4QjtRQUM3RDtZQUNDO1lBQ0EsSUFBSWpCLGlCQUFpQixVQUFVLFVBQVUsbUNBQW1DLE1BQU07Z0JBQ2pGO2dCQUNBO2FBQ0E7U0FDRDtRQUNEO1lBQ0M7WUFDQSxJQUFJQSxpQkFDSCxVQUNBLGdCQUNBLDJCQUNBLE9BQ0EsMkZBQTJGO1lBQzNGO2dCQUFDO2FBQTBDO1NBRTVDO1FBQ0Q7WUFDQztZQUNBLElBQUlBLGlCQUFpQixVQUFVLGNBQWMsbUJBQW1CLE9BQU87Z0JBQ3RFO2FBQ0E7U0FDRDtRQUNEO1lBQ0M7WUFDQSxJQUFJQSxpQkFDSCxVQUNBLGdCQUNBLDRDQUNBLE9BQ0E7Z0JBQUM7YUFBd0M7U0FFMUM7UUFDRDtZQUNDO1lBQ0EsSUFBSUEsaUJBQWlCLFVBQVUsbUJBQW1CLDJCQUEyQixPQUFPO2dCQUNuRjthQUNBO1NBQ0Q7S0FDRCxFQUFFO0lBRUgsd0RBQXdELEdBQ3hELEFBQU9xQixVQUFVcEMsSUFBWSxFQUFvQjtRQUNoRCxNQUFNcUMsSUFBSSxJQUFJLENBQUNGLFFBQVEsQ0FBQ0csR0FBRyxDQUFDdEM7UUFDNUIsSUFBSXFDLEtBQUssTUFBTSxNQUFNLElBQUlFLE1BQU0sQ0FBQyxXQUFXLEVBQUV2QyxLQUFLLHlCQUF5QixDQUFDO1FBQzVFLE9BQU9xQztJQUNSO0lBRUEscURBQXFELEdBQ3JELEFBQU9oQixhQUFhQyxTQUFpQixFQUFRO1FBQzVDLElBQUksQ0FBQ1csZ0JBQWdCLENBQUM5QixJQUFJLENBQUNtQjtRQUMzQixPQUFPLElBQUk7SUFDWjtJQUVBLGdEQUFnRCxHQUNoRCxBQUFPa0IsZ0JBQWdCeEMsSUFBWSxFQUFFQyxXQUFXLEtBQUssRUFBUTtRQUM1RCxJQUFJLENBQUM2QixjQUFjLENBQUMvQixHQUFHLENBQUNDLE1BQU1DO1FBQzlCLE9BQU8sSUFBSTtJQUNaO0lBRUEsOENBQThDLEdBQzlDLEFBQU93QyxVQUFVekMsSUFBWSxFQUFFUSxJQUFZLEVBQUVQLFdBQVcsS0FBSyxFQUFRO1FBQ3BFLE1BQU15QyxRQUFRLElBQUksQ0FBQ1gsa0JBQWtCLENBQUNPLEdBQUcsQ0FBQzlCLFNBQVMsSUFBSVo7UUFDdkQ4QyxNQUFNM0MsR0FBRyxDQUFDQyxNQUFNQztRQUNoQixJQUFJLENBQUM4QixrQkFBa0IsQ0FBQ1ksR0FBRyxDQUFDbkMsTUFBTWtDO1FBQ2xDLE9BQU8sSUFBSTtJQUNaO0lBRUEsK0RBQStELEdBQy9ELEFBQU9FLG9CQUFvQkMsS0FBYSxFQUFRO1FBQy9DLElBQUksQ0FBQ1gsV0FBVyxDQUFDL0IsSUFBSSxDQUFDMEM7UUFDdEIsT0FBTyxJQUFJO0lBQ1o7SUFFT0MsUUFBc0I7UUFDNUIsTUFBTXZCLFFBQWtCO1lBQ3ZCLElBQUksQ0FBQ08sY0FBYyxDQUFDdkIsTUFBTSxDQUFDO1lBQzNCO1NBQ0E7UUFFRCxLQUFLLE1BQU0sQ0FBQ0MsTUFBTWtDLE1BQU0sSUFBSSxJQUFJLENBQUNYLGtCQUFrQixDQUFFO1lBQ3BEUixNQUFNcEIsSUFBSSxDQUFDdUMsTUFBTW5DLE1BQU0sQ0FBQ0M7UUFDekI7UUFFQWUsTUFBTXBCLElBQUksQ0FDVCxJQUNBLHFCQUNBLCtCQUNBLDhCQUNBLEtBQ0E7UUFHRCxLQUFLLE1BQU1xQixLQUFLLElBQUksQ0FBQ1MsZ0JBQWdCLENBQUU7WUFDdENWLE1BQU1wQixJQUFJLENBQUNxQjtRQUNaO1FBQ0FELE1BQU1wQixJQUFJLENBQUMscUNBQXFDLGtDQUFrQztRQUVsRm9CLE1BQU1wQixJQUFJLENBQUM7UUFDWCxLQUFLLE1BQU00QyxLQUFLLElBQUksQ0FBQ2IsV0FBVyxDQUFFO1lBQ2pDWCxNQUFNcEIsSUFBSSxDQUFDLENBQUMsSUFBSSxFQUFFNEMsRUFBRSxDQUFDLENBQUM7UUFDdkI7UUFDQXhCLE1BQU1wQixJQUFJLENBQUM7UUFDWG9CLE1BQU1wQixJQUFJLENBQUM7UUFFWCxLQUFLLE1BQU02QyxVQUFVLElBQUksQ0FBQ2IsUUFBUSxDQUFDMUIsTUFBTSxHQUFJO1lBQzVDYyxNQUFNcEIsSUFBSSxJQUFJNkMsT0FBT3pDLE1BQU0sSUFBSTtRQUNoQztRQUVBZ0IsTUFBTXBCLElBQUksQ0FBQyxLQUFLO1FBRWhCLE9BQU87WUFDTjtnQkFDQzhDLFVBQVU7Z0JBQ1ZDLFNBQVMzQixNQUFNVCxJQUFJLENBQUM7WUFDckI7U0FDQTtJQUNGO0FBQ0QifQ==
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { WELL_KNOWN_FILES } from "../../models/const.js";
|
|
2
|
+
/** Tracks named imports from a single module path, split into values and types. */ class ImportGroup {
|
|
3
|
+
_values = [];
|
|
4
|
+
_types = [];
|
|
5
|
+
add(name, typeOnly = false) {
|
|
6
|
+
if (typeOnly) {
|
|
7
|
+
// Value import already present — value wins, skip
|
|
8
|
+
if (!this._values.includes(name) && !this._types.includes(name)) {
|
|
9
|
+
this._types.push(name);
|
|
10
|
+
}
|
|
11
|
+
} else {
|
|
12
|
+
// Promote: remove from types if it was previously type-only
|
|
13
|
+
const typeIdx = this._types.indexOf(name);
|
|
14
|
+
if (typeIdx !== -1) this._types.splice(typeIdx, 1);
|
|
15
|
+
if (!this._values.includes(name)) this._values.push(name);
|
|
16
|
+
}
|
|
17
|
+
return this;
|
|
18
|
+
}
|
|
19
|
+
render(from) {
|
|
20
|
+
const values = [
|
|
21
|
+
...this._values
|
|
22
|
+
].sort();
|
|
23
|
+
const types = [
|
|
24
|
+
...this._types
|
|
25
|
+
].sort().map((n)=>`type ${n}`);
|
|
26
|
+
return `import { ${[
|
|
27
|
+
...values,
|
|
28
|
+
...types
|
|
29
|
+
].join(", ")} } from "${from}";`;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Model for `projects/api/src/main.ts`.
|
|
34
|
+
*
|
|
35
|
+
* Starts with the minimal HTTP + YAML config setup. Features mutate the model
|
|
36
|
+
* by calling addSideEffectImport / addImport / addBuilderCall / addEntity /
|
|
37
|
+
* addRepository. files() renders whatever has been accumulated.
|
|
38
|
+
*/ export class MainSourceFile {
|
|
39
|
+
appName;
|
|
40
|
+
key = WELL_KNOWN_FILES.MAIN_TS;
|
|
41
|
+
_sideEffectImports = [];
|
|
42
|
+
_extraImports = new Map();
|
|
43
|
+
_builderCalls = [];
|
|
44
|
+
_entities = [];
|
|
45
|
+
_repositories = [];
|
|
46
|
+
constructor(appName){
|
|
47
|
+
this.appName = appName;
|
|
48
|
+
}
|
|
49
|
+
/** Adds a bare side-effect import, e.g. `@decohere/cortex/auth`. */ addSideEffectImport(path) {
|
|
50
|
+
if (!this._sideEffectImports.includes(path)) this._sideEffectImports.push(path);
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
/** Adds a named import, e.g. `import { Foo } from "bar"`. */ addImport(name, from, typeOnly = false) {
|
|
54
|
+
const group = this._extraImports.get(from) ?? new ImportGroup();
|
|
55
|
+
group.add(name, typeOnly);
|
|
56
|
+
this._extraImports.set(from, group);
|
|
57
|
+
return this;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Adds a builder call inserted after `.withConfiguration()` and before
|
|
61
|
+
* `.withServices()`. Pass the call without leading dot, e.g. `.withAuth()`.
|
|
62
|
+
*/ addBuilderCall(call) {
|
|
63
|
+
this._builderCalls.push(call);
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
/** Adds a TypeORM entity — import and entry in `withTypeOrm({ entities })`. */ addEntity(entity) {
|
|
67
|
+
this._entities.push(entity);
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
/** Adds a TypeORM repository — import and entry in `withTypeOrm({ repositories })`. */ addRepository(repo) {
|
|
71
|
+
this._repositories.push(repo);
|
|
72
|
+
return this;
|
|
73
|
+
}
|
|
74
|
+
files() {
|
|
75
|
+
const imports = [
|
|
76
|
+
'import "@decohere/scribe-pino";',
|
|
77
|
+
'import "@decohere/cortex/http";'
|
|
78
|
+
];
|
|
79
|
+
for (const path of this._sideEffectImports){
|
|
80
|
+
imports.push(`import "${path}";`);
|
|
81
|
+
}
|
|
82
|
+
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";');
|
|
83
|
+
for (const e of this._entities){
|
|
84
|
+
imports.push(`import { ${e.className} } from "${e.importPath}";`);
|
|
85
|
+
}
|
|
86
|
+
for (const r of this._repositories){
|
|
87
|
+
imports.push(`import { ${r.className} } from "${r.importPath}";`);
|
|
88
|
+
}
|
|
89
|
+
for (const [from, group] of this._extraImports){
|
|
90
|
+
imports.push(group.render(from));
|
|
91
|
+
}
|
|
92
|
+
imports.push('import { HelloController } from "./controllers/hello.controller.js";');
|
|
93
|
+
const builderCalls = [
|
|
94
|
+
`\t.withHttpProvider(FastifyProvider)`,
|
|
95
|
+
`\t.withConfiguration(YamlDataSource)`,
|
|
96
|
+
...this._builderCalls.map((c)=>`\t${c}`),
|
|
97
|
+
`\t.withServices((cb) => { cb.registerSingleton(SampleService); })`
|
|
98
|
+
];
|
|
99
|
+
if (this._entities.length > 0) {
|
|
100
|
+
const entities = this._entities.map((e)=>e.className).join(", ");
|
|
101
|
+
const repos = this._repositories.map((r)=>r.className).join(", ");
|
|
102
|
+
builderCalls.push(`\t.withTypeOrm({ entities: [${entities}], repositories: [${repos}] })`);
|
|
103
|
+
}
|
|
104
|
+
builderCalls.push(`\t.withControllers(HelloController)`);
|
|
105
|
+
const content = [
|
|
106
|
+
...imports,
|
|
107
|
+
"",
|
|
108
|
+
"scribe.extend.withPinoPretty();",
|
|
109
|
+
"",
|
|
110
|
+
`const app = await Builder.create({ applicationName: "${this.appName}" })`,
|
|
111
|
+
...builderCalls,
|
|
112
|
+
`\t.build();`,
|
|
113
|
+
"",
|
|
114
|
+
"await app.start({ port: 3000 });",
|
|
115
|
+
"",
|
|
116
|
+
"export default app;",
|
|
117
|
+
""
|
|
118
|
+
].join("\n");
|
|
119
|
+
return [
|
|
120
|
+
{
|
|
121
|
+
filePath: "src/main.ts",
|
|
122
|
+
content
|
|
123
|
+
}
|
|
124
|
+
];
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9tYWluLXNvdXJjZS1maWxlLm1vZGVsLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFdFTExfS05PV05fRklMRVMgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEtleWVkTW9kZWwsIFNvdXJjZUZpbGUgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFR5cGVPcm1JbXBvcnQgPSB7IGNsYXNzTmFtZTogc3RyaW5nOyBpbXBvcnRQYXRoOiBzdHJpbmcgfTtcblxuLyoqIFRyYWNrcyBuYW1lZCBpbXBvcnRzIGZyb20gYSBzaW5nbGUgbW9kdWxlIHBhdGgsIHNwbGl0IGludG8gdmFsdWVzIGFuZCB0eXBlcy4gKi9cbmNsYXNzIEltcG9ydEdyb3VwIHtcblx0cHJpdmF0ZSByZWFkb25seSBfdmFsdWVzOiBzdHJpbmdbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF90eXBlczogc3RyaW5nW10gPSBbXTtcblxuXHRwdWJsaWMgYWRkKG5hbWU6IHN0cmluZywgdHlwZU9ubHkgPSBmYWxzZSk6IHRoaXMge1xuXHRcdGlmICh0eXBlT25seSkge1xuXHRcdFx0Ly8gVmFsdWUgaW1wb3J0IGFscmVhZHkgcHJlc2VudCDigJQgdmFsdWUgd2lucywgc2tpcFxuXHRcdFx0aWYgKCF0aGlzLl92YWx1ZXMuaW5jbHVkZXMobmFtZSkgJiYgIXRoaXMuX3R5cGVzLmluY2x1ZGVzKG5hbWUpKSB7XG5cdFx0XHRcdHRoaXMuX3R5cGVzLnB1c2gobmFtZSk7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIHtcblx0XHRcdC8vIFByb21vdGU6IHJlbW92ZSBmcm9tIHR5cGVzIGlmIGl0IHdhcyBwcmV2aW91c2x5IHR5cGUtb25seVxuXHRcdFx0Y29uc3QgdHlwZUlkeCA9IHRoaXMuX3R5cGVzLmluZGV4T2YobmFtZSk7XG5cdFx0XHRpZiAodHlwZUlkeCAhPT0gLTEpIHRoaXMuX3R5cGVzLnNwbGljZSh0eXBlSWR4LCAxKTtcblx0XHRcdGlmICghdGhpcy5fdmFsdWVzLmluY2x1ZGVzKG5hbWUpKSB0aGlzLl92YWx1ZXMucHVzaChuYW1lKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgcmVuZGVyKGZyb206IHN0cmluZyk6IHN0cmluZyB7XG5cdFx0Y29uc3QgdmFsdWVzID0gWy4uLnRoaXMuX3ZhbHVlc10uc29ydCgpO1xuXHRcdGNvbnN0IHR5cGVzID0gWy4uLnRoaXMuX3R5cGVzXS5zb3J0KCkubWFwKChuKSA9PiBgdHlwZSAke259YCk7XG5cdFx0cmV0dXJuIGBpbXBvcnQgeyAke1suLi52YWx1ZXMsIC4uLnR5cGVzXS5qb2luKFwiLCBcIil9IH0gZnJvbSBcIiR7ZnJvbX1cIjtgO1xuXHR9XG59XG5cbi8qKlxuICogTW9kZWwgZm9yIGBwcm9qZWN0cy9hcGkvc3JjL21haW4udHNgLlxuICpcbiAqIFN0YXJ0cyB3aXRoIHRoZSBtaW5pbWFsIEhUVFAgKyBZQU1MIGNvbmZpZyBzZXR1cC4gRmVhdHVyZXMgbXV0YXRlIHRoZSBtb2RlbFxuICogYnkgY2FsbGluZyBhZGRTaWRlRWZmZWN0SW1wb3J0IC8gYWRkSW1wb3J0IC8gYWRkQnVpbGRlckNhbGwgLyBhZGRFbnRpdHkgL1xuICogYWRkUmVwb3NpdG9yeS4gZmlsZXMoKSByZW5kZXJzIHdoYXRldmVyIGhhcyBiZWVuIGFjY3VtdWxhdGVkLlxuICovXG5leHBvcnQgY2xhc3MgTWFpblNvdXJjZUZpbGUgaW1wbGVtZW50cyBLZXllZE1vZGVsIHtcblx0cHVibGljIHJlYWRvbmx5IGtleSA9IFdFTExfS05PV05fRklMRVMuTUFJTl9UUztcblxuXHRwcml2YXRlIHJlYWRvbmx5IF9zaWRlRWZmZWN0SW1wb3J0czogc3RyaW5nW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBfZXh0cmFJbXBvcnRzID0gbmV3IE1hcDxzdHJpbmcsIEltcG9ydEdyb3VwPigpO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9idWlsZGVyQ2FsbHM6IHN0cmluZ1tdID0gW107XG5cdHByaXZhdGUgcmVhZG9ubHkgX2VudGl0aWVzOiBUeXBlT3JtSW1wb3J0W10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBfcmVwb3NpdG9yaWVzOiBUeXBlT3JtSW1wb3J0W10gPSBbXTtcblxuXHRwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBhcHBOYW1lOiBzdHJpbmcpIHt9XG5cblx0LyoqIEFkZHMgYSBiYXJlIHNpZGUtZWZmZWN0IGltcG9ydCwgZS5nLiBgQGRlY29oZXJlL2NvcnRleC9hdXRoYC4gKi9cblx0cHVibGljIGFkZFNpZGVFZmZlY3RJbXBvcnQocGF0aDogc3RyaW5nKTogdGhpcyB7XG5cdFx0aWYgKCF0aGlzLl9zaWRlRWZmZWN0SW1wb3J0cy5pbmNsdWRlcyhwYXRoKSkgdGhpcy5fc2lkZUVmZmVjdEltcG9ydHMucHVzaChwYXRoKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKiBBZGRzIGEgbmFtZWQgaW1wb3J0LCBlLmcuIGBpbXBvcnQgeyBGb28gfSBmcm9tIFwiYmFyXCJgLiAqL1xuXHRwdWJsaWMgYWRkSW1wb3J0KG5hbWU6IHN0cmluZywgZnJvbTogc3RyaW5nLCB0eXBlT25seSA9IGZhbHNlKTogdGhpcyB7XG5cdFx0Y29uc3QgZ3JvdXAgPSB0aGlzLl9leHRyYUltcG9ydHMuZ2V0KGZyb20pID8/IG5ldyBJbXBvcnRHcm91cCgpO1xuXHRcdGdyb3VwLmFkZChuYW1lLCB0eXBlT25seSk7XG5cdFx0dGhpcy5fZXh0cmFJbXBvcnRzLnNldChmcm9tLCBncm91cCk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvKipcblx0ICogQWRkcyBhIGJ1aWxkZXIgY2FsbCBpbnNlcnRlZCBhZnRlciBgLndpdGhDb25maWd1cmF0aW9uKClgIGFuZCBiZWZvcmVcblx0ICogYC53aXRoU2VydmljZXMoKWAuIFBhc3MgdGhlIGNhbGwgd2l0aG91dCBsZWFkaW5nIGRvdCwgZS5nLiBgLndpdGhBdXRoKClgLlxuXHQgKi9cblx0cHVibGljIGFkZEJ1aWxkZXJDYWxsKGNhbGw6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX2J1aWxkZXJDYWxscy5wdXNoKGNhbGwpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqIEFkZHMgYSBUeXBlT1JNIGVudGl0eSDigJQgaW1wb3J0IGFuZCBlbnRyeSBpbiBgd2l0aFR5cGVPcm0oeyBlbnRpdGllcyB9KWAuICovXG5cdHB1YmxpYyBhZGRFbnRpdHkoZW50aXR5OiBUeXBlT3JtSW1wb3J0KTogdGhpcyB7XG5cdFx0dGhpcy5fZW50aXRpZXMucHVzaChlbnRpdHkpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqIEFkZHMgYSBUeXBlT1JNIHJlcG9zaXRvcnkg4oCUIGltcG9ydCBhbmQgZW50cnkgaW4gYHdpdGhUeXBlT3JtKHsgcmVwb3NpdG9yaWVzIH0pYC4gKi9cblx0cHVibGljIGFkZFJlcG9zaXRvcnkocmVwbzogVHlwZU9ybUltcG9ydCk6IHRoaXMge1xuXHRcdHRoaXMuX3JlcG9zaXRvcmllcy5wdXNoKHJlcG8pO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGZpbGVzKCk6IFNvdXJjZUZpbGVbXSB7XG5cdFx0Y29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXG5cdFx0XHQnaW1wb3J0IFwiQGRlY29oZXJlL3NjcmliZS1waW5vXCI7Jyxcblx0XHRcdCdpbXBvcnQgXCJAZGVjb2hlcmUvY29ydGV4L2h0dHBcIjsnLFxuXHRcdF07XG5cblx0XHRmb3IgKGNvbnN0IHBhdGggb2YgdGhpcy5fc2lkZUVmZmVjdEltcG9ydHMpIHtcblx0XHRcdGltcG9ydHMucHVzaChgaW1wb3J0IFwiJHtwYXRofVwiO2ApO1xuXHRcdH1cblxuXHRcdGltcG9ydHMucHVzaChcblx0XHRcdCdpbXBvcnQgXCJAZGVjb2hlcmUvcHJvdG9jb2xcIjsnLFxuXHRcdFx0J2ltcG9ydCB7IFlhbWxEYXRhU291cmNlIH0gZnJvbSBcIkBkZWNvaGVyZS9wcm90b2NvbFwiOycsXG5cdFx0XHQnaW1wb3J0IHsgQnVpbGRlciB9IGZyb20gXCJAZGVjb2hlcmUvY29ydGV4XCI7Jyxcblx0XHRcdCdpbXBvcnQgeyBGYXN0aWZ5UHJvdmlkZXIgfSBmcm9tIFwiQGRlY29oZXJlL2NvcnRleC9wcm92aWRlcnNcIjsnLFxuXHRcdFx0J2ltcG9ydCB7IHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7Jyxcblx0XHRcdCdpbXBvcnQgeyBTYW1wbGVTZXJ2aWNlIH0gZnJvbSBcIi4vc2VydmljZXMvc2FtcGxlLnNlcnZpY2UuanNcIjsnLFxuXHRcdCk7XG5cblx0XHRmb3IgKGNvbnN0IGUgb2YgdGhpcy5fZW50aXRpZXMpIHtcblx0XHRcdGltcG9ydHMucHVzaChgaW1wb3J0IHsgJHtlLmNsYXNzTmFtZX0gfSBmcm9tIFwiJHtlLmltcG9ydFBhdGh9XCI7YCk7XG5cdFx0fVxuXG5cdFx0Zm9yIChjb25zdCByIG9mIHRoaXMuX3JlcG9zaXRvcmllcykge1xuXHRcdFx0aW1wb3J0cy5wdXNoKGBpbXBvcnQgeyAke3IuY2xhc3NOYW1lfSB9IGZyb20gXCIke3IuaW1wb3J0UGF0aH1cIjtgKTtcblx0XHR9XG5cblx0XHRmb3IgKGNvbnN0IFtmcm9tLCBncm91cF0gb2YgdGhpcy5fZXh0cmFJbXBvcnRzKSB7XG5cdFx0XHRpbXBvcnRzLnB1c2goZ3JvdXAucmVuZGVyKGZyb20pKTtcblx0XHR9XG5cblx0XHRpbXBvcnRzLnB1c2goJ2ltcG9ydCB7IEhlbGxvQ29udHJvbGxlciB9IGZyb20gXCIuL2NvbnRyb2xsZXJzL2hlbGxvLmNvbnRyb2xsZXIuanNcIjsnKTtcblxuXHRcdGNvbnN0IGJ1aWxkZXJDYWxsczogc3RyaW5nW10gPSBbXG5cdFx0XHRgXFx0LndpdGhIdHRwUHJvdmlkZXIoRmFzdGlmeVByb3ZpZGVyKWAsXG5cdFx0XHRgXFx0LndpdGhDb25maWd1cmF0aW9uKFlhbWxEYXRhU291cmNlKWAsXG5cdFx0XHQuLi50aGlzLl9idWlsZGVyQ2FsbHMubWFwKChjKSA9PiBgXFx0JHtjfWApLFxuXHRcdFx0YFxcdC53aXRoU2VydmljZXMoKGNiKSA9PiB7IGNiLnJlZ2lzdGVyU2luZ2xldG9uKFNhbXBsZVNlcnZpY2UpOyB9KWAsXG5cdFx0XTtcblxuXHRcdGlmICh0aGlzLl9lbnRpdGllcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBlbnRpdGllcyA9IHRoaXMuX2VudGl0aWVzLm1hcCgoZSkgPT4gZS5jbGFzc05hbWUpLmpvaW4oXCIsIFwiKTtcblx0XHRcdGNvbnN0IHJlcG9zID0gdGhpcy5fcmVwb3NpdG9yaWVzLm1hcCgocikgPT4gci5jbGFzc05hbWUpLmpvaW4oXCIsIFwiKTtcblx0XHRcdGJ1aWxkZXJDYWxscy5wdXNoKFxuXHRcdFx0XHRgXFx0LndpdGhUeXBlT3JtKHsgZW50aXRpZXM6IFske2VudGl0aWVzfV0sIHJlcG9zaXRvcmllczogWyR7cmVwb3N9XSB9KWAsXG5cdFx0XHQpO1xuXHRcdH1cblxuXHRcdGJ1aWxkZXJDYWxscy5wdXNoKGBcXHQud2l0aENvbnRyb2xsZXJzKEhlbGxvQ29udHJvbGxlcilgKTtcblxuXHRcdGNvbnN0IGNvbnRlbnQgPSBbXG5cdFx0XHQuLi5pbXBvcnRzLFxuXHRcdFx0XCJcIixcblx0XHRcdFwic2NyaWJlLmV4dGVuZC53aXRoUGlub1ByZXR0eSgpO1wiLFxuXHRcdFx0XCJcIixcblx0XHRcdGBjb25zdCBhcHAgPSBhd2FpdCBCdWlsZGVyLmNyZWF0ZSh7IGFwcGxpY2F0aW9uTmFtZTogXCIke3RoaXMuYXBwTmFtZX1cIiB9KWAsXG5cdFx0XHQuLi5idWlsZGVyQ2FsbHMsXG5cdFx0XHRgXFx0LmJ1aWxkKCk7YCxcblx0XHRcdFwiXCIsXG5cdFx0XHRcImF3YWl0IGFwcC5zdGFydCh7IHBvcnQ6IDMwMDAgfSk7XCIsXG5cdFx0XHRcIlwiLFxuXHRcdFx0XCJleHBvcnQgZGVmYXVsdCBhcHA7XCIsXG5cdFx0XHRcIlwiLFxuXHRcdF0uam9pbihcIlxcblwiKTtcblxuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcInNyYy9tYWluLnRzXCIsXG5cdFx0XHRcdGNvbnRlbnQsXG5cdFx0XHR9LFxuXHRcdF07XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJXRUxMX0tOT1dOX0ZJTEVTIiwiSW1wb3J0R3JvdXAiLCJfdmFsdWVzIiwiX3R5cGVzIiwiYWRkIiwibmFtZSIsInR5cGVPbmx5IiwiaW5jbHVkZXMiLCJwdXNoIiwidHlwZUlkeCIsImluZGV4T2YiLCJzcGxpY2UiLCJyZW5kZXIiLCJmcm9tIiwidmFsdWVzIiwic29ydCIsInR5cGVzIiwibWFwIiwibiIsImpvaW4iLCJNYWluU291cmNlRmlsZSIsImtleSIsIk1BSU5fVFMiLCJfc2lkZUVmZmVjdEltcG9ydHMiLCJfZXh0cmFJbXBvcnRzIiwiTWFwIiwiX2J1aWxkZXJDYWxscyIsIl9lbnRpdGllcyIsIl9yZXBvc2l0b3JpZXMiLCJhcHBOYW1lIiwiYWRkU2lkZUVmZmVjdEltcG9ydCIsInBhdGgiLCJhZGRJbXBvcnQiLCJncm91cCIsImdldCIsInNldCIsImFkZEJ1aWxkZXJDYWxsIiwiY2FsbCIsImFkZEVudGl0eSIsImVudGl0eSIsImFkZFJlcG9zaXRvcnkiLCJyZXBvIiwiZmlsZXMiLCJpbXBvcnRzIiwiZSIsImNsYXNzTmFtZSIsImltcG9ydFBhdGgiLCJyIiwiYnVpbGRlckNhbGxzIiwiYyIsImxlbmd0aCIsImVudGl0aWVzIiwicmVwb3MiLCJjb250ZW50IiwiZmlsZVBhdGgiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGdCQUFnQixRQUFRLHdCQUF3QjtBQUt6RCxpRkFBaUYsR0FDakYsTUFBTUM7SUFDWUMsVUFBb0IsRUFBRSxDQUFDO0lBQ3ZCQyxTQUFtQixFQUFFLENBQUM7SUFFaENDLElBQUlDLElBQVksRUFBRUMsV0FBVyxLQUFLLEVBQVE7UUFDaEQsSUFBSUEsVUFBVTtZQUNi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
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
const SAMPLE_CONFIG_CONTENT = `export class SampleConfig {\n\tpublic greeting: string = "";\n}\n`;
|
|
2
|
+
const SAMPLE_SERVICE_CONTENT = [
|
|
3
|
+
`import { inject, injectable } from "@decohere/crucible/decorators";`,
|
|
4
|
+
`import { ConfigurationServiceToken } from "@decohere/nexus/configuration";`,
|
|
5
|
+
`import type { IConfigurationService } from "@decohere/nexus/configuration";`,
|
|
6
|
+
`import { SampleConfig } from "../sample.config.js";`,
|
|
7
|
+
``,
|
|
8
|
+
`@injectable()`,
|
|
9
|
+
`export class SampleService {`,
|
|
10
|
+
`\tpublic constructor(`,
|
|
11
|
+
`\t\t@inject(ConfigurationServiceToken) private readonly config: IConfigurationService,`,
|
|
12
|
+
`\t) {}`,
|
|
13
|
+
``,
|
|
14
|
+
`\tpublic async getGreeting(): Promise<string> {`,
|
|
15
|
+
`\t\tconst config = await this.config.get(SampleConfig);`,
|
|
16
|
+
`\t\treturn config.greeting;`,
|
|
17
|
+
`\t}`,
|
|
18
|
+
`}`,
|
|
19
|
+
``
|
|
20
|
+
].join("\n");
|
|
21
|
+
export class SampleConfigModel {
|
|
22
|
+
files() {
|
|
23
|
+
return [
|
|
24
|
+
{
|
|
25
|
+
filePath: "src/sample.config.ts",
|
|
26
|
+
content: SAMPLE_CONFIG_CONTENT
|
|
27
|
+
}
|
|
28
|
+
];
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
export class SampleServiceModel {
|
|
32
|
+
files() {
|
|
33
|
+
return [
|
|
34
|
+
{
|
|
35
|
+
filePath: "src/services/sample.service.ts",
|
|
36
|
+
content: SAMPLE_SERVICE_CONTENT
|
|
37
|
+
}
|
|
38
|
+
];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvd2ViYXBpL21vZGVscy9zYW1wbGUtZmlsZXMubW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTb3VyY2VGaWxlLCBTb3VyY2VGaWxlUHJvdmlkZXIgfSBmcm9tIFwiLi4vLi4vbW9kZWxzL3NvdXJjZS1maWxlLmpzXCI7XG5cbmNvbnN0IFNBTVBMRV9DT05GSUdfQ09OVEVOVCA9IGBleHBvcnQgY2xhc3MgU2FtcGxlQ29uZmlnIHtcXG5cXHRwdWJsaWMgZ3JlZXRpbmc6IHN0cmluZyA9IFwiXCI7XFxufVxcbmA7XG5cbmNvbnN0IFNBTVBMRV9TRVJWSUNFX0NPTlRFTlQgPSBbXG5cdGBpbXBvcnQgeyBpbmplY3QsIGluamVjdGFibGUgfSBmcm9tIFwiQGRlY29oZXJlL2NydWNpYmxlL2RlY29yYXRvcnNcIjtgLFxuXHRgaW1wb3J0IHsgQ29uZmlndXJhdGlvblNlcnZpY2VUb2tlbiB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY29uZmlndXJhdGlvblwiO2AsXG5cdGBpbXBvcnQgdHlwZSB7IElDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY29uZmlndXJhdGlvblwiO2AsXG5cdGBpbXBvcnQgeyBTYW1wbGVDb25maWcgfSBmcm9tIFwiLi4vc2FtcGxlLmNvbmZpZy5qc1wiO2AsXG5cdGBgLFxuXHRgQGluamVjdGFibGUoKWAsXG5cdGBleHBvcnQgY2xhc3MgU2FtcGxlU2VydmljZSB7YCxcblx0YFxcdHB1YmxpYyBjb25zdHJ1Y3RvcihgLFxuXHRgXFx0XFx0QGluamVjdChDb25maWd1cmF0aW9uU2VydmljZVRva2VuKSBwcml2YXRlIHJlYWRvbmx5IGNvbmZpZzogSUNvbmZpZ3VyYXRpb25TZXJ2aWNlLGAsXG5cdGBcXHQpIHt9YCxcblx0YGAsXG5cdGBcXHRwdWJsaWMgYXN5bmMgZ2V0R3JlZXRpbmcoKTogUHJvbWlzZTxzdHJpbmc+IHtgLFxuXHRgXFx0XFx0Y29uc3QgY29uZmlnID0gYXdhaXQgdGhpcy5jb25maWcuZ2V0KFNhbXBsZUNvbmZpZyk7YCxcblx0YFxcdFxcdHJldHVybiBjb25maWcuZ3JlZXRpbmc7YCxcblx0YFxcdH1gLFxuXHRgfWAsXG5cdGBgLFxuXS5qb2luKFwiXFxuXCIpO1xuXG5leHBvcnQgY2xhc3MgU2FtcGxlQ29uZmlnTW9kZWwgaW1wbGVtZW50cyBTb3VyY2VGaWxlUHJvdmlkZXIge1xuXHRwdWJsaWMgZmlsZXMoKTogU291cmNlRmlsZVtdIHtcblx0XHRyZXR1cm4gW1xuXHRcdFx0e1xuXHRcdFx0XHRmaWxlUGF0aDogXCJzcmMvc2FtcGxlLmNvbmZpZy50c1wiLFxuXHRcdFx0XHRjb250ZW50OiBTQU1QTEVfQ09ORklHX0NPTlRFTlQsXG5cdFx0XHR9LFxuXHRcdF07XG5cdH1cbn1cblxuZXhwb3J0IGNsYXNzIFNhbXBsZVNlcnZpY2VNb2RlbCBpbXBsZW1lbnRzIFNvdXJjZUZpbGVQcm92aWRlciB7XG5cdHB1YmxpYyBmaWxlcygpOiBTb3VyY2VGaWxlW10ge1xuXHRcdHJldHVybiBbXG5cdFx0XHR7XG5cdFx0XHRcdGZpbGVQYXRoOiBcInNyYy9zZXJ2aWNlcy9zYW1wbGUuc2VydmljZS50c1wiLFxuXHRcdFx0XHRjb250ZW50OiBTQU1QTEVfU0VSVklDRV9DT05URU5ULFxuXHRcdFx0fSxcblx0XHRdO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiU0FNUExFX0NPTkZJR19DT05URU5UIiwiU0FNUExFX1NFUlZJQ0VfQ09OVEVOVCIsImpvaW4iLCJTYW1wbGVDb25maWdNb2RlbCIsImZpbGVzIiwiZmlsZVBhdGgiLCJjb250ZW50IiwiU2FtcGxlU2VydmljZU1vZGVsIl0sIm1hcHBpbmdzIjoiQUFFQSxNQUFNQSx3QkFBd0IsQ0FBQyxpRUFBaUUsQ0FBQztBQUVqRyxNQUFNQyx5QkFBeUI7SUFDOUIsQ0FBQyxtRUFBbUUsQ0FBQztJQUNyRSxDQUFDLDBFQUEwRSxDQUFDO0lBQzVFLENBQUMsMkVBQTJFLENBQUM7SUFDN0UsQ0FBQyxtREFBbUQsQ0FBQztJQUNyRCxFQUFFO0lBQ0YsQ0FBQyxhQUFhLENBQUM7SUFDZixDQUFDLDRCQUE0QixDQUFDO0lBQzlCLENBQUMscUJBQXFCLENBQUM7SUFDdkIsQ0FBQyxzRkFBc0YsQ0FBQztJQUN4RixDQUFDLE1BQU0sQ0FBQztJQUNSLEVBQUU7SUFDRixDQUFDLCtDQUErQyxDQUFDO0lBQ2pELENBQUMsdURBQXVELENBQUM7SUFDekQsQ0FBQywyQkFBMkIsQ0FBQztJQUM3QixDQUFDLEdBQUcsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ0gsRUFBRTtDQUNGLENBQUNDLElBQUksQ0FBQztBQUVQLE9BQU8sTUFBTUM7SUFDTEMsUUFBc0I7UUFDNUIsT0FBTztZQUNOO2dCQUNDQyxVQUFVO2dCQUNWQyxTQUFTTjtZQUNWO1NBQ0E7SUFDRjtBQUNEO0FBRUEsT0FBTyxNQUFNTztJQUNMSCxRQUFzQjtRQUM1QixPQUFPO1lBQ047Z0JBQ0NDLFVBQVU7Z0JBQ1ZDLFNBQVNMO1lBQ1Y7U0FDQTtJQUNGO0FBQ0QifQ==
|
package/es6/v1/cli.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { resolve } from "node:path";
|
|
3
|
+
import { Command } from "commander";
|
|
4
|
+
import { scaffold } from "./scaffold.js";
|
|
5
|
+
const program = new Command();
|
|
6
|
+
program.name("decohere").description("Scaffold a new Decohere project").argument("[directory]", "Target directory (default: current directory)", ".").option("-y, --yes", "Skip confirmation prompts").option("-t, --template <template>", "Project template: api (default) or cli").option("-d, --database <provider>", "Database provider to include (api only): typeorm").option("-i, --idp <provider>", "Identity provider to configure (api only): auth0").option("-p, --postman", "Configure a Postman workspace, collection, and environment").action(async (directory, opts)=>{
|
|
7
|
+
await scaffold(resolve(directory), opts);
|
|
8
|
+
});
|
|
9
|
+
program.parse();
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS92MS9jbGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuaW1wb3J0IHsgcmVzb2x2ZSB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IENvbW1hbmQgfSBmcm9tIFwiY29tbWFuZGVyXCI7XG5pbXBvcnQgeyBzY2FmZm9sZCB9IGZyb20gXCIuL3NjYWZmb2xkLmpzXCI7XG5cbmNvbnN0IHByb2dyYW0gPSBuZXcgQ29tbWFuZCgpO1xuXG5wcm9ncmFtXG5cdC5uYW1lKFwiZGVjb2hlcmVcIilcblx0LmRlc2NyaXB0aW9uKFwiU2NhZmZvbGQgYSBuZXcgRGVjb2hlcmUgcHJvamVjdFwiKVxuXHQuYXJndW1lbnQoXCJbZGlyZWN0b3J5XVwiLCBcIlRhcmdldCBkaXJlY3RvcnkgKGRlZmF1bHQ6IGN1cnJlbnQgZGlyZWN0b3J5KVwiLCBcIi5cIilcblx0Lm9wdGlvbihcIi15LCAtLXllc1wiLCBcIlNraXAgY29uZmlybWF0aW9uIHByb21wdHNcIilcblx0Lm9wdGlvbihcIi10LCAtLXRlbXBsYXRlIDx0ZW1wbGF0ZT5cIiwgXCJQcm9qZWN0IHRlbXBsYXRlOiBhcGkgKGRlZmF1bHQpIG9yIGNsaVwiKVxuXHQub3B0aW9uKFwiLWQsIC0tZGF0YWJhc2UgPHByb3ZpZGVyPlwiLCBcIkRhdGFiYXNlIHByb3ZpZGVyIHRvIGluY2x1ZGUgKGFwaSBvbmx5KTogdHlwZW9ybVwiKVxuXHQub3B0aW9uKFwiLWksIC0taWRwIDxwcm92aWRlcj5cIiwgXCJJZGVudGl0eSBwcm92aWRlciB0byBjb25maWd1cmUgKGFwaSBvbmx5KTogYXV0aDBcIilcblx0Lm9wdGlvbihcIi1wLCAtLXBvc3RtYW5cIiwgXCJDb25maWd1cmUgYSBQb3N0bWFuIHdvcmtzcGFjZSwgY29sbGVjdGlvbiwgYW5kIGVudmlyb25tZW50XCIpXG5cdC5hY3Rpb24oXG5cdFx0YXN5bmMgKFxuXHRcdFx0ZGlyZWN0b3J5OiBzdHJpbmcsXG5cdFx0XHRvcHRzOiB7XG5cdFx0XHRcdHllcz86IGJvb2xlYW47XG5cdFx0XHRcdHRlbXBsYXRlPzogXCJhcGlcIiB8IFwiY2xpXCI7XG5cdFx0XHRcdGRhdGFiYXNlPzogXCJ0eXBlb3JtXCI7XG5cdFx0XHRcdGlkcD86IFwiYXV0aDBcIjtcblx0XHRcdFx0cG9zdG1hbj86IGJvb2xlYW47XG5cdFx0XHR9LFxuXHRcdCkgPT4ge1xuXHRcdFx0YXdhaXQgc2NhZmZvbGQocmVzb2x2ZShkaXJlY3RvcnkpLCBvcHRzKTtcblx0XHR9LFxuXHQpO1xuXG5wcm9ncmFtLnBhcnNlKCk7XG4iXSwibmFtZXMiOlsicmVzb2x2ZSIsIkNvbW1hbmQiLCJzY2FmZm9sZCIsInByb2dyYW0iLCJuYW1lIiwiZGVzY3JpcHRpb24iLCJhcmd1bWVudCIsIm9wdGlvbiIsImFjdGlvbiIsImRpcmVjdG9yeSIsIm9wdHMiLCJwYXJzZSJdLCJtYXBwaW5ncyI6IjtBQUNBLFNBQVNBLE9BQU8sUUFBUSxZQUFZO0FBQ3BDLFNBQVNDLE9BQU8sUUFBUSxZQUFZO0FBQ3BDLFNBQVNDLFFBQVEsUUFBUSxnQkFBZ0I7QUFFekMsTUFBTUMsVUFBVSxJQUFJRjtBQUVwQkUsUUFDRUMsSUFBSSxDQUFDLFlBQ0xDLFdBQVcsQ0FBQyxtQ0FDWkMsUUFBUSxDQUFDLGVBQWUsaURBQWlELEtBQ3pFQyxNQUFNLENBQUMsYUFBYSw2QkFDcEJBLE1BQU0sQ0FBQyw2QkFBNkIsMENBQ3BDQSxNQUFNLENBQUMsNkJBQTZCLG9EQUNwQ0EsTUFBTSxDQUFDLHdCQUF3QixvREFDL0JBLE1BQU0sQ0FBQyxpQkFBaUIsOERBQ3hCQyxNQUFNLENBQ04sT0FDQ0MsV0FDQUM7SUFRQSxNQUFNUixTQUFTRixRQUFRUyxZQUFZQztBQUNwQztBQUdGUCxRQUFRUSxLQUFLIn0=
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { ImportMap } from "./import-map.js";
|
|
2
|
+
/**
|
|
3
|
+
* A live, mutable model of a generated TypeScript class.
|
|
4
|
+
*
|
|
5
|
+
* Features call the fluent API to contribute imports, decorators, constructor
|
|
6
|
+
* params, and method decorators. When all configure phases are done, `render()`
|
|
7
|
+
* produces the final TypeScript source.
|
|
8
|
+
*
|
|
9
|
+
* Subclass to model controllers, services, repositories, etc.
|
|
10
|
+
*/ export class ClassModel {
|
|
11
|
+
className;
|
|
12
|
+
fileName;
|
|
13
|
+
_imports = new ImportMap();
|
|
14
|
+
_classDecorators = [];
|
|
15
|
+
_constructorParams = [];
|
|
16
|
+
_bodyClasses = [];
|
|
17
|
+
_methods = [];
|
|
18
|
+
constructor(className, fileName){
|
|
19
|
+
this.className = className;
|
|
20
|
+
this.fileName = fileName;
|
|
21
|
+
}
|
|
22
|
+
// ── imports ──────────────────────────────────────────────────────────────
|
|
23
|
+
/**
|
|
24
|
+
* Add named value imports from `pkg`.
|
|
25
|
+
* Called with no names, registers a side-effect `import "pkg"`.
|
|
26
|
+
*/ addImport(pkg, ...names) {
|
|
27
|
+
this._imports.add(pkg, ...names);
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
/** Add named type-only imports from `pkg`. */ addTypeImport(pkg, ...names) {
|
|
31
|
+
this._imports.addType(pkg, ...names);
|
|
32
|
+
return this;
|
|
33
|
+
}
|
|
34
|
+
// ── class-level ──────────────────────────────────────────────────────────
|
|
35
|
+
/** Prepend a class-level decorator (goes above any already-registered ones). */ decorateClass(decorator) {
|
|
36
|
+
if (!this._classDecorators.includes(decorator)) {
|
|
37
|
+
this._classDecorators.unshift(decorator);
|
|
38
|
+
}
|
|
39
|
+
return this;
|
|
40
|
+
}
|
|
41
|
+
addBodyClass(def) {
|
|
42
|
+
this._bodyClasses.push(def);
|
|
43
|
+
return this;
|
|
44
|
+
}
|
|
45
|
+
addConstructorParam(param) {
|
|
46
|
+
this._constructorParams.push(param);
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
// ── methods ──────────────────────────────────────────────────────────────
|
|
50
|
+
defineMethod(def) {
|
|
51
|
+
this._methods.push({
|
|
52
|
+
name: def.name,
|
|
53
|
+
decorators: [
|
|
54
|
+
...def.decorators
|
|
55
|
+
],
|
|
56
|
+
isAsync: def.isAsync ?? false,
|
|
57
|
+
params: def.params ?? [],
|
|
58
|
+
body: def.body
|
|
59
|
+
});
|
|
60
|
+
return this;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Prepend a decorator onto an existing method.
|
|
64
|
+
* Silently ignored if `methodName` is not found, so features are
|
|
65
|
+
* resilient to controllers that don't expose a particular method.
|
|
66
|
+
*/ decorateMethod(methodName, ...decorators) {
|
|
67
|
+
const method = this._methods.find((m)=>m.name === methodName);
|
|
68
|
+
if (method) method.decorators.unshift(...decorators);
|
|
69
|
+
return this;
|
|
70
|
+
}
|
|
71
|
+
// ── rendering ─────────────────────────────────────────────────────────────
|
|
72
|
+
render() {
|
|
73
|
+
const importLines = this._imports.render();
|
|
74
|
+
const bodyClassBlocks = this._bodyClasses.map((bc)=>{
|
|
75
|
+
const fields = bc.fields.map((f)=>`\t${f.decorator}\n\tpublic ${f.name}!: ${f.typeName};`).join("\n");
|
|
76
|
+
return `class ${bc.name} {\n${fields}\n}`;
|
|
77
|
+
});
|
|
78
|
+
const constructorParams = this._constructorParams.map((p)=>{
|
|
79
|
+
const prefix = p.paramDecorators.length > 0 ? `${p.paramDecorators.join(" ")} ` : "";
|
|
80
|
+
const access = `${p.isPrivate ? "private " : ""}${p.isReadonly ? "readonly " : ""}`;
|
|
81
|
+
return `\t\t${prefix}${access}${p.name}: ${p.typeName},`;
|
|
82
|
+
}).join("\n");
|
|
83
|
+
const methodBlocks = this._methods.map((m)=>{
|
|
84
|
+
const decorators = m.decorators.map((d)=>`\t${d}`).join("\n");
|
|
85
|
+
const params = m.params.map((p)=>p.decorator ? `${p.decorator} ${p.name}: ${p.typeName}` : `${p.name}: ${p.typeName}`).join(", ");
|
|
86
|
+
const asyncKw = m.isAsync ? "async " : "";
|
|
87
|
+
return `${decorators}\n\tpublic ${asyncKw}${m.name}(${params}) {\n\t\t${m.body}\n\t}`;
|
|
88
|
+
});
|
|
89
|
+
const sections = [
|
|
90
|
+
importLines.join("\n"),
|
|
91
|
+
...bodyClassBlocks,
|
|
92
|
+
[
|
|
93
|
+
...this._classDecorators,
|
|
94
|
+
`export class ${this.className} {`
|
|
95
|
+
].join("\n"),
|
|
96
|
+
`\tpublic constructor(\n${constructorParams}\n\t) {}`,
|
|
97
|
+
...methodBlocks,
|
|
98
|
+
"}"
|
|
99
|
+
];
|
|
100
|
+
return `${sections.join("\n\n")}\n`;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS92MS9kb21haW4vY2xhc3MtbW9kZWwudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW1wb3J0TWFwIH0gZnJvbSBcIi4vaW1wb3J0LW1hcC5qc1wiO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnN0cnVjdG9yUGFyYW0ge1xuXHQvKiogZS5nLiBbXCJAaW5qZWN0KElQcmluY2lwYWxQcm92aWRlclRva2VuKVwiXSAqL1xuXHRwYXJhbURlY29yYXRvcnM6IHN0cmluZ1tdO1xuXHRuYW1lOiBzdHJpbmc7XG5cdHR5cGVOYW1lOiBzdHJpbmc7XG5cdGlzUHJpdmF0ZTogYm9vbGVhbjtcblx0aXNSZWFkb25seTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNZXRob2RQYXJhbSB7XG5cdC8qKiBlLmcuIGBAUXVlcnkoXCJmaWx0ZXJcIilgICovXG5cdGRlY29yYXRvcj86IHN0cmluZztcblx0bmFtZTogc3RyaW5nO1xuXHR0eXBlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1ldGhvZERlZiB7XG5cdC8qKiBCYXNlIEhUVFAgZGVjb3JhdG9yKHMpLCBlLmcuIFtcIkBHZXQoKVwiXS4gUmVuZGVyZWQgYm90dG9tLW1vc3QuICovXG5cdGRlY29yYXRvcnM6IHN0cmluZ1tdO1xuXHRuYW1lOiBzdHJpbmc7XG5cdGlzQXN5bmM/OiBib29sZWFuO1xuXHRwYXJhbXM/OiBNZXRob2RQYXJhbVtdO1xuXHRib2R5OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQm9keUNsYXNzRmllbGQge1xuXHRkZWNvcmF0b3I6IHN0cmluZztcblx0bmFtZTogc3RyaW5nO1xuXHR0eXBlTmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEJvZHlDbGFzc0RlZiB7XG5cdG5hbWU6IHN0cmluZztcblx0ZmllbGRzOiBCb2R5Q2xhc3NGaWVsZFtdO1xufVxuXG5pbnRlcmZhY2UgTWV0aG9kIGV4dGVuZHMgUmVxdWlyZWQ8TWV0aG9kRGVmPiB7fVxuXG4vKipcbiAqIEEgbGl2ZSwgbXV0YWJsZSBtb2RlbCBvZiBhIGdlbmVyYXRlZCBUeXBlU2NyaXB0IGNsYXNzLlxuICpcbiAqIEZlYXR1cmVzIGNhbGwgdGhlIGZsdWVudCBBUEkgdG8gY29udHJpYnV0ZSBpbXBvcnRzLCBkZWNvcmF0b3JzLCBjb25zdHJ1Y3RvclxuICogcGFyYW1zLCBhbmQgbWV0aG9kIGRlY29yYXRvcnMuICBXaGVuIGFsbCBjb25maWd1cmUgcGhhc2VzIGFyZSBkb25lLCBgcmVuZGVyKClgXG4gKiBwcm9kdWNlcyB0aGUgZmluYWwgVHlwZVNjcmlwdCBzb3VyY2UuXG4gKlxuICogU3ViY2xhc3MgdG8gbW9kZWwgY29udHJvbGxlcnMsIHNlcnZpY2VzLCByZXBvc2l0b3JpZXMsIGV0Yy5cbiAqL1xuZXhwb3J0IGNsYXNzIENsYXNzTW9kZWwge1xuXHRwdWJsaWMgcmVhZG9ubHkgY2xhc3NOYW1lOiBzdHJpbmc7XG5cdHB1YmxpYyByZWFkb25seSBmaWxlTmFtZTogc3RyaW5nO1xuXG5cdHByb3RlY3RlZCByZWFkb25seSBfaW1wb3J0cyA9IG5ldyBJbXBvcnRNYXAoKTtcblx0cHJpdmF0ZSByZWFkb25seSBfY2xhc3NEZWNvcmF0b3JzOiBzdHJpbmdbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9jb25zdHJ1Y3RvclBhcmFtczogQ29uc3RydWN0b3JQYXJhbVtdID0gW107XG5cdHByaXZhdGUgcmVhZG9ubHkgX2JvZHlDbGFzc2VzOiBCb2R5Q2xhc3NEZWZbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IF9tZXRob2RzOiBNZXRob2RbXSA9IFtdO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihjbGFzc05hbWU6IHN0cmluZywgZmlsZU5hbWU6IHN0cmluZykge1xuXHRcdHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lO1xuXHRcdHRoaXMuZmlsZU5hbWUgPSBmaWxlTmFtZTtcblx0fVxuXG5cdC8vIOKUgOKUgCBpbXBvcnRzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdC8qKlxuXHQgKiBBZGQgbmFtZWQgdmFsdWUgaW1wb3J0cyBmcm9tIGBwa2dgLlxuXHQgKiBDYWxsZWQgd2l0aCBubyBuYW1lcywgcmVnaXN0ZXJzIGEgc2lkZS1lZmZlY3QgYGltcG9ydCBcInBrZ1wiYC5cblx0ICovXG5cdHB1YmxpYyBhZGRJbXBvcnQocGtnOiBzdHJpbmcsIC4uLm5hbWVzOiBzdHJpbmdbXSk6IHRoaXMge1xuXHRcdHRoaXMuX2ltcG9ydHMuYWRkKHBrZywgLi4ubmFtZXMpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0LyoqIEFkZCBuYW1lZCB0eXBlLW9ubHkgaW1wb3J0cyBmcm9tIGBwa2dgLiAqL1xuXHRwdWJsaWMgYWRkVHlwZUltcG9ydChwa2c6IHN0cmluZywgLi4ubmFtZXM6IHN0cmluZ1tdKTogdGhpcyB7XG5cdFx0dGhpcy5faW1wb3J0cy5hZGRUeXBlKHBrZywgLi4ubmFtZXMpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0Ly8g4pSA4pSAIGNsYXNzLWxldmVsIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdC8qKiBQcmVwZW5kIGEgY2xhc3MtbGV2ZWwgZGVjb3JhdG9yIChnb2VzIGFib3ZlIGFueSBhbHJlYWR5LXJlZ2lzdGVyZWQgb25lcykuICovXG5cdHB1YmxpYyBkZWNvcmF0ZUNsYXNzKGRlY29yYXRvcjogc3RyaW5nKTogdGhpcyB7XG5cdFx0aWYgKCF0aGlzLl9jbGFzc0RlY29yYXRvcnMuaW5jbHVkZXMoZGVjb3JhdG9yKSkge1xuXHRcdFx0dGhpcy5fY2xhc3NEZWNvcmF0b3JzLnVuc2hpZnQoZGVjb3JhdG9yKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgYWRkQm9keUNsYXNzKGRlZjogQm9keUNsYXNzRGVmKTogdGhpcyB7XG5cdFx0dGhpcy5fYm9keUNsYXNzZXMucHVzaChkZWYpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIGFkZENvbnN0cnVjdG9yUGFyYW0ocGFyYW06IENvbnN0cnVjdG9yUGFyYW0pOiB0aGlzIHtcblx0XHR0aGlzLl9jb25zdHJ1Y3RvclBhcmFtcy5wdXNoKHBhcmFtKTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8vIOKUgOKUgCBtZXRob2RzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyBkZWZpbmVNZXRob2QoZGVmOiBNZXRob2REZWYpOiB0aGlzIHtcblx0XHR0aGlzLl9tZXRob2RzLnB1c2goe1xuXHRcdFx0bmFtZTogZGVmLm5hbWUsXG5cdFx0XHRkZWNvcmF0b3JzOiBbLi4uZGVmLmRlY29yYXRvcnNdLFxuXHRcdFx0aXNBc3luYzogZGVmLmlzQXN5bmMgPz8gZmFsc2UsXG5cdFx0XHRwYXJhbXM6IGRlZi5wYXJhbXMgPz8gW10sXG5cdFx0XHRib2R5OiBkZWYuYm9keSxcblx0XHR9KTtcblx0XHRyZXR1cm4gdGhpcztcblx0fVxuXG5cdC8qKlxuXHQgKiBQcmVwZW5kIGEgZGVjb3JhdG9yIG9udG8gYW4gZXhpc3RpbmcgbWV0aG9kLlxuXHQgKiBTaWxlbnRseSBpZ25vcmVkIGlmIGBtZXRob2ROYW1lYCBpcyBub3QgZm91bmQsIHNvIGZlYXR1cmVzIGFyZVxuXHQgKiByZXNpbGllbnQgdG8gY29udHJvbGxlcnMgdGhhdCBkb24ndCBleHBvc2UgYSBwYXJ0aWN1bGFyIG1ldGhvZC5cblx0ICovXG5cdHB1YmxpYyBkZWNvcmF0ZU1ldGhvZChtZXRob2ROYW1lOiBzdHJpbmcsIC4uLmRlY29yYXRvcnM6IHN0cmluZ1tdKTogdGhpcyB7XG5cdFx0Y29uc3QgbWV0aG9kID0gdGhpcy5fbWV0aG9kcy5maW5kKChtKSA9PiBtLm5hbWUgPT09IG1ldGhvZE5hbWUpO1xuXHRcdGlmIChtZXRob2QpIG1ldGhvZC5kZWNvcmF0b3JzLnVuc2hpZnQoLi4uZGVjb3JhdG9ycyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHQvLyDilIDilIAgcmVuZGVyaW5nIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5cdHB1YmxpYyByZW5kZXIoKTogc3RyaW5nIHtcblx0XHRjb25zdCBpbXBvcnRMaW5lcyA9IHRoaXMuX2ltcG9ydHMucmVuZGVyKCk7XG5cblx0XHRjb25zdCBib2R5Q2xhc3NCbG9ja3MgPSB0aGlzLl9ib2R5Q2xhc3Nlcy5tYXAoKGJjKSA9PiB7XG5cdFx0XHRjb25zdCBmaWVsZHMgPSBiYy5maWVsZHNcblx0XHRcdFx0Lm1hcCgoZikgPT4gYFxcdCR7Zi5kZWNvcmF0b3J9XFxuXFx0cHVibGljICR7Zi5uYW1lfSE6ICR7Zi50eXBlTmFtZX07YClcblx0XHRcdFx0LmpvaW4oXCJcXG5cIik7XG5cdFx0XHRyZXR1cm4gYGNsYXNzICR7YmMubmFtZX0ge1xcbiR7ZmllbGRzfVxcbn1gO1xuXHRcdH0pO1xuXG5cdFx0Y29uc3QgY29uc3RydWN0b3JQYXJhbXMgPSB0aGlzLl9jb25zdHJ1Y3RvclBhcmFtc1xuXHRcdFx0Lm1hcCgocCkgPT4ge1xuXHRcdFx0XHRjb25zdCBwcmVmaXggPSBwLnBhcmFtRGVjb3JhdG9ycy5sZW5ndGggPiAwID8gYCR7cC5wYXJhbURlY29yYXRvcnMuam9pbihcIiBcIil9IGAgOiBcIlwiO1xuXHRcdFx0XHRjb25zdCBhY2Nlc3MgPSBgJHtwLmlzUHJpdmF0ZSA/IFwicHJpdmF0ZSBcIiA6IFwiXCJ9JHtwLmlzUmVhZG9ubHkgPyBcInJlYWRvbmx5IFwiIDogXCJcIn1gO1xuXHRcdFx0XHRyZXR1cm4gYFxcdFxcdCR7cHJlZml4fSR7YWNjZXNzfSR7cC5uYW1lfTogJHtwLnR5cGVOYW1lfSxgO1xuXHRcdFx0fSlcblx0XHRcdC5qb2luKFwiXFxuXCIpO1xuXG5cdFx0Y29uc3QgbWV0aG9kQmxvY2tzID0gdGhpcy5fbWV0aG9kcy5tYXAoKG0pID0+IHtcblx0XHRcdGNvbnN0IGRlY29yYXRvcnMgPSBtLmRlY29yYXRvcnMubWFwKChkKSA9PiBgXFx0JHtkfWApLmpvaW4oXCJcXG5cIik7XG5cdFx0XHRjb25zdCBwYXJhbXMgPSBtLnBhcmFtc1xuXHRcdFx0XHQubWFwKChwKSA9PlxuXHRcdFx0XHRcdHAuZGVjb3JhdG9yID8gYCR7cC5kZWNvcmF0b3J9ICR7cC5uYW1lfTogJHtwLnR5cGVOYW1lfWAgOiBgJHtwLm5hbWV9OiAke3AudHlwZU5hbWV9YCxcblx0XHRcdFx0KVxuXHRcdFx0XHQuam9pbihcIiwgXCIpO1xuXHRcdFx0Y29uc3QgYXN5bmNLdyA9IG0uaXNBc3luYyA/IFwiYXN5bmMgXCIgOiBcIlwiO1xuXHRcdFx0cmV0dXJuIGAke2RlY29yYXRvcnN9XFxuXFx0cHVibGljICR7YXN5bmNLd30ke20ubmFtZX0oJHtwYXJhbXN9KSB7XFxuXFx0XFx0JHttLmJvZHl9XFxuXFx0fWA7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBzZWN0aW9uczogc3RyaW5nW10gPSBbXG5cdFx0XHRpbXBvcnRMaW5lcy5qb2luKFwiXFxuXCIpLFxuXHRcdFx0Li4uYm9keUNsYXNzQmxvY2tzLFxuXHRcdFx0Wy4uLnRoaXMuX2NsYXNzRGVjb3JhdG9ycywgYGV4cG9ydCBjbGFzcyAke3RoaXMuY2xhc3NOYW1lfSB7YF0uam9pbihcIlxcblwiKSxcblx0XHRcdGBcXHRwdWJsaWMgY29uc3RydWN0b3IoXFxuJHtjb25zdHJ1Y3RvclBhcmFtc31cXG5cXHQpIHt9YCxcblx0XHRcdC4uLm1ldGhvZEJsb2Nrcyxcblx0XHRcdFwifVwiLFxuXHRcdF07XG5cblx0XHRyZXR1cm4gYCR7c2VjdGlvbnMuam9pbihcIlxcblxcblwiKX1cXG5gO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiSW1wb3J0TWFwIiwiQ2xhc3NNb2RlbCIsImNsYXNzTmFtZSIsImZpbGVOYW1lIiwiX2ltcG9ydHMiLCJfY2xhc3NEZWNvcmF0b3JzIiwiX2NvbnN0cnVjdG9yUGFyYW1zIiwiX2JvZHlDbGFzc2VzIiwiX21ldGhvZHMiLCJhZGRJbXBvcnQiLCJwa2ciLCJuYW1lcyIsImFkZCIsImFkZFR5cGVJbXBvcnQiLCJhZGRUeXBlIiwiZGVjb3JhdGVDbGFzcyIsImRlY29yYXRvciIsImluY2x1ZGVzIiwidW5zaGlmdCIsImFkZEJvZHlDbGFzcyIsImRlZiIsInB1c2giLCJhZGRDb25zdHJ1Y3RvclBhcmFtIiwicGFyYW0iLCJkZWZpbmVNZXRob2QiLCJuYW1lIiwiZGVjb3JhdG9ycyIsImlzQXN5bmMiLCJwYXJhbXMiLCJib2R5IiwiZGVjb3JhdGVNZXRob2QiLCJtZXRob2ROYW1lIiwibWV0aG9kIiwiZmluZCIsIm0iLCJyZW5kZXIiLCJpbXBvcnRMaW5lcyIsImJvZHlDbGFzc0Jsb2NrcyIsIm1hcCIsImJjIiwiZmllbGRzIiwiZiIsInR5cGVOYW1lIiwiam9pbiIsImNvbnN0cnVjdG9yUGFyYW1zIiwicCIsInByZWZpeCIsInBhcmFtRGVjb3JhdG9ycyIsImxlbmd0aCIsImFjY2VzcyIsImlzUHJpdmF0ZSIsImlzUmVhZG9ubHkiLCJtZXRob2RCbG9ja3MiLCJkIiwiYXN5bmNLdyIsInNlY3Rpb25zIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxTQUFTLFFBQVEsa0JBQWtCO0FBd0M1Qzs7Ozs7Ozs7Q0FRQyxHQUNELE9BQU8sTUFBTUM7SUFDSUMsVUFBa0I7SUFDbEJDLFNBQWlCO0lBRWRDLFdBQVcsSUFBSUosWUFBWTtJQUM3QkssbUJBQTZCLEVBQUUsQ0FBQztJQUNoQ0MscUJBQXlDLEVBQUUsQ0FBQztJQUM1Q0MsZUFBK0IsRUFBRSxDQUFDO0lBQ2xDQyxXQUFxQixFQUFFLENBQUM7SUFFekMsWUFBbUJOLFNBQWlCLEVBQUVDLFFBQWdCLENBQUU7UUFDdkQsSUFBSSxDQUFDRCxTQUFTLEdBQUdBO1FBQ2pCLElBQUksQ0FBQ0MsUUFBUSxHQUFHQTtJQUNqQjtJQUVBLDRFQUE0RTtJQUU1RTs7O0VBR0MsR0FDRCxBQUFPTSxVQUFVQyxHQUFXLEVBQUUsR0FBR0MsS0FBZSxFQUFRO1FBQ3ZELElBQUksQ0FBQ1AsUUFBUSxDQUFDUSxHQUFHLENBQUNGLFFBQVFDO1FBQzFCLE9BQU8sSUFBSTtJQUNaO0lBRUEsNENBQTRDLEdBQzVDLEFBQU9FLGNBQWNILEdBQVcsRUFBRSxHQUFHQyxLQUFlLEVBQVE7UUFDM0QsSUFBSSxDQUFDUCxRQUFRLENBQUNVLE9BQU8sQ0FBQ0osUUFBUUM7UUFDOUIsT0FBTyxJQUFJO0lBQ1o7SUFFQSw0RUFBNEU7SUFFNUUsOEVBQThFLEdBQzlFLEFBQU9JLGNBQWNDLFNBQWlCLEVBQVE7UUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQ1gsZ0JBQWdCLENBQUNZLFFBQVEsQ0FBQ0QsWUFBWTtZQUMvQyxJQUFJLENBQUNYLGdCQUFnQixDQUFDYSxPQUFPLENBQUNG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
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { modelKey } from "./context.js";
|
|
2
|
+
export const COMPOSE_KEY = modelKey("compose");
|
|
3
|
+
/**
|
|
4
|
+
* Live builder for `docker-compose.yml`.
|
|
5
|
+
*
|
|
6
|
+
* Features call `addService` / `addVolume` in their `configure` phases.
|
|
7
|
+
* The devcontainer `render` phase calls `render()` and writes the file.
|
|
8
|
+
*/ export class ComposeModel {
|
|
9
|
+
_services = new Map();
|
|
10
|
+
_volumes = new Set();
|
|
11
|
+
addService(name, config) {
|
|
12
|
+
this._services.set(name, config);
|
|
13
|
+
return this;
|
|
14
|
+
}
|
|
15
|
+
addVolume(name) {
|
|
16
|
+
this._volumes.add(name);
|
|
17
|
+
return this;
|
|
18
|
+
}
|
|
19
|
+
render() {
|
|
20
|
+
const lines = [
|
|
21
|
+
"services:"
|
|
22
|
+
];
|
|
23
|
+
for (const [name, svc] of this._services){
|
|
24
|
+
lines.push(` ${name}:`);
|
|
25
|
+
if (svc.build) lines.push(` build: ${svc.build}`);
|
|
26
|
+
if (svc.image) lines.push(` image: ${svc.image}`);
|
|
27
|
+
if (svc.command) lines.push(` command: ${svc.command}`);
|
|
28
|
+
if (svc.restart) lines.push(` restart: ${svc.restart}`);
|
|
29
|
+
if (svc.env_file && svc.env_file.length > 0) {
|
|
30
|
+
lines.push(" env_file:");
|
|
31
|
+
for (const f of svc.env_file)lines.push(` - ${f}`);
|
|
32
|
+
}
|
|
33
|
+
if (svc.environment && Object.keys(svc.environment).length > 0) {
|
|
34
|
+
lines.push(" environment:");
|
|
35
|
+
for (const [k, v] of Object.entries(svc.environment)){
|
|
36
|
+
lines.push(` ${k}: ${v}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if (svc.ports && svc.ports.length > 0) {
|
|
40
|
+
lines.push(" ports:");
|
|
41
|
+
for (const p of svc.ports)lines.push(` - "${p}"`);
|
|
42
|
+
}
|
|
43
|
+
if (svc.volumes && svc.volumes.length > 0) {
|
|
44
|
+
lines.push(" volumes:");
|
|
45
|
+
for (const v of svc.volumes)lines.push(` - ${v}`);
|
|
46
|
+
}
|
|
47
|
+
if (svc.depends_on && svc.depends_on.length > 0) {
|
|
48
|
+
lines.push(" depends_on:");
|
|
49
|
+
for (const d of svc.depends_on)lines.push(` - ${d}`);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (this._volumes.size > 0) {
|
|
53
|
+
lines.push("");
|
|
54
|
+
lines.push("volumes:");
|
|
55
|
+
for (const v of this._volumes)lines.push(` ${v}:`);
|
|
56
|
+
}
|
|
57
|
+
return `${lines.join("\n")}\n`;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS92MS9kb21haW4vY29tcG9zZS5tb2RlbC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBtb2RlbEtleSB9IGZyb20gXCIuL2NvbnRleHQuanNcIjtcblxuZXhwb3J0IGNvbnN0IENPTVBPU0VfS0VZID0gbW9kZWxLZXk8Q29tcG9zZU1vZGVsPihcImNvbXBvc2VcIik7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9zZVNlcnZpY2Uge1xuXHRidWlsZD86IHN0cmluZztcblx0aW1hZ2U/OiBzdHJpbmc7XG5cdGVudl9maWxlPzogc3RyaW5nW107XG5cdGVudmlyb25tZW50PzogUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcblx0cG9ydHM/OiBzdHJpbmdbXTtcblx0dm9sdW1lcz86IHN0cmluZ1tdO1xuXHRjb21tYW5kPzogc3RyaW5nO1xuXHRyZXN0YXJ0Pzogc3RyaW5nO1xuXHRkZXBlbmRzX29uPzogc3RyaW5nW107XG59XG5cbi8qKlxuICogTGl2ZSBidWlsZGVyIGZvciBgZG9ja2VyLWNvbXBvc2UueW1sYC5cbiAqXG4gKiBGZWF0dXJlcyBjYWxsIGBhZGRTZXJ2aWNlYCAvIGBhZGRWb2x1bWVgIGluIHRoZWlyIGBjb25maWd1cmVgIHBoYXNlcy5cbiAqIFRoZSBkZXZjb250YWluZXIgYHJlbmRlcmAgcGhhc2UgY2FsbHMgYHJlbmRlcigpYCBhbmQgd3JpdGVzIHRoZSBmaWxlLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcG9zZU1vZGVsIHtcblx0cHJpdmF0ZSByZWFkb25seSBfc2VydmljZXM6IE1hcDxzdHJpbmcsIENvbXBvc2VTZXJ2aWNlPiA9IG5ldyBNYXAoKTtcblx0cHJpdmF0ZSByZWFkb25seSBfdm9sdW1lczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cblx0cHVibGljIGFkZFNlcnZpY2UobmFtZTogc3RyaW5nLCBjb25maWc6IENvbXBvc2VTZXJ2aWNlKTogdGhpcyB7XG5cdFx0dGhpcy5fc2VydmljZXMuc2V0KG5hbWUsIGNvbmZpZyk7XG5cdFx0cmV0dXJuIHRoaXM7XG5cdH1cblxuXHRwdWJsaWMgYWRkVm9sdW1lKG5hbWU6IHN0cmluZyk6IHRoaXMge1xuXHRcdHRoaXMuX3ZvbHVtZXMuYWRkKG5hbWUpO1xuXHRcdHJldHVybiB0aGlzO1xuXHR9XG5cblx0cHVibGljIHJlbmRlcigpOiBzdHJpbmcge1xuXHRcdGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcInNlcnZpY2VzOlwiXTtcblxuXHRcdGZvciAoY29uc3QgW25hbWUsIHN2Y10gb2YgdGhpcy5fc2VydmljZXMpIHtcblx0XHRcdGxpbmVzLnB1c2goYCAgJHtuYW1lfTpgKTtcblx0XHRcdGlmIChzdmMuYnVpbGQpIGxpbmVzLnB1c2goYCAgICBidWlsZDogJHtzdmMuYnVpbGR9YCk7XG5cdFx0XHRpZiAoc3ZjLmltYWdlKSBsaW5lcy5wdXNoKGAgICAgaW1hZ2U6ICR7c3ZjLmltYWdlfWApO1xuXHRcdFx0aWYgKHN2Yy5jb21tYW5kKSBsaW5lcy5wdXNoKGAgICAgY29tbWFuZDogJHtzdmMuY29tbWFuZH1gKTtcblx0XHRcdGlmIChzdmMucmVzdGFydCkgbGluZXMucHVzaChgICAgIHJlc3RhcnQ6ICR7c3ZjLnJlc3RhcnR9YCk7XG5cblx0XHRcdGlmIChzdmMuZW52X2ZpbGUgJiYgc3ZjLmVudl9maWxlLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0bGluZXMucHVzaChcIiAgICBlbnZfZmlsZTpcIik7XG5cdFx0XHRcdGZvciAoY29uc3QgZiBvZiBzdmMuZW52X2ZpbGUpIGxpbmVzLnB1c2goYCAgICAgIC0gJHtmfWApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc3ZjLmVudmlyb25tZW50ICYmIE9iamVjdC5rZXlzKHN2Yy5lbnZpcm9ubWVudCkubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRsaW5lcy5wdXNoKFwiICAgIGVudmlyb25tZW50OlwiKTtcblx0XHRcdFx0Zm9yIChjb25zdCBbaywgdl0gb2YgT2JqZWN0LmVudHJpZXMoc3ZjLmVudmlyb25tZW50KSkge1xuXHRcdFx0XHRcdGxpbmVzLnB1c2goYCAgICAgICR7a306ICR7dn1gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoc3ZjLnBvcnRzICYmIHN2Yy5wb3J0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgcG9ydHM6XCIpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IHAgb2Ygc3ZjLnBvcnRzKSBsaW5lcy5wdXNoKGAgICAgICAtIFwiJHtwfVwiYCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMudm9sdW1lcyAmJiBzdmMudm9sdW1lcy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgdm9sdW1lczpcIik7XG5cdFx0XHRcdGZvciAoY29uc3QgdiBvZiBzdmMudm9sdW1lcykgbGluZXMucHVzaChgICAgICAgLSAke3Z9YCk7XG5cdFx0XHR9XG5cblx0XHRcdGlmIChzdmMuZGVwZW5kc19vbiAmJiBzdmMuZGVwZW5kc19vbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGxpbmVzLnB1c2goXCIgICAgZGVwZW5kc19vbjpcIik7XG5cdFx0XHRcdGZvciAoY29uc3QgZCBvZiBzdmMuZGVwZW5kc19vbikgbGluZXMucHVzaChgICAgICAgLSAke2R9YCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX3ZvbHVtZXMuc2l6ZSA+IDApIHtcblx0XHRcdGxpbmVzLnB1c2goXCJcIik7XG5cdFx0XHRsaW5lcy5wdXNoKFwidm9sdW1lczpcIik7XG5cdFx0XHRmb3IgKGNvbnN0IHYgb2YgdGhpcy5fdm9sdW1lcykgbGluZXMucHVzaChgICAke3Z9OmApO1xuXHRcdH1cblxuXHRcdHJldHVybiBgJHtsaW5lcy5qb2luKFwiXFxuXCIpfVxcbmA7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJtb2RlbEtleSIsIkNPTVBPU0VfS0VZIiwiQ29tcG9zZU1vZGVsIiwiX3NlcnZpY2VzIiwiTWFwIiwiX3ZvbHVtZXMiLCJTZXQiLCJhZGRTZXJ2aWNlIiwibmFtZSIsImNvbmZpZyIsInNldCIsImFkZFZvbHVtZSIsImFkZCIsInJlbmRlciIsImxpbmVzIiwic3ZjIiwicHVzaCIsImJ1aWxkIiwiaW1hZ2UiLCJjb21tYW5kIiwicmVzdGFydCIsImVudl9maWxlIiwibGVuZ3RoIiwiZiIsImVudmlyb25tZW50IiwiT2JqZWN0Iiwia2V5cyIsImsiLCJ2IiwiZW50cmllcyIsInBvcnRzIiwicCIsInZvbHVtZXMiLCJkZXBlbmRzX29uIiwiZCIsInNpemUiLCJqb2luIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLFFBQVEsZUFBZTtBQUV4QyxPQUFPLE1BQU1DLGNBQWNELFNBQXVCLFdBQVc7QUFjN0Q7Ozs7O0NBS0MsR0FDRCxPQUFPLE1BQU1FO0lBQ0tDLFlBQXlDLElBQUlDLE1BQU07SUFDbkRDLFdBQXdCLElBQUlDLE1BQU07SUFFNUNDLFdBQVdDLElBQVksRUFBRUMsTUFBc0IsRUFBUTtRQUM3RCxJQUFJLENBQUNOLFNBQVMsQ0FBQ08sR0FBRyxDQUFDRixNQUFNQztRQUN6QixPQUFPLElBQUk7SUFDWjtJQUVPRSxVQUFVSCxJQUFZLEVBQVE7UUFDcEMsSUFBSSxDQUFDSCxRQUFRLENBQUNPLEdBQUcsQ0FBQ0o7UUFDbEIsT0FBTyxJQUFJO0lBQ1o7SUFFT0ssU0FBaUI7UUFDdkIsTUFBTUMsUUFBa0I7WUFBQztTQUFZO1FBRXJDLEtBQUssTUFBTSxDQUFDTixNQUFNTyxJQUFJLElBQUksSUFBSSxDQUFDWixTQUFTLENBQUU7WUFDekNXLE1BQU1FLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRVIsS0FBSyxDQUFDLENBQUM7WUFDdkIsSUFBSU8sSUFBSUUsS0FBSyxFQUFFSCxNQUFNRSxJQUFJLENBQUMsQ0FBQyxXQUFXLEVBQUVELElBQUlFLEtBQUssRUFBRTtZQUNuRCxJQUFJRixJQUFJRyxLQUFLLEVBQUVKLE1BQU1FLElBQUksQ0FBQyxDQUFDLFdBQVcsRUFBRUQsSUFBSUcsS0FBSyxFQUFFO1lBQ25ELElBQUlILElBQUlJLE9BQU8sRUFBRUwsTUFBTUUsSUFBSSxDQUFDLENBQUMsYUFBYSxFQUFFRCxJQUFJSSxPQUFPLEVBQUU7WUFDekQsSUFBSUosSUFBSUssT0FBTyxFQUFFTixNQUFNRSxJQUFJLENBQUMsQ0FBQyxhQUFhLEVBQUVELElBQUlLLE9BQU8sRUFBRTtZQUV6RCxJQUFJTCxJQUFJTSxRQUFRLElBQUlOLElBQUlNLFFBQVEsQ0FBQ0MsTUFBTSxHQUFHLEdBQUc7Z0JBQzVDUixNQUFNRSxJQUFJLENBQUM7Z0JBQ1gsS0FBSyxNQUFNTyxLQUFLUixJQUFJTSxRQUFRLENBQUVQLE1BQU1FLElBQUksQ0FBQyxDQUFDLFFBQVEsRUFBRU8sR0FBRztZQUN4RDtZQUVBLElBQUlSLElBQUlTLFdBQVcsSUFBSUMsT0FBT0MsSUFBSSxDQUFDWCxJQUFJUyxXQUFXLEVBQUVGLE1BQU0sR0FBRyxHQUFHO2dCQUMvRFIsTUFBTUUsSUFBSSxDQUFDO2dCQUNYLEtBQUssTUFBTSxDQUFDVyxHQUFHQyxFQUFFLElBQUlILE9BQU9JLE9BQU8sQ0FBQ2QsSUFBSVMsV0FBVyxFQUFHO29CQUNyRFYsTUFBTUUsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFVyxFQUFFLEVBQUUsRUFBRUMsR0FBRztnQkFDOUI7WUFDRDtZQUVBLElBQUliLElBQUllLEtBQUssSUFBSWYsSUFBSWUsS0FBSyxDQUFDUixNQUFNLEdBQUcsR0FBRztnQkFDdENSLE1BQU1FLElBQUksQ0FBQztnQkFDWCxLQUFLLE1BQU1lLEtBQUtoQixJQUFJZSxLQUFLLENBQUVoQixNQUFNRSxJQUFJLENBQUMsQ0FBQyxTQUFTLEVBQUVlLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZEO1lBRUEsSUFBSWhCLElBQUlpQixPQUFPLElBQUlqQixJQUFJaUIsT0FBTyxDQUFDVixNQUFNLEdBQUcsR0FBRztnQkFDMUNSLE1BQU1FLElBQUksQ0FBQztnQkFDWCxLQUFLLE1BQU1ZLEtBQUtiLElBQUlpQixPQUFPLENBQUVsQixNQUFNRSxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUVZLEdBQUc7WUFDdkQ7WUFFQSxJQUFJYixJQUFJa0IsVUFBVSxJQUFJbEIsSUFBSWtCLFVBQVUsQ0FBQ1gsTUFBTSxHQUFHLEdBQUc7Z0JBQ2hEUixNQUFNRSxJQUFJLENBQUM7Z0JBQ1gsS0FBSyxNQUFNa0IsS0FBS25CLElBQUlrQixVQUFVLENBQUVuQixNQUFNRSxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUVrQixHQUFHO1lBQzFEO1FBQ0Q7UUFFQSxJQUFJLElBQUksQ0FBQzdCLFFBQVEsQ0FBQzhCLElBQUksR0FBRyxHQUFHO1lBQzNCckIsTUFBTUUsSUFBSSxDQUFDO1lBQ1hGLE1BQU1FLElBQUksQ0FBQztZQUNYLEtBQUssTUFBTVksS0FBSyxJQUFJLENBQUN2QixRQUFRLENBQUVTLE1BQU1FLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRVksRUFBRSxDQUFDLENBQUM7UUFDcEQ7UUFFQSxPQUFPLEdBQUdkLE1BQU1zQixJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7SUFDL0I7QUFDRCJ9
|