@nestledjs/api 0.1.0 → 0.1.2
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/generators.json +5 -0
- package/package.json +3 -3
- package/src/app/files/src/main.ts__tmpl__ +19 -7
- package/src/config/files/src/lib/config.service.ts__tmpl__ +16 -2
- package/src/config/files/src/lib/configuration.ts__tmpl__ +1 -0
- package/src/config/generator.js +1 -1
- package/src/config/generator.js.map +1 -1
- package/src/core/files/helpers/src/index.ts__tmpl__ +1 -0
- package/src/core/files/helpers/src/lib/graphql-select.ts__tmpl__ +52 -0
- package/src/core/generator.js +6 -2
- package/src/core/generator.js.map +1 -1
- package/src/custom/generator.js +14 -6
- package/src/custom/generator.js.map +1 -1
- package/src/generate-crud/files/data-access/src/index.ts__tmpl__ +1 -0
- package/src/generate-crud/files/data-access/src/lib/api-crud-data-access.service.ts__tmpl__ +131 -11
- package/src/generate-crud/files/data-access/src/lib/dto/index.ts__tmpl__ +138 -150
- package/src/generate-crud/generator.d.ts +1 -17
- package/src/generate-crud/generator.js +28 -12
- package/src/generate-crud/generator.js.map +1 -1
- package/src/integrations/generator.d.ts +2 -0
- package/src/integrations/generator.js +15 -0
- package/src/integrations/generator.js.map +1 -0
- package/src/integrations/schema.json +8 -0
- package/src/setup/generator.js +2 -3
- package/src/setup/generator.js.map +1 -1
- package/src/utils/files/src/index.ts__tmpl__ +1 -0
- package/src/utils/files/src/lib/types/nest-context-type.ts__tmpl__ +4 -0
- /package/src/config/files/src/lib/{config.modules.ts__tmpl__ → config.module.ts__tmpl__} +0 -0
package/generators.json
CHANGED
|
@@ -64,6 +64,11 @@
|
|
|
64
64
|
"factory": "./src/utils/generator.js",
|
|
65
65
|
"schema": "./src/utils/schema.json",
|
|
66
66
|
"description": "Generate a utility plugin with auth utils."
|
|
67
|
+
},
|
|
68
|
+
"integrations": {
|
|
69
|
+
"factory": "./src/integrations/generator.js",
|
|
70
|
+
"schema": "./src/integrations/schema.json",
|
|
71
|
+
"description": "Generate a new Nx NestJS project called 'integrations' in libs/api."
|
|
67
72
|
}
|
|
68
73
|
}
|
|
69
74
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nestledjs/api",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.2",
|
|
4
4
|
"generators": "./generators.json",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "./src/index.js",
|
|
@@ -19,12 +19,12 @@
|
|
|
19
19
|
"tslib": "^2.3.0",
|
|
20
20
|
"@nx/devkit": "21.2.1",
|
|
21
21
|
"@nx/js": "21.2.1",
|
|
22
|
-
"@prisma/internals": "^6.
|
|
22
|
+
"@prisma/internals": "^6.11.0",
|
|
23
23
|
"pluralize": "^8.0.0",
|
|
24
24
|
"dotenv": "16.4.5",
|
|
25
25
|
"pg": "^8.13.0"
|
|
26
26
|
},
|
|
27
27
|
"peerDependencies": {
|
|
28
|
-
"@nestledjs/utils": "0.1.
|
|
28
|
+
"@nestledjs/utils": "0.1.1"
|
|
29
29
|
}
|
|
30
30
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Logger } from '@nestjs/common'
|
|
2
2
|
import { NestFactory } from '@nestjs/core'
|
|
3
|
-
import { ConfigService } from '
|
|
3
|
+
import { ConfigService } from '@<%= npmScope %>/api/config'
|
|
4
4
|
import cookieParser from 'cookie-parser'
|
|
5
5
|
|
|
6
6
|
import { AppModule } from './app.module'
|
|
@@ -10,16 +10,28 @@ async function bootstrap() {
|
|
|
10
10
|
const configService = app.get(ConfigService)
|
|
11
11
|
|
|
12
12
|
// Get individual properties with fallbacks
|
|
13
|
-
const prefix = configService.
|
|
14
|
-
const port = configService.
|
|
15
|
-
const host = configService.
|
|
13
|
+
const prefix = configService.prefix || 'api';
|
|
14
|
+
const port = configService.port || 3000;
|
|
15
|
+
const host = configService.host || 'localhost';
|
|
16
16
|
|
|
17
17
|
app.setGlobalPrefix(prefix)
|
|
18
|
+
|
|
19
|
+
// Use the apiCorsOrigins getter and handle as array
|
|
20
|
+
const origins = configService.apiCorsOrigins.length
|
|
21
|
+
? configService.apiCorsOrigins
|
|
22
|
+
: ['http://localhost:4200']; // fallback for dev
|
|
23
|
+
|
|
18
24
|
app.enableCors({
|
|
19
25
|
credentials: true,
|
|
20
|
-
origin:
|
|
21
|
-
|
|
22
|
-
|
|
26
|
+
origin: (origin, callback) => {
|
|
27
|
+
if (!origin) return callback(null, true);
|
|
28
|
+
if (origins.includes(origin)) {
|
|
29
|
+
return callback(null, true);
|
|
30
|
+
}
|
|
31
|
+
return callback(new Error('Not allowed by CORS'));
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
app.use(cookieParser(configService.cookie.secret || 'secret'));
|
|
23
35
|
|
|
24
36
|
await app.listen(port, host, () => {
|
|
25
37
|
Logger.log(`Listening at http://${host}:${port}/${prefix}`)
|
|
@@ -14,8 +14,22 @@ export class ConfigService {
|
|
|
14
14
|
return this.config.get<string[]>('api.cors.origin') ?? []
|
|
15
15
|
}
|
|
16
16
|
|
|
17
|
-
get cookie(): { name: string; options: CookieOptions } {
|
|
18
|
-
return this.config.getOrThrow<{ name: string; options: CookieOptions }>(
|
|
17
|
+
get cookie(): { name: string; secret: string; options: CookieOptions } {
|
|
18
|
+
return this.config.getOrThrow<{ name: string; secret: string; options: CookieOptions }>(
|
|
19
|
+
'api.cookie',
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
get prefix(): string {
|
|
24
|
+
return this.config.getOrThrow<string>('prefix')
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
get port(): number {
|
|
28
|
+
return this.config.getOrThrow<number>('port')
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
get host(): string {
|
|
32
|
+
return this.config.getOrThrow<string>('host')
|
|
19
33
|
}
|
|
20
34
|
|
|
21
35
|
get appEmail(): string {
|
package/src/config/generator.js
CHANGED
|
@@ -8,7 +8,7 @@ function generateLibraries(tree_1) {
|
|
|
8
8
|
return tslib_1.__awaiter(this, arguments, void 0, function* (tree, options = {}) {
|
|
9
9
|
const templateRootPath = (0, devkit_1.joinPathFragments)(__dirname, './files');
|
|
10
10
|
const overwrite = options.overwrite === true;
|
|
11
|
-
yield (0, utils_1.apiLibraryGenerator)(tree, { name: 'config', overwrite }, templateRootPath);
|
|
11
|
+
yield (0, utils_1.apiLibraryGenerator)(tree, { name: 'config', overwrite, customName: true }, templateRootPath);
|
|
12
12
|
yield (0, devkit_1.formatFiles)(tree);
|
|
13
13
|
return () => {
|
|
14
14
|
(0, devkit_1.installPackagesTask)(tree);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/config/generator.ts"],"names":[],"mappings":";;AAIA,oCAWC;;AAfD,uCAAsF;AACtF,4CAAsD;AAGtD,SAA8B,iBAAiB;iEAAC,IAAU,EAAE,UAAoC,EAAE;QAChG,MAAM,gBAAgB,GAAG,IAAA,0BAAiB,EAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAChE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,CAAA;QAE5C,MAAM,IAAA,2BAAmB,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,gBAAgB,CAAC,CAAA;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/config/generator.ts"],"names":[],"mappings":";;AAIA,oCAWC;;AAfD,uCAAsF;AACtF,4CAAsD;AAGtD,SAA8B,iBAAiB;iEAAC,IAAU,EAAE,UAAoC,EAAE;QAChG,MAAM,gBAAgB,GAAG,IAAA,0BAAiB,EAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAChE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,CAAA;QAE5C,MAAM,IAAA,2BAAmB,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,gBAAgB,CAAC,CAAA;QAElG,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAA;QAEvB,OAAO,GAAG,EAAE;YACV,IAAA,4BAAmB,EAAC,IAAI,CAAC,CAAA;QAC3B,CAAC,CAAA;IACH,CAAC;CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './lib/graphql-select'
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import graphqlFields from 'graphql-fields'
|
|
2
|
+
import { Prisma } from '@<%= npmScope %>/api/prisma'
|
|
3
|
+
import type { DMMF } from '@prisma/client/runtime/library'
|
|
4
|
+
import { GraphQLResolveInfo } from 'graphql/type'
|
|
5
|
+
|
|
6
|
+
const dmmf = Prisma.dmmf
|
|
7
|
+
|
|
8
|
+
function getNamedType(type: any): string {
|
|
9
|
+
if (type.ofType) return getNamedType(type.ofType)
|
|
10
|
+
return type.name
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
function getModelFromTypeName(typeName: string) {
|
|
14
|
+
return dmmf.datamodel.models.find(m => m.name === typeName)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
function buildSelectTree(fieldTree: any, model: any): any {
|
|
18
|
+
const result: Record<string, any> = {}
|
|
19
|
+
|
|
20
|
+
for (const key in fieldTree) {
|
|
21
|
+
const field = model.fields.find((f: DMMF.Field) => f.name === key)
|
|
22
|
+
if (!field) continue
|
|
23
|
+
|
|
24
|
+
if (field.relationName && typeof fieldTree[key] === 'object') {
|
|
25
|
+
const relatedModel = dmmf.datamodel.models.find(m => m.name === field.type)
|
|
26
|
+
if (relatedModel) {
|
|
27
|
+
result[key] = {
|
|
28
|
+
select: buildSelectTree(fieldTree[key], relatedModel),
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
} else {
|
|
32
|
+
result[key] = true
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
return result
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Automatically converts a GraphQL `info` object into a Prisma `select` object.
|
|
41
|
+
*/
|
|
42
|
+
export function createSelect(info: GraphQLResolveInfo) {
|
|
43
|
+
const returnTypeName = getNamedType(info.returnType)
|
|
44
|
+
const model = getModelFromTypeName(returnTypeName)
|
|
45
|
+
|
|
46
|
+
if (!model) {
|
|
47
|
+
throw new Error(`Model "${returnTypeName}" not found in Prisma schema.`)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const rawFields = graphqlFields(info)
|
|
51
|
+
return buildSelectTree(rawFields, model)
|
|
52
|
+
}
|
package/src/core/generator.js
CHANGED
|
@@ -14,14 +14,18 @@ function generateLibraries(tree_1) {
|
|
|
14
14
|
'@nestjs/common': '^10.0.0',
|
|
15
15
|
'@nestjs/passport': '^10.0.0',
|
|
16
16
|
'@nestjs/axios': '^3.0.0',
|
|
17
|
-
'@prisma/client': '^6.
|
|
17
|
+
'@prisma/client': '^6.11.0',
|
|
18
18
|
'@apollo/server': '^4.9.0',
|
|
19
|
+
'graphql-fields': '^2.0.3',
|
|
20
|
+
};
|
|
21
|
+
const devDependencies = {
|
|
22
|
+
'@types/graphql-fields': '^1.3.9',
|
|
19
23
|
};
|
|
20
|
-
const devDependencies = {};
|
|
21
24
|
yield (0, utils_1.installPlugins)(tree, dependencies, devDependencies);
|
|
22
25
|
yield (0, utils_1.apiLibraryGenerator)(tree, { name: 'core', overwrite }, templateRootPath, 'data-access');
|
|
23
26
|
yield (0, utils_1.apiLibraryGenerator)(tree, { name: 'core', overwrite }, templateRootPath, 'feature', true);
|
|
24
27
|
yield (0, utils_1.apiLibraryGenerator)(tree, { name: 'core', overwrite }, templateRootPath, 'models');
|
|
28
|
+
yield (0, utils_1.apiLibraryGenerator)(tree, { name: 'core', overwrite }, templateRootPath, 'helpers');
|
|
25
29
|
yield (0, devkit_1.formatFiles)(tree);
|
|
26
30
|
return () => {
|
|
27
31
|
(0, devkit_1.installPackagesTask)(tree);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/core/generator.ts"],"names":[],"mappings":";;AAIA,
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/core/generator.ts"],"names":[],"mappings":";;AAIA,oCAkCC;;AAtCD,uCAAyG;AACzG,4CAAsE;AAGtE,SAA8B,iBAAiB;iEAC7C,IAAU,EACV,UAAkC,EAAE;QAEpC,MAAM,gBAAgB,GAAG,IAAA,0BAAiB,EAAC,SAAS,EAAE,SAAS,CAAC,CAAA;QAChE,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,KAAK,IAAI,CAAA;QAE5C,MAAM,YAAY,GAAG;YACnB,mBAAmB,EAAE,QAAQ;YAC7B,iBAAiB,EAAE,SAAS;YAC5B,gBAAgB,EAAE,SAAS;YAC3B,kBAAkB,EAAE,SAAS;YAC7B,eAAe,EAAE,QAAQ;YACzB,gBAAgB,EAAE,SAAS;YAC3B,gBAAgB,EAAE,QAAQ;YAC1B,gBAAgB,EAAE,QAAQ;SAC3B,CAAA;QAED,MAAM,eAAe,GAAG;YACtB,uBAAuB,EAAE,QAAQ;SAClC,CAAA;QAED,MAAM,IAAA,sBAAc,EAAC,IAAI,EAAE,YAAY,EAAE,eAAe,CAAC,CAAA;QAEzD,MAAM,IAAA,2BAAmB,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAAE,aAAa,CAAC,CAAA;QAC7F,MAAM,IAAA,2BAAmB,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;QAC/F,MAAM,IAAA,2BAAmB,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAAE,QAAQ,CAAC,CAAA;QACxF,MAAM,IAAA,2BAAmB,EAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAAA;QAEzF,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAA;QAEvB,OAAO,GAAG,EAAE;YACV,IAAA,4BAAmB,EAAC,IAAI,CAAC,CAAA;QAC3B,CAAC,CAAA;IACH,CAAC;CAAA"}
|
package/src/custom/generator.js
CHANGED
|
@@ -80,8 +80,11 @@ function generateCustomFiles(tree, customLibraryRoot, models, npmScope, dependen
|
|
|
80
80
|
const pluginsDir = dependencies.join(customLibraryRoot, 'src/lib/plugins');
|
|
81
81
|
yield ensureDirExists(tree, defaultDir);
|
|
82
82
|
yield ensureDirExists(tree, pluginsDir);
|
|
83
|
-
//
|
|
84
|
-
|
|
83
|
+
// Create empty index.ts in pluginsDir for custom plugins (only if it doesn't exist)
|
|
84
|
+
const pluginsIndexPath = dependencies.join(pluginsDir, 'index.ts');
|
|
85
|
+
if (!tree.exists(pluginsIndexPath)) {
|
|
86
|
+
tree.write(pluginsIndexPath, '');
|
|
87
|
+
}
|
|
85
88
|
for (const model of models) {
|
|
86
89
|
const kebabModel = toKebabCase(model.modelName);
|
|
87
90
|
const modelFolder = dependencies.join(defaultDir, kebabModel);
|
|
@@ -142,10 +145,10 @@ export class ${model.modelName}Module {}
|
|
|
142
145
|
importPath: `${npmScope}/api/custom`,
|
|
143
146
|
});
|
|
144
147
|
}
|
|
145
|
-
// Update index.ts to export all model modules
|
|
148
|
+
// Update default/index.ts to export all model modules
|
|
146
149
|
const modelFolders = models.map((m) => toKebabCase(m.modelName));
|
|
147
|
-
const
|
|
148
|
-
tree.write(dependencies.join(
|
|
150
|
+
const defaultIndexContent = modelFolders.map((m) => `export * from './${m}/${m}.module'`).join('\n');
|
|
151
|
+
tree.write(dependencies.join(defaultDir, 'index.ts'), defaultIndexContent);
|
|
149
152
|
});
|
|
150
153
|
}
|
|
151
154
|
function customGeneratorLogic(tree_1, schema_1) {
|
|
@@ -166,10 +169,15 @@ function customGeneratorLogic(tree_1, schema_1) {
|
|
|
166
169
|
console.warn(`Failed to remove existing library ${projectName}:`, error);
|
|
167
170
|
}
|
|
168
171
|
}
|
|
169
|
-
// Use the shared apiLibraryGenerator
|
|
172
|
+
// Use the shared apiLibraryGenerator but pass empty template to avoid conflicts
|
|
170
173
|
yield dependencies.apiLibraryGenerator(tree, { name }, '', undefined, false);
|
|
171
174
|
yield ensureDirExists(tree, dependencies.join(customLibraryRoot, 'src/lib/default'));
|
|
172
175
|
yield ensureDirExists(tree, dependencies.join(customLibraryRoot, 'src/lib/plugins'));
|
|
176
|
+
// Override the main index.ts created by apiLibraryGenerator with our stable version
|
|
177
|
+
const mainIndexContent = `export * from './lib/plugins'
|
|
178
|
+
export * from './lib/default'
|
|
179
|
+
`;
|
|
180
|
+
tree.write(dependencies.join(customLibraryRoot, 'src/index.ts'), mainIndexContent);
|
|
173
181
|
// Get all Prisma models
|
|
174
182
|
const models = yield getAllPrismaModels(tree, dependencies);
|
|
175
183
|
if (models.length === 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/custom/generator.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/custom/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Injectable } from '@nestjs/common'
|
|
2
2
|
import { ApiCoreDataAccessService } from '@<%= npmScope %>/api/core/data-access'
|
|
3
|
-
import {
|
|
3
|
+
import { createSelect } from '@<%= npmScope %>/api/core/helpers'
|
|
4
4
|
import type { GraphQLResolveInfo } from 'graphql'
|
|
5
5
|
import * as dto from './dto'
|
|
6
6
|
|
|
@@ -8,24 +8,144 @@ import * as dto from './dto'
|
|
|
8
8
|
<% if (!model.modelName || !model.pluralModelName) { throw new Error('EJS template error: modelName or pluralModelName missing for model at index ' + idx + ': ' + JSON.stringify(model)); } %>
|
|
9
9
|
<% }) %>
|
|
10
10
|
|
|
11
|
+
<%
|
|
12
|
+
// Helper function to get relation fields for a model
|
|
13
|
+
function getRelationFields(model) {
|
|
14
|
+
return model.fields.filter(field => field.relationName && field.relationName.length > 0);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Helper function to get virtual relation fields for a model
|
|
18
|
+
function getVirtualRelationFields(model) {
|
|
19
|
+
const relationFields = getRelationFields(model);
|
|
20
|
+
const virtualFields = [];
|
|
21
|
+
|
|
22
|
+
relationFields.forEach(relationField => {
|
|
23
|
+
// Only generate virtual fields for relations that don't have explicit foreign keys
|
|
24
|
+
if (!relationField.relationFromFields || relationField.relationFromFields.length === 0) {
|
|
25
|
+
if (relationField.isList) {
|
|
26
|
+
// This is a multi-relation without foreign keys (many-to-many or one-to-many from parent)
|
|
27
|
+
// Generate a virtual foreign key field for connecting
|
|
28
|
+
const virtualFieldName = relationField.name + 'Ids';
|
|
29
|
+
// Check if there's already a scalar field with this name
|
|
30
|
+
const existingField = model.fields.find(f => f.name === virtualFieldName && (!f.relationName || f.relationName.length === 0));
|
|
31
|
+
if (!existingField) {
|
|
32
|
+
virtualFields.push({
|
|
33
|
+
name: virtualFieldName,
|
|
34
|
+
type: 'String',
|
|
35
|
+
isList: true,
|
|
36
|
+
isOptional: true,
|
|
37
|
+
isVirtual: true,
|
|
38
|
+
relationName: relationField.relationName,
|
|
39
|
+
relatedField: relationField.name
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
// This is a single relation without foreign keys (one-to-one or one-to-many from parent)
|
|
44
|
+
// Generate a virtual foreign key field for connecting
|
|
45
|
+
const virtualFieldName = relationField.name + 'Id';
|
|
46
|
+
// Check if there's already a scalar field with this name
|
|
47
|
+
const existingField = model.fields.find(f => f.name === virtualFieldName && (!f.relationName || f.relationName.length === 0));
|
|
48
|
+
if (!existingField) {
|
|
49
|
+
virtualFields.push({
|
|
50
|
+
name: virtualFieldName,
|
|
51
|
+
type: 'String',
|
|
52
|
+
isList: false,
|
|
53
|
+
isOptional: true,
|
|
54
|
+
isVirtual: true,
|
|
55
|
+
relationName: relationField.relationName,
|
|
56
|
+
relatedField: relationField.name
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
return virtualFields;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Helper function to get foreign key fields that need relation handling
|
|
67
|
+
function getForeignKeyRelationFields(model) {
|
|
68
|
+
const relationFields = getRelationFields(model);
|
|
69
|
+
const foreignKeyFields = [];
|
|
70
|
+
|
|
71
|
+
relationFields.forEach(relationField => {
|
|
72
|
+
if (relationField.relationFromFields && relationField.relationFromFields.length > 0) {
|
|
73
|
+
// This relation has explicit foreign key fields
|
|
74
|
+
relationField.relationFromFields.forEach(fkFieldName => {
|
|
75
|
+
const fkField = model.fields.find(f => f.name === fkFieldName);
|
|
76
|
+
if (fkField) {
|
|
77
|
+
foreignKeyFields.push({
|
|
78
|
+
fieldName: fkFieldName,
|
|
79
|
+
relationName: relationField.name,
|
|
80
|
+
isRequired: !fkField.isOptional
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
return foreignKeyFields;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// Helper function to generate relation handling code
|
|
91
|
+
function generateRelationHandling(model, operation) {
|
|
92
|
+
const virtualRelationFields = getVirtualRelationFields(model);
|
|
93
|
+
const foreignKeyFields = getForeignKeyRelationFields(model);
|
|
94
|
+
const allRelationFields = [...virtualRelationFields, ...foreignKeyFields];
|
|
95
|
+
|
|
96
|
+
if (allRelationFields.length === 0) {
|
|
97
|
+
return ' const data = input;';
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
let code = ' const { ';
|
|
101
|
+
code += virtualRelationFields.map(field => field.name).join(', ');
|
|
102
|
+
if (foreignKeyFields.length > 0) {
|
|
103
|
+
if (virtualRelationFields.length > 0) code += ', ';
|
|
104
|
+
code += foreignKeyFields.map(field => field.fieldName).join(', ');
|
|
105
|
+
}
|
|
106
|
+
code += ', ...regularFields } = input;\n';
|
|
107
|
+
code += ' const data: any = regularFields;\n\n';
|
|
108
|
+
|
|
109
|
+
// Handle virtual relation fields (many-to-many without explicit FKs)
|
|
110
|
+
virtualRelationFields.forEach(field => {
|
|
111
|
+
code += ` if (${field.name}) {\n`;
|
|
112
|
+
if (field.isList) {
|
|
113
|
+
code += ` data.${field.relatedField} = { ${operation === 'create' ? 'connect' : 'set'}: ${field.name}.map(id => ({ id })) };\n`;
|
|
114
|
+
} else {
|
|
115
|
+
code += ` data.${field.relatedField} = { connect: { id: ${field.name} } };\n`;
|
|
116
|
+
}
|
|
117
|
+
code += ' }\n';
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
// Handle foreign key fields (explicit FK relations)
|
|
121
|
+
foreignKeyFields.forEach(field => {
|
|
122
|
+
code += ` if (${field.fieldName}) {\n`;
|
|
123
|
+
code += ` data.${field.relationName} = { connect: { id: ${field.fieldName} } };\n`;
|
|
124
|
+
code += ' }\n';
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
return code;
|
|
128
|
+
}
|
|
129
|
+
%>
|
|
130
|
+
|
|
11
131
|
@Injectable()
|
|
12
132
|
export class ApiCrudDataAccessService {
|
|
13
133
|
constructor(private readonly data: ApiCoreDataAccessService) {}
|
|
14
134
|
|
|
15
135
|
<% for (const model of models) { %>
|
|
16
136
|
async create<%= model.modelName.charAt(0).toUpperCase() + model.modelName.slice(1) %>(info: GraphQLResolveInfo, input: dto.Create<%= model.modelName %>Input) {
|
|
17
|
-
|
|
137
|
+
<%- generateRelationHandling(model, 'create') %>
|
|
138
|
+
|
|
18
139
|
return this.data['<%= model.modelPropertyName %>'].create({
|
|
19
|
-
data
|
|
20
|
-
|
|
140
|
+
data,
|
|
141
|
+
select: createSelect(info),
|
|
21
142
|
});
|
|
22
143
|
}
|
|
23
144
|
|
|
24
145
|
async <%= (model.pluralModelName === model.modelName ? model.pluralModelName + 'List' : model.pluralModelName).charAt(0).toLowerCase() + (model.pluralModelName === model.modelName ? model.pluralModelName + 'List' : model.pluralModelName).slice(1) %>(info: GraphQLResolveInfo, input?: dto.List<%= model.modelName %>Input) {
|
|
25
|
-
const select = new PrismaSelect(info).value
|
|
26
146
|
return this.data['<%= model.modelPropertyName %>'].findMany({
|
|
27
147
|
...this.data.filter(input),
|
|
28
|
-
|
|
148
|
+
select: createSelect(info),
|
|
29
149
|
});
|
|
30
150
|
}
|
|
31
151
|
|
|
@@ -47,19 +167,19 @@ export class ApiCrudDataAccessService {
|
|
|
47
167
|
}
|
|
48
168
|
|
|
49
169
|
async <%= model.modelName.charAt(0).toLowerCase() + model.modelName.slice(1) %>(info: GraphQLResolveInfo, id: string) {
|
|
50
|
-
const select = new PrismaSelect(info).value
|
|
51
170
|
return this.data['<%= model.modelPropertyName %>'].findUnique({
|
|
52
171
|
where: { id },
|
|
53
|
-
|
|
172
|
+
select: createSelect(info),
|
|
54
173
|
});
|
|
55
174
|
}
|
|
56
175
|
|
|
57
176
|
async update<%= model.modelName.charAt(0).toUpperCase() + model.modelName.slice(1) %>(info: GraphQLResolveInfo, id: string, input: dto.Update<%= model.modelName %>Input) {
|
|
58
|
-
|
|
177
|
+
<%- generateRelationHandling(model, 'update') %>
|
|
178
|
+
|
|
59
179
|
return this.data['<%= model.modelPropertyName %>'].update({
|
|
60
180
|
where: { id },
|
|
61
|
-
data
|
|
62
|
-
|
|
181
|
+
data,
|
|
182
|
+
select: createSelect(info),
|
|
63
183
|
});
|
|
64
184
|
}
|
|
65
185
|
|
|
@@ -6,26 +6,73 @@ let usesInt = false;
|
|
|
6
6
|
let usesFloat = false;
|
|
7
7
|
let usesID = false;
|
|
8
8
|
let enumNames = new Set();
|
|
9
|
+
let usesPartialType = false;
|
|
10
|
+
const alwaysOptionalFields = ['id', 'createdAt', 'updatedAt'];
|
|
11
|
+
|
|
12
|
+
// Helper function to get relation fields for a model
|
|
13
|
+
function getRelationFields(model) {
|
|
14
|
+
return model.fields.filter(field => field.relationName && field.relationName.length > 0);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
// Helper function to get virtual relation fields for a model
|
|
18
|
+
function getVirtualRelationFields(model) {
|
|
19
|
+
const relationFields = getRelationFields(model);
|
|
20
|
+
const virtualFields = [];
|
|
21
|
+
|
|
22
|
+
relationFields.forEach(relationField => {
|
|
23
|
+
// Only generate virtual fields for relations that don't have explicit foreign keys
|
|
24
|
+
if (!relationField.relationFromFields || relationField.relationFromFields.length === 0) {
|
|
25
|
+
if (relationField.isList) {
|
|
26
|
+
// This is a multi-relation without foreign keys (many-to-many or one-to-many from parent)
|
|
27
|
+
// Generate a virtual foreign key field for connecting
|
|
28
|
+
const virtualFieldName = relationField.name + 'Ids';
|
|
29
|
+
// Check if there's already a scalar field with this name
|
|
30
|
+
const existingField = model.fields.find(f => f.name === virtualFieldName && (!f.relationName || f.relationName.length === 0));
|
|
31
|
+
if (!existingField) {
|
|
32
|
+
virtualFields.push({
|
|
33
|
+
name: virtualFieldName,
|
|
34
|
+
type: 'String',
|
|
35
|
+
isList: true,
|
|
36
|
+
isOptional: true,
|
|
37
|
+
isVirtual: true, // Mark as virtual so we know it's generated
|
|
38
|
+
relationName: relationField.relationName,
|
|
39
|
+
relatedField: relationField.name
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
} else {
|
|
43
|
+
// This is a single relation without foreign keys (one-to-one or one-to-many from parent)
|
|
44
|
+
// Generate a virtual foreign key field for connecting
|
|
45
|
+
const virtualFieldName = relationField.name + 'Id';
|
|
46
|
+
// Check if there's already a scalar field with this name
|
|
47
|
+
const existingField = model.fields.find(f => f.name === virtualFieldName && (!f.relationName || f.relationName.length === 0));
|
|
48
|
+
if (!existingField) {
|
|
49
|
+
virtualFields.push({
|
|
50
|
+
name: virtualFieldName,
|
|
51
|
+
type: 'String',
|
|
52
|
+
isList: false,
|
|
53
|
+
isOptional: true,
|
|
54
|
+
isVirtual: true, // Mark as virtual so we know it's generated
|
|
55
|
+
relationName: relationField.relationName,
|
|
56
|
+
relatedField: relationField.name
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
return virtualFields;
|
|
64
|
+
}
|
|
9
65
|
|
|
10
66
|
// First pass to determine necessary imports and enums
|
|
11
67
|
for (const model of models) {
|
|
12
68
|
for (const field of model.fields) {
|
|
69
|
+
if (field.relationName && field.relationName.length > 0) continue; // Skip relation object fields
|
|
13
70
|
if (field.type === 'Int') usesInt = true;
|
|
14
71
|
if (field.type === 'Float' || field.type === 'Decimal') usesFloat = true;
|
|
15
72
|
if (field.type === 'Json') usesGraphQLJSON = true;
|
|
16
|
-
|
|
17
|
-
if (field.
|
|
18
|
-
|
|
19
|
-
} else if (field.kind === 'object') {
|
|
20
|
-
// Check if a corresponding scalar ID field (e.g., 'userId') exists for this object field (e.g., 'user')
|
|
21
|
-
const correspondingIdFieldName = `${field.name}Id`;
|
|
22
|
-
const hasCorrespondingIdField = model.fields.some(f => f.name === correspondingIdFieldName && f.kind !== 'object');
|
|
23
|
-
if (!hasCorrespondingIdField) {
|
|
24
|
-
// If no pre-existing '...Id' scalar, we'll generate one, so 'ID' import is needed.
|
|
25
|
-
usesID = true;
|
|
26
|
-
}
|
|
27
|
-
} else if (field.kind === 'enum') {
|
|
28
|
-
enumNames.add(field.type);
|
|
73
|
+
if (field.type === 'ID') usesID = true;
|
|
74
|
+
if (field.kind === 'enum') {
|
|
75
|
+
enumNames.add(field.type);
|
|
29
76
|
}
|
|
30
77
|
}
|
|
31
78
|
}
|
|
@@ -33,191 +80,132 @@ for (const model of models) {
|
|
|
33
80
|
if (usesInt) gqlImports.add('Int');
|
|
34
81
|
if (usesFloat) gqlImports.add('Float');
|
|
35
82
|
if (usesID) gqlImports.add('ID');
|
|
83
|
+
usesPartialType = models.length > 0; // If we generate any Update input, we need PartialType
|
|
36
84
|
%>
|
|
37
85
|
import { <%= Array.from(gqlImports).join(', ') %> } from '@nestjs/graphql'
|
|
38
|
-
|
|
39
86
|
<% if (enumNames.size > 0) { %>import { <%= Array.from(enumNames).join(', ') %> } from '@<%= npmScope %>/api/core/models'
|
|
40
87
|
<% } %><% if (usesGraphQLJSON) { %>import { GraphQLJSON } from 'graphql-type-json'<% } %>
|
|
41
88
|
import { CorePagingInput } from '@<%= npmScope %>/api/core/data-access'
|
|
42
89
|
|
|
43
90
|
<% for (const model of models) { %>
|
|
91
|
+
<%
|
|
92
|
+
// Get all regular fields (non-relation) and virtual relation fields
|
|
93
|
+
const regularFields = model.fields.filter(field => !field.relationName || field.relationName.length === 0);
|
|
94
|
+
const virtualRelationFields = getVirtualRelationFields(model);
|
|
95
|
+
const allFields = [...regularFields, ...virtualRelationFields];
|
|
96
|
+
%>
|
|
44
97
|
@InputType()
|
|
45
98
|
export class Create<%= model.modelName %>Input {
|
|
46
|
-
<% for (const field of
|
|
99
|
+
<% for (const field of allFields) { %>
|
|
47
100
|
<%
|
|
48
|
-
let shouldSkipField = false;
|
|
49
101
|
let baseGqlType;
|
|
50
102
|
let tsType;
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
if (field.
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
effectiveFieldName = correspondingIdFieldName;
|
|
63
|
-
}
|
|
103
|
+
if (field.type === 'String') { baseGqlType = 'String'; tsType = 'string'; }
|
|
104
|
+
else if (field.type === 'Int') { baseGqlType = 'Int'; tsType = 'number'; }
|
|
105
|
+
else if (field.type === 'Float') { baseGqlType = 'Float'; tsType = 'number'; }
|
|
106
|
+
else if (field.type === 'Decimal') { baseGqlType = 'Float'; tsType = 'number'; }
|
|
107
|
+
else if (field.type === 'Boolean') { baseGqlType = 'Boolean'; tsType = 'boolean'; }
|
|
108
|
+
else if (field.type === 'DateTime') { baseGqlType = 'Date'; tsType = 'Date'; }
|
|
109
|
+
else if (field.type === 'Json') { baseGqlType = 'GraphQLJSON'; tsType = 'typeof GraphQLJSON'; }
|
|
110
|
+
else if (field.type === 'ID') { baseGqlType = 'ID'; tsType = 'string'; }
|
|
111
|
+
else if (field.kind === 'enum') {
|
|
112
|
+
baseGqlType = field.type;
|
|
113
|
+
tsType = field.type;
|
|
64
114
|
} else {
|
|
65
|
-
|
|
66
|
-
effectiveFieldName = field.name;
|
|
67
|
-
if (field.type === 'String') { baseGqlType = 'String'; tsType = 'string'; }
|
|
68
|
-
else if (field.type === 'Int') { baseGqlType = 'Int'; tsType = 'number'; }
|
|
69
|
-
else if (field.type === 'Float') { baseGqlType = 'Float'; tsType = 'number'; }
|
|
70
|
-
else if (field.type === 'Decimal') { baseGqlType = 'Float'; tsType = 'number'; }
|
|
71
|
-
else if (field.type === 'Boolean') { baseGqlType = 'Boolean'; tsType = 'boolean'; }
|
|
72
|
-
else if (field.type === 'DateTime') { baseGqlType = 'Date'; tsType = 'Date'; }
|
|
73
|
-
else if (field.type === 'Json') { baseGqlType = 'GraphQLJSON'; tsType = 'typeof GraphQLJSON'; }
|
|
74
|
-
else if (field.type === 'ID') { baseGqlType = 'ID'; tsType = 'string'; }
|
|
75
|
-
else if (field.kind === 'enum') {
|
|
76
|
-
baseGqlType = field.type;
|
|
77
|
-
tsType = field.type;
|
|
78
|
-
} else { // Fallback, should ideally not be reached if all model types are known
|
|
79
|
-
baseGqlType = 'String'; tsType = 'string';
|
|
80
|
-
}
|
|
115
|
+
baseGqlType = 'String'; tsType = 'string';
|
|
81
116
|
}
|
|
82
|
-
|
|
83
117
|
let fieldDecoratorTypeArg = '';
|
|
84
118
|
let finalTsType = tsType;
|
|
85
|
-
|
|
86
|
-
if (
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
119
|
+
let isOptional = false;
|
|
120
|
+
if (field.isList) {
|
|
121
|
+
fieldDecoratorTypeArg = `() => [${baseGqlType}]`;
|
|
122
|
+
finalTsType = tsType + '[]';
|
|
123
|
+
} else {
|
|
124
|
+
if (baseGqlType !== 'String' && baseGqlType !== 'Boolean') {
|
|
125
|
+
fieldDecoratorTypeArg = `() => ${baseGqlType}`;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
// Always optional for id, createdAt, updatedAt, and virtual fields
|
|
129
|
+
if (alwaysOptionalFields.includes(field.name) || field.isVirtual) {
|
|
130
|
+
isOptional = true;
|
|
131
|
+
} else {
|
|
132
|
+
isOptional = field.isOptional;
|
|
97
133
|
}
|
|
98
134
|
%>
|
|
99
|
-
<% if (
|
|
100
|
-
|
|
101
|
-
<%= effectiveFieldName %>?: <%= finalTsType %>
|
|
102
|
-
<% } %>
|
|
135
|
+
@Field(<% if (fieldDecoratorTypeArg) { %><%- fieldDecoratorTypeArg %>, <% } %>{ nullable: <%= isOptional ? 'true' : 'false' %> })
|
|
136
|
+
<%= field.name %><%= isOptional ? '?' : '!' %>: <%= finalTsType %>
|
|
103
137
|
<% } %>
|
|
104
138
|
}
|
|
105
139
|
|
|
106
140
|
@InputType()
|
|
107
141
|
export class Update<%= model.modelName %>Input {
|
|
108
|
-
<% for (const field of
|
|
142
|
+
<% for (const field of allFields) { %>
|
|
109
143
|
<%
|
|
110
|
-
let shouldSkipField = false;
|
|
111
144
|
let baseGqlType;
|
|
112
145
|
let tsType;
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (field.
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
}
|
|
146
|
+
if (field.type === 'String') { baseGqlType = 'String'; tsType = 'string'; }
|
|
147
|
+
else if (field.type === 'Int') { baseGqlType = 'Int'; tsType = 'number'; }
|
|
148
|
+
else if (field.type === 'Float') { baseGqlType = 'Float'; tsType = 'number'; }
|
|
149
|
+
else if (field.type === 'Decimal') { baseGqlType = 'Float'; tsType = 'number'; }
|
|
150
|
+
else if (field.type === 'Boolean') { baseGqlType = 'Boolean'; tsType = 'boolean'; }
|
|
151
|
+
else if (field.type === 'DateTime') { baseGqlType = 'Date'; tsType = 'Date'; }
|
|
152
|
+
else if (field.type === 'Json') { baseGqlType = 'GraphQLJSON'; tsType = 'typeof GraphQLJSON'; }
|
|
153
|
+
else if (field.type === 'ID') { baseGqlType = 'ID'; tsType = 'string'; }
|
|
154
|
+
else if (field.kind === 'enum') {
|
|
155
|
+
baseGqlType = field.type;
|
|
156
|
+
tsType = field.type;
|
|
125
157
|
} else {
|
|
126
|
-
|
|
127
|
-
if (field.type === 'String') { baseGqlType = 'String'; tsType = 'string'; }
|
|
128
|
-
else if (field.type === 'Int') { baseGqlType = 'Int'; tsType = 'number'; }
|
|
129
|
-
else if (field.type === 'Float') { baseGqlType = 'Float'; tsType = 'number'; }
|
|
130
|
-
else if (field.type === 'Decimal') { baseGqlType = 'Float'; tsType = 'number'; }
|
|
131
|
-
else if (field.type === 'Boolean') { baseGqlType = 'Boolean'; tsType = 'boolean'; }
|
|
132
|
-
else if (field.type === 'DateTime') { baseGqlType = 'Date'; tsType = 'Date'; }
|
|
133
|
-
else if (field.type === 'Json') { baseGqlType = 'GraphQLJSON'; tsType = 'typeof GraphQLJSON'; }
|
|
134
|
-
else if (field.type === 'ID') { baseGqlType = 'ID'; tsType = 'string'; }
|
|
135
|
-
else if (field.kind === 'enum') {
|
|
136
|
-
baseGqlType = field.type;
|
|
137
|
-
tsType = field.type;
|
|
138
|
-
} else {
|
|
139
|
-
baseGqlType = 'String'; tsType = 'string';
|
|
140
|
-
}
|
|
158
|
+
baseGqlType = 'String'; tsType = 'string';
|
|
141
159
|
}
|
|
142
|
-
|
|
143
160
|
let fieldDecoratorTypeArg = '';
|
|
144
161
|
let finalTsType = tsType;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
fieldDecoratorTypeArg = `() => ${baseGqlType}`;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
162
|
+
if (field.isList) {
|
|
163
|
+
fieldDecoratorTypeArg = `() => [${baseGqlType}]`;
|
|
164
|
+
finalTsType = tsType + '[]';
|
|
165
|
+
} else {
|
|
166
|
+
if (baseGqlType !== 'String' && baseGqlType !== 'Boolean') {
|
|
167
|
+
fieldDecoratorTypeArg = `() => ${baseGqlType}`;
|
|
168
|
+
}
|
|
155
169
|
}
|
|
156
170
|
%>
|
|
157
|
-
<% if (!shouldSkipField) { %>
|
|
158
171
|
@Field(<% if (fieldDecoratorTypeArg) { %><%- fieldDecoratorTypeArg %>, <% } %>{ nullable: true })
|
|
159
|
-
<%=
|
|
160
|
-
<% } %>
|
|
172
|
+
<%= field.name %>?: <%= finalTsType %>
|
|
161
173
|
<% } %>
|
|
162
174
|
}
|
|
163
175
|
|
|
164
176
|
@InputType()
|
|
165
177
|
export class List<%= model.modelName %>Input extends CorePagingInput {
|
|
166
|
-
<% for (const field of
|
|
178
|
+
<% for (const field of allFields) { %>
|
|
167
179
|
<%
|
|
168
|
-
let shouldSkipField = false;
|
|
169
180
|
let baseGqlType;
|
|
170
181
|
let tsType;
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
if (field.
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
effectiveFieldName = correspondingIdFieldName;
|
|
183
|
-
}
|
|
182
|
+
if (field.type === 'String') { baseGqlType = 'String'; tsType = 'string'; }
|
|
183
|
+
else if (field.type === 'Int') { baseGqlType = 'Int'; tsType = 'number'; }
|
|
184
|
+
else if (field.type === 'Float') { baseGqlType = 'Float'; tsType = 'number'; }
|
|
185
|
+
else if (field.type === 'Decimal') { baseGqlType = 'Float'; tsType = 'number'; }
|
|
186
|
+
else if (field.type === 'Boolean') { baseGqlType = 'Boolean'; tsType = 'boolean'; }
|
|
187
|
+
else if (field.type === 'DateTime') { baseGqlType = 'Date'; tsType = 'Date'; }
|
|
188
|
+
else if (field.type === 'Json') { baseGqlType = 'GraphQLJSON'; tsType = 'typeof GraphQLJSON'; }
|
|
189
|
+
else if (field.type === 'ID') { baseGqlType = 'ID'; tsType = 'string'; }
|
|
190
|
+
else if (field.kind === 'enum') {
|
|
191
|
+
baseGqlType = field.type;
|
|
192
|
+
tsType = field.type;
|
|
184
193
|
} else {
|
|
185
|
-
|
|
186
|
-
effectiveFieldName = field.name;
|
|
187
|
-
if (field.type === 'String') { baseGqlType = 'String'; tsType = 'string'; }
|
|
188
|
-
else if (field.type === 'Int') { baseGqlType = 'Int'; tsType = 'number'; }
|
|
189
|
-
else if (field.type === 'Float') { baseGqlType = 'Float'; tsType = 'number'; }
|
|
190
|
-
else if (field.type === 'Decimal') { baseGqlType = 'Float'; tsType = 'number'; }
|
|
191
|
-
else if (field.type === 'Boolean') { baseGqlType = 'Boolean'; tsType = 'boolean'; }
|
|
192
|
-
else if (field.type === 'DateTime') { baseGqlType = 'Date'; tsType = 'Date'; }
|
|
193
|
-
else if (field.type === 'Json') { baseGqlType = 'GraphQLJSON'; tsType = 'typeof GraphQLJSON'; }
|
|
194
|
-
else if (field.type === 'ID') { baseGqlType = 'ID'; tsType = 'string'; }
|
|
195
|
-
else if (field.kind === 'enum') {
|
|
196
|
-
baseGqlType = field.type;
|
|
197
|
-
tsType = field.type;
|
|
198
|
-
} else {
|
|
199
|
-
baseGqlType = 'String'; tsType = 'string';
|
|
200
|
-
}
|
|
194
|
+
baseGqlType = 'String'; tsType = 'string';
|
|
201
195
|
}
|
|
202
|
-
|
|
203
196
|
let fieldDecoratorTypeArg = '';
|
|
204
197
|
let finalTsType = tsType;
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
fieldDecoratorTypeArg = `() => ${baseGqlType}`;
|
|
213
|
-
}
|
|
214
|
-
}
|
|
198
|
+
if (field.isList) {
|
|
199
|
+
fieldDecoratorTypeArg = `() => [${baseGqlType}]`;
|
|
200
|
+
finalTsType = tsType + '[]';
|
|
201
|
+
} else {
|
|
202
|
+
if (baseGqlType !== 'String' && baseGqlType !== 'Boolean') {
|
|
203
|
+
fieldDecoratorTypeArg = `() => ${baseGqlType}`;
|
|
204
|
+
}
|
|
215
205
|
}
|
|
216
206
|
%>
|
|
217
|
-
<% if (!shouldSkipField) { %>
|
|
218
207
|
@Field(<% if (fieldDecoratorTypeArg) { %><%- fieldDecoratorTypeArg %>, <% } %>{ nullable: true })
|
|
219
|
-
<%=
|
|
220
|
-
<% } %>
|
|
208
|
+
<%= field.name %>?: <%= finalTsType %>
|
|
221
209
|
<% } %>
|
|
222
210
|
}
|
|
223
211
|
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import { formatFiles, generateFiles, installPackagesTask, joinPathFragments, names, Tree } from '@nx/devkit';
|
|
2
2
|
import { getDMMF } from '@prisma/internals';
|
|
3
|
-
import { apiLibraryGenerator, getPrismaSchemaPath, readPrismaSchema } from '@nestledjs/utils';
|
|
3
|
+
import { apiLibraryGenerator, getPrismaSchemaPath, readPrismaSchema, ModelType } from '@nestledjs/utils';
|
|
4
4
|
import { GenerateCrudGeneratorSchema } from './schema';
|
|
5
5
|
import { getNpmScope } from '@nx/js/src/utils/package-json/get-npm-scope';
|
|
6
|
-
import pluralize from 'pluralize';
|
|
7
6
|
interface CrudAuthConfig {
|
|
8
7
|
readOne?: string;
|
|
9
8
|
readMany?: string;
|
|
@@ -12,20 +11,6 @@ interface CrudAuthConfig {
|
|
|
12
11
|
update?: string;
|
|
13
12
|
delete?: string;
|
|
14
13
|
}
|
|
15
|
-
interface ModelType {
|
|
16
|
-
name: string;
|
|
17
|
-
pluralName: string;
|
|
18
|
-
fields: ReadonlyArray<Record<string, unknown> & {
|
|
19
|
-
name: string;
|
|
20
|
-
type: string;
|
|
21
|
-
}>;
|
|
22
|
-
primaryField: string;
|
|
23
|
-
modelName: string;
|
|
24
|
-
modelPropertyName: string;
|
|
25
|
-
pluralModelName: string;
|
|
26
|
-
pluralModelPropertyName: string;
|
|
27
|
-
auth?: CrudAuthConfig;
|
|
28
|
-
}
|
|
29
14
|
export interface GenerateCrudGeneratorDependencies {
|
|
30
15
|
formatFiles: typeof formatFiles;
|
|
31
16
|
generateFiles: typeof generateFiles;
|
|
@@ -37,7 +22,6 @@ export interface GenerateCrudGeneratorDependencies {
|
|
|
37
22
|
getPrismaSchemaPath: typeof getPrismaSchemaPath;
|
|
38
23
|
readPrismaSchema: typeof readPrismaSchema;
|
|
39
24
|
getNpmScope: typeof getNpmScope;
|
|
40
|
-
pluralize: typeof pluralize;
|
|
41
25
|
}
|
|
42
26
|
export declare function parseCrudAuth(comment: string): CrudAuthConfig | null;
|
|
43
27
|
export declare function getCrudAuthForModel(schema: string, modelName: string): CrudAuthConfig;
|
|
@@ -13,7 +13,6 @@ const devkit_1 = require("@nx/devkit");
|
|
|
13
13
|
const internals_1 = require("@prisma/internals");
|
|
14
14
|
const utils_1 = require("@nestledjs/utils");
|
|
15
15
|
const get_npm_scope_1 = require("@nx/js/src/utils/package-json/get-npm-scope");
|
|
16
|
-
const pluralize_1 = tslib_1.__importDefault(require("pluralize"));
|
|
17
16
|
// STEP 2: DEFINE PURE HELPER & CONTENT GENERATION FUNCTIONS
|
|
18
17
|
// These functions are side-effect free and can be tested independently.
|
|
19
18
|
function parseCrudAuth(comment) {
|
|
@@ -108,9 +107,8 @@ function generateResolverContent(model, npmScope) {
|
|
|
108
107
|
import { UseGuards } from '@nestjs/common'
|
|
109
108
|
import type { GraphQLResolveInfo } from 'graphql'
|
|
110
109
|
import { CorePaging } from '@${npmScope}/api/core/data-access'
|
|
111
|
-
import { ApiCrudDataAccessService } from '@${npmScope}/api/generated-crud/data-access'
|
|
112
110
|
import { ${model.modelName} } from '@${npmScope}/api/core/models'
|
|
113
|
-
import { Create${model.modelName}Input, List${model.modelName}Input, Update${model.modelName}Input } from '@${npmScope}/api/generated-crud/data-access'
|
|
111
|
+
import { ApiCrudDataAccessService, Create${model.modelName}Input, List${model.modelName}Input, Update${model.modelName}Input } from '@${npmScope}/api/generated-crud/data-access'
|
|
114
112
|
${guardImports}
|
|
115
113
|
|
|
116
114
|
@Resolver(() => ${model.modelName})
|
|
@@ -188,10 +186,6 @@ function generateFeatureIndexContent(models) {
|
|
|
188
186
|
// This function contains all the generator's logic but uses injected dependencies, making it testable.
|
|
189
187
|
function generateCrudLogic(tree, schema, dependencies) {
|
|
190
188
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
191
|
-
const customPluralize = (str) => {
|
|
192
|
-
const plural = dependencies.pluralize(str);
|
|
193
|
-
return plural === str ? `${str}List` : plural;
|
|
194
|
-
};
|
|
195
189
|
// Helper functions that now use injected dependencies
|
|
196
190
|
function getAllPrismaModels(tree) {
|
|
197
191
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
@@ -206,16 +200,34 @@ function generateCrudLogic(tree, schema, dependencies) {
|
|
|
206
200
|
return dmmf.datamodel.models.map((model) => {
|
|
207
201
|
var _a;
|
|
208
202
|
const singularPropertyName = model.name.charAt(0).toLowerCase() + model.name.slice(1);
|
|
209
|
-
const pluralPropertyName =
|
|
203
|
+
const pluralPropertyName = (0, utils_1.getPluralName)(singularPropertyName);
|
|
210
204
|
const authConfig = getCrudAuthForModel(prismaSchema, model.name);
|
|
211
205
|
return {
|
|
212
206
|
name: model.name,
|
|
213
|
-
pluralName:
|
|
214
|
-
fields: model.fields.map((field) => (
|
|
207
|
+
pluralName: (0, utils_1.getPluralName)(model.name),
|
|
208
|
+
fields: model.fields.map((field) => ({
|
|
209
|
+
name: field.name,
|
|
210
|
+
type: field.type,
|
|
211
|
+
isOptional: !field.isRequired,
|
|
212
|
+
isId: field.isId,
|
|
213
|
+
isUnique: field.isUnique,
|
|
214
|
+
isList: field.isList,
|
|
215
|
+
isReadOnly: field.isReadOnly,
|
|
216
|
+
hasDefaultValue: field.hasDefaultValue,
|
|
217
|
+
default: field.default,
|
|
218
|
+
relationName: field.relationName,
|
|
219
|
+
relationFromFields: field.relationFromFields ? [...field.relationFromFields] : undefined,
|
|
220
|
+
relationToFields: field.relationToFields ? [...field.relationToFields] : undefined,
|
|
221
|
+
relationOnDelete: field.relationOnDelete,
|
|
222
|
+
relationOnUpdate: field.relationOnUpdate,
|
|
223
|
+
isGenerated: field.isGenerated,
|
|
224
|
+
isUpdatedAt: field.isUpdatedAt,
|
|
225
|
+
documentation: field.documentation,
|
|
226
|
+
})),
|
|
215
227
|
primaryField: ((_a = model.fields.find((f) => !f.isId && f.type === 'String')) === null || _a === void 0 ? void 0 : _a.name) || 'name',
|
|
216
228
|
modelName: model.name,
|
|
217
229
|
modelPropertyName: singularPropertyName,
|
|
218
|
-
pluralModelName:
|
|
230
|
+
pluralModelName: (0, utils_1.getPluralName)(model.name),
|
|
219
231
|
pluralModelPropertyName: pluralPropertyName,
|
|
220
232
|
auth: authConfig,
|
|
221
233
|
};
|
|
@@ -240,10 +252,15 @@ function generateCrudLogic(tree, schema, dependencies) {
|
|
|
240
252
|
function generateModelFiles(tree, dataAccessLibraryRoot, featureLibraryRoot, models, name) {
|
|
241
253
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
242
254
|
const npmScope = dependencies.getNpmScope(tree);
|
|
255
|
+
// Generate feature module and resolvers
|
|
243
256
|
const featureModuleContent = generateFeatureModuleContent(models, npmScope);
|
|
244
257
|
tree.write(dependencies.joinPathFragments(featureLibraryRoot, 'src/lib/api-admin-crud-feature.module.ts'), featureModuleContent);
|
|
245
258
|
const featureIndexContent = generateFeatureIndexContent(models);
|
|
246
259
|
tree.write(dependencies.joinPathFragments(featureLibraryRoot, 'src/index.ts'), featureIndexContent);
|
|
260
|
+
// Generate database models file for frontend consumption
|
|
261
|
+
const databaseModelContent = (0, utils_1.generateDatabaseModelContent)(models);
|
|
262
|
+
tree.write(dependencies.joinPathFragments(dataAccessLibraryRoot, 'src/lib/database-models.ts'), databaseModelContent);
|
|
263
|
+
// Generate resolvers
|
|
247
264
|
for (const model of models) {
|
|
248
265
|
const resolverFilePath = dependencies.joinPathFragments(featureLibraryRoot, `src/lib/${toKebabCase(model.modelName)}.resolver.ts`);
|
|
249
266
|
const resolverContent = generateResolverContent(model, npmScope);
|
|
@@ -281,7 +298,6 @@ function default_1(tree, schema) {
|
|
|
281
298
|
getPrismaSchemaPath: utils_1.getPrismaSchemaPath,
|
|
282
299
|
readPrismaSchema: utils_1.readPrismaSchema,
|
|
283
300
|
getNpmScope: get_npm_scope_1.getNpmScope,
|
|
284
|
-
pluralize: pluralize_1.default,
|
|
285
301
|
};
|
|
286
302
|
try {
|
|
287
303
|
return yield generateCrudLogic(tree, schema, dependencies);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/generate-crud/generator.ts"],"names":[],"mappings":";;AA+CA,sCASC;AAED,kDAgCC;AAED,oDAQC;AAMD,0DAmGC;AAED,oEAMC;AAED,kEAIC;AAID,8CA4FC;AAID,4BAqBC;;AApVD,uCAA4G;AAC5G,iDAA2C;AAC3C,4CAA6F;AAE7F,+EAAyE;AACzE,kEAAiC;AAuCjC,4DAA4D;AAC5D,wEAAwE;AAExE,SAAgB,aAAa,CAAC,OAAe;IAC3C,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,uBAAuB,CAAC,CAAA;QACpD,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAA;QACvB,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;IAC7B,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,CAAC,CAAC,CAAA;QAC5C,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,SAAgB,mBAAmB,CAAC,MAAc,EAAE,SAAiB;IACnE,MAAM,aAAa,GAAmB;QACpC,OAAO,EAAE,OAAO;QAChB,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,OAAO;QACf,MAAM,EAAE,OAAO;KAChB,CAAA;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IAChC,IAAI,QAAQ,GAAa,EAAE,CAAA;IAC3B,IAAI,UAAU,GAAG,KAAK,CAAA;IACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;QAC/B,IACE,WAAW,CAAC,UAAU,CAAC,SAAS,SAAS,EAAE,CAAC;YAC5C,WAAW,CAAC,UAAU,CAAC,SAAS,SAAS,GAAG,CAAC;YAC7C,WAAW,CAAC,UAAU,CAAC,SAAS,SAAS,GAAG,CAAC,EAC7C,CAAC;YACD,UAAU,GAAG,IAAI,CAAA;YACjB,MAAK;QACP,CAAC;aAAM,IAAI,WAAW,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5C,QAAQ,GAAG,EAAE,CAAA;QACf,CAAC;aAAM,IAAI,WAAW,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACxD,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QAC5B,CAAC;IACH,CAAC;IACD,IAAI,CAAC,UAAU;QAAE,OAAO,aAAa,CAAA;IACrC,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAA;IACrE,IAAI,CAAC,QAAQ;QAAE,OAAO,aAAa,CAAA;IACnC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAA;IACtC,OAAO,MAAM,CAAC,CAAC,iCAAM,aAAa,GAAK,MAAM,EAAG,CAAC,CAAC,aAAa,CAAA;AACjE,CAAC;AAED,SAAgB,oBAAoB,CAAC,KAAa;IAChD,IAAI,CAAC,KAAK;QAAE,OAAO,mBAAmB,CAAA;IACtC,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAA;IAC3B,IAAI,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAA;IACnC,IAAI,KAAK,KAAK,MAAM;QAAE,OAAO,cAAc,CAAA;IAC3C,IAAI,KAAK,KAAK,OAAO;QAAE,OAAO,mBAAmB,CAAA;IACjD,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IAC/E,OAAO,UAAU,UAAU,OAAO,CAAA;AACpC,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,CAAA;AACjE,CAAC;AAED,SAAgB,uBAAuB,CAAC,KAAgB,EAAE,QAAgB;;IACxE,MAAM,UAAU,GAAG,IAAI,GAAG,EAAU,CAAA;IACpC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACf,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC1C,IAAI,KAAK,KAAK,QAAQ;gBAAE,OAAM;YAC9B,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAA;YACzC,IAAI,KAAK;gBAAE,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA;QAClC,CAAC,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,UAAU,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAA;IACrC,CAAC;IAED,MAAM,YAAY,GAChB,UAAU,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,QAAQ,aAAa,CAAC,CAAC,CAAC,EAAE,CAAA;IAEnH,MAAM,sBAAsB,GAAG,CAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,QAAQ,EAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAA;IACrH,MAAM,mBAAmB,GAAG,CAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,KAAK,EAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAA;IAC5G,MAAM,qBAAqB,GAAG,CAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,OAAO,EAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAA;IAClH,MAAM,oBAAoB,GAAG,CAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,MAAM,EAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAA;IAC/G,MAAM,oBAAoB,GAAG,CAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,MAAM,EAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAA;IAC/G,MAAM,oBAAoB,GAAG,CAAA,MAAA,KAAK,CAAC,IAAI,0CAAE,MAAM,EAAC,CAAC,CAAC,oBAAoB,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAA;IAE/G,MAAM,kBAAkB,GAAG,KAAK,CAAC,uBAAuB,CAAA;IACxD,MAAM,eAAe,GAAG,GAAG,KAAK,CAAC,uBAAuB,OAAO,CAAA;IAC/D,MAAM,iBAAiB,GAAG,KAAK,CAAC,iBAAiB,CAAA;IAEjD,OAAO;;;+BAGsB,QAAQ;6CACM,QAAQ;WAC1C,KAAK,CAAC,SAAS,aAAa,QAAQ;iBAC9B,KAAK,CAAC,SAAS,cAAc,KAAK,CAAC,SAAS,gBACzD,KAAK,CAAC,SACR,kBAAkB,QAAQ;EAC1B,YAAY;;kBAEI,KAAK,CAAC,SAAS;wBACT,KAAK,CAAC,SAAS;;;kBAGrB,KAAK,CAAC,SAAS;IAC7B,sBAAsB,CAAC,CAAC,CAAC,cAAc,sBAAsB,GAAG,CAAC,CAAC,CAAC,EAAE;IACrE,kBAAkB;;6CAEuB,KAAK,CAAC,SAAS,wCACxD,KAAK,CAAC,SACR;;mCAEiC,kBAAkB;;;;IAIjD,mBAAmB,CAAC,CAAC,CAAC,cAAc,mBAAmB,GAAG,CAAC,CAAC,CAAC,EAAE;IAC/D,eAAe;6CAC0B,KAAK,CAAC,SAAS,wCACxD,KAAK,CAAC,SACR;;mCAEiC,eAAe;;;iBAGjC,KAAK,CAAC,SAAS;IAC5B,qBAAqB,CAAC,CAAC,CAAC,cAAc,qBAAqB,GAAG,CAAC,CAAC,CAAC,EAAE;IACnE,iBAAiB;;aAER,KAAK,CAAC,iBAAiB,QAAQ,KAAK,CAAC,iBAAiB;;mCAEhC,iBAAiB,UAAU,KAAK,CAAC,iBAAiB;;;oBAGjE,KAAK,CAAC,SAAS;IAC/B,oBAAoB,CAAC,CAAC,CAAC,cAAc,oBAAoB,GAAG,CAAC,CAAC,CAAC,EAAE;UAC3D,KAAK,CAAC,SAAS;;kCAES,KAAK,CAAC,SAAS;;yCAER,KAAK,CAAC,SAAS;;;oBAGpC,KAAK,CAAC,SAAS;IAC/B,oBAAoB,CAAC,CAAC,CAAC,cAAc,oBAAoB,GAAG,CAAC,CAAC,CAAC,EAAE;UAC3D,KAAK,CAAC,SAAS;;aAEZ,KAAK,CAAC,iBAAiB,QAAQ,KAAK,CAAC,iBAAiB;kCACjC,KAAK,CAAC,SAAS;;yCAER,KAAK,CAAC,SAAS,UAAU,KAAK,CAAC,iBAAiB;;;oBAGrE,KAAK,CAAC,SAAS;IAC/B,oBAAoB,CAAC,CAAC,CAAC,cAAc,oBAAoB,GAAG,CAAC,CAAC,CAAC,EAAE;UAC3D,KAAK,CAAC,SAAS;aACZ,KAAK,CAAC,iBAAiB,QAAQ,KAAK,CAAC,iBAAiB;;yCAE1B,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,iBAAiB;;;CAGlF,CAAA;AACD,CAAC;AAED,SAAgB,4BAA4B,CAAC,MAAmB,EAAE,QAAgB;IAChF,OAAO,sFAAsF,QAAQ,qCAAqC,MAAM;SAC7I,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,qBAAqB,KAAK,CAAC,SAAS,sBAAsB,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC;SAClH,IAAI,CAAC,IAAI,CAAC,uEAAuE,MAAM;SACvF,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,KAAK,CAAC,SAAS,UAAU,CAAC;SACrD,IAAI,CAAC,IAAI,CAAC,yDAAyD,CAAA;AACxE,CAAC;AAED,SAAgB,2BAA2B,CAAC,MAAmB;IAC7D,OAAO,wDAAwD,MAAM;SAClE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,wBAAwB,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC;SAChF,IAAI,CAAC,IAAI,CAAC,IAAI,CAAA;AACnB,CAAC;AAED,yCAAyC;AACzC,uGAAuG;AACvG,SAAsB,iBAAiB,CACrC,IAAU,EACV,MAAmC,EACnC,YAA+C;;QAE/C,MAAM,eAAe,GAAG,CAAC,GAAW,EAAE,EAAE;YACtC,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;YAC1C,OAAO,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAA;QAC/C,CAAC,CAAA;QACD,sDAAsD;QACtD,SAAe,kBAAkB,CAAC,IAAU;;gBAC1C,MAAM,UAAU,GAAG,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;gBACzD,MAAM,YAAY,GAAG,YAAY,CAAC,gBAAgB,CAAC,IAAI,EAAE,UAAU,CAAC,CAAA;gBACpE,IAAI,CAAC,YAAY,EAAE,CAAC;oBAClB,OAAO,CAAC,KAAK,CAAC,6BAA6B,UAAU,EAAE,CAAC,CAAA;oBACxD,OAAO,EAAE,CAAA;gBACX,CAAC;gBACD,IAAI,CAAC;oBACH,MAAM,IAAI,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC,CAAA;oBACpE,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;;wBACzC,MAAM,oBAAoB,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;wBACrF,MAAM,kBAAkB,GAAG,eAAe,CAAC,oBAAoB,CAAC,CAAA;wBAChE,MAAM,UAAU,GAAG,mBAAmB,CAAC,YAAY,EAAE,KAAK,CAAC,IAAI,CAAC,CAAA;wBAChE,OAAO;4BACL,IAAI,EAAE,KAAK,CAAC,IAAI;4BAChB,UAAU,EAAE,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;4BACvC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,mBAAM,KAAK,EAAG,CAAC;4BACnD,YAAY,EAAE,CAAA,MAAA,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,0CAAE,IAAI,KAAI,MAAM;4BACtF,SAAS,EAAE,KAAK,CAAC,IAAI;4BACrB,iBAAiB,EAAE,oBAAoB;4BACvC,eAAe,EAAE,eAAe,CAAC,KAAK,CAAC,IAAI,CAAC;4BAC5C,uBAAuB,EAAE,kBAAkB;4BAC3C,IAAI,EAAE,UAAU;yBACjB,CAAA;oBACH,CAAC,CAAC,CAAA;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,OAAO,CAAC,KAAK,CAAC,8BAA8B,EAAE,KAAK,CAAC,CAAA;oBACpD,OAAO,EAAE,CAAA;gBACX,CAAC;YACH,CAAC;SAAA;QAED,SAAe,eAAe,CAAC,IAAU,EAAE,IAAY,EAAE,MAAmB;;gBAC1E,MAAM,qBAAqB,GAAG,YAAY,IAAI,cAAc,CAAA;gBAC5D,MAAM,kBAAkB,GAAG,YAAY,IAAI,UAAU,CAAA;gBACrD,MAAM,YAAY,GAAG,YAAY,CAAC,iBAAiB,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;gBACzE,MAAM,YAAY,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,aAAa,CAAC,CAAA;gBAC3F,MAAM,YAAY,CAAC,mBAAmB,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,SAAS,CAAC,CAAA;gBACvF,OAAO,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,CAAA;YACtD,CAAC;SAAA;QAED,SAAe,kBAAkB,CAC/B,IAAU,EACV,qBAA6B,EAC7B,kBAA0B,EAC1B,MAAmB,EACnB,IAAY;;gBAEZ,MAAM,QAAQ,GAAG,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;gBAC/C,MAAM,oBAAoB,GAAG,4BAA4B,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;gBAC3E,IAAI,CAAC,KAAK,CACR,YAAY,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,0CAA0C,CAAC,EAC9F,oBAAoB,CACrB,CAAA;gBAED,MAAM,mBAAmB,GAAG,2BAA2B,CAAC,MAAM,CAAC,CAAA;gBAC/D,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,cAAc,CAAC,EAAE,mBAAmB,CAAC,CAAA;gBAEnG,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,MAAM,gBAAgB,GAAG,YAAY,CAAC,iBAAiB,CACrD,kBAAkB,EAClB,WAAW,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,cAAc,CACtD,CAAA;oBACD,MAAM,eAAe,GAAG,uBAAuB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;oBAChE,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,eAAe,CAAC,CAAA;gBAC/C,CAAC;YACH,CAAC;SAAA;QAED,2BAA2B;QAC3B,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,gBAAgB,CAAA;QAC5C,MAAM,MAAM,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,CAAA;QAC7C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,wBAAwB,CAAC,CAAA;YACvC,OAAM,CAAC,iCAAiC;QAC1C,CAAC;QAED,MAAM,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,GAAG,MAAM,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;QAC/F,MAAM,kBAAkB,CAAC,IAAI,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;QACvF,MAAM,YAAY,CAAC,WAAW,CAAC,IAAI,CAAC,CAAA;QAEpC,OAAO,GAAG,EAAE;YACV,YAAY,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAA;QACxC,CAAC,CAAA;IACH,CAAC;CAAA;AAED,oCAAoC;AACpC,mHAAmH;AACnH,mBAA+B,IAAU,EAAE,MAAmC;;QAC5E,MAAM,YAAY,GAAsC;YACtD,WAAW,EAAX,oBAAW;YACX,aAAa,EAAb,sBAAa;YACb,mBAAmB,EAAnB,4BAAmB;YACnB,iBAAiB,EAAjB,0BAAiB;YACjB,KAAK,EAAL,cAAK;YACL,OAAO,EAAP,mBAAO;YACP,mBAAmB,EAAnB,2BAAmB;YACnB,mBAAmB,EAAnB,2BAAmB;YACnB,gBAAgB,EAAhB,wBAAgB;YAChB,WAAW,EAAX,2BAAW;YACX,SAAS,EAAT,mBAAS;SACV,CAAA;QAED,IAAI,CAAC;YACH,OAAO,MAAM,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAA;QAC5D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAA;YAChD,MAAM,KAAK,CAAA;QACb,CAAC;IACH,CAAC;CAAA"}
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/generate-crud/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.default = generator;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const devkit_1 = require("@nx/devkit");
|
|
6
|
+
function generator(tree) {
|
|
7
|
+
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
8
|
+
// Use the Nx NestJS library generator to create 'integrations' in libs/api
|
|
9
|
+
// This assumes @nx/nest is installed in the workspace
|
|
10
|
+
const { execSync } = require('child_process');
|
|
11
|
+
execSync('nx g @nx/nest:lib integrations --directory=libs/api/integrations', { stdio: 'inherit' });
|
|
12
|
+
yield (0, devkit_1.formatFiles)(tree);
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/integrations/generator.ts"],"names":[],"mappings":";;AAEA,4BAMC;;AARD,uCAAiF;AAEjF,SAA8B,SAAS,CAAC,IAAU;;QAChD,2EAA2E;QAC3E,sDAAsD;QACtD,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;QAC9C,QAAQ,CAAC,kEAAkE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QACnG,MAAM,IAAA,oBAAW,EAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;CAAA"}
|
package/src/setup/generator.js
CHANGED
|
@@ -22,7 +22,6 @@ function apiSetupGenerator(tree) {
|
|
|
22
22
|
'@nestjs/jwt': '^11.0.0',
|
|
23
23
|
'@nestjs/passport': '^11.0.5',
|
|
24
24
|
'@nestjs/platform-express': '^11.1.3',
|
|
25
|
-
'@paljs/plugins': '^8.2.0',
|
|
26
25
|
axios: '^1.9.0',
|
|
27
26
|
bcryptjs: '^3.0.2',
|
|
28
27
|
express: '^5.1.0',
|
|
@@ -60,12 +59,12 @@ function apiSetupGenerator(tree) {
|
|
|
60
59
|
'@types/nodemailer': '^6.4.7',
|
|
61
60
|
'@types/passport-jwt': '^4.0.1',
|
|
62
61
|
'@types/node': '^24.0.1',
|
|
63
|
-
'@prisma/internals': '^6.
|
|
62
|
+
'@prisma/internals': '^6.11.0',
|
|
64
63
|
autoprefixer: '10.4.21',
|
|
65
64
|
jest: '^30.0.0',
|
|
66
65
|
'jest-environment-node': '^30.0.0',
|
|
67
66
|
pg: '8.16.0',
|
|
68
|
-
prisma: '^6.
|
|
67
|
+
prisma: '^6.11.0',
|
|
69
68
|
'ts-node': '10.9.2',
|
|
70
69
|
yaml: '^2.4.2',
|
|
71
70
|
'ts-loader': '^9.5.2',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/setup/generator.ts"],"names":[],"mappings":";;AASA,
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../generators/api/src/setup/generator.ts"],"names":[],"mappings":";;AASA,8CA8FC;;AAvGD,uCAAkF;AAClF,4CAAiF;AAEjF,SAAS,WAAW,CAAC,IAAU;IAC7B,MAAM,SAAS,GAAG,QAAQ,CAAA;IAC1B,MAAM,OAAO,GAAG,oCAAoC,CAAA;IACpD,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;AAChC,CAAC;AAED,SAAsB,iBAAiB,CAAC,IAAU;;QAChD,mBAAmB;QACnB,IAAA,qCAA4B,EAC1B,IAAI,EACJ;YACE,gBAAgB,EAAE,SAAS;YAC3B,eAAe,EAAE,QAAQ;YACzB,gBAAgB,EAAE,SAAS;YAC3B,gBAAgB,EAAE,QAAQ;YAC1B,cAAc,EAAE,SAAS;YACzB,iBAAiB,EAAE,SAAS;YAC5B,aAAa,EAAE,SAAS;YACxB,kBAAkB,EAAE,SAAS;YAC7B,0BAA0B,EAAE,SAAS;YACrC,KAAK,EAAE,QAAQ;YACf,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,UAAU;YACnB,0BAA0B,EAAE,OAAO;YACnC,iBAAiB,EAAE,SAAS;YAC5B,uBAAuB,EAAE,QAAQ;YACjC,YAAY,EAAE,QAAQ;YACtB,GAAG,EAAE,UAAU;YACf,UAAU,EAAE,QAAQ;YACpB,kBAAkB,EAAE,QAAQ;YAC5B,IAAI,EAAE,QAAQ;YACd,cAAc,EAAE,aAAa;YAC7B,gBAAgB,EAAE,QAAQ;YAC1B,iBAAiB,EAAE,SAAS;YAC5B,mBAAmB,EAAE,QAAQ;YAC7B,6BAA6B,EAAE,QAAQ;YACvC,OAAO,EAAE,QAAQ;YACjB,eAAe,EAAE,QAAQ;YACzB,cAAc,EAAE,QAAQ;SACzB,EACD;YACE,EAAE,EAAE,QAAQ;YACZ,QAAQ,EAAE,QAAQ;YAClB,UAAU,EAAE,QAAQ;YACpB,UAAU,EAAE,QAAQ;YACpB,aAAa,EAAE,QAAQ;YACvB,oBAAoB,EAAE,SAAS;YAC/B,iBAAiB,EAAE,SAAS;YAC5B,4BAA4B,EAAE,OAAO;YACrC,oBAAoB,EAAE,UAAU;YAChC,UAAU,EAAE,QAAQ;YACpB,WAAW,EAAE,SAAS;YACtB,sBAAsB,EAAE,QAAQ;YAChC,gBAAgB,EAAE,QAAQ;YAC1B,mBAAmB,EAAE,QAAQ;YAC7B,qBAAqB,EAAE,QAAQ;YAC/B,aAAa,EAAE,SAAS;YACxB,mBAAmB,EAAE,SAAS;YAC9B,YAAY,EAAE,SAAS;YACvB,IAAI,EAAE,SAAS;YACf,uBAAuB,EAAE,SAAS;YAClC,EAAE,EAAE,QAAQ;YACZ,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,QAAQ;YACnB,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,QAAQ;YACrB,aAAa,EAAE,QAAQ;YACvB,wBAAwB,EAAE,QAAQ;YAClC,+BAA+B,EAAE,QAAQ;YACzC,6BAA6B,EAAE,QAAQ;YACvC,mBAAmB,EAAE,QAAQ;SAC9B,CACF,CAAA;QAED,qDAAqD;QACrD,MAAM,eAAe,GAAG;YACtB,oBAAoB;YACpB,iBAAiB;YACjB,gBAAgB;YAChB,4BAA4B;YAC5B,iBAAiB;YACjB,SAAS;YACT,IAAI;YACJ,QAAQ;YACR,SAAS;YACT,6BAA6B;YAC7B,cAAc;YACd,cAAc;YACd,SAAS;YACT,eAAe;YACf,WAAW;SACZ,CAAA;QACD,IAAA,iCAAyB,EAAC,IAAI,EAAE,EAAE,qBAAqB,EAAE,eAAe,EAAE,CAAC,CAAA;QAE3E,iDAAiD;QACjD,WAAW,CAAC,IAAI,CAAC,CAAA;QAEjB,gEAAgE;QAChE,OAAO,IAAA,2BAAmB,GAAE,CAAA;IAC9B,CAAC;CAAA;AAED,kBAAe,iBAAiB,CAAA"}
|
|
File without changes
|