diff --git a/package.json b/package.json index 627c49c3f..2187faae7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zenstack-monorepo", - "version": "1.0.0-alpha.94", + "version": "1.0.0-alpha.95", "description": "", "scripts": { "build": "pnpm -r build", diff --git a/packages/language/package.json b/packages/language/package.json index cd115c039..2b1315b24 100644 --- a/packages/language/package.json +++ b/packages/language/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/language", - "version": "1.0.0-alpha.94", + "version": "1.0.0-alpha.95", "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 7aed87e5e..a9b32f2e2 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/next", - "version": "1.0.0-alpha.94", + "version": "1.0.0-alpha.95", "displayName": "ZenStack Next.js integration", "description": "ZenStack Next.js integration", "homepage": "https://zenstack.dev", diff --git a/packages/plugins/openapi/package.json b/packages/plugins/openapi/package.json index b3b73ce7a..9cbedf8d6 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": "1.0.0-alpha.94", + "version": "1.0.0-alpha.95", "description": "ZenStack plugin and runtime supporting OpenAPI", "main": "index.js", "repository": { diff --git a/packages/plugins/react/package.json b/packages/plugins/react/package.json index be5e4fc58..405ba749e 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.94", + "version": "1.0.0-alpha.95", "description": "ZenStack plugin and runtime for ReactJS", "main": "index.js", "repository": { diff --git a/packages/plugins/react/src/generator/react-query.ts b/packages/plugins/react/src/generator/react-query.ts index 3c60db37e..c54bdf30c 100644 --- a/packages/plugins/react/src/generator/react-query.ts +++ b/packages/plugins/react/src/generator/react-query.ts @@ -1,7 +1,7 @@ import { DMMF } from '@prisma/generator-helper'; import { getDataModels, PluginError, PluginOptions } from '@zenstackhq/sdk'; import { DataModel, Model } from '@zenstackhq/sdk/ast'; -import { paramCase, pascalCase } from 'change-case'; +import { camelCase, paramCase, pascalCase } from 'change-case'; import * as path from 'path'; import { Project, SourceFile, VariableDeclarationKind } from 'ts-morph'; @@ -71,7 +71,9 @@ function generateQueryHook( func.addStatements([ 'const { endpoint } = useContext(RequestHandlerContext);', - `return request.query<${returnType}>('${model}', \`\${endpoint}/${model}/${operation}\`, args, options);`, + `return request.query<${returnType}>('${model}', \`\${endpoint}/${camelCase( + model + )}/${operation}\`, args, options);`, ]); } @@ -117,7 +119,7 @@ function generateMutationHook( initializer: ` request.${httpVerb}Mutation<${argsType}, ${ overrideReturnType ?? model - }>('${model}', \`\${endpoint}/${model}/${operation}\`, options, invalidateQueries) + }>('${model}', \`\${endpoint}/${camelCase(model)}/${operation}\`, options, invalidateQueries) `, }, ], @@ -173,7 +175,7 @@ function generateModelHooks(project: Project, outDir: string, model: DataModel, // createMany if (mapping.createMany) { - generateMutationHook(sf, model.name, 'createMany', 'post'); + generateMutationHook(sf, model.name, 'createMany', 'post', 'Prisma.BatchPayload'); } // findMany diff --git a/packages/plugins/react/src/runtime/react-query.ts b/packages/plugins/react/src/runtime/react-query.ts index 7b22eca72..6fd04f329 100644 --- a/packages/plugins/react/src/runtime/react-query.ts +++ b/packages/plugins/react/src/runtime/react-query.ts @@ -1,5 +1,13 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { useMutation, UseMutationOptions, useQuery, useQueryClient, UseQueryOptions } from '@tanstack/react-query'; +import { + useMutation, + useQuery, + useQueryClient, + type MutateFunction, + type QueryClient, + type UseMutationOptions, + type UseQueryOptions, +} from '@tanstack/react-query'; import { marshal, registerSerializers } from '../serialization-utils'; import { fetcher, makeUrl } from './utils'; @@ -43,19 +51,17 @@ export function postMutation( invalidateQueries = true ) { const queryClient = useQueryClient(); - const mutation = useMutation({ - mutationFn: (data: any) => - fetcher(url, { - method: 'POST', - headers: { - 'content-type': 'application/json', - }, - body: marshal(data), - }), - ...options, - onSuccess: invalidateQueries ? () => queryClient.invalidateQueries([QUERY_KEY_PREFIX + model]) : undefined, - }); + const mutationFn = (data: any) => + fetcher(url, { + method: 'POST', + headers: { + 'content-type': 'application/json', + }, + body: marshal(data), + }); + const finalOptions = mergeOptions(model, options, invalidateQueries, mutationFn, queryClient); + const mutation = useMutation(finalOptions); return mutation; } @@ -75,19 +81,17 @@ export function putMutation( invalidateQueries = true ) { const queryClient = useQueryClient(); - const mutation = useMutation({ - mutationFn: (data: any) => - fetcher(url, { - method: 'PUT', - headers: { - 'content-type': 'application/json', - }, - body: marshal(data), - }), - ...options, - onSuccess: invalidateQueries ? () => queryClient.invalidateQueries([QUERY_KEY_PREFIX + model]) : undefined, - }); + const mutationFn = (data: any) => + fetcher(url, { + method: 'PUT', + headers: { + 'content-type': 'application/json', + }, + body: marshal(data), + }); + const finalOptions = mergeOptions(model, options, invalidateQueries, mutationFn, queryClient); + const mutation = useMutation(finalOptions); return mutation; } @@ -107,14 +111,31 @@ export function deleteMutation( invalidateQueries = true ) { const queryClient = useQueryClient(); - const mutation = useMutation({ - mutationFn: (data: any) => - fetcher(makeUrl(url, data), { - method: 'DELETE', - }), - ...options, - onSuccess: invalidateQueries ? () => queryClient.invalidateQueries([QUERY_KEY_PREFIX + model]) : undefined, - }); + const mutationFn = (data: any) => + fetcher(makeUrl(url, data), { + method: 'DELETE', + }); + const finalOptions = mergeOptions(model, options, invalidateQueries, mutationFn, queryClient); + const mutation = useMutation(finalOptions); return mutation; } + +function mergeOptions( + model: string, + options: Omit, 'mutationFn'> | undefined, + invalidateQueries: boolean, + mutationFn: MutateFunction, + queryClient: QueryClient +): UseMutationOptions { + const result = { ...options, mutationFn }; + if (options?.onSuccess || invalidateQueries) { + result.onSuccess = (...args) => { + if (invalidateQueries) { + queryClient.invalidateQueries([QUERY_KEY_PREFIX + model]); + } + return options?.onSuccess?.(...args); + }; + } + return result; +} diff --git a/packages/plugins/trpc/package.json b/packages/plugins/trpc/package.json index 0e28167f6..15f3a2afc 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.94", + "version": "1.0.0-alpha.95", "description": "ZenStack plugin for tRPC", "main": "index.js", "repository": { diff --git a/packages/runtime/package.json b/packages/runtime/package.json index d8109c8a8..e700671ba 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.94", + "version": "1.0.0-alpha.95", "description": "Runtime of ZenStack for both client-side and server-side environments.", "repository": { "type": "git", diff --git a/packages/runtime/src/enhancements/proxy.ts b/packages/runtime/src/enhancements/proxy.ts index 19c799fee..8dd386030 100644 --- a/packages/runtime/src/enhancements/proxy.ts +++ b/packages/runtime/src/enhancements/proxy.ts @@ -165,7 +165,7 @@ export function makeProxy( name = 'unnamed_enhancer', inTransaction = false ) { - const models = Object.keys(modelMeta.fields); + const models = Object.keys(modelMeta.fields).map((k) => k.toLowerCase()); const proxy = new Proxy(prisma, { get: (target: any, prop: string | symbol, receiver: any) => { // enhancer metadata @@ -206,7 +206,7 @@ export function makeProxy( } } - if (typeof prop !== 'string' || prop.startsWith('$') || !models.includes(prop)) { + if (typeof prop !== 'string' || prop.startsWith('$') || !models.includes(prop.toLowerCase())) { // skip non-model fields return Reflect.get(target, prop, receiver); } diff --git a/packages/schema/package.json b/packages/schema/package.json index dbe7b4134..c388f69fe 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.94", + "version": "1.0.0-alpha.95", "author": { "name": "ZenStack Team" }, diff --git a/packages/sdk/package.json b/packages/sdk/package.json index ea2aab3ad..753a7e003 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/sdk", - "version": "1.0.0-alpha.94", + "version": "1.0.0-alpha.95", "description": "ZenStack plugin development SDK", "main": "index.js", "scripts": { diff --git a/packages/server/package.json b/packages/server/package.json index bf028b62b..8c8ed92e4 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/server", - "version": "1.0.0-alpha.94", + "version": "1.0.0-alpha.95", "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 00a875d51..a9df1d039 100644 --- a/packages/testtools/package.json +++ b/packages/testtools/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/testtools", - "version": "1.0.0-alpha.94", + "version": "1.0.0-alpha.95", "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 7bbd5a7ce..a8781fb7b 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.94", + "version": "1.0.0-alpha.95", "license": "MIT", "dependencies": { "@types/bcryptjs": "^2.4.2", @@ -158,7 +158,7 @@ }, "../../../packages/schema/dist": { "name": "zenstack", - "version": "1.0.0-alpha.94", + "version": "1.0.0-alpha.95", "hasInstallScript": true, "license": "MIT", "dependencies": {