Skip to content

Commit e574048

Browse files
authored
refactor: generate enhance API and avoid dynamic require in runtime (#937)
1 parent 50e5dbc commit e574048

Some content is hidden

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

50 files changed

+513
-507
lines changed

.github/workflows/build-test.yml

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ env:
99

1010
on:
1111
pull_request:
12-
branches: ['dev', 'main']
12+
branches: ['dev', 'main', 'v2']
1313

1414
jobs:
1515
build-test:
@@ -32,18 +32,11 @@ jobs:
3232
strategy:
3333
matrix:
3434
node-version: [18.x]
35-
prisma-version: [v4, v5]
3635

3736
steps:
3837
- name: Checkout
3938
uses: actions/checkout@v3
4039

41-
- name: Set Prisma Version
42-
if: ${{ matrix.prisma-version == 'v5' }}
43-
shell: bash
44-
run: |
45-
bash ./script/test-prisma-v5.sh
46-
4740
- name: Install pnpm
4841
uses: pnpm/action-setup@v2
4942
with:

packages/plugins/tanstack-query/tsconfig.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66
"jsx": "react"
77
},
88
"include": ["src/**/*.ts"],
9-
"exclude": ["src/runtime"]
9+
"exclude": ["src/runtime", "src/runtime-v5"]
1010
}

packages/runtime/package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,9 @@
5353
"linkDirectory": true
5454
},
5555
"dependencies": {
56-
"@types/bcryptjs": "^2.4.2",
5756
"bcryptjs": "^2.4.3",
5857
"buffer": "^6.0.3",
5958
"change-case": "^4.1.2",
60-
"colors": "1.4.0",
6159
"decimal.js": "^10.4.2",
6260
"deepcopy": "^2.1.0",
6361
"lower-case-first": "^2.0.2",

packages/runtime/res/enhance.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
export { enhance } from '.zenstack/enhance';

packages/runtime/res/enhance.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
'use strict';
2+
Object.defineProperty(exports, '__esModule', { value: true });
3+
4+
try {
5+
exports.enhance = require('.zenstack/enhance').enhance;
6+
} catch {
7+
exports.enhance = function () {
8+
throw new Error('Generated "enhance" function not found. Please run `zenstack generate` first.');
9+
};
10+
}

packages/runtime/src/constants.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ export const PRISMA_PROXY_ENHANCER = '$__zenstack_enhancer';
6666
/**
6767
* Minimum Prisma version supported
6868
*/
69-
export const PRISMA_MINIMUM_VERSION = '4.8.0';
69+
export const PRISMA_MINIMUM_VERSION = '5.0.0';
7070

7171
/**
7272
* Selector function name for fetching pre-update entity values.

packages/runtime/src/enhance.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
// @ts-expect-error stub for re-exporting generated code
2+
export { enhance } from '.zenstack/enhance';

packages/runtime/src/enhancements/enhance.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { getDefaultModelMeta } from '../loader';
21
import { withOmit, WithOmitOptions } from './omit';
32
import { withPassword, WithPasswordOptions } from './password';
43
import { withPolicy, WithPolicyContext, WithPolicyOptions } from './policy';
@@ -21,16 +20,15 @@ let hasOmit: boolean | undefined = undefined;
2120
* @param context The context to for evaluating access policies.
2221
* @param options Options.
2322
*/
24-
export function enhance<DbClient extends object>(
23+
export function createEnhancement<DbClient extends object>(
2524
prisma: DbClient,
26-
context?: WithPolicyContext,
27-
options?: EnhancementOptions
25+
options: EnhancementOptions,
26+
context?: WithPolicyContext
2827
) {
2928
let result = prisma;
3029

3130
if (hasPassword === undefined || hasOmit === undefined) {
32-
const modelMeta = options?.modelMeta ?? getDefaultModelMeta(options?.loadPath);
33-
const allFields = Object.values(modelMeta.fields).flatMap((modelInfo) => Object.values(modelInfo));
31+
const allFields = Object.values(options.modelMeta.fields).flatMap((modelInfo) => Object.values(modelInfo));
3432
hasPassword = allFields.some((field) => field.attributes?.some((attr) => attr.name === '@password'));
3533
hasOmit = allFields.some((field) => field.attributes?.some((attr) => attr.name === '@omit'));
3634
}
@@ -46,7 +44,7 @@ export function enhance<DbClient extends object>(
4644
}
4745

4846
// policy proxy
49-
result = withPolicy(result, context, options);
47+
result = withPolicy(result, options, context);
5048

5149
return result;
5250
}

packages/runtime/src/enhancements/index.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ export * from './enhance';
33
export * from './omit';
44
export * from './password';
55
export * from './policy';
6-
export * from './preset';
76
export * from './types';
87
export * from './utils';
98
export * from './where-visitor';

packages/runtime/src/enhancements/omit.ts

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
/* eslint-disable @typescript-eslint/no-explicit-any */
33

44
import { enumerate, getModelFields, resolveField, type ModelMeta } from '../cross';
5-
import { getDefaultModelMeta } from '../loader';
65
import { DbClientContract } from '../types';
76
import { DefaultPrismaProxyHandler, makeProxy } from './proxy';
87
import { CommonEnhancementOptions } from './types';
@@ -14,18 +13,17 @@ export interface WithOmitOptions extends CommonEnhancementOptions {
1413
/**
1514
* Model metadata
1615
*/
17-
modelMeta?: ModelMeta;
16+
modelMeta: ModelMeta;
1817
}
1918

2019
/**
2120
* Gets an enhanced Prisma client that supports @omit attribute.
2221
*/
23-
export function withOmit<DbClient extends object>(prisma: DbClient, options?: WithOmitOptions): DbClient {
24-
const _modelMeta = options?.modelMeta ?? getDefaultModelMeta(options?.loadPath);
22+
export function withOmit<DbClient extends object>(prisma: DbClient, options: WithOmitOptions): DbClient {
2523
return makeProxy(
2624
prisma,
27-
_modelMeta,
28-
(_prisma, model) => new OmitHandler(_prisma as DbClientContract, model, _modelMeta),
25+
options.modelMeta,
26+
(_prisma, model) => new OmitHandler(_prisma as DbClientContract, model, options.modelMeta),
2927
'omit'
3028
);
3129
}

0 commit comments

Comments
 (0)