prisma-generator-express 1.12.0 → 1.14.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/README.md +87 -17
- package/dist/generator.js +2 -12
- package/dist/generator.js.map +1 -1
- package/dist/helpers/generateAggregate.js +13 -13
- package/dist/helpers/generateAggregate.js.map +1 -1
- package/dist/helpers/generateCount.js +12 -13
- package/dist/helpers/generateCount.js.map +1 -1
- package/dist/helpers/generateCreate.js +13 -15
- package/dist/helpers/generateCreate.js.map +1 -1
- package/dist/helpers/generateCreateMany.js +13 -15
- package/dist/helpers/generateCreateMany.js.map +1 -1
- package/dist/helpers/generateDelete.js +12 -15
- package/dist/helpers/generateDelete.js.map +1 -1
- package/dist/helpers/generateDeleteMany.js +13 -14
- package/dist/helpers/generateDeleteMany.js.map +1 -1
- package/dist/helpers/generateFindFirst.js +10 -15
- package/dist/helpers/generateFindFirst.js.map +1 -1
- package/dist/helpers/generateFindMany.js +10 -15
- package/dist/helpers/generateFindMany.js.map +1 -1
- package/dist/helpers/generateFindUnique.js +10 -15
- package/dist/helpers/generateFindUnique.js.map +1 -1
- package/dist/helpers/generateGroupBy.js +12 -13
- package/dist/helpers/generateGroupBy.js.map +1 -1
- package/dist/helpers/generateRouteFile.js +68 -35
- package/dist/helpers/generateRouteFile.js.map +1 -1
- package/dist/helpers/generateUpdate.js +12 -15
- package/dist/helpers/generateUpdate.js.map +1 -1
- package/dist/helpers/generateUpdateMany.js +12 -15
- package/dist/helpers/generateUpdateMany.js.map +1 -1
- package/dist/helpers/generateUpsert.js +12 -15
- package/dist/helpers/generateUpsert.js.map +1 -1
- package/dist/utils/copyFiles.js +26 -0
- package/dist/utils/copyFiles.js.map +1 -0
- package/package.json +4 -1
- package/src/copy/createOutputValidatorMiddleware.ts +44 -0
- package/src/copy/createValidatorMiddleware.ts +55 -0
- package/src/copy/encodeQueryParams.spec.ts +303 -0
- package/src/copy/encodeQueryParams.ts +44 -0
- package/src/copy/misc.spec.ts +62 -0
- package/src/copy/misc.ts +25 -0
- package/src/copy/parseQueryParams.spec.ts +187 -0
- package/src/copy/parseQueryParams.ts +42 -0
- package/src/copy/routeConfig.ts +34 -0
- package/src/copy/transformZod.spec.ts +714 -0
- package/src/copy/transformZod.ts +140 -0
- package/src/generator.ts +3 -13
- package/src/helpers/generateAggregate.ts +13 -13
- package/src/helpers/generateCount.ts +12 -13
- package/src/helpers/generateCreate.ts +14 -15
- package/src/helpers/generateCreateMany.ts +13 -15
- package/src/helpers/generateDelete.ts +13 -15
- package/src/helpers/generateDeleteMany.ts +14 -14
- package/src/helpers/generateFindFirst.ts +10 -15
- package/src/helpers/generateFindMany.ts +10 -15
- package/src/helpers/generateFindUnique.ts +10 -15
- package/src/helpers/generateGroupBy.ts +12 -13
- package/src/helpers/generateRouteFile.ts +68 -35
- package/src/helpers/generateUpdate.ts +13 -15
- package/src/helpers/generateUpdateMany.ts +13 -15
- package/src/helpers/generateUpsert.ts +13 -15
- package/src/utils/copyFiles.ts +27 -0
- package/dist/helpers/generateQsParser.js +0 -56
- package/dist/helpers/generateQsParser.js.map +0 -1
- package/dist/helpers/generateRouteConfigType.js +0 -34
- package/dist/helpers/generateRouteConfigType.js.map +0 -1
- package/src/helpers/generateQsParser.ts +0 -51
- package/src/helpers/generateRouteConfigType.ts +0 -29
package/README.md
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# Prisma Generator Express
|
|
2
2
|
|
|
3
|
-
[](https://badge.fury.io/js/prisma-generator-express)
|
|
4
4
|
[](https://www.npmjs.com/package/prisma-generator-express)
|
|
5
|
-
[](https://www.npmjs.com/package/prisma-generator-express)
|
|
6
5
|
[](http://hits.dwyl.com/multipliedtwice/prisma-generator-express)
|
|
6
|
+
[](https://codecov.io/github/multipliedtwice/prisma-generator-express)
|
|
7
7
|
[](LICENSE)
|
|
8
8
|
|
|
9
9
|
This tool helps you quickly create API endpoints in your Express app using your Prisma models.
|
|
@@ -114,9 +114,10 @@ The library will create functions to generate routers per each model in schema.
|
|
|
114
114
|
import express, { json } from 'express'
|
|
115
115
|
import type { Response, Request, NextFunction, RequestHandler } from 'express'
|
|
116
116
|
|
|
117
|
-
import { orderItemRouter } from '../prisma/generated/express/orderItem'
|
|
118
|
-
import RouteConfig from '../prisma/generated/express/RouteConfig'
|
|
119
117
|
import { PrismaClient } from '../prisma/generated/client'
|
|
118
|
+
import { UserAccountRouter } from '../prisma/generated/express/UserAccount'
|
|
119
|
+
import { RouteConfig } from '~prisma/generated/express/routeConfig'
|
|
120
|
+
import { UserAccountFindFirstSchema } from '../prisma/generated/prisma-zod-generator/schemas'
|
|
120
121
|
|
|
121
122
|
const app = express()
|
|
122
123
|
|
|
@@ -132,28 +133,27 @@ const addPrisma: RequestHandler = (
|
|
|
132
133
|
next: NextFunction,
|
|
133
134
|
) => {
|
|
134
135
|
req.prisma = prisma
|
|
135
|
-
req.omitOutputValidation = true
|
|
136
|
+
// req.omitOutputValidation = true (not required if you use `select` instead of `include`)
|
|
136
137
|
next()
|
|
137
138
|
}
|
|
138
139
|
|
|
139
140
|
/**
|
|
140
|
-
*
|
|
141
|
-
* Demonstrates how to add custom properties to the request object to be used in later middleware or route handlers.
|
|
141
|
+
* Run context-related operations or modify `req` properties to control the behavior of the route
|
|
142
142
|
*/
|
|
143
|
-
const
|
|
143
|
+
const beforeFindFirst: RequestHandler = (
|
|
144
144
|
req: Request,
|
|
145
145
|
res: Response,
|
|
146
146
|
next: NextFunction,
|
|
147
147
|
) => {
|
|
148
|
-
|
|
148
|
+
req.passToNext = true
|
|
149
149
|
next()
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
/**
|
|
153
|
-
*
|
|
154
|
-
*
|
|
153
|
+
* if `req.passToNext` is true, then the result of generated middleware
|
|
154
|
+
* will be available in req.locals?.data for modifications
|
|
155
155
|
*/
|
|
156
|
-
const
|
|
156
|
+
const afterFindFirst: RequestHandler = (
|
|
157
157
|
req: Request,
|
|
158
158
|
res: Response,
|
|
159
159
|
next: NextFunction,
|
|
@@ -162,17 +162,39 @@ const afterFindMany: RequestHandler = (
|
|
|
162
162
|
next()
|
|
163
163
|
}
|
|
164
164
|
|
|
165
|
+
/**
|
|
166
|
+
* For generated route the middleware order will be as follows:
|
|
167
|
+
* 1. Query parser
|
|
168
|
+
* 2. Custom middlewares: config.{method}.before[]
|
|
169
|
+
* 3. Input validator middleware (Optional): config.{method}.input
|
|
170
|
+
* 4. Generated middleware
|
|
171
|
+
* 5. Output validator middleware: config.{method}.input
|
|
172
|
+
* 6. Custom middlewares: config.{method}.after[] (not available if req.passToNext is falsy)
|
|
173
|
+
*/
|
|
165
174
|
const someRouterConfig: RouteConfig<RequestHandler> = {
|
|
166
|
-
|
|
167
|
-
before: [
|
|
168
|
-
after: [
|
|
175
|
+
FindFirst: {
|
|
176
|
+
before: [beforeFindFirst],
|
|
177
|
+
after: [afterFindFirst],
|
|
178
|
+
input: {
|
|
179
|
+
schema: UserAccountFindFirstSchema,
|
|
180
|
+
allow: [
|
|
181
|
+
'select.id',
|
|
182
|
+
'select.full_name',
|
|
183
|
+
'select.emailAddress',
|
|
184
|
+
'select.orders[].ProductName',
|
|
185
|
+
'select.orders[].quantity',
|
|
186
|
+
'where.id',
|
|
187
|
+
'where.createdAt',
|
|
188
|
+
],
|
|
189
|
+
},
|
|
169
190
|
},
|
|
170
191
|
addModelPrefix: true,
|
|
171
192
|
enableAll: true,
|
|
172
193
|
customUrlPrefix: '/v1',
|
|
173
194
|
}
|
|
174
195
|
|
|
175
|
-
app.use(addPrisma
|
|
196
|
+
app.use(addPrisma)
|
|
197
|
+
app.use(UserAccountRouter(someRouterConfig))
|
|
176
198
|
|
|
177
199
|
app.listen(3000, () => {
|
|
178
200
|
console.log('Server is running on http://localhost:3000')
|
|
@@ -197,7 +219,7 @@ The following properties can be attached to the `req` object to control the beha
|
|
|
197
219
|
| ------------ | -------- | ------------ |
|
|
198
220
|
| `findUnique` | `GET` | `/:id` |
|
|
199
221
|
| `findFirst` | `GET` | `/first` |
|
|
200
|
-
| `
|
|
222
|
+
| `FindFirst` | `GET` | `/` |
|
|
201
223
|
| `create` | `POST` | `/` |
|
|
202
224
|
| `createMany` | `POST` | `/many` |
|
|
203
225
|
| `update` | `PUT` | `/` |
|
|
@@ -208,3 +230,51 @@ The following properties can be attached to the `req` object to control the beha
|
|
|
208
230
|
| `aggregate` | `GET` | `/aggregate` |
|
|
209
231
|
| `count` | `GET` | `/count` |
|
|
210
232
|
| `groupBy` | `GET` | `/groupby` |
|
|
233
|
+
|
|
234
|
+
## Helper functions
|
|
235
|
+
|
|
236
|
+
### createValidatorMiddleware(validatorOptions: ValidatorOptions)
|
|
237
|
+
|
|
238
|
+
Simple wrapper that internally uses `allow` or `forbid` logic for filtering incoming queries and data payloads
|
|
239
|
+
|
|
240
|
+
```ts
|
|
241
|
+
interface ValidatorOptions {
|
|
242
|
+
schema: ZodSchema<any>
|
|
243
|
+
allowedPaths?: string[] // Fobids all except allowed. For example [`where.user.id`, `select.id`], all other provided inputs will throw an error
|
|
244
|
+
forbiddenPaths?: string[] // Similar, but allows all, except forbidden
|
|
245
|
+
target?: 'body' | 'query'
|
|
246
|
+
}
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### encodeQueryParams(params: Params)
|
|
250
|
+
|
|
251
|
+
Can be used on frontend to encode Prisma compatible queries. Alternatively `qs` can be used, but it probably won't work with `OR: [{ blah: false }, { blah: null }]` or some other edge cases.
|
|
252
|
+
|
|
253
|
+
```ts
|
|
254
|
+
type RecursiveUrlParams = {
|
|
255
|
+
[key: string]: RecursiveUrlParams | string | boolean | unknown
|
|
256
|
+
}
|
|
257
|
+
type Params = Record<string, RecursiveUrlParams | string>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
### parseQueryParams(params: QueryParams)
|
|
261
|
+
|
|
262
|
+
```ts
|
|
263
|
+
type QueryParams = string | ParsedQs | string[] | ParsedQs[] | undefined
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
Recursively converts strings "true", "false", "null", and "number" into correct formats.
|
|
267
|
+
|
|
268
|
+
### allow<T extends z.ZodTypeAny>( schema: T, allowedPaths: string[] ): ZodEffects<T, any, any>
|
|
269
|
+
|
|
270
|
+
Accepts schema and `['array.of.allowed.paths']`. Throws an error if provided something that doesn't fit allowed schema.
|
|
271
|
+
|
|
272
|
+
### forbid<T extends z.ZodTypeAny>( schema: T, forbiddenPaths: string[] ): ZodEffects<T, any, any>
|
|
273
|
+
|
|
274
|
+
Same as `allow` but works in opposite way.
|
|
275
|
+
|
|
276
|
+
---
|
|
277
|
+
|
|
278
|
+
## Rememo.io [Free Kanban & Chat](https://rememo.io)
|
|
279
|
+
|
|
280
|
+
<img src="https://github.com/multipliedtwice/prisma-generator-express/blob/feat/internal-validation/rememo-192.png?raw=true" alt="Free Kanban & Corporate Chat">
|
package/dist/generator.js
CHANGED
|
@@ -19,8 +19,7 @@ const generateDeleteMany_1 = require("./helpers/generateDeleteMany");
|
|
|
19
19
|
const generateAggregate_1 = require("./helpers/generateAggregate");
|
|
20
20
|
const generateCount_1 = require("./helpers/generateCount");
|
|
21
21
|
const generateGroupBy_1 = require("./helpers/generateGroupBy");
|
|
22
|
-
const
|
|
23
|
-
const generateQsParser_1 = require("./helpers/generateQsParser");
|
|
22
|
+
const copyFiles_1 = require("./utils/copyFiles");
|
|
24
23
|
const { version } = require('../package.json');
|
|
25
24
|
(0, generator_helper_1.generatorHandler)({
|
|
26
25
|
onManifest() {
|
|
@@ -158,16 +157,7 @@ const { version } = require('../package.json');
|
|
|
158
157
|
operation: 'index',
|
|
159
158
|
});
|
|
160
159
|
}
|
|
161
|
-
await (0,
|
|
162
|
-
content: (0, generateRouteConfigType_1.generateRouteConfigType)(),
|
|
163
|
-
options,
|
|
164
|
-
operation: 'RouteConfig',
|
|
165
|
-
});
|
|
166
|
-
await (0, writeFileSafely_1.writeFileSafely)({
|
|
167
|
-
content: (0, generateQsParser_1.generateParseQueryParams)(),
|
|
168
|
-
options,
|
|
169
|
-
operation: 'ParseQueryParams',
|
|
170
|
-
});
|
|
160
|
+
await (0, copyFiles_1.copyFiles)(options);
|
|
171
161
|
},
|
|
172
162
|
});
|
|
173
163
|
//# sourceMappingURL=generator.js.map
|
package/dist/generator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":";;AAAA,+DAA6E;AAC7E,qCAAoC;AACpC,2CAA4C;AAC5C,6DAAyD;AACzD,qEAAyE;AACzE,2FAAuF;AACvF,iEAAqE;AACrE,mEAAuE;AACvE,6DAAiE;AACjE,mEAAoE;AACpE,qEAAyE;AACzE,6DAAiE;AACjE,qEAAyE;AACzE,6DAAiE;AACjE,6DAAiE;AACjE,qEAAyE;AACzE,mEAAuE;AACvE,2DAA+D;AAC/D,+DAAmE;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,42 +13,42 @@ import { Request, Response, NextFunction } from 'express';
|
|
|
13
13
|
import { RequestHandler, ParamsDictionary } from 'express-serve-static-core'
|
|
14
14
|
import { ParsedQs } from 'qs'
|
|
15
15
|
import { ZodTypeAny } from 'zod';
|
|
16
|
+
import { ValidatorConfig } from '../routeConfig'
|
|
16
17
|
|
|
17
18
|
interface AggregateRequest extends Request {
|
|
18
19
|
prisma: PrismaClient;
|
|
19
20
|
query: Partial<${argsTypeName}> & ParsedQs;
|
|
20
21
|
outputValidation?: ZodTypeAny;
|
|
21
22
|
omitOutputValidation?: boolean;
|
|
23
|
+
locals?: {
|
|
24
|
+
outputValidator?: ValidatorConfig;
|
|
25
|
+
};
|
|
22
26
|
}
|
|
23
27
|
|
|
24
28
|
export type AggregateMiddleware = RequestHandler<ParamsDictionary, any, Partial<${argsTypeName}>, Record<string, any>>;
|
|
25
29
|
|
|
26
30
|
export async function ${functionName}(req: AggregateRequest, res: Response, next: NextFunction) {
|
|
27
31
|
try {
|
|
28
|
-
|
|
32
|
+
const outputValidator = res.locals.outputValidator?.schema || req.outputValidation;
|
|
33
|
+
|
|
34
|
+
if (!outputValidator && !req.omitOutputValidation) {
|
|
29
35
|
throw new Error('Output validation schema or omission flag must be provided.');
|
|
30
36
|
}
|
|
31
37
|
|
|
32
38
|
const result = await req.prisma.${(0, strings_1.lowercaseFirstLetter)(modelName)}.aggregate(req.query as ${argsTypeName});
|
|
33
39
|
|
|
34
|
-
if (!req.omitOutputValidation &&
|
|
35
|
-
const validationResult =
|
|
40
|
+
if (!req.omitOutputValidation && outputValidator) {
|
|
41
|
+
const validationResult = outputValidator.safeParse(result);
|
|
36
42
|
if (validationResult.success) {
|
|
37
|
-
res.status(200).json(validationResult.data);
|
|
43
|
+
return res.status(200).json(validationResult.data);
|
|
38
44
|
} else {
|
|
39
|
-
res.status(400).json({ error: 'Invalid data format', details: validationResult.error });
|
|
45
|
+
return res.status(400).json({ error: 'Invalid data format', details: validationResult.error });
|
|
40
46
|
}
|
|
41
47
|
} else {
|
|
42
|
-
res.status(200).json(result);
|
|
48
|
+
return res.status(200).json(result);
|
|
43
49
|
}
|
|
44
50
|
} catch (error: unknown) {
|
|
45
|
-
|
|
46
|
-
if (error instanceof Error) {
|
|
47
|
-
res.status(500).json({ error: error.message });
|
|
48
|
-
} else {
|
|
49
|
-
res.status(500).json({ error: "Unknown error occurred" });
|
|
50
|
-
}
|
|
51
|
-
next(error);
|
|
51
|
+
return next(error);
|
|
52
52
|
}
|
|
53
53
|
}`;
|
|
54
54
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateAggregate.js","sourceRoot":"","sources":["../../src/helpers/generateAggregate.ts"],"names":[],"mappings":";;;AACA,8CAAmE;AAS5D,MAAM,yBAAyB,GAAG,CAAC,OAGzC,EAAU,EAAE;IACX,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,YAAY,GAAG,GAAG,SAAS,WAAW,CAAA;IAC5C,MAAM,YAAY,GAAG,UAAU,IAAA,oBAAU,EAAC,SAAS,CAAC,eAAe,CAAA;IAEnE,OAAO;EACP,qBAAqB
|
|
1
|
+
{"version":3,"file":"generateAggregate.js","sourceRoot":"","sources":["../../src/helpers/generateAggregate.ts"],"names":[],"mappings":";;;AACA,8CAAmE;AAS5D,MAAM,yBAAyB,GAAG,CAAC,OAGzC,EAAU,EAAE;IACX,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,YAAY,GAAG,GAAG,SAAS,WAAW,CAAA;IAC5C,MAAM,YAAY,GAAG,UAAU,IAAA,oBAAU,EAAC,SAAS,CAAC,eAAe,CAAA;IAEnE,OAAO;EACP,qBAAqB;;;;;;;;;mBASJ,YAAY;;;;;;;;kFAQmD,YAAY;;wBAEtE,YAAY;;;;;;;;sCAQE,IAAA,8BAAoB,EAAC,SAAS,CAAC,2BAA2B,YAAY;;;;;;;;;;;;;;;EAe1G,CAAA;AACF,CAAC,CAAA;AArDY,QAAA,yBAAyB,6BAqDrC"}
|
|
@@ -19,36 +19,35 @@ interface CountRequest extends Request {
|
|
|
19
19
|
query: Partial<${argsTypeName}> & ParsedQs;
|
|
20
20
|
outputValidation?: ZodTypeAny;
|
|
21
21
|
omitOutputValidation?: boolean;
|
|
22
|
+
locals?: {
|
|
23
|
+
outputValidator?: ZodTypeAny;
|
|
24
|
+
};
|
|
22
25
|
}
|
|
23
26
|
|
|
24
27
|
export type CountMiddleware = RequestHandler<ParamsDictionary, any, {}, ParsedQs>;
|
|
25
28
|
|
|
26
29
|
export async function ${functionName}(req: CountRequest, res: Response, next: NextFunction) {
|
|
27
30
|
try {
|
|
28
|
-
|
|
31
|
+
const outputValidator = req.locals?.outputValidator || req.outputValidation;
|
|
32
|
+
|
|
33
|
+
if (!outputValidator && !req.omitOutputValidation) {
|
|
29
34
|
throw new Error('Output validation schema or omission flag must be provided.');
|
|
30
35
|
}
|
|
31
36
|
|
|
32
37
|
const result = await req.prisma.${(0, strings_1.lowercaseFirstLetter)(modelName)}.count(req.query as ${argsTypeName});
|
|
33
38
|
|
|
34
|
-
if (!req.omitOutputValidation &&
|
|
35
|
-
const validationResult =
|
|
39
|
+
if (!req.omitOutputValidation && outputValidator) {
|
|
40
|
+
const validationResult = outputValidator.safeParse(result);
|
|
36
41
|
if (validationResult.success) {
|
|
37
|
-
res.status(200).json(validationResult.data);
|
|
42
|
+
return res.status(200).json(validationResult.data);
|
|
38
43
|
} else {
|
|
39
|
-
res.status(400).json({ error: 'Invalid data format', details: validationResult.error });
|
|
44
|
+
return res.status(400).json({ error: 'Invalid data format', details: validationResult.error });
|
|
40
45
|
}
|
|
41
46
|
} else {
|
|
42
|
-
res.status(200).json(result);
|
|
47
|
+
return res.status(200).json(result);
|
|
43
48
|
}
|
|
44
49
|
} catch (error: unknown) {
|
|
45
|
-
|
|
46
|
-
if (error instanceof Error) {
|
|
47
|
-
res.status(500).json({ error: error.message });
|
|
48
|
-
} else {
|
|
49
|
-
res.status(500).json({ error: "Unknown error occurred" });
|
|
50
|
-
}
|
|
51
|
-
next(error);
|
|
50
|
+
return next(error);
|
|
52
51
|
}
|
|
53
52
|
}`;
|
|
54
53
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateCount.js","sourceRoot":"","sources":["../../src/helpers/generateCount.ts"],"names":[],"mappings":";;;AACA,8CAAuD;AAShD,MAAM,qBAAqB,GAAG,CAAC,OAGrC,EAAU,EAAE;IACX,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,YAAY,GAAG,GAAG,SAAS,OAAO,CAAA;IACxC,MAAM,YAAY,GAAG,UAAU,SAAS,WAAW,CAAA;IAEnD,OAAO;EACP,qBAAqB;;;;;;;;mBAQJ,YAAY
|
|
1
|
+
{"version":3,"file":"generateCount.js","sourceRoot":"","sources":["../../src/helpers/generateCount.ts"],"names":[],"mappings":";;;AACA,8CAAuD;AAShD,MAAM,qBAAqB,GAAG,CAAC,OAGrC,EAAU,EAAE;IACX,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,YAAY,GAAG,GAAG,SAAS,OAAO,CAAA;IACxC,MAAM,YAAY,GAAG,UAAU,SAAS,WAAW,CAAA;IAEnD,OAAO;EACP,qBAAqB;;;;;;;;mBAQJ,YAAY;;;;;;;;;;wBAUP,YAAY;;;;;;;;sCAQE,IAAA,8BAAoB,EAAC,SAAS,CAAC,uBAAuB,YAAY;;;;;;;;;;;;;;;EAetG,CAAA;AACF,CAAC,CAAA;AApDY,QAAA,qBAAqB,yBAoDjC"}
|
|
@@ -18,37 +18,35 @@ interface CreateRequest extends Request {
|
|
|
18
18
|
body: ${argsTypeName};
|
|
19
19
|
outputValidation?: ZodTypeAny;
|
|
20
20
|
omitOutputValidation?: boolean;
|
|
21
|
+
locals?: {
|
|
22
|
+
outputValidator?: ZodTypeAny;
|
|
23
|
+
};
|
|
21
24
|
}
|
|
22
25
|
|
|
23
26
|
export type CreateMiddleware = RequestHandler<ParamsDictionary, any, ${argsTypeName}, Record<string, any>>
|
|
24
27
|
|
|
25
28
|
export async function ${functionName}(req: CreateRequest, res: Response, next: NextFunction) {
|
|
26
29
|
try {
|
|
27
|
-
|
|
30
|
+
const outputValidator = req.locals?.outputValidator || req.outputValidation;
|
|
31
|
+
|
|
32
|
+
if (!outputValidator && !req.omitOutputValidation) {
|
|
28
33
|
throw new Error('Output validation schema or omission flag must be provided.');
|
|
29
34
|
}
|
|
30
35
|
|
|
31
36
|
const data = await req.prisma.${(0, strings_1.lowercaseFirstLetter)(modelName)}.create(req.body);
|
|
32
|
-
|
|
33
|
-
|
|
37
|
+
|
|
38
|
+
if (!req.omitOutputValidation && outputValidator) {
|
|
39
|
+
const validationResult = outputValidator.safeParse(data);
|
|
34
40
|
if (validationResult.success) {
|
|
35
|
-
res.status(201).json(validationResult.data);
|
|
41
|
+
return res.status(201).json(validationResult.data);
|
|
36
42
|
} else {
|
|
37
|
-
res.status(400).json({ error: 'Invalid data format', details: validationResult.error });
|
|
43
|
+
return res.status(400).json({ error: 'Invalid data format', details: validationResult.error });
|
|
38
44
|
}
|
|
39
|
-
} else if (!req.omitOutputValidation) {
|
|
40
|
-
throw new Error('Output validation schema must be provided unless explicitly omitted.');
|
|
41
45
|
} else {
|
|
42
|
-
res.status(201).json(data);
|
|
46
|
+
return res.status(201).json(data);
|
|
43
47
|
}
|
|
44
48
|
} catch (error: unknown) {
|
|
45
|
-
|
|
46
|
-
if (error instanceof Error) {
|
|
47
|
-
res.status(500).json({ error: error.message });
|
|
48
|
-
} else {
|
|
49
|
-
res.status(500).json({ error: "Unknown error occurred" });
|
|
50
|
-
}
|
|
51
|
-
next(error);
|
|
49
|
+
return next(error);
|
|
52
50
|
}
|
|
53
51
|
}`;
|
|
54
52
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateCreate.js","sourceRoot":"","sources":["../../src/helpers/generateCreate.ts"],"names":[],"mappings":";;;AACA,8CAAuD;
|
|
1
|
+
{"version":3,"file":"generateCreate.js","sourceRoot":"","sources":["../../src/helpers/generateCreate.ts"],"names":[],"mappings":";;;AACA,8CAAuD;AAQhD,MAAM,sBAAsB,GAAG,CAAC,OAGtC,EAAU,EAAE;IACX,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,YAAY,GAAG,GAAG,SAAS,QAAQ,CAAA;IACzC,MAAM,YAAY,GAAG,UAAU,SAAS,YAAY,CAAA;IAEpD,OAAO;EACP,qBAAqB;;;;;;;UAOb,YAAY;;;;;;;;uEAQiD,YAAY;;wBAE3D,YAAY;;;;;;;;oCAQA,IAAA,8BAAoB,EAAC,SAAS,CAAC;;;;;;;;;;;;;;;EAejE,CAAA;AACF,CAAC,CAAA;AAnDY,QAAA,sBAAsB,0BAmDlC"}
|
|
@@ -18,37 +18,35 @@ interface CreateManyRequest extends Request {
|
|
|
18
18
|
body: ${argsTypeName};
|
|
19
19
|
outputValidation?: ZodTypeAny;
|
|
20
20
|
omitOutputValidation?: boolean;
|
|
21
|
+
locals?: {
|
|
22
|
+
outputValidator?: ZodTypeAny;
|
|
23
|
+
};
|
|
21
24
|
}
|
|
22
25
|
|
|
23
26
|
export type CreateManyMiddleware = RequestHandler<ParamsDictionary, any, ${argsTypeName}, Record<string, any>>
|
|
24
27
|
|
|
25
28
|
export async function ${functionName}(req: CreateManyRequest, res: Response, next: NextFunction) {
|
|
26
29
|
try {
|
|
27
|
-
|
|
30
|
+
const outputValidator = req.locals?.outputValidator || req.outputValidation;
|
|
31
|
+
|
|
32
|
+
if (!outputValidator && !req.omitOutputValidation) {
|
|
28
33
|
throw new Error('Output validation schema or omission flag must be provided.');
|
|
29
34
|
}
|
|
30
35
|
|
|
31
36
|
const data = await req.prisma.${(0, strings_1.lowercaseFirstLetter)(modelName)}.createMany(req.body);
|
|
32
|
-
|
|
33
|
-
|
|
37
|
+
|
|
38
|
+
if (!req.omitOutputValidation && outputValidator) {
|
|
39
|
+
const validationResult = outputValidator.safeParse(data);
|
|
34
40
|
if (validationResult.success) {
|
|
35
|
-
res.status(201).json(validationResult.data);
|
|
41
|
+
return res.status(201).json(validationResult.data);
|
|
36
42
|
} else {
|
|
37
|
-
res.status(400).json({ error: 'Invalid data format', details: validationResult.error });
|
|
43
|
+
return res.status(400).json({ error: 'Invalid data format', details: validationResult.error });
|
|
38
44
|
}
|
|
39
|
-
} else if (!req.omitOutputValidation) {
|
|
40
|
-
throw new Error('Output validation schema must be provided unless explicitly omitted.');
|
|
41
45
|
} else {
|
|
42
|
-
res.status(201).json(data);
|
|
46
|
+
return res.status(201).json(data);
|
|
43
47
|
}
|
|
44
48
|
} catch (error: unknown) {
|
|
45
|
-
|
|
46
|
-
if (error instanceof Error) {
|
|
47
|
-
res.status(500).json({ error: error.message });
|
|
48
|
-
} else {
|
|
49
|
-
res.status(500).json({ error: "Unknown error occurred" });
|
|
50
|
-
}
|
|
51
|
-
next(error);
|
|
49
|
+
return next(error);
|
|
52
50
|
}
|
|
53
51
|
}`;
|
|
54
52
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateCreateMany.js","sourceRoot":"","sources":["../../src/helpers/generateCreateMany.ts"],"names":[],"mappings":";;;AACA,8CAAuD;AAOhD,MAAM,0BAA0B,GAAG,CAAC,OAG1C,EAAU,EAAE;IACX,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,YAAY,GAAG,GAAG,SAAS,YAAY,CAAA;IAC7C,MAAM,YAAY,GAAG,UAAU,SAAS,gBAAgB,CAAA;IAExD,OAAO;EACP,qBAAqB;;;;;;;UAOb,YAAY
|
|
1
|
+
{"version":3,"file":"generateCreateMany.js","sourceRoot":"","sources":["../../src/helpers/generateCreateMany.ts"],"names":[],"mappings":";;;AACA,8CAAuD;AAOhD,MAAM,0BAA0B,GAAG,CAAC,OAG1C,EAAU,EAAE;IACX,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,YAAY,GAAG,GAAG,SAAS,YAAY,CAAA;IAC7C,MAAM,YAAY,GAAG,UAAU,SAAS,gBAAgB,CAAA;IAExD,OAAO;EACP,qBAAqB;;;;;;;UAOb,YAAY;;;;;;;;2EAQqD,YAAY;;wBAE/D,YAAY;;;;;;;;oCAQA,IAAA,8BAAoB,EAAC,SAAS,CAAC;;;;;;;;;;;;;;;EAejE,CAAA;AACF,CAAC,CAAA;AAnDY,QAAA,0BAA0B,8BAmDtC"}
|
|
@@ -18,38 +18,35 @@ interface DeleteRequest extends Request {
|
|
|
18
18
|
body: ${argsTypeName};
|
|
19
19
|
outputValidation?: ZodTypeAny;
|
|
20
20
|
omitOutputValidation?: boolean;
|
|
21
|
+
locals?: {
|
|
22
|
+
outputValidator?: ZodTypeAny;
|
|
23
|
+
};
|
|
21
24
|
}
|
|
22
25
|
|
|
23
26
|
export type DeleteMiddleware = RequestHandler<ParamsDictionary, any, ${argsTypeName}, Record<string, any>>
|
|
24
27
|
|
|
25
28
|
export async function ${functionName}(req: DeleteRequest, res: Response, next: NextFunction) {
|
|
26
29
|
try {
|
|
27
|
-
|
|
30
|
+
const outputValidator = req.locals?.outputValidator || req.outputValidation;
|
|
31
|
+
|
|
32
|
+
if (!outputValidator && !req.omitOutputValidation) {
|
|
28
33
|
throw new Error('Output validation schema or omission flag must be provided.');
|
|
29
34
|
}
|
|
30
35
|
|
|
31
36
|
const data = await req.prisma.${(0, strings_1.lowercaseFirstLetter)(modelName)}.delete(req.body);
|
|
32
37
|
|
|
33
|
-
if (!req.omitOutputValidation &&
|
|
34
|
-
const validationResult =
|
|
38
|
+
if (!req.omitOutputValidation && outputValidator) {
|
|
39
|
+
const validationResult = outputValidator.safeParse(data);
|
|
35
40
|
if (validationResult.success) {
|
|
36
|
-
res.status(200).json(validationResult.data);
|
|
41
|
+
return res.status(200).json(validationResult.data);
|
|
37
42
|
} else {
|
|
38
|
-
res.status(400).json({ error: 'Invalid data format', details: validationResult.error });
|
|
43
|
+
return res.status(400).json({ error: 'Invalid data format', details: validationResult.error });
|
|
39
44
|
}
|
|
40
|
-
} else if (!req.omitOutputValidation) {
|
|
41
|
-
throw new Error('Output validation schema must be provided unless explicitly omitted.');
|
|
42
45
|
} else {
|
|
43
|
-
res.status(200).json(data);
|
|
46
|
+
return res.status(200).json(data);
|
|
44
47
|
}
|
|
45
48
|
} catch (error: unknown) {
|
|
46
|
-
|
|
47
|
-
if (error instanceof Error) {
|
|
48
|
-
res.status(500).json({ error: error.message });
|
|
49
|
-
} else {
|
|
50
|
-
res.status(500).json({ error: "Unknown error occurred" });
|
|
51
|
-
}
|
|
52
|
-
next(error);
|
|
49
|
+
return next(error);
|
|
53
50
|
}
|
|
54
51
|
}`;
|
|
55
52
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateDelete.js","sourceRoot":"","sources":["../../src/helpers/generateDelete.ts"],"names":[],"mappings":";;;AACA,8CAAuD;
|
|
1
|
+
{"version":3,"file":"generateDelete.js","sourceRoot":"","sources":["../../src/helpers/generateDelete.ts"],"names":[],"mappings":";;;AACA,8CAAuD;AAShD,MAAM,sBAAsB,GAAG,CAAC,OAGtC,EAAU,EAAE;IACX,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,YAAY,GAAG,GAAG,SAAS,QAAQ,CAAA;IACzC,MAAM,YAAY,GAAG,UAAU,SAAS,YAAY,CAAA;IAEpD,OAAO;EACP,qBAAqB;;;;;;;UAOb,YAAY;;;;;;;;uEAQiD,YAAY;;wBAE3D,YAAY;;;;;;;;oCAQA,IAAA,8BAAoB,EAAC,SAAS,CAAC;;;;;;;;;;;;;;;EAejE,CAAA;AACF,CAAC,CAAA;AAnDY,QAAA,sBAAsB,0BAmDlC"}
|
|
@@ -18,36 +18,35 @@ interface DeleteManyRequest extends Request {
|
|
|
18
18
|
body: ${argsTypeName};
|
|
19
19
|
outputValidation?: ZodTypeAny;
|
|
20
20
|
omitOutputValidation?: boolean;
|
|
21
|
+
locals?: {
|
|
22
|
+
outputValidator?: ZodTypeAny;
|
|
23
|
+
};
|
|
21
24
|
}
|
|
22
25
|
|
|
23
|
-
export type DeleteManyMiddleware = RequestHandler<ParamsDictionary, any,
|
|
26
|
+
export type DeleteManyMiddleware = RequestHandler<ParamsDictionary, any, ${argsTypeName}, Record<string, any>>;
|
|
24
27
|
|
|
25
28
|
export async function ${functionName}(req: DeleteManyRequest, res: Response, next: NextFunction) {
|
|
26
29
|
try {
|
|
27
|
-
|
|
30
|
+
const outputValidator = req.locals?.outputValidator || req.outputValidation;
|
|
31
|
+
|
|
32
|
+
if (!outputValidator && !req.omitOutputValidation) {
|
|
28
33
|
throw new Error('Output validation schema or omission flag must be provided.');
|
|
29
34
|
}
|
|
30
35
|
|
|
31
36
|
const result = await req.prisma.${(0, strings_1.lowercaseFirstLetter)(modelName)}.deleteMany(req.body);
|
|
32
37
|
|
|
33
|
-
if (!req.omitOutputValidation &&
|
|
34
|
-
const validationResult =
|
|
38
|
+
if (!req.omitOutputValidation && outputValidator) {
|
|
39
|
+
const validationResult = outputValidator.safeParse(result);
|
|
35
40
|
if (validationResult.success) {
|
|
36
|
-
res.status(200).json(validationResult.data);
|
|
41
|
+
return res.status(200).json(validationResult.data);
|
|
37
42
|
} else {
|
|
38
|
-
res.status(400).json({ error: 'Invalid data format', details: validationResult.error });
|
|
43
|
+
return res.status(400).json({ error: 'Invalid data format', details: validationResult.error });
|
|
39
44
|
}
|
|
40
45
|
} else {
|
|
41
|
-
res.status(200).json(result);
|
|
46
|
+
return res.status(200).json(result);
|
|
42
47
|
}
|
|
43
48
|
} catch (error: unknown) {
|
|
44
|
-
|
|
45
|
-
if (error instanceof Error) {
|
|
46
|
-
res.status(500).json({ error: error.message });
|
|
47
|
-
} else {
|
|
48
|
-
res.status(500).json({ error: "Unknown error occurred" });
|
|
49
|
-
}
|
|
50
|
-
next(error);
|
|
49
|
+
return next(error);
|
|
51
50
|
}
|
|
52
51
|
}`;
|
|
53
52
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateDeleteMany.js","sourceRoot":"","sources":["../../src/helpers/generateDeleteMany.ts"],"names":[],"mappings":";;;AACA,8CAAuD;
|
|
1
|
+
{"version":3,"file":"generateDeleteMany.js","sourceRoot":"","sources":["../../src/helpers/generateDeleteMany.ts"],"names":[],"mappings":";;;AACA,8CAAuD;AAShD,MAAM,0BAA0B,GAAG,CAAC,OAG1C,EAAU,EAAE;IACX,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,YAAY,GAAG,GAAG,SAAS,YAAY,CAAA;IAC7C,MAAM,YAAY,GAAG,UAAU,SAAS,gBAAgB,CAAA;IAExD,OAAO;EACP,qBAAqB;;;;;;;UAOb,YAAY;;;;;;;;2EAQqD,YAAY;;wBAE/D,YAAY;;;;;;;;sCAQE,IAAA,8BAAoB,EAAC,SAAS,CAAC;;;;;;;;;;;;;;;EAenE,CAAA;AACF,CAAC,CAAA;AAnDY,QAAA,0BAA0B,8BAmDtC"}
|
|
@@ -25,13 +25,16 @@ export interface FindFirstRequest extends Request {
|
|
|
25
25
|
passToNext?: boolean;
|
|
26
26
|
locals?: {
|
|
27
27
|
data?: ${modelName} | null
|
|
28
|
+
outputValidator?: ZodTypeAny;
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
export type FindFirstMiddleware = RequestHandler<ParamsDictionary, any, any, ${queryTypeName} & ParsedQs, Record<string, any>>
|
|
31
32
|
|
|
32
33
|
export async function ${functionName}(req: FindFirstRequest, res: Response, next: NextFunction) {
|
|
33
34
|
try {
|
|
34
|
-
|
|
35
|
+
const outputValidator = req.locals?.outputValidator || req.outputValidation;
|
|
36
|
+
|
|
37
|
+
if (!outputValidator && !req.omitOutputValidation) {
|
|
35
38
|
throw new Error('Output validation schema or omission flag must be provided.');
|
|
36
39
|
}
|
|
37
40
|
|
|
@@ -39,26 +42,18 @@ export async function ${functionName}(req: FindFirstRequest, res: Response, next
|
|
|
39
42
|
if (req.passToNext) {
|
|
40
43
|
if (req.locals) req.locals.data = data;
|
|
41
44
|
next();
|
|
42
|
-
} else if (!req.omitOutputValidation &&
|
|
43
|
-
const validationResult =
|
|
45
|
+
} else if (!req.omitOutputValidation && outputValidator) {
|
|
46
|
+
const validationResult = outputValidator.safeParse(data);
|
|
44
47
|
if (validationResult.success) {
|
|
45
|
-
res.status(200).json(validationResult.data);
|
|
48
|
+
return res.status(200).json(validationResult.data);
|
|
46
49
|
} else {
|
|
47
|
-
res.status(400).json({ error: 'Invalid data format', details: validationResult.error });
|
|
50
|
+
return res.status(400).json({ error: 'Invalid data format', details: validationResult.error });
|
|
48
51
|
}
|
|
49
|
-
} else if (!req.omitOutputValidation) {
|
|
50
|
-
throw new Error('Output validation schema must be provided unless explicitly omitted. Attach omitOutputValidation = true to request to suppress this error.');
|
|
51
52
|
} else {
|
|
52
|
-
res.status(200).json(data);
|
|
53
|
+
return res.status(200).json(data);
|
|
53
54
|
}
|
|
54
55
|
} catch (error: unknown) {
|
|
55
|
-
|
|
56
|
-
if (error instanceof Error) {
|
|
57
|
-
res.status(500).json({ error: error.message });
|
|
58
|
-
} else {
|
|
59
|
-
res.status(500).json({ error: "Unknown error occurred" });
|
|
60
|
-
}
|
|
61
|
-
next(error);
|
|
56
|
+
return next(error);
|
|
62
57
|
}
|
|
63
58
|
}`;
|
|
64
59
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateFindFirst.js","sourceRoot":"","sources":["../../src/helpers/generateFindFirst.ts"],"names":[],"mappings":";;;AACA,8CAAuD;AAOhD,MAAM,yBAAyB,GAAG,CAAC,OAGzC,EAAU,EAAE;IACX,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,YAAY,GAAG,GAAG,SAAS,WAAW,CAAA;IAC5C,MAAM,aAAa,GAAG,UAAU,SAAS,eAAe,CAAA;IAExD,OAAO;EACP,qBAAqB,CAAC,OAAO,CAAC,YAAY,EAAE,aAAa,SAAS,IAAI,CAAC;;;;;;;;;;;WAW9D,aAAa;;;;;aAKX,SAAS
|
|
1
|
+
{"version":3,"file":"generateFindFirst.js","sourceRoot":"","sources":["../../src/helpers/generateFindFirst.ts"],"names":[],"mappings":";;;AACA,8CAAuD;AAOhD,MAAM,yBAAyB,GAAG,CAAC,OAGzC,EAAU,EAAE;IACX,MAAM,EAAE,KAAK,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAA;IAChD,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAA;IAC5B,MAAM,YAAY,GAAG,GAAG,SAAS,WAAW,CAAA;IAC5C,MAAM,aAAa,GAAG,UAAU,SAAS,eAAe,CAAA;IAExD,OAAO;EACP,qBAAqB,CAAC,OAAO,CAAC,YAAY,EAAE,aAAa,SAAS,IAAI,CAAC;;;;;;;;;;;WAW9D,aAAa;;;;;aAKX,SAAS;;;;+EAIyD,aAAa;;wBAEpE,YAAY;;;;;;;;oCAQA,IAAA,8BAAoB,EAAC,SAAS,CAAC,2BAA2B,aAAa;;;;;;;;;;;;;;;;;EAiBzG,CAAA;AACF,CAAC,CAAA;AA1DY,QAAA,yBAAyB,6BA0DrC"}
|