Skip to content

Commit b0d9154

Browse files
authored
feat: support Prisma v5 (#587)
1 parent 46fec66 commit b0d9154

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+1267
-3070
lines changed

.github/workflows/build-test.yml

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,17 @@ jobs:
1818
strategy:
1919
matrix:
2020
node-version: [18.x]
21+
prisma-version: [v4, v5]
2122

2223
steps:
23-
- uses: actions/checkout@v3
24+
- name: Checkout
25+
uses: actions/checkout@v3
26+
27+
- name: Set Prisma Version
28+
if: ${{ matrix.prisma-version == 'v5' }}
29+
shell: bash
30+
run: |
31+
bash ./script/test-prisma-v5.sh
2432
2533
- name: Install pnpm
2634
uses: pnpm/action-setup@v2

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
"devDependencies": {
1717
"@changesets/cli": "^2.26.0",
1818
"concurrently": "^7.4.0",
19+
"replace-in-file": "^7.0.1",
1920
"tsup": "^7.1.0"
2021
}
2122
}

packages/plugins/openapi/package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
"author": "ZenStack Team",
2525
"license": "MIT",
2626
"dependencies": {
27-
"@prisma/generator-helper": "4.10.0",
27+
"@prisma/generator-helper": "^5.0.0",
2828
"@zenstackhq/runtime": "workspace:*",
2929
"@zenstackhq/sdk": "workspace:*",
3030
"change-case": "^4.1.2",
@@ -36,10 +36,9 @@
3636
"zod-validation-error": "^0.2.1"
3737
},
3838
"devDependencies": {
39-
"@prisma/internals": "4.10.0",
4039
"@readme/openapi-parser": "^2.4.0",
4140
"@types/jest": "^29.5.0",
42-
"@types/lower-case-first": "^1.0.1",
41+
"@types/node": "^18.0.0",
4342
"@types/pluralize": "^0.0.29",
4443
"@types/tmp": "^0.2.3",
4544
"@typescript-eslint/eslint-plugin": "^5.54.0",

packages/plugins/openapi/src/generator-base.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { DMMF } from '@prisma/generator-helper';
1+
import type { DMMF } from '@prisma/generator-helper';
22
import { PluginError, PluginOptions, getDataModels, hasAttribute } from '@zenstackhq/sdk';
33
import { Model } from '@zenstackhq/sdk/ast';
44
import type { OpenAPIV3_1 as OAPI } from 'openapi-types';

packages/plugins/openapi/src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { DMMF } from '@prisma/generator-helper';
1+
import type { DMMF } from '@prisma/generator-helper';
22
import { PluginError, PluginOptions } from '@zenstackhq/sdk';
33
import { Model } from '@zenstackhq/sdk/ast';
44
import { RESTfulOpenAPIGenerator } from './rest-generator';

packages/plugins/openapi/src/rest-generator.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// Inspired by: https://github.com/omar-dulaimi/prisma-trpc-generator
22

3-
import { DMMF } from '@prisma/generator-helper';
3+
import type { DMMF } from '@prisma/generator-helper';
44
import {
55
AUXILIARY_FIELDS,
66
analyzePolicies,

packages/plugins/openapi/src/rpc-generator.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,12 @@ export class RPCOpenAPIGenerator extends OpenAPIGeneratorBase {
713713
const fields = input.fields.filter((f) => !AUXILIARY_FIELDS.includes(f.name));
714714
for (const field of fields) {
715715
const options = field.inputTypes
716-
.filter((f) => f.type !== 'Null')
716+
.filter(
717+
(f) =>
718+
f.type !== 'Null' &&
719+
// fieldRefTypes refer to other fields in the model and don't need to be generated as part of schema
720+
f.location !== 'fieldRefTypes'
721+
)
717722
.map((f) => {
718723
return this.wrapArray(this.prismaTypeToOpenAPIType(f.type), f.isList);
719724
});

packages/plugins/prisma-types.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
/* eslint-disable @typescript-eslint/no-explicit-any */
2+
/// Types copied over from Prisma's generated code to avoid being broken due to Prisma upgrades
3+
4+
export type Enumerable<T> = T | Array<T>;
5+
6+
type _TupleToUnion<T> = T extends (infer E)[] ? E : never;
7+
8+
export type TupleToUnion<K extends readonly any[]> = _TupleToUnion<K>;
9+
10+
export type MaybeTupleToUnion<T> = T extends any[] ? TupleToUnion<T> : T;
11+
12+
export type PickEnumerable<T, K extends Enumerable<keyof T> | keyof T> = Pick<T, MaybeTupleToUnion<K>>;

packages/plugins/swr/package.json

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
"author": "ZenStack Team",
2626
"license": "MIT",
2727
"dependencies": {
28-
"@prisma/generator-helper": "4.10.0",
28+
"@prisma/generator-helper": "^5.0.0",
2929
"@zenstackhq/runtime": "workspace:*",
3030
"@zenstackhq/sdk": "workspace:*",
3131
"change-case": "^4.1.2",
@@ -37,10 +37,9 @@
3737
"devDependencies": {
3838
"@tanstack/react-query": "^4.28.0",
3939
"@types/jest": "^29.5.0",
40-
"@types/lower-case-first": "^1.0.1",
40+
"@types/node": "^18.0.0",
4141
"@types/react": "18.2.0",
4242
"@types/tmp": "^0.2.3",
43-
"@types/upper-case-first": "^1.1.2",
4443
"@zenstackhq/testtools": "workspace:*",
4544
"copyfiles": "^2.4.1",
4645
"jest": "^29.5.0",

packages/plugins/swr/src/generator.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { DMMF } from '@prisma/generator-helper';
1+
import type { DMMF } from '@prisma/generator-helper';
22
import {
33
PluginOptions,
44
createProject,
@@ -59,7 +59,7 @@ function generateModelHooks(project: Project, outDir: string, model: DataModel,
5959
});
6060
sf.addStatements([
6161
`import { useContext } from 'react';`,
62-
`import { RequestHandlerContext, type RequestOptions } from '@zenstackhq/swr/runtime';`,
62+
`import { RequestHandlerContext, type RequestOptions, type PickEnumerable } from '@zenstackhq/swr/runtime';`,
6363
`import * as request from '@zenstackhq/swr/runtime';`,
6464
]);
6565

@@ -193,7 +193,7 @@ function generateModelHooks(project: Project, outDir: string, model: DataModel,
193193
`HasSelectOrTake extends Prisma.Or<Prisma.Extends<'skip', Prisma.Keys<T>>, Prisma.Extends<'take', Prisma.Keys<T>>>`,
194194
`OrderByArg extends Prisma.True extends HasSelectOrTake ? { orderBy: Prisma.${model.name}GroupByArgs['orderBy'] }: { orderBy?: Prisma.${model.name}GroupByArgs['orderBy'] },`,
195195
`OrderFields extends Prisma.ExcludeUnderscoreKeys<Prisma.Keys<Prisma.MaybeTupleToUnion<T['orderBy']>>>`,
196-
`ByFields extends Prisma.TupleToUnion<T['by']>`,
196+
`ByFields extends Prisma.MaybeTupleToUnion<T['by']>`,
197197
`ByValid extends Prisma.Has<ByFields, OrderFields>`,
198198
`HavingFields extends Prisma.GetHavingFields<T['having']>`,
199199
`HavingValid extends Prisma.Has<ByFields, HavingFields>`,
@@ -243,7 +243,7 @@ function generateModelHooks(project: Project, outDir: string, model: DataModel,
243243
];
244244
const inputType = `Prisma.SubsetIntersection<T, Prisma.${model.name}GroupByArgs, OrderByArg> & InputErrors`;
245245
const returnType = `{} extends InputErrors ?
246-
Array<Prisma.PickArray<Prisma.${model.name}GroupByOutputType, T['by']> &
246+
Array<PickEnumerable<Prisma.${model.name}GroupByOutputType, T['by']> &
247247
{
248248
[P in ((keyof T) & (keyof Prisma.${model.name}GroupByOutputType))]: P extends '_count'
249249
? T[P] extends boolean

0 commit comments

Comments
 (0)