From e272c04dd9c1586ea1fcc375ac988202d971a4d3 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Fri, 3 Mar 2023 13:35:39 +0800 Subject: [PATCH 1/2] fix: trpc mutation route should return undefined when result is not readable --- package.json | 8 +++--- packages/language/package.json | 2 +- packages/next/package.json | 2 +- packages/plugins/react/package.json | 2 +- .../react/src/react-hooks-generator.ts | 4 +-- packages/plugins/trpc/package.json | 2 +- packages/plugins/trpc/src/helpers.ts | 28 ++++++++++++++++--- packages/runtime/package.json | 2 +- .../src/enhancements/policy/policy-utils.ts | 4 +-- packages/schema/package.json | 2 +- packages/sdk/package.json | 2 +- packages/sdk/src/constants.ts | 10 +++++++ packages/testtools/package.json | 2 +- tests/integration/test-run/package-lock.json | 4 +-- 14 files changed, 52 insertions(+), 22 deletions(-) diff --git a/package.json b/package.json index 81a8c6e8e..3b0eb2bed 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "name": "zenstack-monorepo", - "version": "1.0.0-alpha.49", + "version": "1.0.0-alpha.51", "description": "", "scripts": { "build": "pnpm -r build", "test": "pnpm -r run test --silent", "lint": "pnpm -r lint", - "publish-all": "pnpm --filter \"./packages/**\" -r publish", - "publish-dev": "pnpm --filter \"./packages/**\" -r publish --tag dev", - "publish-canary": "pnpm --filter \"./packages/**\" -r publish --tag canary" + "publish-all": "pnpm --filter \"./packages/**\" -r publish --access public", + "publish-dev": "pnpm --filter \"./packages/**\" -r publish --access public --tag dev", + "publish-canary": "pnpm --filter \"./packages/**\" -r publish --access public --tag canary" }, "keywords": [], "author": "", diff --git a/packages/language/package.json b/packages/language/package.json index 3f5a93c11..53c392420 100644 --- a/packages/language/package.json +++ b/packages/language/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/language", - "version": "1.0.0-alpha.49", + "version": "1.0.0-alpha.51", "displayName": "ZenStack modeling language compiler", "description": "ZenStack modeling language compiler", "homepage": "https://zenstack.dev", diff --git a/packages/next/package.json b/packages/next/package.json index 5c36ebad2..7dca9998c 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/next", - "version": "1.0.0-alpha.49", + "version": "1.0.0-alpha.51", "displayName": "ZenStack Next.js integration", "description": "ZenStack Next.js integration", "homepage": "https://zenstack.dev", diff --git a/packages/plugins/react/package.json b/packages/plugins/react/package.json index d36247015..4041b190a 100644 --- a/packages/plugins/react/package.json +++ b/packages/plugins/react/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/react", "displayName": "ZenStack plugin and runtime for ReactJS", - "version": "1.0.0-alpha.49", + "version": "1.0.0-alpha.51", "description": "ZenStack plugin and runtime for ReactJS", "main": "index.js", "repository": { diff --git a/packages/plugins/react/src/react-hooks-generator.ts b/packages/plugins/react/src/react-hooks-generator.ts index cca0a6e34..5b2a8c708 100644 --- a/packages/plugins/react/src/react-hooks-generator.ts +++ b/packages/plugins/react/src/react-hooks-generator.ts @@ -1,5 +1,5 @@ import { DMMF } from '@prisma/generator-helper'; -import { PluginError, PluginOptions } from '@zenstackhq/sdk'; +import { CrudFailureReason, PluginError, PluginOptions } from '@zenstackhq/sdk'; import { DataModel, isDataModel, Model } from '@zenstackhq/sdk/ast'; import { camelCase, paramCase } from 'change-case'; import * as path from 'path'; @@ -35,7 +35,7 @@ function wrapReadbackErrorCheck(code: string) { return `try { ${code} } catch (err: any) { - if (err.info?.prisma && err.info?.code === 'P2004' && err.info?.reason === 'RESULT_NOT_READABLE') { + if (err.info?.prisma && err.info?.code === 'P2004' && err.info?.reason === '${CrudFailureReason.RESULT_NOT_READABLE}') { // unable to readback data return undefined; } else { diff --git a/packages/plugins/trpc/package.json b/packages/plugins/trpc/package.json index 9ea9ffb63..1efa62e22 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": "1.0.0-alpha.49", + "version": "1.0.0-alpha.51", "description": "ZenStack plugin for tRPC", "main": "index.js", "repository": { diff --git a/packages/plugins/trpc/src/helpers.ts b/packages/plugins/trpc/src/helpers.ts index 8eb4e75d8..b7be4dc29 100644 --- a/packages/plugins/trpc/src/helpers.ts +++ b/packages/plugins/trpc/src/helpers.ts @@ -1,4 +1,5 @@ import { DMMF } from '@prisma/generator-helper'; +import { CrudFailureReason } from '@zenstackhq/sdk'; import { CodeBlockWriter, SourceFile } from 'ts-morph'; import { uncapitalizeFirstLetter } from './utils/uncapitalizeFirstLetter'; @@ -24,11 +25,30 @@ export function generateProcedure( baseOpType: string ) { const procType = getProcedureTypeByOpName(baseOpType); - writer.write(` - ${opType}: procedure.input(${typeName}).${procType}(({ctx, input}) => db(ctx).${uncapitalizeFirstLetter( - modelName - )}.${opType.replace('One', '')}(input)), + const prismaMethod = opType.replace('One', ''); + + if (procType === 'query') { + writer.write(` + ${opType}: procedure.input(${typeName}).query(({ctx, input}) => db(ctx).${uncapitalizeFirstLetter( + modelName + )}.${prismaMethod}(input)), `); + } else if (procType === 'mutation') { + writer.write(` + ${opType}: procedure.input(${typeName}).mutation(async ({ctx, input}) => { + try { + return await db(ctx).${uncapitalizeFirstLetter(modelName)}.${prismaMethod}(input); + } catch (err: any) { + if (err.code === 'P2004' && err.meta?.reason === '${CrudFailureReason.RESULT_NOT_READABLE}') { + // unable to readback data + return undefined; + } else { + throw err; + } + } + }), + `); + } } export function generateRouterSchemaImports(sourceFile: SourceFile, name: string) { diff --git a/packages/runtime/package.json b/packages/runtime/package.json index e15bd897c..c6889c232 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/runtime", "displayName": "ZenStack Runtime Library", - "version": "1.0.0-alpha.49", + "version": "1.0.0-alpha.51", "description": "Runtime of ZenStack for both client-side and server-side environments.", "repository": { "type": "git", diff --git a/packages/runtime/src/enhancements/policy/policy-utils.ts b/packages/runtime/src/enhancements/policy/policy-utils.ts index 892638753..4c0ec1933 100644 --- a/packages/runtime/src/enhancements/policy/policy-utils.ts +++ b/packages/runtime/src/enhancements/policy/policy-utils.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { PrismaClientKnownRequestError, PrismaClientUnknownRequestError } from '@prisma/client/runtime'; -import { AUXILIARY_FIELDS, TRANSACTION_FIELD_NAME } from '@zenstackhq/sdk'; +import { AUXILIARY_FIELDS, CrudFailureReason, TRANSACTION_FIELD_NAME } from '@zenstackhq/sdk'; import { camelCase } from 'change-case'; import cuid from 'cuid'; import deepcopy from 'deepcopy'; @@ -647,7 +647,7 @@ export class PolicyUtil { deniedByPolicy(model: string, operation: PolicyOperationKind, extra?: string) { return new PrismaClientKnownRequestError( `denied by policy: ${model} entities failed '${operation}' check${extra ? ', ' + extra : ''}`, - { clientVersion: getVersion(), code: 'P2004', meta: { reason: 'RESULT_NOT_READABLE' } } + { clientVersion: getVersion(), code: 'P2004', meta: { reason: CrudFailureReason.RESULT_NOT_READABLE } } ); } diff --git a/packages/schema/package.json b/packages/schema/package.json index 7e4e67395..308312d7b 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -3,7 +3,7 @@ "publisher": "zenstack", "displayName": "ZenStack Language Tools", "description": "A toolkit for building secure CRUD apps with Next.js + Typescript", - "version": "1.0.0-alpha.49", + "version": "1.0.0-alpha.51", "author": { "name": "ZenStack Team" }, diff --git a/packages/sdk/package.json b/packages/sdk/package.json index ae5c49917..b63247401 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/sdk", - "version": "1.0.0-alpha.49", + "version": "1.0.0-alpha.51", "description": "ZenStack plugin development SDK", "main": "index.js", "scripts": { diff --git a/packages/sdk/src/constants.ts b/packages/sdk/src/constants.ts index 043df9589..038a7cebe 100644 --- a/packages/sdk/src/constants.ts +++ b/packages/sdk/src/constants.ts @@ -12,3 +12,13 @@ export const GUARD_FIELD_NAME = 'zenstack_guard'; * All Auxiliary fields. */ export const AUXILIARY_FIELDS = [TRANSACTION_FIELD_NAME, GUARD_FIELD_NAME]; + +/** + * Reasons for a CRUD operation to fail. + */ +export enum CrudFailureReason { + /** + * CRUD suceeded but the result was not readable. + */ + RESULT_NOT_READABLE = 'RESULT_NOT_READABLE', +} diff --git a/packages/testtools/package.json b/packages/testtools/package.json index a71205c72..f6be441fd 100644 --- a/packages/testtools/package.json +++ b/packages/testtools/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/testtools", - "version": "1.0.0-alpha.49", + "version": "1.0.0-alpha.51", "description": "ZenStack Test Tools", "main": "index.js", "publishConfig": { diff --git a/tests/integration/test-run/package-lock.json b/tests/integration/test-run/package-lock.json index c6d601af4..a8e497c6c 100644 --- a/tests/integration/test-run/package-lock.json +++ b/tests/integration/test-run/package-lock.json @@ -126,7 +126,7 @@ }, "../../../packages/runtime/dist": { "name": "@zenstackhq/runtime", - "version": "1.0.0-alpha.49", + "version": "1.0.0-alpha.51", "license": "MIT", "dependencies": { "@types/bcryptjs": "^2.4.2", @@ -157,7 +157,7 @@ }, "../../../packages/schema/dist": { "name": "zenstack", - "version": "1.0.0-alpha.49", + "version": "1.0.0-alpha.51", "hasInstallScript": true, "license": "MIT", "dependencies": { From efddc0dd0f8c001c773660701ec6edb0c3c27f98 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Fri, 3 Mar 2023 13:36:42 +0800 Subject: [PATCH 2/2] bump version --- package.json | 2 +- packages/language/package.json | 2 +- packages/next/package.json | 2 +- packages/plugins/react/package.json | 2 +- packages/plugins/trpc/package.json | 2 +- packages/runtime/package.json | 2 +- packages/schema/package.json | 2 +- packages/sdk/package.json | 2 +- packages/testtools/package.json | 2 +- tests/integration/test-run/package-lock.json | 4 ++-- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 3b0eb2bed..b8423d0d0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zenstack-monorepo", - "version": "1.0.0-alpha.51", + "version": "1.0.0-alpha.52", "description": "", "scripts": { "build": "pnpm -r build", diff --git a/packages/language/package.json b/packages/language/package.json index 53c392420..d4c831798 100644 --- a/packages/language/package.json +++ b/packages/language/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/language", - "version": "1.0.0-alpha.51", + "version": "1.0.0-alpha.52", "displayName": "ZenStack modeling language compiler", "description": "ZenStack modeling language compiler", "homepage": "https://zenstack.dev", diff --git a/packages/next/package.json b/packages/next/package.json index 7dca9998c..e99e8071d 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/next", - "version": "1.0.0-alpha.51", + "version": "1.0.0-alpha.52", "displayName": "ZenStack Next.js integration", "description": "ZenStack Next.js integration", "homepage": "https://zenstack.dev", diff --git a/packages/plugins/react/package.json b/packages/plugins/react/package.json index 4041b190a..5f3345a71 100644 --- a/packages/plugins/react/package.json +++ b/packages/plugins/react/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/react", "displayName": "ZenStack plugin and runtime for ReactJS", - "version": "1.0.0-alpha.51", + "version": "1.0.0-alpha.52", "description": "ZenStack plugin and runtime for ReactJS", "main": "index.js", "repository": { diff --git a/packages/plugins/trpc/package.json b/packages/plugins/trpc/package.json index 1efa62e22..0cf9102f5 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": "1.0.0-alpha.51", + "version": "1.0.0-alpha.52", "description": "ZenStack plugin for tRPC", "main": "index.js", "repository": { diff --git a/packages/runtime/package.json b/packages/runtime/package.json index c6889c232..ce2c499f9 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/runtime", "displayName": "ZenStack Runtime Library", - "version": "1.0.0-alpha.51", + "version": "1.0.0-alpha.52", "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 308312d7b..6c15a14b2 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -3,7 +3,7 @@ "publisher": "zenstack", "displayName": "ZenStack Language Tools", "description": "A toolkit for building secure CRUD apps with Next.js + Typescript", - "version": "1.0.0-alpha.51", + "version": "1.0.0-alpha.52", "author": { "name": "ZenStack Team" }, diff --git a/packages/sdk/package.json b/packages/sdk/package.json index b63247401..ccddb719c 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/sdk", - "version": "1.0.0-alpha.51", + "version": "1.0.0-alpha.52", "description": "ZenStack plugin development SDK", "main": "index.js", "scripts": { diff --git a/packages/testtools/package.json b/packages/testtools/package.json index f6be441fd..95cd86f74 100644 --- a/packages/testtools/package.json +++ b/packages/testtools/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/testtools", - "version": "1.0.0-alpha.51", + "version": "1.0.0-alpha.52", "description": "ZenStack Test Tools", "main": "index.js", "publishConfig": { diff --git a/tests/integration/test-run/package-lock.json b/tests/integration/test-run/package-lock.json index a8e497c6c..65584b738 100644 --- a/tests/integration/test-run/package-lock.json +++ b/tests/integration/test-run/package-lock.json @@ -126,7 +126,7 @@ }, "../../../packages/runtime/dist": { "name": "@zenstackhq/runtime", - "version": "1.0.0-alpha.51", + "version": "1.0.0-alpha.52", "license": "MIT", "dependencies": { "@types/bcryptjs": "^2.4.2", @@ -157,7 +157,7 @@ }, "../../../packages/schema/dist": { "name": "zenstack", - "version": "1.0.0-alpha.51", + "version": "1.0.0-alpha.52", "hasInstallScript": true, "license": "MIT", "dependencies": {