@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.
- package/README.md +35 -2
- package/bin/exisjs.js +2 -0
- package/dist/commands/build.d.ts +17 -0
- package/dist/commands/build.d.ts.map +1 -0
- package/dist/commands/build.js +378 -0
- package/dist/commands/build.js.map +1 -0
- package/dist/commands/clean.d.ts +5 -0
- package/dist/commands/clean.d.ts.map +1 -0
- package/dist/commands/clean.js +30 -0
- package/dist/commands/clean.js.map +1 -0
- package/dist/commands/dev.d.ts +28 -0
- package/dist/commands/dev.d.ts.map +1 -0
- package/dist/commands/dev.js +884 -0
- package/dist/commands/dev.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.d.ts.map +1 -0
- package/dist/commands/doctor.js +228 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/exports.d.ts +2 -0
- package/dist/commands/exports.d.ts.map +1 -0
- package/dist/commands/exports.js +48 -0
- package/dist/commands/exports.js.map +1 -0
- package/dist/commands/generate.d.ts +33 -0
- package/dist/commands/generate.d.ts.map +1 -0
- package/dist/commands/generate.js +469 -0
- package/dist/commands/generate.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +37 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/migrate.d.ts +19 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +116 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/repl.d.ts +6 -0
- package/dist/commands/repl.d.ts.map +1 -0
- package/dist/commands/repl.js +75 -0
- package/dist/commands/repl.js.map +1 -0
- package/dist/commands/run.d.ts +7 -0
- package/dist/commands/run.d.ts.map +1 -0
- package/dist/commands/run.js +101 -0
- package/dist/commands/run.js.map +1 -0
- package/dist/commands/start.d.ts +2 -0
- package/dist/commands/start.d.ts.map +1 -0
- package/dist/commands/start.js +8 -0
- package/dist/commands/start.js.map +1 -0
- package/dist/commands/test.d.ts +8 -0
- package/dist/commands/test.d.ts.map +1 -0
- package/dist/commands/test.js +166 -0
- package/dist/commands/test.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +276 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/inspect-routes.d.ts +2 -0
- package/dist/lib/inspect-routes.d.ts.map +1 -0
- package/dist/lib/inspect-routes.js +150 -0
- package/dist/lib/inspect-routes.js.map +1 -0
- package/dist/lib/start-repl.d.ts +2 -0
- package/dist/lib/start-repl.d.ts.map +1 -0
- package/dist/lib/start-repl.js +120 -0
- package/dist/lib/start-repl.js.map +1 -0
- package/dist/manifest.d.ts +4 -0
- package/dist/manifest.d.ts.map +1 -0
- package/dist/manifest.js +489 -0
- package/dist/manifest.js.map +1 -0
- package/dist/routes.d.ts +17 -0
- package/dist/routes.d.ts.map +1 -0
- package/dist/routes.js +316 -0
- package/dist/routes.js.map +1 -0
- package/dist/utils.d.ts +24 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +54 -0
- package/dist/utils.js.map +1 -0
- 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 @@
|
|
|
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"}
|