@gyxer-studio/generator 0.1.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 +63 -0
- package/dist/generators/app.generator.d.ts +19 -0
- package/dist/generators/app.generator.d.ts.map +1 -0
- package/dist/generators/app.generator.js +237 -0
- package/dist/generators/app.generator.js.map +1 -0
- package/dist/generators/controller.generator.d.ts +10 -0
- package/dist/generators/controller.generator.d.ts.map +1 -0
- package/dist/generators/controller.generator.js +88 -0
- package/dist/generators/controller.generator.js.map +1 -0
- package/dist/generators/docker.generator.d.ts +15 -0
- package/dist/generators/docker.generator.d.ts.map +1 -0
- package/dist/generators/docker.generator.js +82 -0
- package/dist/generators/docker.generator.js.map +1 -0
- package/dist/generators/dto.generator.d.ts +23 -0
- package/dist/generators/dto.generator.d.ts.map +1 -0
- package/dist/generators/dto.generator.js +271 -0
- package/dist/generators/dto.generator.js.map +1 -0
- package/dist/generators/module.generator.d.ts +6 -0
- package/dist/generators/module.generator.d.ts.map +1 -0
- package/dist/generators/module.generator.js +20 -0
- package/dist/generators/module.generator.js.map +1 -0
- package/dist/generators/prisma.generator.d.ts +6 -0
- package/dist/generators/prisma.generator.d.ts.map +1 -0
- package/dist/generators/prisma.generator.js +243 -0
- package/dist/generators/prisma.generator.js.map +1 -0
- package/dist/generators/service.generator.d.ts +6 -0
- package/dist/generators/service.generator.d.ts.map +1 -0
- package/dist/generators/service.generator.js +97 -0
- package/dist/generators/service.generator.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -0
- package/dist/modules/auth-jwt.generator.d.ts +20 -0
- package/dist/modules/auth-jwt.generator.d.ts.map +1 -0
- package/dist/modules/auth-jwt.generator.js +431 -0
- package/dist/modules/auth-jwt.generator.js.map +1 -0
- package/dist/project-generator.d.ts +16 -0
- package/dist/project-generator.d.ts.map +1 -0
- package/dist/project-generator.js +199 -0
- package/dist/project-generator.js.map +1 -0
- package/dist/security/report.d.ts +24 -0
- package/dist/security/report.d.ts.map +1 -0
- package/dist/security/report.js +108 -0
- package/dist/security/report.js.map +1 -0
- package/dist/utils.d.ts +16 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +44 -0
- package/dist/utils.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Collect all foreign key fields that this entity needs in its DTO.
|
|
3
|
+
* Sources:
|
|
4
|
+
* 1. Entity's own relations that define a foreignKey (explicit FK).
|
|
5
|
+
* 2. Inverse relations from other entities that create FK on this entity.
|
|
6
|
+
*/
|
|
7
|
+
export function collectFkFields(entity, project) {
|
|
8
|
+
const fkFields = [];
|
|
9
|
+
const existingNames = new Set(entity.fields.map((f) => f.name));
|
|
10
|
+
// 1. From entity's own relations with foreignKey (one-to-one only).
|
|
11
|
+
// one-to-many: this entity is "one" side, FK goes on the TARGET.
|
|
12
|
+
for (const rel of entity.relations) {
|
|
13
|
+
if (rel.type === 'one-to-many')
|
|
14
|
+
continue; // FK is on target, not here
|
|
15
|
+
if (rel.foreignKey && !existingNames.has(rel.foreignKey)) {
|
|
16
|
+
fkFields.push({ name: rel.foreignKey, targetEntity: rel.target });
|
|
17
|
+
existingNames.add(rel.foreignKey);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
// 2. From inverse relations (other entities pointing to this one via one-to-many)
|
|
21
|
+
for (const otherEntity of project.entities) {
|
|
22
|
+
if (otherEntity.name === entity.name)
|
|
23
|
+
continue;
|
|
24
|
+
for (const rel of otherEntity.relations) {
|
|
25
|
+
if (rel.target !== entity.name)
|
|
26
|
+
continue;
|
|
27
|
+
// Skip if this entity already has a back-reference to otherEntity
|
|
28
|
+
const hasBackRef = entity.relations.some((r) => r.target === otherEntity.name);
|
|
29
|
+
if (hasBackRef)
|
|
30
|
+
continue;
|
|
31
|
+
const sourceName = otherEntity.name.charAt(0).toLowerCase() + otherEntity.name.slice(1);
|
|
32
|
+
if (rel.type === 'one-to-many') {
|
|
33
|
+
// Source is "one" side → this entity is "many" side → needs FK
|
|
34
|
+
const fk = rel.foreignKey || `${sourceName}Id`;
|
|
35
|
+
if (!existingNames.has(fk)) {
|
|
36
|
+
fkFields.push({ name: fk, targetEntity: otherEntity.name });
|
|
37
|
+
existingNames.add(fk);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else if (rel.type === 'one-to-one' && !rel.foreignKey) {
|
|
41
|
+
// Source has optional ref → this entity needs FK
|
|
42
|
+
const fk = `${sourceName}Id`;
|
|
43
|
+
if (!existingNames.has(fk)) {
|
|
44
|
+
fkFields.push({ name: fk, targetEntity: otherEntity.name });
|
|
45
|
+
existingNames.add(fk);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// many-to-many → no FK on either side (join table)
|
|
49
|
+
// one-to-one WITH foreignKey → source owns FK, not this entity
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return fkFields;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Generate Create DTO for an entity.
|
|
56
|
+
*/
|
|
57
|
+
export function generateCreateDto(entity, project) {
|
|
58
|
+
const className = `Create${entity.name}Dto`;
|
|
59
|
+
const fkFields = collectFkFields(entity, project);
|
|
60
|
+
const lines = [];
|
|
61
|
+
// Import ApiPropertyOptional too if any field is optional
|
|
62
|
+
const hasOptionalFields = entity.fields.some((f) => !f.required);
|
|
63
|
+
if (hasOptionalFields) {
|
|
64
|
+
lines.push("import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';");
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
lines.push("import { ApiProperty } from '@nestjs/swagger';");
|
|
68
|
+
}
|
|
69
|
+
// Import Prisma enums if entity has enum fields
|
|
70
|
+
const enumFields = entity.fields.filter((f) => f.type === 'enum' && f.enumValues);
|
|
71
|
+
if (enumFields.length > 0) {
|
|
72
|
+
const enumNames = enumFields.map((f) => `${entity.name}${f.name.charAt(0).toUpperCase() + f.name.slice(1)}`);
|
|
73
|
+
lines.push(`import { ${enumNames.join(', ')} } from '@prisma/client';`);
|
|
74
|
+
}
|
|
75
|
+
lines.push(generateValidatorImports(entity.fields, false, fkFields.length > 0));
|
|
76
|
+
lines.push('');
|
|
77
|
+
lines.push(`export class ${className} {`);
|
|
78
|
+
for (const field of entity.fields) {
|
|
79
|
+
lines.push(generateDtoField(field, entity, false));
|
|
80
|
+
}
|
|
81
|
+
// FK fields from relations
|
|
82
|
+
for (const fk of fkFields) {
|
|
83
|
+
lines.push(generateFkDtoField(fk, false));
|
|
84
|
+
}
|
|
85
|
+
// Auth-jwt: add password field to CreateUserDto
|
|
86
|
+
const hasAuthJwt = entity.name === 'User' &&
|
|
87
|
+
project.modules?.some((m) => m.name === 'auth-jwt' && m.enabled !== false);
|
|
88
|
+
if (hasAuthJwt) {
|
|
89
|
+
lines.push(" @ApiProperty({ description: 'User password (will be hashed)' })");
|
|
90
|
+
lines.push(' @IsString()');
|
|
91
|
+
lines.push(' @IsNotEmpty()');
|
|
92
|
+
lines.push(' password: string;');
|
|
93
|
+
lines.push('');
|
|
94
|
+
}
|
|
95
|
+
lines.push('}');
|
|
96
|
+
return lines.join('\n') + '\n';
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Generate Update DTO for an entity (all fields optional).
|
|
100
|
+
*/
|
|
101
|
+
export function generateUpdateDto(entity, project) {
|
|
102
|
+
const className = `Update${entity.name}Dto`;
|
|
103
|
+
const fkFields = collectFkFields(entity, project);
|
|
104
|
+
const lines = [];
|
|
105
|
+
lines.push("import { ApiPropertyOptional } from '@nestjs/swagger';");
|
|
106
|
+
// Import Prisma enums if entity has enum fields
|
|
107
|
+
const enumFields = entity.fields.filter((f) => f.type === 'enum' && f.enumValues);
|
|
108
|
+
if (enumFields.length > 0) {
|
|
109
|
+
const enumNames = enumFields.map((f) => `${entity.name}${f.name.charAt(0).toUpperCase() + f.name.slice(1)}`);
|
|
110
|
+
lines.push(`import { ${enumNames.join(', ')} } from '@prisma/client';`);
|
|
111
|
+
}
|
|
112
|
+
lines.push(generateValidatorImports(entity.fields, true, fkFields.length > 0));
|
|
113
|
+
lines.push('');
|
|
114
|
+
lines.push(`export class ${className} {`);
|
|
115
|
+
for (const field of entity.fields) {
|
|
116
|
+
lines.push(generateDtoField(field, entity, true));
|
|
117
|
+
}
|
|
118
|
+
// FK fields from relations (optional in update)
|
|
119
|
+
for (const fk of fkFields) {
|
|
120
|
+
lines.push(generateFkDtoField(fk, true));
|
|
121
|
+
}
|
|
122
|
+
lines.push('}');
|
|
123
|
+
return lines.join('\n') + '\n';
|
|
124
|
+
}
|
|
125
|
+
function generateDtoField(field, entity, isUpdate) {
|
|
126
|
+
const lines = [];
|
|
127
|
+
const optional = isUpdate || !field.required;
|
|
128
|
+
const decorator = isUpdate ? 'ApiPropertyOptional' : optional ? 'ApiPropertyOptional' : 'ApiProperty';
|
|
129
|
+
// Swagger decorator
|
|
130
|
+
const swaggerOpts = [];
|
|
131
|
+
if (field.description)
|
|
132
|
+
swaggerOpts.push(`description: '${field.description}'`);
|
|
133
|
+
if (field.type === 'enum' && field.enumValues) {
|
|
134
|
+
swaggerOpts.push(`enum: [${field.enumValues.map((v) => `'${v}'`).join(', ')}]`);
|
|
135
|
+
}
|
|
136
|
+
if (field.default !== undefined && field.default !== null) {
|
|
137
|
+
if (typeof field.default === 'string') {
|
|
138
|
+
swaggerOpts.push(`default: '${field.default}'`);
|
|
139
|
+
}
|
|
140
|
+
else {
|
|
141
|
+
swaggerOpts.push(`default: ${field.default}`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
const swaggerArgs = swaggerOpts.length > 0 ? `{ ${swaggerOpts.join(', ')} }` : '';
|
|
145
|
+
lines.push(` @${decorator}(${swaggerArgs})`);
|
|
146
|
+
// Validation decorators
|
|
147
|
+
const validators = getValidators(field, isUpdate);
|
|
148
|
+
for (const v of validators) {
|
|
149
|
+
lines.push(` ${v}`);
|
|
150
|
+
}
|
|
151
|
+
// Property
|
|
152
|
+
const tsType = mapToTsType(field, entity.name);
|
|
153
|
+
const questionMark = optional ? '?' : '';
|
|
154
|
+
lines.push(` ${field.name}${questionMark}: ${tsType};`);
|
|
155
|
+
lines.push('');
|
|
156
|
+
return lines.join('\n');
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Generate a DTO field for a foreign key (relation FK).
|
|
160
|
+
*/
|
|
161
|
+
function generateFkDtoField(fk, isUpdate) {
|
|
162
|
+
const lines = [];
|
|
163
|
+
const decorator = isUpdate ? 'ApiPropertyOptional' : 'ApiProperty';
|
|
164
|
+
const questionMark = isUpdate ? '?' : '';
|
|
165
|
+
lines.push(` @${decorator}({ description: 'FK to ${fk.targetEntity}' })`);
|
|
166
|
+
if (isUpdate) {
|
|
167
|
+
lines.push(' @IsOptional()');
|
|
168
|
+
}
|
|
169
|
+
lines.push(' @IsInt()');
|
|
170
|
+
lines.push(` ${fk.name}${questionMark}: number;`);
|
|
171
|
+
lines.push('');
|
|
172
|
+
return lines.join('\n');
|
|
173
|
+
}
|
|
174
|
+
function getValidators(field, isUpdate) {
|
|
175
|
+
const validators = [];
|
|
176
|
+
if (isUpdate || !field.required) {
|
|
177
|
+
validators.push('@IsOptional()');
|
|
178
|
+
}
|
|
179
|
+
switch (field.type) {
|
|
180
|
+
case 'string':
|
|
181
|
+
case 'text':
|
|
182
|
+
case 'uuid':
|
|
183
|
+
validators.push('@IsString()');
|
|
184
|
+
if (field.required && !isUpdate) {
|
|
185
|
+
validators.push('@IsNotEmpty()');
|
|
186
|
+
}
|
|
187
|
+
break;
|
|
188
|
+
case 'int':
|
|
189
|
+
validators.push('@IsInt()');
|
|
190
|
+
break;
|
|
191
|
+
case 'float':
|
|
192
|
+
validators.push('@IsNumber()');
|
|
193
|
+
break;
|
|
194
|
+
case 'boolean':
|
|
195
|
+
validators.push('@IsBoolean()');
|
|
196
|
+
break;
|
|
197
|
+
case 'datetime':
|
|
198
|
+
validators.push('@IsDateString()');
|
|
199
|
+
break;
|
|
200
|
+
case 'enum':
|
|
201
|
+
if (field.enumValues) {
|
|
202
|
+
validators.push(`@IsIn([${field.enumValues.map((v) => `'${v}'`).join(', ')}])`);
|
|
203
|
+
}
|
|
204
|
+
break;
|
|
205
|
+
}
|
|
206
|
+
return validators;
|
|
207
|
+
}
|
|
208
|
+
function generateValidatorImports(fields, isUpdate = false, hasFkFields = false) {
|
|
209
|
+
const validators = new Set();
|
|
210
|
+
if (isUpdate)
|
|
211
|
+
validators.add('IsOptional');
|
|
212
|
+
// FK fields always need IsInt (and IsOptional for update)
|
|
213
|
+
if (hasFkFields) {
|
|
214
|
+
validators.add('IsInt');
|
|
215
|
+
if (isUpdate)
|
|
216
|
+
validators.add('IsOptional');
|
|
217
|
+
}
|
|
218
|
+
for (const field of fields) {
|
|
219
|
+
if (!field.required || isUpdate)
|
|
220
|
+
validators.add('IsOptional');
|
|
221
|
+
switch (field.type) {
|
|
222
|
+
case 'string':
|
|
223
|
+
case 'text':
|
|
224
|
+
case 'uuid':
|
|
225
|
+
validators.add('IsString');
|
|
226
|
+
if (field.required && !isUpdate)
|
|
227
|
+
validators.add('IsNotEmpty');
|
|
228
|
+
break;
|
|
229
|
+
case 'int':
|
|
230
|
+
validators.add('IsInt');
|
|
231
|
+
break;
|
|
232
|
+
case 'float':
|
|
233
|
+
validators.add('IsNumber');
|
|
234
|
+
break;
|
|
235
|
+
case 'boolean':
|
|
236
|
+
validators.add('IsBoolean');
|
|
237
|
+
break;
|
|
238
|
+
case 'datetime':
|
|
239
|
+
validators.add('IsDateString');
|
|
240
|
+
break;
|
|
241
|
+
case 'enum':
|
|
242
|
+
validators.add('IsIn');
|
|
243
|
+
break;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
return `import { ${[...validators].sort().join(', ')} } from 'class-validator';`;
|
|
247
|
+
}
|
|
248
|
+
function mapToTsType(field, entityName) {
|
|
249
|
+
switch (field.type) {
|
|
250
|
+
case 'string':
|
|
251
|
+
case 'text':
|
|
252
|
+
case 'uuid':
|
|
253
|
+
case 'datetime':
|
|
254
|
+
return 'string';
|
|
255
|
+
case 'enum':
|
|
256
|
+
if (entityName && field.enumValues) {
|
|
257
|
+
return `${entityName}${field.name.charAt(0).toUpperCase() + field.name.slice(1)}`;
|
|
258
|
+
}
|
|
259
|
+
return 'string';
|
|
260
|
+
case 'int':
|
|
261
|
+
case 'float':
|
|
262
|
+
return 'number';
|
|
263
|
+
case 'boolean':
|
|
264
|
+
return 'boolean';
|
|
265
|
+
case 'json':
|
|
266
|
+
return 'Record<string, any>';
|
|
267
|
+
default:
|
|
268
|
+
return 'string';
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
//# sourceMappingURL=dto.generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dto.generator.js","sourceRoot":"","sources":["../../src/generators/dto.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.generator.d.ts","sourceRoot":"","sources":["../../src/generators/module.generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAerD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { toKebabCase } from '../utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a NestJS module for an entity.
|
|
4
|
+
*/
|
|
5
|
+
export function generateModule(entity) {
|
|
6
|
+
const name = entity.name;
|
|
7
|
+
const kebab = toKebabCase(name);
|
|
8
|
+
return `import { Module } from '@nestjs/common';
|
|
9
|
+
import { ${name}Service } from './${kebab}.service';
|
|
10
|
+
import { ${name}Controller } from './${kebab}.controller';
|
|
11
|
+
|
|
12
|
+
@Module({
|
|
13
|
+
controllers: [${name}Controller],
|
|
14
|
+
providers: [${name}Service],
|
|
15
|
+
exports: [${name}Service],
|
|
16
|
+
})
|
|
17
|
+
export class ${name}Module {}
|
|
18
|
+
`;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=module.generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.generator.js","sourceRoot":"","sources":["../../src/generators/module.generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IAEhC,OAAO;WACE,IAAI,qBAAqB,KAAK;WAC9B,IAAI,wBAAwB,KAAK;;;kBAG1B,IAAI;gBACN,IAAI;cACN,IAAI;;eAEH,IAAI;CAClB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.generator.d.ts","sourceRoot":"","sources":["../../src/generators/prisma.generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAA2B,MAAM,sBAAsB,CAAC;AAGlF;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,CA6ClE"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import { toSnakeCase } from '../utils.js';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a complete Prisma schema from a GyxerProject.
|
|
4
|
+
*/
|
|
5
|
+
export function generatePrismaSchema(project) {
|
|
6
|
+
const lines = [];
|
|
7
|
+
// Datasource
|
|
8
|
+
lines.push('// This file is auto-generated by Gyxer Studio. Do not edit manually.');
|
|
9
|
+
lines.push('');
|
|
10
|
+
lines.push('generator client {');
|
|
11
|
+
lines.push(' provider = "prisma-client-js"');
|
|
12
|
+
lines.push('}');
|
|
13
|
+
lines.push('');
|
|
14
|
+
lines.push('datasource db {');
|
|
15
|
+
lines.push(` provider = "${project.settings.database}"`);
|
|
16
|
+
lines.push(' url = env("DATABASE_URL")');
|
|
17
|
+
lines.push('}');
|
|
18
|
+
// Enums
|
|
19
|
+
for (const entity of project.entities) {
|
|
20
|
+
for (const field of entity.fields) {
|
|
21
|
+
if (field.type === 'enum' && field.enumValues && field.enumValues.length > 0) {
|
|
22
|
+
const enumName = `${entity.name}${capitalize(field.name)}`;
|
|
23
|
+
lines.push('');
|
|
24
|
+
lines.push(`enum ${enumName} {`);
|
|
25
|
+
for (const value of field.enumValues) {
|
|
26
|
+
lines.push(` ${value}`);
|
|
27
|
+
}
|
|
28
|
+
lines.push('}');
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
// Models
|
|
33
|
+
for (const entity of project.entities) {
|
|
34
|
+
lines.push('');
|
|
35
|
+
lines.push(generateModel(entity, project));
|
|
36
|
+
}
|
|
37
|
+
// Auto-generate User model for auth-jwt when no User entity is defined
|
|
38
|
+
const hasAuthJwt = project.modules?.some((m) => m.name === 'auth-jwt' && m.enabled !== false);
|
|
39
|
+
const hasUserEntity = project.entities.some((e) => e.name === 'User');
|
|
40
|
+
if (hasAuthJwt && !hasUserEntity) {
|
|
41
|
+
lines.push('');
|
|
42
|
+
lines.push(generateAuthUserModel());
|
|
43
|
+
}
|
|
44
|
+
return lines.join('\n') + '\n';
|
|
45
|
+
}
|
|
46
|
+
function generateModel(entity, project) {
|
|
47
|
+
const lines = [];
|
|
48
|
+
if (entity.description) {
|
|
49
|
+
lines.push(`/// ${entity.description}`);
|
|
50
|
+
}
|
|
51
|
+
lines.push(`model ${entity.name} {`);
|
|
52
|
+
// id field (always generated)
|
|
53
|
+
lines.push(' id Int @id @default(autoincrement())');
|
|
54
|
+
lines.push(' createdAt DateTime @default(now())');
|
|
55
|
+
lines.push(' updatedAt DateTime @updatedAt');
|
|
56
|
+
// Auth: add passwordHash to User model
|
|
57
|
+
const hasAuthJwt = project.modules?.some((m) => m.name === 'auth-jwt' && m.enabled !== false);
|
|
58
|
+
if (hasAuthJwt && entity.name === 'User') {
|
|
59
|
+
lines.push(' passwordHash String @map("password_hash")');
|
|
60
|
+
}
|
|
61
|
+
// User-defined fields
|
|
62
|
+
for (const field of entity.fields) {
|
|
63
|
+
lines.push(` ${generateField(field, entity)}`);
|
|
64
|
+
}
|
|
65
|
+
// Relations
|
|
66
|
+
for (const relation of entity.relations) {
|
|
67
|
+
lines.push(generateRelation(relation, entity, project));
|
|
68
|
+
}
|
|
69
|
+
// Auto-generate inverse relations (missing back-references)
|
|
70
|
+
for (const otherEntity of project.entities) {
|
|
71
|
+
if (otherEntity.name === entity.name)
|
|
72
|
+
continue;
|
|
73
|
+
for (const rel of otherEntity.relations) {
|
|
74
|
+
if (rel.target !== entity.name)
|
|
75
|
+
continue;
|
|
76
|
+
// Skip if this entity already has a back-reference to otherEntity
|
|
77
|
+
const hasBackRef = entity.relations.some((r) => r.target === otherEntity.name);
|
|
78
|
+
if (hasBackRef)
|
|
79
|
+
continue;
|
|
80
|
+
lines.push(generateInverseRelation(rel, otherEntity));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Model-level indexes (@@index)
|
|
84
|
+
const indexedFields = entity.fields.filter((f) => f.index);
|
|
85
|
+
for (const field of indexedFields) {
|
|
86
|
+
lines.push(` @@index([${field.name}])`);
|
|
87
|
+
}
|
|
88
|
+
// Table mapping
|
|
89
|
+
lines.push('');
|
|
90
|
+
lines.push(` @@map("${toSnakeCase(entity.name)}")`);
|
|
91
|
+
lines.push('}');
|
|
92
|
+
return lines.join('\n');
|
|
93
|
+
}
|
|
94
|
+
function generateField(field, entity) {
|
|
95
|
+
const parts = [];
|
|
96
|
+
// Name
|
|
97
|
+
const columnName = toSnakeCase(field.name);
|
|
98
|
+
parts.push(padRight(field.name, 14));
|
|
99
|
+
// Type
|
|
100
|
+
let prismaType = mapFieldType(field, entity);
|
|
101
|
+
if (!field.required) {
|
|
102
|
+
prismaType += '?';
|
|
103
|
+
}
|
|
104
|
+
parts.push(prismaType);
|
|
105
|
+
// Attributes
|
|
106
|
+
const attrs = [];
|
|
107
|
+
if (field.unique)
|
|
108
|
+
attrs.push('@unique');
|
|
109
|
+
if (field.default !== undefined && field.default !== null) {
|
|
110
|
+
if (field.type === 'boolean') {
|
|
111
|
+
attrs.push(`@default(${field.default})`);
|
|
112
|
+
}
|
|
113
|
+
else if (field.type === 'int' || field.type === 'float') {
|
|
114
|
+
attrs.push(`@default(${field.default})`);
|
|
115
|
+
}
|
|
116
|
+
else if (field.type === 'enum') {
|
|
117
|
+
attrs.push(`@default(${field.default})`);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
attrs.push(`@default("${field.default}")`);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (field.name !== columnName) {
|
|
124
|
+
attrs.push(`@map("${columnName}")`);
|
|
125
|
+
}
|
|
126
|
+
if (attrs.length > 0) {
|
|
127
|
+
parts.push(attrs.join(' '));
|
|
128
|
+
}
|
|
129
|
+
return parts.join(' ');
|
|
130
|
+
}
|
|
131
|
+
function generateRelation(relation, entity, project) {
|
|
132
|
+
const lines = [];
|
|
133
|
+
if (relation.type === 'one-to-many') {
|
|
134
|
+
// This entity is the "one" side — always an array relation.
|
|
135
|
+
// foreignKey (if provided) specifies the FK name on the target (many) side.
|
|
136
|
+
lines.push(` ${padRight(relation.name, 14)} ${relation.target}[]`);
|
|
137
|
+
}
|
|
138
|
+
else if (relation.type === 'one-to-one') {
|
|
139
|
+
if (relation.foreignKey) {
|
|
140
|
+
const fk = relation.foreignKey;
|
|
141
|
+
lines.push(` ${padRight(fk, 14)} Int @unique`);
|
|
142
|
+
lines.push(` ${padRight(relation.name, 14)} ${relation.target} @relation(fields: [${fk}], references: [id], onDelete: ${toPrismaAction(relation.onDelete)})`);
|
|
143
|
+
}
|
|
144
|
+
else {
|
|
145
|
+
lines.push(` ${padRight(relation.name, 14)} ${relation.target}?`);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
else if (relation.type === 'many-to-many') {
|
|
149
|
+
lines.push(` ${padRight(relation.name, 14)} ${relation.target}[]`);
|
|
150
|
+
}
|
|
151
|
+
return lines.join('\n');
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Generate the inverse (back-reference) relation field when only one side is defined.
|
|
155
|
+
* Prisma requires both sides of a relation to be present.
|
|
156
|
+
*/
|
|
157
|
+
function generateInverseRelation(sourceRelation, sourceEntity) {
|
|
158
|
+
const lines = [];
|
|
159
|
+
const sourceName = sourceEntity.name.charAt(0).toLowerCase() + sourceEntity.name.slice(1);
|
|
160
|
+
if (sourceRelation.type === 'one-to-many') {
|
|
161
|
+
// Source is the "one" side → this entity is the "many" side → needs FK + relation
|
|
162
|
+
const fk = sourceRelation.foreignKey || `${sourceName}Id`;
|
|
163
|
+
lines.push(` ${padRight(fk, 14)} Int`);
|
|
164
|
+
lines.push(` ${padRight(sourceName, 14)} ${sourceEntity.name} @relation(fields: [${fk}], references: [id], onDelete: ${toPrismaAction(sourceRelation.onDelete)})`);
|
|
165
|
+
}
|
|
166
|
+
else if (sourceRelation.type === 'one-to-one') {
|
|
167
|
+
if (sourceRelation.foreignKey) {
|
|
168
|
+
// Source owns the FK → this entity is the inverse → optional ref
|
|
169
|
+
lines.push(` ${padRight(sourceName, 14)} ${sourceEntity.name}?`);
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
// Source has optional ref → this entity needs FK + relation
|
|
173
|
+
const fk = `${sourceName}Id`;
|
|
174
|
+
lines.push(` ${padRight(fk, 14)} Int @unique`);
|
|
175
|
+
lines.push(` ${padRight(sourceName, 14)} ${sourceEntity.name} @relation(fields: [${fk}], references: [id], onDelete: ${toPrismaAction(sourceRelation.onDelete)})`);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
else if (sourceRelation.type === 'many-to-many') {
|
|
179
|
+
// Both sides need arrays
|
|
180
|
+
lines.push(` ${padRight(sourceName + 's', 14)} ${sourceEntity.name}[]`);
|
|
181
|
+
}
|
|
182
|
+
return lines.join('\n');
|
|
183
|
+
}
|
|
184
|
+
function mapFieldType(field, entity) {
|
|
185
|
+
switch (field.type) {
|
|
186
|
+
case 'string':
|
|
187
|
+
return 'String';
|
|
188
|
+
case 'text':
|
|
189
|
+
return 'String';
|
|
190
|
+
case 'int':
|
|
191
|
+
return 'Int';
|
|
192
|
+
case 'float':
|
|
193
|
+
return 'Float';
|
|
194
|
+
case 'boolean':
|
|
195
|
+
return 'Boolean';
|
|
196
|
+
case 'datetime':
|
|
197
|
+
return 'DateTime';
|
|
198
|
+
case 'json':
|
|
199
|
+
return 'Json';
|
|
200
|
+
case 'uuid':
|
|
201
|
+
return 'String';
|
|
202
|
+
case 'enum':
|
|
203
|
+
return `${entity.name}${capitalize(field.name)}`;
|
|
204
|
+
default:
|
|
205
|
+
return 'String';
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/** Map schema onDelete values (SCREAMING_CASE) to Prisma format (PascalCase). */
|
|
209
|
+
function toPrismaAction(action) {
|
|
210
|
+
const map = {
|
|
211
|
+
CASCADE: 'Cascade',
|
|
212
|
+
SET_NULL: 'SetNull',
|
|
213
|
+
RESTRICT: 'Restrict',
|
|
214
|
+
NO_ACTION: 'NoAction',
|
|
215
|
+
};
|
|
216
|
+
return map[action] || 'Cascade';
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Generate a full User model for auth-jwt when no User entity exists in the project.
|
|
220
|
+
* Provides the minimal fields needed by the auth module: email, name, passwordHash.
|
|
221
|
+
*/
|
|
222
|
+
function generateAuthUserModel() {
|
|
223
|
+
const lines = [];
|
|
224
|
+
lines.push('/// Auto-generated User model for auth-jwt module');
|
|
225
|
+
lines.push('model User {');
|
|
226
|
+
lines.push(' id Int @id @default(autoincrement())');
|
|
227
|
+
lines.push(' createdAt DateTime @default(now())');
|
|
228
|
+
lines.push(' updatedAt DateTime @updatedAt');
|
|
229
|
+
lines.push(' email String @unique');
|
|
230
|
+
lines.push(' name String');
|
|
231
|
+
lines.push(' passwordHash String @map("password_hash")');
|
|
232
|
+
lines.push('');
|
|
233
|
+
lines.push(' @@map("user")');
|
|
234
|
+
lines.push('}');
|
|
235
|
+
return lines.join('\n');
|
|
236
|
+
}
|
|
237
|
+
function capitalize(str) {
|
|
238
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
239
|
+
}
|
|
240
|
+
function padRight(str, len) {
|
|
241
|
+
return str.padEnd(len);
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=prisma.generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.generator.js","sourceRoot":"","sources":["../../src/generators/prisma.generator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C;;GAEG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAqB;IACxD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,aAAa;IACb,KAAK,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACpF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACjC,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAC9C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9B,KAAK,CAAC,IAAI,CAAC,iBAAiB,OAAO,CAAC,QAAQ,CAAC,QAAQ,GAAG,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEhB,QAAQ;IACR,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtC,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7E,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACf,KAAK,CAAC,IAAI,CAAC,QAAQ,QAAQ,IAAI,CAAC,CAAC;gBACjC,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,UAAU,EAAE,CAAC;oBACrC,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC,CAAC;gBAC3B,CAAC;gBACD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;IACH,CAAC;IAED,SAAS;IACT,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QACtC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC7C,CAAC;IAED,uEAAuE;IACvE,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;IAC9F,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC;IACtE,IAAI,UAAU,IAAI,CAAC,aAAa,EAAE,CAAC;QACjC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;IACtC,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;AACjC,CAAC;AAED,SAAS,aAAa,CAAC,MAAc,EAAE,OAAqB;IAC1D,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAErC,8BAA8B;IAC9B,KAAK,CAAC,IAAI,CAAC,oDAAoD,CAAC,CAAC;IACjE,KAAK,CAAC,IAAI,CAAC,sCAAsC,CAAC,CAAC;IACnD,KAAK,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;IAE9C,uCAAuC;IACvC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,CAAC,CAAC,OAAO,KAAK,KAAK,CAAC,CAAC;IAC9F,IAAI,UAAU,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QACzC,KAAK,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;IAC9D,CAAC;IAED,sBAAsB;IACtB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,KAAK,aAAa,CAAC,KAAK,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;IAClD,CAAC;IAED,YAAY;IACZ,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACxC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,4DAA4D;IAC5D,KAAK,MAAM,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC3C,IAAI,WAAW,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI;YAAE,SAAS;QAE/C,KAAK,MAAM,GAAG,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;YACxC,IAAI,GAAG,CAAC,MAAM,KAAK,MAAM,CAAC,IAAI;gBAAE,SAAS;YAEzC,kEAAkE;YAClE,MAAM,UAAU,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,WAAW,CAAC,IAAI,CAAC,CAAC;YAC/E,IAAI,UAAU;gBAAE,SAAS;YAEzB,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IAED,gCAAgC;IAChC,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC3D,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,KAAK,CAAC,IAAI,CAAC,cAAc,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC;IAC3C,CAAC;IAED,gBAAgB;IAChB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,YAAY,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEhB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,aAAa,CAAC,KAAY,EAAE,MAAc;IACjD,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,OAAO;IACP,MAAM,UAAU,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;IAErC,OAAO;IACP,IAAI,UAAU,GAAG,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC;QACpB,UAAU,IAAI,GAAG,CAAC;IACpB,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAEvB,aAAa;IACb,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAExC,IAAI,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,KAAK,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;QAC1D,IAAI,KAAK,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAC1D,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACjC,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC;QAC3C,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,aAAa,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;QAC7C,CAAC;IACH,CAAC;IAED,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC9B,KAAK,CAAC,IAAI,CAAC,SAAS,UAAU,IAAI,CAAC,CAAC;IACtC,CAAC;IAED,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,gBAAgB,CAAC,QAAkB,EAAE,MAAc,EAAE,OAAqB;IACjF,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,IAAI,QAAQ,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QACpC,4DAA4D;QAC5D,4EAA4E;QAC5E,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;IACtE,CAAC;SAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC1C,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC;YACxB,MAAM,EAAE,GAAG,QAAQ,CAAC,UAAU,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC;YACrD,KAAK,CAAC,IAAI,CACR,KAAK,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,uBAAuB,EAAE,kCAAkC,cAAc,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CACnJ,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;SAAM,IAAI,QAAQ,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5C,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;IACtE,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,SAAS,uBAAuB,CAAC,cAAwB,EAAE,YAAoB;IAC7E,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAE1F,IAAI,cAAc,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;QAC1C,kFAAkF;QAClF,MAAM,EAAE,GAAG,cAAc,CAAC,UAAU,IAAI,GAAG,UAAU,IAAI,CAAC;QAC1D,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;QACxC,KAAK,CAAC,IAAI,CACR,KAAK,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,uBAAuB,EAAE,kCAAkC,cAAc,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CACxJ,CAAC;IACJ,CAAC;SAAM,IAAI,cAAc,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAChD,IAAI,cAAc,CAAC,UAAU,EAAE,CAAC;YAC9B,iEAAiE;YACjE,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,4DAA4D;YAC5D,MAAM,EAAE,GAAG,GAAG,UAAU,IAAI,CAAC;YAC7B,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,mBAAmB,CAAC,CAAC;YACrD,KAAK,CAAC,IAAI,CACR,KAAK,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,uBAAuB,EAAE,kCAAkC,cAAc,CAAC,cAAc,CAAC,QAAQ,CAAC,GAAG,CACxJ,CAAC;QACJ,CAAC;IACH,CAAC;SAAM,IAAI,cAAc,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAClD,yBAAyB;QACzB,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC,UAAU,GAAG,GAAG,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC,IAAI,IAAI,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,YAAY,CAAC,KAAY,EAAE,MAAc;IAChD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC;QAClB,KAAK,KAAK;YACR,OAAO,KAAK,CAAC;QACf,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,SAAS;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,UAAU;YACb,OAAO,UAAU,CAAC;QACpB,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,MAAM;YACT,OAAO,QAAQ,CAAC;QAClB,KAAK,MAAM;YACT,OAAO,GAAG,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD;YACE,OAAO,QAAQ,CAAC;IACpB,CAAC;AACH,CAAC;AAED,iFAAiF;AACjF,SAAS,cAAc,CAAC,MAAc;IACpC,MAAM,GAAG,GAA2B;QAClC,OAAO,EAAE,SAAS;QAClB,QAAQ,EAAE,SAAS;QACnB,QAAQ,EAAE,UAAU;QACpB,SAAS,EAAE,UAAU;KACtB,CAAC;IACF,OAAO,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,CAAC;AAClC,CAAC;AAED;;;GAGG;AACH,SAAS,qBAAqB;IAC5B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IAChE,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;IACrE,KAAK,CAAC,IAAI,CAAC,0CAA0C,CAAC,CAAC;IACvD,KAAK,CAAC,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAClD,KAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC/C,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACrC,KAAK,CAAC,IAAI,CAAC,gDAAgD,CAAC,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IAC9B,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACpD,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,GAAW;IACxC,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Entity, GyxerProject } from '@gyxer-studio/schema';
|
|
2
|
+
/**
|
|
3
|
+
* Generate a NestJS service for an entity with full CRUD.
|
|
4
|
+
*/
|
|
5
|
+
export declare function generateService(entity: Entity, project: GyxerProject): string;
|
|
6
|
+
//# sourceMappingURL=service.generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.generator.d.ts","sourceRoot":"","sources":["../../src/generators/service.generator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAGjE;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAG,MAAM,CA+F7E"}
|