diff --git a/package.json b/package.json index 4ac4b1699..604ed42ae 100644 --- a/package.json +++ b/package.json @@ -34,10 +34,8 @@ "eslint": "^8.57.0", "eslint-plugin-jest": "^28.2.0", "jest": "^29.7.0", - "replace-in-file": "^7.0.1", "rimraf": "^3.0.2", "ts-jest": "^29.1.1", - "ts-node": "^10.9.1", "tsup": "^8.0.1", "tsx": "^4.7.1", "typescript": "^5.4.4" diff --git a/packages/ide/jetbrains/build.gradle.kts b/packages/ide/jetbrains/build.gradle.kts index e5311c8b7..ff1ea417e 100644 --- a/packages/ide/jetbrains/build.gradle.kts +++ b/packages/ide/jetbrains/build.gradle.kts @@ -85,9 +85,9 @@ changelog { introduction.set( """ [ZenStack](https://zenstack.dev) is a toolkit that simplifies the development of a web app's backend. This plugin provides code editing experiences for its ZModel schema language. - + ## Features - + - Syntax highlighting - Error highlighting - Go to definition diff --git a/packages/language/src/zmodel.langium b/packages/language/src/zmodel.langium index 86d28276b..4b311bcba 100644 --- a/packages/language/src/zmodel.langium +++ b/packages/language/src/zmodel.langium @@ -164,7 +164,7 @@ Argument: DataModel: (comments+=TRIPLE_SLASH_COMMENT)* ( - ((isAbstract?='abstract')? 'model' name=RegularID + ((isAbstract?='abstract')? 'model' name=RegularID ('extends' superTypes+=[DataModel] (',' superTypes+=[DataModel])*)?) | ((isView?='view') name=RegularID) ) @@ -193,7 +193,7 @@ TypeDef: type TypeDefFieldTypes = TypeDef | Enum; TypeDefField: - (comments+=TRIPLE_SLASH_COMMENT)* + (comments+=TRIPLE_SLASH_COMMENT)* name=RegularIDWithTypeNames type=TypeDefFieldType (attributes+=DataModelFieldAttribute)*; TypeDefFieldType: @@ -208,7 +208,7 @@ Enum: 'enum' name=RegularID '{' ( fields+=EnumField | attributes+=DataModelAttribute - )+ + )+ '}'; EnumField: diff --git a/packages/plugins/openapi/package.json b/packages/plugins/openapi/package.json index 8a3473009..d95675219 100644 --- a/packages/plugins/openapi/package.json +++ b/packages/plugins/openapi/package.json @@ -28,15 +28,11 @@ "dependencies": { "@zenstackhq/runtime": "workspace:*", "@zenstackhq/sdk": "workspace:*", - "change-case": "^4.1.2", - "lower-case-first": "^2.0.2", "openapi-types": "^12.1.0", "semver": "^7.5.2", - "tiny-invariant": "^1.3.1", "ts-pattern": "^4.3.0", - "upper-case-first": "^2.0.2", "yaml": "^2.2.2", - "zod": "^3.22.4", + "zod": "^3.22.4", "zod-validation-error": "^1.5.0" }, "devDependencies": { diff --git a/packages/plugins/openapi/src/rest-generator.ts b/packages/plugins/openapi/src/rest-generator.ts index 88768b3e8..5a1344c2b 100644 --- a/packages/plugins/openapi/src/rest-generator.ts +++ b/packages/plugins/openapi/src/rest-generator.ts @@ -26,12 +26,11 @@ import { TypeDefFieldType, } from '@zenstackhq/sdk/ast'; import type { DMMF } from '@zenstackhq/sdk/prisma'; +import { invariant, lowerCaseFirst } from '@zenstackhq/runtime/local-helpers'; import fs from 'fs'; -import { lowerCaseFirst } from 'lower-case-first'; import type { OpenAPIV3_1 as OAPI } from 'openapi-types'; import path from 'path'; import pluralize from 'pluralize'; -import invariant from 'tiny-invariant'; import { match, P } from 'ts-pattern'; import YAML from 'yaml'; import { name } from '.'; diff --git a/packages/plugins/openapi/src/rpc-generator.ts b/packages/plugins/openapi/src/rpc-generator.ts index cb3b9ead1..5b47b810f 100644 --- a/packages/plugins/openapi/src/rpc-generator.ts +++ b/packages/plugins/openapi/src/rpc-generator.ts @@ -11,13 +11,11 @@ import { resolveAggregateOperationSupport, } from '@zenstackhq/sdk/dmmf-helpers'; import { supportCreateMany, type DMMF } from '@zenstackhq/sdk/prisma'; +import { lowerCaseFirst, upperCaseFirst, invariant } from '@zenstackhq/runtime/local-helpers'; import * as fs from 'fs'; -import { lowerCaseFirst } from 'lower-case-first'; import type { OpenAPIV3_1 as OAPI } from 'openapi-types'; import * as path from 'path'; -import invariant from 'tiny-invariant'; import { P, match } from 'ts-pattern'; -import { upperCaseFirst } from 'upper-case-first'; import YAML from 'yaml'; import { name } from '.'; import { OpenAPIGeneratorBase } from './generator-base'; diff --git a/packages/plugins/openapi/tests/baseline/rest-3.1.0.baseline.yaml b/packages/plugins/openapi/tests/baseline/rest-3.1.0.baseline.yaml index 364062e4e..1e331ab8e 100644 --- a/packages/plugins/openapi/tests/baseline/rest-3.1.0.baseline.yaml +++ b/packages/plugins/openapi/tests/baseline/rest-3.1.0.baseline.yaml @@ -10,7 +10,7 @@ tags: - name: post_Item description: Post-related operations - name: postLike - description: PostLike operations + description: PostLike operations paths: /user: get: diff --git a/packages/plugins/swr/package.json b/packages/plugins/swr/package.json index a4410973a..43dedf295 100644 --- a/packages/plugins/swr/package.json +++ b/packages/plugins/swr/package.json @@ -40,13 +40,10 @@ "dependencies": { "@zenstackhq/runtime": "workspace:*", "@zenstackhq/sdk": "workspace:*", - "change-case": "^4.1.2", "cross-fetch": "^4.0.0", - "lower-case-first": "^2.0.2", "semver": "^7.5.2", "ts-morph": "^16.0.0", - "ts-pattern": "^4.3.0", - "upper-case-first": "^2.0.2" + "ts-pattern": "^4.3.0" }, "peerDependencies": { "swr": "2.2.5 - 2" diff --git a/packages/plugins/swr/src/generator.ts b/packages/plugins/swr/src/generator.ts index 5ecfe4d84..a2fee939e 100644 --- a/packages/plugins/swr/src/generator.ts +++ b/packages/plugins/swr/src/generator.ts @@ -12,11 +12,10 @@ import { } from '@zenstackhq/sdk'; import { DataModel, DataModelFieldType, Model, isEnum, isTypeDef } from '@zenstackhq/sdk/ast'; import { getPrismaClientImportSpec, supportCreateMany, type DMMF } from '@zenstackhq/sdk/prisma'; -import { paramCase } from 'change-case'; +import { upperCaseFirst, paramCase } from '@zenstackhq/runtime/local-helpers'; import path from 'path'; import type { OptionalKind, ParameterDeclarationStructure, Project, SourceFile } from 'ts-morph'; import { P, match } from 'ts-pattern'; -import { upperCaseFirst } from 'upper-case-first'; import { name } from '.'; export async function generate(model: Model, options: PluginOptions, dmmf: DMMF.Document) { diff --git a/packages/plugins/swr/src/runtime/index.ts b/packages/plugins/swr/src/runtime/index.ts index 71004d66a..9f1df0b8e 100644 --- a/packages/plugins/swr/src/runtime/index.ts +++ b/packages/plugins/swr/src/runtime/index.ts @@ -7,7 +7,7 @@ import { type ModelMeta, type PrismaWriteActionType, } from '@zenstackhq/runtime/cross'; -import { lowerCaseFirst } from 'lower-case-first'; +import { lowerCaseFirst } from '@zenstackhq/runtime/local-helpers'; import { createContext, useContext } from 'react'; import type { Cache, Fetcher, SWRConfiguration, SWRResponse } from 'swr'; import useSWR, { useSWRConfig } from 'swr'; diff --git a/packages/plugins/swr/tests/react-hooks.test.tsx b/packages/plugins/swr/tests/react-hooks.test.tsx index fa495f97a..78f41a40b 100644 --- a/packages/plugins/swr/tests/react-hooks.test.tsx +++ b/packages/plugins/swr/tests/react-hooks.test.tsx @@ -7,7 +7,7 @@ /// import { renderHook, waitFor } from '@testing-library/react'; -import { lowerCaseFirst } from 'lower-case-first'; +import { lowerCaseFirst } from '@zenstackhq/runtime/local-helpers'; import nock from 'nock'; import { SWRConfig, useSWRConfig } from 'swr'; import { diff --git a/packages/plugins/tanstack-query/package.json b/packages/plugins/tanstack-query/package.json index 91d45f688..2ae4795d5 100644 --- a/packages/plugins/tanstack-query/package.json +++ b/packages/plugins/tanstack-query/package.json @@ -82,13 +82,10 @@ "dependencies": { "@zenstackhq/runtime": "workspace:*", "@zenstackhq/sdk": "workspace:*", - "change-case": "^4.1.2", "cross-fetch": "^4.0.0", - "lower-case-first": "^2.0.2", "semver": "^7.5.2", "ts-morph": "^16.0.0", - "ts-pattern": "^4.3.0", - "upper-case-first": "^2.0.2" + "ts-pattern": "^4.3.0" }, "devDependencies": { "@tanstack/react-query": "^4.29.7", @@ -101,11 +98,11 @@ "@types/semver": "^7.3.13", "@types/tmp": "^0.2.3", "@zenstackhq/testtools": "workspace:*", + "glob": "^8.1.0", "jest-environment-jsdom": "^29.7.0", "nock": "^13.3.6", "react": "18.2.0", "react-test-renderer": "^18.2.0", - "replace-in-file": "^7.0.1", "svelte": "^4.2.1", "swr": "^2.0.3", "tmp": "^0.2.3", diff --git a/packages/plugins/tanstack-query/scripts/postbuild.js b/packages/plugins/tanstack-query/scripts/postbuild.js index 3be17257c..9fbbace04 100755 --- a/packages/plugins/tanstack-query/scripts/postbuild.js +++ b/packages/plugins/tanstack-query/scripts/postbuild.js @@ -1,32 +1,47 @@ // tsup doesn't replace npm dependency aliases in the dist files, so we have to do it manually -const replace = require('replace-in-file'); +const fs = require('fs'); +const glob = require('glob'); + +function replaceSync({ file, from, to }) { + const paths = glob.sync(file, { ignore: [], nodir: true }); + + paths.forEach(path => { + const contents = fs.readFileSync(path, { encoding: 'utf-8' }); + + const newContents = contents.replace(from, to); + + if (newContents !== contents) { + fs.writeFileSync(path, newContents, { encoding: 'utf-8' }); + } + }); +} // tsup incorrectly resolve to legacy types, make a fix here console.log('Replacing @tanstack/react-query-v5/build/legacy/types'); -replace.sync({ - files: 'dist/runtime-v5/react*(.d.ts|.d.mts)', +replaceSync({ + file: 'dist/runtime-v5/react*(.d.ts|.d.mts)', from: /@tanstack\/react-query-v5\/build\/legacy\/types/g, to: '@tanstack/react-query', }); console.log('Replacing @tanstack/react-query-v5'); -replace.sync({ - files: 'dist/runtime-v5/react*(.d.ts|.d.mts|.js|.mjs)', +replaceSync({ + file: 'dist/runtime-v5/react*(.d.ts|.d.mts|.js|.mjs)', from: /@tanstack\/react-query-v5/g, to: '@tanstack/react-query', }); console.log('Replacing @tanstack/svelte-query-v5'); -replace.sync({ - files: 'dist/runtime-v5/svelte*(.d.ts|.d.mts|.js|.mjs)', +replaceSync({ + file: 'dist/runtime-v5/svelte*(.d.ts|.d.mts|.js|.mjs)', from: /@tanstack\/svelte-query-v5/g, to: '@tanstack/svelte-query', }); console.log('Replacing @tanstack/vue-query-v5'); -replace.sync({ - files: 'dist/runtime-v5/vue*(.d.ts|.d.mts|.js|.mjs)', +replaceSync({ + file: 'dist/runtime-v5/vue*(.d.ts|.d.mts|.js|.mjs)', from: /@tanstack\/vue-query-v5/g, to: '@tanstack/vue-query', }); diff --git a/packages/plugins/tanstack-query/src/generator.ts b/packages/plugins/tanstack-query/src/generator.ts index c484f9180..31e5c235a 100644 --- a/packages/plugins/tanstack-query/src/generator.ts +++ b/packages/plugins/tanstack-query/src/generator.ts @@ -14,13 +14,11 @@ import { } from '@zenstackhq/sdk'; import { DataModel, DataModelFieldType, Model, isEnum, isTypeDef } from '@zenstackhq/sdk/ast'; import { getPrismaClientImportSpec, supportCreateMany, type DMMF } from '@zenstackhq/sdk/prisma'; -import { paramCase } from 'change-case'; +import { lowerCaseFirst, upperCaseFirst, paramCase } from '@zenstackhq/runtime/local-helpers'; import fs from 'fs'; -import { lowerCaseFirst } from 'lower-case-first'; import path from 'path'; import { Project, SourceFile, VariableDeclarationKind } from 'ts-morph'; import { P, match } from 'ts-pattern'; -import { upperCaseFirst } from 'upper-case-first'; import { name } from '.'; const supportedTargets = ['react', 'vue', 'svelte']; diff --git a/packages/plugins/trpc/package.json b/packages/plugins/trpc/package.json index 44af8ef76..5eacac265 100644 --- a/packages/plugins/trpc/package.json +++ b/packages/plugins/trpc/package.json @@ -26,15 +26,13 @@ "author": "ZenStack Team", "license": "MIT", "dependencies": { + "@zenstackhq/runtime": "workspace:*", "@zenstackhq/sdk": "workspace:*", - "change-case": "^4.1.2", - "lower-case-first": "^2.0.2", "ts-morph": "^16.0.0", - "tslib": "^2.4.1", - "upper-case-first": "^2.0.2" + "tslib": "^2.4.1" }, "peerDependencies": { - "zod": "^3.22.4" + "zod": "^3.22.4" }, "devDependencies": { "@trpc/next": "^10.32.0", diff --git a/packages/plugins/trpc/src/client-helper/index.ts b/packages/plugins/trpc/src/client-helper/index.ts index 99679c716..a90f1338d 100644 --- a/packages/plugins/trpc/src/client-helper/index.ts +++ b/packages/plugins/trpc/src/client-helper/index.ts @@ -1,7 +1,7 @@ import { PluginError, type PluginOptions } from '@zenstackhq/sdk'; import { getPrismaClientImportSpec } from '@zenstackhq/sdk/prisma'; +import { lowerCaseFirst, upperCaseFirst } from '@zenstackhq/runtime/local-helpers'; import fs from 'fs'; -import { lowerCaseFirst } from 'lower-case-first'; import path from 'path'; import { InterfaceDeclarationStructure, @@ -10,7 +10,6 @@ import { SourceFile, StructureKind, } from 'ts-morph'; -import { upperCaseFirst } from 'upper-case-first'; import { name } from '..'; import { SupportedClientHelpers } from '../utils'; import * as NextHelpers from './next'; diff --git a/packages/plugins/trpc/src/generator.ts b/packages/plugins/trpc/src/generator.ts index 5f7d8601b..66f067add 100644 --- a/packages/plugins/trpc/src/generator.ts +++ b/packages/plugins/trpc/src/generator.ts @@ -12,10 +12,9 @@ import { } from '@zenstackhq/sdk'; import { DataModel, isDataModel, Model } from '@zenstackhq/sdk/ast'; import { getPrismaClientImportSpec, supportCreateMany, type DMMF } from '@zenstackhq/sdk/prisma'; -import { lowerCaseFirst } from 'lower-case-first'; +import { lowerCaseFirst, upperCaseFirst } from '@zenstackhq/runtime/local-helpers'; import path from 'path'; import { Project } from 'ts-morph'; -import { upperCaseFirst } from 'upper-case-first'; import { name } from '.'; import { createClientHelperEntries, generateClientTypingForModel } from './client-helper'; import { project } from './project'; @@ -169,12 +168,12 @@ function createAppRouter( >( procedures: ProcRouterRecord ) => CreateRouterInner; - + export type UnsetMarker = typeof unsetMarker; export type ProcBuilder = ProcedureBuilder< ProcedureParams - >; + >; `); } else { appRouter.addImportDeclaration({ diff --git a/packages/plugins/trpc/src/utils.ts b/packages/plugins/trpc/src/utils.ts index 258f697ff..86d626bdc 100644 --- a/packages/plugins/trpc/src/utils.ts +++ b/packages/plugins/trpc/src/utils.ts @@ -1,7 +1,6 @@ import { type DMMF } from '@zenstackhq/sdk/prisma'; -import { lowerCaseFirst } from 'lower-case-first'; +import { lowerCaseFirst, upperCaseFirst } from '@zenstackhq/runtime/local-helpers'; import { CodeBlockWriter, SourceFile } from 'ts-morph'; -import { upperCaseFirst } from 'upper-case-first'; /** * Supported client helper types diff --git a/packages/plugins/trpc/tests/projects/nuxt-trpc-v10/package-lock.json b/packages/plugins/trpc/tests/projects/nuxt-trpc-v10/package-lock.json index d2afbe91c..bc1ff51f5 100644 --- a/packages/plugins/trpc/tests/projects/nuxt-trpc-v10/package-lock.json +++ b/packages/plugins/trpc/tests/projects/nuxt-trpc-v10/package-lock.json @@ -6044,7 +6044,6 @@ "dependencies": { "@redocly/openapi-core": "^1.25.9", "ansi-colors": "^4.1.3", - "change-case": "^5.4.4", "parse-json": "^8.1.0", "supports-color": "^9.4.0", "yargs-parser": "^21.1.1" @@ -6056,11 +6055,6 @@ "typescript": "^5.x" } }, - "node_modules/openapi-typescript/node_modules/change-case": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", - "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==" - }, "node_modules/package-json-from-dist": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", @@ -7507,10 +7501,6 @@ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==" }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "license": "MIT" - }, "node_modules/tinyglobby": { "version": "0.2.10", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", @@ -8041,7 +8031,6 @@ "fs-extra": "^11.1.0", "npm-run-path": "^4.0.1", "strip-ansi": "^6.0.0", - "tiny-invariant": "^1.1.0", "vscode-languageclient": "^7.0.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", diff --git a/packages/plugins/trpc/tests/projects/nuxt-trpc-v10/package.json b/packages/plugins/trpc/tests/projects/nuxt-trpc-v10/package.json index a50c33df4..45b49215d 100644 --- a/packages/plugins/trpc/tests/projects/nuxt-trpc-v10/package.json +++ b/packages/plugins/trpc/tests/projects/nuxt-trpc-v10/package.json @@ -17,7 +17,7 @@ "trpc-nuxt": "^0.10.22", "vue": "latest", "vue-router": "latest", - "zod": "^3.22.4" + "zod": "^3.22.4" }, "devDependencies": { "esbuild": "^0.24.0", diff --git a/packages/plugins/trpc/tests/projects/nuxt-trpc-v11/package-lock.json b/packages/plugins/trpc/tests/projects/nuxt-trpc-v11/package-lock.json index 131cf5c05..702316fd3 100644 --- a/packages/plugins/trpc/tests/projects/nuxt-trpc-v11/package-lock.json +++ b/packages/plugins/trpc/tests/projects/nuxt-trpc-v11/package-lock.json @@ -3224,11 +3224,6 @@ "node": ">=8" } }, - "node_modules/change-case": { - "version": "5.4.4", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-5.4.4.tgz", - "integrity": "sha512-HRQyTk2/YPEkt9TnUPbOpr64Uw3KOicFWPVBb+xiHvd6eBx/qPr9xqfBFDT8P2vWsvvz4jbEkfDe71W3VyNu2w==" - }, "node_modules/chokidar": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz", @@ -6393,7 +6388,6 @@ "dependencies": { "@redocly/openapi-core": "^1.25.9", "ansi-colors": "^4.1.3", - "change-case": "^5.4.4", "parse-json": "^8.1.0", "supports-color": "^9.4.0", "yargs-parser": "^21.1.1" @@ -7904,11 +7898,6 @@ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz", "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==" }, - "node_modules/tiny-invariant": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", - "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" - }, "node_modules/tinyglobby": { "version": "0.2.10", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz", @@ -8491,7 +8480,6 @@ "fs-extra": "^11.1.0", "npm-run-path": "^4.0.1", "strip-ansi": "^6.0.0", - "tiny-invariant": "^1.1.0", "vscode-languageclient": "^7.0.0", "vscode-languageserver": "^7.0.0", "vscode-languageserver-textdocument": "^1.0.1", diff --git a/packages/plugins/trpc/tests/projects/nuxt-trpc-v11/package.json b/packages/plugins/trpc/tests/projects/nuxt-trpc-v11/package.json index 56b6faa37..e8be9a741 100644 --- a/packages/plugins/trpc/tests/projects/nuxt-trpc-v11/package.json +++ b/packages/plugins/trpc/tests/projects/nuxt-trpc-v11/package.json @@ -17,7 +17,7 @@ "trpc-nuxt": "^0.11.0-beta.1", "vue": "latest", "vue-router": "latest", - "zod": "^3.22.4" + "zod": "^3.22.4" }, "devDependencies": { "esbuild": "^0.24.0", diff --git a/packages/plugins/trpc/tests/projects/t3-trpc-v10/package.json b/packages/plugins/trpc/tests/projects/t3-trpc-v10/package.json index ad9203091..e26114fee 100644 --- a/packages/plugins/trpc/tests/projects/t3-trpc-v10/package.json +++ b/packages/plugins/trpc/tests/projects/t3-trpc-v10/package.json @@ -24,7 +24,7 @@ "react": "18.2.0", "react-dom": "18.2.0", "superjson": "^2.2.1", - "zod": "^3.22.4" + "zod": "^3.22.4" }, "devDependencies": { "@types/eslint": "^8.44.7", diff --git a/packages/plugins/trpc/tests/projects/t3-trpc-v11/package.json b/packages/plugins/trpc/tests/projects/t3-trpc-v11/package.json index 489c6ac92..3b3d17c27 100644 --- a/packages/plugins/trpc/tests/projects/t3-trpc-v11/package.json +++ b/packages/plugins/trpc/tests/projects/t3-trpc-v11/package.json @@ -28,7 +28,7 @@ "react-dom": "^18.3.1", "server-only": "^0.0.1", "superjson": "^2.2.1", - "zod": "^3.22.4" + "zod": "^3.22.4" }, "devDependencies": { "@types/eslint": "^8.56.10", diff --git a/packages/runtime/package.json b/packages/runtime/package.json index 69d0ef524..2b9ea47a0 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -21,6 +21,10 @@ "types": "./index.d.ts", "default": "./index.js" }, + "./local-helpers": { + "types": "./local-helpers/index.d.ts", + "default": "./local-helpers/index.js" + }, "./edge": { "types": "./edge.d.ts", "default": "./edge.js" @@ -96,21 +100,16 @@ "dependencies": { "bcryptjs": "^2.4.3", "buffer": "^6.0.3", - "change-case": "^4.1.2", "decimal.js-light": "^2.5.1", "deepmerge": "^4.3.1", - "is-plain-object": "^5.0.0", "logic-solver": "^2.0.1", - "lower-case-first": "^2.0.2", "pluralize": "^8.0.0", "safe-json-stringify": "^1.2.0", "semver": "^7.5.2", "superjson": "^1.13.0", - "tiny-invariant": "^1.3.1", "traverse": "^0.6.10", "ts-pattern": "^4.3.0", "tslib": "^2.4.1", - "upper-case-first": "^2.0.2", "uuid": "^9.0.0", "zod": "^3.22.4", "zod-validation-error": "^1.5.0" @@ -129,6 +128,9 @@ "@types/safe-json-stringify": "^1.1.5", "@types/semver": "^7.3.13", "@types/traverse": "^0.6.37", - "@types/uuid": "^8.3.4" + "@types/uuid": "^8.3.4", + "decimal.js-light": "^2.5.1", + "superjson": "^1.13.0", + "uuid": "^9.0.0" } } diff --git a/packages/runtime/src/cross/clone.ts b/packages/runtime/src/cross/clone.ts index 1a355d7bf..4ed5d8409 100644 --- a/packages/runtime/src/cross/clone.ts +++ b/packages/runtime/src/cross/clone.ts @@ -1,4 +1,4 @@ -import { isPlainObject } from 'is-plain-object'; +import { isPlainObject } from '../local-helpers'; /** * Clones the given object. Only arrays and plain objects are cloned. Other values are returned as is. diff --git a/packages/runtime/src/cross/model-meta.ts b/packages/runtime/src/cross/model-meta.ts index ad8d2aa76..e125eec8b 100644 --- a/packages/runtime/src/cross/model-meta.ts +++ b/packages/runtime/src/cross/model-meta.ts @@ -1,4 +1,4 @@ -import { lowerCaseFirst } from 'lower-case-first'; +import { lowerCaseFirst } from '../local-helpers'; /** * Runtime information of a data model or field attribute diff --git a/packages/runtime/src/cross/query-analyzer.ts b/packages/runtime/src/cross/query-analyzer.ts index 9277688d5..ad8949998 100644 --- a/packages/runtime/src/cross/query-analyzer.ts +++ b/packages/runtime/src/cross/query-analyzer.ts @@ -1,5 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -import { lowerCaseFirst } from 'lower-case-first'; +import { lowerCaseFirst } from '../local-helpers'; import type { ModelMeta } from './model-meta'; import { NestedReadVisitor } from './nested-read-visitor'; import { NestedWriteVisitor } from './nested-write-visitor'; diff --git a/packages/runtime/src/cross/utils.ts b/packages/runtime/src/cross/utils.ts index b1cb67e12..c56ff3cf9 100644 --- a/packages/runtime/src/cross/utils.ts +++ b/packages/runtime/src/cross/utils.ts @@ -1,4 +1,4 @@ -import { lowerCaseFirst } from 'lower-case-first'; +import { lowerCaseFirst } from '../local-helpers'; import { requireField, type ModelInfo, type ModelMeta, type TypeDefInfo } from '.'; /** diff --git a/packages/runtime/src/enhancements/node/delegate.ts b/packages/runtime/src/enhancements/node/delegate.ts index 1d7cd3f53..06d6b2341 100644 --- a/packages/runtime/src/enhancements/node/delegate.ts +++ b/packages/runtime/src/enhancements/node/delegate.ts @@ -1,7 +1,5 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import deepmerge, { type ArrayMergeOptions } from 'deepmerge'; -import { isPlainObject } from 'is-plain-object'; -import { lowerCaseFirst } from 'lower-case-first'; import traverse from 'traverse'; import { DELEGATE_AUX_RELATION_PREFIX } from '../../constants'; import { @@ -16,6 +14,7 @@ import { isDelegateModel, resolveField, } from '../../cross'; +import { isPlainObject, lowerCaseFirst } from '../../local-helpers'; import type { CrudContract, DbClientContract, EnhancementContext } from '../../types'; import type { InternalEnhancementOptions } from './create-enhancement'; import { Logger } from './logger'; diff --git a/packages/runtime/src/enhancements/node/policy/handler.ts b/packages/runtime/src/enhancements/node/policy/handler.ts index 4285d3bd2..f42dad01f 100644 --- a/packages/runtime/src/enhancements/node/policy/handler.ts +++ b/packages/runtime/src/enhancements/node/policy/handler.ts @@ -1,9 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import deepmerge from 'deepmerge'; -import { lowerCaseFirst } from 'lower-case-first'; -import invariant from 'tiny-invariant'; -import { upperCaseFirst } from 'upper-case-first'; import { fromZodError } from 'zod-validation-error'; import { CrudFailureReason } from '../../../constants'; import { @@ -18,6 +15,7 @@ import { type FieldInfo, type ModelMeta, } from '../../../cross'; +import { lowerCaseFirst, upperCaseFirst, invariant } from '../../../local-helpers'; import { EnhancementContext, PolicyOperationKind, type CrudContract, type DbClientContract } from '../../../types'; import type { InternalEnhancementOptions } from '../create-enhancement'; import { Logger } from '../logger'; diff --git a/packages/runtime/src/enhancements/node/policy/policy-utils.ts b/packages/runtime/src/enhancements/node/policy/policy-utils.ts index 2ee389476..d92a452b4 100644 --- a/packages/runtime/src/enhancements/node/policy/policy-utils.ts +++ b/packages/runtime/src/enhancements/node/policy/policy-utils.ts @@ -1,10 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import deepmerge from 'deepmerge'; -import { isPlainObject } from 'is-plain-object'; -import { lowerCaseFirst } from 'lower-case-first'; import traverse from 'traverse'; -import { upperCaseFirst } from 'upper-case-first'; import { z, type ZodError, type ZodObject, type ZodSchema } from 'zod'; import { fromZodError } from 'zod-validation-error'; import { CrudFailureReason, PrismaErrorCode } from '../../../constants'; @@ -18,6 +15,7 @@ import { type FieldInfo, type ModelMeta, } from '../../../cross'; +import { isPlainObject, lowerCaseFirst, upperCaseFirst } from '../../../local-helpers'; import { AuthUser, CrudContract, diff --git a/packages/runtime/src/local-helpers/index.ts b/packages/runtime/src/local-helpers/index.ts new file mode 100644 index 000000000..ace4550d2 --- /dev/null +++ b/packages/runtime/src/local-helpers/index.ts @@ -0,0 +1,6 @@ +export * from './sleep'; +export * from './is-plain-object'; +export * from './lower-case-first'; +export * from './upper-case-first'; +export * from './param-case'; +export * from './tiny-invariant'; diff --git a/packages/runtime/src/local-helpers/is-plain-object.ts b/packages/runtime/src/local-helpers/is-plain-object.ts new file mode 100644 index 000000000..f5c13d6df --- /dev/null +++ b/packages/runtime/src/local-helpers/is-plain-object.ts @@ -0,0 +1,23 @@ +function isObject(o: unknown) { + return Object.prototype.toString.call(o) === '[object Object]'; +} + +export function isPlainObject(o: unknown) { + if (isObject(o) === false) return false; + + // If has modified constructor + const ctor = (o as { constructor: unknown }).constructor; + if (ctor === undefined) return true; + + // If has modified prototype + const prot = (ctor as { prototype: unknown }).prototype; + if (isObject(prot) === false) return false; + + // If constructor does not have an Object-specific method + if (Object.prototype.hasOwnProperty.call(prot, 'isPrototypeOf') === false) { + return false; + } + + // Most likely a plain Object + return true; +} diff --git a/packages/runtime/src/local-helpers/lower-case-first.ts b/packages/runtime/src/local-helpers/lower-case-first.ts new file mode 100644 index 000000000..a05a05be1 --- /dev/null +++ b/packages/runtime/src/local-helpers/lower-case-first.ts @@ -0,0 +1,3 @@ +export function lowerCaseFirst(input: string) { + return input.charAt(0).toLowerCase() + input.slice(1); +} diff --git a/packages/runtime/src/local-helpers/param-case.ts b/packages/runtime/src/local-helpers/param-case.ts new file mode 100644 index 000000000..3cb1f0179 --- /dev/null +++ b/packages/runtime/src/local-helpers/param-case.ts @@ -0,0 +1,18 @@ +const DEFAULT_SPLIT_REGEXP_1 = /([a-z0-9])([A-Z])/g; +const DEFAULT_SPLIT_REGEXP_2 = /([A-Z])([A-Z][a-z])/g; +const DEFAULT_STRIP_REGEXP = /[^A-Z0-9]+/gi; + +export function paramCase(input: string) { + const result = input + .replace(DEFAULT_SPLIT_REGEXP_1, "$1\0$2") + .replace(DEFAULT_SPLIT_REGEXP_2, "$1\0$2") + .replace(DEFAULT_STRIP_REGEXP, "\0"); + + let start = 0; + let end = result.length; + + while (result.charAt(start) === "\0") start++; + while (result.charAt(end - 1) === "\0") end--; + + return result.slice(start, end).split("\0").map((str) => str.toLowerCase()).join("-"); +} diff --git a/packages/runtime/src/local-helpers/sleep.ts b/packages/runtime/src/local-helpers/sleep.ts new file mode 100644 index 000000000..5281ad0b6 --- /dev/null +++ b/packages/runtime/src/local-helpers/sleep.ts @@ -0,0 +1,5 @@ +export function sleep(timeout: number) { + return new Promise((resolve) => { + setTimeout(() => resolve(), timeout); + }); +} diff --git a/packages/runtime/src/local-helpers/tiny-invariant.ts b/packages/runtime/src/local-helpers/tiny-invariant.ts new file mode 100644 index 000000000..5c0683a54 --- /dev/null +++ b/packages/runtime/src/local-helpers/tiny-invariant.ts @@ -0,0 +1,17 @@ +const isProduction = process.env.NODE_ENV === 'production'; +const prefix = 'Invariant failed'; + +export function invariant( + condition: unknown, + message?: string, +): asserts condition { + if (condition) { + return; + } + + if (isProduction) { + throw new Error(prefix); + } + + throw new Error(message ? `${prefix}: ${message}` : prefix); +} diff --git a/packages/runtime/src/local-helpers/upper-case-first.ts b/packages/runtime/src/local-helpers/upper-case-first.ts new file mode 100644 index 000000000..16a6a6e44 --- /dev/null +++ b/packages/runtime/src/local-helpers/upper-case-first.ts @@ -0,0 +1,3 @@ +export function upperCaseFirst(input: string) { + return input.charAt(0).toUpperCase() + input.slice(1); +} diff --git a/packages/schema/package.json b/packages/schema/package.json index be380b392..e93fb5120 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -95,24 +95,19 @@ "@zenstackhq/language": "workspace:*", "@zenstackhq/sdk": "workspace:*", "async-exit-hook": "^2.0.1", - "change-case": "^4.1.2", "colors": "1.4.0", "commander": "^8.3.0", "deepmerge": "^4.3.1", "langium": "1.3.1", - "lower-case-first": "^2.0.2", "mixpanel": "^0.17.0", "ora": "^5.4.1", "pluralize": "^8.0.0", "pretty-repl": "^4.0.0", "semver": "^7.5.2", - "sleep-promise": "^9.1.0", "strip-color": "^0.1.0", "terminal-link": "^2.0.0", - "tiny-invariant": "^1.3.1", "ts-morph": "^16.0.0", "ts-pattern": "^4.3.0", - "upper-case-first": "^2.0.2", "uuid": "^9.0.0", "vscode-jsonrpc": "^8.0.2", "vscode-languageclient": "^8.0.2", diff --git a/packages/schema/src/plugins/enhancer/enhance/checker-type-generator.ts b/packages/schema/src/plugins/enhancer/enhance/checker-type-generator.ts index 7202f2cdf..d65b84cf4 100644 --- a/packages/schema/src/plugins/enhancer/enhance/checker-type-generator.ts +++ b/packages/schema/src/plugins/enhancer/enhance/checker-type-generator.ts @@ -1,6 +1,6 @@ import { getDataModels } from '@zenstackhq/sdk'; import type { DataModel, DataModelField, Model } from '@zenstackhq/sdk/ast'; -import { lowerCaseFirst } from 'lower-case-first'; +import { lowerCaseFirst } from '@zenstackhq/runtime/local-helpers'; import { P, match } from 'ts-pattern'; /** diff --git a/packages/schema/src/plugins/enhancer/enhance/index.ts b/packages/schema/src/plugins/enhancer/enhance/index.ts index 06853c8e8..f30d756cc 100644 --- a/packages/schema/src/plugins/enhancer/enhance/index.ts +++ b/packages/schema/src/plugins/enhancer/enhance/index.ts @@ -26,6 +26,7 @@ import { type Model, } from '@zenstackhq/sdk/ast'; import { getDMMF, getPrismaClientImportSpec, getPrismaVersion, type DMMF } from '@zenstackhq/sdk/prisma'; +import { upperCaseFirst } from '@zenstackhq/runtime/local-helpers'; import fs from 'fs'; import path from 'path'; import semver from 'semver'; @@ -40,7 +41,6 @@ import { TypeAliasDeclaration, VariableStatement, } from 'ts-morph'; -import { upperCaseFirst } from 'upper-case-first'; import { name } from '..'; import { getConcreteModels, getDiscriminatorField } from '../../../utils/ast-utils'; import { execPackage } from '../../../utils/exec-utils'; diff --git a/packages/schema/src/plugins/enhancer/policy/expression-writer.ts b/packages/schema/src/plugins/enhancer/policy/expression-writer.ts index 2c3334fb3..d3dccfaa6 100644 --- a/packages/schema/src/plugins/enhancer/policy/expression-writer.ts +++ b/packages/schema/src/plugins/enhancer/policy/expression-writer.ts @@ -36,8 +36,7 @@ import { TypeScriptExpressionTransformer, TypeScriptExpressionTransformerError, } from '@zenstackhq/sdk'; -import { lowerCaseFirst } from 'lower-case-first'; -import invariant from 'tiny-invariant'; +import { lowerCaseFirst, invariant } from '@zenstackhq/runtime/local-helpers'; import { name } from '..'; import { isCheckInvocation } from '../../../utils/ast-utils'; diff --git a/packages/schema/src/plugins/enhancer/policy/policy-guard-generator.ts b/packages/schema/src/plugins/enhancer/policy/policy-guard-generator.ts index e7651754d..f257f0830 100644 --- a/packages/schema/src/plugins/enhancer/policy/policy-guard-generator.ts +++ b/packages/schema/src/plugins/enhancer/policy/policy-guard-generator.ts @@ -31,8 +31,8 @@ import { saveSourceFile, } from '@zenstackhq/sdk'; import { getPrismaClientImportSpec } from '@zenstackhq/sdk/prisma'; +import { lowerCaseFirst } from '@zenstackhq/runtime/local-helpers'; import { streamAst } from 'langium'; -import { lowerCaseFirst } from 'lower-case-first'; import path from 'path'; import { FunctionDeclarationStructure, OptionalKind, Project, SourceFile, VariableDeclarationKind } from 'ts-morph'; import { isCheckInvocation } from '../../../utils/ast-utils'; diff --git a/packages/schema/src/plugins/prisma/schema-generator.ts b/packages/schema/src/plugins/prisma/schema-generator.ts index 1bb661647..4e29bb91d 100644 --- a/packages/schema/src/plugins/prisma/schema-generator.ts +++ b/packages/schema/src/plugins/prisma/schema-generator.ts @@ -29,16 +29,12 @@ import { NumberLiteral, StringLiteral, } from '@zenstackhq/language/ast'; -import { getIdFields } from '@zenstackhq/sdk'; -import { getPrismaVersion } from '@zenstackhq/sdk/prisma'; -import { match, P } from 'ts-pattern'; - -import { DELEGATE_AUX_RELATION_PREFIX, PRISMA_MINIMUM_VERSION } from '@zenstackhq/runtime'; import { getAttribute, getAttributeArg, getAttributeArgLiteral, getDataSourceProvider, + getIdFields, getInheritedFromDelegate, getLiteral, getRelationKeyPairs, @@ -49,11 +45,14 @@ import { resolved, ZModelCodeGenerator, } from '@zenstackhq/sdk'; +import { getPrismaVersion } from '@zenstackhq/sdk/prisma'; +import { DELEGATE_AUX_RELATION_PREFIX, PRISMA_MINIMUM_VERSION } from '@zenstackhq/runtime'; +import { lowerCaseFirst } from '@zenstackhq/runtime/local-helpers'; import fs from 'fs'; import { writeFile } from 'fs/promises'; -import { lowerCaseFirst } from 'lower-case-first'; import path from 'path'; import semver from 'semver'; +import { match, P } from 'ts-pattern'; import { name } from '.'; import { getStringLiteral } from '../../language-server/validator/utils'; import { getConcreteModels } from '../../utils/ast-utils'; diff --git a/packages/schema/src/plugins/zod/generator.ts b/packages/schema/src/plugins/zod/generator.ts index 9a5cd53b4..7a7a94b39 100644 --- a/packages/schema/src/plugins/zod/generator.ts +++ b/packages/schema/src/plugins/zod/generator.ts @@ -26,10 +26,10 @@ import { import { DataModel, EnumField, Model, TypeDef, isArrayExpr, isDataModel, isEnum, isTypeDef } from '@zenstackhq/sdk/ast'; import { addMissingInputObjectTypes, resolveAggregateOperationSupport } from '@zenstackhq/sdk/dmmf-helpers'; import { getPrismaClientImportSpec, supportCreateMany, type DMMF } from '@zenstackhq/sdk/prisma'; +import { upperCaseFirst } from '@zenstackhq/runtime/local-helpers'; import { streamAllContents } from 'langium'; import path from 'path'; import type { CodeBlockWriter, SourceFile } from 'ts-morph'; -import { upperCaseFirst } from 'upper-case-first'; import { name } from '.'; import { getDefaultOutputFolder } from '../plugin-utils'; import Transformer from './transformer'; diff --git a/packages/schema/src/plugins/zod/index.ts b/packages/schema/src/plugins/zod/index.ts index ffe198378..074002ee0 100644 --- a/packages/schema/src/plugins/zod/index.ts +++ b/packages/schema/src/plugins/zod/index.ts @@ -1,5 +1,5 @@ import { PluginFunction } from '@zenstackhq/sdk'; -import invariant from 'tiny-invariant'; +import { invariant } from '@zenstackhq/runtime/local-helpers'; import { ZodSchemaGenerator } from './generator'; export const name = 'Zod'; diff --git a/packages/schema/src/plugins/zod/transformer.ts b/packages/schema/src/plugins/zod/transformer.ts index b8669e8e2..0dc0414be 100644 --- a/packages/schema/src/plugins/zod/transformer.ts +++ b/packages/schema/src/plugins/zod/transformer.ts @@ -12,9 +12,9 @@ import { import { DataModel, DataModelField, Enum, isDataModel, isEnum, isTypeDef, type Model } from '@zenstackhq/sdk/ast'; import { checkModelHasModelRelation, findModelByName, isAggregateInputType } from '@zenstackhq/sdk/dmmf-helpers'; import { supportCreateMany, type DMMF as PrismaDMMF } from '@zenstackhq/sdk/prisma'; +import { upperCaseFirst } from '@zenstackhq/runtime/local-helpers'; import path from 'path'; import type { Project, SourceFile } from 'ts-morph'; -import { upperCaseFirst } from 'upper-case-first'; import { computePrismaClientImport } from './generator'; import { AggregateOperationSupport, ObjectMode, TransformerParams } from './types'; diff --git a/packages/schema/src/plugins/zod/utils/schema-gen.ts b/packages/schema/src/plugins/zod/utils/schema-gen.ts index 37466adbb..47f95e3c4 100644 --- a/packages/schema/src/plugins/zod/utils/schema-gen.ts +++ b/packages/schema/src/plugins/zod/utils/schema-gen.ts @@ -11,7 +11,7 @@ import { isTypeDef, TypeDefField, } from '@zenstackhq/sdk/ast'; -import { upperCaseFirst } from 'upper-case-first'; +import { upperCaseFirst } from '@zenstackhq/runtime/local-helpers'; import { isDefaultWithAuth } from '../../enhancer/enhancer-utils'; export function makeFieldSchema(field: DataModelField | TypeDefField) { diff --git a/packages/schema/src/res/stdlib.zmodel b/packages/schema/src/res/stdlib.zmodel index e174a5c37..222765a29 100644 --- a/packages/schema/src/res/stdlib.zmodel +++ b/packages/schema/src/res/stdlib.zmodel @@ -25,7 +25,7 @@ enum ReferentialAction { * Used with "onUpdate": when updating the identifier of a referenced object, the scalar fields of the referencing objects will be set to NULL. */ SetNull - + /** * Used with "onDelete": the scalar field of the referencing object will be set to the fields default value. * Used with "onUpdate": the scalar field of the referencing object will be set to the fields default value. @@ -110,7 +110,7 @@ function ulid(): String { } @@@expressionContext([DefaultValue]) /** - * Creates a sequence of integers in the underlying database and assign the incremented + * Creates a sequence of integers in the underlying database and assign the incremented * values to the ID values of the created records based on the sequence. */ function autoincrement(): Int { @@ -180,9 +180,9 @@ function isEmpty(field: Any[]): Boolean { /** * The name of the model for which the policy rule is defined. If the rule is * inherited to a sub model, this function returns the name of the sub model. - * + * * @param optional parameter to control the casing of the returned value. Valid - * values are "original", "upper", "lower", "capitalize", "uncapitalize". Defaults + * values are "original", "upper", "lower", "capitalize", "uncapitalize". Defaults * to "original". */ function currentModel(casing: String?): String { @@ -585,7 +585,7 @@ attribute @password(saltLength: Int?, salt: String?) @@@targetField([StringField /** * Indicates that the field is encrypted when storing in the DB and should be decrypted when read * - * ZenStack uses the Web Crypto API to encrypt and decrypt the field. + * ZenStack uses the Web Crypto API to encrypt and decrypt the field. */ attribute @encrypted() @@@targetField([StringField]) @@ -713,7 +713,7 @@ function url(field: String): Boolean { * Checks if the current user can perform the given operation on the given field. * * @param field: The field to check access for - * @param operation: The operation to check access for. Can be "read", "create", "update", or "delete". If the operation is not provided, + * @param operation: The operation to check access for. Can be "read", "create", "update", or "delete". If the operation is not provided, * it defaults the operation of the containing policy rule. */ function check(field: Any, operation: String?): Boolean { diff --git a/packages/schema/src/telemetry.ts b/packages/schema/src/telemetry.ts index 9ecbb4672..f0a0afe5f 100644 --- a/packages/schema/src/telemetry.ts +++ b/packages/schema/src/telemetry.ts @@ -1,10 +1,10 @@ import { createId } from '@paralleldrive/cuid2'; import { getPrismaVersion } from '@zenstackhq/sdk/prisma'; +import { sleep } from '@zenstackhq/runtime/local-helpers'; import exitHook from 'async-exit-hook'; import { CommanderError } from 'commander'; import { init, Mixpanel } from 'mixpanel'; import * as os from 'os'; -import sleep from 'sleep-promise'; import { CliError } from './cli/cli-error'; import { TELEMETRY_TRACKING_TOKEN } from './constants'; import isDocker from './utils/is-docker'; diff --git a/packages/schema/tests/schema/all-features.zmodel b/packages/schema/tests/schema/all-features.zmodel index 8fbe6031d..6acd2a6ca 100644 --- a/packages/schema/tests/schema/all-features.zmodel +++ b/packages/schema/tests/schema/all-features.zmodel @@ -133,7 +133,7 @@ model List { // require login @@deny('all', auth() == null) - // can be read by owner or space members (only if not private) + // can be read by owner or space members (only if not private) @@allow('read', owner == auth() || (space.members?[user == auth()] && !private)) // when create, owner must be set to current user, and user must be in the space @@ -187,4 +187,4 @@ type Metadata { width Int height Int format String -} \ No newline at end of file +} diff --git a/packages/schema/tests/schema/todo.zmodel b/packages/schema/tests/schema/todo.zmodel index 2894c486c..61e449fd7 100644 --- a/packages/schema/tests/schema/todo.zmodel +++ b/packages/schema/tests/schema/todo.zmodel @@ -123,7 +123,7 @@ model List { // require login @@deny('all', auth() == null) - // can be read by owner or space members (only if not private) + // can be read by owner or space members (only if not private) @@allow('read', owner == auth() || (space.members?[user == auth()] && !private)) // when create, owner must be set to current user, and user must be in the space @@ -179,4 +179,4 @@ model Account { session_state String? user User @relation(fields: [userId], references: [id], onDelete: Cascade) @@unique([provider, providerAccountId]) -} \ No newline at end of file +} diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 5b65636ce..982f816e1 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -23,11 +23,9 @@ "@zenstackhq/language": "workspace:*", "@zenstackhq/runtime": "workspace:*", "langium": "1.3.1", - "lower-case-first": "^2.0.2", "semver": "^7.5.2", "ts-morph": "^16.0.0", - "ts-pattern": "^4.3.0", - "upper-case-first": "^2.0.2" + "ts-pattern": "^4.3.0" }, "devDependencies": { "@types/semver": "^7.3.13" diff --git a/packages/sdk/src/dmmf-helpers/aggregate-helpers.ts b/packages/sdk/src/dmmf-helpers/aggregate-helpers.ts index bec9632a1..8ec07fe87 100644 --- a/packages/sdk/src/dmmf-helpers/aggregate-helpers.ts +++ b/packages/sdk/src/dmmf-helpers/aggregate-helpers.ts @@ -1,4 +1,4 @@ -import { upperCaseFirst } from 'upper-case-first'; +import { upperCaseFirst } from '@zenstackhq/runtime/local-helpers'; import type { DMMF } from '../prisma'; import { AggregateOperationSupport } from './types'; diff --git a/packages/sdk/src/model-meta-generator.ts b/packages/sdk/src/model-meta-generator.ts index 716e6ad7d..ad34fcffa 100644 --- a/packages/sdk/src/model-meta-generator.ts +++ b/packages/sdk/src/model-meta-generator.ts @@ -17,8 +17,8 @@ import { TypeDefField, } from '@zenstackhq/language/ast'; import type { RuntimeAttribute } from '@zenstackhq/runtime'; +import { lowerCaseFirst } from '@zenstackhq/runtime/local-helpers'; import { streamAst } from 'langium'; -import { lowerCaseFirst } from 'lower-case-first'; import { FunctionDeclarationStructure, OptionalKind, Project, VariableDeclarationKind } from 'ts-morph'; import { CodeWriter, diff --git a/packages/server/package.json b/packages/server/package.json index 76bba5fb5..7298f96a4 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -28,12 +28,8 @@ "license": "MIT", "dependencies": { "@zenstackhq/runtime": "workspace:*", - "change-case": "^4.1.2", - "lower-case-first": "^2.0.2", "superjson": "^1.13.0", - "tiny-invariant": "^1.3.1", "ts-japi": "^1.10.1", - "upper-case-first": "^2.0.2", "url-pattern": "^1.0.3", "zod": "^3.22.4", "zod-validation-error": "^1.5.0", diff --git a/packages/server/src/api/rest/index.ts b/packages/server/src/api/rest/index.ts index 4146e63df..59558be98 100644 --- a/packages/server/src/api/rest/index.ts +++ b/packages/server/src/api/rest/index.ts @@ -10,11 +10,9 @@ import { getIdFields, isPrismaClientKnownRequestError, } from '@zenstackhq/runtime'; -import { paramCase } from 'change-case'; -import { lowerCaseFirst } from 'lower-case-first'; +import { lowerCaseFirst, upperCaseFirst, paramCase } from '@zenstackhq/runtime/local-helpers'; import SuperJSON from 'superjson'; import { Linker, Paginator, Relator, Serializer, SerializerOptions } from 'ts-japi'; -import { upperCaseFirst } from 'upper-case-first'; import UrlPattern from 'url-pattern'; import z, { ZodError } from 'zod'; import { fromZodError } from 'zod-validation-error'; diff --git a/packages/server/src/api/rpc/index.ts b/packages/server/src/api/rpc/index.ts index a1a71c1c6..ef237b779 100644 --- a/packages/server/src/api/rpc/index.ts +++ b/packages/server/src/api/rpc/index.ts @@ -7,8 +7,8 @@ import { isPrismaClientUnknownRequestError, isPrismaClientValidationError, } from '@zenstackhq/runtime'; +import { upperCaseFirst } from '@zenstackhq/runtime/local-helpers'; import SuperJSON from 'superjson'; -import { upperCaseFirst } from 'upper-case-first'; import { ZodError } from 'zod'; import { fromZodError } from 'zod-validation-error'; import { Response } from '../../types'; diff --git a/packages/server/src/nestjs/interfaces/api-handler-options.interface.ts b/packages/server/src/nestjs/interfaces/api-handler-options.interface.ts index c9731d24d..fe497afe9 100644 --- a/packages/server/src/nestjs/interfaces/api-handler-options.interface.ts +++ b/packages/server/src/nestjs/interfaces/api-handler-options.interface.ts @@ -5,7 +5,7 @@ export interface ApiHandlerOptions extends AdapterBaseOptions { * The base URL for the API handler. This is used to determine the base path for the API requests. * If you are using the ApiHandlerService in a route with a prefix, you should set this to the prefix. * - * e.g. + * e.g. * without baseUrl(API handler default route): * - RPC API handler: [model]/findMany * - RESTful API handler: /:type diff --git a/packages/testtools/package.json b/packages/testtools/package.json index 6d186f751..7d489d195 100644 --- a/packages/testtools/package.json +++ b/packages/testtools/package.json @@ -25,7 +25,6 @@ "json5": "^2.2.3", "langium": "1.3.1", "pg": "^8.11.1", - "tiny-invariant": "^1.3.1", "tmp": "^0.2.1", "vscode-uri": "^3.0.6", "zenstack": "workspace:*" diff --git a/packages/testtools/src/db.ts b/packages/testtools/src/db.ts index 16142d527..774400a95 100644 --- a/packages/testtools/src/db.ts +++ b/packages/testtools/src/db.ts @@ -7,9 +7,9 @@ const HOST = process.env.ZENSTACK_TEST_DB_HOST || 'localhost'; const PORT = (process.env.ZENSTACK_TEST_DB_PORT ? parseInt(process.env.ZENSTACK_TEST_DB_PORT) : null) || 5432; function connect() { - return new Pool({ - user: USERNAME, - password: PASSWORD, + return new Pool({ + user: USERNAME, + password: PASSWORD, database: CONNECTION_DB, host: HOST, port: PORT diff --git a/packages/testtools/src/schema.ts b/packages/testtools/src/schema.ts index 4eea10bd2..c1b8c6aeb 100644 --- a/packages/testtools/src/schema.ts +++ b/packages/testtools/src/schema.ts @@ -18,7 +18,7 @@ import tmp from 'tmp'; import { loadDocument } from 'zenstack/cli/cli-util'; import prismaPlugin from 'zenstack/plugins/prisma'; -/** +/** * Use it to represent multiple files in a single string like this `schema.zmodel import "user" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 985ee70f4..061615d6d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,18 +38,12 @@ importers: jest: specifier: ^29.7.0 version: 29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2)) - replace-in-file: - specifier: ^7.0.1 - version: 7.2.0 rimraf: specifier: ^3.0.2 version: 3.0.2 ts-jest: specifier: ^29.1.1 version: 29.1.5(@babel/core@7.24.7)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.7))(esbuild@0.21.5)(jest@29.7.0(@types/node@20.14.9)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2)))(typescript@5.5.2) - ts-node: - specifier: ^10.9.1 - version: 10.9.2(@types/node@20.14.9)(typescript@5.5.2) tsup: specifier: ^8.0.1 version: 8.1.0(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.14.9)(typescript@5.5.2))(typescript@5.5.2) @@ -134,27 +128,15 @@ importers: '@zenstackhq/sdk': specifier: workspace:* version: link:../../sdk/dist - change-case: - specifier: ^4.1.2 - version: 4.1.2 - lower-case-first: - specifier: ^2.0.2 - version: 2.0.2 openapi-types: specifier: ^12.1.0 version: 12.1.3 semver: specifier: ^7.5.2 version: 7.6.2 - tiny-invariant: - specifier: ^1.3.1 - version: 1.3.3 ts-pattern: specifier: ^4.3.0 version: 4.3.0 - upper-case-first: - specifier: ^2.0.2 - version: 2.0.2 yaml: specifier: ^2.2.2 version: 2.4.5 @@ -199,15 +181,9 @@ importers: '@zenstackhq/sdk': specifier: workspace:* version: link:../../sdk/dist - change-case: - specifier: ^4.1.2 - version: 4.1.2 cross-fetch: specifier: ^4.0.0 version: 4.0.0(encoding@0.1.13) - lower-case-first: - specifier: ^2.0.2 - version: 2.0.2 semver: specifier: ^7.5.2 version: 7.6.2 @@ -220,9 +196,6 @@ importers: ts-pattern: specifier: ^4.3.0 version: 4.3.0 - upper-case-first: - specifier: ^2.0.2 - version: 2.0.2 devDependencies: '@tanstack/react-query': specifier: ^4.28.0 @@ -258,15 +231,9 @@ importers: '@zenstackhq/sdk': specifier: workspace:* version: link:../../sdk/dist - change-case: - specifier: ^4.1.2 - version: 4.1.2 cross-fetch: specifier: ^4.0.0 version: 4.0.0(encoding@0.1.13) - lower-case-first: - specifier: ^2.0.2 - version: 2.0.2 semver: specifier: ^7.5.2 version: 7.6.2 @@ -276,9 +243,6 @@ importers: ts-pattern: specifier: ^4.3.0 version: 4.3.0 - upper-case-first: - specifier: ^2.0.2 - version: 2.0.2 devDependencies: '@tanstack/react-query': specifier: ^4.29.7 @@ -310,6 +274,9 @@ importers: '@zenstackhq/testtools': specifier: workspace:* version: link:../../testtools/dist + glob: + specifier: ^8.1.0 + version: 8.1.0 jest-environment-jsdom: specifier: ^29.7.0 version: 29.7.0 @@ -322,9 +289,6 @@ importers: react-test-renderer: specifier: ^18.2.0 version: 18.3.1(react@18.2.0) - replace-in-file: - specifier: ^7.0.1 - version: 7.2.0 svelte: specifier: ^4.2.1 version: 4.2.18 @@ -341,24 +305,18 @@ importers: packages/plugins/trpc: dependencies: + '@zenstackhq/runtime': + specifier: workspace:* + version: link:../../runtime/dist '@zenstackhq/sdk': specifier: workspace:* version: link:../../sdk/dist - change-case: - specifier: ^4.1.2 - version: 4.1.2 - lower-case-first: - specifier: ^2.0.2 - version: 2.0.2 ts-morph: specifier: ^16.0.0 version: 16.0.0 tslib: specifier: ^2.4.1 version: 2.6.3 - upper-case-first: - specifier: ^2.0.2 - version: 2.0.2 zod: specifier: ^3.22.4 version: 3.23.8 @@ -400,24 +358,15 @@ importers: buffer: specifier: ^6.0.3 version: 6.0.3 - change-case: - specifier: ^4.1.2 - version: 4.1.2 decimal.js-light: specifier: ^2.5.1 version: 2.5.1 deepmerge: specifier: ^4.3.1 version: 4.3.1 - is-plain-object: - specifier: ^5.0.0 - version: 5.0.0 logic-solver: specifier: ^2.0.1 version: 2.0.1 - lower-case-first: - specifier: ^2.0.2 - version: 2.0.2 pluralize: specifier: ^8.0.0 version: 8.0.0 @@ -430,9 +379,6 @@ importers: superjson: specifier: ^1.13.0 version: 1.13.3 - tiny-invariant: - specifier: ^1.3.1 - version: 1.3.3 traverse: specifier: ^0.6.10 version: 0.6.10 @@ -442,9 +388,6 @@ importers: tslib: specifier: ^2.4.1 version: 2.6.3 - upper-case-first: - specifier: ^2.0.2 - version: 2.0.2 uuid: specifier: ^9.0.0 version: 9.0.1 @@ -492,9 +435,6 @@ importers: async-exit-hook: specifier: ^2.0.1 version: 2.0.1 - change-case: - specifier: ^4.1.2 - version: 4.1.2 colors: specifier: 1.4.0 version: 1.4.0 @@ -507,9 +447,6 @@ importers: langium: specifier: 1.3.1 version: 1.3.1 - lower-case-first: - specifier: ^2.0.2 - version: 2.0.2 mixpanel: specifier: ^0.17.0 version: 0.17.0 @@ -528,27 +465,18 @@ importers: semver: specifier: ^7.5.2 version: 7.6.2 - sleep-promise: - specifier: ^9.1.0 - version: 9.1.0 strip-color: specifier: ^0.1.0 version: 0.1.0 terminal-link: specifier: ^2.0.0 version: 2.1.1 - tiny-invariant: - specifier: ^1.3.1 - version: 1.3.3 ts-morph: specifier: ^16.0.0 version: 16.0.0 ts-pattern: specifier: ^4.3.0 version: 4.3.0 - upper-case-first: - specifier: ^2.0.2 - version: 2.0.2 uuid: specifier: ^9.0.0 version: 9.0.1 @@ -641,9 +569,6 @@ importers: langium: specifier: 1.3.1 version: 1.3.1 - lower-case-first: - specifier: ^2.0.2 - version: 2.0.2 semver: specifier: ^7.5.2 version: 7.6.2 @@ -653,9 +578,6 @@ importers: ts-pattern: specifier: ^4.3.0 version: 4.3.0 - upper-case-first: - specifier: ^2.0.2 - version: 2.0.2 devDependencies: '@types/semver': specifier: ^7.3.13 @@ -667,27 +589,15 @@ importers: '@zenstackhq/runtime': specifier: workspace:* version: link:../runtime/dist - change-case: - specifier: ^4.1.2 - version: 4.1.2 decimal.js: specifier: ^10.4.2 version: 10.4.3 - lower-case-first: - specifier: ^2.0.2 - version: 2.0.2 superjson: specifier: ^1.13.0 version: 1.13.3 - tiny-invariant: - specifier: ^1.3.1 - version: 1.3.3 ts-japi: specifier: ^1.10.1 version: 1.11.4 - upper-case-first: - specifier: ^2.0.2 - version: 2.0.2 url-pattern: specifier: ^1.0.3 version: 1.0.3 @@ -706,7 +616,7 @@ importers: version: 10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9) '@nestjs/testing': specifier: ^10.3.7 - version: 10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.9)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9)) + version: 10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9)(@nestjs/platform-express@10.3.9) '@sveltejs/kit': specifier: 1.21.0 version: 1.21.0(svelte@4.2.18)(vite@5.3.2(@types/node@20.14.9)(terser@5.31.1)) @@ -780,9 +690,6 @@ importers: pg: specifier: ^8.11.1 version: 8.12.0 - tiny-invariant: - specifier: ^1.3.1 - version: 1.3.3 tmp: specifier: ^0.2.1 version: 0.2.3 @@ -821,9 +728,6 @@ importers: pg: specifier: ^8.11.1 version: 8.12.0 - sleep-promise: - specifier: ^9.1.0 - version: 9.1.0 superjson: specifier: ^1.13.0 version: 1.13.3 @@ -861,9 +765,6 @@ importers: fs-extra: specifier: ^11.1.0 version: 11.2.0 - jest-fetch-mock: - specifier: ^3.0.3 - version: 3.0.3(encoding@0.1.13) next: specifier: 14.2.4 version: 14.2.4(@babel/core@7.24.7)(@opentelemetry/api@1.9.0)(react-dom@18.3.1(react@18.2.0))(react@18.2.0) @@ -3920,9 +3821,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - camel-case@4.1.2: - resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -3937,9 +3835,6 @@ packages: caniuse-lite@1.0.30001638: resolution: {integrity: sha512-5SuJUJ7cZnhPpeLHaH0c/HPAnAHZvS6ElWyHK9GSIbVOQABLzowiI2pjmpvZ1WEbkyz46iFd4UXlOHR5SqgfMQ==} - capital-case@1.0.4: - resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} - chai@4.4.1: resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} engines: {node: '>=4'} @@ -3956,9 +3851,6 @@ packages: resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - change-case@4.1.2: - resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} - char-regex@1.0.2: resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} engines: {node: '>=10'} @@ -4155,7 +4047,7 @@ packages: engines: {node: '>= 14'} concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} concat-stream@1.6.2: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} @@ -4179,9 +4071,6 @@ packages: console-control-strings@1.1.0: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - constant-case@3.0.4: - resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} - content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -4260,9 +4149,6 @@ packages: resolution: {integrity: sha512-ULYhWIonJzlScCCQrPUG5uMXzXxSixty4djud9SS37DoNxDdkeRocxzHuAo4ImRBUK+mAuU5X9TSwEDccnnuPg==} hasBin: true - cross-fetch@3.1.8: - resolution: {integrity: sha512-cvA+JwZoU0Xq+h6WkMvAUqPEYy92Obet6UdKLfW60qn99ftItKjB5T+BkyWOFWe2pUyfQ+IJHmpOTznqk1M6Kg==} - cross-fetch@4.0.0: resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} @@ -4574,9 +4460,6 @@ packages: domutils@3.1.0: resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} - dot-case@3.0.4: - resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} - dot-prop@8.0.2: resolution: {integrity: sha512-xaBe6ZT4DHPkg0k4Ytbvn5xoxgpG0jOS1dYxSOwAHPuNLjP3/OzN0gH55SrLqpx8cBfSaVt91lXYkApjb+nYdQ==} engines: {node: '>=16'} @@ -4606,7 +4489,7 @@ packages: resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} ee-first@1.1.1: - resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} electron-to-chromium@1.4.814: resolution: {integrity: sha512-GVulpHjFu1Y9ZvikvbArHmAhZXtm3wHlpjTMcXNGKl4IQ4jMQjlnz8yMQYYqdLHKi/jEL2+CBC2akWVCoIGUdw==} @@ -4999,6 +4882,7 @@ packages: formidable@2.1.2: resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + deprecated: 'ACTION REQUIRED: SWITCH TO v3 - v1 and v2 are VULNERABLE! v1 is DEPRECATED FOR OVER 2 YEARS! Use formidable@latest or try formidable-mini for fresh projects' forwarded@0.2.0: resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} @@ -5258,9 +5142,6 @@ packages: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - header-case@2.0.4: - resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} - hexoid@1.0.0: resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} engines: {node: '>=8'} @@ -5543,10 +5424,6 @@ packages: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} - is-plain-object@5.0.0: - resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} - engines: {node: '>=0.10.0'} - is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} @@ -5736,9 +5613,6 @@ packages: resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - jest-fetch-mock@3.0.3: - resolution: {integrity: sha512-Ux1nWprtLrdrH4XwE7O7InRY6psIi3GOsqNESJgMJ+M5cv4A8Lh7SN9d2V2kKRZ8ebAfcd1LNyZguAOb6JiDqw==} - jest-get-type@29.6.3: resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -6120,12 +5994,6 @@ packages: loupe@2.3.7: resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} - lower-case-first@2.0.2: - resolution: {integrity: sha512-EVm/rR94FJTZi3zefZ82fLWab+GX14LJN4HrWBcuo6Evmsl9hEfnqxgcHCKb9q+mNf6EVdsjx/qucYFIIB84pg==} - - lower-case@2.0.2: - resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - lowlight@1.17.0: resolution: {integrity: sha512-vmtBgYKD+QVNy7tIa7ulz5d//Il9R4MooOVh4nkOf9R9Cb/Dk5TXMSTieg/vDulkBkIWj59/BIlyFQxT9X1oAQ==} @@ -6193,7 +6061,7 @@ packages: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} media-typer@0.3.0: - resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} engines: {node: '>= 0.6'} merge-descriptors@1.0.1: @@ -6414,9 +6282,6 @@ packages: xml2js: optional: true - no-case@3.0.4: - resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - nock@13.5.4: resolution: {integrity: sha512-yAyTfdeNJGGBFxWdzSKCBYxs5FxLbCg5X5Q4ets974hcQzG1+qCxvIyOo4j2Ry6MUlhWVMX4OoYDefAIIwupjw==} engines: {node: '>= 10.13'} @@ -6640,9 +6505,6 @@ packages: package-json-from-dist@1.0.0: resolution: {integrity: sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==} - param-case@3.0.4: - resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} - parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -6674,9 +6536,6 @@ packages: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} - pascal-case@3.1.2: - resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - pascalcase@1.0.0: resolution: {integrity: sha512-BSExi0rRnCHReJys6NocaK+cfTXNinAegfWBvr0JD3hiaEG7Nuc7r0CIdOJunXrs8gU/sbHQ9dxVAtiVQisjmg==} engines: {node: '>=8'} @@ -6684,9 +6543,6 @@ packages: path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-case@3.0.4: - resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -7122,9 +6978,6 @@ packages: resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} engines: {node: '>= 0.6.0'} - promise-polyfill@8.3.0: - resolution: {integrity: sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==} - promise-retry@2.0.1: resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} engines: {node: '>=10'} @@ -7306,11 +7159,6 @@ packages: engines: {node: '>=12.17'} hasBin: true - replace-in-file@7.2.0: - resolution: {integrity: sha512-CiLXVop3o8/h2Kd1PwKPPimmS9wUV0Ki6Fl8+1ITD35nB3Gl/PrW5IONpTE0AXk0z4v8WYcpEpdeZqMXvSnWpg==} - engines: {node: '>=10'} - hasBin: true - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -7475,9 +7323,6 @@ packages: resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} engines: {node: '>= 0.8.0'} - sentence-case@3.0.4: - resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} - serialize-javascript@6.0.2: resolution: {integrity: sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==} @@ -7569,9 +7414,6 @@ packages: resolution: {integrity: sha512-ZA6oR3T/pEyuqwMgAKT0/hAv8oAXckzbkmR0UkUosQ+Mc4RxGoJkRmwHgHufaenlyAgE1Mxgpdcrf75y6XcnDg==} engines: {node: '>=14.16'} - sleep-promise@9.1.0: - resolution: {integrity: sha512-UHYzVpz9Xn8b+jikYSD6bqvf754xL2uBUzDFwiU6NcdZeifPr6UfgU43xpkPu67VMS88+TI2PSI7Eohgqf2fKA==} - slice-ansi@5.0.0: resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==} engines: {node: '>=12'} @@ -7587,9 +7429,6 @@ packages: resolution: {integrity: sha512-OtZKrVrGIT+m++lxyF0z5n68nkwdgZotPhy89bfA4T7nSWe0xeQtfbjM1z5VLTilJdWXH46g8i0oAcpQNkzZTg==} engines: {node: '>= 18', pnpm: '>= 9'} - snake-case@3.0.4: - resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} - socks-proxy-agent@8.0.4: resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} engines: {node: '>= 14'} @@ -8332,12 +8171,6 @@ packages: peerDependencies: browserslist: '>= 4.21.0' - upper-case-first@2.0.2: - resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} - - upper-case@2.0.2: - resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} - uqr@0.1.2: resolution: {integrity: sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==} @@ -8369,7 +8202,7 @@ packages: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} utils-merge@1.0.1: - resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} engines: {node: '>= 0.4.0'} uuid@10.0.0: @@ -9442,6 +9275,7 @@ snapshots: '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 + optional: true '@envelop/core@4.0.3': dependencies: @@ -10171,6 +10005,7 @@ snapshots: dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.4.15 + optional: true '@js-sdsl/ordered-map@4.4.2': {} @@ -10255,7 +10090,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@nestjs/testing@10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.9)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9))': + '@nestjs/testing@10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/core@10.3.9)(@nestjs/platform-express@10.3.9)': dependencies: '@nestjs/common': 10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1) '@nestjs/core': 10.3.9(@nestjs/common@10.3.9(reflect-metadata@0.2.2)(rxjs@7.8.1))(@nestjs/platform-express@10.3.9)(encoding@0.1.13)(reflect-metadata@0.2.2)(rxjs@7.8.1) @@ -11392,13 +11227,17 @@ snapshots: mkdirp: 1.0.4 path-browserify: 1.0.1 - '@tsconfig/node10@1.0.11': {} + '@tsconfig/node10@1.0.11': + optional: true - '@tsconfig/node12@1.0.11': {} + '@tsconfig/node12@1.0.11': + optional: true - '@tsconfig/node14@1.0.3': {} + '@tsconfig/node14@1.0.3': + optional: true - '@tsconfig/node16@1.0.4': {} + '@tsconfig/node16@1.0.4': + optional: true '@types/aria-query@5.0.4': {} @@ -12120,7 +11959,8 @@ snapshots: delegates: 1.0.0 readable-stream: 3.6.2 - arg@4.1.3: {} + arg@4.1.3: + optional: true arg@5.0.2: {} @@ -12437,11 +12277,6 @@ snapshots: callsites@3.1.0: {} - camel-case@4.1.2: - dependencies: - pascal-case: 3.1.2 - tslib: 2.6.3 - camelcase@5.3.1: {} camelcase@6.3.0: {} @@ -12455,12 +12290,6 @@ snapshots: caniuse-lite@1.0.30001638: {} - capital-case@1.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.6.3 - upper-case-first: 2.0.2 - chai@4.4.1: dependencies: assertion-error: 1.1.0 @@ -12484,21 +12313,6 @@ snapshots: chalk@5.3.0: {} - change-case@4.1.2: - dependencies: - camel-case: 4.1.2 - capital-case: 1.0.4 - constant-case: 3.0.4 - dot-case: 3.0.4 - header-case: 2.0.4 - no-case: 3.0.4 - param-case: 3.0.4 - pascal-case: 3.1.2 - path-case: 3.0.4 - sentence-case: 3.0.4 - snake-case: 3.0.4 - tslib: 2.6.3 - char-regex@1.0.2: {} chardet@0.7.0: {} @@ -12723,12 +12537,6 @@ snapshots: console-control-strings@1.1.0: {} - constant-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.6.3 - upper-case: 2.0.2 - content-disposition@0.5.4: dependencies: safe-buffer: 5.2.1 @@ -12802,12 +12610,6 @@ snapshots: cronstrue@2.50.0: {} - cross-fetch@3.1.8(encoding@0.1.13): - dependencies: - node-fetch: 2.7.0(encoding@0.1.13) - transitivePeerDependencies: - - encoding - cross-fetch@4.0.0(encoding@0.1.13): dependencies: node-fetch: 2.7.0(encoding@0.1.13) @@ -13068,7 +12870,8 @@ snapshots: diff-sequences@29.6.3: {} - diff@4.0.2: {} + diff@4.0.2: + optional: true diff@5.2.0: {} @@ -13104,11 +12907,6 @@ snapshots: domelementtype: 2.3.0 domhandler: 5.0.3 - dot-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.6.3 - dot-prop@8.0.2: dependencies: type-fest: 3.13.1 @@ -14086,11 +13884,6 @@ snapshots: dependencies: function-bind: 1.1.2 - header-case@2.0.4: - dependencies: - capital-case: 1.0.4 - tslib: 2.6.3 - hexoid@1.0.0: {} highlight.js@10.4.1: {} @@ -14351,8 +14144,6 @@ snapshots: is-path-inside@4.0.0: {} - is-plain-object@5.0.0: {} - is-potential-custom-element-name@1.0.1: {} is-reference@1.2.1: @@ -14620,13 +14411,6 @@ snapshots: jest-mock: 29.7.0 jest-util: 29.7.0 - jest-fetch-mock@3.0.3(encoding@0.1.13): - dependencies: - cross-fetch: 3.1.8(encoding@0.1.13) - promise-polyfill: 8.3.0 - transitivePeerDependencies: - - encoding - jest-get-type@29.6.3: {} jest-haste-map@29.7.0: @@ -15166,14 +14950,6 @@ snapshots: dependencies: get-func-name: 2.0.2 - lower-case-first@2.0.2: - dependencies: - tslib: 2.6.3 - - lower-case@2.0.2: - dependencies: - tslib: 2.6.3 - lowlight@1.17.0: dependencies: fault: 1.0.4 @@ -15531,11 +15307,6 @@ snapshots: - supports-color - uWebSockets.js - no-case@3.0.4: - dependencies: - lower-case: 2.0.2 - tslib: 2.6.3 - nock@13.5.4: dependencies: debug: 4.3.5 @@ -15870,11 +15641,6 @@ snapshots: package-json-from-dist@1.0.0: {} - param-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.6.3 - parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -15914,20 +15680,10 @@ snapshots: parseurl@1.3.3: {} - pascal-case@3.1.2: - dependencies: - no-case: 3.0.4 - tslib: 2.6.3 - pascalcase@1.0.0: {} path-browserify@1.0.1: {} - path-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.6.3 - path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -16343,8 +16099,6 @@ snapshots: process@0.11.10: {} - promise-polyfill@8.3.0: {} - promise-retry@2.0.1: dependencies: err-code: 2.0.3 @@ -16564,12 +16318,6 @@ snapshots: stream-read-all: 3.0.1 typical: 7.1.1 - replace-in-file@7.2.0: - dependencies: - chalk: 4.1.2 - glob: 8.1.0 - yargs: 17.7.2 - require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -16740,12 +16488,6 @@ snapshots: transitivePeerDependencies: - supports-color - sentence-case@3.0.4: - dependencies: - no-case: 3.0.4 - tslib: 2.6.3 - upper-case-first: 2.0.2 - serialize-javascript@6.0.2: dependencies: randombytes: 2.1.0 @@ -16846,8 +16588,6 @@ snapshots: slash@5.1.0: {} - sleep-promise@9.1.0: {} - slice-ansi@5.0.0: dependencies: ansi-styles: 6.2.1 @@ -16859,11 +16599,6 @@ snapshots: smol-toml@1.2.1: {} - snake-case@3.0.4: - dependencies: - dot-case: 3.0.4 - tslib: 2.6.3 - socks-proxy-agent@8.0.4: dependencies: agent-base: 7.1.1 @@ -17361,6 +17096,7 @@ snapshots: typescript: 5.5.2 v8-compile-cache-lib: 3.0.1 yn: 3.1.1 + optional: true ts-pattern@4.3.0: {} @@ -17664,14 +17400,6 @@ snapshots: escalade: 3.1.2 picocolors: 1.0.1 - upper-case-first@2.0.2: - dependencies: - tslib: 2.6.3 - - upper-case@2.0.2: - dependencies: - tslib: 2.6.3 - uqr@0.1.2: {} uri-js@4.4.1: @@ -17705,7 +17433,8 @@ snapshots: uuid@9.0.1: {} - v8-compile-cache-lib@3.0.1: {} + v8-compile-cache-lib@3.0.1: + optional: true v8-to-istanbul@9.3.0: dependencies: @@ -18149,7 +17878,8 @@ snapshots: dependencies: buffer-crc32: 0.2.13 - yn@3.1.1: {} + yn@3.1.1: + optional: true yocto-queue@0.1.0: {} diff --git a/tests/integration/package.json b/tests/integration/package.json index 79404f3e8..000c5ee1b 100644 --- a/tests/integration/package.json +++ b/tests/integration/package.json @@ -22,7 +22,6 @@ "@zenstackhq/swr": "workspace:*", "@zenstackhq/trpc": "workspace:*", "fs-extra": "^11.1.0", - "jest-fetch-mock": "^3.0.3", "next": "14.2.4", "tmp": "^0.2.1", "uuid": "^10.0.0", @@ -35,7 +34,6 @@ "bcryptjs": "^2.4.3", "decimal.js": "^10.4.2", "pg": "^8.11.1", - "sleep-promise": "^9.1.0", "superjson": "^1.13.0" } } diff --git a/tests/integration/tests/schema/petstore.zmodel b/tests/integration/tests/schema/petstore.zmodel index 42a279550..8f032b510 100644 --- a/tests/integration/tests/schema/petstore.zmodel +++ b/tests/integration/tests/schema/petstore.zmodel @@ -15,10 +15,10 @@ model User { id String @id @default(cuid()) email String @unique orders Order[] - + // everybody can signup @@allow('create', true) - + // user profile is publicly readable @@allow('read', true) } @@ -31,10 +31,10 @@ model Pet { category String order Order? @relation(fields: [orderId], references: [id]) orderId String? - + // unsold pets are readable to all; sold ones are readable to buyers only @@allow('read', orderId == null || order.user == auth()) - + // only allow update to 'orderId' field if it's not set yet (unsold) @@allow('update', name == future().name && category == future().category && orderId == null ) } @@ -46,7 +46,7 @@ model Order { pets Pet[] user User @relation(fields: [userId], references: [id]) userId String - + // users can read their orders @@allow('read,create', auth() == user) -} \ No newline at end of file +} diff --git a/tests/integration/tests/schema/refactor-pg.zmodel b/tests/integration/tests/schema/refactor-pg.zmodel index d0b4579e1..beb5c2125 100644 --- a/tests/integration/tests/schema/refactor-pg.zmodel +++ b/tests/integration/tests/schema/refactor-pg.zmodel @@ -10,7 +10,7 @@ model User { profile Profile? posts Post[] comments Comment[] - + // everybody can signup @@allow('create', true) @@ -30,10 +30,10 @@ model Profile { user User @relation(fields: [userId], references: [id], onDelete: Cascade) userId Int @unique - + // user profile is publicly readable @@allow('read', auth() != null && !private) - + // user profile is only updatable by the user @@allow('all', auth() == user || auth().role == ADMIN) } @@ -60,7 +60,7 @@ model Post { // posts are readable by all @@allow('read', published) - + // posts are updatable by the author @@allow('all', auth() == author || auth().role == ADMIN) } @@ -76,7 +76,7 @@ model Comment { postId Int images Image[] - + // comments are readable by all @@allow('read', post.published) @@ -85,7 +85,7 @@ model Comment { @@allow('update', auth() == author && future().author == auth()) @@allow('delete', auth() == author || auth() == post.author) - + // comments are updatable by the author @@allow('all', auth().role == ADMIN) } diff --git a/tests/integration/tests/schema/todo-pg.zmodel b/tests/integration/tests/schema/todo-pg.zmodel index b301ce432..05255da44 100644 --- a/tests/integration/tests/schema/todo-pg.zmodel +++ b/tests/integration/tests/schema/todo-pg.zmodel @@ -103,7 +103,7 @@ model List { // require login @@deny('all', auth() == null) - // can be read by owner or space members (only if not private) + // can be read by owner or space members (only if not private) @@allow('read', owner == auth() || (space.members?[user == auth()] && !private)) // when create, owner must be set to current user, and user must be in the space diff --git a/tests/integration/tests/schema/todo.zmodel b/tests/integration/tests/schema/todo.zmodel index 02169b626..8b045ea3a 100644 --- a/tests/integration/tests/schema/todo.zmodel +++ b/tests/integration/tests/schema/todo.zmodel @@ -114,7 +114,7 @@ model List { // require login @@deny('all', auth() == null) - // can be read by owner or space members (only if not private) + // can be read by owner or space members (only if not private) @@allow('read', owner == auth() || (space.members?[user == auth()] && !private)) // when create, owner must be set to current user, and user must be in the space