Skip to content

Commit c3f490a

Browse files
authored
merge dev to main (v1.8.2) (#989)
2 parents a658f27 + d0745b1 commit c3f490a

File tree

20 files changed

+106
-22
lines changed

20 files changed

+106
-22
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "zenstack-monorepo",
3-
"version": "1.8.1",
3+
"version": "1.8.2",
44
"description": "",
55
"scripts": {
66
"build": "pnpm -r build",

packages/ide/jetbrains/build.gradle.kts

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ plugins {
99
}
1010

1111
group = "dev.zenstack"
12-
version = "1.8.1"
12+
version = "1.8.2"
1313

1414
repositories {
1515
mavenCentral()

packages/ide/jetbrains/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "jetbrains",
3-
"version": "1.8.1",
3+
"version": "1.8.2",
44
"displayName": "ZenStack JetBrains IDE Plugin",
55
"description": "ZenStack JetBrains IDE plugin",
66
"homepage": "https://zenstack.dev",

packages/language/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@zenstackhq/language",
3-
"version": "1.8.1",
3+
"version": "1.8.2",
44
"displayName": "ZenStack modeling language compiler",
55
"description": "ZenStack modeling language compiler",
66
"homepage": "https://zenstack.dev",

packages/misc/redwood/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@zenstackhq/redwood",
33
"displayName": "ZenStack RedwoodJS Integration",
4-
"version": "1.8.1",
4+
"version": "1.8.2",
55
"description": "CLI and runtime for integrating ZenStack with RedwoodJS projects.",
66
"repository": {
77
"type": "git",

packages/plugins/openapi/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@zenstackhq/openapi",
33
"displayName": "ZenStack Plugin and Runtime for OpenAPI",
4-
"version": "1.8.1",
4+
"version": "1.8.2",
55
"description": "ZenStack plugin and runtime supporting OpenAPI",
66
"main": "index.js",
77
"repository": {

packages/plugins/swr/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@zenstackhq/swr",
33
"displayName": "ZenStack plugin for generating SWR hooks",
4-
"version": "1.8.1",
4+
"version": "1.8.2",
55
"description": "ZenStack plugin for generating SWR hooks",
66
"main": "index.js",
77
"repository": {

packages/plugins/tanstack-query/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@zenstackhq/tanstack-query",
33
"displayName": "ZenStack plugin for generating tanstack-query hooks",
4-
"version": "1.8.1",
4+
"version": "1.8.2",
55
"description": "ZenStack plugin for generating tanstack-query hooks",
66
"main": "index.js",
77
"exports": {

packages/plugins/trpc/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@zenstackhq/trpc",
33
"displayName": "ZenStack plugin for tRPC",
4-
"version": "1.8.1",
4+
"version": "1.8.2",
55
"description": "ZenStack plugin for tRPC",
66
"main": "index.js",
77
"repository": {

packages/runtime/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@zenstackhq/runtime",
33
"displayName": "ZenStack Runtime Library",
4-
"version": "1.8.1",
4+
"version": "1.8.2",
55
"description": "Runtime of ZenStack for both client-side and server-side environments.",
66
"repository": {
77
"type": "git",

packages/runtime/src/enhancements/policy/handler.ts

+19-5
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { formatObject, prismaClientValidationError } from '../utils';
2323
import { Logger } from './logger';
2424
import { PolicyUtil } from './policy-utils';
2525
import { createDeferredPromise } from './promise';
26+
import { WithPolicyOptions } from '.';
2627

2728
// a record for post-write policy check
2829
type PostWriteCheckRecord = {
@@ -42,14 +43,17 @@ export class PolicyProxyHandler<DbClient extends DbClientContract> implements Pr
4243
private readonly utils: PolicyUtil;
4344
private readonly model: string;
4445

46+
private readonly DEFAULT_TX_MAXWAIT = 100000;
47+
private readonly DEFAULT_TX_TIMEOUT = 100000;
48+
4549
constructor(
4650
private readonly prisma: DbClient,
4751
private readonly policy: PolicyDef,
4852
private readonly modelMeta: ModelMeta,
4953
private readonly zodSchemas: ZodSchemas | undefined,
5054
model: string,
51-
private readonly user?: AuthUser,
52-
private readonly logPrismaQuery?: boolean
55+
private readonly user: AuthUser | undefined,
56+
private readonly options: WithPolicyOptions | undefined
5357
) {
5458
this.logger = new Logger(prisma);
5559
this.utils = new PolicyUtil(
@@ -1276,12 +1280,22 @@ export class PolicyProxyHandler<DbClient extends DbClientContract> implements Pr
12761280
//#region Utils
12771281

12781282
private get shouldLogQuery() {
1279-
return !!this.logPrismaQuery && this.logger.enabled('info');
1283+
return !!this.options?.logPrismaQuery && this.logger.enabled('info');
12801284
}
12811285

12821286
private transaction(action: (tx: Record<string, DbOperations>) => Promise<any>) {
12831287
if (this.prisma['$transaction']) {
1284-
return this.prisma.$transaction((tx) => action(tx), { maxWait: 100000, timeout: 100000 });
1288+
const txOptions: any = { maxWait: this.DEFAULT_TX_MAXWAIT, timeout: this.DEFAULT_TX_TIMEOUT };
1289+
if (this.options?.transactionMaxWait !== undefined) {
1290+
txOptions.maxWait = this.options.transactionMaxWait;
1291+
}
1292+
if (this.options?.transactionTimeout !== undefined) {
1293+
txOptions.timeout = this.options.transactionTimeout;
1294+
}
1295+
if (this.options?.transactionIsolationLevel !== undefined) {
1296+
txOptions.isolationLevel = this.options.transactionIsolationLevel;
1297+
}
1298+
return this.prisma.$transaction((tx) => action(tx), txOptions);
12851299
} else {
12861300
// already in transaction, don't nest
12871301
return action(this.prisma);
@@ -1304,7 +1318,7 @@ export class PolicyProxyHandler<DbClient extends DbClientContract> implements Pr
13041318
this.zodSchemas,
13051319
model,
13061320
this.user,
1307-
this.logPrismaQuery
1321+
this.options
13081322
);
13091323
}
13101324

packages/runtime/src/enhancements/policy/index.ts

+26-1
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,16 @@ export type WithPolicyContext = {
1818
user?: AuthUser;
1919
};
2020

21+
/**
22+
* Transaction isolation levels: https://www.prisma.io/docs/orm/prisma-client/queries/transactions#transaction-isolation-level
23+
*/
24+
export type TransactionIsolationLevel =
25+
| 'ReadUncommitted'
26+
| 'ReadCommitted'
27+
| 'RepeatableRead'
28+
| 'Snapshot'
29+
| 'Serializable';
30+
2131
/**
2232
* Options for @see withPolicy
2333
*/
@@ -46,6 +56,21 @@ export interface WithPolicyOptions extends CommonEnhancementOptions {
4656
* Hook for transforming errors before they are thrown to the caller.
4757
*/
4858
errorTransformer?: ErrorTransformer;
59+
60+
/**
61+
* The `maxWait` option passed to `prisma.$transaction()` call for transactions initiated by ZenStack.
62+
*/
63+
transactionMaxWait?: number;
64+
65+
/**
66+
* The `timeout` option passed to `prisma.$transaction()` call for transactions initiated by ZenStack.
67+
*/
68+
transactionTimeout?: number;
69+
70+
/**
71+
* The `isolationLevel` option passed to `prisma.$transaction()` call for transactions initiated by ZenStack.
72+
*/
73+
transactionIsolationLevel?: TransactionIsolationLevel;
4974
}
5075

5176
/**
@@ -115,7 +140,7 @@ export function withPolicy<DbClient extends object>(
115140
_zodSchemas,
116141
model,
117142
context?.user,
118-
options?.logPrismaQuery
143+
options
119144
),
120145
'policy',
121146
options?.errorTransformer

packages/schema/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"publisher": "zenstack",
44
"displayName": "ZenStack Language Tools",
55
"description": "Build scalable web apps with minimum code by defining authorization and validation rules inside the data schema that closer to the database",
6-
"version": "1.8.1",
6+
"version": "1.8.2",
77
"author": {
88
"name": "ZenStack Team"
99
},

packages/schema/src/plugins/prisma/schema-generator.ts

+6-2
Original file line numberDiff line numberDiff line change
@@ -136,14 +136,18 @@ export default class PrismaSchemaGenerator {
136136
const generateClient = options.generateClient !== false;
137137

138138
if (generateClient) {
139+
let generateCmd = `npx prisma generate --schema "${outFile}"`;
140+
if (typeof options.generateArgs === 'string') {
141+
generateCmd += ` ${options.generateArgs}`;
142+
}
139143
try {
140144
// run 'prisma generate'
141-
await execSync(`npx prisma generate --schema "${outFile}"`, 'ignore');
145+
await execSync(generateCmd, 'ignore');
142146
} catch {
143147
await this.trackPrismaSchemaError(outFile);
144148
try {
145149
// run 'prisma generate' again with output to the console
146-
await execSync(`npx prisma generate --schema "${outFile}"`);
150+
await execSync(generateCmd);
147151
} catch {
148152
// noop
149153
}

packages/schema/src/plugins/zod/utils/schema-gen.ts

+12
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,18 @@ export function makeFieldSchema(field: DataModelField, respectDefault = false) {
8989
schema += `.url(${messageArgFirst})`;
9090
break;
9191
}
92+
case '@trim': {
93+
schema += `.trim()`;
94+
break;
95+
}
96+
case '@lower': {
97+
schema += `.toLowerCase()`;
98+
break;
99+
}
100+
case '@upper': {
101+
schema += `.toUpperCase()`;
102+
break;
103+
}
92104
case '@datetime': {
93105
schema += `.datetime({ offset: true${message ? ', message: ' + JSON.stringify(message) : ''} })`;
94106
break;

packages/schema/src/res/stdlib.zmodel

+15
Original file line numberDiff line numberDiff line change
@@ -514,6 +514,21 @@ attribute @datetime(_ message: String?) @@@targetField([StringField]) @@@validat
514514
*/
515515
attribute @url(_ message: String?) @@@targetField([StringField]) @@@validation
516516

517+
/**
518+
* Trims whitespaces from the start and end of the string.
519+
*/
520+
attribute @trim() @@@targetField([StringField]) @@@validation
521+
522+
/**
523+
* Transform entire string toLowerCase.
524+
*/
525+
attribute @lower() @@@targetField([StringField]) @@@validation
526+
527+
/**
528+
* Transform entire string toUpperCase.
529+
*/
530+
attribute @upper() @@@targetField([StringField]) @@@validation
531+
517532
/**
518533
* Validates a number field is greater than the given value.
519534
*/

packages/sdk/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@zenstackhq/sdk",
3-
"version": "1.8.1",
3+
"version": "1.8.2",
44
"description": "ZenStack plugin development SDK",
55
"main": "index.js",
66
"scripts": {

packages/server/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@zenstackhq/server",
3-
"version": "1.8.1",
3+
"version": "1.8.2",
44
"displayName": "ZenStack Server-side Adapters",
55
"description": "ZenStack server-side adapters",
66
"homepage": "https://zenstack.dev",

packages/testtools/package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@zenstackhq/testtools",
3-
"version": "1.8.1",
3+
"version": "1.8.2",
44
"description": "ZenStack Test Tools",
55
"main": "index.js",
66
"private": true,

tests/integration/tests/cli/generate.test.ts

+14
Original file line numberDiff line numberDiff line change
@@ -180,4 +180,18 @@ model Post {
180180
expect(fs.existsSync('./node_modules/.zenstack/zod/index.js')).toBeFalsy();
181181
expect(fs.existsSync('./node_modules/.zenstack/zod/index.ts')).toBeTruthy();
182182
});
183+
184+
it('generate with prisma generateArgs', async () => {
185+
fs.appendFileSync(
186+
'schema.zmodel',
187+
`
188+
plugin prisma {
189+
provider = '@core/prisma'
190+
generateArgs = '--no-engine'
191+
}
192+
`
193+
);
194+
const program = createProgram();
195+
await program.parseAsync(['generate', '--no-dependency-check', '--no-default-plugins'], { from: 'user' });
196+
});
183197
});

0 commit comments

Comments
 (0)