@decohere/create 0.0.1-dev.17 → 0.0.1-dev.19
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 +30 -5
- package/commonjs/src/domain/prompt.js +55 -0
- 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/runner.js +56 -0
- package/commonjs/src/services/scaffold.service.js +62 -0
- package/commonjs/src/version.js +32 -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 +51 -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/es6/src/cli.js +30 -5
- package/es6/src/domain/prompt.js +37 -0
- 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/runner.js +55 -0
- package/es6/src/services/scaffold.service.js +52 -0
- package/es6/src/version.js +22 -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 +41 -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/package.json +2 -2
- package/types/src/domain/prompt.d.ts +2 -0
- 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/runner.d.ts +13 -0
- package/types/src/services/scaffold.service.d.ts +22 -0
- package/types/src/version.d.ts +2 -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/commonjs/src/scaffold.js +0 -89
- package/commonjs/src/templates.js +0 -306
- package/es6/src/scaffold.js +0 -79
- package/es6/src/templates.js +0 -246
- package/types/src/scaffold.d.ts +0 -6
- package/types/src/templates.d.ts +0 -20
|
@@ -1,306 +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 APP_PACKAGE_JSON () {
|
|
13
|
-
return APP_PACKAGE_JSON;
|
|
14
|
-
},
|
|
15
|
-
get CONFIG_DEV_YAML () {
|
|
16
|
-
return CONFIG_DEV_YAML;
|
|
17
|
-
},
|
|
18
|
-
get CONFIG_PROD_YAML () {
|
|
19
|
-
return CONFIG_PROD_YAML;
|
|
20
|
-
},
|
|
21
|
-
get CONFIG_YAML () {
|
|
22
|
-
return CONFIG_YAML;
|
|
23
|
-
},
|
|
24
|
-
get HELLO_CONTROLLER_TS () {
|
|
25
|
-
return HELLO_CONTROLLER_TS;
|
|
26
|
-
},
|
|
27
|
-
get MAIN_TS () {
|
|
28
|
-
return MAIN_TS;
|
|
29
|
-
},
|
|
30
|
-
get ROOT_PACKAGE_JSON () {
|
|
31
|
-
return ROOT_PACKAGE_JSON;
|
|
32
|
-
},
|
|
33
|
-
get SAMPLE_CONFIG_TS () {
|
|
34
|
-
return SAMPLE_CONFIG_TS;
|
|
35
|
-
},
|
|
36
|
-
get SAMPLE_ENTITY_TS () {
|
|
37
|
-
return SAMPLE_ENTITY_TS;
|
|
38
|
-
},
|
|
39
|
-
get SAMPLE_REPOSITORY_TS () {
|
|
40
|
-
return SAMPLE_REPOSITORY_TS;
|
|
41
|
-
},
|
|
42
|
-
get SAMPLE_SERVICE_TS () {
|
|
43
|
-
return SAMPLE_SERVICE_TS;
|
|
44
|
-
},
|
|
45
|
-
get TSCONFIG () {
|
|
46
|
-
return TSCONFIG;
|
|
47
|
-
},
|
|
48
|
-
get WEB_API_APP_PACKAGE_JSON () {
|
|
49
|
-
return WEB_API_APP_PACKAGE_JSON;
|
|
50
|
-
},
|
|
51
|
-
get WEB_API_MAIN_TS () {
|
|
52
|
-
return WEB_API_MAIN_TS;
|
|
53
|
-
},
|
|
54
|
-
get WEB_API_ROOT_PACKAGE_JSON () {
|
|
55
|
-
return WEB_API_ROOT_PACKAGE_JSON;
|
|
56
|
-
},
|
|
57
|
-
get WEB_API_TSCONFIG () {
|
|
58
|
-
return WEB_API_TSCONFIG;
|
|
59
|
-
}
|
|
60
|
-
});
|
|
61
|
-
function ROOT_PACKAGE_JSON(name) {
|
|
62
|
-
return JSON.stringify({
|
|
63
|
-
name,
|
|
64
|
-
version: "0.0.1",
|
|
65
|
-
type: "module",
|
|
66
|
-
scripts: {
|
|
67
|
-
build: "forge build",
|
|
68
|
-
"build:watch": "forge build --watch",
|
|
69
|
-
dev: "flux serve"
|
|
70
|
-
},
|
|
71
|
-
devDependencies: {
|
|
72
|
-
"@decohere/terminal": "0.0.1-dev.14",
|
|
73
|
-
typescript: "^6.0.3"
|
|
74
|
-
}
|
|
75
|
-
}, null, 2);
|
|
76
|
-
}
|
|
77
|
-
function WEB_API_ROOT_PACKAGE_JSON(name, opts) {
|
|
78
|
-
const deps = {
|
|
79
|
-
"@decohere/cortex": "0.0.1-dev.15",
|
|
80
|
-
"@decohere/protocol": "0.0.1-dev.15",
|
|
81
|
-
"@decohere/scribe": "0.0.1-dev.15",
|
|
82
|
-
"@decohere/scribe-pino": "0.0.1-dev.15",
|
|
83
|
-
"pino-pretty": "^13.0.0"
|
|
84
|
-
};
|
|
85
|
-
if (opts?.database === "typeorm") {
|
|
86
|
-
deps["@decohere/codex"] = "0.0.1-dev.15";
|
|
87
|
-
deps["@decohere/codex-typeorm"] = "0.0.1-dev.15";
|
|
88
|
-
}
|
|
89
|
-
return JSON.stringify({
|
|
90
|
-
name: `${name}.api`,
|
|
91
|
-
version: "0.0.1",
|
|
92
|
-
type: "module",
|
|
93
|
-
scripts: {
|
|
94
|
-
build: "forge build",
|
|
95
|
-
"build:watch": "forge build --watch",
|
|
96
|
-
dev: "flux serve"
|
|
97
|
-
},
|
|
98
|
-
dependencies: deps,
|
|
99
|
-
devDependencies: {
|
|
100
|
-
"@decohere/terminal": "0.0.1-dev.15",
|
|
101
|
-
typescript: "^6.0.3"
|
|
102
|
-
}
|
|
103
|
-
}, null, 2);
|
|
104
|
-
}
|
|
105
|
-
function APP_PACKAGE_JSON(name) {
|
|
106
|
-
return JSON.stringify({
|
|
107
|
-
name: `@${name}/app`,
|
|
108
|
-
version: "0.0.1",
|
|
109
|
-
type: "module",
|
|
110
|
-
main: "src/main.ts"
|
|
111
|
-
}, null, 2);
|
|
112
|
-
}
|
|
113
|
-
const TSCONFIG = JSON.stringify({
|
|
114
|
-
compilerOptions: {
|
|
115
|
-
target: "ES2022",
|
|
116
|
-
module: "NodeNext",
|
|
117
|
-
moduleResolution: "NodeNext",
|
|
118
|
-
strict: true,
|
|
119
|
-
skipLibCheck: true
|
|
120
|
-
},
|
|
121
|
-
include: [
|
|
122
|
-
"projects"
|
|
123
|
-
]
|
|
124
|
-
}, null, 2);
|
|
125
|
-
const MAIN_TS = `console.log("Hello from Decohere!");
|
|
126
|
-
`;
|
|
127
|
-
const WEB_API_TSCONFIG = JSON.stringify({
|
|
128
|
-
compilerOptions: {
|
|
129
|
-
target: "ES2022",
|
|
130
|
-
module: "NodeNext",
|
|
131
|
-
moduleResolution: "NodeNext",
|
|
132
|
-
strict: true,
|
|
133
|
-
skipLibCheck: true,
|
|
134
|
-
experimentalDecorators: true,
|
|
135
|
-
emitDecoratorMetadata: true
|
|
136
|
-
},
|
|
137
|
-
include: [
|
|
138
|
-
"projects"
|
|
139
|
-
]
|
|
140
|
-
}, null, 2);
|
|
141
|
-
function WEB_API_APP_PACKAGE_JSON(name) {
|
|
142
|
-
return JSON.stringify({
|
|
143
|
-
name: `@${name}/api`,
|
|
144
|
-
version: "0.0.1",
|
|
145
|
-
type: "module",
|
|
146
|
-
main: "src/main.ts",
|
|
147
|
-
dependencies: {
|
|
148
|
-
"@decohere/cortex": "0.0.1-dev.15",
|
|
149
|
-
"@decohere/crucible": "0.0.1-dev.15"
|
|
150
|
-
}
|
|
151
|
-
}, null, 2);
|
|
152
|
-
}
|
|
153
|
-
function WEB_API_MAIN_TS(name, opts) {
|
|
154
|
-
const dbImport = opts?.database === "typeorm" ? `import "@decohere/codex-typeorm";
|
|
155
|
-
import { SampleEntity } from "./entities/sample.entity.js";
|
|
156
|
-
import { SampleEntityRepository } from "./repositories/sample.repository.js";
|
|
157
|
-
` : "";
|
|
158
|
-
const dbChain = opts?.database === "typeorm" ? `\n\t.withTypeOrm({ entities: [SampleEntity], repositories: [SampleEntityRepository] })` : "";
|
|
159
|
-
return `import "@decohere/scribe-pino";
|
|
160
|
-
import "@decohere/cortex/http";
|
|
161
|
-
import "@decohere/protocol";
|
|
162
|
-
${dbImport}import { Builder } from "@decohere/cortex";
|
|
163
|
-
import { FastifyProvider } from "@decohere/cortex/providers";
|
|
164
|
-
import { scribe } from "@decohere/scribe";
|
|
165
|
-
import { YamlDataSource } from "@decohere/protocol";
|
|
166
|
-
import { HelloController } from "./controllers/hello.controller.js";
|
|
167
|
-
import { SampleService } from "./sample.service.js";
|
|
168
|
-
|
|
169
|
-
scribe.extend.withPinoPretty();
|
|
170
|
-
|
|
171
|
-
const app = await Builder.create({ applicationName: "${name}.api" })
|
|
172
|
-
\t.withHttpProvider(FastifyProvider)
|
|
173
|
-
\t.withConfiguration(YamlDataSource)
|
|
174
|
-
\t.withServices((cb) => {
|
|
175
|
-
\t\tcb.registerSingleton(SampleService);
|
|
176
|
-
\t})${dbChain}
|
|
177
|
-
\t.withControllers(HelloController)
|
|
178
|
-
\t.build();
|
|
179
|
-
|
|
180
|
-
await app.start({ port: 3000 });
|
|
181
|
-
|
|
182
|
-
export default app;
|
|
183
|
-
`;
|
|
184
|
-
}
|
|
185
|
-
const HELLO_CONTROLLER_TS = `import { Controller, Delete, Field, Get, Param, Post, Put, Query } from "@decohere/cortex";
|
|
186
|
-
import { SampleService } from "../sample.service.js";
|
|
187
|
-
|
|
188
|
-
class HelloBody {
|
|
189
|
-
@Field("body", "message")
|
|
190
|
-
public message!: string;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
@Controller({ prefix: "/hello" })
|
|
194
|
-
export class HelloController {
|
|
195
|
-
public constructor(private readonly sample: SampleService) {}
|
|
196
|
-
|
|
197
|
-
@Get()
|
|
198
|
-
public async getAll(@Query("filter") filter: string) {
|
|
199
|
-
const greeting = await this.sample.getGreeting();
|
|
200
|
-
return { filter, message: greeting };
|
|
201
|
-
}
|
|
202
|
-
|
|
203
|
-
@Get("/:id")
|
|
204
|
-
public getOne(@Param("id") id: string) {
|
|
205
|
-
return { id, message: \`Hello \${id}!\` };
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
@Post("/")
|
|
209
|
-
public create(body: HelloBody) {
|
|
210
|
-
return { message: body.message };
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
@Put("/:id")
|
|
214
|
-
public update(@Param("id") id: string, body: HelloBody) {
|
|
215
|
-
return { id, message: body.message };
|
|
216
|
-
}
|
|
217
|
-
|
|
218
|
-
@Delete("/:id")
|
|
219
|
-
public remove(@Param("id") id: string) {
|
|
220
|
-
return { id, deleted: true };
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
`;
|
|
224
|
-
const SAMPLE_CONFIG_TS = `export class SampleConfig {
|
|
225
|
-
public greeting: string = "";
|
|
226
|
-
}
|
|
227
|
-
`;
|
|
228
|
-
const SAMPLE_SERVICE_TS = `import { inject, injectable } from "@decohere/crucible/decorators";
|
|
229
|
-
import { ConfigurationServiceToken } from "@decohere/nexus/configuration";
|
|
230
|
-
import type { IConfigurationService } from "@decohere/nexus/configuration";
|
|
231
|
-
import { SampleConfig } from "./sample.config.js";
|
|
232
|
-
|
|
233
|
-
@injectable()
|
|
234
|
-
export class SampleService {
|
|
235
|
-
public constructor(
|
|
236
|
-
@inject(ConfigurationServiceToken) private readonly config: IConfigurationService,
|
|
237
|
-
) {}
|
|
238
|
-
|
|
239
|
-
public async getGreeting(): Promise<string> {
|
|
240
|
-
const config = await this.config.get(SampleConfig);
|
|
241
|
-
return config.greeting;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
`;
|
|
245
|
-
function CONFIG_YAML(name, opts) {
|
|
246
|
-
const dbSection = opts?.database === "typeorm" ? `database:
|
|
247
|
-
dataSources:
|
|
248
|
-
- name: default
|
|
249
|
-
provider: postgres
|
|
250
|
-
host: localhost
|
|
251
|
-
port: 5432
|
|
252
|
-
database: ${name}_dev
|
|
253
|
-
username: postgres
|
|
254
|
-
password: postgres
|
|
255
|
-
synchronize: true
|
|
256
|
-
seed: false
|
|
257
|
-
adminUser: postgres
|
|
258
|
-
adminPassword: postgres
|
|
259
|
-
` : "";
|
|
260
|
-
return `sample:
|
|
261
|
-
greeting: Hello from configuration!
|
|
262
|
-
${dbSection}`;
|
|
263
|
-
}
|
|
264
|
-
const CONFIG_DEV_YAML = `sample:
|
|
265
|
-
greeting: Hello from dev configuration!
|
|
266
|
-
`;
|
|
267
|
-
const CONFIG_PROD_YAML = `database:
|
|
268
|
-
dataSources:
|
|
269
|
-
- name: default
|
|
270
|
-
provider: postgres
|
|
271
|
-
host: \${DB_HOST}
|
|
272
|
-
port: \${DB_PORT}
|
|
273
|
-
database: \${DB_NAME}
|
|
274
|
-
username: \${DB_USER}
|
|
275
|
-
password: \${DB_PASSWORD}
|
|
276
|
-
synchronize: false
|
|
277
|
-
seed: false
|
|
278
|
-
adminUser: \${DB_ADMIN_USER}
|
|
279
|
-
adminPassword: \${DB_ADMIN_PASSWORD}
|
|
280
|
-
`;
|
|
281
|
-
const SAMPLE_ENTITY_TS = `import { Column, Entity, PrimaryGeneratedColumn } from "typeorm";
|
|
282
|
-
import type { Entity as IEntity } from "@decohere/codex";
|
|
283
|
-
|
|
284
|
-
@Entity()
|
|
285
|
-
export class SampleEntity implements IEntity {
|
|
286
|
-
\t@PrimaryGeneratedColumn()
|
|
287
|
-
\tpublic id!: number;
|
|
288
|
-
|
|
289
|
-
\t@Column()
|
|
290
|
-
\tpublic name!: string;
|
|
291
|
-
}
|
|
292
|
-
`;
|
|
293
|
-
const SAMPLE_REPOSITORY_TS = `import { injectable } from "@decohere/crucible/decorators";
|
|
294
|
-
import { injectUnitOfWork } from "@decohere/codex";
|
|
295
|
-
import { TypeOrmRepository, TypeOrmUnitOfWork } from "@decohere/codex-typeorm";
|
|
296
|
-
import { SampleEntity } from "../entities/sample.entity.js";
|
|
297
|
-
|
|
298
|
-
@injectable()
|
|
299
|
-
export class SampleEntityRepository extends TypeOrmRepository<SampleEntity> {
|
|
300
|
-
\tpublic constructor(@injectUnitOfWork() unitOfWork: TypeOrmUnitOfWork) {
|
|
301
|
-
\t\tsuper(unitOfWork, SampleEntity);
|
|
302
|
-
\t}
|
|
303
|
-
}
|
|
304
|
-
`;
|
|
305
|
-
|
|
306
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvdGVtcGxhdGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBST09UX1BBQ0tBR0VfSlNPTihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoXG5cdFx0e1xuXHRcdFx0bmFtZSxcblx0XHRcdHZlcnNpb246IFwiMC4wLjFcIixcblx0XHRcdHR5cGU6IFwibW9kdWxlXCIsXG5cdFx0XHRzY3JpcHRzOiB7XG5cdFx0XHRcdGJ1aWxkOiBcImZvcmdlIGJ1aWxkXCIsXG5cdFx0XHRcdFwiYnVpbGQ6d2F0Y2hcIjogXCJmb3JnZSBidWlsZCAtLXdhdGNoXCIsXG5cdFx0XHRcdGRldjogXCJmbHV4IHNlcnZlXCIsXG5cdFx0XHR9LFxuXHRcdFx0ZGV2RGVwZW5kZW5jaWVzOiB7XG5cdFx0XHRcdFwiQGRlY29oZXJlL3Rlcm1pbmFsXCI6IFwiMC4wLjEtZGV2LjE0XCIsXG5cdFx0XHRcdHR5cGVzY3JpcHQ6IFwiXjYuMC4zXCIsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0bnVsbCxcblx0XHQyLFxuXHQpO1xufVxuXG5leHBvcnQgdHlwZSBEYXRhYmFzZVByb3ZpZGVyID0gXCJ0eXBlb3JtXCI7XG5cbmV4cG9ydCB0eXBlIFdlYkFwaU9wdGlvbnMgPSB7XG5cdGRhdGFiYXNlPzogRGF0YWJhc2VQcm92aWRlcjtcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBXRUJfQVBJX1JPT1RfUEFDS0FHRV9KU09OKG5hbWU6IHN0cmluZywgb3B0cz86IFdlYkFwaU9wdGlvbnMpOiBzdHJpbmcge1xuXHRjb25zdCBkZXBzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge1xuXHRcdFwiQGRlY29oZXJlL2NvcnRleFwiOiBcIjAuMC4xLWRldi4xNVwiLFxuXHRcdFwiQGRlY29oZXJlL3Byb3RvY29sXCI6IFwiMC4wLjEtZGV2LjE1XCIsXG5cdFx0XCJAZGVjb2hlcmUvc2NyaWJlXCI6IFwiMC4wLjEtZGV2LjE1XCIsXG5cdFx0XCJAZGVjb2hlcmUvc2NyaWJlLXBpbm9cIjogXCIwLjAuMS1kZXYuMTVcIixcblx0XHRcInBpbm8tcHJldHR5XCI6IFwiXjEzLjAuMFwiLFxuXHR9O1xuXHRpZiAob3B0cz8uZGF0YWJhc2UgPT09IFwidHlwZW9ybVwiKSB7XG5cdFx0ZGVwc1tcIkBkZWNvaGVyZS9jb2RleFwiXSA9IFwiMC4wLjEtZGV2LjE1XCI7XG5cdFx0ZGVwc1tcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCJdID0gXCIwLjAuMS1kZXYuMTVcIjtcblx0fVxuXHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoXG5cdFx0e1xuXHRcdFx0bmFtZTogYCR7bmFtZX0uYXBpYCxcblx0XHRcdHZlcnNpb246IFwiMC4wLjFcIixcblx0XHRcdHR5cGU6IFwibW9kdWxlXCIsXG5cdFx0XHRzY3JpcHRzOiB7XG5cdFx0XHRcdGJ1aWxkOiBcImZvcmdlIGJ1aWxkXCIsXG5cdFx0XHRcdFwiYnVpbGQ6d2F0Y2hcIjogXCJmb3JnZSBidWlsZCAtLXdhdGNoXCIsXG5cdFx0XHRcdGRldjogXCJmbHV4IHNlcnZlXCIsXG5cdFx0XHR9LFxuXHRcdFx0ZGVwZW5kZW5jaWVzOiBkZXBzLFxuXHRcdFx0ZGV2RGVwZW5kZW5jaWVzOiB7XG5cdFx0XHRcdFwiQGRlY29oZXJlL3Rlcm1pbmFsXCI6IFwiMC4wLjEtZGV2LjE1XCIsXG5cdFx0XHRcdHR5cGVzY3JpcHQ6IFwiXjYuMC4zXCIsXG5cdFx0XHR9LFxuXHRcdH0sXG5cdFx0bnVsbCxcblx0XHQyLFxuXHQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQVBQX1BBQ0tBR0VfSlNPTihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuXHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoXG5cdFx0e1xuXHRcdFx0bmFtZTogYEAke25hbWV9L2FwcGAsXG5cdFx0XHR2ZXJzaW9uOiBcIjAuMC4xXCIsXG5cdFx0XHR0eXBlOiBcIm1vZHVsZVwiLFxuXHRcdFx0bWFpbjogXCJzcmMvbWFpbi50c1wiLFxuXHRcdH0sXG5cdFx0bnVsbCxcblx0XHQyLFxuXHQpO1xufVxuXG5leHBvcnQgY29uc3QgVFNDT05GSUcgPSBKU09OLnN0cmluZ2lmeShcblx0e1xuXHRcdGNvbXBpbGVyT3B0aW9uczoge1xuXHRcdFx0dGFyZ2V0OiBcIkVTMjAyMlwiLFxuXHRcdFx0bW9kdWxlOiBcIk5vZGVOZXh0XCIsXG5cdFx0XHRtb2R1bGVSZXNvbHV0aW9uOiBcIk5vZGVOZXh0XCIsXG5cdFx0XHRzdHJpY3Q6IHRydWUsXG5cdFx0XHRza2lwTGliQ2hlY2s6IHRydWUsXG5cdFx0fSxcblx0XHRpbmNsdWRlOiBbXCJwcm9qZWN0c1wiXSxcblx0fSxcblx0bnVsbCxcblx0Mixcbik7XG5cbmV4cG9ydCBjb25zdCBNQUlOX1RTID0gYGNvbnNvbGUubG9nKFwiSGVsbG8gZnJvbSBEZWNvaGVyZSFcIik7XG5gO1xuXG5leHBvcnQgY29uc3QgV0VCX0FQSV9UU0NPTkZJRyA9IEpTT04uc3RyaW5naWZ5KFxuXHR7XG5cdFx0Y29tcGlsZXJPcHRpb25zOiB7XG5cdFx0XHR0YXJnZXQ6IFwiRVMyMDIyXCIsXG5cdFx0XHRtb2R1bGU6IFwiTm9kZU5leHRcIixcblx0XHRcdG1vZHVsZVJlc29sdXRpb246IFwiTm9kZU5leHRcIixcblx0XHRcdHN0cmljdDogdHJ1ZSxcblx0XHRcdHNraXBMaWJDaGVjazogdHJ1ZSxcblx0XHRcdGV4cGVyaW1lbnRhbERlY29yYXRvcnM6IHRydWUsXG5cdFx0XHRlbWl0RGVjb3JhdG9yTWV0YWRhdGE6IHRydWUsXG5cdFx0fSxcblx0XHRpbmNsdWRlOiBbXCJwcm9qZWN0c1wiXSxcblx0fSxcblx0bnVsbCxcblx0Mixcbik7XG5cbmV4cG9ydCBmdW5jdGlvbiBXRUJfQVBJX0FQUF9QQUNLQUdFX0pTT04obmFtZTogc3RyaW5nKTogc3RyaW5nIHtcblx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KFxuXHRcdHtcblx0XHRcdG5hbWU6IGBAJHtuYW1lfS9hcGlgLFxuXHRcdFx0dmVyc2lvbjogXCIwLjAuMVwiLFxuXHRcdFx0dHlwZTogXCJtb2R1bGVcIixcblx0XHRcdG1haW46IFwic3JjL21haW4udHNcIixcblx0XHRcdGRlcGVuZGVuY2llczoge1xuXHRcdFx0XHRcIkBkZWNvaGVyZS9jb3J0ZXhcIjogXCIwLjAuMS1kZXYuMTVcIixcblx0XHRcdFx0XCJAZGVjb2hlcmUvY3J1Y2libGVcIjogXCIwLjAuMS1kZXYuMTVcIixcblx0XHRcdH0sXG5cdFx0fSxcblx0XHRudWxsLFxuXHRcdDIsXG5cdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBXRUJfQVBJX01BSU5fVFMobmFtZTogc3RyaW5nLCBvcHRzPzogV2ViQXBpT3B0aW9ucyk6IHN0cmluZyB7XG5cdGNvbnN0IGRiSW1wb3J0ID1cblx0XHRvcHRzPy5kYXRhYmFzZSA9PT0gXCJ0eXBlb3JtXCJcblx0XHRcdD8gYGltcG9ydCBcIkBkZWNvaGVyZS9jb2RleC10eXBlb3JtXCI7XG5pbXBvcnQgeyBTYW1wbGVFbnRpdHkgfSBmcm9tIFwiLi9lbnRpdGllcy9zYW1wbGUuZW50aXR5LmpzXCI7XG5pbXBvcnQgeyBTYW1wbGVFbnRpdHlSZXBvc2l0b3J5IH0gZnJvbSBcIi4vcmVwb3NpdG9yaWVzL3NhbXBsZS5yZXBvc2l0b3J5LmpzXCI7XG5gXG5cdFx0XHQ6IFwiXCI7XG5cdGNvbnN0IGRiQ2hhaW4gPVxuXHRcdG9wdHM/LmRhdGFiYXNlID09PSBcInR5cGVvcm1cIlxuXHRcdFx0PyBgXFxuXFx0LndpdGhUeXBlT3JtKHsgZW50aXRpZXM6IFtTYW1wbGVFbnRpdHldLCByZXBvc2l0b3JpZXM6IFtTYW1wbGVFbnRpdHlSZXBvc2l0b3J5XSB9KWBcblx0XHRcdDogXCJcIjtcblx0cmV0dXJuIGBpbXBvcnQgXCJAZGVjb2hlcmUvc2NyaWJlLXBpbm9cIjtcbmltcG9ydCBcIkBkZWNvaGVyZS9jb3J0ZXgvaHR0cFwiO1xuaW1wb3J0IFwiQGRlY29oZXJlL3Byb3RvY29sXCI7XG4ke2RiSW1wb3J0fWltcG9ydCB7IEJ1aWxkZXIgfSBmcm9tIFwiQGRlY29oZXJlL2NvcnRleFwiO1xuaW1wb3J0IHsgRmFzdGlmeVByb3ZpZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9jb3J0ZXgvcHJvdmlkZXJzXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHsgWWFtbERhdGFTb3VyY2UgfSBmcm9tIFwiQGRlY29oZXJlL3Byb3RvY29sXCI7XG5pbXBvcnQgeyBIZWxsb0NvbnRyb2xsZXIgfSBmcm9tIFwiLi9jb250cm9sbGVycy9oZWxsby5jb250cm9sbGVyLmpzXCI7XG5pbXBvcnQgeyBTYW1wbGVTZXJ2aWNlIH0gZnJvbSBcIi4vc2FtcGxlLnNlcnZpY2UuanNcIjtcblxuc2NyaWJlLmV4dGVuZC53aXRoUGlub1ByZXR0eSgpO1xuXG5jb25zdCBhcHAgPSBhd2FpdCBCdWlsZGVyLmNyZWF0ZSh7IGFwcGxpY2F0aW9uTmFtZTogXCIke25hbWV9LmFwaVwiIH0pXG5cXHQud2l0aEh0dHBQcm92aWRlcihGYXN0aWZ5UHJvdmlkZXIpXG5cXHQud2l0aENvbmZpZ3VyYXRpb24oWWFtbERhdGFTb3VyY2UpXG5cXHQud2l0aFNlcnZpY2VzKChjYikgPT4ge1xuXFx0XFx0Y2IucmVnaXN0ZXJTaW5nbGV0b24oU2FtcGxlU2VydmljZSk7XG5cXHR9KSR7ZGJDaGFpbn1cblxcdC53aXRoQ29udHJvbGxlcnMoSGVsbG9Db250cm9sbGVyKVxuXFx0LmJ1aWxkKCk7XG5cbmF3YWl0IGFwcC5zdGFydCh7IHBvcnQ6IDMwMDAgfSk7XG5cbmV4cG9ydCBkZWZhdWx0IGFwcDtcbmA7XG59XG5cbmV4cG9ydCBjb25zdCBIRUxMT19DT05UUk9MTEVSX1RTID0gYGltcG9ydCB7IENvbnRyb2xsZXIsIERlbGV0ZSwgRmllbGQsIEdldCwgUGFyYW0sIFBvc3QsIFB1dCwgUXVlcnkgfSBmcm9tIFwiQGRlY29oZXJlL2NvcnRleFwiO1xuaW1wb3J0IHsgU2FtcGxlU2VydmljZSB9IGZyb20gXCIuLi9zYW1wbGUuc2VydmljZS5qc1wiO1xuXG5jbGFzcyBIZWxsb0JvZHkge1xuXHRARmllbGQoXCJib2R5XCIsIFwibWVzc2FnZVwiKVxuXHRwdWJsaWMgbWVzc2FnZSE6IHN0cmluZztcbn1cblxuQENvbnRyb2xsZXIoeyBwcmVmaXg6IFwiL2hlbGxvXCIgfSlcbmV4cG9ydCBjbGFzcyBIZWxsb0NvbnRyb2xsZXIge1xuXHRwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBzYW1wbGU6IFNhbXBsZVNlcnZpY2UpIHt9XG5cblx0QEdldCgpXG5cdHB1YmxpYyBhc3luYyBnZXRBbGwoQFF1ZXJ5KFwiZmlsdGVyXCIpIGZpbHRlcjogc3RyaW5nKSB7XG5cdFx0Y29uc3QgZ3JlZXRpbmcgPSBhd2FpdCB0aGlzLnNhbXBsZS5nZXRHcmVldGluZygpO1xuXHRcdHJldHVybiB7IGZpbHRlciwgbWVzc2FnZTogZ3JlZXRpbmcgfTtcblx0fVxuXG5cdEBHZXQoXCIvOmlkXCIpXG5cdHB1YmxpYyBnZXRPbmUoQFBhcmFtKFwiaWRcIikgaWQ6IHN0cmluZykge1xuXHRcdHJldHVybiB7IGlkLCBtZXNzYWdlOiBcXGBIZWxsbyBcXCR7aWR9IVxcYCB9O1xuXHR9XG5cblx0QFBvc3QoXCIvXCIpXG5cdHB1YmxpYyBjcmVhdGUoYm9keTogSGVsbG9Cb2R5KSB7XG5cdFx0cmV0dXJuIHsgbWVzc2FnZTogYm9keS5tZXNzYWdlIH07XG5cdH1cblxuXHRAUHV0KFwiLzppZFwiKVxuXHRwdWJsaWMgdXBkYXRlKEBQYXJhbShcImlkXCIpIGlkOiBzdHJpbmcsIGJvZHk6IEhlbGxvQm9keSkge1xuXHRcdHJldHVybiB7IGlkLCBtZXNzYWdlOiBib2R5Lm1lc3NhZ2UgfTtcblx0fVxuXG5cdEBEZWxldGUoXCIvOmlkXCIpXG5cdHB1YmxpYyByZW1vdmUoQFBhcmFtKFwiaWRcIikgaWQ6IHN0cmluZykge1xuXHRcdHJldHVybiB7IGlkLCBkZWxldGVkOiB0cnVlIH07XG5cdH1cbn1cbmA7XG5cbmV4cG9ydCBjb25zdCBTQU1QTEVfQ09ORklHX1RTID0gYGV4cG9ydCBjbGFzcyBTYW1wbGVDb25maWcge1xuXHRwdWJsaWMgZ3JlZXRpbmc6IHN0cmluZyA9IFwiXCI7XG59XG5gO1xuXG5leHBvcnQgY29uc3QgU0FNUExFX1NFUlZJQ0VfVFMgPSBgaW1wb3J0IHsgaW5qZWN0LCBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgeyBDb25maWd1cmF0aW9uU2VydmljZVRva2VuIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jb25maWd1cmF0aW9uXCI7XG5pbXBvcnQgdHlwZSB7IElDb25maWd1cmF0aW9uU2VydmljZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY29uZmlndXJhdGlvblwiO1xuaW1wb3J0IHsgU2FtcGxlQ29uZmlnIH0gZnJvbSBcIi4vc2FtcGxlLmNvbmZpZy5qc1wiO1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2FtcGxlU2VydmljZSB7XG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihcblx0XHRAaW5qZWN0KENvbmZpZ3VyYXRpb25TZXJ2aWNlVG9rZW4pIHByaXZhdGUgcmVhZG9ubHkgY29uZmlnOiBJQ29uZmlndXJhdGlvblNlcnZpY2UsXG5cdCkge31cblxuXHRwdWJsaWMgYXN5bmMgZ2V0R3JlZXRpbmcoKTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRjb25zdCBjb25maWcgPSBhd2FpdCB0aGlzLmNvbmZpZy5nZXQoU2FtcGxlQ29uZmlnKTtcblx0XHRyZXR1cm4gY29uZmlnLmdyZWV0aW5nO1xuXHR9XG59XG5gO1xuXG5leHBvcnQgZnVuY3Rpb24gQ09ORklHX1lBTUwobmFtZTogc3RyaW5nLCBvcHRzPzogV2ViQXBpT3B0aW9ucyk6IHN0cmluZyB7XG5cdGNvbnN0IGRiU2VjdGlvbiA9XG5cdFx0b3B0cz8uZGF0YWJhc2UgPT09IFwidHlwZW9ybVwiXG5cdFx0XHQ/IGBkYXRhYmFzZTpcbiAgZGF0YVNvdXJjZXM6XG4gICAgLSBuYW1lOiBkZWZhdWx0XG4gICAgICBwcm92aWRlcjogcG9zdGdyZXNcbiAgICAgIGhvc3Q6IGxvY2FsaG9zdFxuICAgICAgcG9ydDogNTQzMlxuICAgICAgZGF0YWJhc2U6ICR7bmFtZX1fZGV2XG4gICAgICB1c2VybmFtZTogcG9zdGdyZXNcbiAgICAgIHBhc3N3b3JkOiBwb3N0Z3Jlc1xuICAgICAgc3luY2hyb25pemU6IHRydWVcbiAgICAgIHNlZWQ6IGZhbHNlXG4gICAgICBhZG1pblVzZXI6IHBvc3RncmVzXG4gICAgICBhZG1pblBhc3N3b3JkOiBwb3N0Z3Jlc1xuYFxuXHRcdFx0OiBcIlwiO1xuXHRyZXR1cm4gYHNhbXBsZTpcbiAgZ3JlZXRpbmc6IEhlbGxvIGZyb20gY29uZmlndXJhdGlvbiFcbiR7ZGJTZWN0aW9ufWA7XG59XG5cbmV4cG9ydCBjb25zdCBDT05GSUdfREVWX1lBTUwgPSBgc2FtcGxlOlxuICBncmVldGluZzogSGVsbG8gZnJvbSBkZXYgY29uZmlndXJhdGlvbiFcbmA7XG5cbmV4cG9ydCBjb25zdCBDT05GSUdfUFJPRF9ZQU1MID0gYGRhdGFiYXNlOlxuICBkYXRhU291cmNlczpcbiAgICAtIG5hbWU6IGRlZmF1bHRcbiAgICAgIHByb3ZpZGVyOiBwb3N0Z3Jlc1xuICAgICAgaG9zdDogXFwke0RCX0hPU1R9XG4gICAgICBwb3J0OiBcXCR7REJfUE9SVH1cbiAgICAgIGRhdGFiYXNlOiBcXCR7REJfTkFNRX1cbiAgICAgIHVzZXJuYW1lOiBcXCR7REJfVVNFUn1cbiAgICAgIHBhc3N3b3JkOiBcXCR7REJfUEFTU1dPUkR9XG4gICAgICBzeW5jaHJvbml6ZTogZmFsc2VcbiAgICAgIHNlZWQ6IGZhbHNlXG4gICAgICBhZG1pblVzZXI6IFxcJHtEQl9BRE1JTl9VU0VSfVxuICAgICAgYWRtaW5QYXNzd29yZDogXFwke0RCX0FETUlOX1BBU1NXT1JEfVxuYDtcblxuZXhwb3J0IGNvbnN0IFNBTVBMRV9FTlRJVFlfVFMgPSBgaW1wb3J0IHsgQ29sdW1uLCBFbnRpdHksIFByaW1hcnlHZW5lcmF0ZWRDb2x1bW4gfSBmcm9tIFwidHlwZW9ybVwiO1xuaW1wb3J0IHR5cGUgeyBFbnRpdHkgYXMgSUVudGl0eSB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXhcIjtcblxuQEVudGl0eSgpXG5leHBvcnQgY2xhc3MgU2FtcGxlRW50aXR5IGltcGxlbWVudHMgSUVudGl0eSB7XG5cXHRAUHJpbWFyeUdlbmVyYXRlZENvbHVtbigpXG5cXHRwdWJsaWMgaWQhOiBudW1iZXI7XG5cblxcdEBDb2x1bW4oKVxuXFx0cHVibGljIG5hbWUhOiBzdHJpbmc7XG59XG5gO1xuXG5leHBvcnQgY29uc3QgU0FNUExFX1JFUE9TSVRPUllfVFMgPSBgaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHsgaW5qZWN0VW5pdE9mV29yayB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXhcIjtcbmltcG9ydCB7IFR5cGVPcm1SZXBvc2l0b3J5LCBUeXBlT3JtVW5pdE9mV29yayB9IGZyb20gXCJAZGVjb2hlcmUvY29kZXgtdHlwZW9ybVwiO1xuaW1wb3J0IHsgU2FtcGxlRW50aXR5IH0gZnJvbSBcIi4uL2VudGl0aWVzL3NhbXBsZS5lbnRpdHkuanNcIjtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNhbXBsZUVudGl0eVJlcG9zaXRvcnkgZXh0ZW5kcyBUeXBlT3JtUmVwb3NpdG9yeTxTYW1wbGVFbnRpdHk+IHtcblxcdHB1YmxpYyBjb25zdHJ1Y3RvcihAaW5qZWN0VW5pdE9mV29yaygpIHVuaXRPZldvcms6IFR5cGVPcm1Vbml0T2ZXb3JrKSB7XG5cXHRcXHRzdXBlcih1bml0T2ZXb3JrLCBTYW1wbGVFbnRpdHkpO1xuXFx0fVxufVxuYDtcbiJdLCJuYW1lcyI6WyJBUFBfUEFDS0FHRV9KU09OIiwiQ09ORklHX0RFVl9ZQU1MIiwiQ09ORklHX1BST0RfWUFNTCIsIkNPTkZJR19ZQU1MIiwiSEVMTE9fQ09OVFJPTExFUl9UUyIsIk1BSU5fVFMiLCJST09UX1BBQ0tBR0VfSlNPTiIsIlNBTVBMRV9DT05GSUdfVFMiLCJTQU1QTEVfRU5USVRZX1RTIiwiU0FNUExFX1JFUE9TSVRPUllfVFMiLCJTQU1QTEVfU0VSVklDRV9UUyIsIlRTQ09ORklHIiwiV0VCX0FQSV9BUFBfUEFDS0FHRV9KU09OIiwiV0VCX0FQSV9NQUlOX1RTIiwiV0VCX0FQSV9ST09UX1BBQ0tBR0VfSlNPTiIsIldFQl9BUElfVFNDT05GSUciLCJuYW1lIiwiSlNPTiIsInN0cmluZ2lmeSIsInZlcnNpb24iLCJ0eXBlIiwic2NyaXB0cyIsImJ1aWxkIiwiZGV2IiwiZGV2RGVwZW5kZW5jaWVzIiwidHlwZXNjcmlwdCIsIm9wdHMiLCJkZXBzIiwiZGF0YWJhc2UiLCJkZXBlbmRlbmNpZXMiLCJtYWluIiwiY29tcGlsZXJPcHRpb25zIiwidGFyZ2V0IiwibW9kdWxlIiwibW9kdWxlUmVzb2x1dGlvbiIsInN0cmljdCIsInNraXBMaWJDaGVjayIsImluY2x1ZGUiLCJleHBlcmltZW50YWxEZWNvcmF0b3JzIiwiZW1pdERlY29yYXRvck1ldGFkYXRhIiwiZGJJbXBvcnQiLCJkYkNoYWluIiwiZGJTZWN0aW9uIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7OztRQTREZ0JBO2VBQUFBOztRQThMSEM7ZUFBQUE7O1FBSUFDO2VBQUFBOztRQTNCR0M7ZUFBQUE7O1FBL0RIQztlQUFBQTs7UUE1RUFDO2VBQUFBOztRQXhGR0M7ZUFBQUE7O1FBNE1IQztlQUFBQTs7UUFpRUFDO2VBQUFBOztRQWFBQztlQUFBQTs7UUF6RUFDO2VBQUFBOztRQXhJQUM7ZUFBQUE7O1FBbUNHQztlQUFBQTs7UUFpQkFDO2VBQUFBOztRQWxHQUM7ZUFBQUE7O1FBZ0VIQztlQUFBQTs7O0FBM0ZOLFNBQVNULGtCQUFrQlUsSUFBWTtJQUM3QyxPQUFPQyxLQUFLQyxTQUFTLENBQ3BCO1FBQ0NGO1FBQ0FHLFNBQVM7UUFDVEMsTUFBTTtRQUNOQyxTQUFTO1lBQ1JDLE9BQU87WUFDUCxlQUFl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
|
package/es6/src/scaffold.js
DELETED
|
@@ -1,79 +0,0 @@
|
|
|
1
|
-
import { existsSync, readdirSync } from "node:fs";
|
|
2
|
-
import { mkdir, writeFile } from "node:fs/promises";
|
|
3
|
-
import { basename, join } from "node:path";
|
|
4
|
-
import { createInterface } from "node:readline/promises";
|
|
5
|
-
import { detectPackageManager, promptForPackageManager } from "@decohere/nexus/interop";
|
|
6
|
-
import { APP_PACKAGE_JSON, CONFIG_DEV_YAML, CONFIG_PROD_YAML, CONFIG_YAML, HELLO_CONTROLLER_TS, MAIN_TS, ROOT_PACKAGE_JSON, SAMPLE_CONFIG_TS, SAMPLE_ENTITY_TS, SAMPLE_REPOSITORY_TS, SAMPLE_SERVICE_TS, TSCONFIG, WEB_API_APP_PACKAGE_JSON, WEB_API_MAIN_TS, WEB_API_ROOT_PACKAGE_JSON, WEB_API_TSCONFIG } from "./templates.js";
|
|
7
|
-
export async function scaffold(targetDir, opts) {
|
|
8
|
-
const name = basename(targetDir);
|
|
9
|
-
if (existsSync(targetDir) && readdirSync(targetDir).length > 0 && !opts.yes) {
|
|
10
|
-
const rl = createInterface({
|
|
11
|
-
input: process.stdin,
|
|
12
|
-
output: process.stdout
|
|
13
|
-
});
|
|
14
|
-
const answer = await rl.question(`Directory "${name}" is not empty. Continue? [y/N] `);
|
|
15
|
-
rl.close();
|
|
16
|
-
if (!answer.trim().toLowerCase().startsWith("y")) {
|
|
17
|
-
console.log("Aborted.");
|
|
18
|
-
process.exit(0);
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
if (opts.template === "webapi") {
|
|
22
|
-
const dbOpts = opts.database ? {
|
|
23
|
-
database: opts.database
|
|
24
|
-
} : undefined;
|
|
25
|
-
await mkdir(join(targetDir, "projects", "api", "src", "controllers"), {
|
|
26
|
-
recursive: true
|
|
27
|
-
});
|
|
28
|
-
await mkdir(join(targetDir, "config"), {
|
|
29
|
-
recursive: true
|
|
30
|
-
});
|
|
31
|
-
const writes = [
|
|
32
|
-
writeFile(join(targetDir, "package.json"), WEB_API_ROOT_PACKAGE_JSON(name, dbOpts)),
|
|
33
|
-
writeFile(join(targetDir, "tsconfig.json"), WEB_API_TSCONFIG),
|
|
34
|
-
writeFile(join(targetDir, "projects", "api", "package.json"), WEB_API_APP_PACKAGE_JSON(name)),
|
|
35
|
-
writeFile(join(targetDir, "projects", "api", "src", "main.ts"), WEB_API_MAIN_TS(name, dbOpts)),
|
|
36
|
-
writeFile(join(targetDir, "projects", "api", "src", "controllers", "hello.controller.ts"), HELLO_CONTROLLER_TS),
|
|
37
|
-
writeFile(join(targetDir, "projects", "api", "src", "sample.config.ts"), SAMPLE_CONFIG_TS),
|
|
38
|
-
writeFile(join(targetDir, "projects", "api", "src", "sample.service.ts"), SAMPLE_SERVICE_TS),
|
|
39
|
-
writeFile(join(targetDir, "config", "config.yaml"), CONFIG_YAML(name, dbOpts)),
|
|
40
|
-
writeFile(join(targetDir, "config", "config.dev.yaml"), CONFIG_DEV_YAML)
|
|
41
|
-
];
|
|
42
|
-
if (opts.database === "typeorm") {
|
|
43
|
-
await mkdir(join(targetDir, "projects", "api", "src", "entities"), {
|
|
44
|
-
recursive: true
|
|
45
|
-
});
|
|
46
|
-
await mkdir(join(targetDir, "projects", "api", "src", "repositories"), {
|
|
47
|
-
recursive: true
|
|
48
|
-
});
|
|
49
|
-
writes.push(writeFile(join(targetDir, "projects", "api", "src", "entities", "sample.entity.ts"), SAMPLE_ENTITY_TS), writeFile(join(targetDir, "projects", "api", "src", "repositories", "sample.repository.ts"), SAMPLE_REPOSITORY_TS), writeFile(join(targetDir, "config", "config.prod.yaml"), CONFIG_PROD_YAML));
|
|
50
|
-
}
|
|
51
|
-
await Promise.all(writes);
|
|
52
|
-
} else {
|
|
53
|
-
await mkdir(join(targetDir, "projects", "app", "src"), {
|
|
54
|
-
recursive: true
|
|
55
|
-
});
|
|
56
|
-
await Promise.all([
|
|
57
|
-
writeFile(join(targetDir, "package.json"), ROOT_PACKAGE_JSON(name)),
|
|
58
|
-
writeFile(join(targetDir, "tsconfig.json"), TSCONFIG),
|
|
59
|
-
writeFile(join(targetDir, "projects", "app", "package.json"), APP_PACKAGE_JSON(name)),
|
|
60
|
-
writeFile(join(targetDir, "projects", "app", "src", "main.ts"), MAIN_TS)
|
|
61
|
-
]);
|
|
62
|
-
}
|
|
63
|
-
console.log(`\nScaffolded ${name}. Installing dependencies...\n`);
|
|
64
|
-
let pm = detectPackageManager(targetDir);
|
|
65
|
-
if (pm == null) {
|
|
66
|
-
pm = await promptForPackageManager();
|
|
67
|
-
}
|
|
68
|
-
await pm.install({
|
|
69
|
-
cwd: targetDir
|
|
70
|
-
});
|
|
71
|
-
console.log(`\nDone! Next steps:\n`);
|
|
72
|
-
if (basename(targetDir) !== targetDir) {
|
|
73
|
-
console.log(` cd ${name}`);
|
|
74
|
-
}
|
|
75
|
-
console.log(" pnpm build # forge build");
|
|
76
|
-
console.log(" pnpm dev # flux serve\n");
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2NyZWF0ZS9zcmMvc2NhZmZvbGQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYywgcmVhZGRpclN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0IHsgbWtkaXIsIHdyaXRlRmlsZSB9IGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBiYXNlbmFtZSwgam9pbiB9IGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGNyZWF0ZUludGVyZmFjZSB9IGZyb20gXCJub2RlOnJlYWRsaW5lL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBkZXRlY3RQYWNrYWdlTWFuYWdlciwgcHJvbXB0Rm9yUGFja2FnZU1hbmFnZXIgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2ludGVyb3BcIjtcbmltcG9ydCB7XG5cdEFQUF9QQUNLQUdFX0pTT04sXG5cdENPTkZJR19ERVZfWUFNTCxcblx0Q09ORklHX1BST0RfWUFNTCxcblx0Q09ORklHX1lBTUwsXG5cdEhFTExPX0NPTlRST0xMRVJfVFMsXG5cdE1BSU5fVFMsXG5cdFJPT1RfUEFDS0FHRV9KU09OLFxuXHRTQU1QTEVfQ09ORklHX1RTLFxuXHRTQU1QTEVfRU5USVRZX1RTLFxuXHRTQU1QTEVfUkVQT1NJVE9SWV9UUyxcblx0U0FNUExFX1NFUlZJQ0VfVFMsXG5cdFRTQ09ORklHLFxuXHRXRUJfQVBJX0FQUF9QQUNLQUdFX0pTT04sXG5cdFdFQl9BUElfTUFJTl9UUyxcblx0V0VCX0FQSV9ST09UX1BBQ0tBR0VfSlNPTixcblx0V0VCX0FQSV9UU0NPTkZJRyxcbn0gZnJvbSBcIi4vdGVtcGxhdGVzLmpzXCI7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2NhZmZvbGRPcHRpb25zIHtcblx0eWVzPzogYm9vbGVhbjtcblx0dGVtcGxhdGU/OiBcImJhc2ljXCIgfCBcIndlYmFwaVwiO1xuXHRkYXRhYmFzZT86IFwidHlwZW9ybVwiO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gc2NhZmZvbGQodGFyZ2V0RGlyOiBzdHJpbmcsIG9wdHM6IFNjYWZmb2xkT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuXHRjb25zdCBuYW1lID0gYmFzZW5hbWUodGFyZ2V0RGlyKTtcblxuXHRpZiAoZXhpc3RzU3luYyh0YXJnZXREaXIpICYmIHJlYWRkaXJTeW5jKHRhcmdldERpcikubGVuZ3RoID4gMCAmJiAhb3B0cy55ZXMpIHtcblx0XHRjb25zdCBybCA9IGNyZWF0ZUludGVyZmFjZSh7XG5cdFx0XHRpbnB1dDogcHJvY2Vzcy5zdGRpbixcblx0XHRcdG91dHB1dDogcHJvY2Vzcy5zdGRvdXQsXG5cdFx0fSk7XG5cdFx0Y29uc3QgYW5zd2VyID0gYXdhaXQgcmwucXVlc3Rpb24oYERpcmVjdG9yeSBcIiR7bmFtZX1cIiBpcyBub3QgZW1wdHkuIENvbnRpbnVlPyBbeS9OXSBgKTtcblx0XHRybC5jbG9zZSgpO1xuXHRcdGlmICghYW5zd2VyLnRyaW0oKS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoXCJ5XCIpKSB7XG5cdFx0XHRjb25zb2xlLmxvZyhcIkFib3J0ZWQuXCIpO1xuXHRcdFx0cHJvY2Vzcy5leGl0KDApO1xuXHRcdH1cblx0fVxuXG5cdGlmIChvcHRzLnRlbXBsYXRlID09PSBcIndlYmFwaVwiKSB7XG5cdFx0Y29uc3QgZGJPcHRzID0gb3B0cy5kYXRhYmFzZSA/IHsgZGF0YWJhc2U6IG9wdHMuZGF0YWJhc2UgfSA6IHVuZGVmaW5lZDtcblx0XHRhd2FpdCBta2Rpcihqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwaVwiLCBcInNyY1wiLCBcImNvbnRyb2xsZXJzXCIpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblx0XHRhd2FpdCBta2Rpcihqb2luKHRhcmdldERpciwgXCJjb25maWdcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdGNvbnN0IHdyaXRlcyA9IFtcblx0XHRcdHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJwYWNrYWdlLmpzb25cIiksIFdFQl9BUElfUk9PVF9QQUNLQUdFX0pTT04obmFtZSwgZGJPcHRzKSksXG5cdFx0XHR3cml0ZUZpbGUoam9pbih0YXJnZXREaXIsIFwidHNjb25maWcuanNvblwiKSwgV0VCX0FQSV9UU0NPTkZJRyksXG5cdFx0XHR3cml0ZUZpbGUoXG5cdFx0XHRcdGpvaW4odGFyZ2V0RGlyLCBcInByb2plY3RzXCIsIFwiYXBpXCIsIFwicGFja2FnZS5qc29uXCIpLFxuXHRcdFx0XHRXRUJfQVBJX0FQUF9QQUNLQUdFX0pTT04obmFtZSksXG5cdFx0XHQpLFxuXHRcdFx0d3JpdGVGaWxlKFxuXHRcdFx0XHRqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwaVwiLCBcInNyY1wiLCBcIm1haW4udHNcIiksXG5cdFx0XHRcdFdFQl9BUElfTUFJTl9UUyhuYW1lLCBkYk9wdHMpLFxuXHRcdFx0KSxcblx0XHRcdHdyaXRlRmlsZShcblx0XHRcdFx0am9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcGlcIiwgXCJzcmNcIiwgXCJjb250cm9sbGVyc1wiLCBcImhlbGxvLmNvbnRyb2xsZXIudHNcIiksXG5cdFx0XHRcdEhFTExPX0NPTlRST0xMRVJfVFMsXG5cdFx0XHQpLFxuXHRcdFx0d3JpdGVGaWxlKFxuXHRcdFx0XHRqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwaVwiLCBcInNyY1wiLCBcInNhbXBsZS5jb25maWcudHNcIiksXG5cdFx0XHRcdFNBTVBMRV9DT05GSUdfVFMsXG5cdFx0XHQpLFxuXHRcdFx0d3JpdGVGaWxlKFxuXHRcdFx0XHRqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwaVwiLCBcInNyY1wiLCBcInNhbXBsZS5zZXJ2aWNlLnRzXCIpLFxuXHRcdFx0XHRTQU1QTEVfU0VSVklDRV9UUyxcblx0XHRcdCksXG5cdFx0XHR3cml0ZUZpbGUoam9pbih0YXJnZXREaXIsIFwiY29uZmlnXCIsIFwiY29uZmlnLnlhbWxcIiksIENPTkZJR19ZQU1MKG5hbWUsIGRiT3B0cykpLFxuXHRcdFx0d3JpdGVGaWxlKGpvaW4odGFyZ2V0RGlyLCBcImNvbmZpZ1wiLCBcImNvbmZpZy5kZXYueWFtbFwiKSwgQ09ORklHX0RFVl9ZQU1MKSxcblx0XHRdO1xuXHRcdGlmIChvcHRzLmRhdGFiYXNlID09PSBcInR5cGVvcm1cIikge1xuXHRcdFx0YXdhaXQgbWtkaXIoam9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcGlcIiwgXCJzcmNcIiwgXCJlbnRpdGllc1wiKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRhd2FpdCBta2Rpcihqb2luKHRhcmdldERpciwgXCJwcm9qZWN0c1wiLCBcImFwaVwiLCBcInNyY1wiLCBcInJlcG9zaXRvcmllc1wiKSwge1xuXHRcdFx0XHRyZWN1cnNpdmU6IHRydWUsXG5cdFx0XHR9KTtcblx0XHRcdHdyaXRlcy5wdXNoKFxuXHRcdFx0XHR3cml0ZUZpbGUoXG5cdFx0XHRcdFx0am9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcGlcIiwgXCJzcmNcIiwgXCJlbnRpdGllc1wiLCBcInNhbXBsZS5lbnRpdHkudHNcIiksXG5cdFx0XHRcdFx0U0FNUExFX0VOVElUWV9UUyxcblx0XHRcdFx0KSxcblx0XHRcdFx0d3JpdGVGaWxlKFxuXHRcdFx0XHRcdGpvaW4odGFyZ2V0RGlyLCBcInByb2plY3RzXCIsIFwiYXBpXCIsIFwic3JjXCIsIFwicmVwb3NpdG9yaWVzXCIsIFwic2FtcGxlLnJlcG9zaXRvcnkudHNcIiksXG5cdFx0XHRcdFx0U0FNUExFX1JFUE9TSVRPUllfVFMsXG5cdFx0XHRcdCksXG5cdFx0XHRcdHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJjb25maWdcIiwgXCJjb25maWcucHJvZC55YW1sXCIpLCBDT05GSUdfUFJPRF9ZQU1MKSxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGF3YWl0IFByb21pc2UuYWxsKHdyaXRlcyk7XG5cdH0gZWxzZSB7XG5cdFx0YXdhaXQgbWtkaXIoam9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcHBcIiwgXCJzcmNcIiksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdGF3YWl0IFByb21pc2UuYWxsKFtcblx0XHRcdHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJwYWNrYWdlLmpzb25cIiksIFJPT1RfUEFDS0FHRV9KU09OKG5hbWUpKSxcblx0XHRcdHdyaXRlRmlsZShqb2luKHRhcmdldERpciwgXCJ0c2NvbmZpZy5qc29uXCIpLCBUU0NPTkZJRyksXG5cdFx0XHR3cml0ZUZpbGUoam9pbih0YXJnZXREaXIsIFwicHJvamVjdHNcIiwgXCJhcHBcIiwgXCJwYWNrYWdlLmpzb25cIiksIEFQUF9QQUNLQUdFX0pTT04obmFtZSkpLFxuXHRcdFx0d3JpdGVGaWxlKGpvaW4odGFyZ2V0RGlyLCBcInByb2plY3RzXCIsIFwiYXBwXCIsIFwic3JjXCIsIFwibWFpbi50c1wiKSwgTUFJTl9UUyksXG5cdFx0XSk7XG5cdH1cblxuXHRjb25zb2xlLmxvZyhgXFxuU2NhZmZvbGRlZCAke25hbWV9LiBJbnN0YWxsaW5nIGRlcGVuZGVuY2llcy4uLlxcbmApO1xuXHRsZXQgcG0gPSBkZXRlY3RQYWNrYWdlTWFuYWdlcih0YXJnZXREaXIpO1xuXHRpZiAocG0gPT0gbnVsbCkge1xuXHRcdHBtID0gYXdhaXQgcHJvbXB0Rm9yUGFja2FnZU1hbmFnZXIoKTtcblx0fVxuXHRhd2FpdCBwbS5pbnN0YWxsKHsgY3dkOiB0YXJnZXREaXIgfSk7XG5cblx0Y29uc29sZS5sb2coYFxcbkRvbmUhIE5leHQgc3RlcHM6XFxuYCk7XG5cdGlmIChiYXNlbmFtZSh0YXJnZXREaXIpICE9PSB0YXJnZXREaXIpIHtcblx0XHRjb25zb2xlLmxvZyhgICBjZCAke25hbWV9YCk7XG5cdH1cblx0Y29uc29sZS5sb2coXCIgIHBucG0gYnVpbGQgICAgICMgZm9yZ2UgYnVpbGRcIik7XG5cdGNvbnNvbGUubG9nKFwiICBwbnBtIGRldiAgICAgICAjIGZsdXggc2VydmVcXG5cIik7XG59XG4iXSwibmFtZXMiOlsiZXhpc3RzU3luYyIsInJlYWRkaXJTeW5jIiwibWtkaXIiLCJ3cml0ZUZpbGUiLCJiYXNlbmFtZSIsImpvaW4iLCJjcmVhdGVJbnRlcmZhY2UiLCJkZXRlY3RQYWNrYWdlTWFuYWdlciIsInByb21wdEZvclBhY2thZ2VNYW5hZ2VyIiwiQVBQX1BBQ0tBR0VfSlNPTiIsIkNPTkZJR19ERVZfWUFNTCIsIkNPTkZJR19QUk9EX1lBTUwiLCJDT05GSUdfWUFNTCIsIkhFTExPX0NPTlRST0xMRVJfVFMiLCJNQUlOX1RTIiwiUk9PVF9QQUNLQUdFX0pTT04iLCJTQU1QTEVfQ09ORklHX1RTIiwiU0FNUExFX0VOVElUWV9UUyIsIlNBTVBMRV9SRVBPU0lUT1JZX1RTIiwiU0FNUExFX1NFUlZJQ0VfVFMiLCJUU0NPTkZJRyIsIldFQl9BUElfQVBQX1BBQ0tBR0VfSlNPTiIsIldFQl9BUElfTUFJTl9UUyIsIldFQl9BUElfUk9PVF9QQUNLQUdFX0pTT04iLCJXRUJfQVBJX1RTQ09ORklHIiwic2NhZmZvbGQiLCJ0YXJnZXREaXIiLCJvcHRzIiwibmFtZSIsImxlbmd0aCIsInllcyIsInJsIiwiaW5wdXQiLCJwcm9jZXNzIiwic3RkaW4iLCJvdXRwdXQiLCJzdGRvdXQiLCJhbnN3ZXIiLCJxdWVzdGlvbiIsImNsb3NlIiwidHJpbSIsInRvTG93ZXJDYXNlIiwic3RhcnRzV2l0aCIsImNvbnNvbGUiLCJsb2ciLCJleGl0IiwidGVtcGxhdGUiLCJkYk9wdHMiLCJkYXRhYmFzZSIsInVuZGVmaW5lZCIsInJlY3Vyc2l2ZSIsIndyaXRlcyIsInB1c2giLCJQcm9taXNlIiwiYWxsIiwicG0iLCJpbnN0YWxsIiwiY3dkIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxVQUFVLEVBQUVDLFdBQVcsUUFBUSxVQUFVO0FBQ2xELFNBQVNDLEtBQUssRUFBRUMsU0FBUyxRQUFRLG1CQUFtQjtBQUNwRCxTQUFTQyxRQUFRLEVBQUVDLElB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
|