From da50917b15ee094a696f374ac5c726d335abaa44 Mon Sep 17 00:00:00 2001 From: Jiasheng Date: Fri, 17 Jan 2025 09:25:30 +0800 Subject: [PATCH] fix: ZModel generator support JSON Type (#1965) --- package.json | 2 +- packages/ide/jetbrains/build.gradle.kts | 2 +- packages/ide/jetbrains/package.json | 2 +- packages/language/package.json | 2 +- packages/misc/redwood/package.json | 2 +- packages/plugins/openapi/package.json | 2 +- packages/plugins/swr/package.json | 2 +- packages/plugins/tanstack-query/package.json | 2 +- packages/plugins/trpc/package.json | 2 +- packages/runtime/package.json | 2 +- packages/schema/package.json | 2 +- .../schema/tests/schema/all-features.zmodel | 97 +++++++++++-------- packages/sdk/package.json | 2 +- packages/sdk/src/zmodel-code-generator.ts | 25 ++++- packages/server/package.json | 2 +- packages/testtools/package.json | 2 +- 16 files changed, 91 insertions(+), 59 deletions(-) diff --git a/package.json b/package.json index 1ad002bdf..d9841e02f 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zenstack-monorepo", - "version": "2.11.3", + "version": "2.11.4", "description": "", "scripts": { "build": "pnpm -r --filter=\"!./packages/ide/*\" build", diff --git a/packages/ide/jetbrains/build.gradle.kts b/packages/ide/jetbrains/build.gradle.kts index 26239d826..4836b2b55 100644 --- a/packages/ide/jetbrains/build.gradle.kts +++ b/packages/ide/jetbrains/build.gradle.kts @@ -9,7 +9,7 @@ plugins { } group = "dev.zenstack" -version = "2.11.3" +version = "2.11.4" repositories { mavenCentral() diff --git a/packages/ide/jetbrains/package.json b/packages/ide/jetbrains/package.json index 92d920f05..e5aeb55b9 100644 --- a/packages/ide/jetbrains/package.json +++ b/packages/ide/jetbrains/package.json @@ -1,6 +1,6 @@ { "name": "jetbrains", - "version": "2.11.3", + "version": "2.11.4", "displayName": "ZenStack JetBrains IDE Plugin", "description": "ZenStack JetBrains IDE plugin", "homepage": "https://zenstack.dev", diff --git a/packages/language/package.json b/packages/language/package.json index ba4ff17d6..92275a610 100644 --- a/packages/language/package.json +++ b/packages/language/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/language", - "version": "2.11.3", + "version": "2.11.4", "displayName": "ZenStack modeling language compiler", "description": "ZenStack modeling language compiler", "homepage": "https://zenstack.dev", diff --git a/packages/misc/redwood/package.json b/packages/misc/redwood/package.json index ef1b0a424..eb1a59b89 100644 --- a/packages/misc/redwood/package.json +++ b/packages/misc/redwood/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/redwood", "displayName": "ZenStack RedwoodJS Integration", - "version": "2.11.3", + "version": "2.11.4", "description": "CLI and runtime for integrating ZenStack with RedwoodJS projects.", "repository": { "type": "git", diff --git a/packages/plugins/openapi/package.json b/packages/plugins/openapi/package.json index 7c52f92cc..0c1910db4 100644 --- a/packages/plugins/openapi/package.json +++ b/packages/plugins/openapi/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/openapi", "displayName": "ZenStack Plugin and Runtime for OpenAPI", - "version": "2.11.3", + "version": "2.11.4", "description": "ZenStack plugin and runtime supporting OpenAPI", "main": "index.js", "repository": { diff --git a/packages/plugins/swr/package.json b/packages/plugins/swr/package.json index 7bac3daa2..530a7aee9 100644 --- a/packages/plugins/swr/package.json +++ b/packages/plugins/swr/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/swr", "displayName": "ZenStack plugin for generating SWR hooks", - "version": "2.11.3", + "version": "2.11.4", "description": "ZenStack plugin for generating SWR hooks", "main": "index.js", "repository": { diff --git a/packages/plugins/tanstack-query/package.json b/packages/plugins/tanstack-query/package.json index 004107b4e..902bdc710 100644 --- a/packages/plugins/tanstack-query/package.json +++ b/packages/plugins/tanstack-query/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/tanstack-query", "displayName": "ZenStack plugin for generating tanstack-query hooks", - "version": "2.11.3", + "version": "2.11.4", "description": "ZenStack plugin for generating tanstack-query hooks", "main": "index.js", "exports": { diff --git a/packages/plugins/trpc/package.json b/packages/plugins/trpc/package.json index bc0eb36f6..6ef5c5f18 100644 --- a/packages/plugins/trpc/package.json +++ b/packages/plugins/trpc/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/trpc", "displayName": "ZenStack plugin for tRPC", - "version": "2.11.3", + "version": "2.11.4", "description": "ZenStack plugin for tRPC", "main": "index.js", "repository": { diff --git a/packages/runtime/package.json b/packages/runtime/package.json index e32edc9bc..0de65a18a 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/runtime", "displayName": "ZenStack Runtime Library", - "version": "2.11.3", + "version": "2.11.4", "description": "Runtime of ZenStack for both client-side and server-side environments.", "repository": { "type": "git", diff --git a/packages/schema/package.json b/packages/schema/package.json index c45fdbaa3..431390758 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -3,7 +3,7 @@ "publisher": "zenstack", "displayName": "ZenStack Language Tools", "description": "FullStack enhancement for Prisma ORM: seamless integration from database to UI", - "version": "2.11.3", + "version": "2.11.4", "author": { "name": "ZenStack Team" }, diff --git a/packages/schema/tests/schema/all-features.zmodel b/packages/schema/tests/schema/all-features.zmodel index b567093fe..8fbe6031d 100644 --- a/packages/schema/tests/schema/all-features.zmodel +++ b/packages/schema/tests/schema/all-features.zmodel @@ -36,15 +36,15 @@ abstract model Base { * Model for a space in which users can collaborate on Lists and Todos */ model Space extends Base { - id String @id @default(uuid()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - name String @length(4, 50) - slug String @length(4, 16) - owner User? @relation(fields: [ownerId], references: [id]) - ownerId String? - members SpaceUser[] - lists List[] + id String @id @default(uuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + name String @length(4, 50) + slug String @length(4, 16) + owner User? @relation(fields: [ownerId], references: [id]) + ownerId String? + members SpaceUser[] + lists List[] unsupported Unsupported('foo') // require login @@ -66,14 +66,14 @@ model Space extends Base { * Model representing membership of a user in a space */ model SpaceUser { - id String @id @default(uuid()) + id String @id @default(uuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade) - spaceId String - user User @relation(fields: [userId], references: [id], onDelete: Cascade) - userId String - role UserRole + space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade) + spaceId String + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + userId String + role UserRole @@unique([userId, spaceId]) // require login @@ -92,18 +92,18 @@ model SpaceUser { * Model for a user */ model User { - id String @id @default(uuid()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - email String @unique @email - password String? @password @omit + id String @id @default(uuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + email String @unique @email + password String? @password @omit emailVerified DateTime? - name String? - ownedSpaces Space[] - spaces SpaceUser[] - image String? @url - lists List[] - todos Todo[] + name String? + ownedSpaces Space[] + spaces SpaceUser[] + image String? @url + lists List[] + todos Todo[] // can be created by anyone, even not logged in @@allow('create', true) @@ -119,16 +119,16 @@ model User { * Model for a Todo list */ model List { - id String @id @default(uuid()) + id String @id @default(uuid()) createdAt DateTime @default(now()) updatedAt DateTime @updatedAt - space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade) - spaceId String - owner User @relation(fields: [ownerId], references: [id], onDelete: Cascade) - ownerId String - title String @length(1, 100) - private Boolean @default(false) - todos Todo[] + space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade) + spaceId String + owner User @relation(fields: [ownerId], references: [id], onDelete: Cascade) + ownerId String + title String @length(1, 100) + private Boolean @default(false) + todos Todo[] // require login @@deny('all', auth() == null) @@ -151,14 +151,14 @@ model List { * Model for a single Todo */ model Todo { - id String @id @default(uuid()) - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - owner User @relation(fields: [ownerId], references: [id], onDelete: Cascade) - ownerId String - list List @relation(fields: [listId], references: [id], onDelete: Cascade) - listId String - title String @length(1, 100) + id String @id @default(uuid()) + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + owner User @relation(fields: [ownerId], references: [id], onDelete: Cascade) + ownerId String + list List @relation(fields: [listId], references: [id], onDelete: Cascade) + listId String + title String @length(1, 100) completedAt DateTime? // require login @@ -173,7 +173,18 @@ model Todo { } view SpaceWithMembers { - id String @unique + id String @unique name String slug String } + +model Image { + id Int @id @default(autoincrement()) + metadata Json +} + +type Metadata { + width Int + height Int + format String +} \ No newline at end of file diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 1e43cb73c..68c88c22f 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/sdk", - "version": "2.11.3", + "version": "2.11.4", "description": "ZenStack plugin development SDK", "main": "index.js", "scripts": { diff --git a/packages/sdk/src/zmodel-code-generator.ts b/packages/sdk/src/zmodel-code-generator.ts index 96aaa87d9..e64163a99 100644 --- a/packages/sdk/src/zmodel-code-generator.ts +++ b/packages/sdk/src/zmodel-code-generator.ts @@ -39,6 +39,9 @@ import { StringLiteral, ThisExpr, UnaryExpr, + TypeDef, + TypeDefField, + TypeDefFieldType, } from './ast'; import { resolved } from './utils'; @@ -177,10 +180,10 @@ ${ast.fields.map((x) => this.indent + this.generate(x)).join('\n')}${ }`; } - private fieldType(type: DataModelFieldType) { + private fieldType(type: DataModelFieldType | TypeDefFieldType) { const baseType = type.type ? type.type - : type.unsupported + : type.$type == 'DataModelFieldType' && type.unsupported ? 'Unsupported(' + this.generate(type.unsupported.value) + ')' : type.reference?.$refText; return `${baseType}${type.array ? '[]' : ''}${type.optional ? '?' : ''}`; @@ -322,6 +325,24 @@ ${ast.fields.map((x) => this.indent + this.generate(x)).join('\n')}${ return `${ast.type ?? ast.reference?.$refText}${ast.array ? '[]' : ''}`; } + @gen(TypeDef) + private _generateTypeDef(ast: TypeDef) { + return `type ${ast.name} { +${ast.fields.map((x) => this.indent + this.generate(x)).join('\n')}${ + ast.attributes.length > 0 + ? '\n\n' + ast.attributes.map((x) => this.indent + this.generate(x)).join('\n') + : '' + } +}`; + } + + @gen(TypeDefField) + private _generateTypeDefField(ast: TypeDefField) { + return `${ast.name} ${this.fieldType(ast.type)}${ + ast.attributes.length > 0 ? ' ' + ast.attributes.map((x) => this.generate(x)).join(' ') : '' + }`; + } + private argument(ast: Argument) { return this.generate(ast.value); } diff --git a/packages/server/package.json b/packages/server/package.json index 82a9f9fec..43a06090a 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/server", - "version": "2.11.3", + "version": "2.11.4", "displayName": "ZenStack Server-side Adapters", "description": "ZenStack server-side adapters", "homepage": "https://zenstack.dev", diff --git a/packages/testtools/package.json b/packages/testtools/package.json index 519ec062a..678049e26 100644 --- a/packages/testtools/package.json +++ b/packages/testtools/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/testtools", - "version": "2.11.3", + "version": "2.11.4", "description": "ZenStack Test Tools", "main": "index.js", "private": true,