@veloxts/cli 0.4.14 → 0.6.23
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 +2 -48
- package/dist/cli.d.ts +5 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +7 -1
- package/dist/cli.js.map +1 -1
- package/dist/commands/dev.d.ts.map +1 -1
- package/dist/commands/dev.js +71 -7
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/introspect.d.ts +16 -0
- package/dist/commands/introspect.d.ts.map +1 -0
- package/dist/commands/introspect.js +559 -0
- package/dist/commands/introspect.js.map +1 -0
- package/dist/commands/make.d.ts.map +1 -1
- package/dist/commands/make.js +18 -8
- package/dist/commands/make.js.map +1 -1
- package/dist/commands/procedures.d.ts.map +1 -1
- package/dist/commands/procedures.js +16 -0
- package/dist/commands/procedures.js.map +1 -1
- package/dist/dev/error-parser.d.ts.map +1 -1
- package/dist/dev/error-parser.js +24 -8
- package/dist/dev/error-parser.js.map +1 -1
- package/dist/dev/hmr-runner.d.ts.map +1 -1
- package/dist/dev/hmr-runner.js +6 -1
- package/dist/dev/hmr-runner.js.map +1 -1
- package/dist/dev/index.d.ts +3 -3
- package/dist/dev/index.d.ts.map +1 -1
- package/dist/dev/index.js +3 -3
- package/dist/dev/index.js.map +1 -1
- package/dist/dev/reload-reporter.d.ts +2 -2
- package/dist/dev/reload-reporter.d.ts.map +1 -1
- package/dist/dev/reload-reporter.js +2 -2
- package/dist/dev/reload-reporter.js.map +1 -1
- package/dist/errors/catalog.d.ts +48 -0
- package/dist/errors/catalog.d.ts.map +1 -0
- package/dist/errors/catalog.js +421 -0
- package/dist/errors/catalog.js.map +1 -0
- package/dist/errors/index.d.ts +26 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +28 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/velox-error.d.ts +122 -0
- package/dist/errors/velox-error.d.ts.map +1 -0
- package/dist/errors/velox-error.js +216 -0
- package/dist/errors/velox-error.js.map +1 -0
- package/dist/generators/base.d.ts.map +1 -1
- package/dist/generators/base.js +26 -0
- package/dist/generators/base.js.map +1 -1
- package/dist/generators/fields/__tests__/helpers.d.ts +66 -0
- package/dist/generators/fields/__tests__/helpers.d.ts.map +1 -0
- package/dist/generators/fields/__tests__/helpers.js +142 -0
- package/dist/generators/fields/__tests__/helpers.js.map +1 -0
- package/dist/generators/fields/actions.d.ts +58 -0
- package/dist/generators/fields/actions.d.ts.map +1 -0
- package/dist/generators/fields/actions.js +230 -0
- package/dist/generators/fields/actions.js.map +1 -0
- package/dist/generators/fields/display.d.ts +28 -0
- package/dist/generators/fields/display.d.ts.map +1 -0
- package/dist/generators/fields/display.js +214 -0
- package/dist/generators/fields/display.js.map +1 -0
- package/dist/generators/fields/index.d.ts +12 -0
- package/dist/generators/fields/index.d.ts.map +1 -0
- package/dist/generators/fields/index.js +12 -0
- package/dist/generators/fields/index.js.map +1 -0
- package/dist/generators/fields/prompts.d.ts +31 -0
- package/dist/generators/fields/prompts.d.ts.map +1 -0
- package/dist/generators/fields/prompts.js +366 -0
- package/dist/generators/fields/prompts.js.map +1 -0
- package/dist/generators/fields/templates.d.ts +49 -0
- package/dist/generators/fields/templates.d.ts.map +1 -0
- package/dist/generators/fields/templates.js +230 -0
- package/dist/generators/fields/templates.js.map +1 -0
- package/dist/generators/fields/types.d.ts +95 -0
- package/dist/generators/fields/types.d.ts.map +1 -0
- package/dist/generators/fields/types.js +150 -0
- package/dist/generators/fields/types.js.map +1 -0
- package/dist/generators/generators/action.d.ts +37 -0
- package/dist/generators/generators/action.d.ts.map +1 -0
- package/dist/generators/generators/action.js +109 -0
- package/dist/generators/generators/action.js.map +1 -0
- package/dist/generators/generators/exception.d.ts +38 -0
- package/dist/generators/generators/exception.d.ts.map +1 -0
- package/dist/generators/generators/exception.js +109 -0
- package/dist/generators/generators/exception.js.map +1 -0
- package/dist/generators/generators/guard.d.ts +38 -0
- package/dist/generators/generators/guard.d.ts.map +1 -0
- package/dist/generators/generators/guard.js +109 -0
- package/dist/generators/generators/guard.js.map +1 -0
- package/dist/generators/generators/index.d.ts +8 -0
- package/dist/generators/generators/index.d.ts.map +1 -1
- package/dist/generators/generators/index.js +27 -0
- package/dist/generators/generators/index.js.map +1 -1
- package/dist/generators/generators/layout.d.ts +36 -0
- package/dist/generators/generators/layout.d.ts.map +1 -0
- package/dist/generators/generators/layout.js +111 -0
- package/dist/generators/generators/layout.js.map +1 -0
- package/dist/generators/generators/middleware.d.ts +38 -0
- package/dist/generators/generators/middleware.d.ts.map +1 -0
- package/dist/generators/generators/middleware.js +109 -0
- package/dist/generators/generators/middleware.js.map +1 -0
- package/dist/generators/generators/model.d.ts +16 -4
- package/dist/generators/generators/model.d.ts.map +1 -1
- package/dist/generators/generators/model.js +88 -7
- package/dist/generators/generators/model.js.map +1 -1
- package/dist/generators/generators/page.d.ts +36 -0
- package/dist/generators/generators/page.d.ts.map +1 -0
- package/dist/generators/generators/page.js +112 -0
- package/dist/generators/generators/page.js.map +1 -0
- package/dist/generators/generators/policy.d.ts +37 -0
- package/dist/generators/generators/policy.d.ts.map +1 -0
- package/dist/generators/generators/policy.js +100 -0
- package/dist/generators/generators/policy.js.map +1 -0
- package/dist/generators/generators/resource.d.ts +42 -4
- package/dist/generators/generators/resource.d.ts.map +1 -1
- package/dist/generators/generators/resource.js +450 -9
- package/dist/generators/generators/resource.js.map +1 -1
- package/dist/generators/generators/service.d.ts +38 -0
- package/dist/generators/generators/service.d.ts.map +1 -0
- package/dist/generators/generators/service.js +109 -0
- package/dist/generators/generators/service.js.map +1 -0
- package/dist/generators/registry.d.ts.map +1 -1
- package/dist/generators/registry.js +10 -1
- package/dist/generators/registry.js.map +1 -1
- package/dist/generators/templates/action.d.ts +28 -0
- package/dist/generators/templates/action.d.ts.map +1 -0
- package/dist/generators/templates/action.js +359 -0
- package/dist/generators/templates/action.js.map +1 -0
- package/dist/generators/templates/exception.d.ts +26 -0
- package/dist/generators/templates/exception.d.ts.map +1 -0
- package/dist/generators/templates/exception.js +671 -0
- package/dist/generators/templates/exception.js.map +1 -0
- package/dist/generators/templates/guard.d.ts +26 -0
- package/dist/generators/templates/guard.d.ts.map +1 -0
- package/dist/generators/templates/guard.js +555 -0
- package/dist/generators/templates/guard.js.map +1 -0
- package/dist/generators/templates/layout.d.ts +28 -0
- package/dist/generators/templates/layout.d.ts.map +1 -0
- package/dist/generators/templates/layout.js +147 -0
- package/dist/generators/templates/layout.js.map +1 -0
- package/dist/generators/templates/middleware.d.ts +26 -0
- package/dist/generators/templates/middleware.d.ts.map +1 -0
- package/dist/generators/templates/middleware.js +411 -0
- package/dist/generators/templates/middleware.js.map +1 -0
- package/dist/generators/templates/model.d.ts +3 -0
- package/dist/generators/templates/model.d.ts.map +1 -1
- package/dist/generators/templates/model.js +183 -28
- package/dist/generators/templates/model.js.map +1 -1
- package/dist/generators/templates/page.d.ts +36 -0
- package/dist/generators/templates/page.d.ts.map +1 -0
- package/dist/generators/templates/page.js +147 -0
- package/dist/generators/templates/page.js.map +1 -0
- package/dist/generators/templates/policy.d.ts +24 -0
- package/dist/generators/templates/policy.d.ts.map +1 -0
- package/dist/generators/templates/policy.js +499 -0
- package/dist/generators/templates/policy.js.map +1 -0
- package/dist/generators/templates/resource.d.ts +65 -0
- package/dist/generators/templates/resource.d.ts.map +1 -1
- package/dist/generators/templates/resource.js +228 -43
- package/dist/generators/templates/resource.js.map +1 -1
- package/dist/generators/templates/service.d.ts +26 -0
- package/dist/generators/templates/service.d.ts.map +1 -0
- package/dist/generators/templates/service.js +511 -0
- package/dist/generators/templates/service.js.map +1 -0
- package/dist/generators/types.d.ts +26 -14
- package/dist/generators/types.d.ts.map +1 -1
- package/dist/generators/types.js +8 -25
- package/dist/generators/types.js.map +1 -1
- package/dist/generators/utils/ast-helpers.d.ts +147 -0
- package/dist/generators/utils/ast-helpers.d.ts.map +1 -0
- package/dist/generators/utils/ast-helpers.js +350 -0
- package/dist/generators/utils/ast-helpers.js.map +1 -0
- package/dist/generators/utils/prisma-migration.d.ts +59 -0
- package/dist/generators/utils/prisma-migration.d.ts.map +1 -0
- package/dist/generators/utils/prisma-migration.js +161 -0
- package/dist/generators/utils/prisma-migration.js.map +1 -0
- package/dist/generators/utils/prisma-schema.d.ts +97 -0
- package/dist/generators/utils/prisma-schema.d.ts.map +1 -0
- package/dist/generators/utils/prisma-schema.js +235 -0
- package/dist/generators/utils/prisma-schema.js.map +1 -0
- package/dist/generators/utils/router-integration.d.ts +70 -0
- package/dist/generators/utils/router-integration.d.ts.map +1 -0
- package/dist/generators/utils/router-integration.js +305 -0
- package/dist/generators/utils/router-integration.js.map +1 -0
- package/dist/generators/utils/snapshot.d.ts +93 -0
- package/dist/generators/utils/snapshot.d.ts.map +1 -0
- package/dist/generators/utils/snapshot.js +178 -0
- package/dist/generators/utils/snapshot.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/seeding/errors.d.ts +11 -24
- package/dist/seeding/errors.d.ts.map +1 -1
- package/dist/seeding/errors.js +11 -50
- package/dist/seeding/errors.js.map +1 -1
- package/dist/utils/paths.d.ts +19 -0
- package/dist/utils/paths.d.ts.map +1 -1
- package/dist/utils/paths.js +45 -0
- package/dist/utils/paths.js.map +1 -1
- package/dist/utils/schema-patterns.d.ts +26 -0
- package/dist/utils/schema-patterns.d.ts.map +1 -0
- package/dist/utils/schema-patterns.js +40 -0
- package/dist/utils/schema-patterns.js.map +1 -0
- package/package.json +12 -10
|
@@ -0,0 +1,511 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service Template
|
|
3
|
+
*
|
|
4
|
+
* Generates service class files for VeloxTS applications.
|
|
5
|
+
*/
|
|
6
|
+
// ============================================================================
|
|
7
|
+
// Path Helpers
|
|
8
|
+
// ============================================================================
|
|
9
|
+
/**
|
|
10
|
+
* Get the path for a service file
|
|
11
|
+
*/
|
|
12
|
+
export function getServicePath(entityName, _project) {
|
|
13
|
+
return `src/services/${entityName.toLowerCase()}.ts`;
|
|
14
|
+
}
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Templates
|
|
17
|
+
// ============================================================================
|
|
18
|
+
/**
|
|
19
|
+
* Generate CRUD service
|
|
20
|
+
*/
|
|
21
|
+
function generateCrudService(ctx) {
|
|
22
|
+
const { entity, options } = ctx;
|
|
23
|
+
const injectableDecorator = options.injectable
|
|
24
|
+
? `import { Injectable, Inject } from '@veloxts/core';
|
|
25
|
+
import { DatabaseToken } from '@/di/tokens';
|
|
26
|
+
|
|
27
|
+
@Injectable()
|
|
28
|
+
`
|
|
29
|
+
: '';
|
|
30
|
+
const dbInjection = options.injectable
|
|
31
|
+
? ` constructor(@Inject(DatabaseToken) private readonly db: PrismaClient) {}`
|
|
32
|
+
: ` constructor(private readonly db: PrismaClient) {}`;
|
|
33
|
+
const cacheImports = options.cache
|
|
34
|
+
? `
|
|
35
|
+
// Simple in-memory cache (use Redis in production)
|
|
36
|
+
const cache = new Map<string, { data: unknown; expiry: number }>();
|
|
37
|
+
const CACHE_TTL = 60 * 1000; // 1 minute
|
|
38
|
+
`
|
|
39
|
+
: '';
|
|
40
|
+
const cacheHelpers = options.cache
|
|
41
|
+
? `
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Get from cache
|
|
45
|
+
*/
|
|
46
|
+
private getFromCache<T>(key: string): T | null {
|
|
47
|
+
const entry = cache.get(key);
|
|
48
|
+
if (!entry) return null;
|
|
49
|
+
if (Date.now() > entry.expiry) {
|
|
50
|
+
cache.delete(key);
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
return entry.data as T;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Set in cache
|
|
58
|
+
*/
|
|
59
|
+
private setInCache(key: string, data: unknown): void {
|
|
60
|
+
cache.set(key, { data, expiry: Date.now() + CACHE_TTL });
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Invalidate cache
|
|
65
|
+
*/
|
|
66
|
+
private invalidateCache(pattern?: string): void {
|
|
67
|
+
if (pattern) {
|
|
68
|
+
for (const key of cache.keys()) {
|
|
69
|
+
if (key.startsWith(pattern)) {
|
|
70
|
+
cache.delete(key);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
} else {
|
|
74
|
+
cache.clear();
|
|
75
|
+
}
|
|
76
|
+
}`
|
|
77
|
+
: '';
|
|
78
|
+
const findByIdWithCache = options.cache
|
|
79
|
+
? `
|
|
80
|
+
const cacheKey = \`${entity.camel}:\${id}\`;
|
|
81
|
+
const cached = this.getFromCache<${entity.pascal}>(cacheKey);
|
|
82
|
+
if (cached) return cached;
|
|
83
|
+
|
|
84
|
+
const result = await this.db.${entity.camel}.findUnique({ where: { id } });
|
|
85
|
+
if (result) this.setInCache(cacheKey, result);
|
|
86
|
+
return result;`
|
|
87
|
+
: `
|
|
88
|
+
return this.db.${entity.camel}.findUnique({ where: { id } });`;
|
|
89
|
+
const createWithCache = options.cache
|
|
90
|
+
? `
|
|
91
|
+
const result = await this.db.${entity.camel}.create({ data });
|
|
92
|
+
this.invalidateCache('${entity.plural}:list');
|
|
93
|
+
return result;`
|
|
94
|
+
: `
|
|
95
|
+
return this.db.${entity.camel}.create({ data });`;
|
|
96
|
+
const updateWithCache = options.cache
|
|
97
|
+
? `
|
|
98
|
+
const result = await this.db.${entity.camel}.update({ where: { id }, data });
|
|
99
|
+
this.invalidateCache(\`${entity.camel}:\${id}\`);
|
|
100
|
+
this.invalidateCache('${entity.plural}:list');
|
|
101
|
+
return result;`
|
|
102
|
+
: `
|
|
103
|
+
return this.db.${entity.camel}.update({ where: { id }, data });`;
|
|
104
|
+
const deleteWithCache = options.cache
|
|
105
|
+
? `
|
|
106
|
+
await this.db.${entity.camel}.delete({ where: { id } });
|
|
107
|
+
this.invalidateCache(\`${entity.camel}:\${id}\`);
|
|
108
|
+
this.invalidateCache('${entity.plural}:list');`
|
|
109
|
+
: `
|
|
110
|
+
await this.db.${entity.camel}.delete({ where: { id } });`;
|
|
111
|
+
return `/**
|
|
112
|
+
* ${entity.pascal} Service
|
|
113
|
+
*
|
|
114
|
+
* Business logic for ${entity.humanReadable} operations.
|
|
115
|
+
*/
|
|
116
|
+
|
|
117
|
+
import type { PrismaClient } from '@prisma/client';
|
|
118
|
+
${injectableDecorator ? injectableDecorator : ''}${cacheImports}
|
|
119
|
+
// ============================================================================
|
|
120
|
+
// Types
|
|
121
|
+
// ============================================================================
|
|
122
|
+
|
|
123
|
+
interface ${entity.pascal} {
|
|
124
|
+
id: string;
|
|
125
|
+
name: string;
|
|
126
|
+
createdAt: Date;
|
|
127
|
+
updatedAt: Date;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
interface Create${entity.pascal}Input {
|
|
131
|
+
name: string;
|
|
132
|
+
// TODO: Add fields
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
interface Update${entity.pascal}Input {
|
|
136
|
+
name?: string;
|
|
137
|
+
// TODO: Add fields
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
interface List${entity.pascalPlural}Options {
|
|
141
|
+
page?: number;
|
|
142
|
+
limit?: number;
|
|
143
|
+
orderBy?: 'createdAt' | 'name';
|
|
144
|
+
order?: 'asc' | 'desc';
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// ============================================================================
|
|
148
|
+
// Service
|
|
149
|
+
// ============================================================================
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* ${entity.pascal} service
|
|
153
|
+
*
|
|
154
|
+
* Encapsulates business logic for ${entity.humanReadable} CRUD operations.
|
|
155
|
+
*/
|
|
156
|
+
${injectableDecorator}export class ${entity.pascal}Service {
|
|
157
|
+
${dbInjection}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Find ${entity.humanReadable} by ID
|
|
161
|
+
*/
|
|
162
|
+
async findById(id: string): Promise<${entity.pascal} | null> {${findByIdWithCache}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Find ${entity.humanReadable} by ID or throw
|
|
167
|
+
*/
|
|
168
|
+
async findByIdOrThrow(id: string): Promise<${entity.pascal}> {
|
|
169
|
+
const ${entity.camel} = await this.findById(id);
|
|
170
|
+
if (!${entity.camel}) {
|
|
171
|
+
throw new Error(\`${entity.pascal} not found: \${id}\`);
|
|
172
|
+
}
|
|
173
|
+
return ${entity.camel};
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* List ${entity.humanReadablePlural} with pagination
|
|
178
|
+
*/
|
|
179
|
+
async list(options: List${entity.pascalPlural}Options = {}): Promise<{
|
|
180
|
+
data: ${entity.pascal}[];
|
|
181
|
+
total: number;
|
|
182
|
+
page: number;
|
|
183
|
+
limit: number;
|
|
184
|
+
}> {
|
|
185
|
+
const { page = 1, limit = 20, orderBy = 'createdAt', order = 'desc' } = options;
|
|
186
|
+
const skip = (page - 1) * limit;
|
|
187
|
+
|
|
188
|
+
const [data, total] = await Promise.all([
|
|
189
|
+
this.db.${entity.camel}.findMany({
|
|
190
|
+
skip,
|
|
191
|
+
take: limit,
|
|
192
|
+
orderBy: { [orderBy]: order },
|
|
193
|
+
}),
|
|
194
|
+
this.db.${entity.camel}.count(),
|
|
195
|
+
]);
|
|
196
|
+
|
|
197
|
+
return { data, total, page, limit };
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Create ${entity.humanReadable}
|
|
202
|
+
*/
|
|
203
|
+
async create(data: Create${entity.pascal}Input): Promise<${entity.pascal}> {${createWithCache}
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Update ${entity.humanReadable}
|
|
208
|
+
*/
|
|
209
|
+
async update(id: string, data: Update${entity.pascal}Input): Promise<${entity.pascal}> {${updateWithCache}
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Delete ${entity.humanReadable}
|
|
214
|
+
*/
|
|
215
|
+
async delete(id: string): Promise<void> {${deleteWithCache}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Check if ${entity.humanReadable} exists
|
|
220
|
+
*/
|
|
221
|
+
async exists(id: string): Promise<boolean> {
|
|
222
|
+
const count = await this.db.${entity.camel}.count({ where: { id } });
|
|
223
|
+
return count > 0;
|
|
224
|
+
}
|
|
225
|
+
${cacheHelpers}
|
|
226
|
+
}
|
|
227
|
+
`;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Generate service with events
|
|
231
|
+
*/
|
|
232
|
+
function generateEventService(ctx) {
|
|
233
|
+
const { entity, options } = ctx;
|
|
234
|
+
const injectableDecorator = options.injectable
|
|
235
|
+
? `import { Injectable, Inject } from '@veloxts/core';
|
|
236
|
+
import { DatabaseToken } from '@/di/tokens';
|
|
237
|
+
|
|
238
|
+
@Injectable()
|
|
239
|
+
`
|
|
240
|
+
: '';
|
|
241
|
+
return `/**
|
|
242
|
+
* ${entity.pascal} Service
|
|
243
|
+
*
|
|
244
|
+
* Business logic with event emission for ${entity.humanReadable} operations.
|
|
245
|
+
*/
|
|
246
|
+
|
|
247
|
+
import { EventEmitter } from 'node:events';
|
|
248
|
+
import type { PrismaClient } from '@prisma/client';
|
|
249
|
+
${injectableDecorator}
|
|
250
|
+
// ============================================================================
|
|
251
|
+
// Types
|
|
252
|
+
// ============================================================================
|
|
253
|
+
|
|
254
|
+
interface ${entity.pascal} {
|
|
255
|
+
id: string;
|
|
256
|
+
name: string;
|
|
257
|
+
createdAt: Date;
|
|
258
|
+
updatedAt: Date;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
interface Create${entity.pascal}Input {
|
|
262
|
+
name: string;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
interface Update${entity.pascal}Input {
|
|
266
|
+
name?: string;
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// ============================================================================
|
|
270
|
+
// Events
|
|
271
|
+
// ============================================================================
|
|
272
|
+
|
|
273
|
+
export type ${entity.pascal}Events = {
|
|
274
|
+
'${entity.camel}:created': [${entity.pascal}];
|
|
275
|
+
'${entity.camel}:updated': [${entity.pascal}, Update${entity.pascal}Input];
|
|
276
|
+
'${entity.camel}:deleted': [string];
|
|
277
|
+
};
|
|
278
|
+
|
|
279
|
+
// ============================================================================
|
|
280
|
+
// Service
|
|
281
|
+
// ============================================================================
|
|
282
|
+
|
|
283
|
+
/**
|
|
284
|
+
* ${entity.pascal} service with event emission
|
|
285
|
+
*/
|
|
286
|
+
${injectableDecorator ? injectableDecorator : ''}export class ${entity.pascal}Service extends EventEmitter {
|
|
287
|
+
constructor(private readonly db: PrismaClient) {
|
|
288
|
+
super();
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Emit typed event
|
|
293
|
+
*/
|
|
294
|
+
private emit<K extends keyof ${entity.pascal}Events>(
|
|
295
|
+
event: K,
|
|
296
|
+
...args: ${entity.pascal}Events[K]
|
|
297
|
+
): boolean {
|
|
298
|
+
return super.emit(event, ...args);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Listen for typed event
|
|
303
|
+
*/
|
|
304
|
+
on<K extends keyof ${entity.pascal}Events>(
|
|
305
|
+
event: K,
|
|
306
|
+
listener: (...args: ${entity.pascal}Events[K]) => void
|
|
307
|
+
): this {
|
|
308
|
+
return super.on(event, listener as (...args: unknown[]) => void);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* Find ${entity.humanReadable} by ID
|
|
313
|
+
*/
|
|
314
|
+
async findById(id: string): Promise<${entity.pascal} | null> {
|
|
315
|
+
return this.db.${entity.camel}.findUnique({ where: { id } });
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/**
|
|
319
|
+
* Create ${entity.humanReadable}
|
|
320
|
+
*/
|
|
321
|
+
async create(data: Create${entity.pascal}Input): Promise<${entity.pascal}> {
|
|
322
|
+
const ${entity.camel} = await this.db.${entity.camel}.create({ data });
|
|
323
|
+
this.emit('${entity.camel}:created', ${entity.camel});
|
|
324
|
+
return ${entity.camel};
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
/**
|
|
328
|
+
* Update ${entity.humanReadable}
|
|
329
|
+
*/
|
|
330
|
+
async update(id: string, data: Update${entity.pascal}Input): Promise<${entity.pascal}> {
|
|
331
|
+
const ${entity.camel} = await this.db.${entity.camel}.update({ where: { id }, data });
|
|
332
|
+
this.emit('${entity.camel}:updated', ${entity.camel}, data);
|
|
333
|
+
return ${entity.camel};
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
/**
|
|
337
|
+
* Delete ${entity.humanReadable}
|
|
338
|
+
*/
|
|
339
|
+
async delete(id: string): Promise<void> {
|
|
340
|
+
await this.db.${entity.camel}.delete({ where: { id } });
|
|
341
|
+
this.emit('${entity.camel}:deleted', id);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// ============================================================================
|
|
346
|
+
// Usage Example
|
|
347
|
+
// ============================================================================
|
|
348
|
+
|
|
349
|
+
/*
|
|
350
|
+
const service = new ${entity.pascal}Service(prisma);
|
|
351
|
+
|
|
352
|
+
// Listen for events
|
|
353
|
+
service.on('${entity.camel}:created', (${entity.camel}) => {
|
|
354
|
+
console.log('New ${entity.humanReadable} created:', ${entity.camel}.id);
|
|
355
|
+
// Send notification, update cache, etc.
|
|
356
|
+
});
|
|
357
|
+
|
|
358
|
+
service.on('${entity.camel}:deleted', (id) => {
|
|
359
|
+
console.log('${entity.pascal} deleted:', id);
|
|
360
|
+
// Cleanup related data
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
// Use the service
|
|
364
|
+
const ${entity.camel} = await service.create({ name: 'Example' });
|
|
365
|
+
*/
|
|
366
|
+
`;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Generate simple service template
|
|
370
|
+
*/
|
|
371
|
+
function generateSimpleService(ctx) {
|
|
372
|
+
const { entity, options } = ctx;
|
|
373
|
+
const injectableImport = options.injectable
|
|
374
|
+
? `import { Injectable } from '@veloxts/core';
|
|
375
|
+
|
|
376
|
+
@Injectable()
|
|
377
|
+
`
|
|
378
|
+
: '';
|
|
379
|
+
return `/**
|
|
380
|
+
* ${entity.pascal} Service
|
|
381
|
+
*
|
|
382
|
+
* Business logic for ${entity.humanReadable} operations.
|
|
383
|
+
*/
|
|
384
|
+
${injectableImport}
|
|
385
|
+
// ============================================================================
|
|
386
|
+
// Types
|
|
387
|
+
// ============================================================================
|
|
388
|
+
|
|
389
|
+
export interface ${entity.pascal}Data {
|
|
390
|
+
id: string;
|
|
391
|
+
name: string;
|
|
392
|
+
// TODO: Add your fields
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
export interface Create${entity.pascal}Input {
|
|
396
|
+
name: string;
|
|
397
|
+
// TODO: Add creation fields
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
export interface Update${entity.pascal}Input {
|
|
401
|
+
name?: string;
|
|
402
|
+
// TODO: Add update fields
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
// ============================================================================
|
|
406
|
+
// Service
|
|
407
|
+
// ============================================================================
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* ${entity.pascal} service
|
|
411
|
+
*
|
|
412
|
+
* Handles business logic for ${entity.humanReadable} operations.
|
|
413
|
+
* Separate from procedures to allow reuse across different endpoints.
|
|
414
|
+
*/
|
|
415
|
+
${injectableImport ? '@Injectable()\n' : ''}export class ${entity.pascal}Service {
|
|
416
|
+
/**
|
|
417
|
+
* Process ${entity.humanReadable} data
|
|
418
|
+
*
|
|
419
|
+
* @example
|
|
420
|
+
* const result = await ${entity.camel}Service.process(data);
|
|
421
|
+
*/
|
|
422
|
+
async process(input: Create${entity.pascal}Input): Promise<${entity.pascal}Data> {
|
|
423
|
+
// TODO: Implement processing logic
|
|
424
|
+
return {
|
|
425
|
+
id: crypto.randomUUID(),
|
|
426
|
+
name: input.name,
|
|
427
|
+
};
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Validate ${entity.humanReadable} data
|
|
432
|
+
*/
|
|
433
|
+
validate(data: Partial<${entity.pascal}Data>): { valid: boolean; errors: string[] } {
|
|
434
|
+
const errors: string[] = [];
|
|
435
|
+
|
|
436
|
+
if (!data.name || data.name.trim().length === 0) {
|
|
437
|
+
errors.push('Name is required');
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
// TODO: Add more validation rules
|
|
441
|
+
|
|
442
|
+
return { valid: errors.length === 0, errors };
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
/**
|
|
446
|
+
* Transform ${entity.humanReadable} for output
|
|
447
|
+
*/
|
|
448
|
+
transform(data: ${entity.pascal}Data): Record<string, unknown> {
|
|
449
|
+
return {
|
|
450
|
+
id: data.id,
|
|
451
|
+
name: data.name,
|
|
452
|
+
// TODO: Transform for API response
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
// ============================================================================
|
|
458
|
+
// Singleton Instance
|
|
459
|
+
// ============================================================================
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Singleton service instance
|
|
463
|
+
*
|
|
464
|
+
* Use this for simple cases without DI.
|
|
465
|
+
*/
|
|
466
|
+
export const ${entity.camel}Service = new ${entity.pascal}Service();
|
|
467
|
+
`;
|
|
468
|
+
}
|
|
469
|
+
// ============================================================================
|
|
470
|
+
// Main Template
|
|
471
|
+
// ============================================================================
|
|
472
|
+
/**
|
|
473
|
+
* Service template function
|
|
474
|
+
*/
|
|
475
|
+
export const serviceTemplate = (ctx) => {
|
|
476
|
+
if (ctx.options.crud) {
|
|
477
|
+
return generateCrudService(ctx);
|
|
478
|
+
}
|
|
479
|
+
if (ctx.options.events) {
|
|
480
|
+
return generateEventService(ctx);
|
|
481
|
+
}
|
|
482
|
+
return generateSimpleService(ctx);
|
|
483
|
+
};
|
|
484
|
+
// ============================================================================
|
|
485
|
+
// Post-generation Instructions
|
|
486
|
+
// ============================================================================
|
|
487
|
+
export function getServiceInstructions(entityName, options) {
|
|
488
|
+
const lines = [`Your ${entityName} service has been created.`, '', 'Next steps:'];
|
|
489
|
+
if (options.injectable) {
|
|
490
|
+
lines.push(' 1. Register the service in your DI container');
|
|
491
|
+
lines.push(' 2. Inject into procedures or other services');
|
|
492
|
+
}
|
|
493
|
+
else {
|
|
494
|
+
lines.push(' 1. Import the service in your procedures');
|
|
495
|
+
lines.push(` import { ${entityName}Service } from '@/services/${entityName.toLowerCase()}';`);
|
|
496
|
+
}
|
|
497
|
+
if (options.crud) {
|
|
498
|
+
lines.push(' 2. Update the Prisma model name if different');
|
|
499
|
+
}
|
|
500
|
+
else if (options.events) {
|
|
501
|
+
lines.push(' 2. Set up event listeners for side effects');
|
|
502
|
+
}
|
|
503
|
+
else {
|
|
504
|
+
lines.push(' 2. Implement the service methods');
|
|
505
|
+
}
|
|
506
|
+
if (options.cache) {
|
|
507
|
+
lines.push(' 3. Consider using Redis for production caching');
|
|
508
|
+
}
|
|
509
|
+
return lines.join('\n');
|
|
510
|
+
}
|
|
511
|
+
//# sourceMappingURL=service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/generators/templates/service.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAmBH,+EAA+E;AAC/E,eAAe;AACf,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,UAAkB,EAAE,QAAwB;IACzE,OAAO,gBAAgB,UAAU,CAAC,WAAW,EAAE,KAAK,CAAC;AACvD,CAAC;AAED,+EAA+E;AAC/E,YAAY;AACZ,+EAA+E;AAE/E;;GAEG;AACH,SAAS,mBAAmB,CAAC,GAAoC;IAC/D,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IAEhC,MAAM,mBAAmB,GAAG,OAAO,CAAC,UAAU;QAC5C,CAAC,CAAC;;;;CAIL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,WAAW,GAAG,OAAO,CAAC,UAAU;QACpC,CAAC,CAAC,4EAA4E;QAC9E,CAAC,CAAC,qDAAqD,CAAC;IAE1D,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK;QAChC,CAAC,CAAC;;;;CAIL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK;QAChC,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAmCF;QACA,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,iBAAiB,GAAG,OAAO,CAAC,KAAK;QACrC,CAAC,CAAC;yBACmB,MAAM,CAAC,KAAK;uCACE,MAAM,CAAC,MAAM;;;mCAGjB,MAAM,CAAC,KAAK;;mBAE5B;QACf,CAAC,CAAC;qBACe,MAAM,CAAC,KAAK,iCAAiC,CAAC;IAEjE,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK;QACnC,CAAC,CAAC;mCAC6B,MAAM,CAAC,KAAK;4BACnB,MAAM,CAAC,MAAM;mBACtB;QACf,CAAC,CAAC;qBACe,MAAM,CAAC,KAAK,oBAAoB,CAAC;IAEpD,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK;QACnC,CAAC,CAAC;mCAC6B,MAAM,CAAC,KAAK;6BAClB,MAAM,CAAC,KAAK;4BACb,MAAM,CAAC,MAAM;mBACtB;QACf,CAAC,CAAC;qBACe,MAAM,CAAC,KAAK,mCAAmC,CAAC;IAEnE,MAAM,eAAe,GAAG,OAAO,CAAC,KAAK;QACnC,CAAC,CAAC;oBACc,MAAM,CAAC,KAAK;6BACH,MAAM,CAAC,KAAK;4BACb,MAAM,CAAC,MAAM,UAAU;QAC/C,CAAC,CAAC;oBACc,MAAM,CAAC,KAAK,6BAA6B,CAAC;IAE5D,OAAO;KACJ,MAAM,CAAC,MAAM;;wBAEM,MAAM,CAAC,aAAa;;;;EAI1C,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,GAAG,YAAY;;;;;YAKnD,MAAM,CAAC,MAAM;;;;;;;kBAOP,MAAM,CAAC,MAAM;;;;;kBAKb,MAAM,CAAC,MAAM;;;;;gBAKf,MAAM,CAAC,YAAY;;;;;;;;;;;;KAY9B,MAAM,CAAC,MAAM;;qCAEmB,MAAM,CAAC,aAAa;;EAEvD,mBAAmB,gBAAgB,MAAM,CAAC,MAAM;EAChD,WAAW;;;YAGD,MAAM,CAAC,aAAa;;wCAEQ,MAAM,CAAC,MAAM,aAAa,iBAAiB;;;;YAIvE,MAAM,CAAC,aAAa;;+CAEe,MAAM,CAAC,MAAM;YAChD,MAAM,CAAC,KAAK;WACb,MAAM,CAAC,KAAK;0BACG,MAAM,CAAC,MAAM;;aAE1B,MAAM,CAAC,KAAK;;;;YAIb,MAAM,CAAC,mBAAmB;;4BAEV,MAAM,CAAC,YAAY;YACnC,MAAM,CAAC,MAAM;;;;;;;;;gBAST,MAAM,CAAC,KAAK;;;;;gBAKZ,MAAM,CAAC,KAAK;;;;;;;cAOd,MAAM,CAAC,aAAa;;6BAEL,MAAM,CAAC,MAAM,mBAAmB,MAAM,CAAC,MAAM,MAAM,eAAe;;;;cAIjF,MAAM,CAAC,aAAa;;yCAEO,MAAM,CAAC,MAAM,mBAAmB,MAAM,CAAC,MAAM,MAAM,eAAe;;;;cAI7F,MAAM,CAAC,aAAa;;6CAEW,eAAe;;;;gBAI5C,MAAM,CAAC,aAAa;;;kCAGF,MAAM,CAAC,KAAK;;;EAG5C,YAAY;;CAEb,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,GAAoC;IAChE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IAEhC,MAAM,mBAAmB,GAAG,OAAO,CAAC,UAAU;QAC5C,CAAC,CAAC;;;;CAIL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;KACJ,MAAM,CAAC,MAAM;;4CAE0B,MAAM,CAAC,aAAa;;;;;EAK9D,mBAAmB;;;;;YAKT,MAAM,CAAC,MAAM;;;;;;;kBAOP,MAAM,CAAC,MAAM;;;;kBAIb,MAAM,CAAC,MAAM;;;;;;;;cAQjB,MAAM,CAAC,MAAM;KACtB,MAAM,CAAC,KAAK,eAAe,MAAM,CAAC,MAAM;KACxC,MAAM,CAAC,KAAK,eAAe,MAAM,CAAC,MAAM,WAAW,MAAM,CAAC,MAAM;KAChE,MAAM,CAAC,KAAK;;;;;;;;KAQZ,MAAM,CAAC,MAAM;;EAEhB,mBAAmB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,EAAE,gBAAgB,MAAM,CAAC,MAAM;;;;;;;;iCAQ5C,MAAM,CAAC,MAAM;;eAE/B,MAAM,CAAC,MAAM;;;;;;;;uBAQL,MAAM,CAAC,MAAM;;0BAEV,MAAM,CAAC,MAAM;;;;;;YAM3B,MAAM,CAAC,aAAa;;wCAEQ,MAAM,CAAC,MAAM;qBAChC,MAAM,CAAC,KAAK;;;;cAInB,MAAM,CAAC,aAAa;;6BAEL,MAAM,CAAC,MAAM,mBAAmB,MAAM,CAAC,MAAM;YAC9D,MAAM,CAAC,KAAK,oBAAoB,MAAM,CAAC,KAAK;iBACvC,MAAM,CAAC,KAAK,cAAc,MAAM,CAAC,KAAK;aAC1C,MAAM,CAAC,KAAK;;;;cAIX,MAAM,CAAC,aAAa;;yCAEO,MAAM,CAAC,MAAM,mBAAmB,MAAM,CAAC,MAAM;YAC1E,MAAM,CAAC,KAAK,oBAAoB,MAAM,CAAC,KAAK;iBACvC,MAAM,CAAC,KAAK,cAAc,MAAM,CAAC,KAAK;aAC1C,MAAM,CAAC,KAAK;;;;cAIX,MAAM,CAAC,aAAa;;;oBAGd,MAAM,CAAC,KAAK;iBACf,MAAM,CAAC,KAAK;;;;;;;;;sBASP,MAAM,CAAC,MAAM;;;cAGrB,MAAM,CAAC,KAAK,eAAe,MAAM,CAAC,KAAK;qBAChC,MAAM,CAAC,aAAa,eAAe,MAAM,CAAC,KAAK;;;;cAItD,MAAM,CAAC,KAAK;iBACT,MAAM,CAAC,MAAM;;;;;QAKtB,MAAM,CAAC,KAAK;;CAEnB,CAAC;AACF,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAAC,GAAoC;IACjE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,CAAC;IAEhC,MAAM,gBAAgB,GAAG,OAAO,CAAC,UAAU;QACzC,CAAC,CAAC;;;CAGL;QACG,CAAC,CAAC,EAAE,CAAC;IAEP,OAAO;KACJ,MAAM,CAAC,MAAM;;wBAEM,MAAM,CAAC,aAAa;;EAE1C,gBAAgB;;;;;mBAKC,MAAM,CAAC,MAAM;;;;;;yBAMP,MAAM,CAAC,MAAM;;;;;yBAKb,MAAM,CAAC,MAAM;;;;;;;;;;KAUjC,MAAM,CAAC,MAAM;;gCAEc,MAAM,CAAC,aAAa;;;EAGlD,gBAAgB,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,gBAAgB,MAAM,CAAC,MAAM;;eAEzD,MAAM,CAAC,aAAa;;;4BAGP,MAAM,CAAC,KAAK;;+BAET,MAAM,CAAC,MAAM,mBAAmB,MAAM,CAAC,MAAM;;;;;;;;;gBAS5D,MAAM,CAAC,aAAa;;2BAET,MAAM,CAAC,MAAM;;;;;;;;;;;;;iBAavB,MAAM,CAAC,aAAa;;oBAEjB,MAAM,CAAC,MAAM;;;;;;;;;;;;;;;;;;eAkBlB,MAAM,CAAC,KAAK,iBAAiB,MAAM,CAAC,MAAM;CACxD,CAAC;AACF,CAAC;AAED,+EAA+E;AAC/E,gBAAgB;AAChB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAqC,CAAC,GAAG,EAAE,EAAE;IACvE,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACvB,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,qBAAqB,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC,CAAC;AAEF,+EAA+E;AAC/E,+BAA+B;AAC/B,+EAA+E;AAE/E,MAAM,UAAU,sBAAsB,CAAC,UAAkB,EAAE,OAAuB;IAChF,MAAM,KAAK,GAAG,CAAC,QAAQ,UAAU,4BAA4B,EAAE,EAAE,EAAE,aAAa,CAAC,CAAC;IAElF,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;QAC7D,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QACzD,KAAK,CAAC,IAAI,CACR,iBAAiB,UAAU,8BAA8B,UAAU,CAAC,WAAW,EAAE,IAAI,CACtF,CAAC;IACJ,CAAC;IAED,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAC/D,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IACjE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Core type definitions for the VeloxTS code generator system.
|
|
5
5
|
*/
|
|
6
|
+
import { VeloxError } from '../errors/index.js';
|
|
6
7
|
/**
|
|
7
8
|
* All naming variations for an entity.
|
|
8
9
|
* Derived from a single input name (e.g., "User", "BlogPost").
|
|
@@ -31,6 +32,10 @@ export interface EntityNames {
|
|
|
31
32
|
/** Human readable plural: "Users", "Blog Posts" */
|
|
32
33
|
readonly humanReadablePlural: string;
|
|
33
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Project type based on architecture
|
|
37
|
+
*/
|
|
38
|
+
export type ProjectType = 'api' | 'fullstack';
|
|
34
39
|
/**
|
|
35
40
|
* Project-level context for template generation
|
|
36
41
|
*/
|
|
@@ -41,6 +46,18 @@ export interface ProjectContext {
|
|
|
41
46
|
readonly hasAuth: boolean;
|
|
42
47
|
/** Database type from configuration */
|
|
43
48
|
readonly database: 'sqlite' | 'postgresql' | 'mysql';
|
|
49
|
+
/** Project type: 'api' for API-only, 'fullstack' for RSC/Vinxi */
|
|
50
|
+
readonly projectType: ProjectType;
|
|
51
|
+
/** Whether this is a Vinxi/RSC project */
|
|
52
|
+
readonly isVinxiProject: boolean;
|
|
53
|
+
/** Whether @veloxts/web is installed */
|
|
54
|
+
readonly hasWeb: boolean;
|
|
55
|
+
/** Root directory for pages (app/pages for fullstack, undefined for api) */
|
|
56
|
+
readonly pagesDir?: string;
|
|
57
|
+
/** Root directory for layouts (app/layouts for fullstack, undefined for api) */
|
|
58
|
+
readonly layoutsDir?: string;
|
|
59
|
+
/** Root directory for actions (app/actions for fullstack, src/actions for api) */
|
|
60
|
+
readonly actionsDir?: string;
|
|
44
61
|
}
|
|
45
62
|
/**
|
|
46
63
|
* Context available to all templates
|
|
@@ -80,7 +97,7 @@ export interface GeneratorOutput {
|
|
|
80
97
|
/**
|
|
81
98
|
* Generator category for grouping in help
|
|
82
99
|
*/
|
|
83
|
-
export type GeneratorCategory = 'resource' | 'database' | 'test' | 'composite';
|
|
100
|
+
export type GeneratorCategory = 'resource' | 'database' | 'test' | 'composite' | 'infrastructure' | 'auth';
|
|
84
101
|
/**
|
|
85
102
|
* Generator metadata for CLI registration
|
|
86
103
|
*/
|
|
@@ -190,22 +207,17 @@ export declare enum GeneratorErrorCode {
|
|
|
190
207
|
FILE_ALREADY_EXISTS = "E2003",
|
|
191
208
|
INVALID_OPTION = "E2004",
|
|
192
209
|
GENERATION_FAILED = "E2005",
|
|
193
|
-
CANCELED = "E2006"
|
|
210
|
+
CANCELED = "E2006",
|
|
211
|
+
PROJECT_STRUCTURE = "E2007",
|
|
212
|
+
MIGRATION_FAILED = "E2008"
|
|
194
213
|
}
|
|
195
214
|
/**
|
|
196
|
-
* Structured generator error with code and optional fix suggestion
|
|
215
|
+
* Structured generator error with code and optional fix suggestion.
|
|
216
|
+
*
|
|
217
|
+
* Extends VeloxError for consistent error handling across the CLI.
|
|
197
218
|
*/
|
|
198
|
-
export declare class GeneratorError extends
|
|
219
|
+
export declare class GeneratorError extends VeloxError {
|
|
199
220
|
readonly code: GeneratorErrorCode;
|
|
200
|
-
|
|
201
|
-
constructor(code: GeneratorErrorCode, message: string, fix?: string | undefined);
|
|
202
|
-
/**
|
|
203
|
-
* Format error for display
|
|
204
|
-
*/
|
|
205
|
-
format(): string;
|
|
206
|
-
/**
|
|
207
|
-
* Convert to JSON for --json output
|
|
208
|
-
*/
|
|
209
|
-
toJSON(): Record<string, unknown>;
|
|
221
|
+
constructor(code: GeneratorErrorCode, message: string, fix?: string);
|
|
210
222
|
}
|
|
211
223
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/generators/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/generators/types.ts"],"names":[],"mappings":"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"}
|
package/dist/generators/types.js
CHANGED
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Core type definitions for the VeloxTS code generator system.
|
|
5
5
|
*/
|
|
6
|
+
import { VeloxError } from '../errors/index.js';
|
|
6
7
|
// ============================================================================
|
|
7
8
|
// Error Handling
|
|
8
9
|
// ============================================================================
|
|
@@ -17,38 +18,20 @@ export var GeneratorErrorCode;
|
|
|
17
18
|
GeneratorErrorCode["INVALID_OPTION"] = "E2004";
|
|
18
19
|
GeneratorErrorCode["GENERATION_FAILED"] = "E2005";
|
|
19
20
|
GeneratorErrorCode["CANCELED"] = "E2006";
|
|
21
|
+
GeneratorErrorCode["PROJECT_STRUCTURE"] = "E2007";
|
|
22
|
+
GeneratorErrorCode["MIGRATION_FAILED"] = "E2008";
|
|
20
23
|
})(GeneratorErrorCode || (GeneratorErrorCode = {}));
|
|
21
24
|
/**
|
|
22
|
-
* Structured generator error with code and optional fix suggestion
|
|
25
|
+
* Structured generator error with code and optional fix suggestion.
|
|
26
|
+
*
|
|
27
|
+
* Extends VeloxError for consistent error handling across the CLI.
|
|
23
28
|
*/
|
|
24
|
-
export class GeneratorError extends
|
|
29
|
+
export class GeneratorError extends VeloxError {
|
|
25
30
|
code;
|
|
26
|
-
fix;
|
|
27
31
|
constructor(code, message, fix) {
|
|
28
|
-
super(message);
|
|
32
|
+
super(code, { message, fix });
|
|
29
33
|
this.code = code;
|
|
30
|
-
this.fix = fix;
|
|
31
34
|
this.name = 'GeneratorError';
|
|
32
35
|
}
|
|
33
|
-
/**
|
|
34
|
-
* Format error for display
|
|
35
|
-
*/
|
|
36
|
-
format() {
|
|
37
|
-
let output = `GeneratorError[${this.code}]: ${this.message}`;
|
|
38
|
-
if (this.fix) {
|
|
39
|
-
output += `\n\n Fix: ${this.fix}`;
|
|
40
|
-
}
|
|
41
|
-
return output;
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Convert to JSON for --json output
|
|
45
|
-
*/
|
|
46
|
-
toJSON() {
|
|
47
|
-
return {
|
|
48
|
-
code: this.code,
|
|
49
|
-
message: this.message,
|
|
50
|
-
fix: this.fix,
|
|
51
|
-
};
|
|
52
|
-
}
|
|
53
36
|
}
|
|
54
37
|
//# sourceMappingURL=types.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/generators/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/generators/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAoShD,+EAA+E;AAC/E,iBAAiB;AACjB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,CAAN,IAAY,kBASX;AATD,WAAY,kBAAkB;IAC5B,8CAAwB,CAAA;IACxB,mDAA6B,CAAA;IAC7B,mDAA6B,CAAA;IAC7B,8CAAwB,CAAA;IACxB,iDAA2B,CAAA;IAC3B,wCAAkB,CAAA;IAClB,iDAA2B,CAAA;IAC3B,gDAA0B,CAAA;AAC5B,CAAC,EATW,kBAAkB,KAAlB,kBAAkB,QAS7B;AAED;;;;GAIG;AACH,MAAM,OAAO,cAAe,SAAQ,UAAU;IAE1B;IADlB,YACkB,IAAwB,EACxC,OAAe,EACf,GAAY;QAEZ,KAAK,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;QAJd,SAAI,GAAJ,IAAI,CAAoB;QAKxC,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF"}
|