@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.
Files changed (50) hide show
  1. package/README.md +63 -0
  2. package/dist/generators/app.generator.d.ts +19 -0
  3. package/dist/generators/app.generator.d.ts.map +1 -0
  4. package/dist/generators/app.generator.js +237 -0
  5. package/dist/generators/app.generator.js.map +1 -0
  6. package/dist/generators/controller.generator.d.ts +10 -0
  7. package/dist/generators/controller.generator.d.ts.map +1 -0
  8. package/dist/generators/controller.generator.js +88 -0
  9. package/dist/generators/controller.generator.js.map +1 -0
  10. package/dist/generators/docker.generator.d.ts +15 -0
  11. package/dist/generators/docker.generator.d.ts.map +1 -0
  12. package/dist/generators/docker.generator.js +82 -0
  13. package/dist/generators/docker.generator.js.map +1 -0
  14. package/dist/generators/dto.generator.d.ts +23 -0
  15. package/dist/generators/dto.generator.d.ts.map +1 -0
  16. package/dist/generators/dto.generator.js +271 -0
  17. package/dist/generators/dto.generator.js.map +1 -0
  18. package/dist/generators/module.generator.d.ts +6 -0
  19. package/dist/generators/module.generator.d.ts.map +1 -0
  20. package/dist/generators/module.generator.js +20 -0
  21. package/dist/generators/module.generator.js.map +1 -0
  22. package/dist/generators/prisma.generator.d.ts +6 -0
  23. package/dist/generators/prisma.generator.d.ts.map +1 -0
  24. package/dist/generators/prisma.generator.js +243 -0
  25. package/dist/generators/prisma.generator.js.map +1 -0
  26. package/dist/generators/service.generator.d.ts +6 -0
  27. package/dist/generators/service.generator.d.ts.map +1 -0
  28. package/dist/generators/service.generator.js +97 -0
  29. package/dist/generators/service.generator.js.map +1 -0
  30. package/dist/index.d.ts +14 -0
  31. package/dist/index.d.ts.map +1 -0
  32. package/dist/index.js +16 -0
  33. package/dist/index.js.map +1 -0
  34. package/dist/modules/auth-jwt.generator.d.ts +20 -0
  35. package/dist/modules/auth-jwt.generator.d.ts.map +1 -0
  36. package/dist/modules/auth-jwt.generator.js +431 -0
  37. package/dist/modules/auth-jwt.generator.js.map +1 -0
  38. package/dist/project-generator.d.ts +16 -0
  39. package/dist/project-generator.d.ts.map +1 -0
  40. package/dist/project-generator.js +199 -0
  41. package/dist/project-generator.js.map +1 -0
  42. package/dist/security/report.d.ts +24 -0
  43. package/dist/security/report.d.ts.map +1 -0
  44. package/dist/security/report.js +108 -0
  45. package/dist/security/report.js.map +1 -0
  46. package/dist/utils.d.ts +16 -0
  47. package/dist/utils.d.ts.map +1 -0
  48. package/dist/utils.js +44 -0
  49. package/dist/utils.js.map +1 -0
  50. 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,6 @@
1
+ import type { Entity } from '@gyxer-studio/schema';
2
+ /**
3
+ * Generate a NestJS module for an entity.
4
+ */
5
+ export declare function generateModule(entity: Entity): string;
6
+ //# sourceMappingURL=module.generator.d.ts.map
@@ -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,6 @@
1
+ import type { GyxerProject } from '@gyxer-studio/schema';
2
+ /**
3
+ * Generate a complete Prisma schema from a GyxerProject.
4
+ */
5
+ export declare function generatePrismaSchema(project: GyxerProject): string;
6
+ //# sourceMappingURL=prisma.generator.d.ts.map
@@ -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"}