@exisjs/cli 0.0.0-stage → 0.10.0-alpha.0

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 (75) hide show
  1. package/README.md +35 -2
  2. package/bin/exisjs.js +2 -0
  3. package/dist/commands/build.d.ts +17 -0
  4. package/dist/commands/build.d.ts.map +1 -0
  5. package/dist/commands/build.js +378 -0
  6. package/dist/commands/build.js.map +1 -0
  7. package/dist/commands/clean.d.ts +5 -0
  8. package/dist/commands/clean.d.ts.map +1 -0
  9. package/dist/commands/clean.js +30 -0
  10. package/dist/commands/clean.js.map +1 -0
  11. package/dist/commands/dev.d.ts +28 -0
  12. package/dist/commands/dev.d.ts.map +1 -0
  13. package/dist/commands/dev.js +884 -0
  14. package/dist/commands/dev.js.map +1 -0
  15. package/dist/commands/doctor.d.ts +2 -0
  16. package/dist/commands/doctor.d.ts.map +1 -0
  17. package/dist/commands/doctor.js +228 -0
  18. package/dist/commands/doctor.js.map +1 -0
  19. package/dist/commands/exports.d.ts +2 -0
  20. package/dist/commands/exports.d.ts.map +1 -0
  21. package/dist/commands/exports.js +48 -0
  22. package/dist/commands/exports.js.map +1 -0
  23. package/dist/commands/generate.d.ts +33 -0
  24. package/dist/commands/generate.d.ts.map +1 -0
  25. package/dist/commands/generate.js +469 -0
  26. package/dist/commands/generate.js.map +1 -0
  27. package/dist/commands/init.d.ts +2 -0
  28. package/dist/commands/init.d.ts.map +1 -0
  29. package/dist/commands/init.js +37 -0
  30. package/dist/commands/init.js.map +1 -0
  31. package/dist/commands/migrate.d.ts +19 -0
  32. package/dist/commands/migrate.d.ts.map +1 -0
  33. package/dist/commands/migrate.js +116 -0
  34. package/dist/commands/migrate.js.map +1 -0
  35. package/dist/commands/repl.d.ts +6 -0
  36. package/dist/commands/repl.d.ts.map +1 -0
  37. package/dist/commands/repl.js +75 -0
  38. package/dist/commands/repl.js.map +1 -0
  39. package/dist/commands/run.d.ts +7 -0
  40. package/dist/commands/run.d.ts.map +1 -0
  41. package/dist/commands/run.js +101 -0
  42. package/dist/commands/run.js.map +1 -0
  43. package/dist/commands/start.d.ts +2 -0
  44. package/dist/commands/start.d.ts.map +1 -0
  45. package/dist/commands/start.js +8 -0
  46. package/dist/commands/start.js.map +1 -0
  47. package/dist/commands/test.d.ts +8 -0
  48. package/dist/commands/test.d.ts.map +1 -0
  49. package/dist/commands/test.js +166 -0
  50. package/dist/commands/test.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +276 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/lib/inspect-routes.d.ts +2 -0
  56. package/dist/lib/inspect-routes.d.ts.map +1 -0
  57. package/dist/lib/inspect-routes.js +150 -0
  58. package/dist/lib/inspect-routes.js.map +1 -0
  59. package/dist/lib/start-repl.d.ts +2 -0
  60. package/dist/lib/start-repl.d.ts.map +1 -0
  61. package/dist/lib/start-repl.js +120 -0
  62. package/dist/lib/start-repl.js.map +1 -0
  63. package/dist/manifest.d.ts +4 -0
  64. package/dist/manifest.d.ts.map +1 -0
  65. package/dist/manifest.js +489 -0
  66. package/dist/manifest.js.map +1 -0
  67. package/dist/routes.d.ts +17 -0
  68. package/dist/routes.d.ts.map +1 -0
  69. package/dist/routes.js +316 -0
  70. package/dist/routes.js.map +1 -0
  71. package/dist/utils.d.ts +24 -0
  72. package/dist/utils.d.ts.map +1 -0
  73. package/dist/utils.js +54 -0
  74. package/dist/utils.js.map +1 -0
  75. package/package.json +58 -4
@@ -0,0 +1,469 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateCrud = void 0;
7
+ exports.generateController = generateController;
8
+ exports.generateModel = generateModel;
9
+ exports.generateService = generateService;
10
+ exports.generateSchema = generateSchema;
11
+ exports.generateBoundary = generateBoundary;
12
+ exports.generateErrorHandler = generateErrorHandler;
13
+ exports.generateCronJob = generateCronJob;
14
+ exports.generateResource = generateResource;
15
+ exports.generatePlugin = generatePlugin;
16
+ exports.generateMiddleware = generateMiddleware;
17
+ exports.generateTest = generateTest;
18
+ const promises_1 = __importDefault(require("node:fs/promises"));
19
+ const node_path_1 = __importDefault(require("node:path"));
20
+ const utils_1 = require("../utils");
21
+ function toPascalCase(name) {
22
+ return name
23
+ .split(/[/_-]+/)
24
+ .filter(Boolean)
25
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
26
+ .join('');
27
+ }
28
+ async function ensureDir(dir) {
29
+ try {
30
+ await promises_1.default.mkdir(dir, { recursive: true });
31
+ }
32
+ catch {
33
+ (0, utils_1.error)(`Could not create directory ${dir}`);
34
+ process.exit(1);
35
+ }
36
+ }
37
+ async function generateController(name, cwd = process.cwd(), options = {}) {
38
+ const targetDir = node_path_1.default.join(cwd, 'src', 'http', name);
39
+ await ensureDir(targetDir);
40
+ const filename = options.named ? `${name}.route.ts` : 'route.ts';
41
+ const filePath = node_path_1.default.join(targetDir, filename);
42
+ try {
43
+ const stat = await promises_1.default.stat(filePath);
44
+ if (stat.isFile()) {
45
+ (0, utils_1.error)(`Route already exists at ${filePath}`);
46
+ process.exit(1);
47
+ }
48
+ }
49
+ catch {
50
+ // File doesn't exist, proceed
51
+ }
52
+ const capitalizedName = toPascalCase(name);
53
+ const code = options.oop
54
+ ? `import { Controller, Get } from 'exisjs/decorators'\n\n@Controller('/${name}')\nexport default class ${capitalizedName}Controller {\n @Get('/')\n async list() {\n return { success: true, data: [] }\n }\n}\n`
55
+ : `import { controller, route } from 'exisjs/router'\n\nexport default controller({\n list: route.get('/', {\n handle: async () => {\n return { success: true, data: [] }\n }\n })\n})\n`;
56
+ await promises_1.default.writeFile(filePath, code);
57
+ (0, utils_1.success)(`Generated ${options.oop ? 'OOP' : 'Functional'} route in src/http/${name}/${filename}`);
58
+ }
59
+ async function generateModel(name, cwd = process.cwd(), options = {}) {
60
+ const targetDir = node_path_1.default.join(cwd, 'src', 'models');
61
+ await ensureDir(targetDir);
62
+ const capitalizedName = toPascalCase(name);
63
+ const filename = options.named ? `${name}.model.ts` : `${capitalizedName}.ts`;
64
+ const code = `export interface ${capitalizedName} {
65
+ id: string
66
+ name: string
67
+ description?: string
68
+ createdAt?: Date
69
+ updatedAt?: Date
70
+ }
71
+
72
+ export type Create${capitalizedName}Input = Omit<${capitalizedName}, 'id' | 'createdAt' | 'updatedAt'>
73
+ export type Update${capitalizedName}Input = Partial<Create${capitalizedName}Input>
74
+ `;
75
+ await promises_1.default.writeFile(node_path_1.default.join(targetDir, filename), code);
76
+ (0, utils_1.success)(`Generated database-agnostic model in src/models/${filename}`);
77
+ }
78
+ async function generateService(name, cwd = process.cwd(), options = {}) {
79
+ const targetDir = node_path_1.default.join(cwd, 'src', 'http', name);
80
+ await ensureDir(targetDir);
81
+ const capitalizedName = toPascalCase(name);
82
+ const filename = options.named ? `${name}.service.ts` : 'service.ts';
83
+ const schemaFile = options.named ? `./${name}.schema` : './schema';
84
+ const code = options.oop
85
+ ? `import { Injectable } from 'exisjs/decorators'
86
+ import { paginate, getPaginationSkip } from 'exisjs'
87
+ import type { Create${capitalizedName}Dto, Update${capitalizedName}Dto } from '${schemaFile}'
88
+
89
+ @Injectable({ scope: 'singleton' })
90
+ export class ${capitalizedName}Service {
91
+ async list(query: { page?: number; limit?: number } = {}) {
92
+ const { skip, limit, page } = getPaginationSkip(query)
93
+ // Add your database query logic here (PostgreSQL, MySQL, SQLite, MongoDB, etc.)
94
+ const items: any[] = []
95
+ const total = 0
96
+ return paginate(items, total, { page, limit })
97
+ }
98
+
99
+ async getById(id: string) {
100
+ // Fetch record by id from your database
101
+ return { id, name: '${capitalizedName} #' + id }
102
+ }
103
+
104
+ async create(data: Create${capitalizedName}Dto) {
105
+ // Insert record into your database
106
+ return { id: String(Date.now()), ...data }
107
+ }
108
+
109
+ async update(id: string, data: Update${capitalizedName}Dto) {
110
+ // Update record in your database
111
+ return { id, ...data }
112
+ }
113
+
114
+ async delete(id: string) {
115
+ // Delete record from your database
116
+ return true
117
+ }
118
+ }
119
+ `
120
+ : `import { paginate, getPaginationSkip } from 'exisjs'
121
+ import type { Create${capitalizedName}Dto, Update${capitalizedName}Dto } from '${schemaFile}'
122
+
123
+ export async function get${capitalizedName}s(query: { page?: number; limit?: number } = {}) {
124
+ const { skip, limit, page } = getPaginationSkip(query)
125
+ // Add your database query logic here (PostgreSQL, MySQL, SQLite, MongoDB, etc.)
126
+ const items: any[] = []
127
+ const total = 0
128
+ return paginate(items, total, { page, limit })
129
+ }
130
+
131
+ export async function get${capitalizedName}ById(id: string) {
132
+ // Fetch record by id from your database
133
+ return { id, name: '${capitalizedName} #' + id }
134
+ }
135
+
136
+ export async function create${capitalizedName}(data: Create${capitalizedName}Dto) {
137
+ // Insert record into your database
138
+ return { id: String(Date.now()), ...data }
139
+ }
140
+
141
+ export async function update${capitalizedName}(id: string, data: Update${capitalizedName}Dto) {
142
+ // Update record in your database
143
+ return { id, ...data }
144
+ }
145
+
146
+ export async function delete${capitalizedName}(id: string) {
147
+ // Delete record from your database
148
+ return true
149
+ }
150
+ `;
151
+ await promises_1.default.writeFile(node_path_1.default.join(targetDir, filename), code);
152
+ (0, utils_1.success)(`Generated ${options.oop ? 'OOP' : 'Functional'} service in src/http/${name}/${filename}`);
153
+ }
154
+ async function generateSchema(name, cwd = process.cwd(), options = {}) {
155
+ const targetDir = node_path_1.default.join(cwd, 'src', 'http', name);
156
+ await ensureDir(targetDir);
157
+ const capitalizedName = toPascalCase(name);
158
+ const filename = options.named ? `${name}.schema.ts` : 'schema.ts';
159
+ const code = `import { tex } from 'exisjs/validator'
160
+ import type { ResolveSchema } from 'exisjs/validator'
161
+
162
+ export const ${capitalizedName}ParamsSchema = tex.object({
163
+ id: tex.string(),
164
+ })
165
+
166
+ export const ${capitalizedName}PaginationSchema = tex.pagination({
167
+ defaultLimit: 20,
168
+ maxLimit: 100,
169
+ })
170
+
171
+ export const Create${capitalizedName}Schema = tex.object({
172
+ name: tex.string({ min: 1 }),
173
+ description: tex.string({ optional: true }),
174
+ })
175
+
176
+ export const Update${capitalizedName}Schema = tex.object({
177
+ name: tex.string({ min: 1, optional: true }),
178
+ description: tex.string({ optional: true }),
179
+ })
180
+
181
+ export type ${capitalizedName}ParamsDto = ResolveSchema<typeof ${capitalizedName}ParamsSchema>
182
+ export type Create${capitalizedName}Dto = ResolveSchema<typeof Create${capitalizedName}Schema>
183
+ export type Update${capitalizedName}Dto = ResolveSchema<typeof Update${capitalizedName}Schema>
184
+ `;
185
+ await promises_1.default.writeFile(node_path_1.default.join(targetDir, filename), code);
186
+ (0, utils_1.success)(`Generated validation schema in src/http/${name}/${filename}`);
187
+ }
188
+ async function generateBoundary(name, cwd = process.cwd(), options = {}) {
189
+ const targetDir = node_path_1.default.join(cwd, 'src', 'http', name);
190
+ await ensureDir(targetDir);
191
+ const filename = options.named ? `${name}.boundary.ts` : 'boundary.ts';
192
+ const filePath = node_path_1.default.join(targetDir, filename);
193
+ const capitalizedName = toPascalCase(name);
194
+ const code = options.oop
195
+ ? `import { Boundary } from 'exisjs/decorators'\n\n@Boundary()\nexport default class ${capitalizedName}Boundary {}\n`
196
+ : `import { defineBoundary } from 'exisjs/router'\n\nexport default defineBoundary({\n // middlewares: [],\n})\n`;
197
+ await promises_1.default.writeFile(filePath, code);
198
+ (0, utils_1.success)(`Generated boundary in src/http/${name}/${filename}`);
199
+ }
200
+ async function generateErrorHandler(cwd = process.cwd(), options = {}) {
201
+ const targetDir = node_path_1.default.join(cwd, 'src', 'http');
202
+ await ensureDir(targetDir);
203
+ const filePath = node_path_1.default.join(targetDir, 'error.ts');
204
+ const code = options.oop
205
+ ? `import type { Request, Response } from 'exisjs'
206
+
207
+ /**
208
+ * Global Exception Handler for ExisJS (OOP Paradigm)
209
+ * Auto-mounted by the framework to catch unhandled errors and format error responses.
210
+ */
211
+ export default class GlobalErrorHandler {
212
+ onError(err: any, req: Request, res: Response) {
213
+ const status = err.statusCode || err.status || 500
214
+ res.status(status).json({
215
+ success: false,
216
+ error: {
217
+ message: err.message || 'Internal Server Error',
218
+ code: err.code || 'INTERNAL_ERROR',
219
+ },
220
+ })
221
+ }
222
+ }
223
+ `
224
+ : `import type { Request, Response } from 'exisjs'
225
+
226
+ /**
227
+ * Global Exception Handler for ExisJS
228
+ * Auto-mounted by the framework to catch unhandled errors and format error responses.
229
+ */
230
+ export function onError(err: any, req: Request, res: Response) {
231
+ const status = err.statusCode || err.status || 500
232
+ res.status(status).json({
233
+ success: false,
234
+ error: {
235
+ message: err.message || 'Internal Server Error',
236
+ code: err.code || 'INTERNAL_ERROR',
237
+ },
238
+ })
239
+ }
240
+ `;
241
+ await promises_1.default.writeFile(filePath, code);
242
+ (0, utils_1.success)('Generated global exception handler in src/http/error.ts');
243
+ }
244
+ async function generateCronJob(name, cwd = process.cwd(), options = {}) {
245
+ const targetDir = node_path_1.default.join(cwd, 'src', 'cron');
246
+ await ensureDir(targetDir);
247
+ const filename = `${name.toLowerCase()}.ts`;
248
+ const filePath = node_path_1.default.join(targetDir, filename);
249
+ const capitalizedName = toPascalCase(name);
250
+ const code = options.oop
251
+ ? `import { Injectable, Cron, CronExpression } from 'exisjs/decorators'
252
+
253
+ @Injectable()
254
+ export default class ${capitalizedName}Job {
255
+ @Cron(CronExpression.EVERY_HOUR, {
256
+ name: '${name.toLowerCase()}',
257
+ preventOverlap: true,
258
+ })
259
+ async handle() {
260
+ console.log('[cron] Executing ${capitalizedName}Job')
261
+ }
262
+ }
263
+ `
264
+ : `import { cron, CronExpression } from 'exisjs/cron'
265
+
266
+ export default cron({
267
+ name: '${name.toLowerCase()}',
268
+ schedule: CronExpression.EVERY_HOUR,
269
+ preventOverlap: true,
270
+ async run({ log }) {
271
+ log.info('[cron] Executing ${name.toLowerCase()} job')
272
+ },
273
+ })
274
+ `;
275
+ await promises_1.default.writeFile(filePath, code);
276
+ (0, utils_1.success)(`Generated cron job in src/cron/${filename}`);
277
+ }
278
+ async function generateResource(name, cwd = process.cwd(), options = {}) {
279
+ const targetDir = node_path_1.default.join(cwd, 'src', 'http', name);
280
+ await ensureDir(targetDir);
281
+ const capitalizedName = toPascalCase(name);
282
+ const schemaFile = options.named ? `./${name}.schema` : './schema';
283
+ const serviceFile = options.named ? `./${name}.service` : './service';
284
+ const routeFilename = options.named ? `${name}.route.ts` : 'route.ts';
285
+ const schemaFilename = options.named ? `${name}.schema.ts` : 'schema.ts';
286
+ const serviceFilename = options.named ? `${name}.service.ts` : 'service.ts';
287
+ const modelFilename = `${capitalizedName}.ts`;
288
+ // 1. Generate model
289
+ await generateModel(name, cwd, options);
290
+ // 2. Generate schema
291
+ await generateSchema(name, cwd, options);
292
+ // 3. Generate service
293
+ await generateService(name, cwd, options);
294
+ // 4. Generate full CRUD route
295
+ const routeCode = options.oop
296
+ ? `import { Controller, Get, Post, Patch, Delete, Body, Param, Query } from 'exisjs/decorators'
297
+ import { ${capitalizedName}Service } from '${serviceFile}'
298
+ import {
299
+ Create${capitalizedName}Schema,
300
+ Update${capitalizedName}Schema,
301
+ ${capitalizedName}ParamsSchema,
302
+ ${capitalizedName}PaginationSchema,
303
+ } from '${schemaFile}'
304
+ import type { Create${capitalizedName}Dto, Update${capitalizedName}Dto } from '${schemaFile}'
305
+
306
+ @Controller('/${name}')
307
+ export default class ${capitalizedName}Controller {
308
+ constructor(private readonly service: ${capitalizedName}Service) {}
309
+
310
+ @Get('/', { query: ${capitalizedName}PaginationSchema })
311
+ async list(@Query() query: any) {
312
+ const result = await this.service.list(query)
313
+ return { success: true, ...result }
314
+ }
315
+
316
+ @Get('/:id', { params: ${capitalizedName}ParamsSchema })
317
+ async getById(@Param('id') id: string) {
318
+ const item = await this.service.getById(id)
319
+ if (!item) return { success: false, error: 'Not found' }
320
+ return { success: true, data: item }
321
+ }
322
+
323
+ @Post('/', { body: Create${capitalizedName}Schema })
324
+ async create(@Body() body: Create${capitalizedName}Dto) {
325
+ const item = await this.service.create(body)
326
+ return { success: true, data: item }
327
+ }
328
+
329
+ @Patch('/:id', { params: ${capitalizedName}ParamsSchema, body: Update${capitalizedName}Schema })
330
+ async update(@Param('id') id: string, @Body() body: Update${capitalizedName}Dto) {
331
+ const item = await this.service.update(id, body)
332
+ return { success: true, data: item }
333
+ }
334
+
335
+ @Delete('/:id', { params: ${capitalizedName}ParamsSchema })
336
+ async delete(@Param('id') id: string) {
337
+ await this.service.delete(id)
338
+ return { success: true, message: 'Deleted successfully' }
339
+ }
340
+ }
341
+ `
342
+ : `import { controller, route } from 'exisjs/router'
343
+ import * as service from '${serviceFile}'
344
+ import {
345
+ Create${capitalizedName}Schema,
346
+ Update${capitalizedName}Schema,
347
+ ${capitalizedName}ParamsSchema,
348
+ ${capitalizedName}PaginationSchema,
349
+ } from '${schemaFile}'
350
+
351
+ export default controller({
352
+ list: route.get('/', {
353
+ query: ${capitalizedName}PaginationSchema,
354
+ handle: async ({ query }) => {
355
+ const result = await service.get${capitalizedName}s(query)
356
+ return { success: true, ...result }
357
+ },
358
+ }),
359
+
360
+ getById: route.get('/:id', {
361
+ params: ${capitalizedName}ParamsSchema,
362
+ handle: async ({ params }) => {
363
+ const item = await service.get${capitalizedName}ById(params.id)
364
+ if (!item) return { success: false, error: 'Not found' }
365
+ return { success: true, data: item }
366
+ },
367
+ }),
368
+
369
+ create: route.post('/', {
370
+ body: Create${capitalizedName}Schema,
371
+ handle: async ({ body }) => {
372
+ const item = await service.create${capitalizedName}(body)
373
+ return { success: true, data: item }
374
+ },
375
+ }),
376
+
377
+ update: route.patch('/:id', {
378
+ params: ${capitalizedName}ParamsSchema,
379
+ body: Update${capitalizedName}Schema,
380
+ handle: async ({ params, body }) => {
381
+ const item = await service.update${capitalizedName}(params.id, body)
382
+ return { success: true, data: item }
383
+ },
384
+ }),
385
+
386
+ remove: route.delete('/:id', {
387
+ params: ${capitalizedName}ParamsSchema,
388
+ handle: async ({ params }) => {
389
+ await service.delete${capitalizedName}(params.id)
390
+ return { success: true, message: 'Deleted successfully' }
391
+ },
392
+ }),
393
+ })
394
+ `;
395
+ await promises_1.default.writeFile(node_path_1.default.join(targetDir, routeFilename), routeCode);
396
+ (0, utils_1.success)(`Generated full 4-file CRUD slice in src/http/${name}/ and src/models/${modelFilename} (${routeFilename}, ${schemaFilename}, ${serviceFilename}, ${modelFilename})`);
397
+ }
398
+ exports.generateCrud = generateResource;
399
+ async function generatePlugin(name) {
400
+ const targetDir = node_path_1.default.join(process.cwd(), 'src', 'plugins');
401
+ try {
402
+ await promises_1.default.mkdir(targetDir, { recursive: true });
403
+ }
404
+ catch {
405
+ (0, utils_1.error)(`Could not create plugins directory`);
406
+ return;
407
+ }
408
+ const capitalizedName = name.charAt(0).toUpperCase() + name.slice(1);
409
+ const pluginCode = `import type { ExisPlugin } from 'exisjs'
410
+
411
+ export const ${capitalizedName}Plugin: ExisPlugin = {
412
+ name: 'exis-${name.toLowerCase()}',
413
+ version: '1.0.0',
414
+ register: async (app, options) => {
415
+ // Add isolated routes or middleware here
416
+ // app.use((req, res, next) => { ... })
417
+ }
418
+ }
419
+ `;
420
+ await promises_1.default.writeFile(node_path_1.default.join(targetDir, `${name.toLowerCase()}.ts`), pluginCode);
421
+ (0, utils_1.success)(`Generated ${name} plugin in src/plugins/${name.toLowerCase()}.ts`);
422
+ }
423
+ async function generateMiddleware(name) {
424
+ const targetDir = node_path_1.default.join(process.cwd(), 'src', 'middleware');
425
+ try {
426
+ await promises_1.default.mkdir(targetDir, { recursive: true });
427
+ }
428
+ catch {
429
+ (0, utils_1.error)(`Could not create middleware directory`);
430
+ return;
431
+ }
432
+ const capitalizedName = name.charAt(0).toUpperCase() + name.slice(1);
433
+ const middlewareCode = `import type { Handler } from 'exisjs'
434
+
435
+ export const ${name}Middleware: Handler = (req, res, next) => {
436
+ // Add your logic here
437
+ console.log('${capitalizedName} Middleware executed')
438
+ next()
439
+ }
440
+ `;
441
+ await promises_1.default.writeFile(node_path_1.default.join(targetDir, `${name.toLowerCase()}.ts`), middlewareCode);
442
+ (0, utils_1.success)(`Created middleware ${name} in src/middleware/${name}.ts`);
443
+ }
444
+ async function generateTest(name) {
445
+ const targetDir = node_path_1.default.join(process.cwd(), 'tests');
446
+ try {
447
+ await promises_1.default.mkdir(targetDir, { recursive: true });
448
+ }
449
+ catch {
450
+ (0, utils_1.error)(`Could not create tests directory`);
451
+ return;
452
+ }
453
+ const capitalizedName = name.charAt(0).toUpperCase() + name.slice(1);
454
+ const testCode = `import { test, describe, assert, createTestContext } from 'exisjs/testing'
455
+ import app from '../src/http/server'
456
+
457
+ describe('${capitalizedName} Native Tests', () => {
458
+ // Automatically boot the framework and cleanup on exit
459
+ createTestContext(app)
460
+
461
+ test('should pass a basic test', async () => {
462
+ assert.strictEqual(1 + 1, 2, 'Math works')
463
+ })
464
+ })
465
+ `;
466
+ await promises_1.default.writeFile(node_path_1.default.join(targetDir, `${name.toLowerCase()}.test.ts`), testCode);
467
+ (0, utils_1.success)(`Generated ${name} test in tests/${name.toLowerCase()}.test.ts`);
468
+ }
469
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../../src/commands/generate.ts"],"names":[],"mappings":";;;;;;AAqBA,gDA4BC;AAED,sCAwBC;AAED,0CAmFC;AAED,wCAuCC;AAED,4CAiBC;AAED,oDAgDC;AAED,0CAuCC;AAED,4CAmIC;AAID,wCA6BC;AAED,gDA0BC;AAED,oCA8BC;AAzhBD,gEAAiC;AACjC,0DAA4B;AAC5B,oCAAqD;AAErD,SAAS,YAAY,CAAC,IAAY;IAChC,OAAO,IAAI;SACR,KAAK,CAAC,QAAQ,CAAC;SACf,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC,CAAA;AACb,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,GAAW;IAClC,IAAI,CAAC;QACH,MAAM,kBAAE,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,IAAA,aAAQ,EAAC,8BAA8B,GAAG,EAAE,CAAC,CAAA;QAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,kBAAkB,CACtC,IAAY,EACZ,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,UAA8C,EAAE;IAEhD,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;IACrD,MAAM,SAAS,CAAC,SAAS,CAAC,CAAA;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,UAAU,CAAA;IAChE,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAC/C,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,kBAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACpC,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE,CAAC;YAClB,IAAA,aAAQ,EAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAA;YAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,8BAA8B;IAChC,CAAC;IACD,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG;QACtB,CAAC,CAAC,wEAAwE,IAAI,4BAA4B,eAAe,+FAA+F;QACxN,CAAC,CAAC,oMAAoM,CAAA;IAExM,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAClC,IAAA,eAAO,EACL,aAAa,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,sBAAsB,IAAI,IAAI,QAAQ,EAAE,CACxF,CAAA;AACH,CAAC;AAEM,KAAK,UAAU,aAAa,CACjC,IAAY,EACZ,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,UAA+B,EAAE;IAEjC,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAA;IACjD,MAAM,SAAS,CAAC,SAAS,CAAC,CAAA;IAC1B,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,eAAe,KAAK,CAAA;IAE7E,MAAM,IAAI,GAAG,oBAAoB,eAAe;;;;;;;;oBAQ9B,eAAe,gBAAgB,eAAe;oBAC9C,eAAe,yBAAyB,eAAe;CAC1E,CAAA;IAEC,MAAM,kBAAE,CAAC,SAAS,CAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAA;IACxD,IAAA,eAAO,EAAC,mDAAmD,QAAQ,EAAE,CAAC,CAAA;AACxE,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,UAA8C,EAAE;IAEhD,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;IACrD,MAAM,SAAS,CAAC,SAAS,CAAC,CAAA;IAC1B,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,aAAa,CAAC,CAAC,CAAC,YAAY,CAAA;IACpE,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,UAAU,CAAA;IAElE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG;QACtB,CAAC,CAAC;;sBAEgB,eAAe,cAAc,eAAe,eAAe,UAAU;;;eAG5E,eAAe;;;;;;;;;;;0BAWJ,eAAe;;;6BAGZ,eAAe;;;;;yCAKH,eAAe;;;;;;;;;;CAUvD;QACG,CAAC,CAAC;sBACgB,eAAe,cAAc,eAAe,eAAe,UAAU;;2BAEhE,eAAe;;;;;;;;2BAQf,eAAe;;wBAElB,eAAe;;;8BAGT,eAAe,gBAAgB,eAAe;;;;;8BAK9C,eAAe,4BAA4B,eAAe;;;;;8BAK1D,eAAe;;;;CAI5C,CAAA;IAEC,MAAM,kBAAE,CAAC,SAAS,CAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAA;IACxD,IAAA,eAAO,EACL,aAAa,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,wBAAwB,IAAI,IAAI,QAAQ,EAAE,CAC1F,CAAA;AACH,CAAC;AAEM,KAAK,UAAU,cAAc,CAClC,IAAY,EACZ,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,UAA+B,EAAE;IAEjC,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;IACrD,MAAM,SAAS,CAAC,SAAS,CAAC,CAAA;IAC1B,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,WAAW,CAAA;IAElE,MAAM,IAAI,GAAG;;;eAGA,eAAe;;;;eAIf,eAAe;;;;;qBAKT,eAAe;;;;;qBAKf,eAAe;;;;;cAKtB,eAAe,oCAAoC,eAAe;oBAC5D,eAAe,oCAAoC,eAAe;oBAClE,eAAe,oCAAoC,eAAe;CACrF,CAAA;IAEC,MAAM,kBAAE,CAAC,SAAS,CAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAA;IACxD,IAAA,eAAO,EAAC,2CAA2C,IAAI,IAAI,QAAQ,EAAE,CAAC,CAAA;AACxE,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,UAA8C,EAAE;IAEhD,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;IACrD,MAAM,SAAS,CAAC,SAAS,CAAC,CAAA;IAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,cAAc,CAAC,CAAC,CAAC,aAAa,CAAA;IACtE,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAE/C,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG;QACtB,CAAC,CAAC,qFAAqF,eAAe,eAAe;QACrH,CAAC,CAAC,gHAAgH,CAAA;IAEpH,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAClC,IAAA,eAAO,EAAC,kCAAkC,IAAI,IAAI,QAAQ,EAAE,CAAC,CAAA;AAC/D,CAAC;AAEM,KAAK,UAAU,oBAAoB,CACxC,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,UAA6B,EAAE;IAE/B,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IAC/C,MAAM,SAAS,CAAC,SAAS,CAAC,CAAA;IAC1B,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;IAEjD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG;QACtB,CAAC,CAAC;;;;;;;;;;;;;;;;;;CAkBL;QACG,CAAC,CAAC;;;;;;;;;;;;;;;;CAgBL,CAAA;IAEC,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAClC,IAAA,eAAO,EAAC,yDAAyD,CAAC,CAAA;AACpE,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,IAAY,EACZ,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,UAA6B,EAAE;IAE/B,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,CAAC,CAAA;IAC/C,MAAM,SAAS,CAAC,SAAS,CAAC,CAAA;IAC1B,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAA;IAC3C,MAAM,QAAQ,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;IAC/C,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAE1C,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG;QACtB,CAAC,CAAC;;;uBAGiB,eAAe;;aAEzB,IAAI,CAAC,WAAW,EAAE;;;;oCAIK,eAAe;;;CAGlD;QACG,CAAC,CAAC;;;WAGK,IAAI,CAAC,WAAW,EAAE;;;;iCAII,IAAI,CAAC,WAAW,EAAE;;;CAGlD,CAAA;IAEC,MAAM,kBAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAA;IAClC,IAAA,eAAO,EAAC,kCAAkC,QAAQ,EAAE,CAAC,CAAA;AACvD,CAAC;AAEM,KAAK,UAAU,gBAAgB,CACpC,IAAY,EACZ,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,EACnB,UAA8C,EAAE;IAEhD,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;IACrD,MAAM,SAAS,CAAC,SAAS,CAAC,CAAA;IAC1B,MAAM,eAAe,GAAG,YAAY,CAAC,IAAI,CAAC,CAAA;IAE1C,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC,CAAC,UAAU,CAAA;IAClE,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC,CAAC,WAAW,CAAA;IACrE,MAAM,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,WAAW,CAAC,CAAC,CAAC,UAAU,CAAA;IACrE,MAAM,cAAc,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,YAAY,CAAC,CAAC,CAAC,WAAW,CAAA;IACxE,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,aAAa,CAAC,CAAC,CAAC,YAAY,CAAA;IAC3E,MAAM,aAAa,GAAG,GAAG,eAAe,KAAK,CAAA;IAE7C,oBAAoB;IACpB,MAAM,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;IAEvC,qBAAqB;IACrB,MAAM,cAAc,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;IAExC,sBAAsB;IACtB,MAAM,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;IAEzC,8BAA8B;IAC9B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG;QAC3B,CAAC,CAAC;WACK,eAAe,mBAAmB,WAAW;;UAE9C,eAAe;UACf,eAAe;IACrB,eAAe;IACf,eAAe;UACT,UAAU;sBACE,eAAe,cAAc,eAAe,eAAe,UAAU;;gBAE3E,IAAI;uBACG,eAAe;0CACI,eAAe;;uBAElC,eAAe;;;;;;2BAMX,eAAe;;;;;;;6BAOb,eAAe;qCACP,eAAe;;;;;6BAKvB,eAAe,6BAA6B,eAAe;8DAC1B,eAAe;;;;;8BAK/C,eAAe;;;;;;CAM5C;QACG,CAAC,CAAC;4BACsB,WAAW;;UAE7B,eAAe;UACf,eAAe;IACrB,eAAe;IACf,eAAe;UACT,UAAU;;;;aAIP,eAAe;;wCAEY,eAAe;;;;;;cAMzC,eAAe;;sCAES,eAAe;;;;;;;kBAOnC,eAAe;;yCAEQ,eAAe;;;;;;cAM1C,eAAe;kBACX,eAAe;;yCAEQ,eAAe;;;;;;cAM1C,eAAe;;4BAED,eAAe;;;;;CAK1C,CAAA;IAEC,MAAM,kBAAE,CAAC,SAAS,CAAC,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE,SAAS,CAAC,CAAA;IAClE,IAAA,eAAO,EACL,gDAAgD,IAAI,oBAAoB,aAAa,KAAK,aAAa,KAAK,cAAc,KAAK,eAAe,KAAK,aAAa,GAAG,CACpK,CAAA;AACH,CAAC;AAEY,QAAA,YAAY,GAAG,gBAAgB,CAAA;AAErC,KAAK,UAAU,cAAc,CAAC,IAAY;IAC/C,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,CAAC,CAAA;IAE5D,IAAI,CAAC;QACH,MAAM,kBAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,IAAA,aAAQ,EAAC,oCAAoC,CAAC,CAAA;QAC9C,OAAM;IACR,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAEpE,MAAM,UAAU,GAAG;;eAEN,eAAe;gBACd,IAAI,CAAC,WAAW,EAAE;;;;;;;CAOjC,CAAA;IAEC,MAAM,kBAAE,CAAC,SAAS,CAChB,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAChD,UAAU,CACX,CAAA;IACD,IAAA,eAAO,EAAC,aAAa,IAAI,0BAA0B,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAA;AAC7E,CAAC;AAEM,KAAK,UAAU,kBAAkB,CAAC,IAAY;IACnD,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,YAAY,CAAC,CAAA;IAE/D,IAAI,CAAC;QACH,MAAM,kBAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,IAAA,aAAQ,EAAC,uCAAuC,CAAC,CAAA;QACjD,OAAM;IACR,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAEpE,MAAM,cAAc,GAAG;;eAEV,IAAI;;iBAEF,eAAe;;;CAG/B,CAAA;IAEC,MAAM,kBAAE,CAAC,SAAS,CAChB,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,EAChD,cAAc,CACf,CAAA;IACD,IAAA,eAAO,EAAC,sBAAsB,IAAI,sBAAsB,IAAI,KAAK,CAAC,CAAA;AACpE,CAAC;AAEM,KAAK,UAAU,YAAY,CAAC,IAAY;IAC7C,MAAM,SAAS,GAAG,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,OAAO,CAAC,CAAA;IAEnD,IAAI,CAAC;QACH,MAAM,kBAAE,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,IAAA,aAAQ,EAAC,kCAAkC,CAAC,CAAA;QAC5C,OAAM;IACR,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAEpE,MAAM,QAAQ,GAAG;;;YAGP,eAAe;;;;;;;;CAQ1B,CAAA;IAEC,MAAM,kBAAE,CAAC,SAAS,CAChB,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,EACrD,QAAQ,CACT,CAAA;IACD,IAAA,eAAO,EAAC,aAAa,IAAI,kBAAkB,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAA;AAC1E,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function initCommand(): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAKA,wBAAsB,WAAW,kBAkChC"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.initCommand = initCommand;
7
+ const node_child_process_1 = __importDefault(require("node:child_process"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const node_fs_1 = __importDefault(require("node:fs"));
10
+ const utils_1 = require("../utils");
11
+ async function initCommand() {
12
+ console.log(`\n${utils_1.c.bold}${utils_1.c.green}Initializing Exis Project...${utils_1.c.reset}\n`);
13
+ let version = 'latest';
14
+ try {
15
+ const pkgPath = node_path_1.default.join(__dirname, '..', '..', 'package.json');
16
+ version = JSON.parse(node_fs_1.default.readFileSync(pkgPath, 'utf-8')).version;
17
+ }
18
+ catch {
19
+ /* ignore */
20
+ }
21
+ // In development, the create-exisjs package is located relative to the exis package
22
+ // dist/cli/commands/init.js -> ../../../../create/dist/index.js
23
+ const localCreateExis = node_path_1.default.join(__dirname, '..', '..', '..', 'create', 'dist', 'index.js');
24
+ if (node_fs_1.default.existsSync(localCreateExis)) {
25
+ node_child_process_1.default.spawnSync(process.execPath, [localCreateExis, '.'], {
26
+ stdio: 'inherit',
27
+ });
28
+ }
29
+ else {
30
+ // In production, run the exact matching version of create-exisjs to prevent skew
31
+ node_child_process_1.default.spawnSync('npx', [`create-exisjs@${version}`, '.'], {
32
+ stdio: 'inherit',
33
+ shell: true,
34
+ });
35
+ }
36
+ }
37
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":";;;;;AAKA,kCAkCC;AAvCD,4EAAmC;AACnC,0DAA4B;AAC5B,sDAAwB;AACxB,oCAA4B;AAErB,KAAK,UAAU,WAAW;IAC/B,OAAO,CAAC,GAAG,CAAC,KAAK,SAAC,CAAC,IAAI,GAAG,SAAC,CAAC,KAAK,+BAA+B,SAAC,CAAC,KAAK,IAAI,CAAC,CAAA;IAE5E,IAAI,OAAO,GAAG,QAAQ,CAAA;IACtB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,mBAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAA;QAChE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAA;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,YAAY;IACd,CAAC;IAED,oFAAoF;IACpF,gEAAgE;IAChE,MAAM,eAAe,GAAG,mBAAI,CAAC,IAAI,CAC/B,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,MAAM,EACN,UAAU,CACX,CAAA;IAED,IAAI,iBAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QACnC,4BAAE,CAAC,SAAS,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE;YACrD,KAAK,EAAE,SAAS;SACjB,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,iFAAiF;QACjF,4BAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,iBAAiB,OAAO,EAAE,EAAE,GAAG,CAAC,EAAE;YACrD,KAAK,EAAE,SAAS;YAChB,KAAK,EAAE,IAAI;SACZ,CAAC,CAAA;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,19 @@
1
+ interface MigrateOptions {
2
+ dryRun?: boolean;
3
+ }
4
+ export interface MigrationChange {
5
+ file: string;
6
+ description: string;
7
+ }
8
+ export declare const START_CMD = "CMD [\"node_modules/.bin/exisjs\", \"start\"]";
9
+ /**
10
+ * Updates package.json for the 0.10 layout: the CLI as a development
11
+ * dependency, and TypeScript listed by the project itself. `exisjs start`
12
+ * keeps working: the runtime runs it without the CLI. Returns what changed.
13
+ */
14
+ export declare function migratePackageJson(cwd: string, write: boolean): MigrationChange[];
15
+ /** Dockerfile lines that should change; the file is not edited */
16
+ export declare function dockerfileAdvice(cwd: string): string[];
17
+ export declare function migrateCommand(options?: MigrateOptions): Promise<void>;
18
+ export {};
19
+ //# sourceMappingURL=migrate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migrate.d.ts","sourceRoot":"","sources":["../../src/commands/migrate.ts"],"names":[],"mappings":"AAIA,UAAU,cAAc;IACtB,MAAM,CAAC,EAAE,OAAO,CAAA;CACjB;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAA;IACZ,WAAW,EAAE,MAAM,CAAA;CACpB;AAGD,eAAO,MAAM,SAAS,kDAA8C,CAAA;AAoBpE;;;;GAIG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,OAAO,GACb,eAAe,EAAE,CAmCnB;AAED,kEAAkE;AAClE,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAqBtD;AAED,wBAAsB,cAAc,CAClC,OAAO,GAAE,cAAmB,GAC3B,OAAO,CAAC,IAAI,CAAC,CA+Bf"}