Skip to content

Commit 79197c6

Browse files
authored
merge dev to main (v2.13.1) (#2068)
2 parents 8a62f63 + 4608cb9 commit 79197c6

File tree

19 files changed

+127
-27
lines changed

19 files changed

+127
-27
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": "2.13.0",
3+
"version": "2.13.1",
44
"description": "",
55
"scripts": {
66
"build": "pnpm -r --filter=\"!./packages/ide/*\" build",

packages/ide/jetbrains/CHANGELOG.md

+6
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
## [Unreleased]
44

5+
- Support `@default` for `@json` fields.
6+
7+
### Fixed
8+
9+
## 2.12.1
10+
511
### Added
612

713
- Validating regex patterns in ZModel.

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 = "2.13.0"
12+
version = "2.13.1"
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": "2.13.0",
3+
"version": "2.13.1",
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": "2.13.0",
3+
"version": "2.13.1",
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": "2.13.0",
4+
"version": "2.13.1",
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": "2.13.0",
4+
"version": "2.13.1",
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": "2.13.0",
4+
"version": "2.13.1",
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": "2.13.0",
4+
"version": "2.13.1",
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": "2.13.0",
4+
"version": "2.13.1",
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": "2.13.0",
4+
"version": "2.13.1",
55
"description": "Runtime of ZenStack for both client-side and server-side environments.",
66
"repository": {
77
"type": "git",

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": "FullStack enhancement for Prisma ORM: seamless integration from database to UI",
6-
"version": "2.13.0",
6+
"version": "2.13.1",
77
"author": {
88
"name": "ZenStack Team"
99
},

packages/schema/src/plugins/enhancer/enhance/index.ts

+24-12
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,8 @@ ${
151151
152152
${
153153
prismaTypesFixed
154-
? this.createLogicalPrismaImports(prismaImport, resultPrismaImport)
155-
: this.createSimplePrismaImports(prismaImport)
154+
? this.createLogicalPrismaImports(prismaImport, resultPrismaImport, target)
155+
: this.createSimplePrismaImports(prismaImport, target)
156156
}
157157
158158
${authTypes}
@@ -206,8 +206,10 @@ ${
206206
return normalizedRelative(this.outDir, zodAbsPath);
207207
}
208208

209-
private createSimplePrismaImports(prismaImport: string) {
210-
return `import { Prisma, type PrismaClient } from '${prismaImport}';
209+
private createSimplePrismaImports(prismaImport: string, target: string) {
210+
const prismaTargetImport = target === 'edge' ? `${prismaImport}/edge` : prismaImport;
211+
212+
return `import { Prisma, type PrismaClient } from '${prismaTargetImport}';
211213
import type * as _P from '${prismaImport}';
212214
export type { PrismaClient };
213215
@@ -235,8 +237,9 @@ export function enhance<DbClient extends object>(prisma: DbClient, context?: Enh
235237
`;
236238
}
237239

238-
private createLogicalPrismaImports(prismaImport: string, prismaClientImport: string) {
239-
return `import { Prisma as _Prisma, PrismaClient as _PrismaClient } from '${prismaImport}';
240+
private createLogicalPrismaImports(prismaImport: string, prismaClientImport: string, target: string) {
241+
const prismaTargetImport = target === 'edge' ? `${prismaImport}/edge` : prismaImport;
242+
return `import { Prisma as _Prisma, PrismaClient as _PrismaClient } from '${prismaTargetImport}';
240243
import type { InternalArgs, DynamicClientExtensionThis } from '${prismaImport}/runtime/library';
241244
import type * as _P from '${prismaClientImport}';
242245
import type { Prisma, PrismaClient } from '${prismaClientImport}';
@@ -824,12 +827,21 @@ export type Enhanced<Client> =
824827
};
825828

826829
const replacePrismaJson = (source: string, field: DataModelField) => {
827-
return source.replace(
828-
new RegExp(`(${field.name}\\??\\s*):[^\\n]+`),
829-
`$1: ${field.type.reference!.$refText}${field.type.array ? '[]' : ''}${
830-
field.type.optional ? ' | null' : ''
831-
}`
832-
);
830+
let replaceValue = `$1: ${field.type.reference!.$refText}`;
831+
if (field.type.array) {
832+
replaceValue += '[]';
833+
}
834+
if (field.type.optional) {
835+
replaceValue += ' | null';
836+
}
837+
838+
// Check if the field in the source is optional (has a `?`)
839+
const isOptionalInSource = new RegExp(`(${field.name}\\?\\s*):`).test(source);
840+
if (isOptionalInSource) {
841+
replaceValue += ' | $Types.Skip';
842+
}
843+
844+
return source.replace(new RegExp(`(${field.name}\\??\\s*):[^\\n]+`), replaceValue);
833845
};
834846

835847
// fix "$[Model]Payload" type

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": "2.13.0",
3+
"version": "2.13.1",
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": "2.13.0",
3+
"version": "2.13.1",
44
"displayName": "ZenStack Server-side Adapters",
55
"description": "ZenStack server-side adapters",
66
"homepage": "https://zenstack.dev",

packages/server/src/api/rest/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1528,7 +1528,6 @@ class RequestHandler extends APIHandlerBase {
15281528
}
15291529

15301530
const items: any[] = [];
1531-
let currType = typeInfo;
15321531

15331532
for (const [key, value] of Object.entries(query)) {
15341533
if (!value) {
@@ -1554,6 +1553,7 @@ class RequestHandler extends APIHandlerBase {
15541553

15551554
const item: any = {};
15561555
let curr = item;
1556+
let currType = typeInfo;
15571557

15581558
for (const filterValue of enumerate(value)) {
15591559
for (let i = 0; i < filterKeys.length; i++) {

packages/server/tests/api/rest.test.ts

+20
Original file line numberDiff line numberDiff line change
@@ -633,6 +633,26 @@ describe('REST server tests', () => {
633633
prisma,
634634
});
635635
expect(r.body.data).toHaveLength(0);
636+
r = await handler({
637+
method: 'get',
638+
path: '/post',
639+
query: {
640+
['filter[author][email]']: 'user1@abc.com',
641+
['filter[title]']: 'Post1',
642+
},
643+
prisma,
644+
});
645+
expect(r.body.data).toHaveLength(1);
646+
r = await handler({
647+
method: 'get',
648+
path: '/post',
649+
query: {
650+
['filter[author][email]']: 'user1@abc.com',
651+
['filter[title]']: 'Post2',
652+
},
653+
prisma,
654+
});
655+
expect(r.body.data).toHaveLength(0);
636656

637657
// to-one relation filter
638658
r = await handler({

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": "2.13.0",
3+
"version": "2.13.1",
44
"description": "ZenStack Test Tools",
55
"main": "index.js",
66
"private": true,

tests/integration/tests/enhancements/json/crud.test.ts

+62
Original file line numberDiff line numberDiff line change
@@ -429,4 +429,66 @@ describe('Json field CRUD', () => {
429429

430430
await expect(post.content.content[0].content[0].text).toBe('hello');
431431
});
432+
433+
it('works with Prisma.skip', async () => {
434+
const params = await loadSchema(
435+
`
436+
type Profile {
437+
foo Int
438+
bar String
439+
}
440+
441+
model User {
442+
id Int @id @default(autoincrement())
443+
name String
444+
profile Profile @json
445+
@@allow('all', true)
446+
}
447+
`,
448+
{
449+
provider: 'postgresql',
450+
dbUrl,
451+
compile: true,
452+
extraSourceFiles: [
453+
{
454+
name: 'main.ts',
455+
content: `
456+
import { enhance } from '.zenstack/enhance';
457+
import { Prisma, PrismaClient } from '@prisma/client';
458+
const prisma = new PrismaClient();
459+
const db = enhance(prisma);
460+
461+
async function main() {
462+
// @ts-expect-error Non optional JSON fields should not be skippable in the create call
463+
db.user.create({ data: { name: 'test', profile: Prisma.skip } });
464+
465+
const u = await db.user.create({ data: { name: 'test', profile: { foo: 18, bar: 'test' } } });
466+
await db.user.update({ where: { id: u.id }, data: { profile: Prisma.skip } });
467+
}
468+
`,
469+
},
470+
],
471+
}
472+
);
473+
474+
prisma = params.prisma;
475+
const skip = params.prismaModule.Prisma.skip;
476+
const db = params.enhance();
477+
478+
const user = await db.user.create({ data: { name: 'test', profile: { foo: 18, bar: 'test' } } });
479+
480+
await expect(
481+
db.user.update({
482+
where: { id: user.id },
483+
data: { profile: skip },
484+
})
485+
).resolves.toMatchObject({
486+
id: user.id,
487+
name: 'test',
488+
profile: {
489+
foo: 18,
490+
bar: 'test',
491+
},
492+
});
493+
});
432494
});

0 commit comments

Comments
 (0)