@postxl/generators 1.7.0 → 1.8.1

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 (41) hide show
  1. package/dist/backend-core/backend.generator.js +22 -12
  2. package/dist/backend-core/backend.generator.js.map +1 -1
  3. package/dist/backend-core/generators/jest.config.generator.js +5 -24
  4. package/dist/backend-core/generators/jest.config.generator.js.map +1 -1
  5. package/dist/backend-core/generators/main.generator.js +7 -9
  6. package/dist/backend-core/generators/main.generator.js.map +1 -1
  7. package/dist/backend-core/generators/tsconfig.generator.js +1 -2
  8. package/dist/backend-core/generators/tsconfig.generator.js.map +1 -1
  9. package/dist/backend-database-prisma/generators/database-service.generator.js +0 -4
  10. package/dist/backend-database-prisma/generators/database-service.generator.js.map +1 -1
  11. package/dist/backend-e2e/backend-e2e.generator.js +4 -4
  12. package/dist/backend-e2e/backend-e2e.generator.js.map +1 -1
  13. package/dist/backend-rest-api/generators/model-controller.generator.js +46 -5
  14. package/dist/backend-rest-api/generators/model-controller.generator.js.map +1 -1
  15. package/dist/backend-rest-api/rest-api.generator.js +5 -1
  16. package/dist/backend-rest-api/rest-api.generator.js.map +1 -1
  17. package/dist/backend-rest-api/template/restApi/src/restApi.utils.ts +34 -0
  18. package/dist/backend-rest-api/template/restApi/src/zod-exception.filter.ts +42 -0
  19. package/dist/backend-update/model-update-service.generator.js +11 -25
  20. package/dist/backend-update/model-update-service.generator.js.map +1 -1
  21. package/dist/backend-update/update-service.generator.js +4 -16
  22. package/dist/backend-update/update-service.generator.js.map +1 -1
  23. package/dist/backend-view/model-view-service.generator.js +8 -35
  24. package/dist/backend-view/model-view-service.generator.js.map +1 -1
  25. package/dist/backend-view/view-service.generator.js +4 -17
  26. package/dist/backend-view/view-service.generator.js.map +1 -1
  27. package/dist/base/template/sonar-project.properties +0 -1
  28. package/dist/devops/generators/e2e-yml.generator.js +0 -1
  29. package/dist/devops/generators/e2e-yml.generator.js.map +1 -1
  30. package/dist/frontend-core/frontend.generator.js +1 -1
  31. package/dist/frontend-core/frontend.generator.js.map +1 -1
  32. package/dist/frontend-core/template/vite.config.ts +3 -2
  33. package/dist/seed-data/generator/model-seed-data.generator.d.ts +1 -0
  34. package/dist/seed-data/generator/model-seed-data.generator.js +2 -38
  35. package/dist/seed-data/generator/model-seed-data.generator.js.map +1 -1
  36. package/dist/seed-data/generator/seed-migrations.generator.js +3 -3
  37. package/dist/seed-data/seed-data.generator.js +1 -1
  38. package/dist/seed-data/seed-data.generator.js.map +1 -1
  39. package/package.json +1 -1
  40. package/dist/backend-core/template/scripts/dev.sh +0 -27
  41. 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: 'picocolors', version: '1.1.1' },
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
- { packageName: 'serialize-error', version: '11.0.1' },
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 && tsc-alias -p tsconfig.json -f' },
77
+ { name: 'build', command: 'nest build' },
79
78
  { name: 'start', command: 'node ./dist/apps/api/apps/api/src/main.js' },
80
- { name: 'dev', command: 'STATEFUL=false AUTH=false ./scripts/dev.sh' },
81
- { name: 'dev:auth', command: 'STATEFUL=false AUTH=true ./scripts/dev.sh' },
82
- { name: 'dev:stateful', command: 'STATEFUL=true AUTH=false ./scripts/dev.sh' },
83
- { name: 'dev:stateful:auth', command: 'STATEFUL=true AUTH=true ./scripts/dev.sh' },
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: 'cross-env NODE_OPTIONS="$NODE_OPTIONS --experimental-vm-modules" jest' },
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":"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"}
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,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;IAC3C,EAAE,WAAW,EAAE,cAAc,EAAE,OAAO,EAAE,OAAO,EAAE;IACjD,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE;IAC7C,8FAA8F;IAC9F,EAAE,WAAW,EAAE,iBAAiB,EAAE,OAAO,EAAE,OAAO,EAAE;IACpD,EAAE,WAAW,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE;IACxC,EAAE,WAAW,EAAE,sBAAsB,EAAE,OAAO,EAAE,OAAO,EAAE;CAC1D,CAAA;AACD,MAAM,mBAAmB,GAAkC;IACzD,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;IAC5C,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE;IAC5C,EAAE,WAAW,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE;IACtD,EAAE,WAAW,EAAE,eAAe,EAAE,OAAO,EAAE,QAAQ,EAAE;IACnD,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,SAAS,EAAE;IAClD,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE;IACnD,EAAE,WAAW,EAAE,aAAa,EAAE,OAAO,EAAE,QAAQ,EAAE;IACjD,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE;IAC1C,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE;IAC7C,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAE,OAAO,EAAE;IACnD,EAAE,WAAW,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,EAAE;IAC/C,EAAE,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE;CAC/C,CAAA;AAED,MAAM,WAAW,GAA8B;IAC7C,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE;IACxC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,2CAA2C,EAAE;IACvE;QACE,IAAI,EAAE,KAAK;QACX,OAAO,EAAE,oGAAoG;KAC9G;IACD;QACE,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,mGAAmG;KAC7G;IACD;QACE,IAAI,EAAE,cAAc;QACpB,OAAO,EAAE,mGAAmG;KAC7G;IACD;QACE,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,kGAAkG;KAC5G;IACD,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE;IACrC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE;IACtC,EAAE,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,cAAc,EAAE;CAChD,CAAA;AAEY,QAAA,kBAAkB,GAAG,SAAS,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAA;AAErE,QAAA,gBAAgB,GAAiC;IAC5D,EAAE,EAAE,0BAAkB;IAEtB,QAAQ,EAAE,CAAC,OAA4B,EAAE,EAAE;QACzC,MAAM,OAAO,GAAwB;YACnC,OAAO,EAAE,EAAE;YACX,WAAW,EAAE;gBACX,IAAI,EAAE,SAAS,CAAC,mBAAmB,CAAC,WAAW,OAAO,CAAC,MAAM,CAAC,IAAI,MAAM,CAAC;gBACzE,WAAW,EAAE,eAAe,OAAO,CAAC,MAAM,CAAC,IAAI,UAAU;gBACzD,YAAY,EAAE,gBAAgB;gBAC9B,eAAe,EAAE,mBAAmB;gBACpC,OAAO,EAAE,WAAW;gBACpB,mBAAmB,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,KAAK,WAAW;aAChE;YACD,kBAAkB,EAAE,CAAC,OAAO,CAAC;SAC9B,CAAA;QACD,OAAO;YACL,GAAG,OAAO;YACV,OAAO;SACR,CAAA;IACH,CAAC;IAED,QAAQ,EAAE,KAAK,EAAqC,GAAyB,EAAE,EAAE;QAC/E,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,iBAAiB,EAAE,CAAA;QAE7C,oBAAoB;QACpB,MAAM,GAAG,CAAC,UAAU,CAAC;YACnB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC;YAC/C,iDAAiD;YACjD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC;SAC5C,CAAC,CAAA;QAEF,2BAA2B;QAC3B,MAAM,GAAG,CAAC,UAAU,CAAC;YACnB,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,uBAAuB,CAAC;YAC1D,UAAU,EAAE,YAAY;SACzB,CAAC,CAAA;QAEF,sBAAsB;QACtB,GAAG,CAAC,KAAK,CAAC,eAAe,EAAE,SAAS,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAA;QAClF,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,IAAA,qCAAgB,EAAC,GAAG,CAAC,CAAC,CAAA;QAClD,GAAG,CAAC,KAAK,CAAC,iBAAiB,EAAE,IAAA,0CAAkB,EAAC,GAAG,CAAC,CAAC,CAAA;QACrD,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,IAAA,wCAAiB,EAAC,GAAG,CAAC,CAAC,CAAA;QAChE,GAAG,CAAC,KAAK,CAAC,uBAAuB,EAAE,IAAA,6BAAY,EAAC,GAAG,CAAC,CAAC,CAAA;QACrD,GAAG,CAAC,KAAK,CAAC,6BAA6B,EAAE,IAAA,wCAAiB,EAAC,GAAG,CAAC,CAAC,CAAA;QAEhE,MAAM,GAAG,GAAG,IAAA,gDAAqB,EAAC,GAAG,CAAC,CAAA;QACtC,GAAG,CAAC,KAAK,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAA;QACxC,mGAAmG;QACnG,oGAAoG;QACpG,mBAAmB;QACnB,GAAG,CAAC,KAAK,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAA;QAEhC,0BAA0B;QAC1B,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACzC,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;gBACf,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC,CAAA;YACxC,CAAC;QACH,CAAC;QAED,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAA;QACtD,OAAO,GAAG,CAAA;IACZ,CAAC;CACF,CAAA"}
@@ -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
- const tsconfig = JSON.parse(readFileSync('./tsconfig.json', 'utf-8'))
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
- '^.+\\\\.ts$': [
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
- '^(\\\\.{1,2}/.*)\\\\.js$': '$1',
40
- ...pathsToModuleNameMapper(tsconfig.compilerOptions.paths, {
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,gDAyDC;AAzDD,SAAgB,kBAAkB,CAAC,EAAE,MAAM,EAAe;IACxD,OAAO,QAAQ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;wBAgDM,MAAM,CAAC,WAAW,KAAK,WAAW,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,QAAQ;;;;;;;sBAOhE,CAAA;AACtB,CAAC"}
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 pc from 'picocolors'
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 \${pc.yellow(config.data.port.toString())}\`)
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 - ESM entry point check
155
- // In ESM, we check if this is the main module using import.meta.url
156
- if (import.meta.url.startsWith('file:')) {
157
- const modulePath = new URL(import.meta.url).pathname
158
- if (process.argv[1] === modulePath || process.argv[1] === modulePath.slice(1)) {
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,oCA8JC;AA9JD,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA6B1B,CAAA;AACF,CAAC"}
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": "ESNext",
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,4CAkDC;AAlDD,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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QAmCV,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"}
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"}
@@ -16,20 +16,16 @@ ${imports.generate()}
16
16
  @Injectable()
17
17
  export class ${service.name} extends PrismaClient implements OnModuleDestroy {
18
18
  private readonly logger = new Logger(${service.name}.name)
19
- private readonly pool: Pool
20
19
 
21
20
  constructor(config: ${config.name}) {
22
21
  const pool = new Pool({ connectionString: config.config.connectionString })
23
22
  const adapter = new PrismaPg(pool)
24
23
 
25
24
  super({adapter})
26
-
27
- this.pool = pool
28
25
  }
29
26
 
30
27
  public async onModuleDestroy() {
31
28
  await this.$disconnect()
32
- await this.pool.end()
33
29
  }
34
30
 
35
31
  // eslint-disable-next-line @typescript-eslint/require-await
@@ -1 +1 @@
1
- {"version":3,"file":"database-service.generator.js","sourceRoot":"","sources":["../../../src/backend-database-prisma/generators/database-service.generator.ts"],"names":[],"mappings":";;AAIA,0DAwCC;AA5CD,iDAAmD;AAInD,SAAgB,uBAAuB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAmB;IACxF,MAAM,OAAO,GAAG,2BAAe;QAC7B,EAAE;SACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;SACtB,GAAG,CAAC,YAAY,CAAC;SACjB,GAAG,CAAC,MAAM,CAAC,CAAA;IAEd,OAAO,QAAQ,CAAC;;;;EAIhB,OAAO,CAAC,QAAQ,EAAE;;eAEL,OAAO,CAAC,IAAI;yCACc,OAAO,CAAC,IAAI;;;wBAG7B,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;;;;EAsBjC,CAAA;AACF,CAAC"}
1
+ {"version":3,"file":"database-service.generator.js","sourceRoot":"","sources":["../../../src/backend-database-prisma/generators/database-service.generator.ts"],"names":[],"mappings":";;AAIA,0DAoCC;AAxCD,iDAAmD;AAInD,SAAgB,uBAAuB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,YAAY,EAAmB;IACxF,MAAM,OAAO,GAAG,2BAAe;QAC7B,EAAE;SACD,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;SACtB,GAAG,CAAC,YAAY,CAAC;SACjB,GAAG,CAAC,MAAM,CAAC,CAAA;IAEd,OAAO,QAAQ,CAAC;;;;EAIhB,OAAO,CAAC,QAAQ,EAAE;;eAEL,OAAO,CAAC,IAAI;yCACc,OAAO,CAAC,IAAI;;wBAE7B,MAAM,CAAC,IAAI;;;;;;;;;;;;;;;;;;;EAmBjC,CAAA;AACF,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 ENTRY_FILE=apps/api/src/e2e.ts ./scripts/dev.sh',
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 ENTRY_FILE=apps/api/src/e2e.ts ./scripts/dev.sh',
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: 'pnpm build && dotenvx run -f ./apps/api/.env --env STATEFUL=false --env AUTH=false --env NODE_ENV=test -- c8 node dist/apps/api/apps/api/src/e2e.js',
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: 'pnpm build && dotenvx run -f ./apps/api/.env --env STATEFUL=true --env AUTH=false --env NODE_ENV=test -- c8 node dist/apps/api/apps/api/src/e2e.js',
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,EAAE,yFAAyF;SACnG,EACD;YACE,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,wFAAwF;SAClG,EACD;YACE,IAAI,EAAE,wBAAwB;YAC9B,OAAO,EACL,qJAAqJ;SACxJ,EACD;YACE,IAAI,EAAE,uBAAuB;YAC7B,OAAO,EACL,oJAAoJ;SACvJ,CACF,CAAA;QAED,MAAM,eAAe,GAAG,SAAS,CAAC,uBAAuB,CAAC,kBAAkB,CAAC,CAAA;QAC7E,MAAM,OAAO,GAAG;YACd,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,YAAY,CAAC;YACzC,QAAQ,EAAE,eAAe;YACzB,OAAO,EAAE;gBACP,IAAI,EAAE,SAAS,CAAC,cAAc,CAAC,wBAAwB,CAAC;gBACxD,QAAQ,EAAE,eAAe;aAC1B;SACF,CAAA;QACD,MAAM,UAAU,GAA8B;YAC5C,IAAI,EAAE,SAAS,CAAC,WAAW,CAAC,eAAe,CAAC;YAC5C,QAAQ,EAAE,SAAS,CAAC,uBAAuB,CAAC,qBAAqB,CAAC;SACnE,CAAA;QAED,MAAM,UAAU,GAAsB,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAA;QACrE,OAAO,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,CAAA;IACnC,CAAC;IAED,QAAQ,EAAE,CAAgC,OAAgB,EAAoB,EAAE;QAC9E,MAAM,MAAM,GAAG,IAAI,SAAS,CAAC,iBAAiB,EAAE,CAAA;QAChD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,IAAA,uDAA4B,EAAC,OAAO,CAAC,CAAC,CAAA;QACzG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,IAAA,iDAAyB,EAAC,OAAO,CAAC,CAAC,CAAA;QACnG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,IAAA,+CAAwB,EAAC,OAAO,CAAC,CAAC,CAAA;QAEjG,MAAM,GAAG,GAAG,IAAI,SAAS,CAAC,iBAAiB,EAAE,CAAA;QAC7C,GAAG,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAA;QAErD,GAAG,CAAC,KAAK,CAAC,oBAAoB,EAAE,SAAS,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAA;QAClE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,UAAU,EAAE,kBAAkB,EAAE,GAAG,EAAE,CAAC,CAAA;QAElE,OAAO,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC;CACF,CAAA"}
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 { paginate, paginatedResultDecoder, paginationDecoderFromQuery } from '@utils/pagination'
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 data = await this.viewService.${model.view.service.variableName}.getList(this.viewService.users.data.rootUser)
178
- const paginated = paginate(data, query)
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
- ...paginated,
181
- data: paginated.data.map((item) => to${PascalCase}RestApi(item, query.fields)),
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":"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"}
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
- // Don't add UpdateService and ViewService - we'll use type-only imports instead
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
- private updateServiceInstance?: ${context.update.service.name}
91
- private viewServiceInstance?: ${context.view.service.name}
81
+
92
82
 
93
83
  constructor(
94
84
  private readonly data: ${model.repository.name},
95
- private readonly moduleRef: ModuleRef,
96
- ) {
97
- }
85
+
86
+ @Inject(forwardRef(() => ${context.update.service.name}))
87
+ private readonly updateService: ${context.update.service.name},
98
88
 
99
- private get updateService(): ${context.update.service.name} {
100
- // NOSONAR
101
- return this.updateServiceInstance ??= this.moduleRef.get('${context.update.service.name}', { strict: false }) // NOSONAR
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
  /**