zenstack 0.6.0-pre.17 → 0.6.0-pre.19

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.d.ts CHANGED
@@ -4,7 +4,7 @@ import { PackageManagers } from '../utils/pkg-utils';
4
4
  /**
5
5
  * Initializes an existing project for ZenStack
6
6
  */
7
- export declare function initProject(projectPath: string, packageManager: PackageManagers | undefined): Promise<void>;
7
+ export declare function initProject(projectPath: string, prismaSchema: string | undefined, packageManager: PackageManagers | undefined, tag: string): Promise<void>;
8
8
  /**
9
9
  * Loads a zmodel document from a file.
10
10
  * @param fileName File name
package/cli/cli-util.js CHANGED
@@ -21,91 +21,47 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
21
21
  /**
22
22
  * Initializes an existing project for ZenStack
23
23
  */
24
- async function initProject(projectPath, packageManager) {
24
+ async function initProject(projectPath, prismaSchema, packageManager, tag) {
25
25
  if (!_fs.default.existsSync(projectPath)) {
26
26
  console.error(`Path does not exist: ${projectPath}`);
27
27
  throw new _cliError.CliError('project path does not exist');
28
28
  }
29
- const schema = _path.default.join(projectPath, 'zenstack', 'schema.zmodel');
30
- let schemaGenerated = false;
31
- if (_fs.default.existsSync(schema)) {
32
- console.warn(_colors.default.yellow(`Model already exists: ${schema}`));
33
- } else {
34
- // create a default model
35
- if (!_fs.default.existsSync(_path.default.join(projectPath, 'zenstack'))) {
36
- _fs.default.mkdirSync(_path.default.join(projectPath, 'zenstack'));
37
- }
38
- _fs.default.writeFileSync(schema, `// This is a sample model to get you started.
39
- // Learn how to model you app: https://zenstack.dev/#/modeling-your-app.
40
-
41
- /*
42
- * A sample data source using local sqlite db.
43
- * See how to use a different db: https://zenstack.dev/#/zmodel-data-source.
44
- */
45
- datasource db {
46
- provider = 'sqlite'
47
- url = 'file:./todo.db'
48
- }
49
-
50
- /*
51
- * User model
52
- */
53
- model User {
54
- id String @id @default(cuid())
55
- email String @unique @email
56
- password String @password @omit @length(8, 16)
57
- posts Post[]
58
-
59
- // everybody can signup
60
- @@allow('create', true)
61
-
62
- // full access by self
63
- @@allow('all', auth() == this)
64
- }
65
-
66
- /*
67
- * Post model
68
- */
69
- model Post {
70
- id String @id @default(cuid())
71
- createdAt DateTime @default(now())
72
- updatedAt DateTime @updatedAt
73
- title String @length(1, 256)
74
- content String
75
- published Boolean @default(false)
76
- author User? @relation(fields: [authorId], references: [id])
77
- authorId String?
78
-
79
- // allow read for all signin users
80
- @@allow('read', auth() != null && published)
81
-
82
- // full access by author
83
- @@allow('all', author == auth())
84
- }
85
- `);
86
-
87
- // add zenstack/schema.prisma to .gitignore
88
- const gitIgnorePath = _path.default.join(projectPath, '.gitignore');
89
- let gitIgnoreContent = '';
90
- if (_fs.default.existsSync(gitIgnorePath)) {
91
- gitIgnoreContent = _fs.default.readFileSync(gitIgnorePath, {
92
- encoding: 'utf-8'
93
- }) + '\n';
29
+ const defaultPrismaSchemaLocation = './prisma/schema.prisma';
30
+ if (prismaSchema) {
31
+ if (!_fs.default.existsSync(prismaSchema)) {
32
+ console.error(`Prisma schema file does not exist: ${prismaSchema}`);
33
+ throw new _cliError.CliError('prisma schema does not exist');
94
34
  }
95
- if (!gitIgnoreContent.includes('zenstack/schema.prisma')) {
96
- gitIgnoreContent += 'zenstack/schema.prisma\n';
97
- _fs.default.writeFileSync(gitIgnorePath, gitIgnoreContent);
35
+ } else if (_fs.default.existsSync(defaultPrismaSchemaLocation)) {
36
+ prismaSchema = defaultPrismaSchemaLocation;
37
+ }
38
+ const zmodelFile = _path.default.join(projectPath, './schema.zmodel');
39
+ let sampleModelGenerated = false;
40
+ if (_fs.default.existsSync(zmodelFile)) {
41
+ console.warn(`ZenStack model already exists at ${zmodelFile}, not generating a new one.`);
42
+ } else {
43
+ if (prismaSchema) {
44
+ // copy over schema.prisma
45
+ _fs.default.copyFileSync(prismaSchema, zmodelFile);
46
+ } else {
47
+ // create a new model
48
+ const starterContent = _fs.default.readFileSync(_path.default.join(__dirname, '../res/starter.zmodel'), 'utf-8');
49
+ _fs.default.writeFileSync(zmodelFile, starterContent);
50
+ sampleModelGenerated = true;
98
51
  }
99
- schemaGenerated = true;
100
52
  }
101
- (0, _pkgUtils.installPackage)('zenstack', true, packageManager, projectPath);
102
- (0, _pkgUtils.installPackage)('@zenstackhq/runtime', false, packageManager, projectPath);
103
- if (schemaGenerated) {
104
- console.log(`Sample model generated at: ${_colors.default.blue(schema)}
53
+ (0, _pkgUtils.installPackage)('zenstack', true, packageManager, tag, projectPath);
54
+ (0, _pkgUtils.installPackage)('@zenstackhq/runtime', false, packageManager, tag, projectPath);
55
+ if (sampleModelGenerated) {
56
+ console.log(`Sample model generated at: ${_colors.default.blue(zmodelFile)}
105
57
 
106
- Please check the following guide on how to model your app:
107
- https://zenstack.dev/#/modeling-your-app.
58
+ Please check the following guide on how to model your app:
59
+ https://zenstack.dev/#/modeling-your-app.
108
60
  `);
61
+ } else {
62
+ console.log(`Your current Prisma schema "${prismaSchema}" has been copied to "${zmodelFile}".
63
+ Moving forward please edit this file and run "zenstack generate" to regenerate Prisma schema.
64
+ `);
109
65
  }
110
66
  console.log(_colors.default.green('\nProject initialized successfully!'));
111
67
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cli-util.js","names":["initProject","projectPath","packageManager","fs","existsSync","console","error","CliError","schema","path","join","schemaGenerated","warn","colors","yellow","mkdirSync","writeFileSync","gitIgnorePath","gitIgnoreContent","readFileSync","encoding","includes","installPackage","log","blue","green","loadDocument","fileName","services","extensions","LanguageMetaData","fileExtensions","extname","red","stdLib","shared","workspace","LangiumDocuments","getOrCreateDocument","URI","file","resolve","__dirname","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","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(projectPath: string, packageManager: PackageManagers | undefined) {\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 schema = path.join(projectPath, 'zenstack', 'schema.zmodel');\n let schemaGenerated = false;\n\n if (fs.existsSync(schema)) {\n console.warn(colors.yellow(`Model already exists: ${schema}`));\n } else {\n // create a default model\n if (!fs.existsSync(path.join(projectPath, 'zenstack'))) {\n fs.mkdirSync(path.join(projectPath, 'zenstack'));\n }\n\n fs.writeFileSync(\n schema,\n `// This is a sample model to get you started.\n// Learn how to model you app: https://zenstack.dev/#/modeling-your-app.\n\n/*\n * A sample data source using local sqlite db.\n * See how to use a different db: https://zenstack.dev/#/zmodel-data-source.\n */\ndatasource db {\n provider = 'sqlite'\n url = 'file:./todo.db'\n}\n\n/*\n * User model\n */\nmodel User {\n id String @id @default(cuid())\n email String @unique @email\n password String @password @omit @length(8, 16)\n posts Post[]\n\n // everybody can signup\n @@allow('create', true)\n\n // full access by self\n @@allow('all', auth() == this)\n}\n\n/*\n * Post model\n */\nmodel Post {\n id String @id @default(cuid())\n createdAt DateTime @default(now())\n updatedAt DateTime @updatedAt\n title String @length(1, 256)\n content String\n published Boolean @default(false)\n author User? @relation(fields: [authorId], references: [id])\n authorId String?\n\n // allow read for all signin users\n @@allow('read', auth() != null && published)\n\n // full access by author\n @@allow('all', author == auth())\n}\n`\n );\n\n // add zenstack/schema.prisma to .gitignore\n const gitIgnorePath = path.join(projectPath, '.gitignore');\n let gitIgnoreContent = '';\n if (fs.existsSync(gitIgnorePath)) {\n gitIgnoreContent = fs.readFileSync(gitIgnorePath, { encoding: 'utf-8' }) + '\\n';\n }\n\n if (!gitIgnoreContent.includes('zenstack/schema.prisma')) {\n gitIgnoreContent += 'zenstack/schema.prisma\\n';\n fs.writeFileSync(gitIgnorePath, gitIgnoreContent);\n }\n\n schemaGenerated = true;\n }\n\n installPackage('zenstack', true, packageManager, projectPath);\n installPackage('@zenstackhq/runtime', false, packageManager, projectPath);\n\n if (schemaGenerated) {\n console.log(`Sample model generated at: ${colors.blue(schema)}\n\n Please check the following guide on how to model your app:\n https://zenstack.dev/#/modeling-your-app.\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","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 `);\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\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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"}
package/cli/index.d.ts CHANGED
@@ -1,10 +1,14 @@
1
+ import { Command } from 'commander';
1
2
  import { PackageManagers } from '../utils/pkg-utils';
2
3
  export declare const requiredPrismaVersion = "4.0.0";
3
4
  export declare const initAction: (projectPath: string, options: {
5
+ prisma: string | undefined;
4
6
  packageManager: PackageManagers | undefined;
7
+ tag: string;
5
8
  }) => Promise<void>;
6
9
  export declare const generateAction: (options: {
7
10
  schema: string;
8
11
  packageManager: PackageManagers | undefined;
9
12
  }) => Promise<void>;
13
+ export declare function createProgram(): Command;
10
14
  export default function (): Promise<void>;
package/cli/index.js CHANGED
@@ -3,15 +3,17 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
+ exports.createProgram = createProgram;
6
7
  exports.default = _default;
7
8
  exports.requiredPrismaVersion = exports.initAction = exports.generateAction = void 0;
8
9
  var _module = require("@zenstackhq/language/module");
9
10
  var _colors = _interopRequireDefault(require("colors"));
10
11
  var _commander = require("commander");
11
- var _telemetry = _interopRequireDefault(require("../telemetry"));
12
- var _cliUtil = require("./cli-util");
13
12
  var semver = _interopRequireWildcard(require("semver"));
13
+ var _telemetry = _interopRequireDefault(require("../telemetry"));
14
+ var _versionUtils = require("../utils/version-utils");
14
15
  var _cliError = require("./cli-error");
16
+ var _cliUtil = require("./cli-util");
15
17
  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); }
16
18
  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; }
17
19
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -23,7 +25,7 @@ exports.requiredPrismaVersion = requiredPrismaVersion;
23
25
  const initAction = async (projectPath, options) => {
24
26
  await _telemetry.default.trackSpan('cli:command:start', 'cli:command:complete', 'cli:command:error', {
25
27
  command: 'init'
26
- }, () => (0, _cliUtil.initProject)(projectPath, options.packageManager));
28
+ }, () => (0, _cliUtil.initProject)(projectPath, options.prisma, options.packageManager, options.tag));
27
29
  };
28
30
  exports.initAction = initAction;
29
31
  const generateAction = async options => {
@@ -48,25 +50,22 @@ const checkRequiredPackage = (packageName, minVersion) => {
48
50
  throw new _cliError.CliError(`${packageName} version is too low`);
49
51
  }
50
52
  };
53
+ function createProgram() {
54
+ const program = new _commander.Command('zenstack');
55
+ program.version((0, _versionUtils.getVersion)(), '-v --version', 'display CLI version');
56
+ const schemaExtensions = _module.ZModelLanguageMetaData.fileExtensions.join(', ');
57
+ program.description(`${_colors.default.bold.blue('ζ')} ZenStack is a Prisma power pack for building full-stack apps.\n\nDocumentation: https://zenstack.dev.`).showHelpAfterError().showSuggestionAfterError();
58
+ const schemaOption = new _commander.Option('--schema <file>', `schema file (with extension ${schemaExtensions})`).default('./schema.zmodel');
59
+ const pmOption = new _commander.Option('-p, --package-manager <pm>', 'package manager to use').choices(['npm', 'yarn', 'pnpm']);
60
+ program.command('init').description('Initialize an existing project for ZenStack.').addOption(pmOption).addOption(new _commander.Option('--prisma <file>', 'location of Prisma schema file to bootstrap from')).addOption(new _commander.Option('--tag <tag>', 'the NPM package tag to use when installing dependencies').default('latest')).argument('[path]', 'project path', '.').action(initAction);
61
+ program.command('generate').description('Generates RESTful API and Typescript client for your data model.').addOption(schemaOption).addOption(pmOption).action(generateAction);
62
+ return program;
63
+ }
51
64
  async function _default() {
52
65
  await _telemetry.default.trackSpan('cli:start', 'cli:complete', 'cli:error', {
53
66
  args: process.argv
54
67
  }, async () => {
55
- const program = new _commander.Command('zenstack');
56
- program.version(
57
- // eslint-disable-next-line @typescript-eslint/no-var-requires
58
- require('../package.json').version, '-v --version', 'display CLI version');
59
- const schemaExtensions = _module.ZModelLanguageMetaData.fileExtensions.join(', ');
60
- 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();
61
- const schemaOption = new _commander.Option('--schema <file>', `schema file (with extension ${schemaExtensions})`).default('./schema.zmodel');
62
- const pmOption = new _commander.Option('-p, --package-manager <pm>', 'package manager to use').choices(['npm', 'yarn', 'pnpm']);
63
-
64
- //#region wraps Prisma commands
65
-
66
- program.command('init').description('Set up a new ZenStack project.').addOption(pmOption).argument('[path]', 'project path', '.').action(initAction);
67
- program.command('generate').description('Generates RESTful API and Typescript client for your data model.').addOption(schemaOption).addOption(pmOption).action(generateAction);
68
-
69
- //#endregion
68
+ const program = createProgram();
70
69
 
71
70
  // handle errors explicitly to ensure telemetry
72
71
  program.exitOverride();
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","packageVersion","require","version","error","console","colors","red","CliError","semver","lt","args","process","argv","program","Command","schemaExtensions","ZModelLanguageMetaData","fileExtensions","join","description","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';\nimport * as semver from 'semver';\nimport { 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\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":"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"}
1
+ {"version":3,"file":"index.js","names":["requiredPrismaVersion","initAction","projectPath","options","telemetry","trackSpan","command","initProject","prisma","packageManager","tag","generateAction","checkRequiredPackage","runPlugins","packageName","minVersion","packageVersion","require","version","error","console","colors","red","CliError","semver","lt","createProgram","program","Command","getVersion","schemaExtensions","ZModelLanguageMetaData","fileExtensions","join","description","bold","blue","showHelpAfterError","showSuggestionAfterError","schemaOption","Option","default","pmOption","choices","addOption","argument","action","args","process","argv","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 * as semver from 'semver';\nimport telemetry from '../telemetry';\nimport { PackageManagers } from '../utils/pkg-utils';\nimport { getVersion } from '../utils/version-utils';\nimport { CliError } from './cli-error';\nimport { initProject, runPlugins } from './cli-util';\n\n// required minimal version of Prisma\nexport const requiredPrismaVersion = '4.0.0';\n\nexport const initAction = async (\n projectPath: string,\n options: {\n prisma: string | undefined;\n packageManager: PackageManagers | undefined;\n tag: string;\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.prisma, options.packageManager, options.tag)\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\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 function createProgram() {\n const program = new Command('zenstack');\n\n program.version(getVersion(), '-v --version', 'display CLI version');\n\n const schemaExtensions = ZModelLanguageMetaData.fileExtensions.join(', ');\n\n program\n .description(\n `${colors.bold.blue(\n 'ζ'\n )} ZenStack is a Prisma power pack for building full-stack apps.\\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 program\n .command('init')\n .description('Initialize an existing project for ZenStack.')\n .addOption(pmOption)\n .addOption(new Option('--prisma <file>', 'location of Prisma schema file to bootstrap from'))\n .addOption(\n new Option('--tag <tag>', 'the NPM package tag to use when installing dependencies').default('latest')\n )\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 return program;\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 = createProgram();\n\n // handle errors explicitly to ensure telemetry\n program.exitOverride();\n\n await program.parseAsync(process.argv);\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.17",
6
+ "version": "0.6.0-pre.19",
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/runtime": "0.6.0-pre.17",
94
- "@zenstackhq/language": "0.6.0-pre.17",
95
- "@zenstackhq/sdk": "0.6.0-pre.17"
93
+ "@zenstackhq/language": "0.6.0-pre.19",
94
+ "@zenstackhq/runtime": "0.6.0-pre.19",
95
+ "@zenstackhq/sdk": "0.6.0-pre.19"
96
96
  },
97
97
  "devDependencies": {
98
98
  "@babel/cli": "^7.19.3",
@@ -41,12 +41,18 @@ export declare class Generator {
41
41
  }>);
42
42
  toString(): string;
43
43
  }
44
- export declare class Model {
44
+ export declare class DeclarationBase {
45
+ documentations: string[];
46
+ addComment(name: string): string;
47
+ toString(): string;
48
+ }
49
+ export declare class Model extends DeclarationBase {
45
50
  name: string;
51
+ documentations: string[];
46
52
  fields: ModelField[];
47
53
  attributes: ModelAttribute[];
48
- constructor(name: string);
49
- addField(name: string, type: ModelFieldType | string, attributes?: FieldAttribute[]): ModelField;
54
+ constructor(name: string, documentations?: string[]);
55
+ addField(name: string, type: ModelFieldType | string, attributes?: FieldAttribute[], documentations?: string[]): ModelField;
50
56
  addAttribute(name: string, args?: AttributeArg[]): ModelAttribute;
51
57
  toString(): string;
52
58
  }
@@ -58,11 +64,12 @@ export declare class ModelFieldType {
58
64
  constructor(type: ScalarTypes | string, array?: boolean | undefined, optional?: boolean | undefined);
59
65
  toString(): string;
60
66
  }
61
- export declare class ModelField {
67
+ export declare class ModelField extends DeclarationBase {
62
68
  name: string;
63
69
  type: ModelFieldType | string;
64
70
  attributes: FieldAttribute[];
65
- constructor(name: string, type: ModelFieldType | string, attributes?: FieldAttribute[]);
71
+ documentations: string[];
72
+ constructor(name: string, type: ModelFieldType | string, attributes?: FieldAttribute[], documentations?: string[]);
66
73
  addAttribute(name: string, args?: AttributeArg[]): FieldAttribute;
67
74
  toString(): string;
68
75
  }
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.PrismaModel = exports.ModelFieldType = exports.ModelField = exports.ModelAttribute = exports.Model = exports.Generator = exports.FunctionCallArg = exports.FunctionCall = exports.FieldReferenceArg = exports.FieldReference = exports.FieldAttribute = exports.Enum = exports.DataSourceUrl = exports.DataSource = exports.AttributeArgValue = exports.AttributeArg = void 0;
6
+ exports.PrismaModel = exports.ModelFieldType = exports.ModelField = exports.ModelAttribute = exports.Model = exports.Generator = exports.FunctionCallArg = exports.FunctionCall = exports.FieldReferenceArg = exports.FieldReference = exports.FieldAttribute = exports.Enum = exports.DeclarationBase = exports.DataSourceUrl = exports.DataSource = exports.AttributeArgValue = exports.AttributeArg = void 0;
7
7
  var _indentString = _interopRequireDefault(require("./indent-string"));
8
8
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
9
9
  /**
@@ -71,14 +71,27 @@ class Generator {
71
71
  }
72
72
  }
73
73
  exports.Generator = Generator;
74
- class Model {
74
+ class DeclarationBase {
75
+ documentations = [];
76
+ addComment(name) {
77
+ this.documentations.push(name);
78
+ return name;
79
+ }
80
+ toString() {
81
+ return this.documentations.map(x => `/// ${x}\n`).join('');
82
+ }
83
+ }
84
+ exports.DeclarationBase = DeclarationBase;
85
+ class Model extends DeclarationBase {
75
86
  fields = [];
76
87
  attributes = [];
77
- constructor(name) {
88
+ constructor(name, documentations = []) {
89
+ super();
78
90
  this.name = name;
91
+ this.documentations = documentations;
79
92
  }
80
- addField(name, type, attributes = []) {
81
- const field = new ModelField(name, type, attributes);
93
+ addField(name, type, attributes = [], documentations = []) {
94
+ const field = new ModelField(name, type, attributes, documentations);
82
95
  this.fields.push(field);
83
96
  return field;
84
97
  }
@@ -88,7 +101,7 @@ class Model {
88
101
  return attr;
89
102
  }
90
103
  toString() {
91
- return `model ${this.name} {\n` + (0, _indentString.default)([...this.fields, ...this.attributes].map(d => d.toString()).join('\n')) + `\n}`;
104
+ return super.toString() + `model ${this.name} {\n` + (0, _indentString.default)([...this.fields, ...this.attributes].map(d => d.toString()).join('\n')) + `\n}`;
92
105
  }
93
106
  }
94
107
  exports.Model = Model;
@@ -103,11 +116,13 @@ class ModelFieldType {
103
116
  }
104
117
  }
105
118
  exports.ModelFieldType = ModelFieldType;
106
- class ModelField {
107
- constructor(name, type, attributes = []) {
119
+ class ModelField extends DeclarationBase {
120
+ constructor(name, type, attributes = [], documentations = []) {
121
+ super();
108
122
  this.name = name;
109
123
  this.type = type;
110
124
  this.attributes = attributes;
125
+ this.documentations = documentations;
111
126
  }
112
127
  addAttribute(name, args = []) {
113
128
  const attr = new FieldAttribute(name, args);
@@ -115,7 +130,7 @@ class ModelField {
115
130
  return attr;
116
131
  }
117
132
  toString() {
118
- return `${this.name} ${this.type}` + (this.attributes.length > 0 ? ' ' + this.attributes.map(a => a.toString()).join(' ') : '');
133
+ return super.toString() + `${this.name} ${this.type}` + (this.attributes.length > 0 ? ' ' + this.attributes.map(a => a.toString()).join(' ') : '');
119
134
  }
120
135
  }
121
136
  exports.ModelField = ModelField;
@@ -1 +1 @@
1
- {"version":3,"file":"prisma-builder.js","names":["PrismaModel","datasources","generators","models","enums","addDataSource","name","provider","url","shadowDatabaseUrl","ds","DataSource","push","addGenerator","fields","generator","Generator","addModel","model","Model","addEnum","e","Enum","toString","map","d","join","constructor","indentString","DataSourceUrl","value","isEnv","f","JSON","stringify","attributes","addField","type","field","ModelField","addAttribute","args","attr","ModelAttribute","ModelFieldType","array","optional","FieldAttribute","length","a","AttributeArg","AttributeArgValue","Error","Array","isArray","FieldReference","FunctionCall","fr","r","v","FieldReferenceArg","func","FunctionCallArg"],"sources":["../../../src/plugins/prisma/prisma-builder.ts"],"sourcesContent":["import indentString from './indent-string';\n\n/**\n * Prisma schema builder\n */\nexport class PrismaModel {\n private datasources: DataSource[] = [];\n private generators: Generator[] = [];\n private models: Model[] = [];\n private enums: Enum[] = [];\n\n addDataSource(name: string, provider: string, url: DataSourceUrl, shadowDatabaseUrl?: DataSourceUrl): DataSource {\n const ds = new DataSource(name, provider, url, shadowDatabaseUrl);\n this.datasources.push(ds);\n return ds;\n }\n\n addGenerator(name: string, fields: Array<{ name: string; value: string | string[] }>): Generator {\n const generator = new Generator(name, fields);\n this.generators.push(generator);\n return generator;\n }\n\n addModel(name: string): Model {\n const model = new Model(name);\n this.models.push(model);\n return model;\n }\n\n addEnum(name: string, fields: string[]): Enum {\n const e = new Enum(name, fields);\n this.enums.push(e);\n return e;\n }\n\n toString(): string {\n return [...this.datasources, ...this.generators, ...this.enums, ...this.models]\n .map((d) => d.toString())\n .join('\\n\\n');\n }\n}\n\nexport class DataSource {\n constructor(\n public name: string,\n public provider: string,\n public url: DataSourceUrl,\n public shadowDatabaseUrl?: DataSourceUrl\n ) {}\n\n toString(): string {\n return (\n `datasource ${this.name} {\\n` +\n indentString(`provider=\"${this.provider}\"\\n`) +\n indentString(`url=${this.url}\\n`) +\n (this.shadowDatabaseUrl ? indentString(`shadowDatabaseurl=${this.shadowDatabaseUrl}\\n`) : '') +\n `}`\n );\n }\n}\n\nexport class DataSourceUrl {\n constructor(public value: string, public isEnv: boolean) {}\n\n toString(): string {\n return this.isEnv ? `env(\"${this.value}\")` : `\"${this.value}\"`;\n }\n}\n\nexport class Generator {\n constructor(public name: string, public fields: Array<{ name: string; value: string | string[] }>) {}\n\n toString(): string {\n return (\n `generator ${this.name} {\\n` +\n this.fields.map((f) => indentString(`${f.name} = ${JSON.stringify(f.value)}`)).join('\\n') +\n `\\n}`\n );\n }\n}\n\nexport class Model {\n public fields: ModelField[] = [];\n public attributes: ModelAttribute[] = [];\n constructor(public name: string) {}\n\n addField(name: string, type: ModelFieldType | string, attributes: FieldAttribute[] = []): ModelField {\n const field = new ModelField(name, type, attributes);\n this.fields.push(field);\n return field;\n }\n\n addAttribute(name: string, args: AttributeArg[] = []): ModelAttribute {\n const attr = new ModelAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n toString(): string {\n return (\n `model ${this.name} {\\n` +\n indentString([...this.fields, ...this.attributes].map((d) => d.toString()).join('\\n')) +\n `\\n}`\n );\n }\n}\n\nexport type ScalarTypes =\n | 'String'\n | 'Boolean'\n | 'Int'\n | 'BigInt'\n | 'Float'\n | 'Decimal'\n | 'DateTime'\n | 'Json'\n | 'Bytes'\n | 'Unsupported';\n\nexport class ModelFieldType {\n constructor(public type: ScalarTypes | string, public array?: boolean, public optional?: boolean) {}\n\n toString(): string {\n return `${this.type}${this.array ? '[]' : ''}${this.optional ? '?' : ''}`;\n }\n}\n\nexport class ModelField {\n constructor(public name: string, public type: ModelFieldType | string, public attributes: FieldAttribute[] = []) {}\n\n addAttribute(name: string, args: AttributeArg[] = []): FieldAttribute {\n const attr = new FieldAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n toString(): string {\n return (\n `${this.name} ${this.type}` +\n (this.attributes.length > 0 ? ' ' + this.attributes.map((a) => a.toString()).join(' ') : '')\n );\n }\n}\n\nexport class FieldAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class ModelAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class AttributeArg {\n constructor(public name: string | undefined, public value: AttributeArgValue) {}\n\n toString(): string {\n return this.name ? `${this.name}: ${this.value}` : this.value.toString();\n }\n}\n\nexport class AttributeArgValue {\n constructor(\n public type: 'String' | 'FieldReference' | 'Number' | 'Boolean' | 'Array' | 'FunctionCall',\n public value: string | number | boolean | FieldReference | FunctionCall | AttributeArgValue[]\n ) {\n switch (type) {\n case 'String':\n if (typeof value !== 'string') throw new Error('Value must be string');\n break;\n case 'Number':\n if (typeof value !== 'number') throw new Error('Value must be number');\n break;\n case 'Boolean':\n if (typeof value !== 'boolean') throw new Error('Value must be boolean');\n break;\n case 'Array':\n if (!Array.isArray(value)) throw new Error('Value must be array');\n break;\n case 'FieldReference':\n if (typeof value !== 'string' && !(value instanceof FieldReference))\n throw new Error('Value must be string or FieldReference');\n break;\n case 'FunctionCall':\n if (!(value instanceof FunctionCall)) throw new Error('Value must be FunctionCall');\n break;\n }\n }\n\n toString(): string {\n switch (this.type) {\n case 'String':\n return `\"${this.value}\"`;\n case 'Number':\n return this.value.toString();\n case 'FieldReference': {\n if (typeof this.value === 'string') {\n return this.value;\n } else {\n const fr = this.value as FieldReference;\n let r = fr.field;\n if (fr.args.length > 0) {\n r += '(' + fr.args.map((a) => a.toString()).join(',') + ')';\n }\n return r;\n }\n }\n case 'FunctionCall':\n return this.value.toString();\n case 'Boolean':\n return this.value ? 'true' : 'false';\n case 'Array':\n return '[' + (this.value as AttributeArgValue[]).map((v) => v.toString()).join(', ') + ']';\n default:\n throw new Error(`Unknown attribute value type ${this.type}`);\n }\n }\n}\n\nexport class FieldReference {\n constructor(public field: string, public args: FieldReferenceArg[] = []) {}\n}\n\nexport class FieldReferenceArg {\n constructor(public name: 'sort', public value: 'Asc' | 'Desc') {}\n\n toString(): string {\n return `${this.name}: ${this.value}`;\n }\n}\n\nexport class FunctionCall {\n constructor(public func: string, public args: FunctionCallArg[] = []) {}\n\n toString(): string {\n return `${this.func}` + '(' + this.args.map((a) => a.toString()).join(', ') + ')';\n }\n}\n\nexport class FunctionCallArg {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\n constructor(public name: string | undefined, public value: any) {}\n\n toString(): string {\n return this.name ? `${this.name}: ${this.value}` : this.value;\n }\n}\n\nexport class Enum {\n constructor(public name: string, public fields: EnumField[]) {}\n\n toString(): string {\n return `enum ${this.name} {\\n` + indentString(this.fields.join('\\n')) + '\\n}';\n }\n}\n\ntype EnumField = string;\n"],"mappings":"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"}
1
+ {"version":3,"file":"prisma-builder.js","names":["PrismaModel","datasources","generators","models","enums","addDataSource","name","provider","url","shadowDatabaseUrl","ds","DataSource","push","addGenerator","fields","generator","Generator","addModel","model","Model","addEnum","e","Enum","toString","map","d","join","constructor","indentString","DataSourceUrl","value","isEnv","f","JSON","stringify","DeclarationBase","documentations","addComment","x","attributes","addField","type","field","ModelField","addAttribute","args","attr","ModelAttribute","ModelFieldType","array","optional","FieldAttribute","length","a","AttributeArg","AttributeArgValue","Error","Array","isArray","FieldReference","FunctionCall","fr","r","v","FieldReferenceArg","func","FunctionCallArg"],"sources":["../../../src/plugins/prisma/prisma-builder.ts"],"sourcesContent":["import indentString from './indent-string';\n\n/**\n * Prisma schema builder\n */\nexport class PrismaModel {\n private datasources: DataSource[] = [];\n private generators: Generator[] = [];\n private models: Model[] = [];\n private enums: Enum[] = [];\n\n addDataSource(name: string, provider: string, url: DataSourceUrl, shadowDatabaseUrl?: DataSourceUrl): DataSource {\n const ds = new DataSource(name, provider, url, shadowDatabaseUrl);\n this.datasources.push(ds);\n return ds;\n }\n\n addGenerator(name: string, fields: Array<{ name: string; value: string | string[] }>): Generator {\n const generator = new Generator(name, fields);\n this.generators.push(generator);\n return generator;\n }\n\n addModel(name: string): Model {\n const model = new Model(name);\n this.models.push(model);\n return model;\n }\n\n addEnum(name: string, fields: string[]): Enum {\n const e = new Enum(name, fields);\n this.enums.push(e);\n return e;\n }\n\n toString(): string {\n return [...this.datasources, ...this.generators, ...this.enums, ...this.models]\n .map((d) => d.toString())\n .join('\\n\\n');\n }\n}\n\nexport class DataSource {\n constructor(\n public name: string,\n public provider: string,\n public url: DataSourceUrl,\n public shadowDatabaseUrl?: DataSourceUrl\n ) {}\n\n toString(): string {\n return (\n `datasource ${this.name} {\\n` +\n indentString(`provider=\"${this.provider}\"\\n`) +\n indentString(`url=${this.url}\\n`) +\n (this.shadowDatabaseUrl ? indentString(`shadowDatabaseurl=${this.shadowDatabaseUrl}\\n`) : '') +\n `}`\n );\n }\n}\n\nexport class DataSourceUrl {\n constructor(public value: string, public isEnv: boolean) {}\n\n toString(): string {\n return this.isEnv ? `env(\"${this.value}\")` : `\"${this.value}\"`;\n }\n}\n\nexport class Generator {\n constructor(public name: string, public fields: Array<{ name: string; value: string | string[] }>) {}\n\n toString(): string {\n return (\n `generator ${this.name} {\\n` +\n this.fields.map((f) => indentString(`${f.name} = ${JSON.stringify(f.value)}`)).join('\\n') +\n `\\n}`\n );\n }\n}\n\nexport class DeclarationBase {\n public documentations: string[] = [];\n\n addComment(name: string): string {\n this.documentations.push(name);\n return name;\n }\n\n toString(): string {\n return this.documentations.map((x) => `/// ${x}\\n`).join('');\n }\n}\nexport class Model extends DeclarationBase {\n public fields: ModelField[] = [];\n public attributes: ModelAttribute[] = [];\n constructor(public name: string, public documentations: string[] = []) {\n super();\n }\n\n addField(\n name: string,\n type: ModelFieldType | string,\n attributes: FieldAttribute[] = [],\n documentations: string[] = []\n ): ModelField {\n const field = new ModelField(name, type, attributes, documentations);\n this.fields.push(field);\n return field;\n }\n\n addAttribute(name: string, args: AttributeArg[] = []): ModelAttribute {\n const attr = new ModelAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n toString(): string {\n return (\n super.toString() +\n `model ${this.name} {\\n` +\n indentString([...this.fields, ...this.attributes].map((d) => d.toString()).join('\\n')) +\n `\\n}`\n );\n }\n}\n\nexport type ScalarTypes =\n | 'String'\n | 'Boolean'\n | 'Int'\n | 'BigInt'\n | 'Float'\n | 'Decimal'\n | 'DateTime'\n | 'Json'\n | 'Bytes'\n | 'Unsupported';\n\nexport class ModelFieldType {\n constructor(public type: ScalarTypes | string, public array?: boolean, public optional?: boolean) {}\n\n toString(): string {\n return `${this.type}${this.array ? '[]' : ''}${this.optional ? '?' : ''}`;\n }\n}\n\nexport class ModelField extends DeclarationBase {\n constructor(\n public name: string,\n public type: ModelFieldType | string,\n public attributes: FieldAttribute[] = [],\n public documentations: string[] = []\n ) {\n super();\n }\n\n addAttribute(name: string, args: AttributeArg[] = []): FieldAttribute {\n const attr = new FieldAttribute(name, args);\n this.attributes.push(attr);\n return attr;\n }\n\n toString(): string {\n return (\n super.toString() +\n `${this.name} ${this.type}` +\n (this.attributes.length > 0 ? ' ' + this.attributes.map((a) => a.toString()).join(' ') : '')\n );\n }\n}\n\nexport class FieldAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class ModelAttribute {\n constructor(public name: string, public args: AttributeArg[] = []) {}\n\n toString(): string {\n return `${this.name}(` + this.args.map((a) => a.toString()).join(', ') + `)`;\n }\n}\n\nexport class AttributeArg {\n constructor(public name: string | undefined, public value: AttributeArgValue) {}\n\n toString(): string {\n return this.name ? `${this.name}: ${this.value}` : this.value.toString();\n }\n}\n\nexport class AttributeArgValue {\n constructor(\n public type: 'String' | 'FieldReference' | 'Number' | 'Boolean' | 'Array' | 'FunctionCall',\n public value: string | number | boolean | FieldReference | FunctionCall | AttributeArgValue[]\n ) {\n switch (type) {\n case 'String':\n if (typeof value !== 'string') throw new Error('Value must be string');\n break;\n case 'Number':\n if (typeof value !== 'number') throw new Error('Value must be number');\n break;\n case 'Boolean':\n if (typeof value !== 'boolean') throw new Error('Value must be boolean');\n break;\n case 'Array':\n if (!Array.isArray(value)) throw new Error('Value must be array');\n break;\n case 'FieldReference':\n if (typeof value !== 'string' && !(value instanceof FieldReference))\n throw new Error('Value must be string or FieldReference');\n break;\n case 'FunctionCall':\n if (!(value instanceof FunctionCall)) throw new Error('Value must be FunctionCall');\n break;\n }\n }\n\n toString(): string {\n switch (this.type) {\n case 'String':\n return `\"${this.value}\"`;\n case 'Number':\n return this.value.toString();\n case 'FieldReference': {\n if (typeof this.value === 'string') {\n return this.value;\n } else {\n const fr = this.value as FieldReference;\n let r = fr.field;\n if (fr.args.length > 0) {\n r += '(' + fr.args.map((a) => a.toString()).join(',') + ')';\n }\n return r;\n }\n }\n case 'FunctionCall':\n return this.value.toString();\n case 'Boolean':\n return this.value ? 'true' : 'false';\n case 'Array':\n return '[' + (this.value as AttributeArgValue[]).map((v) => v.toString()).join(', ') + ']';\n default:\n throw new Error(`Unknown attribute value type ${this.type}`);\n }\n }\n}\n\nexport class FieldReference {\n constructor(public field: string, public args: FieldReferenceArg[] = []) {}\n}\n\nexport class FieldReferenceArg {\n constructor(public name: 'sort', public value: 'Asc' | 'Desc') {}\n\n toString(): string {\n return `${this.name}: ${this.value}`;\n }\n}\n\nexport class FunctionCall {\n constructor(public func: string, public args: FunctionCallArg[] = []) {}\n\n toString(): string {\n return `${this.func}` + '(' + this.args.map((a) => a.toString()).join(', ') + ')';\n }\n}\n\nexport class FunctionCallArg {\n // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types, @typescript-eslint/no-explicit-any\n constructor(public name: string | undefined, public value: any) {}\n\n toString(): string {\n return this.name ? `${this.name}: ${this.value}` : this.value;\n }\n}\n\nexport class Enum {\n constructor(public name: string, public fields: EnumField[]) {}\n\n toString(): string {\n return `enum ${this.name} {\\n` + indentString(this.fields.join('\\n')) + '\\n}';\n }\n}\n\ntype EnumField = string;\n"],"mappings":"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"}
@@ -5,6 +5,8 @@ import { FunctionCall as PrismaFunctionCall } from './prisma-builder';
5
5
  * Generates Prisma schema file
6
6
  */
7
7
  export default class PrismaSchemaGenerator {
8
+ private zModelGenerator;
9
+ private readonly PRELUDE;
8
10
  generate(model: Model, options: PluginOptions): Promise<void>;
9
11
  private generateDataSource;
10
12
  private extractDataSourceUrl;
@@ -11,12 +11,20 @@ var _promises = require("fs/promises");
11
11
  var _path = _interopRequireDefault(require("path"));
12
12
  var _astUtils = require("../../utils/ast-utils");
13
13
  var _execUtils = require("../../utils/exec-utils");
14
+ var _zmodelCodeGenerator = _interopRequireDefault(require("../zmodel-code/zmodel-code-generator"));
14
15
  var _prismaBuilder = require("./prisma-builder");
15
16
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
16
17
  /**
17
18
  * Generates Prisma schema file
18
19
  */
19
20
  class PrismaSchemaGenerator {
21
+ zModelGenerator = new _zmodelCodeGenerator.default();
22
+ PRELUDE = `//////////////////////////////////////////////////////////////////////////////////////////////
23
+ // DO NOT MODIFY THIS FILE //
24
+ // This file is automatically generated by ZenStack CLI and should not be manually updated. //
25
+ //////////////////////////////////////////////////////////////////////////////////////////////
26
+
27
+ `;
20
28
  async generate(model, options) {
21
29
  const prisma = new _prismaBuilder.PrismaModel();
22
30
  for (const decl of model.declarations) {
@@ -41,7 +49,7 @@ class PrismaSchemaGenerator {
41
49
  recursive: true
42
50
  });
43
51
  }
44
- await (0, _promises.writeFile)(outFile, prisma.toString());
52
+ await (0, _promises.writeFile)(outFile, this.PRELUDE + prisma.toString());
45
53
 
46
54
  // run 'prisma generate'
47
55
  await (0, _execUtils.execSync)(`npx prisma generate --schema ${outFile}`);
@@ -133,6 +141,7 @@ class PrismaSchemaGenerator {
133
141
  for (const attr of decl.attributes.filter(attr => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))) {
134
142
  this.generateModelAttribute(model, attr);
135
143
  }
144
+ decl.attributes.filter(attr => attr.decl.ref && !this.isPrismaAttribute(attr.decl.ref)).forEach(attr => model.addComment(this.zModelGenerator.generateAttribute(attr)));
136
145
  }
137
146
  isPrismaAttribute(attr) {
138
147
  return !!attr.attributes.find(a => {
@@ -148,7 +157,9 @@ class PrismaSchemaGenerator {
148
157
  }
149
158
  const type = new _prismaBuilder.ModelFieldType(fieldType, field.type.array, field.type.optional);
150
159
  const attributes = field.attributes.filter(attr => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref)).map(attr => this.makeFieldAttribute(attr));
151
- model.addField(field.name, type, attributes);
160
+ const nonPrismaAttributes = field.attributes.filter(attr => !attr.decl.ref || !this.isPrismaAttribute(attr.decl.ref));
161
+ const documentations = nonPrismaAttributes.map(attr => this.zModelGenerator.generateAttribute(attr));
162
+ model.addField(field.name, type, attributes, documentations);
152
163
  }
153
164
  makeFieldAttribute(attr) {
154
165
  return new _prismaBuilder.FieldAttribute((0, _sdk.resolved)(attr.decl).name, attr.args.map(arg => this.makeAttributeArg(arg)));