diff --git a/packages/cli/src/actions/generate.ts b/packages/cli/src/actions/generate.ts index c014c02ef..351ecceb0 100644 --- a/packages/cli/src/actions/generate.ts +++ b/packages/cli/src/actions/generate.ts @@ -20,8 +20,10 @@ type Options = { output?: string; silent: boolean; watch: boolean; - lite: boolean; - liteOnly: boolean; + lite?: boolean; + liteOnly?: boolean; + generateModels?: boolean; + generateInput?: boolean; }; /** @@ -181,12 +183,18 @@ async function runPlugins(schemaFile: string, model: Model, outputPath: string, // merge CLI options if (provider === '@core/typescript') { - if (pluginOptions['lite'] === undefined) { + if (options.lite !== undefined) { pluginOptions['lite'] = options.lite; } - if (pluginOptions['liteOnly'] === undefined) { + if (options.liteOnly !== undefined) { pluginOptions['liteOnly'] = options.liteOnly; } + if (options.generateModels !== undefined) { + pluginOptions['generateModels'] = options.generateModels; + } + if (options.generateInput !== undefined) { + pluginOptions['generateInput'] = options.generateInput; + } } processedPlugins.push({ cliPlugin, pluginOptions }); @@ -196,7 +204,12 @@ async function runPlugins(schemaFile: string, model: Model, outputPath: string, const defaultPlugins = [ { plugin: corePlugins['typescript'], - options: { lite: options.lite, liteOnly: options.liteOnly }, + options: { + lite: options.lite, + liteOnly: options.liteOnly, + generateModels: options.generateModels, + generateInput: options.generateInput, + }, }, ]; defaultPlugins.forEach(({ plugin, options }) => { diff --git a/packages/cli/src/index.ts b/packages/cli/src/index.ts index bc52a9803..fcc4685c3 100644 --- a/packages/cli/src/index.ts +++ b/packages/cli/src/index.ts @@ -43,6 +43,14 @@ const proxyAction = async (options: Parameters[0]): Promis await telemetry.trackCommand('proxy', () => actions.proxy(options)); }; +function triStateBooleanOption(flag: string, description: string) { + return new Option(flag, description).choices(['true', 'false']).argParser((value) => { + if (value === undefined || value === 'true') return true; + if (value === 'false') return false; + throw new CliError(`Invalid value for ${flag}: ${value}`); + }); +} + function createProgram() { const program = new Command('zen') .alias('zenstack') @@ -74,8 +82,20 @@ function createProgram() { .addOption(noVersionCheckOption) .addOption(new Option('-o, --output ', 'default output directory for code generation')) .addOption(new Option('-w, --watch', 'enable watch mode').default(false)) - .addOption(new Option('--lite', 'also generate a lite version of schema without attributes').default(false)) - .addOption(new Option('--lite-only', 'only generate lite version of schema without attributes').default(false)) + .addOption( + triStateBooleanOption( + '--lite [boolean]', + 'also generate a lite version of schema without attributes, defaults to false', + ), + ) + .addOption( + triStateBooleanOption( + '--lite-only [boolean]', + 'only generate lite version of schema without attributes, defaults to false', + ), + ) + .addOption(triStateBooleanOption('--generate-models [boolean]', 'generate models.ts file, defaults to true')) + .addOption(triStateBooleanOption('--generate-input [boolean]', 'generate input.ts file, defaults to true')) .addOption(new Option('--silent', 'suppress all output except errors').default(false)) .action(generateAction); diff --git a/packages/cli/src/plugins/typescript.ts b/packages/cli/src/plugins/typescript.ts index 8b3465e80..80576ac35 100644 --- a/packages/cli/src/plugins/typescript.ts +++ b/packages/cli/src/plugins/typescript.ts @@ -28,11 +28,19 @@ const plugin: CliPlugin = { throw new Error('The "importWithFileExtension" option must be a string if specified.'); } + // whether to generate models.ts + const generateModelTypes = pluginOptions['generateModels'] !== false; + + // whether to generate input.ts + const generateInputTypes = pluginOptions['generateInput'] !== false; + await new TsSchemaGenerator().generate(model, { outDir, lite, liteOnly, importWithFileExtension: importWithFileExtension as string | undefined, + generateModelTypes, + generateInputTypes, }); }, }; diff --git a/packages/cli/test/generate.test.ts b/packages/cli/test/generate.test.ts index 6b270b4a8..646cbb680 100644 --- a/packages/cli/test/generate.test.ts +++ b/packages/cli/test/generate.test.ts @@ -60,6 +60,40 @@ describe('CLI generate command test', () => { expect(fs.existsSync(path.join(workDir, 'bar/schema.ts'))).toBe(true); }); + it('should respect plugin lite options', async () => { + const modelWithPlugin = ` +plugin typescript { + provider = "@core/typescript" + lite = true +} + +model User { + id String @id @default(cuid()) +} +`; + const { workDir } = await createProject(modelWithPlugin); + runCli('generate', workDir); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema.ts'))).toBe(true); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema-lite.ts'))).toBe(true); + }); + + it('should respect plugin lite-only options', async () => { + const modelWithPlugin = ` +plugin typescript { + provider = "@core/typescript" + liteOnly = true +} + +model User { + id String @id @default(cuid()) +} +`; + const { workDir } = await createProject(modelWithPlugin); + runCli('generate', workDir); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema.ts'))).toBe(false); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema-lite.ts'))).toBe(true); + }); + it('should respect lite option', async () => { const { workDir } = await createProject(model); runCli('generate --lite', workDir); @@ -73,4 +107,114 @@ describe('CLI generate command test', () => { expect(fs.existsSync(path.join(workDir, 'zenstack/schema.ts'))).toBe(false); expect(fs.existsSync(path.join(workDir, 'zenstack/schema-lite.ts'))).toBe(true); }); + + it('should respect explicit liteOnly true option', async () => { + const { workDir } = await createProject(model); + runCli('generate --lite-only=true', workDir); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema.ts'))).toBe(false); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema-lite.ts'))).toBe(true); + }); + + it('should respect explicit liteOnly false option', async () => { + const { workDir } = await createProject(model); + runCli('generate --lite-only=false', workDir); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema.ts'))).toBe(true); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema-lite.ts'))).toBe(false); + }); + + it('should prefer CLI options over @core/typescript plugin settings for lite and liteOnly', async () => { + const modelWithPlugin = ` +plugin typescript { + provider = "@core/typescript" + lite = true + liteOnly = true +} + +model User { + id String @id @default(cuid()) +} +`; + const { workDir } = await createProject(modelWithPlugin); + runCli('generate --lite=false --lite-only=false', workDir); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema.ts'))).toBe(true); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema-lite.ts'))).toBe(false); + }); + + it('should generate models.ts and input.ts by default', async () => { + const { workDir } = await createProject(model); + runCli('generate', workDir); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema.ts'))).toBe(true); + expect(fs.existsSync(path.join(workDir, 'zenstack/models.ts'))).toBe(true); + expect(fs.existsSync(path.join(workDir, 'zenstack/input.ts'))).toBe(true); + }); + + it('should respect plugin options for generateModels and generateInput by default', async () => { + const modelWithPlugin = ` +plugin typescript { + provider = "@core/typescript" + generateModels = false + generateInput = false +} + +model User { + id String @id @default(cuid()) +} +`; + const { workDir } = await createProject(modelWithPlugin); + runCli('generate', workDir); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema.ts'))).toBe(true); + expect(fs.existsSync(path.join(workDir, 'zenstack/models.ts'))).toBe(false); + expect(fs.existsSync(path.join(workDir, 'zenstack/input.ts'))).toBe(false); + }); + + it('should generate models.ts when --generate-models=true is passed', async () => { + const { workDir } = await createProject(model); + runCli('generate --generate-models=true', workDir); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema.ts'))).toBe(true); + expect(fs.existsSync(path.join(workDir, 'zenstack/models.ts'))).toBe(true); + expect(fs.existsSync(path.join(workDir, 'zenstack/input.ts'))).toBe(true); + }); + + it('should not generate models.ts when --generate-models=false is passed', async () => { + const { workDir } = await createProject(model); + runCli('generate --generate-models=false', workDir); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema.ts'))).toBe(true); + expect(fs.existsSync(path.join(workDir, 'zenstack/models.ts'))).toBe(false); + expect(fs.existsSync(path.join(workDir, 'zenstack/input.ts'))).toBe(true); + }); + + it('should generate input.ts when --generate-input=true is passed', async () => { + const { workDir } = await createProject(model); + runCli('generate --generate-input=true', workDir); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema.ts'))).toBe(true); + expect(fs.existsSync(path.join(workDir, 'zenstack/models.ts'))).toBe(true); + expect(fs.existsSync(path.join(workDir, 'zenstack/input.ts'))).toBe(true); + }); + + it('should not generate input.ts when --generate-input=false is passed', async () => { + const { workDir } = await createProject(model); + runCli('generate --generate-input=false', workDir); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema.ts'))).toBe(true); + expect(fs.existsSync(path.join(workDir, 'zenstack/models.ts'))).toBe(true); + expect(fs.existsSync(path.join(workDir, 'zenstack/input.ts'))).toBe(false); + }); + + it('should prefer CLI options over @core/typescript plugin settings for generateModels and generateInput', async () => { + const modelWithPlugin = ` +plugin typescript { + provider = "@core/typescript" + generateModels = false + generateInput = false +} + +model User { + id String @id @default(cuid()) +} +`; + const { workDir } = await createProject(modelWithPlugin); + runCli('generate --generate-models --generate-input', workDir); + expect(fs.existsSync(path.join(workDir, 'zenstack/schema.ts'))).toBe(true); + expect(fs.existsSync(path.join(workDir, 'zenstack/models.ts'))).toBe(true); + expect(fs.existsSync(path.join(workDir, 'zenstack/input.ts'))).toBe(true); + }); }); diff --git a/packages/clients/tanstack-query/test/schemas/basic/schema-lite.ts b/packages/clients/tanstack-query/test/schemas/basic/schema-lite.ts index 918a37373..af9b66ee6 100644 --- a/packages/clients/tanstack-query/test/schemas/basic/schema-lite.ts +++ b/packages/clients/tanstack-query/test/schemas/basic/schema-lite.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/packages/clients/tanstack-query/test/schemas/procedures/schema-lite.ts b/packages/clients/tanstack-query/test/schemas/procedures/schema-lite.ts index 630d31410..8dc25a865 100644 --- a/packages/clients/tanstack-query/test/schemas/procedures/schema-lite.ts +++ b/packages/clients/tanstack-query/test/schemas/procedures/schema-lite.ts @@ -2,7 +2,7 @@ // NOTE: Test fixture schema used for TanStack Query typing tests. // ////////////////////////////////////////////////////////////////////////////////////////////// -import { type SchemaDef, ExpressionUtils } from '@zenstackhq/orm/schema'; +import { type SchemaDef, ExpressionUtils } from '@zenstackhq/schema'; export class SchemaType implements SchemaDef { provider = { diff --git a/packages/orm/src/client/options.ts b/packages/orm/src/client/options.ts index 80aa82261..2061ebafa 100644 --- a/packages/orm/src/client/options.ts +++ b/packages/orm/src/client/options.ts @@ -1,6 +1,5 @@ -import type { Dialect, Expression, ExpressionBuilder, KyselyConfig } from 'kysely'; +import type { Dialect, Expression, ExpressionBuilder, KyselyConfig, OperandExpression } from 'kysely'; import type { GetModel, GetModelFields, GetModels, ProcedureDef, ScalarFields, SchemaDef } from '../schema'; -import type { PrependParameter } from '../utils/type-utils'; import type { FilterPropertyToKind } from './constants'; import type { ClientContract, CRUD_EXT } from './contract'; import type { GetProcedureNames, ProcedureHandlerFunc } from './crud-types'; @@ -226,10 +225,15 @@ export type OmitConfig = { export type ComputedFieldsOptions = { [Model in GetModels as 'computedFields' extends keyof GetModel ? Model : never]: { - [Field in keyof Schema['models'][Model]['computedFields']]: PrependParameter< - ExpressionBuilder, Model>, - Schema['models'][Model]['computedFields'][Field] - >; + [Field in keyof Schema['models'][Model]['computedFields']]: Schema['models'][Model]['computedFields'][Field] extends infer Func + ? Func extends (...args: any[]) => infer R + ? ( + // inject a first parameter for expression builder + p: ExpressionBuilder, Model>, + ...args: Parameters + ) => OperandExpression // wrap the return type with Kysely `OperandExpression` + : never + : never; }; }; diff --git a/packages/sdk/src/ts-schema-generator.ts b/packages/sdk/src/ts-schema-generator.ts index ac6fcf00f..90f6ceafa 100644 --- a/packages/sdk/src/ts-schema-generator.ts +++ b/packages/sdk/src/ts-schema-generator.ts @@ -57,6 +57,8 @@ export type TsSchemaGeneratorOptions = { lite?: boolean; liteOnly?: boolean; importWithFileExtension?: string; + generateModelTypes?: boolean; + generateInputTypes?: boolean; }; export class TsSchemaGenerator { @@ -72,10 +74,14 @@ export class TsSchemaGenerator { this.generateSchema(model, options); // the model types - this.generateModelsAndTypeDefs(model, options); + if (options.generateModelTypes !== false) { + this.generateModelsAndTypeDefs(model, options); + } // the input types - this.generateInputTypes(model, options); + if (options.generateInputTypes !== false) { + this.generateInputTypes(model, options); + } } private generateSchema(model: Model, options: TsSchemaGeneratorOptions) { @@ -111,31 +117,18 @@ export class TsSchemaGenerator { } private generateSchemaStatements(model: Model, statements: ts.Statement[], lite: boolean) { - const hasComputedFields = model.declarations.some( - (d) => isDataModel(d) && d.fields.some((f) => hasAttribute(f, '@computed')), - ); - // Generate schema content first to determine if ExpressionUtils is needed const schemaClass = this.createSchemaClass(model, lite); // Now generate the import declaration with the correct imports - // import { type SchemaDef, type OperandExpression, ExpressionUtils } from '@zenstackhq/orm/schema'; - const runtimeImportDecl = ts.factory.createImportDeclaration( + // import { type SchemaDef, ExpressionUtils } from '@zenstackhq/schema'; + const schemaImportDecl = ts.factory.createImportDeclaration( undefined, ts.factory.createImportClause( undefined, undefined, ts.factory.createNamedImports([ ts.factory.createImportSpecifier(true, undefined, ts.factory.createIdentifier('SchemaDef')), - ...(hasComputedFields - ? [ - ts.factory.createImportSpecifier( - true, - undefined, - ts.factory.createIdentifier('OperandExpression'), - ), - ] - : []), ...(this.usedExpressionUtils ? [ ts.factory.createImportSpecifier( @@ -147,9 +140,9 @@ export class TsSchemaGenerator { : []), ]), ), - ts.factory.createStringLiteral('@zenstackhq/orm/schema'), + ts.factory.createStringLiteral('@zenstackhq/schema'), ); - statements.push(runtimeImportDecl); + statements.push(schemaImportDecl); statements.push(schemaClass); @@ -503,9 +496,7 @@ export class TsSchemaGenerator { undefined, ), ], - ts.factory.createTypeReferenceNode('OperandExpression', [ - ts.factory.createTypeReferenceNode(this.mapFieldTypeToTSType(field.type)), - ]), + ts.factory.createTypeReferenceNode(this.mapFieldTypeToTSType(field.type)), ts.factory.createBlock( [ ts.factory.createThrowStatement( @@ -524,9 +515,14 @@ export class TsSchemaGenerator { private createUpdatedAtObject(ignoreArg: AttributeArg) { return ts.factory.createObjectLiteralExpression([ - ts.factory.createPropertyAssignment('ignore', ts.factory.createArrayLiteralExpression( - (ignoreArg.value as ArrayExpr).items.map((item) => ts.factory.createStringLiteral((item as ReferenceExpr).target.$refText)) - )) + ts.factory.createPropertyAssignment( + 'ignore', + ts.factory.createArrayLiteralExpression( + (ignoreArg.value as ArrayExpr).items.map((item) => + ts.factory.createStringLiteral((item as ReferenceExpr).target.$refText), + ), + ), + ), ]); } @@ -574,12 +570,13 @@ export class TsSchemaGenerator { const updatedAtAttrib = getAttribute(field, '@updatedAt') as DataFieldAttribute | undefined; if (updatedAtAttrib) { - const ignoreArg = updatedAtAttrib.args.find(arg => arg.$resolvedParam?.name === 'ignore'); - objectFields.push(ts.factory.createPropertyAssignment('updatedAt', - ignoreArg - ? this.createUpdatedAtObject(ignoreArg) - : ts.factory.createTrue() - )); + const ignoreArg = updatedAtAttrib.args.find((arg) => arg.$resolvedParam?.name === 'ignore'); + objectFields.push( + ts.factory.createPropertyAssignment( + 'updatedAt', + ignoreArg ? this.createUpdatedAtObject(ignoreArg) : ts.factory.createTrue(), + ), + ); } if (hasAttribute(field, '@omit')) { diff --git a/packages/testtools/src/project.ts b/packages/testtools/src/project.ts index 9ea3478bf..20200e676 100644 --- a/packages/testtools/src/project.ts +++ b/packages/testtools/src/project.ts @@ -21,7 +21,7 @@ export function createTestProject(zmodelContent?: string) { } // in addition, symlink zenstack packages - const zenstackPackages = ['language', 'sdk', 'orm', 'cli']; + const zenstackPackages = ['language', 'sdk', 'schema', 'orm', 'cli']; fs.mkdirSync(path.join(workDir, 'node_modules/@zenstackhq')); for (const pkg of zenstackPackages) { fs.symlinkSync( diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 45ac2f741..5828dbe57 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -853,6 +853,9 @@ importers: '@zenstackhq/orm': specifier: workspace:* version: link:../../packages/orm + '@zenstackhq/schema': + specifier: workspace:* + version: link:../../packages/schema '@zenstackhq/server': specifier: workspace:* version: link:../../packages/server @@ -920,6 +923,9 @@ importers: '@zenstackhq/orm': specifier: workspace:* version: link:../../packages/orm + '@zenstackhq/schema': + specifier: workspace:* + version: link:../../packages/schema '@zenstackhq/server': specifier: workspace:* version: link:../../packages/server @@ -960,6 +966,9 @@ importers: '@zenstackhq/plugin-policy': specifier: workspace:* version: link:../../packages/plugins/policy + '@zenstackhq/schema': + specifier: workspace:* + version: link:../../packages/schema better-sqlite3: specifier: 'catalog:' version: 12.5.0 @@ -991,6 +1000,9 @@ importers: '@zenstackhq/orm': specifier: workspace:* version: link:../../packages/orm + '@zenstackhq/schema': + specifier: workspace:* + version: link:../../packages/schema '@zenstackhq/server': specifier: workspace:* version: link:../../packages/server @@ -1132,6 +1144,9 @@ importers: '@zenstackhq/plugin-policy': specifier: workspace:* version: link:../../packages/plugins/policy + '@zenstackhq/schema': + specifier: workspace:* + version: link:../../packages/schema '@zenstackhq/sdk': specifier: workspace:* version: link:../../packages/sdk @@ -1156,6 +1171,9 @@ importers: '@zenstackhq/plugin-policy': specifier: workspace:* version: link:../../../packages/plugins/policy + '@zenstackhq/schema': + specifier: workspace:* + version: link:../../../packages/schema '@zenstackhq/testtools': specifier: workspace:* version: link:../../../packages/testtools @@ -1196,6 +1214,9 @@ importers: '@zenstackhq/plugin-policy': specifier: workspace:* version: link:../../../packages/plugins/policy + '@zenstackhq/schema': + specifier: workspace:* + version: link:../../../packages/schema '@zenstackhq/testtools': specifier: workspace:* version: link:../../../packages/testtools @@ -13043,7 +13064,7 @@ snapshots: eslint: 9.29.0(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.29.0(jiti@2.6.1)))(eslint@9.29.0(jiti@2.6.1)) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.29.0(jiti@2.6.1)))(eslint@9.29.0(jiti@2.6.1)))(eslint@9.29.0(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.29.0(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.29.0(jiti@2.6.1)) eslint-plugin-react-hooks: 7.0.1(eslint@9.29.0(jiti@2.6.1)) @@ -13076,7 +13097,7 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@2.6.1)) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.29.0(jiti@2.6.1)))(eslint@9.29.0(jiti@2.6.1)))(eslint@9.29.0(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -13091,7 +13112,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.29.0(jiti@2.6.1)): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.46.2(eslint@9.29.0(jiti@2.6.1))(typescript@5.9.3))(eslint@9.29.0(jiti@2.6.1)))(eslint@9.29.0(jiti@2.6.1)))(eslint@9.29.0(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 diff --git a/samples/next.js/package.json b/samples/next.js/package.json index 88839b7c0..1a58b53c2 100644 --- a/samples/next.js/package.json +++ b/samples/next.js/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "@tanstack/react-query": "catalog:", + "@zenstackhq/schema": "workspace:*", "@zenstackhq/orm": "workspace:*", "@zenstackhq/server": "workspace:*", "@zenstackhq/tanstack-query": "workspace:*", diff --git a/samples/next.js/zenstack/schema-lite.ts b/samples/next.js/zenstack/schema-lite.ts index 7308e184d..0f5ad88bc 100644 --- a/samples/next.js/zenstack/schema-lite.ts +++ b/samples/next.js/zenstack/schema-lite.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/samples/next.js/zenstack/schema.ts b/samples/next.js/zenstack/schema.ts index 724c9659f..c420179f7 100644 --- a/samples/next.js/zenstack/schema.ts +++ b/samples/next.js/zenstack/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/samples/nuxt/package.json b/samples/nuxt/package.json index 6c0ec8c43..4145dc0aa 100644 --- a/samples/nuxt/package.json +++ b/samples/nuxt/package.json @@ -13,6 +13,7 @@ "dependencies": { "@tailwindcss/vite": "^4.1.18", "@tanstack/vue-query": "catalog:", + "@zenstackhq/schema": "workspace:*", "@zenstackhq/orm": "workspace:*", "@zenstackhq/server": "workspace:*", "@zenstackhq/tanstack-query": "workspace:*", diff --git a/samples/nuxt/zenstack/schema-lite.ts b/samples/nuxt/zenstack/schema-lite.ts index 7308e184d..0f5ad88bc 100644 --- a/samples/nuxt/zenstack/schema-lite.ts +++ b/samples/nuxt/zenstack/schema-lite.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/samples/nuxt/zenstack/schema.ts b/samples/nuxt/zenstack/schema.ts index 724c9659f..c420179f7 100644 --- a/samples/nuxt/zenstack/schema.ts +++ b/samples/nuxt/zenstack/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/samples/orm/package.json b/samples/orm/package.json index 18591115b..712b30535 100644 --- a/samples/orm/package.json +++ b/samples/orm/package.json @@ -1,5 +1,5 @@ { - "name": "sample-blog", + "name": "sample-orm", "version": "3.3.3", "description": "", "main": "index.js", @@ -15,6 +15,7 @@ "author": "", "license": "MIT", "dependencies": { + "@zenstackhq/schema": "workspace:*", "@zenstackhq/orm": "workspace:*", "@zenstackhq/plugin-policy": "workspace:*", "better-sqlite3": "catalog:", diff --git a/samples/orm/zenstack/schema.ts b/samples/orm/zenstack/schema.ts index 25ef6342a..aa0d92bc6 100644 --- a/samples/orm/zenstack/schema.ts +++ b/samples/orm/zenstack/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, type OperandExpression, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" @@ -81,7 +81,7 @@ export class SchemaType implements SchemaDef { computedFields: { postCount(_context: { modelAlias: string; - }): OperandExpression { + }): number { throw new Error("This is a stub for computed field"); } } diff --git a/samples/sveltekit/package.json b/samples/sveltekit/package.json index 503b59b4e..0d1c56779 100644 --- a/samples/sveltekit/package.json +++ b/samples/sveltekit/package.json @@ -14,6 +14,7 @@ }, "dependencies": { "@tanstack/svelte-query": "catalog:", + "@zenstackhq/schema": "workspace:*", "@zenstackhq/orm": "workspace:*", "@zenstackhq/server": "workspace:*", "@zenstackhq/tanstack-query": "workspace:*", diff --git a/samples/sveltekit/src/zenstack/schema-lite.ts b/samples/sveltekit/src/zenstack/schema-lite.ts index 7308e184d..0f5ad88bc 100644 --- a/samples/sveltekit/src/zenstack/schema-lite.ts +++ b/samples/sveltekit/src/zenstack/schema-lite.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/samples/sveltekit/src/zenstack/schema.ts b/samples/sveltekit/src/zenstack/schema.ts index 724c9659f..c420179f7 100644 --- a/samples/sveltekit/src/zenstack/schema.ts +++ b/samples/sveltekit/src/zenstack/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/e2e/apps/rally/zenstack/schema.ts b/tests/e2e/apps/rally/zenstack/schema.ts index dd860a2b0..a729240c7 100644 --- a/tests/e2e/apps/rally/zenstack/schema.ts +++ b/tests/e2e/apps/rally/zenstack/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "postgresql" diff --git a/tests/e2e/github-repos/cal.com/schema.ts b/tests/e2e/github-repos/cal.com/schema.ts index e77063c76..dc3e4194b 100644 --- a/tests/e2e/github-repos/cal.com/schema.ts +++ b/tests/e2e/github-repos/cal.com/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "postgresql" diff --git a/tests/e2e/github-repos/formbricks/schema.ts b/tests/e2e/github-repos/formbricks/schema.ts index fe29237a3..825df4e9d 100644 --- a/tests/e2e/github-repos/formbricks/schema.ts +++ b/tests/e2e/github-repos/formbricks/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "postgresql" diff --git a/tests/e2e/github-repos/trigger.dev/schema.ts b/tests/e2e/github-repos/trigger.dev/schema.ts index 29c733500..4e4156b9f 100644 --- a/tests/e2e/github-repos/trigger.dev/schema.ts +++ b/tests/e2e/github-repos/trigger.dev/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "postgresql" diff --git a/tests/e2e/orm/plugin-infra/ext-query-args/schema.ts b/tests/e2e/orm/plugin-infra/ext-query-args/schema.ts index a8f0ffb86..57d0d946f 100644 --- a/tests/e2e/orm/plugin-infra/ext-query-args/schema.ts +++ b/tests/e2e/orm/plugin-infra/ext-query-args/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/e2e/orm/schemas/auth-type/schema.ts b/tests/e2e/orm/schemas/auth-type/schema.ts index c57c43903..b4e3b472e 100644 --- a/tests/e2e/orm/schemas/auth-type/schema.ts +++ b/tests/e2e/orm/schemas/auth-type/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef } from "@zenstackhq/orm/schema"; +import { type SchemaDef } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/e2e/orm/schemas/basic/schema.ts b/tests/e2e/orm/schemas/basic/schema.ts index d42e0d89a..15591490c 100644 --- a/tests/e2e/orm/schemas/basic/schema.ts +++ b/tests/e2e/orm/schemas/basic/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/e2e/orm/schemas/default-auth/schema.ts b/tests/e2e/orm/schemas/default-auth/schema.ts index cdc982776..ff265850a 100644 --- a/tests/e2e/orm/schemas/default-auth/schema.ts +++ b/tests/e2e/orm/schemas/default-auth/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/e2e/orm/schemas/delegate/schema.ts b/tests/e2e/orm/schemas/delegate/schema.ts index b3fabd6ea..d5488db19 100644 --- a/tests/e2e/orm/schemas/delegate/schema.ts +++ b/tests/e2e/orm/schemas/delegate/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/e2e/orm/schemas/json/schema.ts b/tests/e2e/orm/schemas/json/schema.ts index b5537a9ff..6e3e9ebd2 100644 --- a/tests/e2e/orm/schemas/json/schema.ts +++ b/tests/e2e/orm/schemas/json/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/e2e/orm/schemas/name-mapping/schema.ts b/tests/e2e/orm/schemas/name-mapping/schema.ts index e39aeb951..1479f200c 100644 --- a/tests/e2e/orm/schemas/name-mapping/schema.ts +++ b/tests/e2e/orm/schemas/name-mapping/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/e2e/orm/schemas/omit/schema.ts b/tests/e2e/orm/schemas/omit/schema.ts index 29391a36e..16ebb237c 100644 --- a/tests/e2e/orm/schemas/omit/schema.ts +++ b/tests/e2e/orm/schemas/omit/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/e2e/orm/schemas/petstore/schema.ts b/tests/e2e/orm/schemas/petstore/schema.ts index feebb2972..93831438c 100644 --- a/tests/e2e/orm/schemas/petstore/schema.ts +++ b/tests/e2e/orm/schemas/petstore/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/e2e/orm/schemas/procedures/schema.ts b/tests/e2e/orm/schemas/procedures/schema.ts index bd2b10018..3d469965c 100644 --- a/tests/e2e/orm/schemas/procedures/schema.ts +++ b/tests/e2e/orm/schemas/procedures/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/e2e/orm/schemas/todo/schema.ts b/tests/e2e/orm/schemas/todo/schema.ts index 2df7b731b..d64b7d78b 100644 --- a/tests/e2e/orm/schemas/todo/schema.ts +++ b/tests/e2e/orm/schemas/todo/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/e2e/orm/schemas/typed-json/schema.ts b/tests/e2e/orm/schemas/typed-json/schema.ts index d99f97b5d..7c9f6a1d1 100644 --- a/tests/e2e/orm/schemas/typed-json/schema.ts +++ b/tests/e2e/orm/schemas/typed-json/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/e2e/orm/schemas/typing/schema.ts b/tests/e2e/orm/schemas/typing/schema.ts index 58325be74..42789446c 100644 --- a/tests/e2e/orm/schemas/typing/schema.ts +++ b/tests/e2e/orm/schemas/typing/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, type OperandExpression, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "postgresql" @@ -87,7 +87,7 @@ export class SchemaType implements SchemaDef { computedFields: { postCount(_context: { modelAlias: string; - }): OperandExpression { + }): number { throw new Error("This is a stub for computed field"); } } diff --git a/tests/regression/package.json b/tests/regression/package.json index 5efca0c45..cbbdc2656 100644 --- a/tests/regression/package.json +++ b/tests/regression/package.json @@ -18,6 +18,7 @@ "devDependencies": { "@zenstackhq/cli": "workspace:*", "@zenstackhq/language": "workspace:*", + "@zenstackhq/schema": "workspace:*", "@zenstackhq/orm": "workspace:*", "@zenstackhq/sdk": "workspace:*", "@zenstackhq/plugin-policy": "workspace:*", diff --git a/tests/regression/test/issue-204/schema.ts b/tests/regression/test/issue-204/schema.ts index 3c8726b39..aeb22070f 100644 --- a/tests/regression/test/issue-204/schema.ts +++ b/tests/regression/test/issue-204/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef } from "@zenstackhq/orm/schema"; +import { type SchemaDef } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/regression/test/issue-422/schema.ts b/tests/regression/test/issue-422/schema.ts index 32450381f..04cf0c85c 100644 --- a/tests/regression/test/issue-422/schema.ts +++ b/tests/regression/test/issue-422/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/regression/test/issue-503/schema.ts b/tests/regression/test/issue-503/schema.ts index 702a67e37..6bbfeac03 100644 --- a/tests/regression/test/issue-503/schema.ts +++ b/tests/regression/test/issue-503/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/runtimes/bun/package.json b/tests/runtimes/bun/package.json index df0257e05..eff1b55e2 100644 --- a/tests/runtimes/bun/package.json +++ b/tests/runtimes/bun/package.json @@ -11,6 +11,7 @@ }, "dependencies": { "@zenstackhq/cli": "workspace:*", + "@zenstackhq/schema": "workspace:*", "@zenstackhq/orm": "workspace:*", "@zenstackhq/plugin-policy": "workspace:*", "@zenstackhq/common-helpers": "workspace:*", diff --git a/tests/runtimes/bun/schemas/schema.ts b/tests/runtimes/bun/schemas/schema.ts index 5dfb25346..8207633d9 100644 --- a/tests/runtimes/bun/schemas/schema.ts +++ b/tests/runtimes/bun/schemas/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "sqlite" diff --git a/tests/runtimes/edge-runtime/package.json b/tests/runtimes/edge-runtime/package.json index dc3eebf7a..07b7b068a 100644 --- a/tests/runtimes/edge-runtime/package.json +++ b/tests/runtimes/edge-runtime/package.json @@ -13,6 +13,7 @@ "@edge-runtime/vm": "^5.0.0", "@zenstackhq/cli": "workspace:*", "@zenstackhq/common-helpers": "workspace:*", + "@zenstackhq/schema": "workspace:*", "@zenstackhq/orm": "workspace:*", "@zenstackhq/plugin-policy": "workspace:*", "@zenstackhq/testtools": "workspace:*", diff --git a/tests/runtimes/edge-runtime/schemas/schema.ts b/tests/runtimes/edge-runtime/schemas/schema.ts index 367e5f123..cf2521709 100644 --- a/tests/runtimes/edge-runtime/schemas/schema.ts +++ b/tests/runtimes/edge-runtime/schemas/schema.ts @@ -5,7 +5,7 @@ /* eslint-disable */ -import { type SchemaDef, ExpressionUtils } from "@zenstackhq/orm/schema"; +import { type SchemaDef, ExpressionUtils } from "@zenstackhq/schema"; export class SchemaType implements SchemaDef { provider = { type: "postgresql" diff --git a/turbo.json b/turbo.json index 6e619eeb7..a77b9a4d4 100644 --- a/turbo.json +++ b/turbo.json @@ -4,7 +4,7 @@ "build": { "dependsOn": ["^build"], "inputs": ["src/**", "samples/**", "zenstack/*.zmodel"], - "outputs": ["dist/**"] + "outputs": ["dist/**", ".output/**"] }, "watch": { "dependsOn": ["^build"],