From 68260b040d7638819ea768102a664e285fe393be Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Fri, 4 Nov 2022 23:42:10 +0800 Subject: [PATCH 01/10] wip --- README.md | 2 +- packages/internal/package.json | 1 + packages/internal/src/config.ts | 19 + packages/internal/src/handler/data/handler.ts | 20 +- .../internal/src/handler/data/policy-utils.ts | 10 +- packages/internal/src/index.ts | 2 + packages/internal/src/request-handler.ts | 3 +- packages/internal/src/request.ts | 1 - packages/internal/src/service.ts | 145 +++ packages/internal/src/types.ts | 20 + .../schema/src/generator/next-auth/index.ts | 3 +- .../schema/src/generator/service/index.ts | 99 +- pnpm-lock.yaml | 2 + samples/todo/package-lock.json | 1078 +++-------------- samples/todo/package.json | 10 +- samples/todo/tsconfig.json | 4 +- samples/todo/zenstack.config.json | 3 + 17 files changed, 429 insertions(+), 993 deletions(-) create mode 100644 packages/internal/src/config.ts create mode 100644 packages/internal/src/service.ts create mode 100644 samples/todo/zenstack.config.json diff --git a/README.md b/README.md index 49ec30f2f..8e8313ada 100644 --- a/README.md +++ b/README.md @@ -264,7 +264,7 @@ export const getServerSideProps: GetServerSideProps = async () => { **Please note** that server-side database access is not protected by access policies. This is by-design so as to provide a way of bypassing the policies. Please make sure you implement authorization properly. -## What's next? +## Learning more ### [Learning the ZModel language](/docs/get-started/learning-the-zmodel-language.md) diff --git a/packages/internal/package.json b/packages/internal/package.json index 01022a0e8..be524acf2 100644 --- a/packages/internal/package.json +++ b/packages/internal/package.json @@ -26,6 +26,7 @@ ], "dependencies": { "bcryptjs": "^2.4.3", + "colors": "^1.4.0", "cuid": "^2.1.8", "deepcopy": "^2.1.0", "swr": "^1.3.0" diff --git a/packages/internal/src/config.ts b/packages/internal/src/config.ts new file mode 100644 index 000000000..9ee7dc2e9 --- /dev/null +++ b/packages/internal/src/config.ts @@ -0,0 +1,19 @@ +/** + * Logging levels + */ +export type LogLevel = 'verbose' | 'info' | 'query' | 'warn' | 'error'; + +/** + * Logging config definition + */ +export type LogDefinition = { + level: LogLevel; + emit: 'stdout' | 'event'; +}; + +/** + * Service configuration + */ +export interface ServiceConfig { + log?: Array; +} diff --git a/packages/internal/src/handler/data/handler.ts b/packages/internal/src/handler/data/handler.ts index cc9213fd1..55fe97747 100644 --- a/packages/internal/src/handler/data/handler.ts +++ b/packages/internal/src/handler/data/handler.ts @@ -68,12 +68,12 @@ export default class DataHandler break; default: - console.warn(`Unhandled method: ${method}`); + this.service.warn(`Unhandled method: ${method}`); res.status(200).send({}); break; } } catch (err: unknown) { - console.log(`Error handling ${method} ${model}: ${err}`); + this.service.info(`Error handling ${method} ${model}: ${err}`); if (err instanceof RequestHandlerError) { // in case of errors thrown directly by ZenStack @@ -112,11 +112,11 @@ export default class DataHandler } } else { // generic errors - console.error( + this.service.error( `An unknown error occurred: ${JSON.stringify(err)}` ); - if (err instanceof Error) { - console.error(err.stack); + if (err instanceof Error && err.stack) { + this.service.error(err.stack); } res.status(500).send({ error: ServerErrorCode.UNKNOWN }); } @@ -204,7 +204,7 @@ export default class DataHandler ); // conduct the create - console.log( + this.service.verbose( `Conducting create: ${model}:\n${JSON.stringify(args)}` ); const createResult = (await tx[model].create(args)) as { @@ -227,7 +227,7 @@ export default class DataHandler const createdIds = await queryIds(model, tx, { [TRANSACTION_FIELD_NAME]: `${transactionId}:create`, }); - console.log( + this.service.verbose( `Validating nestedly created entities: ${model}#[${createdIds.join( ', ' )}]` @@ -332,7 +332,7 @@ export default class DataHandler ); // conduct the update - console.log( + this.service.verbose( `Conducting update: ${model}:\n${JSON.stringify(args)}` ); await tx[model].update(args); @@ -343,7 +343,7 @@ export default class DataHandler const createdIds = await queryIds(model, tx, { [TRANSACTION_FIELD_NAME]: `${transactionId}:create`, }); - console.log( + this.service.verbose( `Validating nestedly created entities: ${model}#[${createdIds.join( ', ' )}]` @@ -447,7 +447,7 @@ export default class DataHandler } // conduct the deletion - console.log( + this.service.verbose( `Conducting delete ${model}:\n${JSON.stringify(args)}` ); await tx[model].delete(args); diff --git a/packages/internal/src/handler/data/policy-utils.ts b/packages/internal/src/handler/data/policy-utils.ts index ff22c15e5..051c02f86 100644 --- a/packages/internal/src/handler/data/policy-utils.ts +++ b/packages/internal/src/handler/data/policy-utils.ts @@ -102,7 +102,7 @@ export async function readWithCheck( // recursively inject read guard conditions into the query args await injectNestedReadConditions(model, args, service, context); - console.log( + service.verbose( `Reading with validation for ${model}: ${JSON.stringify(args)}` ); const result = await db[model].findMany(args); @@ -207,7 +207,7 @@ async function postProcessForRead( continue; } - console.log( + service.verbose( `Validating read of to-one relation: ${fieldInfo.type}#${entityData[field].id}` ); @@ -378,7 +378,7 @@ export async function checkPolicyForIds( context: QueryContext, db: Record ) { - console.log( + service.verbose( `Checking policy for ${model}#[${ids.join(', ')}] for ${operation}` ); @@ -427,7 +427,7 @@ async function checkPolicyForSelectionPath( // build a Prisma query for the path const query = buildChainedSelectQuery(id, selectionPath); - console.log( + service.verbose( `Query for selection path: model ${model}, path ${JSON.stringify( selectionPath )}, query ${JSON.stringify(query)}` @@ -436,7 +436,7 @@ async function checkPolicyForSelectionPath( // collect ids at the end of the path const ids: string[] = collectTerminalEntityIds(selectionPath, r); - console.log(`Collected leaf ids: ${JSON.stringify(ids)}`); + service.verbose(`Collected leaf ids: ${JSON.stringify(ids)}`); if (ids.length === 0) { return; diff --git a/packages/internal/src/index.ts b/packages/internal/src/index.ts index e50b82227..27aef584c 100644 --- a/packages/internal/src/index.ts +++ b/packages/internal/src/index.ts @@ -1,3 +1,5 @@ export * from './types'; +export * from './config'; +export * from './service'; export * from './request-handler'; export * as request from './request'; diff --git a/packages/internal/src/request-handler.ts b/packages/internal/src/request-handler.ts index 4c173c7a9..d182e6557 100644 --- a/packages/internal/src/request-handler.ts +++ b/packages/internal/src/request-handler.ts @@ -40,7 +40,8 @@ export function requestHandler( return dataHandler.handle(req, res, rest); default: - res.status(404).json({ error: 'Unknown route: ' + route }); + service.warn(`Unknown route: ${route}`); + res.status(404).json({ error: `Unknown route: ${route}` }); } }; } diff --git a/packages/internal/src/request.ts b/packages/internal/src/request.ts index adea8a1e7..41ea2224a 100644 --- a/packages/internal/src/request.ts +++ b/packages/internal/src/request.ts @@ -113,7 +113,6 @@ export function getMutate(): Mutator { const keys = Array.from(cache.keys()).filter( (k) => typeof k === 'string' && k.startsWith(key) ) as string[]; - console.log('Mutating keys:', JSON.stringify(keys)); const mutations = keys.map((key) => mutate(key, data, opts)); return Promise.all(mutations); }; diff --git a/packages/internal/src/service.ts b/packages/internal/src/service.ts new file mode 100644 index 000000000..2f5c13f91 --- /dev/null +++ b/packages/internal/src/service.ts @@ -0,0 +1,145 @@ +import * as fs from 'fs'; +import { EventEmitter } from 'stream'; +import { LogLevel, ServiceConfig } from './config'; +import { FieldInfo, PolicyOperationKind, QueryContext, Service } from './types'; +import colors from 'colors'; + +// eslint-disable-next-line @typescript-eslint/no-explicit-any +type EventHandler = (eventType: any, handler: (event: unknown) => void) => void; + +export abstract class DefaultService + implements Service +{ + protected readonly config: ServiceConfig; + private readonly prisma: DbClient; + protected readonly logEmitter = new EventEmitter(); + private readonly logSettings = { + query: { stdout: false, emit: false }, + verbose: { stdout: false, emit: false }, + info: { stdout: false, emit: false }, + warn: { stdout: false, emit: false }, + error: { stdout: false, emit: false }, + }; + // eslint-disable-next-line @typescript-eslint/no-explicit-any + private guardModule: any; + + constructor() { + this.config = this.loadConfig(); + + // initialize log sink mapping + if (this.config.log) { + for (const entry of this.config.log) { + const level = typeof entry === 'string' ? entry : entry.level; + if (!Object.keys(this.logSettings).includes(level)) { + console.error(`Unknown log level "${level}"`); + continue; + } + if (typeof entry === 'string') { + this.logSettings[level].stdout = true; + } else if (entry.emit === 'stdout') { + this.logSettings[level].stdout = true; + } else { + this.logSettings[level].emit = true; + } + } + } + + console.log( + 'Initializing ZenStack service with config:', + JSON.stringify(this.config) + ); + + this.prisma = this.initializePrisma(); + + this.prisma.$on('query', (e) => this.logEmitter.emit('query', e)); + this.prisma.$on('info', (e) => this.logEmitter.emit('info', e)); + this.prisma.$on('warn', (e) => this.logEmitter.emit('warn', e)); + this.prisma.$on('error', (e) => this.logEmitter.emit('error', e)); + } + + private handleEvent(eventType: LogLevel, event: unknown): void { + if (this.logSettings[eventType].stdout) { + switch (eventType) { + case 'verbose': + console.log(colors.blue(`zenstack:${eventType}`), event); + break; + case 'info': + console.log(colors.cyan(`zenstack:${eventType}`), event); + break; + case 'warn': + console.warn(colors.yellow(`zenstack:${eventType}`), event); + break; + case 'error': + console.error(colors.red(`zenstack:${eventType}`), event); + break; + } + } + if (this.logSettings[eventType].emit) { + this.logEmitter.emit(eventType, event); + } + } + + private loadConfig(): ServiceConfig { + const configFile = './zenstack.config.json'; + if (fs.existsSync(configFile)) { + try { + const config = JSON.parse( + fs.readFileSync(configFile).toString('utf-8') + ); + return config as ServiceConfig; + } catch (err) { + console.error('Failed to load zenstack.config.json', err); + } + } + return {}; + } + + get db(): DbClient { + return this.prisma; + } + + async resolveField( + model: string, + field: string + ): Promise { + if (!this.guardModule) { + this.guardModule = await this.loadGuardModule(); + } + return this.guardModule._fieldMapping?.[model]?.[field]; + } + + async buildQueryGuard( + model: string, + operation: PolicyOperationKind, + context: QueryContext + ): Promise { + if (!this.guardModule) { + this.guardModule = await this.loadGuardModule(); + } + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const provider: (context: QueryContext) => any = + this.guardModule[model + '_' + operation]; + return provider(context); + } + + verbose(message: string): void { + this.handleEvent('verbose', message); + } + + info(message: string): void { + this.handleEvent('info', message); + } + + warn(message: string): void { + this.handleEvent('warn', message); + } + + error(message: string): void { + this.handleEvent('error', message); + } + + protected abstract initializePrisma(): DbClient; + + // eslint-disable-next-line @typescript-eslint/no-explicit-any + protected abstract loadGuardModule(): Promise; +} diff --git a/packages/internal/src/types.ts b/packages/internal/src/types.ts index e841423d9..37c3a12b8 100644 --- a/packages/internal/src/types.ts +++ b/packages/internal/src/types.ts @@ -93,6 +93,26 @@ export interface Service { operation: PolicyOperationKind, context: QueryContext ): Promise; + + /** + * Generates a log message with verbose level. + */ + verbose(message: string): void; + + /** + * Generates a log message with info level. + */ + info(message: string): void; + + /** + * Generates a log message with warn level. + */ + warn(message: string): void; + + /** + * Generates a log message with error level. + */ + error(message: string): void; } /** diff --git a/packages/schema/src/generator/next-auth/index.ts b/packages/schema/src/generator/next-auth/index.ts index f6a7b5771..0af334c9e 100644 --- a/packages/schema/src/generator/next-auth/index.ts +++ b/packages/schema/src/generator/next-auth/index.ts @@ -3,6 +3,7 @@ import { Project } from 'ts-morph'; import * as path from 'path'; import colors from 'colors'; import { DataModel, isDataModel, Model } from '@lang/generated/ast'; +import { execSync } from 'child_process'; /** * Generates NextAuth adaptor code @@ -20,7 +21,7 @@ export default class NextAuthGenerator implements Generator { async generate(context: Context): Promise { try { - require('next-auth'); + execSync('npm ls next-auth'); } catch (err) { console.warn( colors.yellow( diff --git a/packages/schema/src/generator/service/index.ts b/packages/schema/src/generator/service/index.ts index c80ec193b..167b42905 100644 --- a/packages/schema/src/generator/service/index.ts +++ b/packages/schema/src/generator/service/index.ts @@ -1,5 +1,5 @@ import { Context, Generator } from '../types'; -import { Project, StructureKind, VariableDeclarationKind } from 'ts-morph'; +import { Project } from 'ts-morph'; import * as path from 'path'; import colors from 'colors'; import { INTERNAL_PACKAGE } from '../constants'; @@ -16,90 +16,31 @@ export default class ServiceGenerator implements Generator { { overwrite: true } ); - sf.addImportDeclaration({ - namedImports: ['PrismaClient'], - moduleSpecifier: '../.prisma', - }); - - sf.addImportDeclaration({ - namedImports: ['Service', 'PolicyOperationKind', 'QueryContext'], - moduleSpecifier: INTERNAL_PACKAGE, - isTypeOnly: true, - }); - - sf.addVariableStatement({ - declarationKind: VariableDeclarationKind.Let, - declarations: [ - { - name: 'guardModule', - type: 'any', - }, - ], - }); + sf.addStatements([ + `import { PrismaClient } from "../.prisma";`, + `import { DefaultService } from "${INTERNAL_PACKAGE}";`, + ]); const cls = sf.addClass({ name: 'ZenStackService', isExported: true, - implements: ['Service'], - }); - cls.addMember({ - kind: StructureKind.Property, - name: 'private readonly _prisma', - initializer: 'new PrismaClient()', + extends: 'DefaultService', }); - cls.addGetAccessor({ - name: 'db', - }) - .addBody() - .setBodyText('return this._prisma;'); - - cls - .addMethod({ - name: 'resolveField', - isAsync: true, - parameters: [ - { - name: 'model', - type: 'string', - }, - { - name: 'field', - type: 'string', - }, - ], - }) - .addBody().setBodyText(` - if (!guardModule) { - guardModule = await import('./query/guard'); - } - return guardModule._fieldMapping?.[model]?.[field]; - `); - - cls - .addMethod({ - name: 'buildQueryGuard', - isAsync: true, - parameters: [ - { - name: 'model', - type: 'string', - }, - { - name: 'operation', - type: 'PolicyOperationKind', - }, - { - name: 'context', - type: 'QueryContext', - }, - ], - }) - .addBody().setBodyText(` - const module: any = await import('./query/guard'); - const provider: (context: QueryContext) => any = module[model+ '_' + operation]; - return provider(context); - `); + cls.addMethod({ + name: 'initializePrisma', + }).setBodyText(` + const logConfig = (this.config.log || []) + .filter(item => typeof item === 'string' ? ['info', 'warn', 'error', 'query'].includes(item): ['info', 'warn', 'error', 'query'].includes(item.level)); + return new PrismaClient({log: logConfig as any }); + `); + + cls.addMethod({ + name: 'loadGuardModule', + isAsync: true, + }).setBodyText(` + return import('./query/guard'); + `); // Recommended by Prisma for Next.js // https://www.prisma.io/docs/guides/database/troubleshooting-orm/help-articles/nextjs-prisma-client-dev-practices#problem diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 65a8fd4cf..d75d3b9f0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,6 +13,7 @@ importers: '@types/node': ^14.18.29 '@types/uuid': ^8.3.4 bcryptjs: ^2.4.3 + colors: ^1.4.0 cuid: ^2.1.8 deepcopy: ^2.1.0 jest: ^29.0.3 @@ -27,6 +28,7 @@ importers: typescript: ^4.6.2 dependencies: bcryptjs: 2.4.3 + colors: 1.4.0 cuid: 2.1.8 deepcopy: 2.1.0 next: 12.3.1_6tziyx3dehkoeijunclpkpolha diff --git a/samples/todo/package-lock.json b/samples/todo/package-lock.json index fe3e8b7bd..eccf33b4b 100644 --- a/samples/todo/package-lock.json +++ b/samples/todo/package-lock.json @@ -10,13 +10,14 @@ "dependencies": { "@heroicons/react": "^2.0.12", "@prisma/client": "^4.4.0", - "@zenstackhq/internal": "^0.2.4", - "@zenstackhq/runtime": "^0.2.4", + "@zenstackhq/internal": "file:../../packages/internal", + "@zenstackhq/runtime": "file:../../packages/runtime", + "bcryptjs": "^2.4.3", "daisyui": "^2.31.0", "moment": "^2.29.4", "nanoid": "^4.0.0", "next": "12.3.1", - "next-auth": "^4.10.3", + "next-auth": "^4.15.1", "react": "18.2.0", "react-dom": "18.2.0", "react-toastify": "^9.0.8", @@ -24,6 +25,7 @@ }, "devDependencies": { "@tailwindcss/line-clamp": "^0.4.2", + "@types/bcryptjs": "^2.4.2", "@types/node": "^14.17.3", "@types/react": "18.0.21", "@types/react-dom": "18.0.6", @@ -33,7 +35,102 @@ "postcss": "^8.4.16", "tailwindcss": "^3.1.8", "typescript": "^4.6.2", - "zenstack": "^0.2.4" + "zenstack": "file:../../packages/schema" + } + }, + "../../packages/internal": { + "name": "@zenstackhq/internal", + "version": "0.2.4", + "license": "MIT", + "dependencies": { + "bcryptjs": "^2.4.3", + "cuid": "^2.1.8", + "deepcopy": "^2.1.0", + "pino": "^8.7.0", + "swr": "^1.3.0" + }, + "devDependencies": { + "@prisma/client": "^4.4.0", + "@types/bcryptjs": "^2.4.2", + "@types/jest": "^29.0.3", + "@types/node": "^14.18.29", + "@types/uuid": "^8.3.4", + "jest": "^29.0.3", + "ts-jest": "^29.0.1", + "ts-node": "^10.9.1", + "tsc-alias": "^1.7.0", + "tsconfig-paths-jest": "^0.0.1", + "typescript": "^4.6.2" + }, + "peerDependencies": { + "@prisma/client": "^4.4.0", + "next": "12.3.1", + "react": "^17.0.2 || ^18", + "react-dom": "^17.0.2 || ^18" + } + }, + "../../packages/runtime": { + "name": "@zenstackhq/runtime", + "version": "0.2.4", + "license": "MIT", + "dependencies": { + "@zenstackhq/internal": "latest" + }, + "peerDependencies": { + "@types/bcryptjs": "^2.4.2", + "bcryptjs": "^2.4.3" + } + }, + "../../packages/schema": { + "name": "zenstack", + "version": "0.2.4", + "dev": true, + "dependencies": { + "@zenstackhq/internal": "workspace:*", + "change-case": "^4.1.2", + "chevrotain": "^9.1.0", + "colors": "^1.4.0", + "commander": "^8.3.0", + "langium": "^0.5.0", + "pluralize": "^8.0.0", + "prisma": "^4.5.0", + "promisify": "^0.0.3", + "ts-morph": "^16.0.0", + "uuid": "^9.0.0", + "vscode-jsonrpc": "^8.0.2", + "vscode-languageclient": "^8.0.2", + "vscode-languageserver": "^8.0.2", + "vscode-languageserver-textdocument": "^1.0.7", + "vscode-uri": "^3.0.6" + }, + "bin": { + "zenstack": "bin/cli" + }, + "devDependencies": { + "@prisma/internals": "^4.5.0", + "@types/jest": "^29.2.0", + "@types/node": "^14.18.32", + "@types/pluralize": "^0.0.29", + "@types/tmp": "^0.2.3", + "@types/uuid": "^8.3.4", + "@types/vscode": "^1.72.0", + "@typescript-eslint/eslint-plugin": "^4.33.0", + "@typescript-eslint/parser": "^4.33.0", + "concurrently": "^7.4.0", + "esbuild": "^0.15.12", + "eslint": "^7.32.0", + "jest": "^29.2.1", + "langium-cli": "^0.5.0", + "tmp": "^0.2.1", + "ts-jest": "^29.0.3", + "ts-node": "^10.9.1", + "tsc-alias": "^1.7.0", + "tsconfig-paths-jest": "^0.0.1", + "typescript": "^4.8.4", + "vsce": "^2.13.0" + }, + "engines": { + "vscode": "^1.72.0" } }, "node_modules/@babel/code-frame": { @@ -163,18 +260,6 @@ "node": ">=6.9.0" } }, - "node_modules/@chevrotain/types": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-9.1.0.tgz", - "integrity": "sha512-3hbCD1CThkv9gnaSIPq0GUXwKni68e0ph6jIHwCvcWiQ4JB2xi8bFxBain0RF04qHUWuDjgnZLj4rLgimuGO+g==", - "dev": true - }, - "node_modules/@chevrotain/utils": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-9.1.0.tgz", - "integrity": "sha512-llLJZ8OAlZrjGlBvamm6Zdo/HmGAcCLq5gx7cSwUX8No+n/8ip+oaC4x33IdZIif8+Rh5dQUIZXmfbSghiOmNQ==", - "dev": true - }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -496,8 +581,9 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.5.0.tgz", "integrity": "sha512-4t9ir2SbQQr/wMCNU4YpHWp5hU14J2m3wHUZnGJPpmBF8YtkisxyVyQsKd1e6FyLTaGq8LOLhm6VLYHKqKNm+g==", - "devOptional": true, - "hasInstallScript": true + "hasInstallScript": true, + "optional": true, + "peer": true }, "node_modules/@prisma/engines-version": { "version": "4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452", @@ -527,44 +613,11 @@ "tailwindcss": ">=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1" } }, - "node_modules/@ts-morph/common": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.17.0.tgz", - "integrity": "sha512-RMSSvSfs9kb0VzkvQ2NWobwnj7TxCA9vI/IjR9bDHqgAyVbu2T0DN4wiKVqomyDWqO7dPr/tErSfq7urQ1Q37g==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.11", - "minimatch": "^5.1.0", - "mkdirp": "^1.0.4", - "path-browserify": "^1.0.1" - } - }, - "node_modules/@ts-morph/common/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@ts-morph/common/node_modules/minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/@types/bcryptjs": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==", - "peer": true + "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", @@ -721,33 +774,12 @@ } }, "node_modules/@zenstackhq/internal": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@zenstackhq/internal/-/internal-0.2.4.tgz", - "integrity": "sha512-+Rg3Jq3RPaRav8zKxqyyrGLqP5JHxo1JEiXxTQHYqhAxdgtzzTOGkVAXMuB+OP/PTpe/6EBHwyd4T2CVyyQfcw==", - "dependencies": { - "bcryptjs": "^2.4.3", - "cuid": "^2.1.8", - "deepcopy": "^2.1.0", - "swr": "^1.3.0" - }, - "peerDependencies": { - "@prisma/client": "^4.4.0", - "next": "12.3.1", - "react": "^17.0.2 || ^18", - "react-dom": "^17.0.2 || ^18" - } + "resolved": "../../packages/internal", + "link": true }, "node_modules/@zenstackhq/runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@zenstackhq/runtime/-/runtime-0.2.4.tgz", - "integrity": "sha512-6rgbQeYjdI+Eiqp2ubp8ZocIRz2EsLY+zm3OOypoVgjxTFs+gqr2Z3hdWgwSjnEoZBoh2laFJ0tPI4rbHF8lww==", - "dependencies": { - "@zenstackhq/internal": "latest" - }, - "peerDependencies": { - "@types/bcryptjs": "^2.4.2", - "bcryptjs": "^2.4.3" - } + "resolved": "../../packages/runtime", + "link": true }, "node_modules/acorn": { "version": "7.4.1", @@ -1090,16 +1122,6 @@ "node": ">=6" } }, - "node_modules/camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "dependencies": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "node_modules/camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -1123,17 +1145,6 @@ } ] }, - "node_modules/capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1150,37 +1161,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "dev": true, - "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.0.3" - } - }, - "node_modules/chevrotain": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-9.1.0.tgz", - "integrity": "sha512-A86/55so63HCfu0dgGg3j9u8uuuBOrSqly1OhBZxRu2x6sAKILLzfVjbGMw45kgier6lz45EzcjjWtTRgoT84Q==", - "dev": true, - "dependencies": { - "@chevrotain/types": "^9.1.0", - "@chevrotain/utils": "^9.1.0", - "regexp-to-ast": "0.5.0" - } - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -1215,12 +1195,6 @@ "node": ">=6" } }, - "node_modules/code-block-writer": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", - "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==", - "dev": true - }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -1258,41 +1232,12 @@ "simple-swizzle": "^0.2.2" } }, - "node_modules/colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, - "engines": { - "node": ">= 12" - } - }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "node_modules/constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, "node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -1352,11 +1297,6 @@ "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", "dev": true }, - "node_modules/cuid": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz", - "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==" - }, "node_modules/daisyui": { "version": "2.31.0", "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-2.31.0.tgz", @@ -1401,14 +1341,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "node_modules/deepcopy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deepcopy/-/deepcopy-2.1.0.tgz", - "integrity": "sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==", - "dependencies": { - "type-detect": "^4.0.8" - } - }, "node_modules/define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -1483,16 +1415,6 @@ "node": ">=6.0.0" } }, - "node_modules/dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", @@ -2399,16 +2321,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dev": true, - "dependencies": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -2695,9 +2607,9 @@ "dev": true }, "node_modules/jose": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.10.0.tgz", - "integrity": "sha512-KEhB/eLGLomWGPTb+/RNbYsTjIyx03JmbqAyIyiXBuNSa7CmNrJd5ysFhblayzs/e/vbOPMUaLnjHUMhGp4yLw==", + "version": "4.10.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.10.4.tgz", + "integrity": "sha512-eBH77Xs9Yc/oTDvukhAEDVMijhekPuNktXJL4tUlB22jqKP1k48v5nmsUmc8feoJPsxB3HsfEt2LbVSoz+1mng==", "funding": { "url": "https://github.com/sponsors/panva" } @@ -2757,21 +2669,6 @@ "node": ">=4.0" } }, - "node_modules/langium": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/langium/-/langium-0.5.0.tgz", - "integrity": "sha512-7mheQQtyyPm8r9R+8sPZopcdzEcHtCC+M52m8ZbotzNql8RPLs3+QbDY6EZ98ejKtJCGt9RviTkfZEt1LxX86w==", - "dev": true, - "dependencies": { - "chevrotain": "^9.1.0", - "vscode-languageserver": "^8.0.2", - "vscode-languageserver-textdocument": "^1.0.7", - "vscode-uri": "^3.0.2" - }, - "engines": { - "node": ">=12.0.0" - } - }, "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -2831,15 +2728,6 @@ "loose-envify": "cli.js" } }, - "node_modules/lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2891,18 +2779,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true, - "bin": { - "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", @@ -2987,9 +2863,9 @@ } }, "node_modules/next-auth": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.14.0.tgz", - "integrity": "sha512-pD5sin6kq/uIx3Cod2/0JFnViEnngBTTNy4CdfRaYc2QzV2zwpWAbQny2Ezlg0GjEozDhKC53JJxRRE4AmNKEw==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.15.1.tgz", + "integrity": "sha512-yB/cSEqslaXAsLZ3lvkJbB7bRR5JeZvfUXSw0CmWeP+TaMZWB85fG9PWdfBeFrDCLBsoyATw9FF6fzApE0SxSw==", "dependencies": { "@babel/runtime": "^7.16.3", "@panva/hkdf": "^1.0.1", @@ -3002,10 +2878,10 @@ "uuid": "^8.3.2" }, "engines": { - "node": "^12.19.0 || ^14.15.0 || ^16.13.0" + "node": "^12.19.0 || ^14.15.0 || ^16.13.0 || ^18.12.0" }, "peerDependencies": { - "next": "^12.2.5", + "next": "^12.2.5 || ^13", "nodemailer": "^6.6.5", "react": "^17.0.2 || ^18", "react-dom": "^17.0.2 || ^18" @@ -3016,14 +2892,6 @@ } } }, - "node_modules/next-auth/node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "bin": { - "uuid": "dist/bin/uuid" - } - }, "node_modules/next/node_modules/nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -3058,16 +2926,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "dependencies": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" - } - }, "node_modules/node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", @@ -3226,9 +3084,9 @@ } }, "node_modules/openid-client": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.2.0.tgz", - "integrity": "sha512-fswY95ZqQr8xBgnlcC9TBJs/QeZAANRaiDliIwHktvpxpWhv5+cfd41OFNflI/ycf09HnqEPWbGrmvSOPgD3HQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.2.1.tgz", + "integrity": "sha512-KPxqWnxobG/70Cxqyvd43RWfCfHedFnCdHSBpw5f7WnTnuBAeBnvot/BIo+brrcTr0wyAYUlL/qejQSGwWtdIg==", "dependencies": { "jose": "^4.10.0", "lru-cache": "^6.0.0", @@ -3256,16 +3114,6 @@ "node": ">= 0.8.0" } }, - "node_modules/param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3278,32 +3126,6 @@ "node": ">=6" } }, - "node_modules/pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "node_modules/path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "node_modules/path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -3360,15 +3182,6 @@ "node": ">=0.10.0" } }, - "node_modules/pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/postcss": { "version": "8.4.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", @@ -3510,9 +3323,9 @@ } }, "node_modules/preact-render-to-string": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.5.tgz", - "integrity": "sha512-rEBn42C3Wh+AjPxXUbDkb6xw0cTJQgxdYlp6ytUR1uBZF647Wn6ykkopMeQlRl7ggX+qnYYjZ4Hs1abZENl7ww==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", + "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", "dependencies": { "pretty-format": "^3.8.0" }, @@ -3538,8 +3351,9 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.5.0.tgz", "integrity": "sha512-9Aeg4qiKlv9Wsjz4NO8k2CzRzlvS3A4FYVJ5+28sBBZ0eEwbiVOE/Jj7v6rZC1tFW2s4GSICQOAyuOjc6WsNew==", - "devOptional": true, "hasInstallScript": true, + "optional": true, + "peer": true, "dependencies": { "@prisma/engines": "4.5.0" }, @@ -3560,15 +3374,6 @@ "node": ">=0.4.0" } }, - "node_modules/promisify": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/promisify/-/promisify-0.0.3.tgz", - "integrity": "sha512-CcBGsRhhq466fsZVyHfptuKqon6eih0CqMsJE0kWIIjbpVNEyDoaKLELm2WVs//W/WXRBHip+6xhTExTkHUwtA==", - "dev": true, - "dependencies": { - "when": "" - } - }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -3684,12 +3489,6 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" }, - "node_modules/regexp-to-ast": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", - "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", - "dev": true - }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", @@ -3836,17 +3635,6 @@ "node": ">=10" } }, - "node_modules/sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dev": true, - "dependencies": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3916,16 +3704,6 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, - "dependencies": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -4203,16 +3981,6 @@ "node": ">=8.0" } }, - "node_modules/ts-morph": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-16.0.0.tgz", - "integrity": "sha512-jGNF0GVpFj0orFw55LTsQxVYEUOCWBAbR5Ls7fTYE5pQsbW18ssTb/6UXx/GYAEjS+DQTp8VoTw0vqYMiaaQuw==", - "dev": true, - "dependencies": { - "@ts-morph/common": "~0.17.0", - "code-block-writer": "^11.0.3" - } - }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -4263,14 +4031,6 @@ "node": ">= 0.8.0" } }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "engines": { - "node": ">=4" - } - }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -4336,24 +4096,6 @@ "browserslist": ">= 4.21.0" } }, - "node_modules/upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, - "node_modules/upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dev": true, - "dependencies": { - "tslib": "^2.0.3" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -4377,10 +4119,9 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true, + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "bin": { "uuid": "dist/bin/uuid" } @@ -4391,75 +4132,6 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "node_modules/vscode-jsonrpc": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", - "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==", - "dev": true, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/vscode-languageclient": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.0.2.tgz", - "integrity": "sha512-lHlthJtphG9gibGb/y72CKqQUxwPsMXijJVpHEC2bvbFqxmkj9LwQ3aGU9dwjBLqsX1S4KjShYppLvg1UJDF/Q==", - "dev": true, - "dependencies": { - "minimatch": "^3.0.4", - "semver": "^7.3.5", - "vscode-languageserver-protocol": "3.17.2" - }, - "engines": { - "vscode": "^1.67.0" - } - }, - "node_modules/vscode-languageserver": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.0.2.tgz", - "integrity": "sha512-bpEt2ggPxKzsAOZlXmCJ50bV7VrxwCS5BI4+egUmure/oI/t4OlFzi/YNtVvY24A2UDOZAgwFGgnZPwqSJubkA==", - "dev": true, - "dependencies": { - "vscode-languageserver-protocol": "3.17.2" - }, - "bin": { - "installServerIntoExtension": "bin/installServerIntoExtension" - } - }, - "node_modules/vscode-languageserver-protocol": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz", - "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==", - "dev": true, - "dependencies": { - "vscode-jsonrpc": "8.0.2", - "vscode-languageserver-types": "3.17.2" - } - }, - "node_modules/vscode-languageserver-textdocument": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", - "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==", - "dev": true - }, - "node_modules/vscode-languageserver-types": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", - "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==", - "dev": true - }, - "node_modules/vscode-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.6.tgz", - "integrity": "sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ==", - "dev": true - }, - "node_modules/when": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", - "integrity": "sha512-5cZ7mecD3eYcMiCH4wtRPA5iFJZ50BJYDfckI5RRpQiktMiYTcn0ccLTZOvcbBume+1304fQztxeNzNS9Gvrnw==", - "dev": true - }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4528,34 +4200,8 @@ } }, "node_modules/zenstack": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/zenstack/-/zenstack-0.2.4.tgz", - "integrity": "sha512-+FjPCiBmy9T/bERNqPZNN6B8Clj7dHKZg2vdyBKSLjC+tLZZsB6eGW1FlPaj3qdQp7zlxvacF8nvwnO1BwEWyg==", - "dev": true, - "dependencies": { - "@zenstackhq/internal": "0.2.4", - "change-case": "^4.1.2", - "chevrotain": "^9.1.0", - "colors": "^1.4.0", - "commander": "^8.3.0", - "langium": "^0.5.0", - "pluralize": "^8.0.0", - "prisma": "^4.5.0", - "promisify": "^0.0.3", - "ts-morph": "^16.0.0", - "uuid": "^9.0.0", - "vscode-jsonrpc": "^8.0.2", - "vscode-languageclient": "^8.0.2", - "vscode-languageserver": "^8.0.2", - "vscode-languageserver-textdocument": "^1.0.7", - "vscode-uri": "^3.0.6" - }, - "bin": { - "zenstack": "bin/cli" - }, - "engines": { - "vscode": "^1.72.0" - } + "resolved": "../../packages/schema", + "link": true } }, "dependencies": { @@ -4661,18 +4307,6 @@ "regenerator-runtime": "^0.13.4" } }, - "@chevrotain/types": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-9.1.0.tgz", - "integrity": "sha512-3hbCD1CThkv9gnaSIPq0GUXwKni68e0ph6jIHwCvcWiQ4JB2xi8bFxBain0RF04qHUWuDjgnZLj4rLgimuGO+g==", - "dev": true - }, - "@chevrotain/utils": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-9.1.0.tgz", - "integrity": "sha512-llLJZ8OAlZrjGlBvamm6Zdo/HmGAcCLq5gx7cSwUX8No+n/8ip+oaC4x33IdZIif8+Rh5dQUIZXmfbSghiOmNQ==", - "dev": true - }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -4845,7 +4479,8 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.5.0.tgz", "integrity": "sha512-4t9ir2SbQQr/wMCNU4YpHWp5hU14J2m3wHUZnGJPpmBF8YtkisxyVyQsKd1e6FyLTaGq8LOLhm6VLYHKqKNm+g==", - "devOptional": true + "optional": true, + "peer": true }, "@prisma/engines-version": { "version": "4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452", @@ -4873,43 +4508,11 @@ "dev": true, "requires": {} }, - "@ts-morph/common": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.17.0.tgz", - "integrity": "sha512-RMSSvSfs9kb0VzkvQ2NWobwnj7TxCA9vI/IjR9bDHqgAyVbu2T0DN4wiKVqomyDWqO7dPr/tErSfq7urQ1Q37g==", - "dev": true, - "requires": { - "fast-glob": "^3.2.11", - "minimatch": "^5.1.0", - "mkdirp": "^1.0.4", - "path-browserify": "^1.0.1" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", - "dev": true, - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, "@types/bcryptjs": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==", - "peer": true + "dev": true }, "@types/json5": { "version": "0.0.29", @@ -5017,20 +4620,28 @@ } }, "@zenstackhq/internal": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@zenstackhq/internal/-/internal-0.2.4.tgz", - "integrity": "sha512-+Rg3Jq3RPaRav8zKxqyyrGLqP5JHxo1JEiXxTQHYqhAxdgtzzTOGkVAXMuB+OP/PTpe/6EBHwyd4T2CVyyQfcw==", + "version": "file:../../packages/internal", "requires": { + "@prisma/client": "^4.4.0", + "@types/bcryptjs": "^2.4.2", + "@types/jest": "^29.0.3", + "@types/node": "^14.18.29", + "@types/uuid": "^8.3.4", "bcryptjs": "^2.4.3", "cuid": "^2.1.8", "deepcopy": "^2.1.0", - "swr": "^1.3.0" + "jest": "^29.0.3", + "pino": "^8.7.0", + "swr": "^1.3.0", + "ts-jest": "^29.0.1", + "ts-node": "^10.9.1", + "tsc-alias": "^1.7.0", + "tsconfig-paths-jest": "^0.0.1", + "typescript": "^4.6.2" } }, "@zenstackhq/runtime": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/@zenstackhq/runtime/-/runtime-0.2.4.tgz", - "integrity": "sha512-6rgbQeYjdI+Eiqp2ubp8ZocIRz2EsLY+zm3OOypoVgjxTFs+gqr2Z3hdWgwSjnEoZBoh2laFJ0tPI4rbHF8lww==", + "version": "file:../../packages/runtime", "requires": { "@zenstackhq/internal": "latest" } @@ -5269,16 +4880,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "camel-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", - "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, - "requires": { - "pascal-case": "^3.1.2", - "tslib": "^2.0.3" - } - }, "camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -5289,17 +4890,6 @@ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz", "integrity": "sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog==" }, - "capital-case": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", - "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -5310,37 +4900,6 @@ "supports-color": "^7.1.0" } }, - "change-case": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", - "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", - "dev": true, - "requires": { - "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.0.3" - } - }, - "chevrotain": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-9.1.0.tgz", - "integrity": "sha512-A86/55so63HCfu0dgGg3j9u8uuuBOrSqly1OhBZxRu2x6sAKILLzfVjbGMw45kgier6lz45EzcjjWtTRgoT84Q==", - "dev": true, - "requires": { - "@chevrotain/types": "^9.1.0", - "@chevrotain/utils": "^9.1.0", - "regexp-to-ast": "0.5.0" - } - }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -5361,12 +4920,6 @@ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" }, - "code-block-writer": { - "version": "11.0.3", - "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", - "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==", - "dev": true - }, "color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -5398,35 +4951,12 @@ "simple-swizzle": "^0.2.2" } }, - "colors": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", - "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", - "dev": true - }, - "commander": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true - }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, - "constant-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", - "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case": "^2.0.2" - } - }, "cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -5469,11 +4999,6 @@ "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", "dev": true }, - "cuid": { - "version": "2.1.8", - "resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz", - "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==" - }, "daisyui": { "version": "2.31.0", "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-2.31.0.tgz", @@ -5506,14 +5031,6 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, - "deepcopy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/deepcopy/-/deepcopy-2.1.0.tgz", - "integrity": "sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==", - "requires": { - "type-detect": "^4.0.8" - } - }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -5567,16 +5084,6 @@ "esutils": "^2.0.2" } }, - "dot-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", - "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", @@ -6264,16 +5771,6 @@ "has-symbols": "^1.0.2" } }, - "header-case": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", - "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", - "dev": true, - "requires": { - "capital-case": "^1.0.4", - "tslib": "^2.0.3" - } - }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -6470,9 +5967,9 @@ "dev": true }, "jose": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/jose/-/jose-4.10.0.tgz", - "integrity": "sha512-KEhB/eLGLomWGPTb+/RNbYsTjIyx03JmbqAyIyiXBuNSa7CmNrJd5ysFhblayzs/e/vbOPMUaLnjHUMhGp4yLw==" + "version": "4.10.4", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.10.4.tgz", + "integrity": "sha512-eBH77Xs9Yc/oTDvukhAEDVMijhekPuNktXJL4tUlB22jqKP1k48v5nmsUmc8feoJPsxB3HsfEt2LbVSoz+1mng==" }, "js-tokens": { "version": "4.0.0", @@ -6520,18 +6017,6 @@ "object.assign": "^4.1.3" } }, - "langium": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/langium/-/langium-0.5.0.tgz", - "integrity": "sha512-7mheQQtyyPm8r9R+8sPZopcdzEcHtCC+M52m8ZbotzNql8RPLs3+QbDY6EZ98ejKtJCGt9RviTkfZEt1LxX86w==", - "dev": true, - "requires": { - "chevrotain": "^9.1.0", - "vscode-languageserver": "^8.0.2", - "vscode-languageserver-textdocument": "^1.0.7", - "vscode-uri": "^3.0.2" - } - }, "language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -6582,15 +6067,6 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "lower-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", - "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6627,12 +6103,6 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" }, - "mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "dev": true - }, "moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", @@ -6699,9 +6169,9 @@ } }, "next-auth": { - "version": "4.14.0", - "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.14.0.tgz", - "integrity": "sha512-pD5sin6kq/uIx3Cod2/0JFnViEnngBTTNy4CdfRaYc2QzV2zwpWAbQny2Ezlg0GjEozDhKC53JJxRRE4AmNKEw==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/next-auth/-/next-auth-4.15.1.tgz", + "integrity": "sha512-yB/cSEqslaXAsLZ3lvkJbB7bRR5JeZvfUXSw0CmWeP+TaMZWB85fG9PWdfBeFrDCLBsoyATw9FF6fzApE0SxSw==", "requires": { "@babel/runtime": "^7.16.3", "@panva/hkdf": "^1.0.1", @@ -6712,23 +6182,6 @@ "preact": "^10.6.3", "preact-render-to-string": "^5.1.19", "uuid": "^8.3.2" - }, - "dependencies": { - "uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" - } - } - }, - "no-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", - "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, - "requires": { - "lower-case": "^2.0.2", - "tslib": "^2.0.3" } }, "node-releases": { @@ -6844,9 +6297,9 @@ } }, "openid-client": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.2.0.tgz", - "integrity": "sha512-fswY95ZqQr8xBgnlcC9TBJs/QeZAANRaiDliIwHktvpxpWhv5+cfd41OFNflI/ycf09HnqEPWbGrmvSOPgD3HQ==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.2.1.tgz", + "integrity": "sha512-KPxqWnxobG/70Cxqyvd43RWfCfHedFnCdHSBpw5f7WnTnuBAeBnvot/BIo+brrcTr0wyAYUlL/qejQSGwWtdIg==", "requires": { "jose": "^4.10.0", "lru-cache": "^6.0.0", @@ -6868,16 +6321,6 @@ "word-wrap": "^1.2.3" } }, - "param-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", - "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -6887,32 +6330,6 @@ "callsites": "^3.0.0" } }, - "pascal-case": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", - "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, - "path-browserify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", - "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", - "dev": true - }, - "path-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", - "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -6951,12 +6368,6 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" }, - "pluralize": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", - "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", - "dev": true - }, "postcss": { "version": "8.4.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", @@ -7029,9 +6440,9 @@ "integrity": "sha512-skAwGDFmgxhq1DCBHke/9e12ewkhc7WYwjuhHB8HHS8zkdtITXLRmUMTeol2ldxvLwYtwbFeifZ9uDDWuyL4Iw==" }, "preact-render-to-string": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.5.tgz", - "integrity": "sha512-rEBn42C3Wh+AjPxXUbDkb6xw0cTJQgxdYlp6ytUR1uBZF647Wn6ykkopMeQlRl7ggX+qnYYjZ4Hs1abZENl7ww==", + "version": "5.2.6", + "resolved": "https://registry.npmjs.org/preact-render-to-string/-/preact-render-to-string-5.2.6.tgz", + "integrity": "sha512-JyhErpYOvBV1hEPwIxc/fHWXPfnEGdRKxc8gFdAZ7XV4tlzyzG847XAyEZqoDnynP88akM4eaHcSOzNcLWFguw==", "requires": { "pretty-format": "^3.8.0" } @@ -7051,7 +6462,8 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.5.0.tgz", "integrity": "sha512-9Aeg4qiKlv9Wsjz4NO8k2CzRzlvS3A4FYVJ5+28sBBZ0eEwbiVOE/Jj7v6rZC1tFW2s4GSICQOAyuOjc6WsNew==", - "devOptional": true, + "optional": true, + "peer": true, "requires": { "@prisma/engines": "4.5.0" } @@ -7062,15 +6474,6 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, - "promisify": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/promisify/-/promisify-0.0.3.tgz", - "integrity": "sha512-CcBGsRhhq466fsZVyHfptuKqon6eih0CqMsJE0kWIIjbpVNEyDoaKLELm2WVs//W/WXRBHip+6xhTExTkHUwtA==", - "dev": true, - "requires": { - "when": "" - } - }, "prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -7150,12 +6553,6 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" }, - "regexp-to-ast": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", - "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", - "dev": true - }, "regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", @@ -7245,17 +6642,6 @@ "lru-cache": "^6.0.0" } }, - "sentence-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", - "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", - "dev": true, - "requires": { - "no-case": "^3.0.4", - "tslib": "^2.0.3", - "upper-case-first": "^2.0.2" - } - }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -7307,16 +6693,6 @@ "is-fullwidth-code-point": "^3.0.0" } }, - "snake-case": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", - "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", - "dev": true, - "requires": { - "dot-case": "^3.0.4", - "tslib": "^2.0.3" - } - }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -7523,16 +6899,6 @@ "is-number": "^7.0.0" } }, - "ts-morph": { - "version": "16.0.0", - "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-16.0.0.tgz", - "integrity": "sha512-jGNF0GVpFj0orFw55LTsQxVYEUOCWBAbR5Ls7fTYE5pQsbW18ssTb/6UXx/GYAEjS+DQTp8VoTw0vqYMiaaQuw==", - "dev": true, - "requires": { - "@ts-morph/common": "~0.17.0", - "code-block-writer": "^11.0.3" - } - }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -7576,11 +6942,6 @@ "prelude-ls": "^1.2.1" } }, - "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" - }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -7614,24 +6975,6 @@ "picocolors": "^1.0.0" } }, - "upper-case": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", - "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, - "upper-case-first": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", - "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", - "dev": true, - "requires": { - "tslib": "^2.0.3" - } - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -7653,10 +6996,9 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", - "dev": true + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "v8-compile-cache": { "version": "2.3.0", @@ -7664,66 +7006,6 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "vscode-jsonrpc": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", - "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==", - "dev": true - }, - "vscode-languageclient": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.0.2.tgz", - "integrity": "sha512-lHlthJtphG9gibGb/y72CKqQUxwPsMXijJVpHEC2bvbFqxmkj9LwQ3aGU9dwjBLqsX1S4KjShYppLvg1UJDF/Q==", - "dev": true, - "requires": { - "minimatch": "^3.0.4", - "semver": "^7.3.5", - "vscode-languageserver-protocol": "3.17.2" - } - }, - "vscode-languageserver": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.0.2.tgz", - "integrity": "sha512-bpEt2ggPxKzsAOZlXmCJ50bV7VrxwCS5BI4+egUmure/oI/t4OlFzi/YNtVvY24A2UDOZAgwFGgnZPwqSJubkA==", - "dev": true, - "requires": { - "vscode-languageserver-protocol": "3.17.2" - } - }, - "vscode-languageserver-protocol": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz", - "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==", - "dev": true, - "requires": { - "vscode-jsonrpc": "8.0.2", - "vscode-languageserver-types": "3.17.2" - } - }, - "vscode-languageserver-textdocument": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", - "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==", - "dev": true - }, - "vscode-languageserver-types": { - "version": "3.17.2", - "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", - "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==", - "dev": true - }, - "vscode-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.6.tgz", - "integrity": "sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ==", - "dev": true - }, - "when": { - "version": "3.7.8", - "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", - "integrity": "sha512-5cZ7mecD3eYcMiCH4wtRPA5iFJZ50BJYDfckI5RRpQiktMiYTcn0ccLTZOvcbBume+1304fQztxeNzNS9Gvrnw==", - "dev": true - }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7774,22 +7056,40 @@ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "zenstack": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/zenstack/-/zenstack-0.2.4.tgz", - "integrity": "sha512-+FjPCiBmy9T/bERNqPZNN6B8Clj7dHKZg2vdyBKSLjC+tLZZsB6eGW1FlPaj3qdQp7zlxvacF8nvwnO1BwEWyg==", - "dev": true, - "requires": { - "@zenstackhq/internal": "0.2.4", + "version": "file:../../packages/schema", + "requires": { + "@prisma/internals": "^4.5.0", + "@types/jest": "^29.2.0", + "@types/node": "^14.18.32", + "@types/pluralize": "^0.0.29", + "@types/tmp": "^0.2.3", + "@types/uuid": "^8.3.4", + "@types/vscode": "^1.72.0", + "@typescript-eslint/eslint-plugin": "^4.33.0", + "@typescript-eslint/parser": "^4.33.0", + "@zenstackhq/internal": "workspace:*", "change-case": "^4.1.2", "chevrotain": "^9.1.0", "colors": "^1.4.0", "commander": "^8.3.0", + "concurrently": "^7.4.0", + "esbuild": "^0.15.12", + "eslint": "^7.32.0", + "jest": "^29.2.1", "langium": "^0.5.0", + "langium-cli": "^0.5.0", "pluralize": "^8.0.0", "prisma": "^4.5.0", "promisify": "^0.0.3", + "tmp": "^0.2.1", + "ts-jest": "^29.0.3", "ts-morph": "^16.0.0", + "ts-node": "^10.9.1", + "tsc-alias": "^1.7.0", + "tsconfig-paths-jest": "^0.0.1", + "typescript": "^4.8.4", "uuid": "^9.0.0", + "vsce": "^2.13.0", "vscode-jsonrpc": "^8.0.2", "vscode-languageclient": "^8.0.2", "vscode-languageserver": "^8.0.2", diff --git a/samples/todo/package.json b/samples/todo/package.json index 53daf9bf4..b4d845bbc 100644 --- a/samples/todo/package.json +++ b/samples/todo/package.json @@ -17,13 +17,14 @@ "dependencies": { "@heroicons/react": "^2.0.12", "@prisma/client": "^4.4.0", - "@zenstackhq/internal": "^0.2.4", - "@zenstackhq/runtime": "^0.2.4", + "@zenstackhq/internal": "file:../../packages/internal", + "@zenstackhq/runtime": "file:../../packages/runtime", + "bcryptjs": "^2.4.3", "daisyui": "^2.31.0", "moment": "^2.29.4", "nanoid": "^4.0.0", "next": "12.3.1", - "next-auth": "^4.10.3", + "next-auth": "^4.15.1", "react": "18.2.0", "react-dom": "18.2.0", "react-toastify": "^9.0.8", @@ -31,6 +32,7 @@ }, "devDependencies": { "@tailwindcss/line-clamp": "^0.4.2", + "@types/bcryptjs": "^2.4.2", "@types/node": "^14.17.3", "@types/react": "18.0.21", "@types/react-dom": "18.0.6", @@ -40,6 +42,6 @@ "postcss": "^8.4.16", "tailwindcss": "^3.1.8", "typescript": "^4.6.2", - "zenstack": "^0.2.4" + "zenstack": "file:../../packages/schema" } } diff --git a/samples/todo/tsconfig.json b/samples/todo/tsconfig.json index d65ace5ca..cdfdd1e3e 100644 --- a/samples/todo/tsconfig.json +++ b/samples/todo/tsconfig.json @@ -20,9 +20,9 @@ "@lib/*": ["lib/*"], "@components/*": ["lib/components/*"], "@components": ["lib/components/index"], - "@zenstack/*": [".zenstack/*"] + ".zenstack/*": ["node_modules/.zenstack/*"] } }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"], + "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", "zenstack.config.json"], "exclude": ["node_modules"] } diff --git a/samples/todo/zenstack.config.json b/samples/todo/zenstack.config.json new file mode 100644 index 000000000..63247b7f3 --- /dev/null +++ b/samples/todo/zenstack.config.json @@ -0,0 +1,3 @@ +{ + "log": ["verbose", "info", "warn", "error"] +} From 89475c4080d35c0f569803812f2cb42565a5f603 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Mon, 7 Nov 2022 13:50:22 +0800 Subject: [PATCH 02/10] feat: configurable logging --- README.md | 2 + docs/ref/setup-logging.md | 75 +++++ packages/internal/jest.config.ts | 3 + packages/internal/src/config.ts | 5 +- packages/internal/src/handler/data/handler.ts | 32 ++- packages/internal/src/service.ts | 95 +++++-- packages/internal/src/types.ts | 25 ++ packages/internal/tsconfig.json | 1 + pnpm-lock.yaml | 6 + samples/todo/package-lock.json | 15 +- tests/integration/jest.config.ts | 3 + tests/integration/package.json | 3 +- tests/integration/tests/logging.test.ts | 256 ++++++++++++++++++ 13 files changed, 475 insertions(+), 46 deletions(-) create mode 100644 docs/ref/setup-logging.md create mode 100644 tests/integration/tests/logging.test.ts diff --git a/README.md b/README.md index 8e8313ada..2316cd15b 100644 --- a/README.md +++ b/README.md @@ -272,6 +272,8 @@ export const getServerSideProps: GetServerSideProps = async () => { ### [Database hosting considerations](/docs/ref/database-hosting-considerations.md) +### [Setup logging](/docs/ref/setup-logging.md) + ## Reach out to us for issues, feedback and ideas! [Discord](https://discord.gg/dbuC9ZWc) [Twitter](https://twitter.com/zenstackhq) diff --git a/docs/ref/setup-logging.md b/docs/ref/setup-logging.md new file mode 100644 index 000000000..7e5194e27 --- /dev/null +++ b/docs/ref/setup-logging.md @@ -0,0 +1,75 @@ +# Setup Logging + +ZenStack uses the following levels to control server-side logging: + +1. error + + Error level logging + +1. warn + + Warning level logging + +1. info + + Info level logging + +1. verbose + + Verbose level logging + +1. query + + Detailed database query logging + +By default, ZenStack prints `error` and `warn` level of logging with `console.error` and `console.log`, respectively. You can also control the logging behavior by providing a `zenstack.config.json` file at the root of your project. + +You can turn log levels on and off in `zenstack.config.json`: + +```json +{ + "log": ["verbose", "info", "warn"] +} +``` + +You can also configure ZenStack to emit log as event instead of dumping to stdout, like: + +```json +{ + "log": [ + { + "level": "info", + "emit": "event" + } + ] +} +``` + +To consume the events: + +```ts +import service from '@zenstackhq/runtime'; + +service.$on('info', (event) => { + console.log(event.timestamp, event.message); +}); +``` + +You can also mix and match stdout output with event emitting, like: + +```json +{ + "log": [ + { + "level": "info", + "emit": "stdout" + }, + { + "level": "info", + "emit": "event" + } + ] +} +``` + +The settings in `zenstack.config.json` controls logging of both ZenStack and the underlying Prisma instance. diff --git a/packages/internal/jest.config.ts b/packages/internal/jest.config.ts index 5fde9b5bf..a04ad4290 100644 --- a/packages/internal/jest.config.ts +++ b/packages/internal/jest.config.ts @@ -10,6 +10,9 @@ export default { // Automatically clear mock calls, instances, contexts and results before every test clearMocks: true, + // Automatically reset mock state before every test + resetMocks: true, + // Indicates whether the coverage information should be collected while executing the test collectCoverage: true, diff --git a/packages/internal/src/config.ts b/packages/internal/src/config.ts index 9ee7dc2e9..dd50cd1ae 100644 --- a/packages/internal/src/config.ts +++ b/packages/internal/src/config.ts @@ -1,7 +1,4 @@ -/** - * Logging levels - */ -export type LogLevel = 'verbose' | 'info' | 'query' | 'warn' | 'error'; +import { LogLevel } from './types'; /** * Logging config definition diff --git a/packages/internal/src/handler/data/handler.ts b/packages/internal/src/handler/data/handler.ts index 5dbbdbc86..46896c2c4 100644 --- a/packages/internal/src/handler/data/handler.ts +++ b/packages/internal/src/handler/data/handler.ts @@ -49,6 +49,11 @@ export default class DataHandler const context = { user: await this.options.getServerUser(req, res) }; + this.service.info(`Handling data request: ${method} ${path}`); + if (req.body) { + this.service.verbose(`Request body: ${JSON.stringify(req.body)}`); + } + try { switch (method) { case 'GET': @@ -73,7 +78,7 @@ export default class DataHandler break; } } catch (err: unknown) { - this.service.info(`Error handling ${method} ${model}: ${err}`); + this.service.error(`${method} ${model}: ${err}`); if (err instanceof RequestHandlerError) { // in case of errors thrown directly by ZenStack @@ -85,12 +90,14 @@ export default class DataHandler message: err.message, }); break; + case ServerErrorCode.ENTITY_NOT_FOUND: res.status(404).send({ code: err.code, message: err.message, }); break; + default: res.status(400).send({ code: err.code, @@ -112,6 +119,14 @@ export default class DataHandler message: 'an unhandled Prisma error occurred', }); } + } else if (this.isPrismaClientValidationError(err)) { + // prisma validation error + res.status(400).send({ + code: ServerErrorCode.INVALID_REQUEST_PARAMS, + message: getServerErrorMessage( + ServerErrorCode.INVALID_REQUEST_PARAMS + ), + }); } else { // generic errors this.service.error( @@ -463,8 +478,17 @@ export default class DataHandler } } - private isPrismaClientKnownRequestError(err: any): err is { code: string } { - // we can't reference Prisma generated types so need to weakly check error type - return !!err.clientVersion && typeof err.code === 'string'; + private isPrismaClientKnownRequestError( + err: any + ): err is { code: string; message: string } { + return ( + err.__proto__.constructor.name === 'PrismaClientKnownRequestError' + ); + } + + private isPrismaClientValidationError( + err: any + ): err is { message: string } { + return err.__proto__.constructor.name === 'PrismaClientValidationError'; } } diff --git a/packages/internal/src/service.ts b/packages/internal/src/service.ts index 2f5c13f91..994075106 100644 --- a/packages/internal/src/service.ts +++ b/packages/internal/src/service.ts @@ -1,33 +1,58 @@ import * as fs from 'fs'; import { EventEmitter } from 'stream'; -import { LogLevel, ServiceConfig } from './config'; -import { FieldInfo, PolicyOperationKind, QueryContext, Service } from './types'; +import { ServiceConfig } from './config'; +import { + FieldInfo, + LogEvent, + LogLevel, + PolicyOperationKind, + QueryContext, + Service, +} from './types'; import colors from 'colors'; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -type EventHandler = (eventType: any, handler: (event: unknown) => void) => void; - -export abstract class DefaultService - implements Service +export abstract class DefaultService< + DbClient extends { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + $on: (eventType: any, handler: (event: any) => void) => void; + } +> implements Service { - protected readonly config: ServiceConfig; - private readonly prisma: DbClient; + protected config: ServiceConfig; + private prisma: DbClient; protected readonly logEmitter = new EventEmitter(); private readonly logSettings = { query: { stdout: false, emit: false }, verbose: { stdout: false, emit: false }, - info: { stdout: false, emit: false }, - warn: { stdout: false, emit: false }, - error: { stdout: false, emit: false }, + info: { stdout: true, emit: false }, + warn: { stdout: true, emit: false }, + error: { stdout: true, emit: false }, }; // eslint-disable-next-line @typescript-eslint/no-explicit-any private guardModule: any; + private readonly prismaLogLevels: LogLevel[] = [ + 'query', + 'info', + 'warn', + 'error', + ]; + constructor() { + this.initialize(); + } + + private initialize() { this.config = this.loadConfig(); // initialize log sink mapping if (this.config.log) { + // reset all levels + for (const key of Object.keys(this.logSettings)) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (this.logSettings as any)[key] = { stdout: false, emit: false }; + } + for (const entry of this.config.log) { const level = typeof entry === 'string' ? entry : entry.level; if (!Object.keys(this.logSettings).includes(level)) { @@ -51,31 +76,39 @@ export abstract class DefaultService this.prisma = this.initializePrisma(); - this.prisma.$on('query', (e) => this.logEmitter.emit('query', e)); - this.prisma.$on('info', (e) => this.logEmitter.emit('info', e)); - this.prisma.$on('warn', (e) => this.logEmitter.emit('warn', e)); - this.prisma.$on('error', (e) => this.logEmitter.emit('error', e)); + for (const level of this.prismaLogLevels) { + if (this.logSettings[level].emit) { + this.verbose(`Hooking prisma log level ${level}`); + this.prisma.$on(level, (e) => { + this.logEmitter.emit(level, e); + }); + } + } } - private handleEvent(eventType: LogLevel, event: unknown): void { - if (this.logSettings[eventType].stdout) { - switch (eventType) { + $on(level: LogLevel, callback: (event: LogEvent) => void): void { + this.logEmitter.on(level, callback); + } + + private handleLog(level: LogLevel, message: string): void { + if (this.logSettings[level].stdout) { + switch (level) { case 'verbose': - console.log(colors.blue(`zenstack:${eventType}`), event); + console.log(colors.blue(`zenstack:${level}`), message); break; case 'info': - console.log(colors.cyan(`zenstack:${eventType}`), event); + console.log(colors.cyan(`zenstack:${level}`), message); break; case 'warn': - console.warn(colors.yellow(`zenstack:${eventType}`), event); + console.warn(colors.yellow(`zenstack:${level}`), message); break; case 'error': - console.error(colors.red(`zenstack:${eventType}`), event); + console.error(colors.red(`zenstack:${level}`), message); break; } } - if (this.logSettings[eventType].emit) { - this.logEmitter.emit(eventType, event); + if (this.logSettings[level].emit) { + this.logEmitter.emit(level, { timestamp: new Date(), message }); } } @@ -123,19 +156,23 @@ export abstract class DefaultService } verbose(message: string): void { - this.handleEvent('verbose', message); + this.handleLog('verbose', message); } info(message: string): void { - this.handleEvent('info', message); + this.handleLog('info', message); } warn(message: string): void { - this.handleEvent('warn', message); + this.handleLog('warn', message); } error(message: string): void { - this.handleEvent('error', message); + this.handleLog('error', message); + } + + reinitialize(): void { + this.initialize(); } protected abstract initializePrisma(): DbClient; diff --git a/packages/internal/src/types.ts b/packages/internal/src/types.ts index 54292b24a..214ab49b6 100644 --- a/packages/internal/src/types.ts +++ b/packages/internal/src/types.ts @@ -62,6 +62,11 @@ export type DbClientContract = Record & { ) => Promise; }; +/** + * Logging levels + */ +export type LogLevel = 'verbose' | 'info' | 'query' | 'warn' | 'error'; + /** * The main service of ZenStack. Implementation of this interface is automatically generated. */ @@ -113,6 +118,11 @@ export interface Service { * Generates a log message with error level. */ error(message: string): void; + + /** + * Registers a listener to log events. + */ + $on(level: LogLevel, callback: (event: LogEvent) => void): void; } /** @@ -182,3 +192,18 @@ export function getServerErrorMessage(code: ServerErrorCode): string { return `generic error: ${code}`; } } + +export type LogEventHandler = ( + // eslint-disable-next-line @typescript-eslint/no-explicit-any + LogEvent: any, + handler: (event: LogEvent) => void +) => void; + +export type LogEvent = { + timestamp: Date; + query?: string; + params?: string; + duration?: number; + target?: string; + message?: string; +}; diff --git a/packages/internal/tsconfig.json b/packages/internal/tsconfig.json index f58f60c5e..5f19b5c6d 100644 --- a/packages/internal/tsconfig.json +++ b/packages/internal/tsconfig.json @@ -14,6 +14,7 @@ "forceConsistentCasingInFileNames": true, "declaration": true, "resolveJsonModule": true, + "strictPropertyInitialization": false, "paths": {} }, "include": ["src/**/*.ts"], diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d75d3b9f0..255825555 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -147,6 +147,7 @@ importers: bcryptjs: ^2.4.3 jest: ^29.0.3 next: ^12.3.1 + sleep-promise: ^9.1.0 supertest: ^6.3.0 tmp: ^0.2.1 ts-jest: ^29.0.1 @@ -155,6 +156,7 @@ importers: dependencies: '@types/node': 14.18.29 bcryptjs: 2.4.3 + sleep-promise: 9.1.0 devDependencies: '@types/bcryptjs': 2.4.2 '@types/jest': 29.0.3 @@ -5775,6 +5777,10 @@ packages: engines: {node: '>=8'} dev: true + /sleep-promise/9.1.0: + resolution: {integrity: sha512-UHYzVpz9Xn8b+jikYSD6bqvf754xL2uBUzDFwiU6NcdZeifPr6UfgU43xpkPu67VMS88+TI2PSI7Eohgqf2fKA==} + dev: false + /slice-ansi/3.0.0: resolution: {integrity: sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==} engines: {node: '>=8'} diff --git a/samples/todo/package-lock.json b/samples/todo/package-lock.json index eccf33b4b..70cea1995 100644 --- a/samples/todo/package-lock.json +++ b/samples/todo/package-lock.json @@ -1,12 +1,12 @@ { "name": "todo", - "version": "0.2.4", + "version": "0.2.8", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "todo", - "version": "0.2.4", + "version": "0.2.8", "dependencies": { "@heroicons/react": "^2.0.12", "@prisma/client": "^4.4.0", @@ -39,14 +39,13 @@ } }, "../../packages/internal": { - "name": "@zenstackhq/internal", - "version": "0.2.4", + "version": "0.2.8", "license": "MIT", "dependencies": { "bcryptjs": "^2.4.3", + "colors": "^1.4.0", "cuid": "^2.1.8", "deepcopy": "^2.1.0", - "pino": "^8.7.0", "swr": "^1.3.0" }, "devDependencies": { @@ -71,7 +70,7 @@ }, "../../packages/runtime": { "name": "@zenstackhq/runtime", - "version": "0.2.4", + "version": "0.2.8", "license": "MIT", "dependencies": { "@zenstackhq/internal": "latest" @@ -83,7 +82,7 @@ }, "../../packages/schema": { "name": "zenstack", - "version": "0.2.4", + "version": "0.2.8", "dev": true, "dependencies": { "@zenstackhq/internal": "workspace:*", @@ -4628,10 +4627,10 @@ "@types/node": "^14.18.29", "@types/uuid": "^8.3.4", "bcryptjs": "^2.4.3", + "colors": "^1.4.0", "cuid": "^2.1.8", "deepcopy": "^2.1.0", "jest": "^29.0.3", - "pino": "^8.7.0", "swr": "^1.3.0", "ts-jest": "^29.0.1", "ts-node": "^10.9.1", diff --git a/tests/integration/jest.config.ts b/tests/integration/jest.config.ts index baae4eb9e..c28f3fec7 100644 --- a/tests/integration/jest.config.ts +++ b/tests/integration/jest.config.ts @@ -6,6 +6,9 @@ export default { // Automatically clear mock calls, instances, contexts and results before every test clearMocks: true, + // Automatically reset mock state before every test + resetMocks: true, + // A map from regular expressions to paths to transformers transform: { '^.+\\.tsx?$': 'ts-jest' }, diff --git a/tests/integration/package.json b/tests/integration/package.json index 8a9a5f4c8..7d79e122b 100644 --- a/tests/integration/package.json +++ b/tests/integration/package.json @@ -24,6 +24,7 @@ }, "dependencies": { "@types/node": "^14.18.29", - "bcryptjs": "^2.4.3" + "bcryptjs": "^2.4.3", + "sleep-promise": "^9.1.0" } } diff --git a/tests/integration/tests/logging.test.ts b/tests/integration/tests/logging.test.ts new file mode 100644 index 000000000..0ed28d0ff --- /dev/null +++ b/tests/integration/tests/logging.test.ts @@ -0,0 +1,256 @@ +import path from 'path'; +import { makeClient, run, setup } from './utils'; +import * as fs from 'fs'; +import type { DefaultService, Service } from '../../../packages/runtime/server'; + +describe('Logging tests', () => { + let origDir: string; + + beforeAll(async () => { + origDir = path.resolve('.'); + await setup('./tests/todo.zmodel'); + }); + + beforeEach(() => { + run('npx prisma migrate reset --schema ./zenstack/schema.prisma -f'); + }); + + afterAll(() => { + process.chdir(origDir); + }); + + it('logging with default settings', async () => { + const service: DefaultService = require('@zenstackhq/runtime'); + service.reinitialize(); + + let gotInfoEmit = false; + let gotQueryEmit = false; + let gotVerboseEmit = false; + let gotErrorEmit = false; + + let gotInfoStd = false; + let gotQueryStd = false; + let gotVerboseStd = false; + let gotErrorStd = false; + + console.log = jest.fn((...args) => { + const msg = args?.[0] as string; + if (msg.includes('prisma:query')) { + gotQueryStd = true; + } + if (msg.includes('zenstack:verbose')) { + gotVerboseStd = true; + } + if (msg.includes('zenstack:info')) { + gotInfoStd = true; + } + }); + + console.error = jest.fn((...args) => { + const msg = args?.[0] as string; + if (msg.includes('zenstack:error')) { + gotErrorStd = true; + } + }); + + service.$on('info', (event) => { + console.log('Got info', event); + gotInfoEmit = true; + }); + + service.$on('query', (event) => { + console.log('Got query', event); + gotQueryEmit = true; + }); + + service.$on('verbose', (event) => { + console.log('Got verbose', event); + gotVerboseEmit = true; + }); + + service.$on('error', (event) => { + console.log('Got error', event); + gotErrorEmit = true; + }); + + await makeClient('/api/data/User').post('/').send({ + data: {}, + }); + + expect(gotQueryStd).toBeFalsy(); + expect(gotVerboseStd).toBeFalsy(); + expect(gotInfoStd).toBeTruthy(); + expect(gotErrorStd).toBeTruthy(); + + expect(gotInfoEmit).toBeFalsy(); + expect(gotQueryEmit).toBeFalsy(); + expect(gotVerboseEmit).toBeFalsy(); + expect(gotErrorEmit).toBeFalsy(); + }); + + it('logging with stdout', async () => { + fs.writeFileSync( + './zenstack.config.json', + ` + { + "log": ["query", "verbose", "info", "error"] + } + ` + ); + + const service: DefaultService = require('@zenstackhq/runtime'); + service.reinitialize(); + + let gotInfoEmit = false; + let gotQueryEmit = false; + let gotVerboseEmit = false; + let gotErrorEmit = false; + + let gotInfoStd = false; + let gotQueryStd = false; + let gotVerboseStd = false; + let gotErrorStd = false; + + console.log = jest.fn((...args) => { + const msg = args?.[0] as string; + if (msg.includes('prisma:query')) { + gotQueryStd = true; + } + if (msg.includes('zenstack:verbose')) { + gotVerboseStd = true; + } + if (msg.includes('zenstack:info')) { + gotInfoStd = true; + } + }); + + console.error = jest.fn((...args) => { + const msg = args?.[0] as string; + if (msg.includes('zenstack:error')) { + gotErrorStd = true; + } + }); + + service.$on('info', (event) => { + console.log('Got info', event); + gotInfoEmit = true; + }); + + service.$on('query', (event) => { + console.log('Got query', event); + gotQueryEmit = true; + }); + + service.$on('verbose', (event) => { + console.log('Got verbose', event); + gotVerboseEmit = true; + }); + + service.$on('error', (event) => { + console.log('Got error', event); + gotErrorEmit = true; + }); + + await makeClient('/api/data/User').post('/').send({ + data: {}, + }); + + expect(gotQueryStd).toBeTruthy(); + expect(gotVerboseStd).toBeTruthy(); + expect(gotInfoStd).toBeTruthy(); + expect(gotErrorStd).toBeTruthy(); + + expect(gotInfoEmit).toBeFalsy(); + expect(gotQueryEmit).toBeFalsy(); + expect(gotVerboseEmit).toBeFalsy(); + expect(gotErrorEmit).toBeFalsy(); + }); + + it('logging with event', async () => { + fs.writeFileSync( + './zenstack.config.json', + ` + { + "log": [ + { "level": "query", "emit": "event" }, + { "level": "verbose", "emit": "event" }, + { "level": "info", "emit": "event" }, + { "level": "error", "emit": "event" } + ] + } + ` + ); + + const service: DefaultService = require('@zenstackhq/runtime'); + service.reinitialize(); + + let gotInfoEmit = false; + let gotQueryEmit = false; + let gotVerboseEmit = false; + let gotErrorEmit = false; + + let gotInfoStd = false; + let gotQueryStd = false; + let gotVerboseStd = false; + let gotErrorStd = false; + + console.log = jest.fn((...args) => { + const msg = args?.[0] as string; + if (msg.includes('prisma:query')) { + gotQueryStd = true; + } + if (msg.includes('zenstack:verbose')) { + gotVerboseStd = true; + } + if (msg.includes('zenstack:info')) { + gotInfoStd = true; + } + }); + + console.error = jest.fn((...args) => { + const msg = args?.[0] as string; + if (msg.includes('zenstack:error')) { + gotErrorStd = true; + } + }); + + service.$on('info', (event) => { + expect(event.timestamp).toBeTruthy(); + expect(event.message).toBeTruthy(); + gotInfoEmit = true; + }); + + service.$on('query', (event) => { + expect(event.timestamp).not.toBeUndefined(); + expect(event.query).not.toBeUndefined(); + expect(event.duration).not.toBeUndefined(); + gotQueryEmit = true; + }); + + service.$on('verbose', (event) => { + expect(event.timestamp).not.toBeUndefined(); + expect(event.message).not.toBeUndefined(); + gotVerboseEmit = true; + }); + + service.$on('error', (event) => { + expect(event.timestamp).not.toBeUndefined(); + expect(event.message).not.toBeUndefined(); + gotErrorEmit = true; + }); + + await makeClient('/api/data/User').post('/').send({ + data: {}, + }); + + expect(gotInfoEmit).toBeTruthy(); + expect(gotQueryEmit).toBeTruthy(); + expect(gotVerboseEmit).toBeTruthy(); + expect(gotErrorEmit).toBeTruthy(); + + expect(gotInfoStd).toBeFalsy(); + expect(gotQueryStd).toBeFalsy(); + expect(gotVerboseStd).toBeFalsy(); + expect(gotErrorStd).toBeFalsy(); + }); +}); From 5f94df7fc27e160753a507b0a06e0769d5b04140 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Mon, 7 Nov 2022 13:55:29 +0800 Subject: [PATCH 03/10] changes --- packages/internal/src/handler/data/handler.ts | 2 +- samples/todo/zenstack.config.json | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) delete mode 100644 samples/todo/zenstack.config.json diff --git a/packages/internal/src/handler/data/handler.ts b/packages/internal/src/handler/data/handler.ts index 46896c2c4..ee664e292 100644 --- a/packages/internal/src/handler/data/handler.ts +++ b/packages/internal/src/handler/data/handler.ts @@ -49,7 +49,7 @@ export default class DataHandler const context = { user: await this.options.getServerUser(req, res) }; - this.service.info(`Handling data request: ${method} ${path}`); + this.service.verbose(`Data request: ${method} ${path}`); if (req.body) { this.service.verbose(`Request body: ${JSON.stringify(req.body)}`); } diff --git a/samples/todo/zenstack.config.json b/samples/todo/zenstack.config.json deleted file mode 100644 index 63247b7f3..000000000 --- a/samples/todo/zenstack.config.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "log": ["verbose", "info", "warn", "error"] -} From d895e82b897ca859f83555e7d45f8fda29381179 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Mon, 7 Nov 2022 14:00:01 +0800 Subject: [PATCH 04/10] changes --- tests/integration/jest.config.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/integration/jest.config.ts b/tests/integration/jest.config.ts index c28f3fec7..bba1c0b6d 100644 --- a/tests/integration/jest.config.ts +++ b/tests/integration/jest.config.ts @@ -12,7 +12,7 @@ export default { // A map from regular expressions to paths to transformers transform: { '^.+\\.tsx?$': 'ts-jest' }, - testTimeout: 120000, + testTimeout: 300000, // explicitly specify moduel paths so that resolution from local dependencies work modulePaths: ['/tests/test-run/node_modules'], From 959471492f7e5f8e45d62a45de69179569e61cf4 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Mon, 7 Nov 2022 14:21:28 +0800 Subject: [PATCH 05/10] fixes --- packages/schema/package.json | 4 ++-- pnpm-lock.yaml | 31 ++++++++++++++----------- samples/todo/package-lock.json | 1 + samples/todo/package.json | 3 ++- tests/integration/tests/logging.test.ts | 24 +++++++++---------- 5 files changed, 34 insertions(+), 29 deletions(-) diff --git a/packages/schema/package.json b/packages/schema/package.json index 984c6fe8f..105681840 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -65,9 +65,9 @@ "main": "./bundle/extension.js", "scripts": { "vscode:publish": "vsce publish --no-dependencies", - "vscode:prepublish": "cp ../../README.md ./ && pnpm lint && pnpm build && pnpm bundle", + "vscode:prepublish": "cp ../../README.md ./ && pnpm lint && pnpm build", "vscode:package": "vsce package --no-dependencies", - "build": "cp -r src/res/* bundle/res/ && pnpm langium:generate && tsc --noEmit", + "build": "cp -r src/res/* bundle/res/ && pnpm langium:generate && tsc --noEmit && pnpm bundle", "bundle": "node build/bundle.js --minify", "bundle-watch": "node build/bundle.js --watch", "ts:watch": "tsc --watch --noEmit", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 255825555..ebd9e45a8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -31,7 +31,7 @@ importers: colors: 1.4.0 cuid: 2.1.8 deepcopy: 2.1.0 - next: 12.3.1_6tziyx3dehkoeijunclpkpolha + next: 12.3.1_qtpcxnaaarbm4ws7ughq6oxfve react: 18.2.0 react-dom: 18.2.0_react@18.2.0 swr: 1.3.0_react@18.2.0 @@ -42,7 +42,7 @@ importers: '@types/node': 14.18.29 '@types/uuid': 8.3.4 jest: 29.0.3_johvxhudwcpndp4mle25vwrlq4 - ts-jest: 29.0.1_poggjixajg6vd6yquly7s7dsj4 + ts-jest: 29.0.1_t3cec5bure72u77t3utxqeumoa ts-node: 10.9.1_ck2axrxkiif44rdbzjywaqjysa tsc-alias: 1.7.0 tsconfig-paths-jest: 0.0.1 @@ -163,10 +163,10 @@ importers: '@types/supertest': 2.0.12 '@types/tmp': 0.2.3 jest: 29.0.3_johvxhudwcpndp4mle25vwrlq4 - next: 12.3.1_6tziyx3dehkoeijunclpkpolha + next: 12.3.1_qtpcxnaaarbm4ws7ughq6oxfve supertest: 6.3.0 tmp: 0.2.1 - ts-jest: 29.0.1_poggjixajg6vd6yquly7s7dsj4 + ts-jest: 29.0.1_t3cec5bure72u77t3utxqeumoa ts-node: 10.9.1_ck2axrxkiif44rdbzjywaqjysa typescript: 4.8.3 @@ -216,6 +216,7 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color + dev: true /@babel/core/7.19.6: resolution: {integrity: sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==} @@ -238,7 +239,6 @@ packages: semver: 6.3.0 transitivePeerDependencies: - supports-color - dev: true /@babel/generator/7.19.5: resolution: {integrity: sha512-DxbNz9Lz4aMZ99qPpO1raTbcrI1ZeYh+9NR9qhfkQIbFtVEqotHojEBxHzmxhVONkGt6VyrqVQcgpefMy9pqcg==} @@ -247,6 +247,7 @@ packages: '@babel/types': 7.19.4 '@jridgewell/gen-mapping': 0.3.2 jsesc: 2.5.2 + dev: true /@babel/generator/7.19.6: resolution: {integrity: sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==} @@ -267,6 +268,7 @@ packages: '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.4 semver: 6.3.0 + dev: true /@babel/helper-compilation-targets/7.19.3_@babel+core@7.19.6: resolution: {integrity: sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==} @@ -279,7 +281,6 @@ packages: '@babel/helper-validator-option': 7.18.6 browserslist: 4.21.4 semver: 6.3.0 - dev: true /@babel/helper-environment-visitor/7.18.9: resolution: {integrity: sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==} @@ -318,6 +319,7 @@ packages: '@babel/types': 7.19.4 transitivePeerDependencies: - supports-color + dev: true /@babel/helper-module-transforms/7.19.6: resolution: {integrity: sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==} @@ -333,7 +335,6 @@ packages: '@babel/types': 7.19.4 transitivePeerDependencies: - supports-color - dev: true /@babel/helper-plugin-utils/7.19.0: resolution: {integrity: sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==} @@ -345,13 +346,13 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.19.4 + dev: true /@babel/helper-simple-access/7.19.4: resolution: {integrity: sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==} engines: {node: '>=6.9.0'} dependencies: '@babel/types': 7.19.4 - dev: true /@babel/helper-split-export-declaration/7.18.6: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} @@ -395,6 +396,7 @@ packages: hasBin: true dependencies: '@babel/types': 7.19.4 + dev: true /@babel/parser/7.19.6: resolution: {integrity: sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==} @@ -685,6 +687,7 @@ packages: globals: 11.12.0 transitivePeerDependencies: - supports-color + dev: true /@babel/traverse/7.19.6: resolution: {integrity: sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==} @@ -5049,7 +5052,7 @@ packages: engines: {node: '>=10'} dev: true - /next/12.3.1_6tziyx3dehkoeijunclpkpolha: + /next/12.3.1_qtpcxnaaarbm4ws7ughq6oxfve: resolution: {integrity: sha512-l7bvmSeIwX5lp07WtIiP9u2ytZMv7jIeB8iacR28PuUEFG5j0HGAPnMqyG5kbZNBG2H7tRsrQ4HCjuMOPnANZw==} engines: {node: '>=12.22.0'} hasBin: true @@ -5073,7 +5076,7 @@ packages: postcss: 8.4.14 react: 18.2.0 react-dom: 18.2.0_react@18.2.0 - styled-jsx: 5.0.7_b6k74wvxdvqypha4emuv7fd2ke + styled-jsx: 5.0.7_otspjrsspon4ofp37rshhlhp2y use-sync-external-store: 1.2.0_react@18.2.0 optionalDependencies: '@next/swc-android-arm-eabi': 12.3.1 @@ -5922,7 +5925,7 @@ packages: engines: {node: '>=8'} dev: true - /styled-jsx/5.0.7_b6k74wvxdvqypha4emuv7fd2ke: + /styled-jsx/5.0.7_otspjrsspon4ofp37rshhlhp2y: resolution: {integrity: sha512-b3sUzamS086YLRuvnaDigdAewz1/EFYlHpYBP5mZovKEdQQOIIYq8lApylub3HHZ6xFjV051kkGU7cudJmrXEA==} engines: {node: '>= 12.0.0'} peerDependencies: @@ -5935,7 +5938,7 @@ packages: babel-plugin-macros: optional: true dependencies: - '@babel/core': 7.19.3 + '@babel/core': 7.19.6 react: 18.2.0 /superagent/8.0.2: @@ -6122,7 +6125,7 @@ packages: hasBin: true dev: true - /ts-jest/29.0.1_poggjixajg6vd6yquly7s7dsj4: + /ts-jest/29.0.1_t3cec5bure72u77t3utxqeumoa: resolution: {integrity: sha512-htQOHshgvhn93QLxrmxpiQPk69+M1g7govO1g6kf6GsjCv4uvRV0znVmDrrvjUrVCnTYeY4FBxTYYYD4airyJA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -6143,7 +6146,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.19.3 + '@babel/core': 7.19.6 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 29.0.3_johvxhudwcpndp4mle25vwrlq4 diff --git a/samples/todo/package-lock.json b/samples/todo/package-lock.json index 70cea1995..7773513ed 100644 --- a/samples/todo/package-lock.json +++ b/samples/todo/package-lock.json @@ -39,6 +39,7 @@ } }, "../../packages/internal": { + "name": "@zenstackhq/internal", "version": "0.2.8", "license": "MIT", "dependencies": { diff --git a/samples/todo/package.json b/samples/todo/package.json index db4187141..8b4d2402c 100644 --- a/samples/todo/package.json +++ b/samples/todo/package.json @@ -12,7 +12,8 @@ "db:deploy": "zenstack migrate deploy", "db:reset": "zenstack migrate reset", "generate": "zenstack generate", - "vercel-build": "npm run build && npm run db:deploy" + "build-deps": "pushd ../.. && npx -y pnpm i && npx -y pnpm build && popd", + "vercel-build": "npm run build-deps && npm i && npm run build && npm run db:deploy" }, "dependencies": { "@heroicons/react": "^2.0.12", diff --git a/tests/integration/tests/logging.test.ts b/tests/integration/tests/logging.test.ts index 0ed28d0ff..6d0f9eb2b 100644 --- a/tests/integration/tests/logging.test.ts +++ b/tests/integration/tests/logging.test.ts @@ -1,7 +1,7 @@ import path from 'path'; import { makeClient, run, setup } from './utils'; import * as fs from 'fs'; -import type { DefaultService, Service } from '../../../packages/runtime/server'; +import type { DefaultService } from '../../../packages/runtime/server'; describe('Logging tests', () => { let origDir: string; @@ -38,17 +38,17 @@ describe('Logging tests', () => { if (msg.includes('prisma:query')) { gotQueryStd = true; } - if (msg.includes('zenstack:verbose')) { + if (msg.includes(':verbose')) { gotVerboseStd = true; } - if (msg.includes('zenstack:info')) { + if (msg.includes(':info')) { gotInfoStd = true; } }); console.error = jest.fn((...args) => { const msg = args?.[0] as string; - if (msg.includes('zenstack:error')) { + if (msg.includes(':error')) { gotErrorStd = true; } }); @@ -79,7 +79,7 @@ describe('Logging tests', () => { expect(gotQueryStd).toBeFalsy(); expect(gotVerboseStd).toBeFalsy(); - expect(gotInfoStd).toBeTruthy(); + expect(gotInfoStd).toBeFalsy(); expect(gotErrorStd).toBeTruthy(); expect(gotInfoEmit).toBeFalsy(); @@ -113,20 +113,20 @@ describe('Logging tests', () => { console.log = jest.fn((...args) => { const msg = args?.[0] as string; - if (msg.includes('prisma:query')) { + if (msg.includes(':query')) { gotQueryStd = true; } - if (msg.includes('zenstack:verbose')) { + if (msg.includes(':verbose')) { gotVerboseStd = true; } - if (msg.includes('zenstack:info')) { + if (msg.includes(':info')) { gotInfoStd = true; } }); console.error = jest.fn((...args) => { const msg = args?.[0] as string; - if (msg.includes('zenstack:error')) { + if (msg.includes(':error')) { gotErrorStd = true; } }); @@ -196,13 +196,13 @@ describe('Logging tests', () => { console.log = jest.fn((...args) => { const msg = args?.[0] as string; - if (msg.includes('prisma:query')) { + if (msg.includes(':query')) { gotQueryStd = true; } - if (msg.includes('zenstack:verbose')) { + if (msg.includes(':verbose')) { gotVerboseStd = true; } - if (msg.includes('zenstack:info')) { + if (msg.includes(':info')) { gotInfoStd = true; } }); From 68133a14bf8d7098a30deedeb086ac13507127b9 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Mon, 7 Nov 2022 14:27:24 +0800 Subject: [PATCH 06/10] node_env dev when building deps --- pnpm-lock.yaml | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ebd9e45a8..f6f0d47da 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,7 +42,7 @@ importers: '@types/node': 14.18.29 '@types/uuid': 8.3.4 jest: 29.0.3_johvxhudwcpndp4mle25vwrlq4 - ts-jest: 29.0.1_t3cec5bure72u77t3utxqeumoa + ts-jest: 29.0.1_poggjixajg6vd6yquly7s7dsj4 ts-node: 10.9.1_ck2axrxkiif44rdbzjywaqjysa tsc-alias: 1.7.0 tsconfig-paths-jest: 0.0.1 @@ -6125,6 +6125,40 @@ packages: hasBin: true dev: true + /ts-jest/29.0.1_poggjixajg6vd6yquly7s7dsj4: + resolution: {integrity: sha512-htQOHshgvhn93QLxrmxpiQPk69+M1g7govO1g6kf6GsjCv4uvRV0znVmDrrvjUrVCnTYeY4FBxTYYYD4airyJA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.19.3 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.0.3_johvxhudwcpndp4mle25vwrlq4 + jest-util: 29.0.3 + json5: 2.2.1 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.3.7 + typescript: 4.8.3 + yargs-parser: 21.1.1 + dev: true + /ts-jest/29.0.1_t3cec5bure72u77t3utxqeumoa: resolution: {integrity: sha512-htQOHshgvhn93QLxrmxpiQPk69+M1g7govO1g6kf6GsjCv4uvRV0znVmDrrvjUrVCnTYeY4FBxTYYYD4airyJA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} From 43d6b85f5e3ee0b8633d158e09ed641e99d16467 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Mon, 7 Nov 2022 14:33:28 +0800 Subject: [PATCH 07/10] prod false --- samples/todo/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/todo/package.json b/samples/todo/package.json index 8b4d2402c..20fdf348e 100644 --- a/samples/todo/package.json +++ b/samples/todo/package.json @@ -12,7 +12,7 @@ "db:deploy": "zenstack migrate deploy", "db:reset": "zenstack migrate reset", "generate": "zenstack generate", - "build-deps": "pushd ../.. && npx -y pnpm i && npx -y pnpm build && popd", + "build-deps": "pushd ../.. && npx -y pnpm i --prod=false && npx -y pnpm build && popd", "vercel-build": "npm run build-deps && npm i && npm run build && npm run db:deploy" }, "dependencies": { From 20aca1fe3a2ca001d31968df3e32f837554f5b7b Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Mon, 7 Nov 2022 14:36:18 +0800 Subject: [PATCH 08/10] copy file later --- packages/schema/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/schema/package.json b/packages/schema/package.json index 105681840..18daaed9a 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -67,7 +67,7 @@ "vscode:publish": "vsce publish --no-dependencies", "vscode:prepublish": "cp ../../README.md ./ && pnpm lint && pnpm build", "vscode:package": "vsce package --no-dependencies", - "build": "cp -r src/res/* bundle/res/ && pnpm langium:generate && tsc --noEmit && pnpm bundle", + "build": "pnpm langium:generate && tsc --noEmit && pnpm bundle && cp -r src/res/* bundle/res/", "bundle": "node build/bundle.js --minify", "bundle-watch": "node build/bundle.js --watch", "ts:watch": "tsc --watch --noEmit", From f2d875be61b36f8752b90bc6eda5e75d8530917f Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Mon, 7 Nov 2022 14:43:29 +0800 Subject: [PATCH 09/10] update --- samples/todo/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/samples/todo/package.json b/samples/todo/package.json index 20fdf348e..d27955df8 100644 --- a/samples/todo/package.json +++ b/samples/todo/package.json @@ -13,7 +13,7 @@ "db:reset": "zenstack migrate reset", "generate": "zenstack generate", "build-deps": "pushd ../.. && npx -y pnpm i --prod=false && npx -y pnpm build && popd", - "vercel-build": "npm run build-deps && npm i && npm run build && npm run db:deploy" + "vercel-build": "npm i && npm run build && npm run db:deploy" }, "dependencies": { "@heroicons/react": "^2.0.12", From 53deccd82e9221cdc3b937b4ce71d49b07144c89 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Mon, 7 Nov 2022 14:49:51 +0800 Subject: [PATCH 10/10] bump version --- package.json | 2 +- packages/internal/package.json | 2 +- packages/runtime/package.json | 2 +- packages/schema/package.json | 2 +- samples/todo/package-lock.json | 1014 +++++++++++++++++++++++++++----- samples/todo/package.json | 11 +- 6 files changed, 866 insertions(+), 167 deletions(-) diff --git a/package.json b/package.json index a7e2d3088..5f9c2d7fc 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zenstack-monorepo", - "version": "0.2.8", + "version": "0.2.9", "description": "", "scripts": { "build": "pnpm -r build", diff --git a/packages/internal/package.json b/packages/internal/package.json index 12312e82d..895906c38 100644 --- a/packages/internal/package.json +++ b/packages/internal/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/internal", - "version": "0.2.8", + "version": "0.2.9", "displayName": "ZenStack Internal Library", "description": "ZenStack internal runtime library. This package is for supporting runtime functionality of ZenStack and not supposed to be used directly.", "repository": { diff --git a/packages/runtime/package.json b/packages/runtime/package.json index c7da9dc11..0da45ec7b 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/runtime", "displayName": "ZenStack Runtime Library", - "version": "0.2.8", + "version": "0.2.9", "description": "This package contains runtime library for consuming client and server side code generated by ZenStack.", "repository": { "type": "git", diff --git a/packages/schema/package.json b/packages/schema/package.json index 18daaed9a..3dbe8e7bd 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -3,7 +3,7 @@ "publisher": "zenstack", "displayName": "ZenStack Language Tools", "description": "ZenStack is a toolkit that simplifies full-stack development", - "version": "0.2.8", + "version": "0.2.9", "author": { "name": "ZenStack Team" }, diff --git a/samples/todo/package-lock.json b/samples/todo/package-lock.json index 7773513ed..244c5595a 100644 --- a/samples/todo/package-lock.json +++ b/samples/todo/package-lock.json @@ -1,17 +1,17 @@ { "name": "todo", - "version": "0.2.8", + "version": "0.2.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "todo", - "version": "0.2.8", + "version": "0.2.9", "dependencies": { "@heroicons/react": "^2.0.12", "@prisma/client": "^4.4.0", - "@zenstackhq/internal": "file:../../packages/internal", - "@zenstackhq/runtime": "file:../../packages/runtime", + "@zenstackhq/internal": "^0.2.9", + "@zenstackhq/runtime": "^0.2.9", "bcryptjs": "^2.4.3", "daisyui": "^2.31.0", "moment": "^2.29.4", @@ -35,102 +35,7 @@ "postcss": "^8.4.16", "tailwindcss": "^3.1.8", "typescript": "^4.6.2", - "zenstack": "file:../../packages/schema" - } - }, - "../../packages/internal": { - "name": "@zenstackhq/internal", - "version": "0.2.8", - "license": "MIT", - "dependencies": { - "bcryptjs": "^2.4.3", - "colors": "^1.4.0", - "cuid": "^2.1.8", - "deepcopy": "^2.1.0", - "swr": "^1.3.0" - }, - "devDependencies": { - "@prisma/client": "^4.4.0", - "@types/bcryptjs": "^2.4.2", - "@types/jest": "^29.0.3", - "@types/node": "^14.18.29", - "@types/uuid": "^8.3.4", - "jest": "^29.0.3", - "ts-jest": "^29.0.1", - "ts-node": "^10.9.1", - "tsc-alias": "^1.7.0", - "tsconfig-paths-jest": "^0.0.1", - "typescript": "^4.6.2" - }, - "peerDependencies": { - "@prisma/client": "^4.4.0", - "next": "12.3.1", - "react": "^17.0.2 || ^18", - "react-dom": "^17.0.2 || ^18" - } - }, - "../../packages/runtime": { - "name": "@zenstackhq/runtime", - "version": "0.2.8", - "license": "MIT", - "dependencies": { - "@zenstackhq/internal": "latest" - }, - "peerDependencies": { - "@types/bcryptjs": "^2.4.2", - "bcryptjs": "^2.4.3" - } - }, - "../../packages/schema": { - "name": "zenstack", - "version": "0.2.8", - "dev": true, - "dependencies": { - "@zenstackhq/internal": "workspace:*", - "change-case": "^4.1.2", - "chevrotain": "^9.1.0", - "colors": "^1.4.0", - "commander": "^8.3.0", - "langium": "^0.5.0", - "pluralize": "^8.0.0", - "prisma": "^4.5.0", - "promisify": "^0.0.3", - "ts-morph": "^16.0.0", - "uuid": "^9.0.0", - "vscode-jsonrpc": "^8.0.2", - "vscode-languageclient": "^8.0.2", - "vscode-languageserver": "^8.0.2", - "vscode-languageserver-textdocument": "^1.0.7", - "vscode-uri": "^3.0.6" - }, - "bin": { - "zenstack": "bin/cli" - }, - "devDependencies": { - "@prisma/internals": "^4.5.0", - "@types/jest": "^29.2.0", - "@types/node": "^14.18.32", - "@types/pluralize": "^0.0.29", - "@types/tmp": "^0.2.3", - "@types/uuid": "^8.3.4", - "@types/vscode": "^1.72.0", - "@typescript-eslint/eslint-plugin": "^4.33.0", - "@typescript-eslint/parser": "^4.33.0", - "concurrently": "^7.4.0", - "esbuild": "^0.15.12", - "eslint": "^7.32.0", - "jest": "^29.2.1", - "langium-cli": "^0.5.0", - "tmp": "^0.2.1", - "ts-jest": "^29.0.3", - "ts-node": "^10.9.1", - "tsc-alias": "^1.7.0", - "tsconfig-paths-jest": "^0.0.1", - "typescript": "^4.8.4", - "vsce": "^2.13.0" - }, - "engines": { - "vscode": "^1.72.0" + "zenstack": "^0.2.9" } }, "node_modules/@babel/code-frame": { @@ -260,6 +165,18 @@ "node": ">=6.9.0" } }, + "node_modules/@chevrotain/types": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-9.1.0.tgz", + "integrity": "sha512-3hbCD1CThkv9gnaSIPq0GUXwKni68e0ph6jIHwCvcWiQ4JB2xi8bFxBain0RF04qHUWuDjgnZLj4rLgimuGO+g==", + "dev": true + }, + "node_modules/@chevrotain/utils": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-9.1.0.tgz", + "integrity": "sha512-llLJZ8OAlZrjGlBvamm6Zdo/HmGAcCLq5gx7cSwUX8No+n/8ip+oaC4x33IdZIif8+Rh5dQUIZXmfbSghiOmNQ==", + "dev": true + }, "node_modules/@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -581,9 +498,8 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.5.0.tgz", "integrity": "sha512-4t9ir2SbQQr/wMCNU4YpHWp5hU14J2m3wHUZnGJPpmBF8YtkisxyVyQsKd1e6FyLTaGq8LOLhm6VLYHKqKNm+g==", - "hasInstallScript": true, - "optional": true, - "peer": true + "devOptional": true, + "hasInstallScript": true }, "node_modules/@prisma/engines-version": { "version": "4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452", @@ -613,11 +529,43 @@ "tailwindcss": ">=2.0.0 || >=3.0.0 || >=3.0.0-alpha.1" } }, + "node_modules/@ts-morph/common": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.17.0.tgz", + "integrity": "sha512-RMSSvSfs9kb0VzkvQ2NWobwnj7TxCA9vI/IjR9bDHqgAyVbu2T0DN4wiKVqomyDWqO7dPr/tErSfq7urQ1Q37g==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.11", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + } + }, + "node_modules/@ts-morph/common/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@ts-morph/common/node_modules/minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@types/bcryptjs": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", - "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==", - "dev": true + "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -774,12 +722,34 @@ } }, "node_modules/@zenstackhq/internal": { - "resolved": "../../packages/internal", - "link": true + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@zenstackhq/internal/-/internal-0.2.9.tgz", + "integrity": "sha512-Hq+JfXZ9s0v9m085V53kSwlLcZXlNMktuU4DHjiIlPFkTBssYZXphg0FxKHEhfA+FQct1vwDagIAB0UsZyYScg==", + "dependencies": { + "bcryptjs": "^2.4.3", + "colors": "^1.4.0", + "cuid": "^2.1.8", + "deepcopy": "^2.1.0", + "swr": "^1.3.0" + }, + "peerDependencies": { + "@prisma/client": "^4.4.0", + "next": "12.3.1", + "react": "^17.0.2 || ^18", + "react-dom": "^17.0.2 || ^18" + } }, "node_modules/@zenstackhq/runtime": { - "resolved": "../../packages/runtime", - "link": true + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@zenstackhq/runtime/-/runtime-0.2.9.tgz", + "integrity": "sha512-l2DqjAqKQe4bCyu0mta1WKtDKNE4/VH51n4UfOTy6xCTSqmTTqTRdEqWypC2u52yMzrRb8re5c749HN8B0OL7A==", + "dependencies": { + "@zenstackhq/internal": "latest" + }, + "peerDependencies": { + "@types/bcryptjs": "^2.4.2", + "bcryptjs": "^2.4.3" + } }, "node_modules/acorn": { "version": "7.4.1", @@ -1122,6 +1092,16 @@ "node": ">=6" } }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "node_modules/camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -1145,6 +1125,17 @@ } ] }, + "node_modules/capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -1161,6 +1152,37 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dev": true, + "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.0.3" + } + }, + "node_modules/chevrotain": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-9.1.0.tgz", + "integrity": "sha512-A86/55so63HCfu0dgGg3j9u8uuuBOrSqly1OhBZxRu2x6sAKILLzfVjbGMw45kgier6lz45EzcjjWtTRgoT84Q==", + "dev": true, + "dependencies": { + "@chevrotain/types": "^9.1.0", + "@chevrotain/utils": "^9.1.0", + "regexp-to-ast": "0.5.0" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -1195,6 +1217,12 @@ "node": ">=6" } }, + "node_modules/code-block-writer": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", + "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==", + "dev": true + }, "node_modules/color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -1232,12 +1260,40 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, "node_modules/cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -1297,6 +1353,11 @@ "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", "dev": true }, + "node_modules/cuid": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz", + "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==" + }, "node_modules/daisyui": { "version": "2.31.0", "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-2.31.0.tgz", @@ -1341,6 +1402,14 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/deepcopy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/deepcopy/-/deepcopy-2.1.0.tgz", + "integrity": "sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==", + "dependencies": { + "type-detect": "^4.0.8" + } + }, "node_modules/define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -1415,6 +1484,16 @@ "node": ">=6.0.0" } }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", @@ -2321,6 +2400,16 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dev": true, + "dependencies": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -2669,6 +2758,21 @@ "node": ">=4.0" } }, + "node_modules/langium": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/langium/-/langium-0.5.0.tgz", + "integrity": "sha512-7mheQQtyyPm8r9R+8sPZopcdzEcHtCC+M52m8ZbotzNql8RPLs3+QbDY6EZ98ejKtJCGt9RviTkfZEt1LxX86w==", + "dev": true, + "dependencies": { + "chevrotain": "^9.1.0", + "vscode-languageserver": "^8.0.2", + "vscode-languageserver-textdocument": "^1.0.7", + "vscode-uri": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, "node_modules/language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -2728,6 +2832,15 @@ "loose-envify": "cli.js" } }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -2779,6 +2892,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", @@ -2926,6 +3051,16 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node_modules/node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", @@ -3114,6 +3249,16 @@ "node": ">= 0.8.0" } }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -3126,6 +3271,32 @@ "node": ">=6" } }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "node_modules/path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -3182,6 +3353,15 @@ "node": ">=0.10.0" } }, + "node_modules/pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss": { "version": "8.4.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", @@ -3351,9 +3531,8 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.5.0.tgz", "integrity": "sha512-9Aeg4qiKlv9Wsjz4NO8k2CzRzlvS3A4FYVJ5+28sBBZ0eEwbiVOE/Jj7v6rZC1tFW2s4GSICQOAyuOjc6WsNew==", + "devOptional": true, "hasInstallScript": true, - "optional": true, - "peer": true, "dependencies": { "@prisma/engines": "4.5.0" }, @@ -3374,6 +3553,15 @@ "node": ">=0.4.0" } }, + "node_modules/promisify": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/promisify/-/promisify-0.0.3.tgz", + "integrity": "sha512-CcBGsRhhq466fsZVyHfptuKqon6eih0CqMsJE0kWIIjbpVNEyDoaKLELm2WVs//W/WXRBHip+6xhTExTkHUwtA==", + "dev": true, + "dependencies": { + "when": "" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -3489,6 +3677,12 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" }, + "node_modules/regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "dev": true + }, "node_modules/regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", @@ -3635,6 +3829,17 @@ "node": ">=10" } }, + "node_modules/sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dev": true, + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -3704,6 +3909,16 @@ "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, + "node_modules/snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "node_modules/source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -3981,6 +4196,16 @@ "node": ">=8.0" } }, + "node_modules/ts-morph": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-16.0.0.tgz", + "integrity": "sha512-jGNF0GVpFj0orFw55LTsQxVYEUOCWBAbR5Ls7fTYE5pQsbW18ssTb/6UXx/GYAEjS+DQTp8VoTw0vqYMiaaQuw==", + "dev": true, + "dependencies": { + "@ts-morph/common": "~0.17.0", + "code-block-writer": "^11.0.3" + } + }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -4031,6 +4256,14 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -4096,6 +4329,24 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dev": true, + "dependencies": { + "tslib": "^2.0.3" + } + }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -4132,6 +4383,75 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "node_modules/vscode-jsonrpc": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", + "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.0.2.tgz", + "integrity": "sha512-lHlthJtphG9gibGb/y72CKqQUxwPsMXijJVpHEC2bvbFqxmkj9LwQ3aGU9dwjBLqsX1S4KjShYppLvg1UJDF/Q==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4", + "semver": "^7.3.5", + "vscode-languageserver-protocol": "3.17.2" + }, + "engines": { + "vscode": "^1.67.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.0.2.tgz", + "integrity": "sha512-bpEt2ggPxKzsAOZlXmCJ50bV7VrxwCS5BI4+egUmure/oI/t4OlFzi/YNtVvY24A2UDOZAgwFGgnZPwqSJubkA==", + "dev": true, + "dependencies": { + "vscode-languageserver-protocol": "3.17.2" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz", + "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "8.0.2", + "vscode-languageserver-types": "3.17.2" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", + "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==", + "dev": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", + "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==", + "dev": true + }, + "node_modules/vscode-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.6.tgz", + "integrity": "sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ==", + "dev": true + }, + "node_modules/when": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", + "integrity": "sha512-5cZ7mecD3eYcMiCH4wtRPA5iFJZ50BJYDfckI5RRpQiktMiYTcn0ccLTZOvcbBume+1304fQztxeNzNS9Gvrnw==", + "dev": true + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4200,8 +4520,43 @@ } }, "node_modules/zenstack": { - "resolved": "../../packages/schema", - "link": true + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/zenstack/-/zenstack-0.2.9.tgz", + "integrity": "sha512-qLEM04i5T2rByrgCf8AWgc1LvBa4f3+IsxxBK+DtwiRaNPfYaZB7Z7Nck1vLHlu8S2eas/Sxm+DmeCiX5NlsyA==", + "dev": true, + "dependencies": { + "@zenstackhq/internal": "0.2.9", + "change-case": "^4.1.2", + "chevrotain": "^9.1.0", + "colors": "^1.4.0", + "commander": "^8.3.0", + "langium": "^0.5.0", + "pluralize": "^8.0.0", + "prisma": "^4.5.0", + "promisify": "^0.0.3", + "ts-morph": "^16.0.0", + "uuid": "^9.0.0", + "vscode-jsonrpc": "^8.0.2", + "vscode-languageclient": "^8.0.2", + "vscode-languageserver": "^8.0.2", + "vscode-languageserver-textdocument": "^1.0.7", + "vscode-uri": "^3.0.6" + }, + "bin": { + "zenstack": "bin/cli" + }, + "engines": { + "vscode": "^1.72.0" + } + }, + "node_modules/zenstack/node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } } }, "dependencies": { @@ -4307,6 +4662,18 @@ "regenerator-runtime": "^0.13.4" } }, + "@chevrotain/types": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@chevrotain/types/-/types-9.1.0.tgz", + "integrity": "sha512-3hbCD1CThkv9gnaSIPq0GUXwKni68e0ph6jIHwCvcWiQ4JB2xi8bFxBain0RF04qHUWuDjgnZLj4rLgimuGO+g==", + "dev": true + }, + "@chevrotain/utils": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/@chevrotain/utils/-/utils-9.1.0.tgz", + "integrity": "sha512-llLJZ8OAlZrjGlBvamm6Zdo/HmGAcCLq5gx7cSwUX8No+n/8ip+oaC4x33IdZIif8+Rh5dQUIZXmfbSghiOmNQ==", + "dev": true + }, "@eslint/eslintrc": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", @@ -4479,8 +4846,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/@prisma/engines/-/engines-4.5.0.tgz", "integrity": "sha512-4t9ir2SbQQr/wMCNU4YpHWp5hU14J2m3wHUZnGJPpmBF8YtkisxyVyQsKd1e6FyLTaGq8LOLhm6VLYHKqKNm+g==", - "optional": true, - "peer": true + "devOptional": true }, "@prisma/engines-version": { "version": "4.5.0-43.0362da9eebca54d94c8ef5edd3b2e90af99ba452", @@ -4508,11 +4874,42 @@ "dev": true, "requires": {} }, + "@ts-morph/common": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/@ts-morph/common/-/common-0.17.0.tgz", + "integrity": "sha512-RMSSvSfs9kb0VzkvQ2NWobwnj7TxCA9vI/IjR9bDHqgAyVbu2T0DN4wiKVqomyDWqO7dPr/tErSfq7urQ1Q37g==", + "dev": true, + "requires": { + "fast-glob": "^3.2.11", + "minimatch": "^5.1.0", + "mkdirp": "^1.0.4", + "path-browserify": "^1.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "@types/bcryptjs": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@types/bcryptjs/-/bcryptjs-2.4.2.tgz", - "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==", - "dev": true + "integrity": "sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==" }, "@types/json5": { "version": "0.0.29", @@ -4620,28 +5017,21 @@ } }, "@zenstackhq/internal": { - "version": "file:../../packages/internal", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@zenstackhq/internal/-/internal-0.2.9.tgz", + "integrity": "sha512-Hq+JfXZ9s0v9m085V53kSwlLcZXlNMktuU4DHjiIlPFkTBssYZXphg0FxKHEhfA+FQct1vwDagIAB0UsZyYScg==", "requires": { - "@prisma/client": "^4.4.0", - "@types/bcryptjs": "^2.4.2", - "@types/jest": "^29.0.3", - "@types/node": "^14.18.29", - "@types/uuid": "^8.3.4", "bcryptjs": "^2.4.3", "colors": "^1.4.0", "cuid": "^2.1.8", "deepcopy": "^2.1.0", - "jest": "^29.0.3", - "swr": "^1.3.0", - "ts-jest": "^29.0.1", - "ts-node": "^10.9.1", - "tsc-alias": "^1.7.0", - "tsconfig-paths-jest": "^0.0.1", - "typescript": "^4.6.2" + "swr": "^1.3.0" } }, "@zenstackhq/runtime": { - "version": "file:../../packages/runtime", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/@zenstackhq/runtime/-/runtime-0.2.9.tgz", + "integrity": "sha512-l2DqjAqKQe4bCyu0mta1WKtDKNE4/VH51n4UfOTy6xCTSqmTTqTRdEqWypC2u52yMzrRb8re5c749HN8B0OL7A==", "requires": { "@zenstackhq/internal": "latest" } @@ -4880,6 +5270,16 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dev": true, + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, "camelcase-css": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", @@ -4890,6 +5290,17 @@ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001422.tgz", "integrity": "sha512-hSesn02u1QacQHhaxl/kNMZwqVG35Sz/8DgvmgedxSH8z9UUpcDYSPYgsj3x5dQNRcNp6BwpSfQfVzYUTm+fog==" }, + "capital-case": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz", + "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -4900,6 +5311,37 @@ "supports-color": "^7.1.0" } }, + "change-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", + "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==", + "dev": true, + "requires": { + "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.0.3" + } + }, + "chevrotain": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/chevrotain/-/chevrotain-9.1.0.tgz", + "integrity": "sha512-A86/55so63HCfu0dgGg3j9u8uuuBOrSqly1OhBZxRu2x6sAKILLzfVjbGMw45kgier6lz45EzcjjWtTRgoT84Q==", + "dev": true, + "requires": { + "@chevrotain/types": "^9.1.0", + "@chevrotain/utils": "^9.1.0", + "regexp-to-ast": "0.5.0" + } + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -4920,6 +5362,12 @@ "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==" }, + "code-block-writer": { + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/code-block-writer/-/code-block-writer-11.0.3.tgz", + "integrity": "sha512-NiujjUFB4SwScJq2bwbYUtXbZhBSlY6vYzm++3Q6oC+U+injTqfPYFK8wS9COOmb2lueqp0ZRB4nK1VYeHgNyw==", + "dev": true + }, "color": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/color/-/color-4.2.3.tgz", @@ -4951,12 +5399,34 @@ "simple-swizzle": "^0.2.2" } }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true + }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "constant-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz", + "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case": "^2.0.2" + } + }, "cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", @@ -4999,6 +5469,11 @@ "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==", "dev": true }, + "cuid": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/cuid/-/cuid-2.1.8.tgz", + "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==" + }, "daisyui": { "version": "2.31.0", "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-2.31.0.tgz", @@ -5031,6 +5506,14 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "deepcopy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/deepcopy/-/deepcopy-2.1.0.tgz", + "integrity": "sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==", + "requires": { + "type-detect": "^4.0.8" + } + }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -5084,6 +5567,16 @@ "esutils": "^2.0.2" } }, + "dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "electron-to-chromium": { "version": "1.4.284", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", @@ -5771,6 +6264,16 @@ "has-symbols": "^1.0.2" } }, + "header-case": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz", + "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==", + "dev": true, + "requires": { + "capital-case": "^1.0.4", + "tslib": "^2.0.3" + } + }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", @@ -6017,6 +6520,18 @@ "object.assign": "^4.1.3" } }, + "langium": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/langium/-/langium-0.5.0.tgz", + "integrity": "sha512-7mheQQtyyPm8r9R+8sPZopcdzEcHtCC+M52m8ZbotzNql8RPLs3+QbDY6EZ98ejKtJCGt9RviTkfZEt1LxX86w==", + "dev": true, + "requires": { + "chevrotain": "^9.1.0", + "vscode-languageserver": "^8.0.2", + "vscode-languageserver-textdocument": "^1.0.7", + "vscode-uri": "^3.0.2" + } + }, "language-subtag-registry": { "version": "0.3.22", "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", @@ -6067,6 +6582,15 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -6103,6 +6627,12 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, "moment": { "version": "2.29.4", "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", @@ -6184,6 +6714,16 @@ "uuid": "^8.3.2" } }, + "no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dev": true, + "requires": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, "node-releases": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz", @@ -6321,6 +6861,16 @@ "word-wrap": "^1.2.3" } }, + "param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -6330,6 +6880,32 @@ "callsites": "^3.0.0" } }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true + }, + "path-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz", + "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -6368,6 +6944,12 @@ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==" }, + "pluralize": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", + "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==", + "dev": true + }, "postcss": { "version": "8.4.18", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.18.tgz", @@ -6462,8 +7044,7 @@ "version": "4.5.0", "resolved": "https://registry.npmjs.org/prisma/-/prisma-4.5.0.tgz", "integrity": "sha512-9Aeg4qiKlv9Wsjz4NO8k2CzRzlvS3A4FYVJ5+28sBBZ0eEwbiVOE/Jj7v6rZC1tFW2s4GSICQOAyuOjc6WsNew==", - "optional": true, - "peer": true, + "devOptional": true, "requires": { "@prisma/engines": "4.5.0" } @@ -6474,6 +7055,15 @@ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, + "promisify": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/promisify/-/promisify-0.0.3.tgz", + "integrity": "sha512-CcBGsRhhq466fsZVyHfptuKqon6eih0CqMsJE0kWIIjbpVNEyDoaKLELm2WVs//W/WXRBHip+6xhTExTkHUwtA==", + "dev": true, + "requires": { + "when": "" + } + }, "prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -6553,6 +7143,12 @@ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz", "integrity": "sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==" }, + "regexp-to-ast": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/regexp-to-ast/-/regexp-to-ast-0.5.0.tgz", + "integrity": "sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==", + "dev": true + }, "regexp.prototype.flags": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", @@ -6642,6 +7238,17 @@ "lru-cache": "^6.0.0" } }, + "sentence-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz", + "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==", + "dev": true, + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3", + "upper-case-first": "^2.0.2" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6693,6 +7300,16 @@ "is-fullwidth-code-point": "^3.0.0" } }, + "snake-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz", + "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==", + "dev": true, + "requires": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", @@ -6899,6 +7516,16 @@ "is-number": "^7.0.0" } }, + "ts-morph": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-16.0.0.tgz", + "integrity": "sha512-jGNF0GVpFj0orFw55LTsQxVYEUOCWBAbR5Ls7fTYE5pQsbW18ssTb/6UXx/GYAEjS+DQTp8VoTw0vqYMiaaQuw==", + "dev": true, + "requires": { + "@ts-morph/common": "~0.17.0", + "code-block-writer": "^11.0.3" + } + }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -6942,6 +7569,11 @@ "prelude-ls": "^1.2.1" } }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, "type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -6975,6 +7607,24 @@ "picocolors": "^1.0.0" } }, + "upper-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz", + "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, + "upper-case-first": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz", + "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==", + "dev": true, + "requires": { + "tslib": "^2.0.3" + } + }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -7006,6 +7656,66 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, + "vscode-jsonrpc": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-8.0.2.tgz", + "integrity": "sha512-RY7HwI/ydoC1Wwg4gJ3y6LpU9FJRZAUnTYMXthqhFXXu77ErDd/xkREpGuk4MyYkk4a+XDWAMqe0S3KkelYQEQ==", + "dev": true + }, + "vscode-languageclient": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-8.0.2.tgz", + "integrity": "sha512-lHlthJtphG9gibGb/y72CKqQUxwPsMXijJVpHEC2bvbFqxmkj9LwQ3aGU9dwjBLqsX1S4KjShYppLvg1UJDF/Q==", + "dev": true, + "requires": { + "minimatch": "^3.0.4", + "semver": "^7.3.5", + "vscode-languageserver-protocol": "3.17.2" + } + }, + "vscode-languageserver": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-8.0.2.tgz", + "integrity": "sha512-bpEt2ggPxKzsAOZlXmCJ50bV7VrxwCS5BI4+egUmure/oI/t4OlFzi/YNtVvY24A2UDOZAgwFGgnZPwqSJubkA==", + "dev": true, + "requires": { + "vscode-languageserver-protocol": "3.17.2" + } + }, + "vscode-languageserver-protocol": { + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.17.2.tgz", + "integrity": "sha512-8kYisQ3z/SQ2kyjlNeQxbkkTNmVFoQCqkmGrzLH6A9ecPlgTbp3wDTnUNqaUxYr4vlAcloxx8zwy7G5WdguYNg==", + "dev": true, + "requires": { + "vscode-jsonrpc": "8.0.2", + "vscode-languageserver-types": "3.17.2" + } + }, + "vscode-languageserver-textdocument": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.7.tgz", + "integrity": "sha512-bFJH7UQxlXT8kKeyiyu41r22jCZXG8kuuVVA33OEJn1diWOZK5n8zBSPZFHVBOu8kXZ6h0LIRhf5UnCo61J4Hg==", + "dev": true + }, + "vscode-languageserver-types": { + "version": "3.17.2", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.17.2.tgz", + "integrity": "sha512-zHhCWatviizPIq9B7Vh9uvrH6x3sK8itC84HkamnBWoDFJtzBf7SWlpLCZUit72b3os45h6RWQNC9xHRDF8dRA==", + "dev": true + }, + "vscode-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.6.tgz", + "integrity": "sha512-fmL7V1eiDBFRRnu+gfRWTzyPpNIHJTc4mWnFkwBUmO9U3KPgJAmTx7oxi2bl/Rh6HLdU7+4C9wlj0k2E4AdKFQ==", + "dev": true + }, + "when": { + "version": "3.7.8", + "resolved": "https://registry.npmjs.org/when/-/when-3.7.8.tgz", + "integrity": "sha512-5cZ7mecD3eYcMiCH4wtRPA5iFJZ50BJYDfckI5RRpQiktMiYTcn0ccLTZOvcbBume+1304fQztxeNzNS9Gvrnw==", + "dev": true + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -7056,45 +7766,35 @@ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "zenstack": { - "version": "file:../../packages/schema", - "requires": { - "@prisma/internals": "^4.5.0", - "@types/jest": "^29.2.0", - "@types/node": "^14.18.32", - "@types/pluralize": "^0.0.29", - "@types/tmp": "^0.2.3", - "@types/uuid": "^8.3.4", - "@types/vscode": "^1.72.0", - "@typescript-eslint/eslint-plugin": "^4.33.0", - "@typescript-eslint/parser": "^4.33.0", - "@zenstackhq/internal": "workspace:*", + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/zenstack/-/zenstack-0.2.9.tgz", + "integrity": "sha512-qLEM04i5T2rByrgCf8AWgc1LvBa4f3+IsxxBK+DtwiRaNPfYaZB7Z7Nck1vLHlu8S2eas/Sxm+DmeCiX5NlsyA==", + "dev": true, + "requires": { + "@zenstackhq/internal": "0.2.9", "change-case": "^4.1.2", "chevrotain": "^9.1.0", "colors": "^1.4.0", "commander": "^8.3.0", - "concurrently": "^7.4.0", - "esbuild": "^0.15.12", - "eslint": "^7.32.0", - "jest": "^29.2.1", "langium": "^0.5.0", - "langium-cli": "^0.5.0", "pluralize": "^8.0.0", "prisma": "^4.5.0", "promisify": "^0.0.3", - "tmp": "^0.2.1", - "ts-jest": "^29.0.3", "ts-morph": "^16.0.0", - "ts-node": "^10.9.1", - "tsc-alias": "^1.7.0", - "tsconfig-paths-jest": "^0.0.1", - "typescript": "^4.8.4", "uuid": "^9.0.0", - "vsce": "^2.13.0", "vscode-jsonrpc": "^8.0.2", "vscode-languageclient": "^8.0.2", "vscode-languageserver": "^8.0.2", "vscode-languageserver-textdocument": "^1.0.7", "vscode-uri": "^3.0.6" + }, + "dependencies": { + "uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "dev": true + } } } } diff --git a/samples/todo/package.json b/samples/todo/package.json index d27955df8..16d1f3739 100644 --- a/samples/todo/package.json +++ b/samples/todo/package.json @@ -1,6 +1,6 @@ { "name": "todo", - "version": "0.2.8", + "version": "0.2.9", "private": true, "scripts": { "dev": "next dev", @@ -12,14 +12,13 @@ "db:deploy": "zenstack migrate deploy", "db:reset": "zenstack migrate reset", "generate": "zenstack generate", - "build-deps": "pushd ../.. && npx -y pnpm i --prod=false && npx -y pnpm build && popd", - "vercel-build": "npm i && npm run build && npm run db:deploy" + "vercel-build": "npm run build && npm run db:deploy" }, "dependencies": { "@heroicons/react": "^2.0.12", "@prisma/client": "^4.4.0", - "@zenstackhq/internal": "file:../../packages/internal", - "@zenstackhq/runtime": "file:../../packages/runtime", + "@zenstackhq/internal": "^0.2.9", + "@zenstackhq/runtime": "^0.2.9", "bcryptjs": "^2.4.3", "daisyui": "^2.31.0", "moment": "^2.29.4", @@ -43,6 +42,6 @@ "postcss": "^8.4.16", "tailwindcss": "^3.1.8", "typescript": "^4.6.2", - "zenstack": "file:../../packages/schema" + "zenstack": "^0.2.9" } }