@postxl/generators 1.7.0 → 1.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/backend-core/backend.generator.js +22 -12
- package/dist/backend-core/backend.generator.js.map +1 -1
- package/dist/backend-core/generators/jest.config.generator.js +5 -24
- package/dist/backend-core/generators/jest.config.generator.js.map +1 -1
- package/dist/backend-core/generators/main.generator.js +7 -9
- package/dist/backend-core/generators/main.generator.js.map +1 -1
- package/dist/backend-core/generators/tsconfig.generator.js +1 -2
- package/dist/backend-core/generators/tsconfig.generator.js.map +1 -1
- package/dist/backend-e2e/backend-e2e.generator.js +4 -4
- package/dist/backend-e2e/backend-e2e.generator.js.map +1 -1
- package/dist/backend-rest-api/generators/model-controller.generator.js +46 -5
- package/dist/backend-rest-api/generators/model-controller.generator.js.map +1 -1
- package/dist/backend-rest-api/rest-api.generator.js +5 -1
- package/dist/backend-rest-api/rest-api.generator.js.map +1 -1
- package/dist/backend-rest-api/template/restApi/src/restApi.utils.ts +34 -0
- package/dist/backend-rest-api/template/restApi/src/zod-exception.filter.ts +42 -0
- package/dist/backend-update/model-update-service.generator.js +11 -25
- package/dist/backend-update/model-update-service.generator.js.map +1 -1
- package/dist/backend-update/update-service.generator.js +4 -16
- package/dist/backend-update/update-service.generator.js.map +1 -1
- package/dist/backend-view/model-view-service.generator.js +8 -35
- package/dist/backend-view/model-view-service.generator.js.map +1 -1
- package/dist/backend-view/view-service.generator.js +4 -17
- package/dist/backend-view/view-service.generator.js.map +1 -1
- package/dist/base/template/sonar-project.properties +0 -1
- package/dist/frontend-core/template/vite.config.ts +3 -2
- package/dist/seed-data/generator/model-seed-data.generator.d.ts +1 -0
- package/dist/seed-data/generator/model-seed-data.generator.js +2 -38
- package/dist/seed-data/generator/model-seed-data.generator.js.map +1 -1
- package/dist/seed-data/generator/seed-migrations.generator.js +3 -3
- package/dist/seed-data/seed-data.generator.js +1 -1
- package/dist/seed-data/seed-data.generator.js.map +1 -1
- package/package.json +1 -1
- package/dist/backend-core/template/scripts/dev.sh +0 -27
- package/dist/backend-rest-api/template/zod-exception.filter.ts +0 -21
|
@@ -51,17 +51,17 @@ const baseDependencies = [
|
|
|
51
51
|
{ packageName: '@nestjs/platform-fastify', version: '11.1.9' },
|
|
52
52
|
{ packageName: '@nestjs/schematics', version: '11.0.9' },
|
|
53
53
|
{ packageName: Generator.toPostXlPackageName('@postxl/utils') },
|
|
54
|
-
{ packageName: '
|
|
54
|
+
{ packageName: 'colors', version: '1.4.0' },
|
|
55
55
|
{ packageName: 'jsonwebtoken', version: '9.0.3' },
|
|
56
56
|
{ packageName: 'jwks-rsa', version: '3.2.0' },
|
|
57
|
-
|
|
57
|
+
// Do not upgrade to above 8.1 as 9.0 dropped CommonJS support and NestJS still uses CommonJS!
|
|
58
|
+
{ packageName: 'serialize-error', version: '8.1.0' },
|
|
58
59
|
{ packageName: 'zod', version: '4.3.5' },
|
|
59
60
|
{ packageName: 'zod-validation-error', version: '5.0.0' },
|
|
60
61
|
];
|
|
61
62
|
const baseDevDependencies = [
|
|
62
63
|
{ packageName: 'fastify', version: '5.6.2' },
|
|
63
64
|
{ packageName: 'express', version: '5.2.1' },
|
|
64
|
-
{ packageName: 'concurrently', version: '9.1.2' },
|
|
65
65
|
{ packageName: '@dotenvx/dotenvx', version: '1.51.2' },
|
|
66
66
|
{ packageName: '@jest/globals', version: '30.2.0' },
|
|
67
67
|
{ packageName: '@nestjs/cli', version: '11.0.14' },
|
|
@@ -69,20 +69,31 @@ const baseDevDependencies = [
|
|
|
69
69
|
{ packageName: '@types/node', version: '25.0.3' },
|
|
70
70
|
{ packageName: 'jest', version: '30.2.0' },
|
|
71
71
|
{ packageName: 'ts-jest', version: '29.4.6' },
|
|
72
|
-
{ packageName: 'tsc-alias', version: '1.8.16' },
|
|
73
72
|
{ packageName: 'tsconfig-paths', version: '4.2.0' },
|
|
74
73
|
{ packageName: 'typescript', version: '5.9.3' },
|
|
74
|
+
{ packageName: 'webpack', version: '5.104.1' },
|
|
75
75
|
];
|
|
76
|
-
// Dev scripts use scripts/dev.sh wrapper for cleaner package.json
|
|
77
76
|
const baseScripts = [
|
|
78
|
-
{ name: 'build', command: 'nest build
|
|
77
|
+
{ name: 'build', command: 'nest build' },
|
|
79
78
|
{ name: 'start', command: 'node ./dist/apps/api/apps/api/src/main.js' },
|
|
80
|
-
{
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
79
|
+
{
|
|
80
|
+
name: 'dev',
|
|
81
|
+
command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=false --env AUTH=false -- nest start --debug --watch',
|
|
82
|
+
},
|
|
83
|
+
{
|
|
84
|
+
name: 'dev:auth',
|
|
85
|
+
command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=false --env AUTH=true -- nest start --debug --watch',
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
name: 'dev:stateful',
|
|
89
|
+
command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=true --env AUTH=false -- nest start --debug --watch',
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
name: 'dev:stateful:auth',
|
|
93
|
+
command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=true --env AUTH=true -- nest start --debug --watch',
|
|
94
|
+
},
|
|
84
95
|
{ name: 'lint', command: 'eslint .' },
|
|
85
|
-
{ name: 'test:jest', command: '
|
|
96
|
+
{ name: 'test:jest', command: 'jest' },
|
|
86
97
|
{ name: 'test:types', command: 'tsc --noEmit' },
|
|
87
98
|
];
|
|
88
99
|
exports.backendGeneratorId = Generator.toGeneratorInterfaceId('backend-core');
|
|
@@ -97,7 +108,6 @@ exports.backendGenerator = {
|
|
|
97
108
|
dependencies: baseDependencies,
|
|
98
109
|
devDependencies: baseDevDependencies,
|
|
99
110
|
scripts: baseScripts,
|
|
100
|
-
type: 'module',
|
|
101
111
|
isInPostXlWorkspace: context.schema.projectType === 'workspace',
|
|
102
112
|
},
|
|
103
113
|
tsConfigReferences: ['utils'],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend.generator.js","sourceRoot":"","sources":["../../src/backend-core/backend.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAiC;AAEjC,6DAA8C;AAE9C,4EAAqE;AACrE,4EAAqE;AACrE,oFAA6E;AAC7E,8EAAuE;AACvE,gEAA0D;AAC1D,wEAAkE;AAGlE,MAAM,gBAAgB,GAAkC;IACtD,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE;IACrD,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE;IACnD,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,QAAQ,EAAE;IACrD,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE;IACpD,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,QAAQ,EAAE;IAClD,EAAE,WAAW,EAAE,0BAA0B,EAAE,OAAO,EAAE,QAAQ,EAAE;IAC9D,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,EAAE,QAAQ,EAAE;IACxD,EAAE,WAAW,EAAE,SAAS,CAAC,mBAAmB,CAAC,eAAe,CAAC,EAAE;IAC/D,EAAE,WAAW,EAAE,
|
|
1
|
+
{"version":3,"file":"backend.generator.js","sourceRoot":"","sources":["../../src/backend-core/backend.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,42 +5,23 @@ function generateJestConfig({ schema }) {
|
|
|
5
5
|
return /* ts */ `
|
|
6
6
|
import type { Config } from 'jest'
|
|
7
7
|
|
|
8
|
-
import { readFileSync } from 'node:fs'
|
|
9
|
-
|
|
10
8
|
import { pathsToModuleNameMapper } from 'ts-jest'
|
|
11
9
|
|
|
12
|
-
|
|
10
|
+
import tsconfig from './tsconfig.json' with { type: 'json' }
|
|
13
11
|
|
|
14
12
|
const config: Config = {
|
|
15
13
|
displayName: 'backend',
|
|
16
14
|
moduleFileExtensions: ['js', 'json', 'ts'],
|
|
17
|
-
extensionsToTreatAsEsm: ['.ts'],
|
|
18
15
|
rootDir: '.',
|
|
19
16
|
testRegex: '.*\\\\.test\\\\.ts$',
|
|
20
17
|
transform: {
|
|
21
|
-
'^.+\\\\.
|
|
22
|
-
'ts-jest',
|
|
23
|
-
{
|
|
24
|
-
useESM: true,
|
|
25
|
-
tsconfig: {
|
|
26
|
-
...tsconfig.compilerOptions,
|
|
27
|
-
moduleResolution: 'node16',
|
|
28
|
-
},
|
|
29
|
-
},
|
|
30
|
-
],
|
|
18
|
+
'^.+\\\\.(t|j)s$': 'ts-jest',
|
|
31
19
|
},
|
|
32
|
-
transformIgnorePatterns: [
|
|
33
|
-
// Allow ESM packages from node_modules to be transformed
|
|
34
|
-
'node_modules/(?!(@postxl)/)',
|
|
35
|
-
],
|
|
36
20
|
testEnvironment: 'node',
|
|
37
21
|
roots: ['<rootDir>/libs/', '<rootDir>/apps/'],
|
|
38
|
-
moduleNameMapper: {
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
prefix: '<rootDir>/',
|
|
42
|
-
}),
|
|
43
|
-
},
|
|
22
|
+
moduleNameMapper: pathsToModuleNameMapper(tsconfig.compilerOptions.paths, {
|
|
23
|
+
prefix: '<rootDir>/',
|
|
24
|
+
}),
|
|
44
25
|
prettierPath: null,
|
|
45
26
|
coverageReporters: [
|
|
46
27
|
[
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jest.config.generator.js","sourceRoot":"","sources":["../../../src/backend-core/generators/jest.config.generator.ts"],"names":[],"mappings":";;AAEA,
|
|
1
|
+
{"version":3,"file":"jest.config.generator.js","sourceRoot":"","sources":["../../../src/backend-core/generators/jest.config.generator.ts"],"names":[],"mappings":";;AAEA,gDAsCC;AAtCD,SAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAe;IACxD,OAAO,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBA6BM,MAAM,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ;;;;;;;sBAOhE,CAAA;AACtB,CAAC"}
|
|
@@ -11,7 +11,7 @@ import { Logger, NestApplicationOptions } from '@nestjs/common'
|
|
|
11
11
|
import { NestFactory } from '@nestjs/core'
|
|
12
12
|
import { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'
|
|
13
13
|
|
|
14
|
-
import
|
|
14
|
+
import { yellow } from 'colors/safe'
|
|
15
15
|
import { fromError } from 'zod-validation-error'
|
|
16
16
|
|
|
17
17
|
import { checkPortAvailability,removeSecrets } from '@postxl/utils'
|
|
@@ -129,7 +129,7 @@ export async function bootstrap({
|
|
|
129
129
|
.join('\n\n')}
|
|
130
130
|
|
|
131
131
|
const server = await app.listen(config.data.port, '0.0.0.0')
|
|
132
|
-
logger.log(\`${schema.name} API is running on \${
|
|
132
|
+
logger.log(\`${schema.name} API is running on \${yellow(config.data.port.toString())}\`)
|
|
133
133
|
|
|
134
134
|
// handling shutdown signal, used in E2E testing
|
|
135
135
|
process.on('SIGTERM', () => {
|
|
@@ -151,13 +151,11 @@ export async function bootstrap({
|
|
|
151
151
|
return app
|
|
152
152
|
}
|
|
153
153
|
|
|
154
|
-
// Start
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
void bootstrap({ enableLog: true }) // NOSONAR - top-level await requires additional config
|
|
160
|
-
}
|
|
154
|
+
// Start
|
|
155
|
+
|
|
156
|
+
// We prevent the app from being started other than by the main module - see https://chanind.github.io/2020/08/27/node-scripts-best-practices.html
|
|
157
|
+
if (require.main === module) {
|
|
158
|
+
void bootstrap({ enableLog: true }) // NOSONAR - we will switch to top-level await later
|
|
161
159
|
}`;
|
|
162
160
|
}
|
|
163
161
|
//# sourceMappingURL=main.generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.generator.js","sourceRoot":"","sources":["../../../src/backend-core/generators/main.generator.ts"],"names":[],"mappings":";;AAEA,
|
|
1
|
+
{"version":3,"file":"main.generator.js","sourceRoot":"","sources":["../../../src/backend-core/generators/main.generator.ts"],"names":[],"mappings":";;AAEA,oCA4JC;AA5JD,SAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAe;IACxE,OAAO,MAAM,CAAC;;;;;;;;;;;;;;;EAed,OAAO;SACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAU,CAAC,MAAM,CAAC;SAC/B,IAAI,CAAC,IAAI,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAuGT,OAAO;SACN,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;SAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAU,CAAC,IAAI,CAAC;SAC7B,IAAI,CAAC,MAAM,CAAC;;;iBAGA,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;EA2B1B,CAAA;AACF,CAAC"}
|
|
@@ -16,8 +16,7 @@ function generateTsConfig({ backend: { modules, tsConfigReferences } }) {
|
|
|
16
16
|
},
|
|
17
17
|
"exclude": ["jest.config.ts"],
|
|
18
18
|
"compilerOptions": {
|
|
19
|
-
"module": "
|
|
20
|
-
"moduleResolution": "bundler",
|
|
19
|
+
"module": "commonjs",
|
|
21
20
|
"declaration": true,
|
|
22
21
|
"removeComments": true,
|
|
23
22
|
"emitDecoratorMetadata": true,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tsconfig.generator.js","sourceRoot":"","sources":["../../../src/backend-core/generators/tsconfig.generator.ts"],"names":[],"mappings":";;AAEA,
|
|
1
|
+
{"version":3,"file":"tsconfig.generator.js","sourceRoot":"","sources":["../../../src/backend-core/generators/tsconfig.generator.ts"],"names":[],"mappings":";;AAEA,4CAiDC;AAjDD,SAAgB,gBAAgB,CAAC,EAAE,OAAO,EAAE,EAAE,OAAO,EAAE,kBAAkB,EAAE,EAAe;IACxF,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,IAAI,UAAU,EAAE,KAAK,CAAC,CAAC,IAAI,eAAe,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAA;IACpG,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,kBAAkB,EAAE,CAAC;QAC3C,KAAK,CAAC,IAAI,CAAC,KAAK,SAAS,iBAAiB,SAAS,UAAU,EAAE,KAAK,SAAS,eAAe,SAAS,QAAQ,CAAC,CAAA;IAChH,CAAC;IAED,OAAO,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAkCV,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;;;;CAI/D,CAAA;AACD,CAAC"}
|
|
@@ -97,16 +97,16 @@ exports.generator = {
|
|
|
97
97
|
context.backend.modules.push(e2eModule);
|
|
98
98
|
context.backend.packageJson.scripts.push({
|
|
99
99
|
name: 'e2e:stateless',
|
|
100
|
-
command: 'STATEFUL=false AUTH=false NODE_ENV=test
|
|
100
|
+
command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=false --env AUTH=false NODE_ENV=test -- nest start --watch --debug --entryFile apps/api/src/e2e.js',
|
|
101
101
|
}, {
|
|
102
102
|
name: 'e2e:stateful',
|
|
103
|
-
command: 'STATEFUL=true AUTH=false NODE_ENV=test
|
|
103
|
+
command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=true --env AUTH=false NODE_ENV=test -- nest start --watch --debug --entryFile apps/api/src/e2e.js',
|
|
104
104
|
}, {
|
|
105
105
|
name: 'e2e:coverage:stateless',
|
|
106
|
-
command: '
|
|
106
|
+
command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=false --env AUTH=false NODE_ENV=test -- c8 nest start --entryFile apps/api/src/e2e.js',
|
|
107
107
|
}, {
|
|
108
108
|
name: 'e2e:coverage:stateful',
|
|
109
|
-
command: '
|
|
109
|
+
command: 'dotenvx run -f ./apps/api/.env --env STATEFUL=true --env AUTH=false NODE_ENV=test -- c8 nest start --entryFile apps/api/src/e2e.js',
|
|
110
110
|
});
|
|
111
111
|
const serviceLocation = Generator.toBackendModuleLocation(`@e2e/e2e.service`);
|
|
112
112
|
const service = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend-e2e.generator.js","sourceRoot":"","sources":["../../src/backend-e2e/backend-e2e.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAA8C;AAC9C,iDAAsC;AAEtC,wDAA2E;AAC3E,kDAA+E;AAE/E,kEAA0F;AAC1F,kDAAkE;AAClE,kCAAmD;AAGnD,oFAAoF;AACpF,4EAA4E;AAC5E,8EAA8E;AAajE,QAAA,WAAW,GAAG,SAAS,CAAC,sBAAsB,CAAC,aAAa,CAAC,CAAA;AAE7D,QAAA,SAAS,GAAiC;IACrD,EAAE,EAAE,mBAAW;IACf,QAAQ,EAAE;QACR,iCAAkB;QAClB,sBAAe;QACf,2CAAyB;QACzB,qDAA8B;QAC9B,qCAAsB;KACvB;IAED,QAAQ,EAAE,CAAsC,OAAgB,EAAiB,EAAE;QACjF,MAAM,MAAM,GAA8B;YACxC,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,WAAW,CAAC;YACxC,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,iBAAiB,CAAC;SAC/D,CAAA;QAED,MAAM,SAAS,GAAiB;YAC9B,IAAI,EAAE,SAAS,CAAC,mBAAmB,CAAC,KAAK,CAAC;YAC1C,WAAW,EAAE,MAAM;YAEnB,qBAAqB,EAAE;gBACrB,IAAI,EAAE,IAAA,cAAE,EAAC,iEAAiE,CAAC;aAC5E;YACD,SAAS,EAAE;gBACT,OAAO,EAAE,IAAA,cAAE,EAAC,kCAAkC,CAAC;gBAC/C,WAAW,EAAE,IAAA,cAAE,EAAC;;;;;;;;gBAQR,CAAC;gBACT,IAAI,EAAE,IAAA,cAAE,EAAC;;;;;;;;;;YAUL,CAAC;gBACL,aAAa,EAAE,EAAE;aAClB;YACD,SAAS,EAAE;gBACT,MAAM,EAAE,IAAA,cAAE,EAAC,EAAE,CAAC;gBACd,IAAI,EAAE,IAAA,cAAE,EAAC,EAAE,CAAC;aACb;SACF,CAAA;QACD,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;QAEvC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,IAAI,CACtC;YACE,IAAI,EAAE,eAAe;YACrB,OAAO,
|
|
1
|
+
{"version":3,"file":"backend-e2e.generator.js","sourceRoot":"","sources":["../../src/backend-e2e/backend-e2e.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,6 +41,8 @@ function generateModelController({ model, context, }) {
|
|
|
41
41
|
.add(model.types.id.decoderBase)
|
|
42
42
|
.add(model.types.id.toBranded)
|
|
43
43
|
.add(model.decoder.decoder.zodDecoder)
|
|
44
|
+
.add(model.types.filter.decoder)
|
|
45
|
+
.add(model.types.sort.decoder)
|
|
44
46
|
.add(context.view.service);
|
|
45
47
|
const { PascalCase, PascalCasePlural, camelCase } = model._conjugated;
|
|
46
48
|
// Find all Date fields that need to be overridden for JSON Schema compatibility
|
|
@@ -89,15 +91,35 @@ function generateModelController({ model, context, }) {
|
|
|
89
91
|
const duComment = discriminatedUnionFields.length > 0
|
|
90
92
|
? `\n// Note: Discriminated union fields omitted from REST API: ${discriminatedUnionFields.map((f) => f.name).join(', ')}`
|
|
91
93
|
: '';
|
|
94
|
+
// Generate filter fields for the API description
|
|
95
|
+
const filterableFields = Array.from(model.fields.values()).filter((f) => f.kind !== 'discriminatedUnion');
|
|
96
|
+
const filterFieldNames = filterableFields.map((f) => f.name);
|
|
97
|
+
const filterFieldsDescription = [...filterFieldNames, 'globalSearch'].join(', ');
|
|
98
|
+
// Generate a good example with two fields if possible
|
|
99
|
+
const stringField = filterableFields.find((f) => f.kind === 'scalar' && f.type === 'string' && f.name !== 'id');
|
|
100
|
+
const booleanField = filterableFields.find((f) => f.kind === 'scalar' && f.type === 'boolean');
|
|
101
|
+
const exampleParts = [];
|
|
102
|
+
if (stringField) {
|
|
103
|
+
exampleParts.push(`"${stringField.name}":{"contains":"test"}`);
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
exampleParts.push(`"id":{"contains":"test"}`);
|
|
107
|
+
}
|
|
108
|
+
if (booleanField) {
|
|
109
|
+
exampleParts.push(`"${booleanField.name}":[true]`);
|
|
110
|
+
}
|
|
111
|
+
const filterExample = `{${exampleParts.join(',')}}`;
|
|
92
112
|
return /* ts */ `
|
|
93
113
|
import '@fastify/cookie'
|
|
94
114
|
import { Controller, Get, Logger, Param, Query } from '@nestjs/common'
|
|
115
|
+
import { ApiQuery } from '@nestjs/swagger'
|
|
95
116
|
import { createZodDto, ZodResponse } from 'nestjs-zod'
|
|
96
117
|
${imports.generate()}
|
|
97
118
|
import z from 'zod'
|
|
98
119
|
|
|
99
120
|
import { createFieldsDecoder, selectFields } from '@utils/fieldSelection'
|
|
100
|
-
import {
|
|
121
|
+
import { paginatedResultDecoder, paginationDecoderFromQuery } from '@utils/pagination'
|
|
122
|
+
import { jsonQueryParam } from './restApi.utils'
|
|
101
123
|
|
|
102
124
|
// REST API decoder safe for JSON Schema / OpenAPI generation
|
|
103
125
|
// Reuses ${model.decoder.decoder.zodDecoder.name} but overrides fields with transforms or non-JSON-representable types${duComment}
|
|
@@ -132,6 +154,8 @@ const get${PascalCase}ResponseDecoder = z.object({
|
|
|
132
154
|
|
|
133
155
|
const get${PascalCasePlural}Decoder = paginationDecoderFromQuery.extend({
|
|
134
156
|
fields: ${camelCase}FieldsDecoder,
|
|
157
|
+
filters: jsonQueryParam(${model.types.filter.decoder.name}),
|
|
158
|
+
sort: jsonQueryParam(${model.types.sort.decoder.name}),
|
|
135
159
|
})
|
|
136
160
|
|
|
137
161
|
const get${PascalCasePlural}ResponseDecoder = paginatedResultDecoder(z${PascalCase}RestApiDecoder.partial())
|
|
@@ -171,14 +195,31 @@ export class ${model.restApi.controller.name} {
|
|
|
171
195
|
/**
|
|
172
196
|
* Retrieve all ${model.userFriendlyNamePlural}.
|
|
173
197
|
*/
|
|
198
|
+
@ApiQuery({
|
|
199
|
+
name: 'filters',
|
|
200
|
+
required: false,
|
|
201
|
+
description: \`JSON filter object. Fields: ${filterFieldsDescription}. String fields accept: values (array), contains, startsWith, endsWith, exclude. Date fields accept: from, to. Boolean fields accept an array of true/false.\`,
|
|
202
|
+
example: '${filterExample}',
|
|
203
|
+
})
|
|
204
|
+
@ApiQuery({
|
|
205
|
+
name: 'sort',
|
|
206
|
+
required: false,
|
|
207
|
+
description: \`JSON array of sort objects. Each object has "field" (${filterFieldNames.join(', ')}) and "direction" (asc, desc).\`,
|
|
208
|
+
example: '[{"field":"${stringField?.name ?? filterFieldNames[0] ?? 'id'}","direction":"asc"}]',
|
|
209
|
+
})
|
|
174
210
|
@ZodResponse({ type: Get${PascalCasePlural}ResponseDto })
|
|
175
211
|
@Get('')
|
|
176
212
|
async get${PascalCasePlural}(@Query() query: Get${PascalCasePlural}Dto): Promise<Get${PascalCasePlural}Response> {
|
|
177
|
-
const
|
|
178
|
-
|
|
213
|
+
const result = await this.viewService.${model.view.service.variableName}.getFilteredPaginated({
|
|
214
|
+
user: this.viewService.users.data.rootUser,
|
|
215
|
+
filters: query.filters ?? {},
|
|
216
|
+
sort: query.sort,
|
|
217
|
+
cursor: query.cursor,
|
|
218
|
+
limit: query.limit,
|
|
219
|
+
})
|
|
179
220
|
return {
|
|
180
|
-
...
|
|
181
|
-
data:
|
|
221
|
+
...result,
|
|
222
|
+
data: result.data.map((item) => to${PascalCase}RestApi(item, query.fields)),
|
|
182
223
|
}
|
|
183
224
|
}
|
|
184
225
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-controller.generator.js","sourceRoot":"","sources":["../../../src/backend-rest-api/generators/model-controller.generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,
|
|
1
|
+
{"version":3,"file":"model-controller.generator.js","sourceRoot":"","sources":["../../../src/backend-rest-api/generators/model-controller.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -95,9 +95,13 @@ import { ZodExceptionFilter } from '@restApi/zod-exception.filter'
|
|
|
95
95
|
vfs.insertFromVfs({ targetPath: 'libs/restApi', vfs: vfsLib });
|
|
96
96
|
// Load static template file
|
|
97
97
|
await vfs.loadFile({
|
|
98
|
-
diskPath: path.resolve(__dirname, './template/zod-exception.filter.ts'),
|
|
98
|
+
diskPath: path.resolve(__dirname, './template/restApi/src/zod-exception.filter.ts'),
|
|
99
99
|
targetPath: 'libs/restApi/src/zod-exception.filter.ts',
|
|
100
100
|
});
|
|
101
|
+
await vfs.loadFile({
|
|
102
|
+
diskPath: path.resolve(__dirname, './template/restApi/src/restApi.utils.ts'),
|
|
103
|
+
targetPath: 'libs/restApi/src/restApi.utils.ts',
|
|
104
|
+
});
|
|
101
105
|
await vfs.loadFile({
|
|
102
106
|
diskPath: path.resolve(__dirname, './template/utils/src/fieldSelection.ts'),
|
|
103
107
|
targetPath: 'libs/utils/src/fieldSelection.ts',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rest-api.generator.js","sourceRoot":"","sources":["../../src/backend-rest-api/rest-api.generator.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"rest-api.generator.js","sourceRoot":"","sources":["../../src/backend-rest-api/rest-api.generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import z from 'zod'
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Creates a Zod schema for a query parameter that accepts a JSON string
|
|
5
|
+
* and parses it into the specified schema type.
|
|
6
|
+
*
|
|
7
|
+
* OpenAPI will show this as an optional string parameter.
|
|
8
|
+
* At runtime, the string is parsed as JSON and validated against the schema.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* const decoder = z.object({
|
|
12
|
+
* filters: jsonQueryParam(zMyFilterSchema),
|
|
13
|
+
* })
|
|
14
|
+
* // Accepts: ?filters={"name":{"contains":"test"}}
|
|
15
|
+
*/
|
|
16
|
+
export const jsonQueryParam = <T extends z.ZodTypeAny>(schema: T) =>
|
|
17
|
+
z
|
|
18
|
+
.string()
|
|
19
|
+
.optional()
|
|
20
|
+
.transform((val, ctx) => {
|
|
21
|
+
if (!val) {
|
|
22
|
+
return undefined
|
|
23
|
+
}
|
|
24
|
+
try {
|
|
25
|
+
return JSON.parse(val)
|
|
26
|
+
} catch (e) {
|
|
27
|
+
ctx.addIssue({
|
|
28
|
+
code: 'custom',
|
|
29
|
+
message: `Invalid JSON: ${e instanceof Error ? e.message : String(e)}`,
|
|
30
|
+
})
|
|
31
|
+
return z.NEVER
|
|
32
|
+
}
|
|
33
|
+
})
|
|
34
|
+
.pipe(schema.optional())
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { ArgumentsHost, Catch, HttpException, Logger } from '@nestjs/common'
|
|
2
|
+
import { BaseExceptionFilter } from '@nestjs/core'
|
|
3
|
+
|
|
4
|
+
import { ZodSerializationException, ZodValidationException } from 'nestjs-zod'
|
|
5
|
+
import z from 'zod'
|
|
6
|
+
|
|
7
|
+
@Catch(HttpException)
|
|
8
|
+
export class ZodExceptionFilter extends BaseExceptionFilter {
|
|
9
|
+
private readonly logger = new Logger(ZodExceptionFilter.name)
|
|
10
|
+
|
|
11
|
+
override catch(exception: HttpException, host: ArgumentsHost) {
|
|
12
|
+
if (exception instanceof ZodValidationException) {
|
|
13
|
+
const zodError = exception.getZodError()
|
|
14
|
+
if (zodError instanceof z.ZodError) {
|
|
15
|
+
// Extract meaningful error messages from Zod errors
|
|
16
|
+
const errors = zodError.issues.map((issue) => ({
|
|
17
|
+
path: issue.path.join('.'),
|
|
18
|
+
message: issue.message,
|
|
19
|
+
}))
|
|
20
|
+
this.logger.warn('ZodValidationException: ' + JSON.stringify(errors))
|
|
21
|
+
|
|
22
|
+
// Create a more informative response
|
|
23
|
+
const response = host.switchToHttp().getResponse()
|
|
24
|
+
response.status(400).send({
|
|
25
|
+
statusCode: 400,
|
|
26
|
+
message: 'Validation failed',
|
|
27
|
+
errors,
|
|
28
|
+
})
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (exception instanceof ZodSerializationException) {
|
|
34
|
+
const zodError = exception.getZodError()
|
|
35
|
+
if (zodError instanceof z.ZodError) {
|
|
36
|
+
this.logger.error('ZodSerializationException: ' + zodError.message)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
super.catch(exception, host)
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -41,14 +41,11 @@ function generateModelUpdateService({ model, context, }) {
|
|
|
41
41
|
const imports = Generator.ImportGenerator.from(model.update.service.location)
|
|
42
42
|
.addType(model.types)
|
|
43
43
|
.addType(context.actions.execution.interface)
|
|
44
|
-
|
|
44
|
+
.add(context.update.service)
|
|
45
|
+
.add(context.view.service)
|
|
45
46
|
.addImport({
|
|
46
47
|
from: Generator.toPackageName('@postxl/utils'),
|
|
47
48
|
items: [Generator.toFunctionName('ExhaustiveSwitchCheck')],
|
|
48
|
-
})
|
|
49
|
-
.addImport({
|
|
50
|
-
from: Generator.toBackendModuleLocation('@nestjs/core'),
|
|
51
|
-
items: [Generator.toClassName('ModuleRef')],
|
|
52
49
|
});
|
|
53
50
|
if (model.repository.kind === 'NoRepository') {
|
|
54
51
|
return `TBD`; //generateModelUpdateService_NoRepository({ model, context, imports })
|
|
@@ -58,16 +55,10 @@ function generateModelUpdateService({ model, context, }) {
|
|
|
58
55
|
for (const action of model.update.action.actions) {
|
|
59
56
|
actions.push(generateActionBlock({ action, model, context, imports }));
|
|
60
57
|
}
|
|
61
|
-
// Add type-only imports for UpdateService and ViewService
|
|
62
|
-
const updateServiceImport = `import type { ${context.update.service.name} } from '${Generator.ImportGenerator.getRelativePath({ from: model.update.service.location, to: context.update.service.location })}'`;
|
|
63
|
-
const viewServiceImport = `import type { ${context.view.service.name} } from '${Generator.ImportGenerator.getRelativePath({ from: model.update.service.location, to: context.view.service.location })}'`;
|
|
64
58
|
return `
|
|
65
|
-
import { Injectable } from '@nestjs/common'
|
|
59
|
+
import { Inject, Injectable, forwardRef } from '@nestjs/common'
|
|
66
60
|
import { z } from 'zod'
|
|
67
61
|
|
|
68
|
-
${updateServiceImport}
|
|
69
|
-
${viewServiceImport}
|
|
70
|
-
|
|
71
62
|
${imports.generate()}
|
|
72
63
|
|
|
73
64
|
export type ${model.update.action.type.name} = ${actions.map((a) => a.type).join('| ')}
|
|
@@ -79,7 +70,7 @@ function generateModelUpdateService({ model, context, }) {
|
|
|
79
70
|
${actions.map((a) => a.typeDefinition).join('\n')}
|
|
80
71
|
|
|
81
72
|
${actions.map((a) => a.inputDecoderAndType).join('\n')}
|
|
82
|
-
|
|
73
|
+
|
|
83
74
|
${actions
|
|
84
75
|
.filter((a) => a.resultTypeDefinition !== null)
|
|
85
76
|
.map((a) => a.resultTypeDefinition)
|
|
@@ -87,22 +78,17 @@ function generateModelUpdateService({ model, context, }) {
|
|
|
87
78
|
|
|
88
79
|
@Injectable()
|
|
89
80
|
export class ${model.update.service.name} {
|
|
90
|
-
|
|
91
|
-
private viewServiceInstance?: ${context.view.service.name}
|
|
81
|
+
|
|
92
82
|
|
|
93
83
|
constructor(
|
|
94
84
|
private readonly data: ${model.repository.name},
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
85
|
+
|
|
86
|
+
@Inject(forwardRef(() => ${context.update.service.name}))
|
|
87
|
+
private readonly updateService: ${context.update.service.name},
|
|
98
88
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
private get viewService(): ${context.view.service.name} {
|
|
105
|
-
return this.viewServiceInstance ??= this.moduleRef.get('${context.view.service.name}', { strict: false }) // NOSONAR
|
|
89
|
+
@Inject(forwardRef(() => ${context.view.service.name}))
|
|
90
|
+
private readonly viewService: ${context.view.service.name}
|
|
91
|
+
) {
|
|
106
92
|
}
|
|
107
93
|
|
|
108
94
|
/**
|