diff --git a/README.md b/README.md index 0b3737962..1a86f318c 100644 --- a/README.md +++ b/README.md @@ -90,18 +90,26 @@ async function getPosts(userId: string) { Server adapter packages help you wrap an access-control-enabled Prisma client into backend CRUD APIs that can be safely called from the frontend. Here's an example for Next.js: ```ts -// pages/api/model/[...path].ts +// /src/app/api/model/[...path]/route.ts -import { requestHandler } from '@zenstackhq/next'; +import { NextRequestHandler } from '@zenstackhq/server/next'; +import type { NextRequest } from 'next/server'; import { enhance } from '@zenstackhq/runtime'; import { getSessionUser } from '@lib/auth'; import { prisma } from '@lib/db'; // Mount Prisma-style APIs: "/api/model/post/findMany", "/api/model/post/create", etc. // Can be configured to provide standard RESTful APIs (using JSON:API) instead. -export default requestHandler({ - getPrisma: (req, res) => enhance(prisma, { user: getSessionUser(req, res) }), -}); + +function getPrisma(req: NextRequest) { + // getSessionUser extracts the current session user from the request, its + // implementation depends on your auth solution + return enhance(prisma, { user: getSessionUser(req) }); +} + +const handler = NextRequestHandler({ getPrisma, useAppDir: true }); + +export { handler as GET, handler as POST, handler as PUT, handler as PATCH, handler as DELETE }; ``` ### 4. Generated client libraries (hooks) for data access diff --git a/package.json b/package.json index 8a27d77d2..3008b9ee7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zenstack-monorepo", - "version": "2.17.1", + "version": "2.17.2", "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 9eb53b7ae..158a234ba 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.17.1" +version = "2.17.2" repositories { mavenCentral() diff --git a/packages/ide/jetbrains/package.json b/packages/ide/jetbrains/package.json index 9fea1d32d..9649b9f6c 100644 --- a/packages/ide/jetbrains/package.json +++ b/packages/ide/jetbrains/package.json @@ -1,6 +1,6 @@ { "name": "jetbrains", - "version": "2.17.1", + "version": "2.17.2", "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 65277aa62..3732d07b7 100644 --- a/packages/language/package.json +++ b/packages/language/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/language", - "version": "2.17.1", + "version": "2.17.2", "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 47f9561e1..6b5d3b269 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.17.1", + "version": "2.17.2", "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 1ebb81890..93d0a2fa7 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.17.1", + "version": "2.17.2", "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 cc1059c11..8bf66694a 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.17.1", + "version": "2.17.2", "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 b6e73001c..8793764b9 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.17.1", + "version": "2.17.2", "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 9ca54e675..61b4d280f 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.17.1", + "version": "2.17.2", "description": "ZenStack plugin for tRPC", "main": "index.js", "repository": { diff --git a/packages/runtime/package.json b/packages/runtime/package.json index 6f32dbde5..1fc1d7c9b 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/runtime", "displayName": "ZenStack Runtime Library", - "version": "2.17.1", + "version": "2.17.2", "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 21f758a2d..dc516b6b7 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.17.1", + "version": "2.17.2", "author": { "name": "ZenStack Team" }, diff --git a/packages/schema/src/plugins/enhancer/enhance/index.ts b/packages/schema/src/plugins/enhancer/enhance/index.ts index f99bc58d2..313674569 100644 --- a/packages/schema/src/plugins/enhancer/enhance/index.ts +++ b/packages/schema/src/plugins/enhancer/enhance/index.ts @@ -1,5 +1,5 @@ import { DELEGATE_AUX_RELATION_PREFIX } from '@zenstackhq/runtime'; -import { upperCaseFirst } from '@zenstackhq/runtime/local-helpers'; +import { invariant, upperCaseFirst } from '@zenstackhq/runtime/local-helpers'; import { PluginError, getAttribute, @@ -569,6 +569,32 @@ export type Enhanced = private async processClientTypesNewPrismaGenerator(prismaClientDir: string, delegateInfo: DelegateInfo) { const project = new Project(); + // remove delegate_aux_* fields from the prismaNamespace.ts + const internalFilename = `${prismaClientDir}/internal/prismaNamespace.ts` + const internalFilenameFixed = `${prismaClientDir}/internal/prismaNamespace-fixed.ts` + const internalSf = project.addSourceFileAtPath(internalFilename); + const syntaxList = internalSf.getChildren()[0]; + if (!Node.isSyntaxList(syntaxList)) { + throw new PluginError(name, `Unexpected syntax list structure in ${internalFilename}`); + } + const statements: (string | StatementStructures)[] = []; + + syntaxList.getChildren().forEach((node) => { + if (Node.isVariableStatement(node)) { + statements.push(this.transformVariableStatementProps(node)); + } else { + statements.push(node.getText()); + } + }); + const structure = internalSf.getStructure(); + structure.statements = statements; + + const internalSfNew = project.createSourceFile(internalFilenameFixed, structure, { + overwrite: true, + }); + await internalSfNew.save(); + fs.renameSync(internalFilenameFixed, internalFilename); + // Create a shared file for all JSON fields type definitions const jsonFieldsFile = project.createSourceFile(path.join(this.outDir, 'json-types.ts'), undefined, { overwrite: true, @@ -727,6 +753,27 @@ export type Enhanced = return structure; } + private transformVariableStatementProps(variable: VariableStatement) { + const structure = variable.getStructure(); + + // remove `delegate_aux_*` fields from the variable's initializer + const auxFields = this.findAuxProps(variable); + if (auxFields.length > 0) { + structure.declarations.forEach((variable) => { + if (variable.initializer) { + let source = variable.initializer; + auxFields.forEach((f) => { + invariant(typeof source === 'string'); + source = this.removeFromSource(source, f.getText()); + }); + variable.initializer = source; + } + }); + } + + return structure; + } + private transformInterface(iface: InterfaceDeclaration, delegateInfo: DelegateInfo) { const structure = iface.getStructure(); diff --git a/packages/sdk/package.json b/packages/sdk/package.json index b21dd2d12..bfee4b4f7 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/sdk", - "version": "2.17.1", + "version": "2.17.2", "description": "ZenStack plugin development SDK", "main": "index.js", "scripts": { diff --git a/packages/server/package.json b/packages/server/package.json index f5c4acc3e..b1e30100f 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/server", - "version": "2.17.1", + "version": "2.17.2", "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 83f204d60..af9bc21e8 100644 --- a/packages/testtools/package.json +++ b/packages/testtools/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/testtools", - "version": "2.17.1", + "version": "2.17.2", "description": "ZenStack Test Tools", "main": "index.js", "private": true,