zenstack 1.0.0-alpha.20 → 1.0.0-alpha.21
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 +1 -0
- package/cli/cli-util.js.map +1 -1
- package/cli/plugin-runner.js +6 -2
- package/cli/plugin-runner.js.map +1 -1
- package/package.json +4 -4
- package/types.d.ts +1 -0
- package/types.js.map +1 -1
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 {
|
package/cli/cli-util.js.map
CHANGED
|
@@ -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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"}
|
package/cli/plugin-runner.js
CHANGED
|
@@ -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
|
}
|
package/cli/plugin-runner.js.map
CHANGED
|
@@ -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":";;;;;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAEA;AAAuC;AAXvC;;AAaA;AACA;AACA;AACO,MAAMA,YAAY,CAAC;EACtB;AACJ;AACA;EACI,MAAMC,GAAG,CAACC,OAAgB,EAAiB;IACvC,MAAMC,OAAO,GAAGC,OAAO,CAAC,iBAAiB,CAAC,CAACD,OAAO;IAClDE,OAAO,CAACC,GAAG,CAACC,eAAM,CAACC,IAAI,CAAE,oBAAmBL,OAAQ,mBAAkB,CAAC,CAAC;IAExE,MAAMM,OAKJ,GAAG,EAAE;IAEP,MAAMC,WAAW,GAAGR,OAAO,CAACS,MAAM,CAACC,YAAY,CAACC,MAAM,CAAEC,CAAC,IAAkB,IAAAC,aAAQ,EAACD,CAAC,CAAC,CAAC;IACvF,MAAME,aAAa,GAAG,CAAC,kBAAkB,EAAE,sBAAsB,EAAE,yBAAyB,CAAC;IAC7F,MAAMC,kBAAkB,GAAGD,aAAa,CAACE,MAAM,CAC3CR,WAAW,CACNS,GAAG,CAAEC,CAAC,IAAK,IAAI,CAACC,iBAAiB,CAACD,CAAC,CAAC,CAAC,CACrCP,MAAM,CAAEO,CAAC,IAAkB,CAAC,CAACA,CAAC,IAAI,CAACJ,aAAa,CAACM,QAAQ,CAACF,CAAC,CAAC,CAAC,CACrE;IACD,IAAIG,YAAY,GAAG,wBAAwB;IAE3C,KAAK,MAAMC,cAAc,IAAIP,kBAAkB,EAAE;MAC7C,MAAMQ,MAAM,GAAGf,WAAW,CAACgB,IAAI,CAAEN,CAAC,IAAK,IAAI,CAACC,iBAAiB,CAACD,CAAC,CAAC,KAAKI,cAAc,CAAC;MACpF,IAAIC,MAAM,EAAE;QACR,MAAME,OAAsB,GAAG,CAAC,CAAC;QAEjCF,MAAM,CAACG,MAAM,CAACC,OAAO,CAAEC,CAAC,IAAK;UACzB,MAAMC,KAAK,GAAG,IAAAC,eAAU,EAACF,CAAC,CAACC,KAAK,CAAC,IAAI,IAAAE,oBAAe,EAACH,CAAC,CAACC,KAAK,CAAC;UAC7D,IAAI,CAACA,KAAK,EAAE;YACR,MAAM,IAAIG,kBAAQ,CAAE,4BAA2BJ,CAAC,CAACK,IAAK,EAAC,CAAC;UAC5D;UACAR,OAAO,CAACG,CAAC,CAACK,IAAI,CAAC,GAAGJ,KAAK;QAC3B,CAAC,CAAC;QAEF,MAAMK,gBAAgB,GAAG,IAAI,CAACC,mBAAmB,CAACb,cAAc,CAAC;QACjE;QACA,IAAIc,YAAiB;QACrB,IAAI;UACAA,YAAY,GAAGlC,OAAO,CAACgC,gBAAgB,CAAC;QAC5C,CAAC,CAAC,OAAOG,GAAG,EAAE;UACVlC,OAAO,CAACmC,KAAK,CAAE,gCAA+BhB,cAAe,KAAIY,gBAAiB,KAAIG,GAAI,EAAC,CAAC;UAC5F,MAAM,IAAIL,kBAAQ,CAAE,gCAA+BV,cAAe,EAAC,CAAC;QACxE;QAEA,IAAI,CAACc,YAAY,CAACG,OAAO,IAAI,OAAOH,YAAY,CAACG,OAAO,KAAK,UAAU,EAAE;UACrEpC,OAAO,CAACmC,KAAK,CAAE,mBAAkBhB,cAAe,uCAAsC,CAAC;UACvF,MAAM,IAAIU,kBAAQ,CAAE,mBAAkBV,cAAe,uCAAsC,CAAC;QAChG;QACAf,OAAO,CAACiC,IAAI,CAAC;UACTP,IAAI,EAAE,IAAI,CAACQ,aAAa,CAACL,YAAY,EAAEd,cAAc,CAAC;UACtDoB,QAAQ,EAAEpB,cAAc;UACxBvB,GAAG,EAAEqC,YAAY,CAACG,OAAyB;UAC3Cd;QACJ,CAAC,CAAC;QAEF,IAAIH,cAAc,KAAK,kBAAkB,IAAIG,OAAO,CAACkB,MAAM,EAAE;UACzD;UACAtB,YAAY,GAAGI,OAAO,CAACkB,MAAgB;QAC3C;MACJ,CAAC,MAAM;QACH;QACA,MAAMP,YAAY,GAAGlC,OAAO,CAAC,IAAI,CAACiC,mBAAmB,CAACb,cAAc,CAAC,CAAC;QACtEf,OAAO,CAACiC,IAAI,CAAC;UACTP,IAAI,EAAE,IAAI,CAACQ,aAAa,CAACL,YAAY,EAAEd,cAAc,CAAC;UACtDoB,QAAQ,EAAEpB,cAAc;UACxBvB,GAAG,EAAEqC,YAAY,CAACG,OAAO;UACzBd,OAAO,EAAE,CAAC;QACd,CAAC,CAAC;MACN;IACJ;IAEA,MAAMmB,QAAkB,GAAG,EAAE;IAE7B,IAAIC,IAA+B,GAAGC,SAAS;IAC/C,KAAK,MAAM;MAAEb,IAAI;MAAES,QAAQ;MAAE3C,GAAG;MAAE0B;IAAQ,CAAC,IAAIlB,OAAO,EAAE;MACpD,MAAM,IAAI,CAACwC,SAAS,CAACd,IAAI,EAAElC,GAAG,EAAEC,OAAO,EAAEyB,OAAO,EAAEoB,IAAI,EAAED,QAAQ,CAAC;MACjE,IAAIF,QAAQ,KAAK,kBAAkB,EAAE;QACjC;QACAG,IAAI,GAAG,MAAM,IAAAG,kBAAO,EAAC;UACjBC,SAAS,EAAEC,WAAE,CAACC,YAAY,CAAC9B,YAAY,EAAE;YAAE+B,QAAQ,EAAE;UAAQ,CAAC;QAClE,CAAC,CAAC;MACN;IACJ;IAEAjD,OAAO,CAACC,GAAG,CAACC,eAAM,CAACgD,KAAK,CAAChD,eAAM,CAACC,IAAI,CAAC,0CAA0C,CAAC,CAAC,CAAC;IAElFsC,QAAQ,CAACjB,OAAO,CAAE2B,CAAC,IAAKnD,OAAO,CAACoD,IAAI,CAAClD,eAAM,CAACmD,MAAM,CAACF,CAAC,CAAC,CAAC,CAAC;EAC3D;;EAEA;EACQb,aAAa,CAACL,YAAiB,EAAEd,cAAsB,EAAU;IACrE,OAAO,OAAOc,YAAY,CAACH,IAAI,KAAK,QAAQ,GAAIG,YAAY,CAACH,IAAI,GAAcX,cAAc;EACjG;EAEQH,iBAAiB,CAACI,MAAc,EAAE;IACtC,MAAMkC,aAAa,GAAGlC,MAAM,CAACG,MAAM,CAACF,IAAI,CAAEI,CAAC,IAAKA,CAAC,CAACK,IAAI,KAAK,UAAU,CAAC;IACtE,OAAO,IAAAH,eAAU,EAAS2B,aAAa,aAAbA,aAAa,uBAAbA,aAAa,CAAE5B,KAAK,CAAC;EACnD;EAEA,MAAckB,SAAS,CACnBd,IAAY,EACZlC,GAAmB,EACnBC,OAAgB,EAChByB,OAAsB,EACtBoB,IAA+B,EAC/BD,QAAkB,EACpB;IACE,MAAMc,OAAO,GAAG,IAAAC,YAAG,EAAE,kBAAiBtD,eAAM,CAACuD,IAAI,CAAC3B,IAAI,CAAE,EAAC,CAAC,CAAC4B,KAAK,EAAE;IAClE,IAAI;MACA,MAAMC,kBAAS,CAACC,SAAS,CACrB,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB;QACIxC,MAAM,EAAEU;MACZ,CAAC,EACD,YAAY;QACR,IAAI+B,MAAM,GAAGjE,GAAG,CAACC,OAAO,CAACS,MAAM,EAAEgB,OAAO,EAAEoB,IAAI,CAAC;QAC/C,IAAImB,MAAM,YAAYC,OAAO,EAAE;UAC3BD,MAAM,GAAG,MAAMA,MAAM;QACzB;QACA,IAAIE,KAAK,CAACC,OAAO,CAACH,MAAM,CAAC,EAAE;UACvBpB,QAAQ,CAACJ,IAAI,CAAC,GAAGwB,MAAM,CAAC;QAC5B;MACJ,CAAC,CACJ;MACDN,OAAO,CAACU,OAAO,EAAE;IACrB,CAAC,CAAC,OAAO/B,GAAG,EAAE;MACVqB,OAAO,CAACW,IAAI,EAAE;MACd,MAAMhC,GAAG;IACb;EACJ;EAEQF,mBAAmB,CAACO,QAAgB,EAAE;IAC1C,IAAIR,gBAAgB,GAAGQ,QAAQ;IAC/B,IAAIR,gBAAgB,CAACoC,UAAU,CAAC,YAAY,CAAC,EAAE;MAC3CpC,gBAAgB,GAAGA,gBAAgB,CAACqC,OAAO,CAAC,YAAY,EAAEC,aAAI,CAACC,IAAI,CAACC,SAAS,EAAE,YAAY,CAAC,CAAC;IACjG;IACA,OAAOxC,gBAAgB;EAC3B;AACJ;AAAC"}
|
|
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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"}
|
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.
|
|
6
|
+
"version": "1.0.0-alpha.21",
|
|
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/
|
|
94
|
-
"@zenstackhq/
|
|
95
|
-
"@zenstackhq/sdk": "1.0.0-alpha.
|
|
93
|
+
"@zenstackhq/runtime": "1.0.0-alpha.21",
|
|
94
|
+
"@zenstackhq/language": "1.0.0-alpha.21",
|
|
95
|
+
"@zenstackhq/sdk": "1.0.0-alpha.21"
|
|
96
96
|
},
|
|
97
97
|
"devDependencies": {
|
|
98
98
|
"@babel/cli": "^7.19.3",
|
package/types.d.ts
CHANGED
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":""}
|