@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.
Files changed (93) hide show
  1. package/commonjs/src/cli.js +30 -5
  2. package/commonjs/src/domain/prompt.js +55 -0
  3. package/commonjs/src/models/compose.model.js +82 -0
  4. package/commonjs/src/models/config-yaml.model.js +34 -0
  5. package/commonjs/src/models/const.js +29 -0
  6. package/commonjs/src/models/container-image.model.js +88 -0
  7. package/commonjs/src/models/dev-container.model.js +73 -0
  8. package/commonjs/src/models/env-file.model.js +33 -0
  9. package/commonjs/src/models/gitignore.model.js +32 -0
  10. package/commonjs/src/models/launch-json.model.js +52 -0
  11. package/commonjs/src/models/package-json.model.js +64 -0
  12. package/commonjs/src/models/project.model.js +126 -0
  13. package/commonjs/src/models/source-file.js +6 -0
  14. package/commonjs/src/models/tsconfig.model.js +34 -0
  15. package/commonjs/src/models/vscode-settings.model.js +31 -0
  16. package/commonjs/src/runner.js +56 -0
  17. package/commonjs/src/services/scaffold.service.js +62 -0
  18. package/commonjs/src/version.js +32 -0
  19. package/commonjs/src/webapi/create-api.js +169 -0
  20. package/commonjs/src/webapi/features/auth.feature.js +166 -0
  21. package/commonjs/src/webapi/features/auth0-cli.js +151 -0
  22. package/commonjs/src/webapi/features/database.feature.js +151 -0
  23. package/commonjs/src/webapi/features/finalize.feature.js +51 -0
  24. package/commonjs/src/webapi/features/postman.feature.js +309 -0
  25. package/commonjs/src/webapi/models/api-package-json.model.js +57 -0
  26. package/commonjs/src/webapi/models/auth-config.model.js +23 -0
  27. package/commonjs/src/webapi/models/controller-source-file.model.js +180 -0
  28. package/commonjs/src/webapi/models/main-source-file.model.js +132 -0
  29. package/commonjs/src/webapi/models/sample-files.model.js +60 -0
  30. package/es6/src/cli.js +30 -5
  31. package/es6/src/domain/prompt.js +37 -0
  32. package/es6/src/models/compose.model.js +77 -0
  33. package/es6/src/models/config-yaml.model.js +30 -0
  34. package/es6/src/models/const.js +19 -0
  35. package/es6/src/models/container-image.model.js +84 -0
  36. package/es6/src/models/dev-container.model.js +68 -0
  37. package/es6/src/models/env-file.model.js +29 -0
  38. package/es6/src/models/gitignore.model.js +22 -0
  39. package/es6/src/models/launch-json.model.js +42 -0
  40. package/es6/src/models/package-json.model.js +60 -0
  41. package/es6/src/models/project.model.js +111 -0
  42. package/es6/src/models/source-file.js +3 -0
  43. package/es6/src/models/tsconfig.model.js +24 -0
  44. package/es6/src/models/vscode-settings.model.js +21 -0
  45. package/es6/src/runner.js +55 -0
  46. package/es6/src/services/scaffold.service.js +52 -0
  47. package/es6/src/version.js +22 -0
  48. package/es6/src/webapi/create-api.js +151 -0
  49. package/es6/src/webapi/features/auth.feature.js +115 -0
  50. package/es6/src/webapi/features/auth0-cli.js +116 -0
  51. package/es6/src/webapi/features/database.feature.js +141 -0
  52. package/es6/src/webapi/features/finalize.feature.js +41 -0
  53. package/es6/src/webapi/features/postman.feature.js +258 -0
  54. package/es6/src/webapi/models/api-package-json.model.js +52 -0
  55. package/es6/src/webapi/models/auth-config.model.js +19 -0
  56. package/es6/src/webapi/models/controller-source-file.model.js +171 -0
  57. package/es6/src/webapi/models/main-source-file.model.js +128 -0
  58. package/es6/src/webapi/models/sample-files.model.js +42 -0
  59. package/package.json +2 -2
  60. package/types/src/domain/prompt.d.ts +2 -0
  61. package/types/src/models/compose.model.d.ts +32 -0
  62. package/types/src/models/config-yaml.model.d.ts +16 -0
  63. package/types/src/models/const.d.ts +17 -0
  64. package/types/src/models/container-image.model.d.ts +15 -0
  65. package/types/src/models/dev-container.model.d.ts +21 -0
  66. package/types/src/models/env-file.model.d.ts +14 -0
  67. package/types/src/models/gitignore.model.d.ts +6 -0
  68. package/types/src/models/launch-json.model.d.ts +5 -0
  69. package/types/src/models/package-json.model.d.ts +18 -0
  70. package/types/src/models/project.model.d.ts +55 -0
  71. package/types/src/models/source-file.d.ts +11 -0
  72. package/types/src/models/tsconfig.model.d.ts +5 -0
  73. package/types/src/models/vscode-settings.model.d.ts +7 -0
  74. package/types/src/runner.d.ts +13 -0
  75. package/types/src/services/scaffold.service.d.ts +22 -0
  76. package/types/src/version.d.ts +2 -0
  77. package/types/src/webapi/create-api.d.ts +7 -0
  78. package/types/src/webapi/features/auth.feature.d.ts +7 -0
  79. package/types/src/webapi/features/auth0-cli.d.ts +22 -0
  80. package/types/src/webapi/features/database.feature.d.ts +5 -0
  81. package/types/src/webapi/features/finalize.feature.d.ts +2 -0
  82. package/types/src/webapi/features/postman.feature.d.ts +7 -0
  83. package/types/src/webapi/models/api-package-json.model.d.ts +17 -0
  84. package/types/src/webapi/models/auth-config.model.d.ts +18 -0
  85. package/types/src/webapi/models/controller-source-file.model.d.ts +42 -0
  86. package/types/src/webapi/models/main-source-file.model.d.ts +36 -0
  87. package/types/src/webapi/models/sample-files.model.d.ts +7 -0
  88. package/commonjs/src/scaffold.js +0 -89
  89. package/commonjs/src/templates.js +0 -306
  90. package/es6/src/scaffold.js +0 -79
  91. package/es6/src/templates.js +0 -246
  92. package/types/src/scaffold.d.ts +0 -6
  93. 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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
@@ -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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