prisma-generator-express 1.46.0 → 1.48.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/generators/generateOperationCore.js +36 -0
- package/dist/generators/generateOperationCore.js.map +1 -1
- package/dist/generators/generateRouter.js +21 -0
- package/dist/generators/generateRouter.js.map +1 -1
- package/package.json +1 -1
- package/src/copy/routeConfig.ts +1 -0
- package/src/generators/generateOperationCore.ts +36 -0
- package/src/generators/generateRouter.ts +21 -0
|
@@ -51,6 +51,8 @@ ${validationLines}
|
|
|
51
51
|
}).join('\n');
|
|
52
52
|
return `import {
|
|
53
53
|
OperationContext,
|
|
54
|
+
PrismaClientLike,
|
|
55
|
+
HttpError,
|
|
54
56
|
getExtendedClient,
|
|
55
57
|
getDelegate,
|
|
56
58
|
validateBody,
|
|
@@ -58,6 +60,7 @@ ${validationLines}
|
|
|
58
60
|
applyPaginationLimits,
|
|
59
61
|
assertGuard,
|
|
60
62
|
countForPagination,
|
|
63
|
+
mapError,
|
|
61
64
|
} from '../operationRuntime${ext}'
|
|
62
65
|
|
|
63
66
|
export async function findMany(ctx: OperationContext): Promise<unknown> {
|
|
@@ -130,6 +133,39 @@ export async function findManyPaginated(
|
|
|
130
133
|
|
|
131
134
|
return { data: items, total, hasMore }
|
|
132
135
|
}
|
|
136
|
+
|
|
137
|
+
export async function updateEach(
|
|
138
|
+
ctx: OperationContext,
|
|
139
|
+
atomic: boolean,
|
|
140
|
+
): Promise<unknown> {
|
|
141
|
+
const body = ctx.body
|
|
142
|
+
if (!Array.isArray(body)) {
|
|
143
|
+
throw new HttpError(400, 'updateEach body must be an array of { where, data } items')
|
|
144
|
+
}
|
|
145
|
+
const items = body as Record<string, unknown>[]
|
|
146
|
+
const client = ctx.prisma as PrismaClientLike
|
|
147
|
+
const delegate = getDelegate(client, '${modelNameLower}')
|
|
148
|
+
|
|
149
|
+
if (atomic) {
|
|
150
|
+
if (typeof client.$transaction !== 'function') {
|
|
151
|
+
throw new HttpError(500, 'Atomic updateEach requires transaction support on the Prisma client')
|
|
152
|
+
}
|
|
153
|
+
const ops = items.map((item) => delegate.update(item))
|
|
154
|
+
const runArray = client.$transaction as unknown as (
|
|
155
|
+
promises: unknown[],
|
|
156
|
+
) => Promise<unknown[]>
|
|
157
|
+
return runArray(ops)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const settled = await Promise.allSettled(
|
|
161
|
+
items.map((item) => delegate.update(item)),
|
|
162
|
+
)
|
|
163
|
+
return settled.map((result) =>
|
|
164
|
+
result.status === 'fulfilled'
|
|
165
|
+
? { status: 'ok', data: result.value }
|
|
166
|
+
: { status: 'error', error: mapError(result.reason).message },
|
|
167
|
+
)
|
|
168
|
+
}
|
|
133
169
|
`;
|
|
134
170
|
}
|
|
135
171
|
//# sourceMappingURL=generateOperationCore.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateOperationCore.js","sourceRoot":"","sources":["../../src/generators/generateOperationCore.ts"],"names":[],"mappings":";;AASA,
|
|
1
|
+
{"version":3,"file":"generateOperationCore.js","sourceRoot":"","sources":["../../src/generators/generateOperationCore.ts"],"names":[],"mappings":";;AASA,8CA0KC;AAjLD,kDAA8C;AAO9C,SAAgB,iBAAiB,CAAC,OAAyB;IACzD,MAAM,GAAG,GAAG,IAAA,qBAAS,EAAC,OAAO,CAAC,WAAW,CAAC,CAAA;IAC1C,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAA;IACpC,MAAM,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA;IAE7E,MAAM,eAAe,GAAG;QACtB,WAAW,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB;QAClE,OAAO,EAAE,WAAW,EAAE,SAAS;KAChC,CAAA;IAED,MAAM,oBAAoB,GAAG,eAAe;SACzC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC;wBACO,EAAE;;;4CAGkB,cAAc;;;6DAGG,EAAE;;oBAE3C,EAAE;EACpB,CAAC;SACE,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,MAAM,QAAQ,GAAG;QACf,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE;QAC9D,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE;QACtE,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,qBAAqB,EAAE,cAAc,EAAE,CAAC,MAAM,CAAC,EAAE;QACxF,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;QACvE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;QAC/E,EAAE,IAAI,EAAE,qBAAqB,EAAE,MAAM,EAAE,qBAAqB,EAAE,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;QACjG,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE;QACrE,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,cAAc,EAAE,CAAC,OAAO,CAAC,EAAE;QACvE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE;KACpF,CAAA;IAED,MAAM,aAAa,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE;QACxC,MAAM,eAAe,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,6BAA6B,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3G,OAAO;wBACa,EAAE,CAAC,IAAI;;EAE7B,eAAe;;4CAE2B,cAAc;;;6DAGG,EAAE,CAAC,MAAM;;oBAElD,EAAE,CAAC,MAAM;EAC3B,CAAA;IACA,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEb,OAAO;;;;;;;;;;;;6BAYoB,GAAG;;;;;;4CAMY,cAAc;;;;;;;EAOxD,oBAAoB;EACpB,aAAa;;;;;;;;;;;4CAW6B,cAAc;;;;;;;;;;;;;;;;;;;;;8CAqBZ,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;0CAqClB,cAAc;;;;;;;;;;;;;;;;;;;;;;CAsBvD,CAAA;AACD,CAAC"}
|
|
@@ -460,6 +460,27 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
460
460
|
const path = basePath || '/'
|
|
461
461
|
router.delete(path, setShape(opConfig), ...before, ${modelName}Delete as RequestHandler, ...after, respond)
|
|
462
462
|
}
|
|
463
|
+
if (config.updateEach) {
|
|
464
|
+
const opConfig: OperationConfigLike = (config.updateEach as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
465
|
+
const { before = [], after = [] } = opConfig
|
|
466
|
+
const path = basePath ? \`\${basePath}/updateEach\` : '/updateEach'
|
|
467
|
+
router.post(
|
|
468
|
+
path,
|
|
469
|
+
setShape(opConfig),
|
|
470
|
+
...before,
|
|
471
|
+
async (req: Request, res: Response, next: NextFunction) => {
|
|
472
|
+
try {
|
|
473
|
+
const atomic = req.get('x-batch-atomic') === 'true'
|
|
474
|
+
readLocals(res).data = await core.updateEach(buildContext(req, res), atomic)
|
|
475
|
+
next()
|
|
476
|
+
} catch (err) {
|
|
477
|
+
next(mapError(err))
|
|
478
|
+
}
|
|
479
|
+
},
|
|
480
|
+
...after,
|
|
481
|
+
respond,
|
|
482
|
+
)
|
|
483
|
+
}
|
|
463
484
|
|
|
464
485
|
router.use((err: unknown, _req: Request, res: Response, next: NextFunction) => {
|
|
465
486
|
let httpError: HttpError
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generateRouter.js","sourceRoot":"","sources":["../../src/generators/generateRouter.ts"],"names":[],"mappings":";;AAKA,
|
|
1
|
+
{"version":3,"file":"generateRouter.js","sourceRoot":"","sources":["../../src/generators/generateRouter.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prisma-generator-express",
|
|
3
3
|
"description": "Prisma generator for Express, Fastify, and Hono CRUD APIs with OpenAPI documentation",
|
|
4
|
-
"version": "1.
|
|
4
|
+
"version": "1.48.0",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"license": "MIT",
|
package/src/copy/routeConfig.ts
CHANGED
|
@@ -117,6 +117,7 @@ export interface BaseRouteConfig<
|
|
|
117
117
|
upsert?: BaseOperationConfig<HookHandler, TShape>
|
|
118
118
|
delete?: BaseOperationConfig<HookHandler, TShape>
|
|
119
119
|
deleteMany?: BaseOperationConfig<HookHandler, TShape>
|
|
120
|
+
updateEach?: BaseOperationConfig<HookHandler, TShape>
|
|
120
121
|
aggregate?: BaseOperationConfig<HookHandler, TShape>
|
|
121
122
|
count?: BaseOperationConfig<HookHandler, TShape>
|
|
122
123
|
groupBy?: BaseOperationConfig<HookHandler, TShape>
|
|
@@ -61,6 +61,8 @@ ${validationLines}
|
|
|
61
61
|
|
|
62
62
|
return `import {
|
|
63
63
|
OperationContext,
|
|
64
|
+
PrismaClientLike,
|
|
65
|
+
HttpError,
|
|
64
66
|
getExtendedClient,
|
|
65
67
|
getDelegate,
|
|
66
68
|
validateBody,
|
|
@@ -68,6 +70,7 @@ ${validationLines}
|
|
|
68
70
|
applyPaginationLimits,
|
|
69
71
|
assertGuard,
|
|
70
72
|
countForPagination,
|
|
73
|
+
mapError,
|
|
71
74
|
} from '../operationRuntime${ext}'
|
|
72
75
|
|
|
73
76
|
export async function findMany(ctx: OperationContext): Promise<unknown> {
|
|
@@ -140,5 +143,38 @@ export async function findManyPaginated(
|
|
|
140
143
|
|
|
141
144
|
return { data: items, total, hasMore }
|
|
142
145
|
}
|
|
146
|
+
|
|
147
|
+
export async function updateEach(
|
|
148
|
+
ctx: OperationContext,
|
|
149
|
+
atomic: boolean,
|
|
150
|
+
): Promise<unknown> {
|
|
151
|
+
const body = ctx.body
|
|
152
|
+
if (!Array.isArray(body)) {
|
|
153
|
+
throw new HttpError(400, 'updateEach body must be an array of { where, data } items')
|
|
154
|
+
}
|
|
155
|
+
const items = body as Record<string, unknown>[]
|
|
156
|
+
const client = ctx.prisma as PrismaClientLike
|
|
157
|
+
const delegate = getDelegate(client, '${modelNameLower}')
|
|
158
|
+
|
|
159
|
+
if (atomic) {
|
|
160
|
+
if (typeof client.$transaction !== 'function') {
|
|
161
|
+
throw new HttpError(500, 'Atomic updateEach requires transaction support on the Prisma client')
|
|
162
|
+
}
|
|
163
|
+
const ops = items.map((item) => delegate.update(item))
|
|
164
|
+
const runArray = client.$transaction as unknown as (
|
|
165
|
+
promises: unknown[],
|
|
166
|
+
) => Promise<unknown[]>
|
|
167
|
+
return runArray(ops)
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
const settled = await Promise.allSettled(
|
|
171
|
+
items.map((item) => delegate.update(item)),
|
|
172
|
+
)
|
|
173
|
+
return settled.map((result) =>
|
|
174
|
+
result.status === 'fulfilled'
|
|
175
|
+
? { status: 'ok', data: result.value }
|
|
176
|
+
: { status: 'error', error: mapError(result.reason).message },
|
|
177
|
+
)
|
|
178
|
+
}
|
|
143
179
|
`
|
|
144
180
|
}
|
|
@@ -476,6 +476,27 @@ export function ${routerFunctionName}<TCtx = unknown, TPrisma = any>(config: ${m
|
|
|
476
476
|
const path = basePath || '/'
|
|
477
477
|
router.delete(path, setShape(opConfig), ...before, ${modelName}Delete as RequestHandler, ...after, respond)
|
|
478
478
|
}
|
|
479
|
+
if (config.updateEach) {
|
|
480
|
+
const opConfig: OperationConfigLike = (config.updateEach as OperationConfigLike | undefined) ?? defaultOpConfig
|
|
481
|
+
const { before = [], after = [] } = opConfig
|
|
482
|
+
const path = basePath ? \`\${basePath}/updateEach\` : '/updateEach'
|
|
483
|
+
router.post(
|
|
484
|
+
path,
|
|
485
|
+
setShape(opConfig),
|
|
486
|
+
...before,
|
|
487
|
+
async (req: Request, res: Response, next: NextFunction) => {
|
|
488
|
+
try {
|
|
489
|
+
const atomic = req.get('x-batch-atomic') === 'true'
|
|
490
|
+
readLocals(res).data = await core.updateEach(buildContext(req, res), atomic)
|
|
491
|
+
next()
|
|
492
|
+
} catch (err) {
|
|
493
|
+
next(mapError(err))
|
|
494
|
+
}
|
|
495
|
+
},
|
|
496
|
+
...after,
|
|
497
|
+
respond,
|
|
498
|
+
)
|
|
499
|
+
}
|
|
479
500
|
|
|
480
501
|
router.use((err: unknown, _req: Request, res: Response, next: NextFunction) => {
|
|
481
502
|
let httpError: HttpError
|