prisma-generator-express 1.30.0 → 1.32.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.
@@ -45,7 +45,7 @@ import {
45
45
  ${modelName}Count,
46
46
  ${modelName}GroupBy
47
47
  } from './${modelName}Handlers.js'
48
- import type { RouteConfig } from '../routeConfig.js'
48
+ import type { RouteConfig } from '../routeConfig.target.js'
49
49
  import { parseQueryParams } from '../parseQueryParams.js'
50
50
  import { buildModelOpenApi } from '../buildModelOpenApi.js'
51
51
  import { transformResult } from '../operationRuntime.js'
@@ -44,7 +44,7 @@ import {
44
44
  ${modelName}Count,
45
45
  ${modelName}GroupBy,
46
46
  } from './${modelName}Handlers.js'
47
- import type { RouteConfig, FastifyHookHandler } from '../routeConfig.js'
47
+ import type { RouteConfig, FastifyHookHandler } from '../routeConfig.target.js'
48
48
  import { parseQueryParams } from '../parseQueryParams.js'
49
49
  import { buildModelOpenApi } from '../buildModelOpenApi.js'
50
50
  import { mapError, transformResult } from '../operationRuntime.js'
@@ -11,7 +11,7 @@ function generateUnifiedDocs(models, target = 'express') {
11
11
  const frameworkImport = target === 'fastify'
12
12
  ? `import type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify'`
13
13
  : `import { Request, Response } from 'express'`;
14
- const routeConfigImport = `import type { RouteConfig } from './routeConfig.js'`;
14
+ const routeConfigImport = `import type { RouteConfig } from './routeConfig.target.js'`;
15
15
  const handlerType = target === 'fastify'
16
16
  ? `(config: any) => (request: FastifyRequest, reply: FastifyReply) => Promise<void>`
17
17
  : `(config: any) => (req: Request, res: Response) => any`;
@@ -1 +1 @@
1
- {"version":3,"file":"generateUnifiedDocs.js","sourceRoot":"","sources":["../../src/generators/generateUnifiedDocs.ts"],"names":[],"mappings":";;AAEA,kDAkLC;AAlLD,SAAgB,mBAAmB,CACjC,MAAgB,EAChB,SAAiB,SAAS;IAE1B,MAAM,OAAO,GAAG,MAAM;SACnB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,KAAK,kBAAkB,KAAK,IAAI,KAAK,UAAU,CAAC;SAC3E,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,eAAe,GAAG,MAAM;SAC3B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,KAAK,MAAM,CAAC;SAC1C,IAAI,CAAC,KAAK,CAAC,CAAA;IAEd,MAAM,eAAe,GACnB,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,8EAA8E;QAChF,CAAC,CAAC,6CAA6C,CAAA;IAEnD,MAAM,iBAAiB,GAAG,qDAAqD,CAAA;IAE/E,MAAM,WAAW,GACf,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,kFAAkF;QACpF,CAAC,CAAC,uDAAuD,CAAA;IAE7D,MAAM,kBAAkB,GACtB,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,2BAA2B,EAAE;QAC/B,CAAC,CAAC,2BAA2B,EAAE,CAAA;IAEnC,MAAM,YAAY,GAChB,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,2BAA2B,EAAE;QAC/B,CAAC,CAAC,2BAA2B,EAAE,CAAA;IAEnC,OAAO,GAAG,OAAO;EACjB,eAAe;EACf,iBAAiB;;;;qCAIkB,WAAW;EAC9C,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqIf,kBAAkB;;EAElB,YAAY;CACb,CAAA;AACD,CAAC;AAED,SAAS,2BAA2B;IAClC,OAAO;;;;;;;;;;;EAWP,CAAA;AACF,CAAC;AAED,SAAS,2BAA2B;IAClC,OAAO;;;;;;;;;;;EAWP,CAAA;AACF,CAAC;AAED,SAAS,2BAA2B;IAClC,OAAO;;;;;;;;;;;;;;;;;;;;;EAqBP,CAAA;AACF,CAAC;AAED,SAAS,2BAA2B;IAClC,OAAO;;;;;;;;;;;;;;;;;;;;;EAqBP,CAAA;AACF,CAAC"}
1
+ {"version":3,"file":"generateUnifiedDocs.js","sourceRoot":"","sources":["../../src/generators/generateUnifiedDocs.ts"],"names":[],"mappings":";;AAEA,kDAkLC;AAlLD,SAAgB,mBAAmB,CACjC,MAAgB,EAChB,SAAiB,SAAS;IAE1B,MAAM,OAAO,GAAG,MAAM;SACnB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,YAAY,KAAK,kBAAkB,KAAK,IAAI,KAAK,UAAU,CAAC;SAC3E,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,eAAe,GAAG,MAAM;SAC3B,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,KAAK,KAAK,MAAM,CAAC;SAC1C,IAAI,CAAC,KAAK,CAAC,CAAA;IAEd,MAAM,eAAe,GACnB,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,8EAA8E;QAChF,CAAC,CAAC,6CAA6C,CAAA;IAEnD,MAAM,iBAAiB,GAAG,4DAA4D,CAAA;IAEtF,MAAM,WAAW,GACf,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,kFAAkF;QACpF,CAAC,CAAC,uDAAuD,CAAA;IAE7D,MAAM,kBAAkB,GACtB,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,2BAA2B,EAAE;QAC/B,CAAC,CAAC,2BAA2B,EAAE,CAAA;IAEnC,MAAM,YAAY,GAChB,MAAM,KAAK,SAAS;QAClB,CAAC,CAAC,2BAA2B,EAAE;QAC/B,CAAC,CAAC,2BAA2B,EAAE,CAAA;IAEnC,OAAO,GAAG,OAAO;EACjB,eAAe;EACf,iBAAiB;;;;qCAIkB,WAAW;EAC9C,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAqIf,kBAAkB;;EAElB,YAAY;CACb,CAAA;AACD,CAAC;AAED,SAAS,2BAA2B;IAClC,OAAO;;;;;;;;;;;EAWP,CAAA;AACF,CAAC;AAED,SAAS,2BAA2B;IAClC,OAAO;;;;;;;;;;;EAWP,CAAA;AACF,CAAC;AAED,SAAS,2BAA2B;IAClC,OAAO;;;;;;;;;;;;;;;;;;;;;EAqBP,CAAA;AACF,CAAC;AAED,SAAS,2BAA2B;IAClC,OAAO;;;;;;;;;;;;;;;;;;;;;EAqBP,CAAA;AACF,CAAC"}
@@ -41,47 +41,35 @@ const SHARED_FILES = [
41
41
  'buildModelOpenApi.ts',
42
42
  'operationDefinitions.ts',
43
43
  'misc.ts',
44
+ 'routeConfig.ts',
45
+ 'docsRenderer.ts',
44
46
  ];
45
- const TARGET_FILES = {
46
- express: ['routeConfig.ts'],
47
- fastify: ['routeConfig.ts'],
48
- };
49
47
  function resolveTemplateDir(subpath) {
50
- const fromSibling = path.join(__dirname, '..', subpath);
51
- if (fs.existsSync(fromSibling))
52
- return fromSibling;
53
48
  const fromSrc = path.join(__dirname, '..', '..', 'src', subpath);
54
49
  if (fs.existsSync(fromSrc))
55
50
  return fromSrc;
56
- throw new Error(`[prisma-generator-express] Template directory "${subpath}" not found.\n` +
51
+ const fromDist = path.join(__dirname, '..', subpath);
52
+ if (fs.existsSync(fromDist))
53
+ return fromDist;
54
+ throw new Error(`Template directory "${subpath}" not found.\n` +
57
55
  ` Searched:\n` +
58
- ` ${fromSibling}\n` +
59
56
  ` ${fromSrc}\n` +
57
+ ` ${fromDist}\n` +
58
+ ` __dirname: ${__dirname}\n` +
60
59
  ` Ensure template files are included in the published package.`);
61
60
  }
62
- function getTargetSourceDir(copyBase, target) {
63
- if (target === 'express')
64
- return copyBase;
65
- const targetDir = path.join(copyBase, target);
66
- if (!fs.existsSync(targetDir)) {
67
- throw new Error(`[prisma-generator-express] Target template directory not found: ${targetDir}\n` +
68
- ` Expected directory for target "${target}" at: ${targetDir}`);
69
- }
70
- return targetDir;
71
- }
72
61
  function escapeRegex(str) {
73
62
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
74
63
  }
75
- async function copyFile(srcDir, destDir, filename, options) {
64
+ function copyFileSync(srcDir, destDir, filename, options) {
76
65
  const srcPath = path.join(srcDir, filename);
77
- const destPath = path.join(destDir, filename);
66
+ const destFilename = options?.destFilename || filename;
67
+ const destPath = path.join(destDir, destFilename);
78
68
  if (!fs.existsSync(srcPath)) {
79
69
  if (options?.required) {
80
- console.error(`[prisma-generator-express] ✗ Required source file not found: ${srcPath}`);
81
- return false;
70
+ return `Required file not found: ${srcPath}`;
82
71
  }
83
- console.warn(`[prisma-generator-express] ⚠️ Source file not found: ${srcPath}`);
84
- return true;
72
+ return null;
85
73
  }
86
74
  const destDirPath = path.dirname(destPath);
87
75
  if (!fs.existsSync(destDirPath)) {
@@ -103,45 +91,45 @@ async function copyFile(srcDir, destDir, filename, options) {
103
91
  content = header + content;
104
92
  }
105
93
  fs.writeFileSync(destPath, content);
106
- console.log(` ✓ Copied: ${filename}`);
107
- return true;
94
+ return null;
108
95
  }
109
96
  async function copyFiles(options, target) {
110
97
  const outputPath = options.generator.output?.value;
111
98
  if (!outputPath)
112
99
  return;
113
100
  const copyBase = resolveTemplateDir('copy');
114
- let allCopied = true;
101
+ const errors = [];
115
102
  console.log(` Copying utility files to: ${outputPath} (target: ${target})`);
116
103
  for (const file of SHARED_FILES) {
117
- const ok = await copyFile(copyBase, outputPath, file, { required: true });
118
- if (!ok)
119
- allCopied = false;
120
- }
121
- const targetSrcDir = getTargetSourceDir(copyBase, target);
122
- for (const file of TARGET_FILES[target]) {
123
- const ok = await copyFile(targetSrcDir, outputPath, file, {
124
- required: true,
125
- });
126
- if (!ok)
127
- allCopied = false;
104
+ const err = copyFileSync(copyBase, outputPath, file, { required: true });
105
+ if (err)
106
+ errors.push(err);
128
107
  }
108
+ const targetConfigFile = `routeConfig.${target}.ts`;
109
+ const err = copyFileSync(copyBase, outputPath, targetConfigFile, {
110
+ required: true,
111
+ destFilename: 'routeConfig.target.ts',
112
+ importRewrites: [{ from: './routeConfig', to: './routeConfig' }],
113
+ });
114
+ if (err)
115
+ errors.push(err);
129
116
  const clientDir = path.join(outputPath, 'client');
130
117
  if (!fs.existsSync(clientDir)) {
131
118
  fs.mkdirSync(clientDir, { recursive: true });
132
119
  }
133
120
  const clientSrcDir = resolveTemplateDir('client');
134
- const clientOk = await copyFile(clientSrcDir, clientDir, 'encodeQueryParams.ts', {
121
+ const clientErr = copyFileSync(clientSrcDir, clientDir, 'encodeQueryParams.ts', {
135
122
  required: true,
136
123
  importRewrites: [{ from: '../copy/misc.js', to: '../misc.js' }],
137
124
  });
138
- if (!clientOk)
139
- allCopied = false;
140
- if (allCopied) {
141
- console.log(` Utility files copied successfully`);
142
- }
143
- else {
144
- throw new Error('[prisma-generator-express] One or more required utility files could not be copied. Generation aborted.');
125
+ if (clientErr)
126
+ errors.push(clientErr);
127
+ if (errors.length > 0) {
128
+ throw new Error(`Failed to copy ${errors.length} required file(s):\n` +
129
+ errors.map((e) => ` - ${e}`).join('\n') +
130
+ `\n copyBase: ${copyBase}` +
131
+ `\n __dirname: ${__dirname}`);
145
132
  }
133
+ console.log(` ✓ Utility files copied successfully`);
146
134
  }
147
135
  //# sourceMappingURL=copyFiles.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"copyFiles.js","sourceRoot":"","sources":["../../src/utils/copyFiles.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"copyFiles.js","sourceRoot":"","sources":["../../src/utils/copyFiles.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyFA,8BAoDC;AA5ID,uCAAwB;AACxB,2CAA4B;AAG5B,MAAM,YAAY,GAAG;IACnB,qBAAqB;IACrB,sBAAsB;IACtB,yBAAyB;IACzB,SAAS;IACT,gBAAgB;IAChB,iBAAiB;CAClB,CAAA;AAQD,SAAS,kBAAkB,CAAC,OAAe;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAA;IAChE,IAAI,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAA;IAE1C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAA;IACpD,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAA;IAE5C,MAAM,IAAI,KAAK,CACb,uBAAuB,OAAO,gBAAgB;QAC9C,eAAe;QACf,OAAO,OAAO,IAAI;QAClB,OAAO,QAAQ,IAAI;QACnB,gBAAgB,SAAS,IAAI;QAC7B,gEAAgE,CACjE,CAAA;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC9B,OAAO,GAAG,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAA;AACnD,CAAC;AAED,SAAS,YAAY,CACnB,MAAc,EACd,OAAe,EACf,QAAgB,EAChB,OAAyB;IAEzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAA;IAC3C,MAAM,YAAY,GAAG,OAAO,EAAE,YAAY,IAAI,QAAQ,CAAA;IACtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,CAAC,CAAA;IAEjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,IAAI,OAAO,EAAE,QAAQ,EAAE,CAAC;YACtB,OAAO,4BAA4B,OAAO,EAAE,CAAA;QAC9C,CAAC;QACD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAA;IAC1C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAChC,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAChD,CAAC;IAED,IAAI,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAE/C,IAAI,OAAO,EAAE,cAAc,EAAE,CAAC;QAC5B,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;YAC7C,OAAO,GAAG,OAAO,CAAC,OAAO,CACvB,IAAI,MAAM,CAAC,YAAY,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5D,SAAS,OAAO,CAAC,EAAE,GAAG,CACvB,CAAA;QACH,CAAC;IACH,CAAC;IAED,MAAM,MAAM,GAAG;;;;;CAKhB,CAAA;IAEC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/B,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;IAC5B,CAAC;IAED,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAA;IACnC,OAAO,IAAI,CAAA;AACb,CAAC;AAEM,KAAK,UAAU,SAAS,CAC7B,OAAyB,EACzB,MAAc;IAEd,MAAM,UAAU,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAA;IAClD,IAAI,CAAC,UAAU;QAAE,OAAM;IAEvB,MAAM,QAAQ,GAAG,kBAAkB,CAAC,MAAM,CAAC,CAAA;IAC3C,MAAM,MAAM,GAAa,EAAE,CAAA;IAE3B,OAAO,CAAC,GAAG,CAAC,+BAA+B,UAAU,aAAa,MAAM,GAAG,CAAC,CAAA;IAE5E,KAAK,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;QAChC,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAA;QACxE,IAAI,GAAG;YAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAC3B,CAAC;IAED,MAAM,gBAAgB,GAAG,eAAe,MAAM,KAAK,CAAA;IACnD,MAAM,GAAG,GAAG,YAAY,CAAC,QAAQ,EAAE,UAAU,EAAE,gBAAgB,EAAE;QAC/D,QAAQ,EAAE,IAAI;QACd,YAAY,EAAE,uBAAuB;QACrC,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC;KACjE,CAAC,CAAA;IACF,IAAI,GAAG;QAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAEzB,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAA;IACjD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;QAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAC9C,CAAC;IAED,MAAM,YAAY,GAAG,kBAAkB,CAAC,QAAQ,CAAC,CAAA;IACjD,MAAM,SAAS,GAAG,YAAY,CAC5B,YAAY,EACZ,SAAS,EACT,sBAAsB,EACtB;QACE,QAAQ,EAAE,IAAI;QACd,cAAc,EAAE,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,EAAE,EAAE,YAAY,EAAE,CAAC;KAChE,CACF,CAAA;IACD,IAAI,SAAS;QAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;IAErC,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,KAAK,CACb,kBAAkB,MAAM,CAAC,MAAM,sBAAsB;YACrD,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;YACxC,iBAAiB,QAAQ,EAAE;YAC3B,kBAAkB,SAAS,EAAE,CAC9B,CAAA;IACH,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,uCAAuC,CAAC,CAAA;AACtD,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "prisma-generator-express",
3
3
  "description": "Prisma generator for Hono CRUD API with OpenAPI documentation",
4
- "version": "1.30.0",
4
+ "version": "1.32.0",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "license": "MIT",
@@ -0,0 +1,14 @@
1
+ import { Request, RequestHandler } from 'express'
2
+ import {
3
+ BaseOperationConfig,
4
+ BaseRouteConfig,
5
+ QueryBuilderConfig,
6
+ OpenApiServerConfig,
7
+ OpenApiSecuritySchemeConfig,
8
+ } from './routeConfig'
9
+
10
+ export type { QueryBuilderConfig, OpenApiServerConfig, OpenApiSecuritySchemeConfig }
11
+
12
+ export type OperationConfig = BaseOperationConfig<RequestHandler>
13
+
14
+ export type RouteConfig = BaseRouteConfig<RequestHandler, Request>
@@ -0,0 +1,19 @@
1
+ import type { FastifyRequest, FastifyReply } from 'fastify'
2
+ import {
3
+ BaseOperationConfig,
4
+ BaseRouteConfig,
5
+ QueryBuilderConfig,
6
+ OpenApiServerConfig,
7
+ OpenApiSecuritySchemeConfig,
8
+ } from './routeConfig'
9
+
10
+ export type { QueryBuilderConfig, OpenApiServerConfig, OpenApiSecuritySchemeConfig }
11
+
12
+ export type FastifyHookHandler = (
13
+ request: FastifyRequest,
14
+ reply: FastifyReply,
15
+ ) => Promise<void> | void
16
+
17
+ export type OperationConfig = BaseOperationConfig<FastifyHookHandler>
18
+
19
+ export type RouteConfig = BaseRouteConfig<FastifyHookHandler, FastifyRequest>
@@ -1,16 +1,3 @@
1
- import type { FastifyRequest, FastifyReply } from 'fastify'
2
-
3
- export type FastifyHookHandler = (
4
- request: FastifyRequest,
5
- reply: FastifyReply,
6
- ) => Promise<void> | void
7
-
8
- export interface OperationConfig {
9
- before?: FastifyHookHandler[]
10
- after?: FastifyHookHandler[]
11
- shape?: Record<string, any>
12
- }
13
-
14
1
  export interface QueryBuilderConfig {
15
2
  enabled?: boolean
16
3
  port?: number
@@ -33,7 +20,13 @@ export interface OpenApiSecuritySchemeConfig {
33
20
  description?: string
34
21
  }
35
22
 
36
- export interface RouteConfig {
23
+ export interface BaseOperationConfig<HookHandler> {
24
+ before?: HookHandler[]
25
+ after?: HookHandler[]
26
+ shape?: Record<string, any>
27
+ }
28
+
29
+ export interface BaseRouteConfig<HookHandler, RequestType> {
37
30
  enableAll?: boolean
38
31
  addModelPrefix?: boolean
39
32
  customUrlPrefix?: string
@@ -49,7 +42,7 @@ export interface RouteConfig {
49
42
  openApiSecurity?: Record<string, string[]>[]
50
43
 
51
44
  guard?: {
52
- resolveVariant?: (request: FastifyRequest) => string | undefined
45
+ resolveVariant?: (request: RequestType) => string | undefined
53
46
  variantHeader?: string
54
47
  }
55
48
 
@@ -61,22 +54,26 @@ export interface RouteConfig {
61
54
  distinctCountLimit?: number
62
55
  }
63
56
 
64
- findUnique?: OperationConfig
65
- findUniqueOrThrow?: OperationConfig
66
- findFirst?: OperationConfig
67
- findFirstOrThrow?: OperationConfig
68
- findMany?: OperationConfig
69
- findManyPaginated?: OperationConfig
70
- create?: OperationConfig
71
- createMany?: OperationConfig
72
- createManyAndReturn?: OperationConfig
73
- update?: OperationConfig
74
- updateMany?: OperationConfig
75
- updateManyAndReturn?: OperationConfig
76
- upsert?: OperationConfig
77
- delete?: OperationConfig
78
- deleteMany?: OperationConfig
79
- aggregate?: OperationConfig
80
- count?: OperationConfig
81
- groupBy?: OperationConfig
82
- }
57
+ findUnique?: BaseOperationConfig<HookHandler>
58
+ findUniqueOrThrow?: BaseOperationConfig<HookHandler>
59
+ findFirst?: BaseOperationConfig<HookHandler>
60
+ findFirstOrThrow?: BaseOperationConfig<HookHandler>
61
+ findMany?: BaseOperationConfig<HookHandler>
62
+ findManyPaginated?: BaseOperationConfig<HookHandler>
63
+ create?: BaseOperationConfig<HookHandler>
64
+ createMany?: BaseOperationConfig<HookHandler>
65
+ createManyAndReturn?: BaseOperationConfig<HookHandler>
66
+ update?: BaseOperationConfig<HookHandler>
67
+ updateMany?: BaseOperationConfig<HookHandler>
68
+ updateManyAndReturn?: BaseOperationConfig<HookHandler>
69
+ upsert?: BaseOperationConfig<HookHandler>
70
+ delete?: BaseOperationConfig<HookHandler>
71
+ deleteMany?: BaseOperationConfig<HookHandler>
72
+ aggregate?: BaseOperationConfig<HookHandler>
73
+ count?: BaseOperationConfig<HookHandler>
74
+ groupBy?: BaseOperationConfig<HookHandler>
75
+ }
76
+
77
+ export type OperationConfig = BaseOperationConfig<any>
78
+
79
+ export type RouteConfig = BaseRouteConfig<any, any>
@@ -58,7 +58,7 @@ import {
58
58
  ${modelName}Count,
59
59
  ${modelName}GroupBy
60
60
  } from './${modelName}Handlers.js'
61
- import type { RouteConfig } from '../routeConfig.js'
61
+ import type { RouteConfig } from '../routeConfig.target.js'
62
62
  import { parseQueryParams } from '../parseQueryParams.js'
63
63
  import { buildModelOpenApi } from '../buildModelOpenApi.js'
64
64
  import { transformResult } from '../operationRuntime.js'
@@ -55,7 +55,7 @@ import {
55
55
  ${modelName}Count,
56
56
  ${modelName}GroupBy,
57
57
  } from './${modelName}Handlers.js'
58
- import type { RouteConfig, FastifyHookHandler } from '../routeConfig.js'
58
+ import type { RouteConfig, FastifyHookHandler } from '../routeConfig.target.js'
59
59
  import { parseQueryParams } from '../parseQueryParams.js'
60
60
  import { buildModelOpenApi } from '../buildModelOpenApi.js'
61
61
  import { mapError, transformResult } from '../operationRuntime.js'
@@ -17,7 +17,7 @@ export function generateUnifiedDocs(
17
17
  ? `import type { FastifyInstance, FastifyRequest, FastifyReply } from 'fastify'`
18
18
  : `import { Request, Response } from 'express'`
19
19
 
20
- const routeConfigImport = `import type { RouteConfig } from './routeConfig.js'`
20
+ const routeConfigImport = `import type { RouteConfig } from './routeConfig.target.js'`
21
21
 
22
22
  const handlerType =
23
23
  target === 'fastify'
@@ -8,66 +8,52 @@ const SHARED_FILES = [
8
8
  'buildModelOpenApi.ts',
9
9
  'operationDefinitions.ts',
10
10
  'misc.ts',
11
+ 'routeConfig.ts',
12
+ 'docsRenderer.ts',
11
13
  ]
12
14
 
13
- const TARGET_FILES: Record<Target, string[]> = {
14
- express: ['routeConfig.ts'],
15
- fastify: ['routeConfig.ts'],
15
+ interface CopyFileOptions {
16
+ required?: boolean
17
+ importRewrites?: Array<{ from: string; to: string }>
18
+ destFilename?: string
16
19
  }
17
20
 
18
21
  function resolveTemplateDir(subpath: string): string {
19
- const fromSibling = path.join(__dirname, '..', subpath)
20
- if (fs.existsSync(fromSibling)) return fromSibling
21
-
22
22
  const fromSrc = path.join(__dirname, '..', '..', 'src', subpath)
23
23
  if (fs.existsSync(fromSrc)) return fromSrc
24
24
 
25
+ const fromDist = path.join(__dirname, '..', subpath)
26
+ if (fs.existsSync(fromDist)) return fromDist
27
+
25
28
  throw new Error(
26
- `[prisma-generator-express] Template directory "${subpath}" not found.\n` +
29
+ `Template directory "${subpath}" not found.\n` +
27
30
  ` Searched:\n` +
28
- ` ${fromSibling}\n` +
29
31
  ` ${fromSrc}\n` +
32
+ ` ${fromDist}\n` +
33
+ ` __dirname: ${__dirname}\n` +
30
34
  ` Ensure template files are included in the published package.`,
31
35
  )
32
36
  }
33
37
 
34
- function getTargetSourceDir(copyBase: string, target: Target): string {
35
- if (target === 'express') return copyBase
36
- const targetDir = path.join(copyBase, target)
37
- if (!fs.existsSync(targetDir)) {
38
- throw new Error(
39
- `[prisma-generator-express] Target template directory not found: ${targetDir}\n` +
40
- ` Expected directory for target "${target}" at: ${targetDir}`,
41
- )
42
- }
43
- return targetDir
44
- }
45
-
46
- interface CopyFileOptions {
47
- required?: boolean
48
- importRewrites?: Array<{ from: string; to: string }>
49
- }
50
-
51
38
  function escapeRegex(str: string): string {
52
39
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')
53
40
  }
54
41
 
55
- async function copyFile(
42
+ function copyFileSync(
56
43
  srcDir: string,
57
44
  destDir: string,
58
45
  filename: string,
59
46
  options?: CopyFileOptions,
60
- ): Promise<boolean> {
47
+ ): string | null {
61
48
  const srcPath = path.join(srcDir, filename)
62
- const destPath = path.join(destDir, filename)
49
+ const destFilename = options?.destFilename || filename
50
+ const destPath = path.join(destDir, destFilename)
63
51
 
64
52
  if (!fs.existsSync(srcPath)) {
65
53
  if (options?.required) {
66
- console.error(`[prisma-generator-express] ✗ Required source file not found: ${srcPath}`)
67
- return false
54
+ return `Required file not found: ${srcPath}`
68
55
  }
69
- console.warn(`[prisma-generator-express] ⚠️ Source file not found: ${srcPath}`)
70
- return true
56
+ return null
71
57
  }
72
58
 
73
59
  const destDirPath = path.dirname(destPath)
@@ -98,8 +84,7 @@ async function copyFile(
98
84
  }
99
85
 
100
86
  fs.writeFileSync(destPath, content)
101
- console.log(` ✓ Copied: ${filename}`)
102
- return true
87
+ return null
103
88
  }
104
89
 
105
90
  export async function copyFiles(
@@ -110,23 +95,22 @@ export async function copyFiles(
110
95
  if (!outputPath) return
111
96
 
112
97
  const copyBase = resolveTemplateDir('copy')
113
-
114
- let allCopied = true
98
+ const errors: string[] = []
115
99
 
116
100
  console.log(` Copying utility files to: ${outputPath} (target: ${target})`)
117
101
 
118
102
  for (const file of SHARED_FILES) {
119
- const ok = await copyFile(copyBase, outputPath, file, { required: true })
120
- if (!ok) allCopied = false
103
+ const err = copyFileSync(copyBase, outputPath, file, { required: true })
104
+ if (err) errors.push(err)
121
105
  }
122
106
 
123
- const targetSrcDir = getTargetSourceDir(copyBase, target)
124
- for (const file of TARGET_FILES[target]) {
125
- const ok = await copyFile(targetSrcDir, outputPath, file, {
126
- required: true,
127
- })
128
- if (!ok) allCopied = false
129
- }
107
+ const targetConfigFile = `routeConfig.${target}.ts`
108
+ const err = copyFileSync(copyBase, outputPath, targetConfigFile, {
109
+ required: true,
110
+ destFilename: 'routeConfig.target.ts',
111
+ importRewrites: [{ from: './routeConfig', to: './routeConfig' }],
112
+ })
113
+ if (err) errors.push(err)
130
114
 
131
115
  const clientDir = path.join(outputPath, 'client')
132
116
  if (!fs.existsSync(clientDir)) {
@@ -134,7 +118,7 @@ export async function copyFiles(
134
118
  }
135
119
 
136
120
  const clientSrcDir = resolveTemplateDir('client')
137
- const clientOk = await copyFile(
121
+ const clientErr = copyFileSync(
138
122
  clientSrcDir,
139
123
  clientDir,
140
124
  'encodeQueryParams.ts',
@@ -143,13 +127,16 @@ export async function copyFiles(
143
127
  importRewrites: [{ from: '../copy/misc.js', to: '../misc.js' }],
144
128
  },
145
129
  )
146
- if (!clientOk) allCopied = false
130
+ if (clientErr) errors.push(clientErr)
147
131
 
148
- if (allCopied) {
149
- console.log(` ✓ Utility files copied successfully`)
150
- } else {
132
+ if (errors.length > 0) {
151
133
  throw new Error(
152
- '[prisma-generator-express] One or more required utility files could not be copied. Generation aborted.',
134
+ `Failed to copy ${errors.length} required file(s):\n` +
135
+ errors.map((e) => ` - ${e}`).join('\n') +
136
+ `\n copyBase: ${copyBase}` +
137
+ `\n __dirname: ${__dirname}`,
153
138
  )
154
139
  }
140
+
141
+ console.log(` ✓ Utility files copied successfully`)
155
142
  }