zenstack 1.0.0-alpha.20 → 1.0.0-alpha.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/cli/cli-util.js CHANGED
@@ -106,6 +106,7 @@ async function runPlugins(options) {
106
106
  const model = await loadDocument(options.schema, services);
107
107
  const context = {
108
108
  schema: model,
109
+ schemaPath: _path.default.resolve(options.schema),
109
110
  outDir: _path.default.dirname(options.schema)
110
111
  };
111
112
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"cli-util.js","names":["initProject","projectPath","prismaSchema","packageManager","tag","fs","existsSync","console","error","CliError","defaultPrismaSchemaLocation","zmodelFile","path","join","sampleModelGenerated","warn","copyFileSync","starterContent","readFileSync","__dirname","writeFileSync","installPackage","log","colors","blue","green","loadDocument","fileName","services","extensions","LanguageMetaData","fileExtensions","includes","extname","yellow","red","stdLib","shared","workspace","LangiumDocuments","getOrCreateDocument","URI","file","resolve","STD_LIB_MODULE_NAME","document","DocumentBuilder","build","validationChecks","validationErrors","diagnostics","filter","e","severity","length","validationError","range","start","line","message","textDocument","getText","parseResult","value","runPlugins","options","createZModelServices","NodeFileSystem","ZModel","model","schema","context","outDir","dirname","PluginRunner","run","err","PluginError"],"sources":["../../src/cli/cli-util.ts"],"sourcesContent":["import { Model } from '@zenstackhq/language/ast';\nimport { PluginError } from '@zenstackhq/sdk';\nimport colors from 'colors';\nimport fs from 'fs';\nimport { LangiumServices } from 'langium';\nimport { NodeFileSystem } from 'langium/node';\nimport path from 'path';\nimport { URI } from 'vscode-uri';\nimport { STD_LIB_MODULE_NAME } from '../language-server/constants';\nimport { createZModelServices } from '../language-server/zmodel-module';\nimport { Context } from '../types';\nimport { installPackage, PackageManagers } from '../utils/pkg-utils';\nimport { CliError } from './cli-error';\nimport { PluginRunner } from './plugin-runner';\n\n/**\n * Initializes an existing project for ZenStack\n */\nexport async function initProject(\n projectPath: string,\n prismaSchema: string | undefined,\n packageManager: PackageManagers | undefined,\n tag: string\n) {\n if (!fs.existsSync(projectPath)) {\n console.error(`Path does not exist: ${projectPath}`);\n throw new CliError('project path does not exist');\n }\n\n const defaultPrismaSchemaLocation = './prisma/schema.prisma';\n if (prismaSchema) {\n if (!fs.existsSync(prismaSchema)) {\n console.error(`Prisma schema file does not exist: ${prismaSchema}`);\n throw new CliError('prisma schema does not exist');\n }\n } else if (fs.existsSync(defaultPrismaSchemaLocation)) {\n prismaSchema = defaultPrismaSchemaLocation;\n }\n\n const zmodelFile = path.join(projectPath, './schema.zmodel');\n let sampleModelGenerated = false;\n\n if (fs.existsSync(zmodelFile)) {\n console.warn(`ZenStack model already exists at ${zmodelFile}, not generating a new one.`);\n } else {\n if (prismaSchema) {\n // copy over schema.prisma\n fs.copyFileSync(prismaSchema, zmodelFile);\n } else {\n // create a new model\n const starterContent = fs.readFileSync(path.join(__dirname, '../res/starter.zmodel'), 'utf-8');\n fs.writeFileSync(zmodelFile, starterContent);\n sampleModelGenerated = true;\n }\n }\n\n installPackage('zenstack', true, packageManager, tag, projectPath);\n installPackage('@zenstackhq/runtime', false, packageManager, tag, projectPath);\n\n if (sampleModelGenerated) {\n console.log(`Sample model generated at: ${colors.blue(zmodelFile)}\n\nPlease check the following guide on how to model your app:\n https://zenstack.dev/#/modeling-your-app.`);\n } else {\n console.log(\n `Your current Prisma schema \"${prismaSchema}\" has been copied to \"${zmodelFile}\".\nMoving forward please edit this file and run \"zenstack generate\" to regenerate Prisma schema.`\n );\n }\n\n console.log(colors.green('\\nProject initialized successfully!'));\n}\n\n/**\n * Loads a zmodel document from a file.\n * @param fileName File name\n * @param services Language services\n * @returns Parsed and validated AST\n */\nexport async function loadDocument(fileName: string, services: LangiumServices): Promise<Model> {\n const extensions = services.LanguageMetaData.fileExtensions;\n if (!extensions.includes(path.extname(fileName))) {\n console.error(colors.yellow(`Please choose a file with extension: ${extensions}.`));\n throw new CliError('invalid schema file');\n }\n\n if (!fs.existsSync(fileName)) {\n console.error(colors.red(`File ${fileName} does not exist.`));\n throw new CliError('schema file does not exist');\n }\n\n // load standard library\n const stdLib = services.shared.workspace.LangiumDocuments.getOrCreateDocument(\n URI.file(path.resolve(path.join(__dirname, '../res', STD_LIB_MODULE_NAME)))\n );\n\n // load the document\n const document = services.shared.workspace.LangiumDocuments.getOrCreateDocument(URI.file(path.resolve(fileName)));\n\n // build the document together with standard library\n await services.shared.workspace.DocumentBuilder.build([stdLib, document], {\n validationChecks: 'all',\n });\n\n const validationErrors = (document.diagnostics ?? []).filter((e) => e.severity === 1);\n if (validationErrors.length > 0) {\n console.error(colors.red('Validation errors:'));\n for (const validationError of validationErrors) {\n console.error(\n colors.red(\n `line ${validationError.range.start.line + 1}: ${\n validationError.message\n } [${document.textDocument.getText(validationError.range)}]`\n )\n );\n }\n throw new CliError('schema validation errors');\n }\n\n return document.parseResult.value as Model;\n}\n\nexport async function runPlugins(options: { schema: string; packageManager: PackageManagers | undefined }) {\n const services = createZModelServices(NodeFileSystem).ZModel;\n const model = await loadDocument(options.schema, services);\n\n const context: Context = {\n schema: model,\n outDir: path.dirname(options.schema),\n };\n\n try {\n await new PluginRunner().run(context);\n } catch (err) {\n if (err instanceof PluginError) {\n console.error(colors.red(err.message));\n throw new CliError(err.message);\n } else {\n throw err;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli-util.js","names":["initProject","projectPath","prismaSchema","packageManager","tag","fs","existsSync","console","error","CliError","defaultPrismaSchemaLocation","zmodelFile","path","join","sampleModelGenerated","warn","copyFileSync","starterContent","readFileSync","__dirname","writeFileSync","installPackage","log","colors","blue","green","loadDocument","fileName","services","extensions","LanguageMetaData","fileExtensions","includes","extname","yellow","red","stdLib","shared","workspace","LangiumDocuments","getOrCreateDocument","URI","file","resolve","STD_LIB_MODULE_NAME","document","DocumentBuilder","build","validationChecks","validationErrors","diagnostics","filter","e","severity","length","validationError","range","start","line","message","textDocument","getText","parseResult","value","runPlugins","options","createZModelServices","NodeFileSystem","ZModel","model","schema","context","schemaPath","outDir","dirname","PluginRunner","run","err","PluginError"],"sources":["../../src/cli/cli-util.ts"],"sourcesContent":["import { Model } from '@zenstackhq/language/ast';\nimport { PluginError } from '@zenstackhq/sdk';\nimport colors from 'colors';\nimport fs from 'fs';\nimport { LangiumServices } from 'langium';\nimport { NodeFileSystem } from 'langium/node';\nimport path from 'path';\nimport { URI } from 'vscode-uri';\nimport { STD_LIB_MODULE_NAME } from '../language-server/constants';\nimport { createZModelServices } from '../language-server/zmodel-module';\nimport { Context } from '../types';\nimport { installPackage, PackageManagers } from '../utils/pkg-utils';\nimport { CliError } from './cli-error';\nimport { PluginRunner } from './plugin-runner';\n\n/**\n * Initializes an existing project for ZenStack\n */\nexport async function initProject(\n projectPath: string,\n prismaSchema: string | undefined,\n packageManager: PackageManagers | undefined,\n tag: string\n) {\n if (!fs.existsSync(projectPath)) {\n console.error(`Path does not exist: ${projectPath}`);\n throw new CliError('project path does not exist');\n }\n\n const defaultPrismaSchemaLocation = './prisma/schema.prisma';\n if (prismaSchema) {\n if (!fs.existsSync(prismaSchema)) {\n console.error(`Prisma schema file does not exist: ${prismaSchema}`);\n throw new CliError('prisma schema does not exist');\n }\n } else if (fs.existsSync(defaultPrismaSchemaLocation)) {\n prismaSchema = defaultPrismaSchemaLocation;\n }\n\n const zmodelFile = path.join(projectPath, './schema.zmodel');\n let sampleModelGenerated = false;\n\n if (fs.existsSync(zmodelFile)) {\n console.warn(`ZenStack model already exists at ${zmodelFile}, not generating a new one.`);\n } else {\n if (prismaSchema) {\n // copy over schema.prisma\n fs.copyFileSync(prismaSchema, zmodelFile);\n } else {\n // create a new model\n const starterContent = fs.readFileSync(path.join(__dirname, '../res/starter.zmodel'), 'utf-8');\n fs.writeFileSync(zmodelFile, starterContent);\n sampleModelGenerated = true;\n }\n }\n\n installPackage('zenstack', true, packageManager, tag, projectPath);\n installPackage('@zenstackhq/runtime', false, packageManager, tag, projectPath);\n\n if (sampleModelGenerated) {\n console.log(`Sample model generated at: ${colors.blue(zmodelFile)}\n\nPlease check the following guide on how to model your app:\n https://zenstack.dev/#/modeling-your-app.`);\n } else {\n console.log(\n `Your current Prisma schema \"${prismaSchema}\" has been copied to \"${zmodelFile}\".\nMoving forward please edit this file and run \"zenstack generate\" to regenerate Prisma schema.`\n );\n }\n\n console.log(colors.green('\\nProject initialized successfully!'));\n}\n\n/**\n * Loads a zmodel document from a file.\n * @param fileName File name\n * @param services Language services\n * @returns Parsed and validated AST\n */\nexport async function loadDocument(fileName: string, services: LangiumServices): Promise<Model> {\n const extensions = services.LanguageMetaData.fileExtensions;\n if (!extensions.includes(path.extname(fileName))) {\n console.error(colors.yellow(`Please choose a file with extension: ${extensions}.`));\n throw new CliError('invalid schema file');\n }\n\n if (!fs.existsSync(fileName)) {\n console.error(colors.red(`File ${fileName} does not exist.`));\n throw new CliError('schema file does not exist');\n }\n\n // load standard library\n const stdLib = services.shared.workspace.LangiumDocuments.getOrCreateDocument(\n URI.file(path.resolve(path.join(__dirname, '../res', STD_LIB_MODULE_NAME)))\n );\n\n // load the document\n const document = services.shared.workspace.LangiumDocuments.getOrCreateDocument(URI.file(path.resolve(fileName)));\n\n // build the document together with standard library\n await services.shared.workspace.DocumentBuilder.build([stdLib, document], {\n validationChecks: 'all',\n });\n\n const validationErrors = (document.diagnostics ?? []).filter((e) => e.severity === 1);\n if (validationErrors.length > 0) {\n console.error(colors.red('Validation errors:'));\n for (const validationError of validationErrors) {\n console.error(\n colors.red(\n `line ${validationError.range.start.line + 1}: ${\n validationError.message\n } [${document.textDocument.getText(validationError.range)}]`\n )\n );\n }\n throw new CliError('schema validation errors');\n }\n\n return document.parseResult.value as Model;\n}\n\nexport async function runPlugins(options: { schema: string; packageManager: PackageManagers | undefined }) {\n const services = createZModelServices(NodeFileSystem).ZModel;\n const model = await loadDocument(options.schema, services);\n\n const context: Context = {\n schema: model,\n schemaPath: path.resolve(options.schema),\n outDir: path.dirname(options.schema),\n };\n\n try {\n await new PluginRunner().run(context);\n } catch (err) {\n if (err instanceof PluginError) {\n console.error(colors.red(err.message));\n throw new CliError(err.message);\n } else {\n throw err;\n }\n }\n}\n"],"mappings":"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"}
@@ -34,7 +34,9 @@ class PluginRunner {
34
34
  for (const pluginProvider of allPluginProviders) {
35
35
  const plugin = pluginDecls.find(p => this.getPluginProvider(p) === pluginProvider);
36
36
  if (plugin) {
37
- const options = {};
37
+ const options = {
38
+ schemaPath: context.schemaPath
39
+ };
38
40
  plugin.fields.forEach(f => {
39
41
  const value = (0, _sdk.getLiteral)(f.value) || (0, _sdk.getLiteralArray)(f.value);
40
42
  if (!value) {
@@ -72,7 +74,9 @@ class PluginRunner {
72
74
  name: this.getPluginName(pluginModule, pluginProvider),
73
75
  provider: pluginProvider,
74
76
  run: pluginModule.default,
75
- options: {}
77
+ options: {
78
+ schemaPath: context.schemaPath
79
+ }
76
80
  });
77
81
  }
78
82
  }
@@ -1 +1 @@
1
- {"version":3,"file":"plugin-runner.js","names":["PluginRunner","run","context","version","require","console","log","colors","bold","plugins","pluginDecls","schema","declarations","filter","d","isPlugin","prereqPlugins","allPluginProviders","concat","map","p","getPluginProvider","includes","prismaOutput","pluginProvider","plugin","find","options","fields","forEach","f","value","getLiteral","getLiteralArray","CliError","name","pluginModulePath","getPluginModulePath","pluginModule","err","error","default","push","getPluginName","provider","output","warnings","dmmf","undefined","runPlugin","getDMMF","datamodel","fs","readFileSync","encoding","green","w","warn","yellow","providerField","spinner","ora","cyan","start","telemetry","trackSpan","result","Promise","Array","isArray","succeed","fail","startsWith","replace","path","join","__dirname"],"sources":["../../src/cli/plugin-runner.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport { DMMF } from '@prisma/generator-helper';\nimport { getDMMF } from '@prisma/internals';\nimport { Plugin, isPlugin } from '@zenstackhq/language/ast';\nimport { PluginFunction, PluginOptions, getLiteral, getLiteralArray } from '@zenstackhq/sdk';\nimport colors from 'colors';\nimport fs from 'fs';\nimport ora from 'ora';\nimport path from 'path';\nimport telemetry from '../telemetry';\nimport { Context } from '../types';\nimport { CliError } from './cli-error';\n\n/**\n * ZenStack code generator\n */\nexport class PluginRunner {\n /**\n * Runs a series of nested generators\n */\n async run(context: Context): Promise<void> {\n const version = require('../package.json').version;\n console.log(colors.bold(`⌛️ ZenStack CLI v${version}, running plugins`));\n\n const plugins: Array<{\n provider: string;\n name: string;\n run: PluginFunction;\n options: PluginOptions;\n }> = [];\n\n const pluginDecls = context.schema.declarations.filter((d): d is Plugin => isPlugin(d));\n const prereqPlugins = ['@zenstack/prisma', '@zenstack/model-meta', '@zenstack/access-policy'];\n const allPluginProviders = prereqPlugins.concat(\n pluginDecls\n .map((p) => this.getPluginProvider(p))\n .filter((p): p is string => !!p && !prereqPlugins.includes(p))\n );\n let prismaOutput = './prisma/schema.prisma';\n\n for (const pluginProvider of allPluginProviders) {\n const plugin = pluginDecls.find((p) => this.getPluginProvider(p) === pluginProvider);\n if (plugin) {\n const options: PluginOptions = {};\n\n plugin.fields.forEach((f) => {\n const value = getLiteral(f.value) || getLiteralArray(f.value);\n if (!value) {\n throw new CliError(`Invalid plugin value for ${f.name}`);\n }\n options[f.name] = value;\n });\n\n const pluginModulePath = this.getPluginModulePath(pluginProvider);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let pluginModule: any;\n try {\n pluginModule = require(pluginModulePath);\n } catch (err) {\n console.error(`Unable to load plugin module ${pluginProvider}: ${pluginModulePath}, ${err}`);\n throw new CliError(`Unable to load plugin module ${pluginProvider}`);\n }\n\n if (!pluginModule.default || typeof pluginModule.default !== 'function') {\n console.error(`Plugin provider ${pluginProvider} is missing a default function export`);\n throw new CliError(`Plugin provider ${pluginProvider} is missing a default function export`);\n }\n plugins.push({\n name: this.getPluginName(pluginModule, pluginProvider),\n provider: pluginProvider,\n run: pluginModule.default as PluginFunction,\n options,\n });\n\n if (pluginProvider === '@zenstack/prisma' && options.output) {\n // record custom prisma output path\n prismaOutput = options.output as string;\n }\n } else {\n // synthesize a plugin\n const pluginModule = require(this.getPluginModulePath(pluginProvider));\n plugins.push({\n name: this.getPluginName(pluginModule, pluginProvider),\n provider: pluginProvider,\n run: pluginModule.default,\n options: {},\n });\n }\n }\n\n const warnings: string[] = [];\n\n let dmmf: DMMF.Document | undefined = undefined;\n for (const { name, provider, run, options } of plugins) {\n await this.runPlugin(name, run, context, options, dmmf, warnings);\n if (provider === '@zenstack/prisma') {\n // load prisma DMMF\n dmmf = await getDMMF({\n datamodel: fs.readFileSync(prismaOutput, { encoding: 'utf-8' }),\n });\n }\n }\n\n console.log(colors.green(colors.bold('\\n👻 All plugins completed successfully!')));\n\n warnings.forEach((w) => console.warn(colors.yellow(w)));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private getPluginName(pluginModule: any, pluginProvider: string): string {\n return typeof pluginModule.name === 'string' ? (pluginModule.name as string) : pluginProvider;\n }\n\n private getPluginProvider(plugin: Plugin) {\n const providerField = plugin.fields.find((f) => f.name === 'provider');\n return getLiteral<string>(providerField?.value);\n }\n\n private async runPlugin(\n name: string,\n run: PluginFunction,\n context: Context,\n options: PluginOptions,\n dmmf: DMMF.Document | undefined,\n warnings: string[]\n ) {\n const spinner = ora(`Running plugin ${colors.cyan(name)}`).start();\n try {\n await telemetry.trackSpan(\n 'cli:plugin:start',\n 'cli:plugin:complete',\n 'cli:plugin:error',\n {\n plugin: name,\n },\n async () => {\n let result = run(context.schema, options, dmmf);\n if (result instanceof Promise) {\n result = await result;\n }\n if (Array.isArray(result)) {\n warnings.push(...result);\n }\n }\n );\n spinner.succeed();\n } catch (err) {\n spinner.fail();\n throw err;\n }\n }\n\n private getPluginModulePath(provider: string) {\n let pluginModulePath = provider;\n if (pluginModulePath.startsWith('@zenstack/')) {\n pluginModulePath = pluginModulePath.replace(/^@zenstack/, path.join(__dirname, '../plugins'));\n }\n return pluginModulePath;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"plugin-runner.js","names":["PluginRunner","run","context","version","require","console","log","colors","bold","plugins","pluginDecls","schema","declarations","filter","d","isPlugin","prereqPlugins","allPluginProviders","concat","map","p","getPluginProvider","includes","prismaOutput","pluginProvider","plugin","find","options","schemaPath","fields","forEach","f","value","getLiteral","getLiteralArray","CliError","name","pluginModulePath","getPluginModulePath","pluginModule","err","error","default","push","getPluginName","provider","output","warnings","dmmf","undefined","runPlugin","getDMMF","datamodel","fs","readFileSync","encoding","green","w","warn","yellow","providerField","spinner","ora","cyan","start","telemetry","trackSpan","result","Promise","Array","isArray","succeed","fail","startsWith","replace","path","join","__dirname"],"sources":["../../src/cli/plugin-runner.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport { DMMF } from '@prisma/generator-helper';\nimport { getDMMF } from '@prisma/internals';\nimport { Plugin, isPlugin } from '@zenstackhq/language/ast';\nimport { PluginFunction, PluginOptions, getLiteral, getLiteralArray } from '@zenstackhq/sdk';\nimport colors from 'colors';\nimport fs from 'fs';\nimport ora from 'ora';\nimport path from 'path';\nimport telemetry from '../telemetry';\nimport { Context } from '../types';\nimport { CliError } from './cli-error';\n\n/**\n * ZenStack code generator\n */\nexport class PluginRunner {\n /**\n * Runs a series of nested generators\n */\n async run(context: Context): Promise<void> {\n const version = require('../package.json').version;\n console.log(colors.bold(`⌛️ ZenStack CLI v${version}, running plugins`));\n\n const plugins: Array<{\n provider: string;\n name: string;\n run: PluginFunction;\n options: PluginOptions;\n }> = [];\n\n const pluginDecls = context.schema.declarations.filter((d): d is Plugin => isPlugin(d));\n const prereqPlugins = ['@zenstack/prisma', '@zenstack/model-meta', '@zenstack/access-policy'];\n const allPluginProviders = prereqPlugins.concat(\n pluginDecls\n .map((p) => this.getPluginProvider(p))\n .filter((p): p is string => !!p && !prereqPlugins.includes(p))\n );\n let prismaOutput = './prisma/schema.prisma';\n\n for (const pluginProvider of allPluginProviders) {\n const plugin = pluginDecls.find((p) => this.getPluginProvider(p) === pluginProvider);\n if (plugin) {\n const options: PluginOptions = { schemaPath: context.schemaPath };\n\n plugin.fields.forEach((f) => {\n const value = getLiteral(f.value) || getLiteralArray(f.value);\n if (!value) {\n throw new CliError(`Invalid plugin value for ${f.name}`);\n }\n options[f.name] = value;\n });\n\n const pluginModulePath = this.getPluginModulePath(pluginProvider);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let pluginModule: any;\n try {\n pluginModule = require(pluginModulePath);\n } catch (err) {\n console.error(`Unable to load plugin module ${pluginProvider}: ${pluginModulePath}, ${err}`);\n throw new CliError(`Unable to load plugin module ${pluginProvider}`);\n }\n\n if (!pluginModule.default || typeof pluginModule.default !== 'function') {\n console.error(`Plugin provider ${pluginProvider} is missing a default function export`);\n throw new CliError(`Plugin provider ${pluginProvider} is missing a default function export`);\n }\n plugins.push({\n name: this.getPluginName(pluginModule, pluginProvider),\n provider: pluginProvider,\n run: pluginModule.default as PluginFunction,\n options,\n });\n\n if (pluginProvider === '@zenstack/prisma' && options.output) {\n // record custom prisma output path\n prismaOutput = options.output as string;\n }\n } else {\n // synthesize a plugin\n const pluginModule = require(this.getPluginModulePath(pluginProvider));\n plugins.push({\n name: this.getPluginName(pluginModule, pluginProvider),\n provider: pluginProvider,\n run: pluginModule.default,\n options: { schemaPath: context.schemaPath },\n });\n }\n }\n\n const warnings: string[] = [];\n\n let dmmf: DMMF.Document | undefined = undefined;\n for (const { name, provider, run, options } of plugins) {\n await this.runPlugin(name, run, context, options, dmmf, warnings);\n if (provider === '@zenstack/prisma') {\n // load prisma DMMF\n dmmf = await getDMMF({\n datamodel: fs.readFileSync(prismaOutput, { encoding: 'utf-8' }),\n });\n }\n }\n\n console.log(colors.green(colors.bold('\\n👻 All plugins completed successfully!')));\n\n warnings.forEach((w) => console.warn(colors.yellow(w)));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private getPluginName(pluginModule: any, pluginProvider: string): string {\n return typeof pluginModule.name === 'string' ? (pluginModule.name as string) : pluginProvider;\n }\n\n private getPluginProvider(plugin: Plugin) {\n const providerField = plugin.fields.find((f) => f.name === 'provider');\n return getLiteral<string>(providerField?.value);\n }\n\n private async runPlugin(\n name: string,\n run: PluginFunction,\n context: Context,\n options: PluginOptions,\n dmmf: DMMF.Document | undefined,\n warnings: string[]\n ) {\n const spinner = ora(`Running plugin ${colors.cyan(name)}`).start();\n try {\n await telemetry.trackSpan(\n 'cli:plugin:start',\n 'cli:plugin:complete',\n 'cli:plugin:error',\n {\n plugin: name,\n },\n async () => {\n let result = run(context.schema, options, dmmf);\n if (result instanceof Promise) {\n result = await result;\n }\n if (Array.isArray(result)) {\n warnings.push(...result);\n }\n }\n );\n spinner.succeed();\n } catch (err) {\n spinner.fail();\n throw err;\n }\n }\n\n private getPluginModulePath(provider: string) {\n let pluginModulePath = provider;\n if (pluginModulePath.startsWith('@zenstack/')) {\n pluginModulePath = pluginModulePath.replace(/^@zenstack/, path.join(__dirname, '../plugins'));\n }\n return pluginModulePath;\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { DataModel } from '@zenstackhq/language/ast';
2
- import { AstValidator } from '../types';
3
2
  import { ValidationAcceptor } from 'langium';
3
+ import { AstValidator } from '../types';
4
4
  /**
5
5
  * Validates data model declarations.
6
6
  */
@@ -4,10 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.default = void 0;
7
- var _constants = require("../constants");
8
7
  var _ast = require("@zenstackhq/language/ast");
9
- var _utils = require("./utils");
10
8
  var _pluralize = _interopRequireDefault(require("pluralize"));
9
+ var _astUtils = require("../../utils/ast-utils");
10
+ var _constants = require("../constants");
11
+ var _utils = require("./utils");
11
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
13
  /**
13
14
  * Validates data model declarations.
@@ -24,9 +25,18 @@ class DataModelValidator {
24
25
  return ((_attr$decl$ref = attr.decl.ref) === null || _attr$decl$ref === void 0 ? void 0 : _attr$decl$ref.name) === '@id';
25
26
  }));
26
27
  if (idFields.length === 0) {
27
- accept('error', 'Model must include a field with @id attribute', {
28
- node: dm
29
- });
28
+ const {
29
+ allows,
30
+ denies,
31
+ hasFieldValidation
32
+ } = (0, _astUtils.analyzePolicies)(dm);
33
+ if (allows.length > 0 || denies.length > 0 || hasFieldValidation) {
34
+ // TODO: relax this requirement to require only @unique fields
35
+ // when access policies or field valdaition is used, require an @id field
36
+ accept('error', 'Model must include a field with @id attribute', {
37
+ node: dm
38
+ });
39
+ }
30
40
  } else if (idFields.length > 1) {
31
41
  accept('error', 'Model can include at most one field with @id attribute', {
32
42
  node: dm
@@ -1 +1 @@
1
- {"version":3,"file":"datamodel-validator.js","names":["DataModelValidator","validate","dm","accept","validateDuplicatedDeclarations","fields","validateFields","validateAttributes","idFields","filter","f","attributes","find","attr","decl","ref","name","length","node","type","optional","array","SCALAR_TYPES","includes","forEach","field","validateField","validateAttributeApplication","isDataModel","reference","validateRelationField","targetDecl","$container","isAttribute","isDataModelField","isValidAttributeTarget","filledParams","Set","arg","args","paramDecl","params","p","default","has","assignableToAttributeParam","add","$resolvedParam","missingParams","pluralize","map","join","attrDecl","targetField","fieldTypes","value","items","item","target","allowed","allowedType","parseRelation","relAttr","references","valid","isLiteralExpr","i","$resolvedType","thisRelation","oppositeModel","oppositeFields","fieldRel","oppositeField","oppositeRelation","relationOwner","refField","a"],"sources":["../../../src/language-server/validator/datamodel-validator.ts"],"sourcesContent":["import { SCALAR_TYPES } from '../constants';\nimport {\n ArrayExpr,\n Attribute,\n AttributeParam,\n DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n isAttribute,\n isDataModel,\n isDataModelField,\n isLiteralExpr,\n ReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport { AstValidator } from '../types';\nimport { ValidationAcceptor } from 'langium';\nimport { assignableToAttributeParam, validateDuplicatedDeclarations } from './utils';\nimport pluralize from 'pluralize';\n\n/**\n * Validates data model declarations.\n */\nexport default class DataModelValidator implements AstValidator<DataModel> {\n validate(dm: DataModel, accept: ValidationAcceptor): void {\n validateDuplicatedDeclarations(dm.fields, accept);\n this.validateFields(dm, accept);\n this.validateAttributes(dm, accept);\n }\n\n private validateFields(dm: DataModel, accept: ValidationAcceptor) {\n const idFields = dm.fields.filter((f) => f.attributes.find((attr) => attr.decl.ref?.name === '@id'));\n if (idFields.length === 0) {\n accept('error', 'Model must include a field with @id attribute', {\n node: dm,\n });\n } else if (idFields.length > 1) {\n accept('error', 'Model can include at most one field with @id attribute', {\n node: dm,\n });\n } else {\n if (idFields[0].type.optional) {\n accept('error', 'Field with @id attribute must not be optional', { node: idFields[0] });\n }\n\n if (idFields[0].type.array || !idFields[0].type.type || !SCALAR_TYPES.includes(idFields[0].type.type)) {\n accept('error', 'Field with @id attribute must be of scalar type', { node: idFields[0] });\n }\n }\n\n dm.fields.forEach((field) => this.validateField(field, accept));\n }\n\n private validateField(field: DataModelField, accept: ValidationAcceptor): void {\n if (field.type.array && field.type.optional) {\n accept('error', 'Optional lists are not supported. Use either `Type[]` or `Type?`', { node: field.type });\n }\n\n field.attributes.forEach((attr) => this.validateAttributeApplication(attr, accept));\n\n if (isDataModel(field.type.reference?.ref)) {\n this.validateRelationField(field, accept);\n }\n }\n\n private validateAttributes(dm: DataModel, accept: ValidationAcceptor) {\n dm.attributes.forEach((attr) => {\n this.validateAttributeApplication(attr, accept);\n });\n }\n\n private validateAttributeApplication(\n attr: DataModelAttribute | DataModelFieldAttribute,\n accept: ValidationAcceptor\n ) {\n const decl = attr.decl.ref;\n if (!decl) {\n return;\n }\n\n const targetDecl = attr.$container;\n if (decl.name === '@@@targetField' && !isAttribute(targetDecl)) {\n accept('error', `attribute \"${decl.name}\" can only be used on attribute declarations`, { node: attr });\n return;\n }\n\n if (isDataModelField(targetDecl) && !this.isValidAttributeTarget(decl, targetDecl)) {\n accept('error', `attribute \"${decl.name}\" cannot be used on this type of field`, { node: attr });\n }\n\n const filledParams = new Set<AttributeParam>();\n\n for (const arg of attr.args) {\n let paramDecl: AttributeParam | undefined;\n if (!arg.name) {\n paramDecl = decl.params.find((p) => p.default && !filledParams.has(p));\n if (!paramDecl) {\n accept('error', `Unexpected unnamed argument`, {\n node: arg,\n });\n return false;\n }\n } else {\n paramDecl = decl.params.find((p) => p.name === arg.name);\n if (!paramDecl) {\n accept('error', `Attribute \"${decl.name}\" doesn't have a parameter named \"${arg.name}\"`, {\n node: arg,\n });\n return false;\n }\n }\n\n if (!assignableToAttributeParam(arg, paramDecl, attr)) {\n accept('error', `Value is not assignable to parameter`, {\n node: arg,\n });\n return false;\n }\n\n if (filledParams.has(paramDecl)) {\n accept('error', `Parameter \"${paramDecl.name}\" is already provided`, { node: arg });\n return false;\n }\n filledParams.add(paramDecl);\n arg.$resolvedParam = paramDecl;\n }\n\n const missingParams = decl.params.filter((p) => !p.type.optional && !filledParams.has(p));\n if (missingParams.length > 0) {\n accept(\n 'error',\n `Required ${pluralize('parameter', missingParams.length)} not provided: ${missingParams\n .map((p) => p.name)\n .join(', ')}`,\n { node: attr }\n );\n return false;\n }\n\n return true;\n }\n\n private isValidAttributeTarget(attrDecl: Attribute, targetDecl: DataModelField) {\n const targetField = attrDecl.attributes.find((attr) => attr.decl.ref?.name === '@@@targetField');\n if (!targetField) {\n // no field type constraint\n return true;\n }\n\n const fieldTypes = (targetField.args[0].value as ArrayExpr).items.map(\n (item) => (item as ReferenceExpr).target.ref?.name\n );\n\n let allowed = false;\n for (const allowedType of fieldTypes) {\n switch (allowedType) {\n case 'StringField':\n allowed = allowed || targetDecl.type.type === 'String';\n break;\n case 'IntField':\n allowed = allowed || targetDecl.type.type === 'Int';\n break;\n case 'FloatField':\n allowed = allowed || targetDecl.type.type === 'Float';\n break;\n case 'DecimalField':\n allowed = allowed || targetDecl.type.type === 'Decimal';\n break;\n case 'BooleanField':\n allowed = allowed || targetDecl.type.type === 'Boolean';\n break;\n case 'DateTimeField':\n allowed = allowed || targetDecl.type.type === 'DateTime';\n break;\n case 'JsonField':\n allowed = allowed || targetDecl.type.type === 'Json';\n break;\n case 'BytesField':\n allowed = allowed || targetDecl.type.type === 'Bytes';\n break;\n case 'ModelField':\n allowed = allowed || isDataModel(targetDecl.type.reference?.ref);\n break;\n default:\n break;\n }\n if (allowed) {\n break;\n }\n }\n\n return allowed;\n }\n\n private parseRelation(field: DataModelField, accept?: ValidationAcceptor) {\n const relAttr = field.attributes.find((attr) => attr.decl.ref?.name === '@relation');\n\n let name: string | undefined;\n let fields: ReferenceExpr[] | undefined;\n let references: ReferenceExpr[] | undefined;\n let valid = true;\n\n if (!relAttr) {\n return { attr: relAttr, name, fields, references, valid: true };\n }\n\n for (const arg of relAttr.args) {\n if (!arg.name || arg.name === 'name') {\n if (isLiteralExpr(arg.value)) {\n name = arg.value.value as string;\n }\n } else if (arg.name === 'fields') {\n fields = (arg.value as ArrayExpr).items as ReferenceExpr[];\n if (fields.length === 0) {\n if (accept) {\n accept('error', `\"fields\" value cannot be emtpy`, {\n node: arg,\n });\n }\n valid = false;\n }\n } else if (arg.name === 'references') {\n references = (arg.value as ArrayExpr).items as ReferenceExpr[];\n if (references.length === 0) {\n if (accept) {\n accept('error', `\"references\" value cannot be emtpy`, {\n node: arg,\n });\n }\n valid = false;\n }\n }\n }\n\n if (!fields || !references) {\n if (accept) {\n accept('error', `Both \"fields\" and \"references\" must be provided`, { node: relAttr });\n }\n } else {\n // validate \"fields\" and \"references\" typing consistency\n if (fields.length !== references.length) {\n if (accept) {\n accept('error', `\"references\" and \"fields\" must have the same length`, { node: relAttr });\n }\n } else {\n for (let i = 0; i < fields.length; i++) {\n if (!fields[i].$resolvedType) {\n if (accept) {\n accept('error', `field reference is unresolved`, { node: fields[i] });\n }\n }\n if (!references[i].$resolvedType) {\n if (accept) {\n accept('error', `field reference is unresolved`, { node: references[i] });\n }\n }\n\n if (\n fields[i].$resolvedType?.decl !== references[i].$resolvedType?.decl ||\n fields[i].$resolvedType?.array !== references[i].$resolvedType?.array\n ) {\n if (accept) {\n accept('error', `values of \"references\" and \"fields\" must have the same type`, {\n node: relAttr,\n });\n }\n }\n }\n }\n }\n\n return { attr: relAttr, name, fields, references, valid };\n }\n\n private validateRelationField(field: DataModelField, accept: ValidationAcceptor) {\n const thisRelation = this.parseRelation(field, accept);\n if (!thisRelation.valid) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const oppositeModel = field.type.reference!.ref! as DataModel;\n\n let oppositeFields = oppositeModel.fields.filter((f) => f.type.reference?.ref === field.$container);\n oppositeFields = oppositeFields.filter((f) => {\n const fieldRel = this.parseRelation(f);\n return fieldRel.valid && fieldRel.name === thisRelation.name;\n });\n\n if (oppositeFields.length === 0) {\n accept(\n 'error',\n `The relation field \"${field.name}\" on model \"${field.$container.name}\" is missing an opposite relation field on model \"${oppositeModel.name}\"`,\n { node: field }\n );\n return;\n } else if (oppositeFields.length > 1) {\n oppositeFields.forEach((f) =>\n accept(\n 'error',\n `Fields ${oppositeFields.map((f) => '\"' + f.name + '\"').join(', ')} on model \"${\n oppositeModel.name\n }\" refer to the same relation to model \"${field.$container.name}\"`,\n { node: f }\n )\n );\n return;\n }\n\n const oppositeField = oppositeFields[0];\n const oppositeRelation = this.parseRelation(oppositeField);\n\n let relationOwner: DataModelField;\n\n if (thisRelation?.references?.length && thisRelation.fields?.length) {\n if (oppositeRelation?.references || oppositeRelation?.fields) {\n accept('error', '\"fields\" and \"references\" must be provided only on one side of relation field', {\n node: oppositeField,\n });\n return;\n } else {\n relationOwner = oppositeField;\n }\n } else if (oppositeRelation?.references?.length && oppositeRelation.fields?.length) {\n if (thisRelation?.references || thisRelation?.fields) {\n accept('error', '\"fields\" and \"references\" must be provided only on one side of relation field', {\n node: field,\n });\n return;\n } else {\n relationOwner = field;\n }\n } else {\n [field, oppositeField].forEach((f) =>\n accept(\n 'error',\n 'Field for one side of relation must carry @relation attribute with both \"fields\" and \"references\" fields',\n { node: f }\n )\n );\n return;\n }\n\n if (!relationOwner.type.array && !relationOwner.type.optional) {\n accept('error', 'Relation field needs to be list or optional', {\n node: relationOwner,\n });\n return;\n }\n\n if (relationOwner !== field && !relationOwner.type.array) {\n // one-to-one relation requires defining side's reference field to be @unique\n // e.g.:\n // model User {\n // id String @id @default(cuid())\n // data UserData?\n // }\n // model UserData {\n // id String @id @default(cuid())\n // user User @relation(fields: [userId], references: [id])\n // userId String\n // }\n //\n // UserData.userId field needs to be @unique\n\n thisRelation.fields?.forEach((ref) => {\n const refField = ref.target.ref as DataModelField;\n if (refField && !refField.attributes.find((a) => a.decl.ref?.name === '@unique')) {\n accept(\n 'error',\n `Field \"${refField.name}\" is part of a one-to-one relation and must be marked as @unique`,\n { node: refField }\n );\n }\n });\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"datamodel-validator.js","names":["DataModelValidator","validate","dm","accept","validateDuplicatedDeclarations","fields","validateFields","validateAttributes","idFields","filter","f","attributes","find","attr","decl","ref","name","length","allows","denies","hasFieldValidation","analyzePolicies","node","type","optional","array","SCALAR_TYPES","includes","forEach","field","validateField","validateAttributeApplication","isDataModel","reference","validateRelationField","targetDecl","$container","isAttribute","isDataModelField","isValidAttributeTarget","filledParams","Set","arg","args","paramDecl","params","p","default","has","assignableToAttributeParam","add","$resolvedParam","missingParams","pluralize","map","join","attrDecl","targetField","fieldTypes","value","items","item","target","allowed","allowedType","parseRelation","relAttr","references","valid","isLiteralExpr","i","$resolvedType","thisRelation","oppositeModel","oppositeFields","fieldRel","oppositeField","oppositeRelation","relationOwner","refField","a"],"sources":["../../../src/language-server/validator/datamodel-validator.ts"],"sourcesContent":["import {\n ArrayExpr,\n Attribute,\n AttributeParam,\n DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n isAttribute,\n isDataModel,\n isDataModelField,\n isLiteralExpr,\n ReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport { ValidationAcceptor } from 'langium';\nimport pluralize from 'pluralize';\nimport { analyzePolicies } from '../../utils/ast-utils';\nimport { SCALAR_TYPES } from '../constants';\nimport { AstValidator } from '../types';\nimport { assignableToAttributeParam, validateDuplicatedDeclarations } from './utils';\n\n/**\n * Validates data model declarations.\n */\nexport default class DataModelValidator implements AstValidator<DataModel> {\n validate(dm: DataModel, accept: ValidationAcceptor): void {\n validateDuplicatedDeclarations(dm.fields, accept);\n this.validateFields(dm, accept);\n this.validateAttributes(dm, accept);\n }\n\n private validateFields(dm: DataModel, accept: ValidationAcceptor) {\n const idFields = dm.fields.filter((f) => f.attributes.find((attr) => attr.decl.ref?.name === '@id'));\n if (idFields.length === 0) {\n const { allows, denies, hasFieldValidation } = analyzePolicies(dm);\n if (allows.length > 0 || denies.length > 0 || hasFieldValidation) {\n // TODO: relax this requirement to require only @unique fields\n // when access policies or field valdaition is used, require an @id field\n accept('error', 'Model must include a field with @id attribute', {\n node: dm,\n });\n }\n } else if (idFields.length > 1) {\n accept('error', 'Model can include at most one field with @id attribute', {\n node: dm,\n });\n } else {\n if (idFields[0].type.optional) {\n accept('error', 'Field with @id attribute must not be optional', { node: idFields[0] });\n }\n\n if (idFields[0].type.array || !idFields[0].type.type || !SCALAR_TYPES.includes(idFields[0].type.type)) {\n accept('error', 'Field with @id attribute must be of scalar type', { node: idFields[0] });\n }\n }\n\n dm.fields.forEach((field) => this.validateField(field, accept));\n }\n\n private validateField(field: DataModelField, accept: ValidationAcceptor): void {\n if (field.type.array && field.type.optional) {\n accept('error', 'Optional lists are not supported. Use either `Type[]` or `Type?`', { node: field.type });\n }\n\n field.attributes.forEach((attr) => this.validateAttributeApplication(attr, accept));\n\n if (isDataModel(field.type.reference?.ref)) {\n this.validateRelationField(field, accept);\n }\n }\n\n private validateAttributes(dm: DataModel, accept: ValidationAcceptor) {\n dm.attributes.forEach((attr) => {\n this.validateAttributeApplication(attr, accept);\n });\n }\n\n private validateAttributeApplication(\n attr: DataModelAttribute | DataModelFieldAttribute,\n accept: ValidationAcceptor\n ) {\n const decl = attr.decl.ref;\n if (!decl) {\n return;\n }\n\n const targetDecl = attr.$container;\n if (decl.name === '@@@targetField' && !isAttribute(targetDecl)) {\n accept('error', `attribute \"${decl.name}\" can only be used on attribute declarations`, { node: attr });\n return;\n }\n\n if (isDataModelField(targetDecl) && !this.isValidAttributeTarget(decl, targetDecl)) {\n accept('error', `attribute \"${decl.name}\" cannot be used on this type of field`, { node: attr });\n }\n\n const filledParams = new Set<AttributeParam>();\n\n for (const arg of attr.args) {\n let paramDecl: AttributeParam | undefined;\n if (!arg.name) {\n paramDecl = decl.params.find((p) => p.default && !filledParams.has(p));\n if (!paramDecl) {\n accept('error', `Unexpected unnamed argument`, {\n node: arg,\n });\n return false;\n }\n } else {\n paramDecl = decl.params.find((p) => p.name === arg.name);\n if (!paramDecl) {\n accept('error', `Attribute \"${decl.name}\" doesn't have a parameter named \"${arg.name}\"`, {\n node: arg,\n });\n return false;\n }\n }\n\n if (!assignableToAttributeParam(arg, paramDecl, attr)) {\n accept('error', `Value is not assignable to parameter`, {\n node: arg,\n });\n return false;\n }\n\n if (filledParams.has(paramDecl)) {\n accept('error', `Parameter \"${paramDecl.name}\" is already provided`, { node: arg });\n return false;\n }\n filledParams.add(paramDecl);\n arg.$resolvedParam = paramDecl;\n }\n\n const missingParams = decl.params.filter((p) => !p.type.optional && !filledParams.has(p));\n if (missingParams.length > 0) {\n accept(\n 'error',\n `Required ${pluralize('parameter', missingParams.length)} not provided: ${missingParams\n .map((p) => p.name)\n .join(', ')}`,\n { node: attr }\n );\n return false;\n }\n\n return true;\n }\n\n private isValidAttributeTarget(attrDecl: Attribute, targetDecl: DataModelField) {\n const targetField = attrDecl.attributes.find((attr) => attr.decl.ref?.name === '@@@targetField');\n if (!targetField) {\n // no field type constraint\n return true;\n }\n\n const fieldTypes = (targetField.args[0].value as ArrayExpr).items.map(\n (item) => (item as ReferenceExpr).target.ref?.name\n );\n\n let allowed = false;\n for (const allowedType of fieldTypes) {\n switch (allowedType) {\n case 'StringField':\n allowed = allowed || targetDecl.type.type === 'String';\n break;\n case 'IntField':\n allowed = allowed || targetDecl.type.type === 'Int';\n break;\n case 'FloatField':\n allowed = allowed || targetDecl.type.type === 'Float';\n break;\n case 'DecimalField':\n allowed = allowed || targetDecl.type.type === 'Decimal';\n break;\n case 'BooleanField':\n allowed = allowed || targetDecl.type.type === 'Boolean';\n break;\n case 'DateTimeField':\n allowed = allowed || targetDecl.type.type === 'DateTime';\n break;\n case 'JsonField':\n allowed = allowed || targetDecl.type.type === 'Json';\n break;\n case 'BytesField':\n allowed = allowed || targetDecl.type.type === 'Bytes';\n break;\n case 'ModelField':\n allowed = allowed || isDataModel(targetDecl.type.reference?.ref);\n break;\n default:\n break;\n }\n if (allowed) {\n break;\n }\n }\n\n return allowed;\n }\n\n private parseRelation(field: DataModelField, accept?: ValidationAcceptor) {\n const relAttr = field.attributes.find((attr) => attr.decl.ref?.name === '@relation');\n\n let name: string | undefined;\n let fields: ReferenceExpr[] | undefined;\n let references: ReferenceExpr[] | undefined;\n let valid = true;\n\n if (!relAttr) {\n return { attr: relAttr, name, fields, references, valid: true };\n }\n\n for (const arg of relAttr.args) {\n if (!arg.name || arg.name === 'name') {\n if (isLiteralExpr(arg.value)) {\n name = arg.value.value as string;\n }\n } else if (arg.name === 'fields') {\n fields = (arg.value as ArrayExpr).items as ReferenceExpr[];\n if (fields.length === 0) {\n if (accept) {\n accept('error', `\"fields\" value cannot be emtpy`, {\n node: arg,\n });\n }\n valid = false;\n }\n } else if (arg.name === 'references') {\n references = (arg.value as ArrayExpr).items as ReferenceExpr[];\n if (references.length === 0) {\n if (accept) {\n accept('error', `\"references\" value cannot be emtpy`, {\n node: arg,\n });\n }\n valid = false;\n }\n }\n }\n\n if (!fields || !references) {\n if (accept) {\n accept('error', `Both \"fields\" and \"references\" must be provided`, { node: relAttr });\n }\n } else {\n // validate \"fields\" and \"references\" typing consistency\n if (fields.length !== references.length) {\n if (accept) {\n accept('error', `\"references\" and \"fields\" must have the same length`, { node: relAttr });\n }\n } else {\n for (let i = 0; i < fields.length; i++) {\n if (!fields[i].$resolvedType) {\n if (accept) {\n accept('error', `field reference is unresolved`, { node: fields[i] });\n }\n }\n if (!references[i].$resolvedType) {\n if (accept) {\n accept('error', `field reference is unresolved`, { node: references[i] });\n }\n }\n\n if (\n fields[i].$resolvedType?.decl !== references[i].$resolvedType?.decl ||\n fields[i].$resolvedType?.array !== references[i].$resolvedType?.array\n ) {\n if (accept) {\n accept('error', `values of \"references\" and \"fields\" must have the same type`, {\n node: relAttr,\n });\n }\n }\n }\n }\n }\n\n return { attr: relAttr, name, fields, references, valid };\n }\n\n private validateRelationField(field: DataModelField, accept: ValidationAcceptor) {\n const thisRelation = this.parseRelation(field, accept);\n if (!thisRelation.valid) {\n return;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const oppositeModel = field.type.reference!.ref! as DataModel;\n\n let oppositeFields = oppositeModel.fields.filter((f) => f.type.reference?.ref === field.$container);\n oppositeFields = oppositeFields.filter((f) => {\n const fieldRel = this.parseRelation(f);\n return fieldRel.valid && fieldRel.name === thisRelation.name;\n });\n\n if (oppositeFields.length === 0) {\n accept(\n 'error',\n `The relation field \"${field.name}\" on model \"${field.$container.name}\" is missing an opposite relation field on model \"${oppositeModel.name}\"`,\n { node: field }\n );\n return;\n } else if (oppositeFields.length > 1) {\n oppositeFields.forEach((f) =>\n accept(\n 'error',\n `Fields ${oppositeFields.map((f) => '\"' + f.name + '\"').join(', ')} on model \"${\n oppositeModel.name\n }\" refer to the same relation to model \"${field.$container.name}\"`,\n { node: f }\n )\n );\n return;\n }\n\n const oppositeField = oppositeFields[0];\n const oppositeRelation = this.parseRelation(oppositeField);\n\n let relationOwner: DataModelField;\n\n if (thisRelation?.references?.length && thisRelation.fields?.length) {\n if (oppositeRelation?.references || oppositeRelation?.fields) {\n accept('error', '\"fields\" and \"references\" must be provided only on one side of relation field', {\n node: oppositeField,\n });\n return;\n } else {\n relationOwner = oppositeField;\n }\n } else if (oppositeRelation?.references?.length && oppositeRelation.fields?.length) {\n if (thisRelation?.references || thisRelation?.fields) {\n accept('error', '\"fields\" and \"references\" must be provided only on one side of relation field', {\n node: field,\n });\n return;\n } else {\n relationOwner = field;\n }\n } else {\n [field, oppositeField].forEach((f) =>\n accept(\n 'error',\n 'Field for one side of relation must carry @relation attribute with both \"fields\" and \"references\" fields',\n { node: f }\n )\n );\n return;\n }\n\n if (!relationOwner.type.array && !relationOwner.type.optional) {\n accept('error', 'Relation field needs to be list or optional', {\n node: relationOwner,\n });\n return;\n }\n\n if (relationOwner !== field && !relationOwner.type.array) {\n // one-to-one relation requires defining side's reference field to be @unique\n // e.g.:\n // model User {\n // id String @id @default(cuid())\n // data UserData?\n // }\n // model UserData {\n // id String @id @default(cuid())\n // user User @relation(fields: [userId], references: [id])\n // userId String\n // }\n //\n // UserData.userId field needs to be @unique\n\n thisRelation.fields?.forEach((ref) => {\n const refField = ref.target.ref as DataModelField;\n if (refField && !refField.attributes.find((a) => a.decl.ref?.name === '@unique')) {\n accept(\n 'error',\n `Field \"${refField.name}\" is part of a one-to-one relation and must be marked as @unique`,\n { node: refField }\n );\n }\n });\n }\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { AbstractFormatter, AstNode } from 'langium';
2
+ export declare class ZModelFormatter extends AbstractFormatter {
3
+ protected format(node: AstNode): void;
4
+ }
@@ -0,0 +1,28 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ZModelFormatter = void 0;
7
+ var _langium = require("langium");
8
+ var ast = _interopRequireWildcard(require("@zenstackhq/language/ast"));
9
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
10
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
11
+ class ZModelFormatter extends _langium.AbstractFormatter {
12
+ format(node) {
13
+ const formatter = this.getNodeFormatter(node);
14
+ if (ast.isAbstractDeclaration(node)) {
15
+ const bracesOpen = formatter.keyword('{');
16
+ const bracesClose = formatter.keyword('}');
17
+ formatter.interior(bracesOpen, bracesClose).prepend(_langium.Formatting.indent());
18
+ bracesOpen.prepend(_langium.Formatting.oneSpace());
19
+ bracesClose.prepend(_langium.Formatting.newLine());
20
+ } else if (ast.isModel(node)) {
21
+ const model = node;
22
+ const nodes = formatter.nodes(...model.declarations);
23
+ nodes.prepend(_langium.Formatting.noIndent());
24
+ }
25
+ }
26
+ }
27
+ exports.ZModelFormatter = ZModelFormatter;
28
+ //# sourceMappingURL=zmodel-formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zmodel-formatter.js","names":["ZModelFormatter","AbstractFormatter","format","node","formatter","getNodeFormatter","ast","isAbstractDeclaration","bracesOpen","keyword","bracesClose","interior","prepend","Formatting","indent","oneSpace","newLine","isModel","model","nodes","declarations","noIndent"],"sources":["../../src/language-server/zmodel-formatter.ts"],"sourcesContent":["import { AbstractFormatter, AstNode, Formatting } from 'langium';\n\nimport * as ast from '@zenstackhq/language/ast';\n\nexport class ZModelFormatter extends AbstractFormatter {\n protected format(node: AstNode): void {\n const formatter = this.getNodeFormatter(node);\n if (ast.isAbstractDeclaration(node)) {\n const bracesOpen = formatter.keyword('{');\n const bracesClose = formatter.keyword('}');\n formatter.interior(bracesOpen, bracesClose).prepend(Formatting.indent());\n bracesOpen.prepend(Formatting.oneSpace());\n bracesClose.prepend(Formatting.newLine());\n } else if (ast.isModel(node)) {\n const model = node as ast.Model;\n const nodes = formatter.nodes(...model.declarations);\n nodes.prepend(Formatting.noIndent());\n }\n }\n}\n"],"mappings":";;;;;;AAAA;AAEA;AAAgD;AAAA;AAEzC,MAAMA,eAAe,SAASC,0BAAiB,CAAC;EACzCC,MAAM,CAACC,IAAa,EAAQ;IAClC,MAAMC,SAAS,GAAG,IAAI,CAACC,gBAAgB,CAACF,IAAI,CAAC;IAC7C,IAAIG,GAAG,CAACC,qBAAqB,CAACJ,IAAI,CAAC,EAAE;MACjC,MAAMK,UAAU,GAAGJ,SAAS,CAACK,OAAO,CAAC,GAAG,CAAC;MACzC,MAAMC,WAAW,GAAGN,SAAS,CAACK,OAAO,CAAC,GAAG,CAAC;MAC1CL,SAAS,CAACO,QAAQ,CAACH,UAAU,EAAEE,WAAW,CAAC,CAACE,OAAO,CAACC,mBAAU,CAACC,MAAM,EAAE,CAAC;MACxEN,UAAU,CAACI,OAAO,CAACC,mBAAU,CAACE,QAAQ,EAAE,CAAC;MACzCL,WAAW,CAACE,OAAO,CAACC,mBAAU,CAACG,OAAO,EAAE,CAAC;IAC7C,CAAC,MAAM,IAAIV,GAAG,CAACW,OAAO,CAACd,IAAI,CAAC,EAAE;MAC1B,MAAMe,KAAK,GAAGf,IAAiB;MAC/B,MAAMgB,KAAK,GAAGf,SAAS,CAACe,KAAK,CAAC,GAAGD,KAAK,CAACE,YAAY,CAAC;MACpDD,KAAK,CAACP,OAAO,CAACC,mBAAU,CAACQ,QAAQ,EAAE,CAAC;IACxC;EACJ;AACJ;AAAC"}
@@ -11,6 +11,7 @@ var _langium = require("langium");
11
11
  var _vscodeLanguageserver = require("vscode-languageserver");
12
12
  var _vscodeLanguageserverTextdocument = require("vscode-languageserver-textdocument");
13
13
  var _zmodelValidator = require("./validator/zmodel-validator");
14
+ var _zmodelFormatter = require("./zmodel-formatter");
14
15
  var _zmodelLinker = require("./zmodel-linker");
15
16
  var _zmodelScope = require("./zmodel-scope");
16
17
  var _zmodelWorkspaceManager = _interopRequireDefault(require("./zmodel-workspace-manager"));
@@ -28,6 +29,9 @@ const ZModelModule = {
28
29
  validation: {
29
30
  ValidationRegistry: services => new _zmodelValidator.ZModelValidationRegistry(services),
30
31
  ZModelValidator: () => new _zmodelValidator.ZModelValidator()
32
+ },
33
+ lsp: {
34
+ Formatter: () => new _zmodelFormatter.ZModelFormatter()
31
35
  }
32
36
  };
33
37
 
@@ -1 +1 @@
1
- {"version":3,"file":"zmodel-module.js","names":["ZModelModule","references","ScopeComputation","services","ZModelScopeComputation","Linker","ZModelLinker","validation","ValidationRegistry","ZModelValidationRegistry","ZModelValidator","createSharedModule","context","ServiceRegistry","DefaultServiceRegistry","lsp","Connection","connection","LanguageServer","DefaultLanguageServer","workspace","LangiumDocuments","DefaultLangiumDocuments","LangiumDocumentFactory","DefaultLangiumDocumentFactory","DocumentBuilder","DefaultDocumentBuilder","TextDocuments","TextDocument","IndexManager","DefaultIndexManager","WorkspaceManager","ZModelWorkspaceManager","FileSystemProvider","fileSystemProvider","MutexLock","ConfigurationProvider","DefaultConfigurationProvider","createZModelServices","shared","inject","ZModelGeneratedSharedModule","ZModel","createDefaultModule","ZModelGeneratedModule","register"],"sources":["../../src/language-server/zmodel-module.ts"],"sourcesContent":["import { ZModelGeneratedModule, ZModelGeneratedSharedModule } from '@zenstackhq/language/module';\nimport {\n createDefaultModule,\n DefaultConfigurationProvider,\n DefaultDocumentBuilder,\n DefaultIndexManager,\n DefaultLangiumDocumentFactory,\n DefaultLangiumDocuments,\n DefaultLanguageServer,\n DefaultServiceRegistry,\n DefaultSharedModuleContext,\n inject,\n LangiumDefaultSharedServices,\n LangiumServices,\n LangiumSharedServices,\n Module,\n MutexLock,\n PartialLangiumServices,\n} from 'langium';\nimport { TextDocuments } from 'vscode-languageserver';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport { ZModelValidationRegistry, ZModelValidator } from './validator/zmodel-validator';\nimport { ZModelLinker } from './zmodel-linker';\nimport { ZModelScopeComputation } from './zmodel-scope';\nimport ZModelWorkspaceManager from './zmodel-workspace-manager';\n\n/**\n * Declaration of custom services - add your own service classes here.\n */\nexport type ZModelAddedServices = {\n validation: {\n ZModelValidator: ZModelValidator;\n };\n};\n\n/**\n * Union of Langium default services and your custom services - use this as constructor parameter\n * of custom service classes.\n */\nexport type ZModelServices = LangiumServices & ZModelAddedServices;\n\n/**\n * Dependency injection module that overrides Langium default services and contributes the\n * declared custom services. The Langium defaults can be partially specified to override only\n * selected services, while the custom services must be fully specified.\n */\nexport const ZModelModule: Module<ZModelServices, PartialLangiumServices & ZModelAddedServices> = {\n references: {\n ScopeComputation: (services) => new ZModelScopeComputation(services),\n Linker: (services) => new ZModelLinker(services),\n },\n validation: {\n ValidationRegistry: (services) => new ZModelValidationRegistry(services),\n ZModelValidator: () => new ZModelValidator(),\n },\n};\n\n// this duplicates createDefaultSharedModule except that a custom WorkspaceManager is used\nexport function createSharedModule(\n context: DefaultSharedModuleContext\n): Module<LangiumSharedServices, LangiumDefaultSharedServices> {\n return {\n ServiceRegistry: () => new DefaultServiceRegistry(),\n lsp: {\n Connection: () => context.connection,\n LanguageServer: (services) => new DefaultLanguageServer(services),\n },\n workspace: {\n LangiumDocuments: (services) => new DefaultLangiumDocuments(services),\n LangiumDocumentFactory: (services) => new DefaultLangiumDocumentFactory(services),\n DocumentBuilder: (services) => new DefaultDocumentBuilder(services),\n TextDocuments: () => new TextDocuments(TextDocument),\n IndexManager: (services) => new DefaultIndexManager(services),\n WorkspaceManager: (services) => new ZModelWorkspaceManager(services),\n FileSystemProvider: (services) => context.fileSystemProvider(services),\n MutexLock: () => new MutexLock(),\n ConfigurationProvider: (services) => new DefaultConfigurationProvider(services),\n },\n };\n}\n\n/**\n * Create the full set of services required by Langium.\n *\n * First inject the shared services by merging two modules:\n * - Langium default shared services\n * - Services generated by langium-cli\n *\n * Then inject the language-specific services by merging three modules:\n * - Langium default language-specific services\n * - Services generated by langium-cli\n * - Services specified in this file\n *\n * @param context Optional module context with the LSP connection\n * @returns An object wrapping the shared services and the language-specific services\n */\nexport function createZModelServices(context: DefaultSharedModuleContext): {\n shared: LangiumSharedServices;\n ZModel: ZModelServices;\n} {\n const shared = inject(createSharedModule(context), ZModelGeneratedSharedModule);\n\n const ZModel = inject(createDefaultModule({ shared }), ZModelGeneratedModule, ZModelModule);\n shared.ServiceRegistry.register(ZModel);\n return { shared, ZModel };\n}\n"],"mappings":";;;;;;;;AAAA;AACA;AAkBA;AACA;AACA;AACA;AACA;AACA;AAAgE;AAiBhE;AACA;AACA;AACA;AACA;AACO,MAAMA,YAAkF,GAAG;EAC9FC,UAAU,EAAE;IACRC,gBAAgB,EAAGC,QAAQ,IAAK,IAAIC,mCAAsB,CAACD,QAAQ,CAAC;IACpEE,MAAM,EAAGF,QAAQ,IAAK,IAAIG,0BAAY,CAACH,QAAQ;EACnD,CAAC;EACDI,UAAU,EAAE;IACRC,kBAAkB,EAAGL,QAAQ,IAAK,IAAIM,yCAAwB,CAACN,QAAQ,CAAC;IACxEO,eAAe,EAAE,MAAM,IAAIA,gCAAe;EAC9C;AACJ,CAAC;;AAED;AAAA;AACO,SAASC,kBAAkB,CAC9BC,OAAmC,EACwB;EAC3D,OAAO;IACHC,eAAe,EAAE,MAAM,IAAIC,+BAAsB,EAAE;IACnDC,GAAG,EAAE;MACDC,UAAU,EAAE,MAAMJ,OAAO,CAACK,UAAU;MACpCC,cAAc,EAAGf,QAAQ,IAAK,IAAIgB,8BAAqB,CAAChB,QAAQ;IACpE,CAAC;IACDiB,SAAS,EAAE;MACPC,gBAAgB,EAAGlB,QAAQ,IAAK,IAAImB,gCAAuB,CAACnB,QAAQ,CAAC;MACrEoB,sBAAsB,EAAGpB,QAAQ,IAAK,IAAIqB,sCAA6B,CAACrB,QAAQ,CAAC;MACjFsB,eAAe,EAAGtB,QAAQ,IAAK,IAAIuB,+BAAsB,CAACvB,QAAQ,CAAC;MACnEwB,aAAa,EAAE,MAAM,IAAIA,mCAAa,CAACC,8CAAY,CAAC;MACpDC,YAAY,EAAG1B,QAAQ,IAAK,IAAI2B,4BAAmB,CAAC3B,QAAQ,CAAC;MAC7D4B,gBAAgB,EAAG5B,QAAQ,IAAK,IAAI6B,+BAAsB,CAAC7B,QAAQ,CAAC;MACpE8B,kBAAkB,EAAG9B,QAAQ,IAAKS,OAAO,CAACsB,kBAAkB,CAAC/B,QAAQ,CAAC;MACtEgC,SAAS,EAAE,MAAM,IAAIA,kBAAS,EAAE;MAChCC,qBAAqB,EAAGjC,QAAQ,IAAK,IAAIkC,qCAA4B,CAAClC,QAAQ;IAClF;EACJ,CAAC;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASmC,oBAAoB,CAAC1B,OAAmC,EAGtE;EACE,MAAM2B,MAAM,GAAG,IAAAC,eAAM,EAAC7B,kBAAkB,CAACC,OAAO,CAAC,EAAE6B,mCAA2B,CAAC;EAE/E,MAAMC,MAAM,GAAG,IAAAF,eAAM,EAAC,IAAAG,4BAAmB,EAAC;IAAEJ;EAAO,CAAC,CAAC,EAAEK,6BAAqB,EAAE5C,YAAY,CAAC;EAC3FuC,MAAM,CAAC1B,eAAe,CAACgC,QAAQ,CAACH,MAAM,CAAC;EACvC,OAAO;IAAEH,MAAM;IAAEG;EAAO,CAAC;AAC7B"}
1
+ {"version":3,"file":"zmodel-module.js","names":["ZModelModule","references","ScopeComputation","services","ZModelScopeComputation","Linker","ZModelLinker","validation","ValidationRegistry","ZModelValidationRegistry","ZModelValidator","lsp","Formatter","ZModelFormatter","createSharedModule","context","ServiceRegistry","DefaultServiceRegistry","Connection","connection","LanguageServer","DefaultLanguageServer","workspace","LangiumDocuments","DefaultLangiumDocuments","LangiumDocumentFactory","DefaultLangiumDocumentFactory","DocumentBuilder","DefaultDocumentBuilder","TextDocuments","TextDocument","IndexManager","DefaultIndexManager","WorkspaceManager","ZModelWorkspaceManager","FileSystemProvider","fileSystemProvider","MutexLock","ConfigurationProvider","DefaultConfigurationProvider","createZModelServices","shared","inject","ZModelGeneratedSharedModule","ZModel","createDefaultModule","ZModelGeneratedModule","register"],"sources":["../../src/language-server/zmodel-module.ts"],"sourcesContent":["import { ZModelGeneratedModule, ZModelGeneratedSharedModule } from '@zenstackhq/language/module';\nimport {\n createDefaultModule,\n DefaultConfigurationProvider,\n DefaultDocumentBuilder,\n DefaultIndexManager,\n DefaultLangiumDocumentFactory,\n DefaultLangiumDocuments,\n DefaultLanguageServer,\n DefaultServiceRegistry,\n DefaultSharedModuleContext,\n inject,\n LangiumDefaultSharedServices,\n LangiumServices,\n LangiumSharedServices,\n Module,\n MutexLock,\n PartialLangiumServices,\n} from 'langium';\nimport { TextDocuments } from 'vscode-languageserver';\nimport { TextDocument } from 'vscode-languageserver-textdocument';\nimport { ZModelValidationRegistry, ZModelValidator } from './validator/zmodel-validator';\nimport { ZModelFormatter } from './zmodel-formatter';\nimport { ZModelLinker } from './zmodel-linker';\nimport { ZModelScopeComputation } from './zmodel-scope';\nimport ZModelWorkspaceManager from './zmodel-workspace-manager';\n\n/**\n * Declaration of custom services - add your own service classes here.\n */\nexport type ZModelAddedServices = {\n validation: {\n ZModelValidator: ZModelValidator;\n };\n};\n\n/**\n * Union of Langium default services and your custom services - use this as constructor parameter\n * of custom service classes.\n */\nexport type ZModelServices = LangiumServices & ZModelAddedServices;\n\n/**\n * Dependency injection module that overrides Langium default services and contributes the\n * declared custom services. The Langium defaults can be partially specified to override only\n * selected services, while the custom services must be fully specified.\n */\nexport const ZModelModule: Module<ZModelServices, PartialLangiumServices & ZModelAddedServices> = {\n references: {\n ScopeComputation: (services) => new ZModelScopeComputation(services),\n Linker: (services) => new ZModelLinker(services),\n },\n validation: {\n ValidationRegistry: (services) => new ZModelValidationRegistry(services),\n ZModelValidator: () => new ZModelValidator(),\n },\n lsp: {\n Formatter: () => new ZModelFormatter(),\n },\n};\n\n// this duplicates createDefaultSharedModule except that a custom WorkspaceManager is used\nexport function createSharedModule(\n context: DefaultSharedModuleContext\n): Module<LangiumSharedServices, LangiumDefaultSharedServices> {\n return {\n ServiceRegistry: () => new DefaultServiceRegistry(),\n lsp: {\n Connection: () => context.connection,\n LanguageServer: (services) => new DefaultLanguageServer(services),\n },\n workspace: {\n LangiumDocuments: (services) => new DefaultLangiumDocuments(services),\n LangiumDocumentFactory: (services) => new DefaultLangiumDocumentFactory(services),\n DocumentBuilder: (services) => new DefaultDocumentBuilder(services),\n TextDocuments: () => new TextDocuments(TextDocument),\n IndexManager: (services) => new DefaultIndexManager(services),\n WorkspaceManager: (services) => new ZModelWorkspaceManager(services),\n FileSystemProvider: (services) => context.fileSystemProvider(services),\n MutexLock: () => new MutexLock(),\n ConfigurationProvider: (services) => new DefaultConfigurationProvider(services),\n },\n };\n}\n\n/**\n * Create the full set of services required by Langium.\n *\n * First inject the shared services by merging two modules:\n * - Langium default shared services\n * - Services generated by langium-cli\n *\n * Then inject the language-specific services by merging three modules:\n * - Langium default language-specific services\n * - Services generated by langium-cli\n * - Services specified in this file\n *\n * @param context Optional module context with the LSP connection\n * @returns An object wrapping the shared services and the language-specific services\n */\nexport function createZModelServices(context: DefaultSharedModuleContext): {\n shared: LangiumSharedServices;\n ZModel: ZModelServices;\n} {\n const shared = inject(createSharedModule(context), ZModelGeneratedSharedModule);\n\n const ZModel = inject(createDefaultModule({ shared }), ZModelGeneratedModule, ZModelModule);\n shared.ServiceRegistry.register(ZModel);\n return { shared, ZModel };\n}\n"],"mappings":";;;;;;;;AAAA;AACA;AAkBA;AACA;AACA;AACA;AACA;AACA;AACA;AAAgE;AAiBhE;AACA;AACA;AACA;AACA;AACO,MAAMA,YAAkF,GAAG;EAC9FC,UAAU,EAAE;IACRC,gBAAgB,EAAGC,QAAQ,IAAK,IAAIC,mCAAsB,CAACD,QAAQ,CAAC;IACpEE,MAAM,EAAGF,QAAQ,IAAK,IAAIG,0BAAY,CAACH,QAAQ;EACnD,CAAC;EACDI,UAAU,EAAE;IACRC,kBAAkB,EAAGL,QAAQ,IAAK,IAAIM,yCAAwB,CAACN,QAAQ,CAAC;IACxEO,eAAe,EAAE,MAAM,IAAIA,gCAAe;EAC9C,CAAC;EACDC,GAAG,EAAE;IACDC,SAAS,EAAE,MAAM,IAAIC,gCAAe;EACxC;AACJ,CAAC;;AAED;AAAA;AACO,SAASC,kBAAkB,CAC9BC,OAAmC,EACwB;EAC3D,OAAO;IACHC,eAAe,EAAE,MAAM,IAAIC,+BAAsB,EAAE;IACnDN,GAAG,EAAE;MACDO,UAAU,EAAE,MAAMH,OAAO,CAACI,UAAU;MACpCC,cAAc,EAAGjB,QAAQ,IAAK,IAAIkB,8BAAqB,CAAClB,QAAQ;IACpE,CAAC;IACDmB,SAAS,EAAE;MACPC,gBAAgB,EAAGpB,QAAQ,IAAK,IAAIqB,gCAAuB,CAACrB,QAAQ,CAAC;MACrEsB,sBAAsB,EAAGtB,QAAQ,IAAK,IAAIuB,sCAA6B,CAACvB,QAAQ,CAAC;MACjFwB,eAAe,EAAGxB,QAAQ,IAAK,IAAIyB,+BAAsB,CAACzB,QAAQ,CAAC;MACnE0B,aAAa,EAAE,MAAM,IAAIA,mCAAa,CAACC,8CAAY,CAAC;MACpDC,YAAY,EAAG5B,QAAQ,IAAK,IAAI6B,4BAAmB,CAAC7B,QAAQ,CAAC;MAC7D8B,gBAAgB,EAAG9B,QAAQ,IAAK,IAAI+B,+BAAsB,CAAC/B,QAAQ,CAAC;MACpEgC,kBAAkB,EAAGhC,QAAQ,IAAKY,OAAO,CAACqB,kBAAkB,CAACjC,QAAQ,CAAC;MACtEkC,SAAS,EAAE,MAAM,IAAIA,kBAAS,EAAE;MAChCC,qBAAqB,EAAGnC,QAAQ,IAAK,IAAIoC,qCAA4B,CAACpC,QAAQ;IAClF;EACJ,CAAC;AACL;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASqC,oBAAoB,CAACzB,OAAmC,EAGtE;EACE,MAAM0B,MAAM,GAAG,IAAAC,eAAM,EAAC5B,kBAAkB,CAACC,OAAO,CAAC,EAAE4B,mCAA2B,CAAC;EAE/E,MAAMC,MAAM,GAAG,IAAAF,eAAM,EAAC,IAAAG,4BAAmB,EAAC;IAAEJ;EAAO,CAAC,CAAC,EAAEK,6BAAqB,EAAE9C,YAAY,CAAC;EAC3FyC,MAAM,CAACzB,eAAe,CAAC+B,QAAQ,CAACH,MAAM,CAAC;EACvC,OAAO;IAAEH,MAAM;IAAEG;EAAO,CAAC;AAC7B"}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "publisher": "zenstack",
4
4
  "displayName": "ZenStack Language Tools",
5
5
  "description": "A toolkit for building secure CRUD apps with Next.js + Typescript",
6
- "version": "1.0.0-alpha.20",
6
+ "version": "1.0.0-alpha.22",
7
7
  "author": {
8
8
  "name": "ZenStack Team"
9
9
  },
@@ -90,9 +90,9 @@
90
90
  "vscode-languageserver-textdocument": "^1.0.7",
91
91
  "vscode-uri": "^3.0.6",
92
92
  "zod": "^3.19.1",
93
- "@zenstackhq/language": "1.0.0-alpha.20",
94
- "@zenstackhq/runtime": "1.0.0-alpha.20",
95
- "@zenstackhq/sdk": "1.0.0-alpha.20"
93
+ "@zenstackhq/language": "1.0.0-alpha.22",
94
+ "@zenstackhq/sdk": "1.0.0-alpha.22",
95
+ "@zenstackhq/runtime": "1.0.0-alpha.22"
96
96
  },
97
97
  "devDependencies": {
98
98
  "@babel/cli": "^7.19.3",
package/types.d.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { Model } from '@zenstackhq/language/ast';
2
2
  export interface Context {
3
3
  schema: Model;
4
+ schemaPath: string;
4
5
  outDir: string;
5
6
  }
6
7
  export interface Generator {
package/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["import { Model } from '@zenstackhq/language/ast';\n\nexport interface Context {\n schema: Model;\n outDir: string;\n}\n\nexport interface Generator {\n get name(): string;\n get startMessage(): string;\n get successMessage(): string;\n generate(context: Context): Promise<string[]>;\n}\n"],"mappings":""}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["import { Model } from '@zenstackhq/language/ast';\n\nexport interface Context {\n schema: Model;\n schemaPath: string;\n outDir: string;\n}\n\nexport interface Generator {\n get name(): string;\n get startMessage(): string;\n get successMessage(): string;\n generate(context: Context): Promise<string[]>;\n}\n"],"mappings":""}