zenstack 0.6.0-pre.12 → 0.6.0-pre.13

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/index.js CHANGED
@@ -58,7 +58,7 @@ async function _default() {
58
58
  const program = new _commander.Command('zenstack');
59
59
  program.version(
60
60
  // eslint-disable-next-line @typescript-eslint/no-var-requires
61
- require('../../package.json').version, '-v --version', 'display CLI version');
61
+ require('../package.json').version, '-v --version', 'display CLI version');
62
62
  const schemaExtensions = _module.ZModelLanguageMetaData.fileExtensions.join(', ');
63
63
  program.description(`${_colors.default.bold.blue('ζ')} ZenStack is a toolkit for building secure CRUD apps with Next.js + Typescript.\n\nDocumentation: https://zenstack.dev.`).showHelpAfterError().showSuggestionAfterError();
64
64
  const schemaOption = new _commander.Option('--schema <file>', `schema file (with extension ${schemaExtensions})`).default('./schema.zmodel');
package/cli/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["requiredPrismaVersion","initAction","projectPath","options","telemetry","trackSpan","command","initProject","packageManager","generateAction","checkRequiredPackage","runPlugins","packageName","minVersion","args","process","argv","program","Command","version","require","schemaExtensions","ZModelLanguageMetaData","fileExtensions","join","description","colors","bold","blue","showHelpAfterError","showSuggestionAfterError","schemaOption","Option","default","pmOption","choices","addOption","argument","action","exitOverride","parseAsync"],"sources":["../../src/cli/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ZModelLanguageMetaData } from '@zenstackhq/language/module';\nimport colors from 'colors';\nimport { Command, Option } from 'commander';\nimport telemetry from '../telemetry';\nimport { PackageManagers } from '../utils/pkg-utils';\nimport { initProject, runPlugins } from './cli-util';\n// import * as semver from 'semver';\n// import { CliError } from './cli-error';\n\n// required minimal version of Prisma\nexport const requiredPrismaVersion = '4.0.0';\n\nexport const initAction = async (\n projectPath: string,\n options: {\n packageManager: PackageManagers | undefined;\n }\n): Promise<void> => {\n await telemetry.trackSpan(\n 'cli:command:start',\n 'cli:command:complete',\n 'cli:command:error',\n { command: 'init' },\n () => initProject(projectPath, options.packageManager)\n );\n};\n\nexport const generateAction = async (options: {\n schema: string;\n packageManager: PackageManagers | undefined;\n}): Promise<void> => {\n checkRequiredPackage('prisma', requiredPrismaVersion);\n checkRequiredPackage('@prisma/client', requiredPrismaVersion);\n await telemetry.trackSpan(\n 'cli:command:start',\n 'cli:command:complete',\n 'cli:command:error',\n { command: 'generate' },\n () => runPlugins(options)\n );\n};\n\nconst checkRequiredPackage = (packageName: string, minVersion?: string) => {\n // let packageVersion: string;\n // try {\n // // eslint-disable-next-line @typescript-eslint/no-var-requires\n // packageVersion = require(`${packageName}/package.json`).version;\n // } catch (error) {\n // console.error(colors.red(`${packageName} not found, please install it`));\n // throw new CliError(`${packageName} not found`);\n // }\n // if (minVersion && semver.lt(packageVersion, minVersion)) {\n // console.error(\n // colors.red(\n // `${packageName} needs to be above ${minVersion}, the installed version is ${packageVersion}, please upgrade it`\n // )\n // );\n // throw new CliError(`${packageName} version is too low`);\n // }\n};\n\nexport default async function (): Promise<void> {\n await telemetry.trackSpan('cli:start', 'cli:complete', 'cli:error', { args: process.argv }, async () => {\n const program = new Command('zenstack');\n\n program.version(\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n require('../../package.json').version,\n '-v --version',\n 'display CLI version'\n );\n\n const schemaExtensions = ZModelLanguageMetaData.fileExtensions.join(', ');\n\n program\n .description(\n `${colors.bold.blue(\n 'ζ'\n )} ZenStack is a toolkit for building secure CRUD apps with Next.js + Typescript.\\n\\nDocumentation: https://zenstack.dev.`\n )\n .showHelpAfterError()\n .showSuggestionAfterError();\n\n const schemaOption = new Option('--schema <file>', `schema file (with extension ${schemaExtensions})`).default(\n './schema.zmodel'\n );\n\n const pmOption = new Option('-p, --package-manager <pm>', 'package manager to use').choices([\n 'npm',\n 'yarn',\n 'pnpm',\n ]);\n\n //#region wraps Prisma commands\n\n program\n .command('init')\n .description('Set up a new ZenStack project.')\n .addOption(pmOption)\n .argument('[path]', 'project path', '.')\n .action(initAction);\n\n program\n .command('generate')\n .description('Generates RESTful API and Typescript client for your data model.')\n .addOption(schemaOption)\n .addOption(pmOption)\n .action(generateAction);\n\n //#endregion\n\n // handle errors explicitly to ensure telemetry\n program.exitOverride();\n\n await program.parseAsync(process.argv);\n });\n}\n"],"mappings":";;;;;;;AACA;AACA;AACA;AACA;AAEA;AAAqD;AANrD;;AAOA;AACA;;AAEA;AACO,MAAMA,qBAAqB,GAAG,OAAO;AAAC;AAEtC,MAAMC,UAAU,GAAG,OACtBC,WAAmB,EACnBC,OAEC,KACe;EAChB,MAAMC,kBAAS,CAACC,SAAS,CACrB,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB;IAAEC,OAAO,EAAE;EAAO,CAAC,EACnB,MAAM,IAAAC,oBAAW,EAACL,WAAW,EAAEC,OAAO,CAACK,cAAc,CAAC,CACzD;AACL,CAAC;AAAC;AAEK,MAAMC,cAAc,GAAG,MAAON,OAGpC,IAAoB;EACjBO,oBAAoB,CAAC,QAAQ,EAAEV,qBAAqB,CAAC;EACrDU,oBAAoB,CAAC,gBAAgB,EAAEV,qBAAqB,CAAC;EAC7D,MAAMI,kBAAS,CAACC,SAAS,CACrB,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB;IAAEC,OAAO,EAAE;EAAW,CAAC,EACvB,MAAM,IAAAK,mBAAU,EAACR,OAAO,CAAC,CAC5B;AACL,CAAC;AAAC;AAEF,MAAMO,oBAAoB,GAAG,CAACE,WAAmB,EAAEC,UAAmB,KAAK;EACvE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA,CACH;AAEc,0BAAiC;EAC5C,MAAMT,kBAAS,CAACC,SAAS,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE;IAAES,IAAI,EAAEC,OAAO,CAACC;EAAK,CAAC,EAAE,YAAY;IACpG,MAAMC,OAAO,GAAG,IAAIC,kBAAO,CAAC,UAAU,CAAC;IAEvCD,OAAO,CAACE,OAAO;IACX;IACAC,OAAO,CAAC,oBAAoB,CAAC,CAACD,OAAO,EACrC,cAAc,EACd,qBAAqB,CACxB;IAED,MAAME,gBAAgB,GAAGC,8BAAsB,CAACC,cAAc,CAACC,IAAI,CAAC,IAAI,CAAC;IAEzEP,OAAO,CACFQ,WAAW,CACP,GAAEC,eAAM,CAACC,IAAI,CAACC,IAAI,CACf,GAAG,CACL,yHAAwH,CAC7H,CACAC,kBAAkB,EAAE,CACpBC,wBAAwB,EAAE;IAE/B,MAAMC,YAAY,GAAG,IAAIC,iBAAM,CAAC,iBAAiB,EAAG,+BAA8BX,gBAAiB,GAAE,CAAC,CAACY,OAAO,CAC1G,iBAAiB,CACpB;IAED,MAAMC,QAAQ,GAAG,IAAIF,iBAAM,CAAC,4BAA4B,EAAE,wBAAwB,CAAC,CAACG,OAAO,CAAC,CACxF,KAAK,EACL,MAAM,EACN,MAAM,CACT,CAAC;;IAEF;;IAEAlB,OAAO,CACFX,OAAO,CAAC,MAAM,CAAC,CACfmB,WAAW,CAAC,gCAAgC,CAAC,CAC7CW,SAAS,CAACF,QAAQ,CAAC,CACnBG,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,CAAC,CACvCC,MAAM,CAACrC,UAAU,CAAC;IAEvBgB,OAAO,CACFX,OAAO,CAAC,UAAU,CAAC,CACnBmB,WAAW,CAAC,kEAAkE,CAAC,CAC/EW,SAAS,CAACL,YAAY,CAAC,CACvBK,SAAS,CAACF,QAAQ,CAAC,CACnBI,MAAM,CAAC7B,cAAc,CAAC;;IAE3B;;IAEA;IACAQ,OAAO,CAACsB,YAAY,EAAE;IAEtB,MAAMtB,OAAO,CAACuB,UAAU,CAACzB,OAAO,CAACC,IAAI,CAAC;EAC1C,CAAC,CAAC;AACN"}
1
+ {"version":3,"file":"index.js","names":["requiredPrismaVersion","initAction","projectPath","options","telemetry","trackSpan","command","initProject","packageManager","generateAction","checkRequiredPackage","runPlugins","packageName","minVersion","args","process","argv","program","Command","version","require","schemaExtensions","ZModelLanguageMetaData","fileExtensions","join","description","colors","bold","blue","showHelpAfterError","showSuggestionAfterError","schemaOption","Option","default","pmOption","choices","addOption","argument","action","exitOverride","parseAsync"],"sources":["../../src/cli/index.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { ZModelLanguageMetaData } from '@zenstackhq/language/module';\nimport colors from 'colors';\nimport { Command, Option } from 'commander';\nimport telemetry from '../telemetry';\nimport { PackageManagers } from '../utils/pkg-utils';\nimport { initProject, runPlugins } from './cli-util';\n// import * as semver from 'semver';\n// import { CliError } from './cli-error';\n\n// required minimal version of Prisma\nexport const requiredPrismaVersion = '4.0.0';\n\nexport const initAction = async (\n projectPath: string,\n options: {\n packageManager: PackageManagers | undefined;\n }\n): Promise<void> => {\n await telemetry.trackSpan(\n 'cli:command:start',\n 'cli:command:complete',\n 'cli:command:error',\n { command: 'init' },\n () => initProject(projectPath, options.packageManager)\n );\n};\n\nexport const generateAction = async (options: {\n schema: string;\n packageManager: PackageManagers | undefined;\n}): Promise<void> => {\n checkRequiredPackage('prisma', requiredPrismaVersion);\n checkRequiredPackage('@prisma/client', requiredPrismaVersion);\n await telemetry.trackSpan(\n 'cli:command:start',\n 'cli:command:complete',\n 'cli:command:error',\n { command: 'generate' },\n () => runPlugins(options)\n );\n};\n\nconst checkRequiredPackage = (packageName: string, minVersion?: string) => {\n // let packageVersion: string;\n // try {\n // // eslint-disable-next-line @typescript-eslint/no-var-requires\n // packageVersion = require(`${packageName}/package.json`).version;\n // } catch (error) {\n // console.error(colors.red(`${packageName} not found, please install it`));\n // throw new CliError(`${packageName} not found`);\n // }\n // if (minVersion && semver.lt(packageVersion, minVersion)) {\n // console.error(\n // colors.red(\n // `${packageName} needs to be above ${minVersion}, the installed version is ${packageVersion}, please upgrade it`\n // )\n // );\n // throw new CliError(`${packageName} version is too low`);\n // }\n};\n\nexport default async function (): Promise<void> {\n await telemetry.trackSpan('cli:start', 'cli:complete', 'cli:error', { args: process.argv }, async () => {\n const program = new Command('zenstack');\n\n program.version(\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n require('../package.json').version,\n '-v --version',\n 'display CLI version'\n );\n\n const schemaExtensions = ZModelLanguageMetaData.fileExtensions.join(', ');\n\n program\n .description(\n `${colors.bold.blue(\n 'ζ'\n )} ZenStack is a toolkit for building secure CRUD apps with Next.js + Typescript.\\n\\nDocumentation: https://zenstack.dev.`\n )\n .showHelpAfterError()\n .showSuggestionAfterError();\n\n const schemaOption = new Option('--schema <file>', `schema file (with extension ${schemaExtensions})`).default(\n './schema.zmodel'\n );\n\n const pmOption = new Option('-p, --package-manager <pm>', 'package manager to use').choices([\n 'npm',\n 'yarn',\n 'pnpm',\n ]);\n\n //#region wraps Prisma commands\n\n program\n .command('init')\n .description('Set up a new ZenStack project.')\n .addOption(pmOption)\n .argument('[path]', 'project path', '.')\n .action(initAction);\n\n program\n .command('generate')\n .description('Generates RESTful API and Typescript client for your data model.')\n .addOption(schemaOption)\n .addOption(pmOption)\n .action(generateAction);\n\n //#endregion\n\n // handle errors explicitly to ensure telemetry\n program.exitOverride();\n\n await program.parseAsync(process.argv);\n });\n}\n"],"mappings":";;;;;;;AACA;AACA;AACA;AACA;AAEA;AAAqD;AANrD;;AAOA;AACA;;AAEA;AACO,MAAMA,qBAAqB,GAAG,OAAO;AAAC;AAEtC,MAAMC,UAAU,GAAG,OACtBC,WAAmB,EACnBC,OAEC,KACe;EAChB,MAAMC,kBAAS,CAACC,SAAS,CACrB,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB;IAAEC,OAAO,EAAE;EAAO,CAAC,EACnB,MAAM,IAAAC,oBAAW,EAACL,WAAW,EAAEC,OAAO,CAACK,cAAc,CAAC,CACzD;AACL,CAAC;AAAC;AAEK,MAAMC,cAAc,GAAG,MAAON,OAGpC,IAAoB;EACjBO,oBAAoB,CAAC,QAAQ,EAAEV,qBAAqB,CAAC;EACrDU,oBAAoB,CAAC,gBAAgB,EAAEV,qBAAqB,CAAC;EAC7D,MAAMI,kBAAS,CAACC,SAAS,CACrB,mBAAmB,EACnB,sBAAsB,EACtB,mBAAmB,EACnB;IAAEC,OAAO,EAAE;EAAW,CAAC,EACvB,MAAM,IAAAK,mBAAU,EAACR,OAAO,CAAC,CAC5B;AACL,CAAC;AAAC;AAEF,MAAMO,oBAAoB,GAAG,CAACE,WAAmB,EAAEC,UAAmB,KAAK;EACvE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAAA,CACH;AAEc,0BAAiC;EAC5C,MAAMT,kBAAS,CAACC,SAAS,CAAC,WAAW,EAAE,cAAc,EAAE,WAAW,EAAE;IAAES,IAAI,EAAEC,OAAO,CAACC;EAAK,CAAC,EAAE,YAAY;IACpG,MAAMC,OAAO,GAAG,IAAIC,kBAAO,CAAC,UAAU,CAAC;IAEvCD,OAAO,CAACE,OAAO;IACX;IACAC,OAAO,CAAC,iBAAiB,CAAC,CAACD,OAAO,EAClC,cAAc,EACd,qBAAqB,CACxB;IAED,MAAME,gBAAgB,GAAGC,8BAAsB,CAACC,cAAc,CAACC,IAAI,CAAC,IAAI,CAAC;IAEzEP,OAAO,CACFQ,WAAW,CACP,GAAEC,eAAM,CAACC,IAAI,CAACC,IAAI,CACf,GAAG,CACL,yHAAwH,CAC7H,CACAC,kBAAkB,EAAE,CACpBC,wBAAwB,EAAE;IAE/B,MAAMC,YAAY,GAAG,IAAIC,iBAAM,CAAC,iBAAiB,EAAG,+BAA8BX,gBAAiB,GAAE,CAAC,CAACY,OAAO,CAC1G,iBAAiB,CACpB;IAED,MAAMC,QAAQ,GAAG,IAAIF,iBAAM,CAAC,4BAA4B,EAAE,wBAAwB,CAAC,CAACG,OAAO,CAAC,CACxF,KAAK,EACL,MAAM,EACN,MAAM,CACT,CAAC;;IAEF;;IAEAlB,OAAO,CACFX,OAAO,CAAC,MAAM,CAAC,CACfmB,WAAW,CAAC,gCAAgC,CAAC,CAC7CW,SAAS,CAACF,QAAQ,CAAC,CACnBG,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,CAAC,CACvCC,MAAM,CAACrC,UAAU,CAAC;IAEvBgB,OAAO,CACFX,OAAO,CAAC,UAAU,CAAC,CACnBmB,WAAW,CAAC,kEAAkE,CAAC,CAC/EW,SAAS,CAACL,YAAY,CAAC,CACvBK,SAAS,CAACF,QAAQ,CAAC,CACnBI,MAAM,CAAC7B,cAAc,CAAC;;IAE3B;;IAEA;IACAQ,OAAO,CAACsB,YAAY,EAAE;IAEtB,MAAMtB,OAAO,CAACuB,UAAU,CAACzB,OAAO,CAACC,IAAI,CAAC;EAC1C,CAAC,CAAC;AACN"}
@@ -24,7 +24,7 @@ class PluginRunner {
24
24
  * Runs a series of nested generators
25
25
  */
26
26
  async run(context) {
27
- const version = require('../../package.json').version;
27
+ const version = require('../package.json').version;
28
28
  console.log(_colors.default.bold(`⌛️ ZenStack CLI v${version}, running plugins`));
29
29
  const plugins = [];
30
30
  const pluginDecls = context.schema.declarations.filter(d => (0, _ast.isPlugin)(d));
@@ -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","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","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 {\n console.error(`Unable to load plugin module ${pluginProvider}: ${pluginModulePath}`);\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 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 }\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","fields","forEach","f","value","getLiteral","getLiteralArray","CliError","name","pluginModulePath","getPluginModulePath","pluginModule","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","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 {\n console.error(`Unable to load plugin module ${pluginProvider}: ${pluginModulePath}`);\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 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 }\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": "0.6.0-pre.12",
6
+ "version": "0.6.0-pre.13",
7
7
  "author": {
8
8
  "name": "ZenStack Team"
9
9
  },
@@ -91,8 +91,8 @@
91
91
  "vscode-uri": "^3.0.6",
92
92
  "zod": "^3.19.1",
93
93
  "@zenstackhq/language": "0.6.0-pre.12",
94
- "@zenstackhq/sdk": "0.6.0-pre.12",
95
- "@zenstackhq/runtime": "0.6.0-pre.12"
94
+ "@zenstackhq/runtime": "0.6.0-pre.13",
95
+ "@zenstackhq/sdk": "0.6.0-pre.12"
96
96
  },
97
97
  "devDependencies": {
98
98
  "@babel/cli": "^7.19.3",
package/telemetry.js CHANGED
@@ -24,7 +24,7 @@ class Telemetry {
24
24
  trackingToken = process && process.env && process.env.TELEMETRY_TRACKING_TOKEN || "74944eb779d7d3b4ce185be843fde9fc";
25
25
  _os = os.platform();
26
26
  // eslint-disable-next-line @typescript-eslint/no-var-requires
27
- version = require('../package.json').version;
27
+ version = require('./package.json').version;
28
28
  exitWait = 200;
29
29
  constructor() {
30
30
  if ((process && process.env && process.env.DO_NOT_TRACK || "1") !== '1' && this.trackingToken) {
package/telemetry.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"telemetry.js","names":["Telemetry","hostId","machineIdSync","sessionid","cuid","trackingToken","_os","os","platform","version","require","exitWait","constructor","mixpanel","init","geolocate","exitHook","callback","sleep","errorHandler","err","track","message","stack","CliError","CommanderError","console","error","process","exit","unhandledRejectionHandler","uncaughtExceptionHandler","event","properties","payload","distinct_id","session","time","Date","$os","nodeVersion","trackSpan","startEvent","completeEvent","errorEvent","action","start","now","success","Promise","resolve","duration"],"sources":["../src/telemetry.ts"],"sourcesContent":["import { Mixpanel, init } from 'mixpanel';\nimport { machineIdSync } from 'node-machine-id';\nimport cuid from 'cuid';\nimport * as os from 'os';\nimport sleep from 'sleep-promise';\nimport exitHook from 'async-exit-hook';\nimport { CliError } from './cli/cli-error';\nimport { CommanderError } from 'commander';\n\n/**\n * Telemetry events\n */\nexport type TelemetryEvents =\n | 'cli:start'\n | 'cli:complete'\n | 'cli:error'\n | 'cli:command:start'\n | 'cli:command:complete'\n | 'cli:command:error'\n | 'cli:plugin:start'\n | 'cli:plugin:complete'\n | 'cli:plugin:error';\n\n/**\n * Utility class for sending telemetry\n */\nexport class Telemetry {\n private readonly mixpanel: Mixpanel | undefined;\n private readonly hostId = machineIdSync();\n private readonly sessionid = cuid();\n private readonly trackingToken = process.env.TELEMETRY_TRACKING_TOKEN;\n private readonly _os = os.platform();\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n private readonly version = require('../package.json').version;\n private exitWait = 200;\n\n constructor() {\n if (process.env.DO_NOT_TRACK !== '1' && this.trackingToken) {\n this.mixpanel = init(this.trackingToken, {\n geolocate: true,\n });\n }\n\n exitHook(async (callback) => {\n if (this.mixpanel) {\n // a small delay to ensure telemetry is sent\n await sleep(this.exitWait);\n }\n callback();\n });\n\n const errorHandler = async (err: Error) => {\n this.track('cli:error', {\n message: err.message,\n stack: err.stack,\n });\n if (this.mixpanel) {\n // a small delay to ensure telemetry is sent\n await sleep(this.exitWait);\n }\n\n if (err instanceof CliError || err instanceof CommanderError) {\n // error already logged\n } else {\n console.error('\\nAn unexpected error occurred:\\n', err);\n }\n\n process.exit(1);\n };\n\n exitHook.unhandledRejectionHandler(errorHandler);\n exitHook.uncaughtExceptionHandler(errorHandler);\n }\n\n track(event: TelemetryEvents, properties: Record<string, unknown> = {}) {\n if (this.mixpanel) {\n const payload = {\n distinct_id: this.hostId,\n session: this.sessionid,\n time: new Date(),\n $os: this._os,\n nodeVersion: process.version,\n version: this.version,\n ...properties,\n };\n this.mixpanel.track(event, payload);\n }\n }\n\n async trackSpan(\n startEvent: TelemetryEvents,\n completeEvent: TelemetryEvents,\n errorEvent: TelemetryEvents,\n properties: Record<string, unknown>,\n action: () => Promise<unknown> | void\n ) {\n this.track(startEvent, properties);\n const start = Date.now();\n let success = true;\n try {\n await Promise.resolve(action());\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (err: any) {\n this.track(errorEvent, {\n message: err.message,\n stack: err.stack,\n ...properties,\n });\n success = false;\n throw err;\n } finally {\n this.track(completeEvent, {\n duration: Date.now() - start,\n success,\n ...properties,\n });\n }\n }\n}\n\nexport default new Telemetry();\n"],"mappings":"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"}
1
+ {"version":3,"file":"telemetry.js","names":["Telemetry","hostId","machineIdSync","sessionid","cuid","trackingToken","_os","os","platform","version","require","exitWait","constructor","mixpanel","init","geolocate","exitHook","callback","sleep","errorHandler","err","track","message","stack","CliError","CommanderError","console","error","process","exit","unhandledRejectionHandler","uncaughtExceptionHandler","event","properties","payload","distinct_id","session","time","Date","$os","nodeVersion","trackSpan","startEvent","completeEvent","errorEvent","action","start","now","success","Promise","resolve","duration"],"sources":["../src/telemetry.ts"],"sourcesContent":["import { Mixpanel, init } from 'mixpanel';\nimport { machineIdSync } from 'node-machine-id';\nimport cuid from 'cuid';\nimport * as os from 'os';\nimport sleep from 'sleep-promise';\nimport exitHook from 'async-exit-hook';\nimport { CliError } from './cli/cli-error';\nimport { CommanderError } from 'commander';\n\n/**\n * Telemetry events\n */\nexport type TelemetryEvents =\n | 'cli:start'\n | 'cli:complete'\n | 'cli:error'\n | 'cli:command:start'\n | 'cli:command:complete'\n | 'cli:command:error'\n | 'cli:plugin:start'\n | 'cli:plugin:complete'\n | 'cli:plugin:error';\n\n/**\n * Utility class for sending telemetry\n */\nexport class Telemetry {\n private readonly mixpanel: Mixpanel | undefined;\n private readonly hostId = machineIdSync();\n private readonly sessionid = cuid();\n private readonly trackingToken = process.env.TELEMETRY_TRACKING_TOKEN;\n private readonly _os = os.platform();\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n private readonly version = require('./package.json').version;\n private exitWait = 200;\n\n constructor() {\n if (process.env.DO_NOT_TRACK !== '1' && this.trackingToken) {\n this.mixpanel = init(this.trackingToken, {\n geolocate: true,\n });\n }\n\n exitHook(async (callback) => {\n if (this.mixpanel) {\n // a small delay to ensure telemetry is sent\n await sleep(this.exitWait);\n }\n callback();\n });\n\n const errorHandler = async (err: Error) => {\n this.track('cli:error', {\n message: err.message,\n stack: err.stack,\n });\n if (this.mixpanel) {\n // a small delay to ensure telemetry is sent\n await sleep(this.exitWait);\n }\n\n if (err instanceof CliError || err instanceof CommanderError) {\n // error already logged\n } else {\n console.error('\\nAn unexpected error occurred:\\n', err);\n }\n\n process.exit(1);\n };\n\n exitHook.unhandledRejectionHandler(errorHandler);\n exitHook.uncaughtExceptionHandler(errorHandler);\n }\n\n track(event: TelemetryEvents, properties: Record<string, unknown> = {}) {\n if (this.mixpanel) {\n const payload = {\n distinct_id: this.hostId,\n session: this.sessionid,\n time: new Date(),\n $os: this._os,\n nodeVersion: process.version,\n version: this.version,\n ...properties,\n };\n this.mixpanel.track(event, payload);\n }\n }\n\n async trackSpan(\n startEvent: TelemetryEvents,\n completeEvent: TelemetryEvents,\n errorEvent: TelemetryEvents,\n properties: Record<string, unknown>,\n action: () => Promise<unknown> | void\n ) {\n this.track(startEvent, properties);\n const start = Date.now();\n let success = true;\n try {\n await Promise.resolve(action());\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (err: any) {\n this.track(errorEvent, {\n message: err.message,\n stack: err.stack,\n ...properties,\n });\n success = false;\n throw err;\n } finally {\n this.track(completeEvent, {\n duration: Date.now() - start,\n success,\n ...properties,\n });\n }\n }\n}\n\nexport default new Telemetry();\n"],"mappings":"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"}