zenstack 0.6.0-pre.18 → 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 +1 -1
- package/cli/cli-util.js +32 -76
- package/cli/cli-util.js.map +1 -1
- package/cli/index.d.ts +4 -0
- package/cli/index.js +17 -18
- package/cli/index.js.map +1 -1
- package/package.json +4 -4
- package/plugins/prisma/prisma-builder.d.ts +12 -5
- package/plugins/prisma/prisma-builder.js +24 -9
- package/plugins/prisma/prisma-builder.js.map +1 -1
- package/plugins/prisma/schema-generator.d.ts +2 -0
- package/plugins/prisma/schema-generator.js +13 -2
- package/plugins/prisma/schema-generator.js.map +1 -1
- package/plugins/zmodel-code/zmodel-code-generator.d.ts +27 -0
- package/plugins/zmodel-code/zmodel-code-generator.js +110 -0
- package/plugins/zmodel-code/zmodel-code-generator.js.map +1 -0
- package/res/starter.zmodel +47 -0
- package/telemetry.js +5 -5
- package/telemetry.js.map +1 -1
- package/utils/exec-utils.d.ts +1 -1
- package/utils/exec-utils.js +7 -2
- package/utils/exec-utils.js.map +1 -1
- package/utils/pkg-utils.d.ts +1 -1
- package/utils/pkg-utils.js +4 -4
- package/utils/pkg-utils.js.map +1 -1
- package/utils/version-utils.d.ts +1 -0
- package/utils/version-utils.js +15 -0
- package/utils/version-utils.js.map +1 -0
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
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
96
|
-
|
|
97
|
-
|
|
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 (
|
|
104
|
-
console.log(`Sample model generated at: ${_colors.default.blue(
|
|
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
|
-
|
|
107
|
-
|
|
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
|
}
|
package/cli/cli-util.js.map
CHANGED
|
@@ -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 =
|
|
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","
|
|
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.
|
|
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/language": "0.6.0-pre.
|
|
94
|
-
"@zenstackhq/
|
|
95
|
-
"@zenstackhq/
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema-generator.js","names":["PrismaSchemaGenerator","generate","model","options","prisma","PrismaModel","decl","declarations","$type","DataSource","generateDataSource","Enum","generateEnum","DataModel","generateModel","Generator","generateGenerator","outFile","output","fs","existsSync","path","dirname","mkdirSync","recursive","writeFile","toString","execSync","dataSource","provider","undefined","url","shadowDatabaseUrl","f","fields","name","isStringLiteral","value","PluginError","r","extractDataSourceUrl","addDataSource","fieldValue","PrismaDataSourceUrl","isInvocationExpr","function","ref","args","length","addGenerator","map","isArrayExpr","getLiteralArray","getLiteral","addModel","field","generateModelField","allowAll","denyAll","hasFieldValidation","analyzePolicies","addField","GUARD_FIELD_NAME","PrismaFieldAttribute","PrismaAttributeArg","PrismaAttributeArgValue","TRANSACTION_FIELD_NAME","addAttribute","attr","attributes","filter","isPrismaAttribute","generateModelAttribute","find","a","fieldType","type","reference","$container","ModelFieldType","array","optional","makeFieldAttribute","resolved","arg","makeAttributeArg","makeAttributeArgValue","node","isLiteralExpr","Array","items","item","isReferenceExpr","PrismaFieldReference","target","PrismaFieldReferenceArg","makeFunctionCall","PrismaFunctionCall","PrismaFunctionCallArg","push","PrismaModelAttribute","addEnum"],"sources":["../../../src/plugins/prisma/schema-generator.ts"],"sourcesContent":["import {\n AstNode,\n Attribute,\n AttributeArg,\n DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n DataSource,\n Enum,\n Expression,\n Generator,\n InvocationExpr,\n LiteralExpr,\n Model,\n isArrayExpr,\n isInvocationExpr,\n isLiteralExpr,\n isReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport {\n GUARD_FIELD_NAME,\n PluginError,\n PluginOptions,\n TRANSACTION_FIELD_NAME,\n getLiteral,\n getLiteralArray,\n resolved,\n} from '@zenstackhq/sdk';\nimport fs from 'fs';\nimport { writeFile } from 'fs/promises';\nimport path from 'path';\nimport { analyzePolicies } from '../../utils/ast-utils';\nimport { execSync } from '../../utils/exec-utils';\nimport {\n ModelFieldType,\n AttributeArg as PrismaAttributeArg,\n AttributeArgValue as PrismaAttributeArgValue,\n Model as PrismaDataModel,\n DataSourceUrl as PrismaDataSourceUrl,\n FieldAttribute as PrismaFieldAttribute,\n FieldReference as PrismaFieldReference,\n FieldReferenceArg as PrismaFieldReferenceArg,\n FunctionCall as PrismaFunctionCall,\n FunctionCallArg as PrismaFunctionCallArg,\n PrismaModel,\n ModelAttribute as PrismaModelAttribute,\n} from './prisma-builder';\n\n/**\n * Generates Prisma schema file\n */\nexport default class PrismaSchemaGenerator {\n async generate(model: Model, options: PluginOptions) {\n const prisma = new PrismaModel();\n\n for (const decl of model.declarations) {\n switch (decl.$type) {\n case DataSource:\n this.generateDataSource(prisma, decl as DataSource);\n break;\n\n case Enum:\n this.generateEnum(prisma, decl as Enum);\n break;\n\n case DataModel:\n this.generateModel(prisma, decl as DataModel);\n break;\n\n case Generator:\n this.generateGenerator(prisma, decl as Generator);\n break;\n }\n }\n\n const outFile = (options.output as string) ?? './prisma/schema.prisma';\n if (!fs.existsSync(path.dirname(outFile))) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true });\n }\n await writeFile(outFile, prisma.toString());\n\n // run 'prisma generate'\n await execSync(`npx prisma generate --schema ${outFile}`);\n }\n\n private generateDataSource(prisma: PrismaModel, dataSource: DataSource) {\n let provider: string | undefined = undefined;\n let url: PrismaDataSourceUrl | undefined = undefined;\n let shadowDatabaseUrl: PrismaDataSourceUrl | undefined = undefined;\n\n for (const f of dataSource.fields) {\n switch (f.name) {\n case 'provider': {\n if (this.isStringLiteral(f.value)) {\n provider = f.value.value as string;\n } else {\n throw new PluginError('Datasource provider must be set to a string');\n }\n break;\n }\n\n case 'url': {\n const r = this.extractDataSourceUrl(f.value);\n if (!r) {\n throw new PluginError('Invalid value for datasource url');\n }\n url = r;\n break;\n }\n\n case 'shadowDatabaseUrl': {\n const r = this.extractDataSourceUrl(f.value);\n if (!r) {\n throw new PluginError('Invalid value for datasource url');\n }\n shadowDatabaseUrl = r;\n break;\n }\n }\n }\n\n if (!provider) {\n throw new PluginError('Datasource is missing \"provider\" field');\n }\n if (!url) {\n throw new PluginError('Datasource is missing \"url\" field');\n }\n\n prisma.addDataSource(dataSource.name, provider, url, shadowDatabaseUrl);\n }\n\n private extractDataSourceUrl(fieldValue: LiteralExpr | InvocationExpr) {\n if (this.isStringLiteral(fieldValue)) {\n return new PrismaDataSourceUrl(fieldValue.value as string, false);\n } else if (\n isInvocationExpr(fieldValue) &&\n fieldValue.function.ref?.name === 'env' &&\n fieldValue.args.length === 1 &&\n this.isStringLiteral(fieldValue.args[0].value)\n ) {\n return new PrismaDataSourceUrl(fieldValue.args[0].value.value as string, true);\n } else {\n return null;\n }\n }\n\n private generateGenerator(prisma: PrismaModel, decl: Generator) {\n prisma.addGenerator(\n decl.name,\n decl.fields.map((f) => {\n const value = isArrayExpr(f.value) ? getLiteralArray(f.value) : getLiteral(f.value);\n return { name: f.name, value };\n })\n );\n }\n\n private generateModel(prisma: PrismaModel, decl: DataModel) {\n const model = prisma.addModel(decl.name);\n for (const field of decl.fields) {\n this.generateModelField(model, field);\n }\n\n const { allowAll, denyAll, hasFieldValidation } = analyzePolicies(decl);\n\n if ((!allowAll && !denyAll) || hasFieldValidation) {\n // generate auxiliary fields for policy check\n\n // add an \"zenstack_guard\" field for dealing with pure auth() related conditions\n model.addField(GUARD_FIELD_NAME, 'Boolean', [\n new PrismaFieldAttribute('@default', [\n new PrismaAttributeArg(undefined, new PrismaAttributeArgValue('Boolean', true)),\n ]),\n ]);\n\n // add an \"zenstack_transaction\" field for tracking records created/updated with nested writes\n model.addField(TRANSACTION_FIELD_NAME, 'String?');\n\n // create an index for \"zenstack_transaction\" field\n model.addAttribute('@@index', [\n new PrismaAttributeArg(\n undefined,\n new PrismaAttributeArgValue('Array', [\n new PrismaAttributeArgValue('FieldReference', TRANSACTION_FIELD_NAME),\n ])\n ),\n ]);\n }\n\n for (const attr of decl.attributes.filter((attr) => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))) {\n this.generateModelAttribute(model, attr);\n }\n }\n\n private isPrismaAttribute(attr: Attribute) {\n return !!attr.attributes.find((a) => a.decl.ref?.name === '@@@prisma');\n }\n\n private generateModelField(model: PrismaDataModel, field: DataModelField) {\n const fieldType = field.type.type || field.type.reference?.ref?.name;\n if (!fieldType) {\n throw new PluginError(`Field type is not resolved: ${field.$container.name}.${field.name}`);\n }\n\n const type = new ModelFieldType(fieldType, field.type.array, field.type.optional);\n\n const attributes = field.attributes\n .filter((attr) => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))\n .map((attr) => this.makeFieldAttribute(attr));\n model.addField(field.name, type, attributes);\n }\n\n private makeFieldAttribute(attr: DataModelFieldAttribute) {\n return new PrismaFieldAttribute(\n resolved(attr.decl).name,\n attr.args.map((arg) => this.makeAttributeArg(arg))\n );\n }\n\n private makeAttributeArg(arg: AttributeArg): PrismaAttributeArg {\n return new PrismaAttributeArg(arg.name, this.makeAttributeArgValue(arg.value));\n }\n\n private makeAttributeArgValue(node: Expression): PrismaAttributeArgValue {\n if (isLiteralExpr(node)) {\n switch (typeof node.value) {\n case 'string':\n return new PrismaAttributeArgValue('String', node.value);\n case 'number':\n return new PrismaAttributeArgValue('Number', node.value);\n case 'boolean':\n return new PrismaAttributeArgValue('Boolean', node.value);\n default:\n throw new PluginError(`Unexpected literal type: ${typeof node.value}`);\n }\n } else if (isArrayExpr(node)) {\n return new PrismaAttributeArgValue(\n 'Array',\n new Array(...node.items.map((item) => this.makeAttributeArgValue(item)))\n );\n } else if (isReferenceExpr(node)) {\n return new PrismaAttributeArgValue(\n 'FieldReference',\n new PrismaFieldReference(\n resolved(node.target).name,\n node.args.map((arg) => new PrismaFieldReferenceArg(arg.name, arg.value))\n )\n );\n } else if (isInvocationExpr(node)) {\n // invocation\n return new PrismaAttributeArgValue('FunctionCall', this.makeFunctionCall(node));\n } else {\n throw new PluginError(`Unsupported attribute argument expression type: ${node.$type}`);\n }\n }\n\n makeFunctionCall(node: InvocationExpr): PrismaFunctionCall {\n return new PrismaFunctionCall(\n resolved(node.function).name,\n node.args.map((arg) => {\n if (!isLiteralExpr(arg.value)) {\n throw new PluginError('Function call argument must be literal');\n }\n return new PrismaFunctionCallArg(arg.name, arg.value.value);\n })\n );\n }\n\n private generateModelAttribute(model: PrismaDataModel, attr: DataModelAttribute) {\n model.attributes.push(\n new PrismaModelAttribute(\n resolved(attr.decl).name,\n attr.args.map((arg) => this.makeAttributeArg(arg))\n )\n );\n }\n\n private generateEnum(prisma: PrismaModel, decl: Enum) {\n prisma.addEnum(\n decl.name,\n decl.fields.map((f) => f.name)\n );\n }\n\n private isStringLiteral(node: AstNode): node is LiteralExpr {\n return isLiteralExpr(node) && typeof node.value === 'string';\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"schema-generator.js","names":["PrismaSchemaGenerator","zModelGenerator","ZModelCodeGenerator","PRELUDE","generate","model","options","prisma","PrismaModel","decl","declarations","$type","DataSource","generateDataSource","Enum","generateEnum","DataModel","generateModel","Generator","generateGenerator","outFile","output","fs","existsSync","path","dirname","mkdirSync","recursive","writeFile","toString","execSync","dataSource","provider","undefined","url","shadowDatabaseUrl","f","fields","name","isStringLiteral","value","PluginError","r","extractDataSourceUrl","addDataSource","fieldValue","PrismaDataSourceUrl","isInvocationExpr","function","ref","args","length","addGenerator","map","isArrayExpr","getLiteralArray","getLiteral","addModel","field","generateModelField","allowAll","denyAll","hasFieldValidation","analyzePolicies","addField","GUARD_FIELD_NAME","PrismaFieldAttribute","PrismaAttributeArg","PrismaAttributeArgValue","TRANSACTION_FIELD_NAME","addAttribute","attr","attributes","filter","isPrismaAttribute","generateModelAttribute","forEach","addComment","generateAttribute","find","a","fieldType","type","reference","$container","ModelFieldType","array","optional","makeFieldAttribute","nonPrismaAttributes","documentations","resolved","arg","makeAttributeArg","makeAttributeArgValue","node","isLiteralExpr","Array","items","item","isReferenceExpr","PrismaFieldReference","target","PrismaFieldReferenceArg","makeFunctionCall","PrismaFunctionCall","PrismaFunctionCallArg","push","PrismaModelAttribute","addEnum"],"sources":["../../../src/plugins/prisma/schema-generator.ts"],"sourcesContent":["import {\n AstNode,\n Attribute,\n AttributeArg,\n DataModel,\n DataModelAttribute,\n DataModelField,\n DataModelFieldAttribute,\n DataSource,\n Enum,\n Expression,\n Generator,\n InvocationExpr,\n LiteralExpr,\n Model,\n isArrayExpr,\n isInvocationExpr,\n isLiteralExpr,\n isReferenceExpr,\n} from '@zenstackhq/language/ast';\nimport {\n GUARD_FIELD_NAME,\n PluginError,\n PluginOptions,\n TRANSACTION_FIELD_NAME,\n getLiteral,\n getLiteralArray,\n resolved,\n} from '@zenstackhq/sdk';\nimport fs from 'fs';\nimport { writeFile } from 'fs/promises';\nimport path from 'path';\nimport { analyzePolicies } from '../../utils/ast-utils';\nimport { execSync } from '../../utils/exec-utils';\nimport ZModelCodeGenerator from '../zmodel-code/zmodel-code-generator';\nimport {\n ModelFieldType,\n AttributeArg as PrismaAttributeArg,\n AttributeArgValue as PrismaAttributeArgValue,\n Model as PrismaDataModel,\n DataSourceUrl as PrismaDataSourceUrl,\n FieldAttribute as PrismaFieldAttribute,\n FieldReference as PrismaFieldReference,\n FieldReferenceArg as PrismaFieldReferenceArg,\n FunctionCall as PrismaFunctionCall,\n FunctionCallArg as PrismaFunctionCallArg,\n PrismaModel,\n ModelAttribute as PrismaModelAttribute,\n} from './prisma-builder';\n\n/**\n * Generates Prisma schema file\n */\nexport default class PrismaSchemaGenerator {\n private zModelGenerator: ZModelCodeGenerator = new ZModelCodeGenerator();\n\n private readonly PRELUDE = `//////////////////////////////////////////////////////////////////////////////////////////////\n// DO NOT MODIFY THIS FILE //\n// This file is automatically generated by ZenStack CLI and should not be manually updated. //\n//////////////////////////////////////////////////////////////////////////////////////////////\n\n`;\n\n async generate(model: Model, options: PluginOptions) {\n const prisma = new PrismaModel();\n\n for (const decl of model.declarations) {\n switch (decl.$type) {\n case DataSource:\n this.generateDataSource(prisma, decl as DataSource);\n break;\n\n case Enum:\n this.generateEnum(prisma, decl as Enum);\n break;\n\n case DataModel:\n this.generateModel(prisma, decl as DataModel);\n break;\n\n case Generator:\n this.generateGenerator(prisma, decl as Generator);\n break;\n }\n }\n\n const outFile = (options.output as string) ?? './prisma/schema.prisma';\n if (!fs.existsSync(path.dirname(outFile))) {\n fs.mkdirSync(path.dirname(outFile), { recursive: true });\n }\n await writeFile(outFile, this.PRELUDE + prisma.toString());\n\n // run 'prisma generate'\n await execSync(`npx prisma generate --schema ${outFile}`);\n }\n\n private generateDataSource(prisma: PrismaModel, dataSource: DataSource) {\n let provider: string | undefined = undefined;\n let url: PrismaDataSourceUrl | undefined = undefined;\n let shadowDatabaseUrl: PrismaDataSourceUrl | undefined = undefined;\n\n for (const f of dataSource.fields) {\n switch (f.name) {\n case 'provider': {\n if (this.isStringLiteral(f.value)) {\n provider = f.value.value as string;\n } else {\n throw new PluginError('Datasource provider must be set to a string');\n }\n break;\n }\n\n case 'url': {\n const r = this.extractDataSourceUrl(f.value);\n if (!r) {\n throw new PluginError('Invalid value for datasource url');\n }\n url = r;\n break;\n }\n\n case 'shadowDatabaseUrl': {\n const r = this.extractDataSourceUrl(f.value);\n if (!r) {\n throw new PluginError('Invalid value for datasource url');\n }\n shadowDatabaseUrl = r;\n break;\n }\n }\n }\n\n if (!provider) {\n throw new PluginError('Datasource is missing \"provider\" field');\n }\n if (!url) {\n throw new PluginError('Datasource is missing \"url\" field');\n }\n\n prisma.addDataSource(dataSource.name, provider, url, shadowDatabaseUrl);\n }\n\n private extractDataSourceUrl(fieldValue: LiteralExpr | InvocationExpr) {\n if (this.isStringLiteral(fieldValue)) {\n return new PrismaDataSourceUrl(fieldValue.value as string, false);\n } else if (\n isInvocationExpr(fieldValue) &&\n fieldValue.function.ref?.name === 'env' &&\n fieldValue.args.length === 1 &&\n this.isStringLiteral(fieldValue.args[0].value)\n ) {\n return new PrismaDataSourceUrl(fieldValue.args[0].value.value as string, true);\n } else {\n return null;\n }\n }\n\n private generateGenerator(prisma: PrismaModel, decl: Generator) {\n prisma.addGenerator(\n decl.name,\n decl.fields.map((f) => {\n const value = isArrayExpr(f.value) ? getLiteralArray(f.value) : getLiteral(f.value);\n return { name: f.name, value };\n })\n );\n }\n\n private generateModel(prisma: PrismaModel, decl: DataModel) {\n const model = prisma.addModel(decl.name);\n for (const field of decl.fields) {\n this.generateModelField(model, field);\n }\n\n const { allowAll, denyAll, hasFieldValidation } = analyzePolicies(decl);\n\n if ((!allowAll && !denyAll) || hasFieldValidation) {\n // generate auxiliary fields for policy check\n\n // add an \"zenstack_guard\" field for dealing with pure auth() related conditions\n model.addField(GUARD_FIELD_NAME, 'Boolean', [\n new PrismaFieldAttribute('@default', [\n new PrismaAttributeArg(undefined, new PrismaAttributeArgValue('Boolean', true)),\n ]),\n ]);\n\n // add an \"zenstack_transaction\" field for tracking records created/updated with nested writes\n model.addField(TRANSACTION_FIELD_NAME, 'String?');\n\n // create an index for \"zenstack_transaction\" field\n model.addAttribute('@@index', [\n new PrismaAttributeArg(\n undefined,\n new PrismaAttributeArgValue('Array', [\n new PrismaAttributeArgValue('FieldReference', TRANSACTION_FIELD_NAME),\n ])\n ),\n ]);\n }\n\n for (const attr of decl.attributes.filter((attr) => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))) {\n this.generateModelAttribute(model, attr);\n }\n\n decl.attributes\n .filter((attr) => attr.decl.ref && !this.isPrismaAttribute(attr.decl.ref))\n .forEach((attr) => model.addComment(this.zModelGenerator.generateAttribute(attr)));\n }\n\n private isPrismaAttribute(attr: Attribute) {\n return !!attr.attributes.find((a) => a.decl.ref?.name === '@@@prisma');\n }\n\n private generateModelField(model: PrismaDataModel, field: DataModelField) {\n const fieldType = field.type.type || field.type.reference?.ref?.name;\n if (!fieldType) {\n throw new PluginError(`Field type is not resolved: ${field.$container.name}.${field.name}`);\n }\n\n const type = new ModelFieldType(fieldType, field.type.array, field.type.optional);\n\n const attributes = field.attributes\n .filter((attr) => attr.decl.ref && this.isPrismaAttribute(attr.decl.ref))\n .map((attr) => this.makeFieldAttribute(attr));\n\n const nonPrismaAttributes = field.attributes.filter(\n (attr) => !attr.decl.ref || !this.isPrismaAttribute(attr.decl.ref)\n );\n\n const documentations = nonPrismaAttributes.map((attr) => this.zModelGenerator.generateAttribute(attr));\n\n model.addField(field.name, type, attributes, documentations);\n }\n\n private makeFieldAttribute(attr: DataModelFieldAttribute) {\n return new PrismaFieldAttribute(\n resolved(attr.decl).name,\n attr.args.map((arg) => this.makeAttributeArg(arg))\n );\n }\n\n private makeAttributeArg(arg: AttributeArg): PrismaAttributeArg {\n return new PrismaAttributeArg(arg.name, this.makeAttributeArgValue(arg.value));\n }\n\n private makeAttributeArgValue(node: Expression): PrismaAttributeArgValue {\n if (isLiteralExpr(node)) {\n switch (typeof node.value) {\n case 'string':\n return new PrismaAttributeArgValue('String', node.value);\n case 'number':\n return new PrismaAttributeArgValue('Number', node.value);\n case 'boolean':\n return new PrismaAttributeArgValue('Boolean', node.value);\n default:\n throw new PluginError(`Unexpected literal type: ${typeof node.value}`);\n }\n } else if (isArrayExpr(node)) {\n return new PrismaAttributeArgValue(\n 'Array',\n new Array(...node.items.map((item) => this.makeAttributeArgValue(item)))\n );\n } else if (isReferenceExpr(node)) {\n return new PrismaAttributeArgValue(\n 'FieldReference',\n new PrismaFieldReference(\n resolved(node.target).name,\n node.args.map((arg) => new PrismaFieldReferenceArg(arg.name, arg.value))\n )\n );\n } else if (isInvocationExpr(node)) {\n // invocation\n return new PrismaAttributeArgValue('FunctionCall', this.makeFunctionCall(node));\n } else {\n throw new PluginError(`Unsupported attribute argument expression type: ${node.$type}`);\n }\n }\n\n makeFunctionCall(node: InvocationExpr): PrismaFunctionCall {\n return new PrismaFunctionCall(\n resolved(node.function).name,\n node.args.map((arg) => {\n if (!isLiteralExpr(arg.value)) {\n throw new PluginError('Function call argument must be literal');\n }\n return new PrismaFunctionCallArg(arg.name, arg.value.value);\n })\n );\n }\n\n private generateModelAttribute(model: PrismaDataModel, attr: DataModelAttribute) {\n model.attributes.push(\n new PrismaModelAttribute(\n resolved(attr.decl).name,\n attr.args.map((arg) => this.makeAttributeArg(arg))\n )\n );\n }\n\n private generateEnum(prisma: PrismaModel, decl: Enum) {\n prisma.addEnum(\n decl.name,\n decl.fields.map((f) => f.name)\n );\n }\n\n private isStringLiteral(node: AstNode): node is LiteralExpr {\n return isLiteralExpr(node) && typeof node.value === 'string';\n }\n}\n"],"mappings":";;;;;;AAAA;AAoBA;AASA;AACA;AACA;AACA;AACA;AACA;AACA;AAa0B;AAE1B;AACA;AACA;AACe,MAAMA,qBAAqB,CAAC;EAC/BC,eAAe,GAAwB,IAAIC,4BAAmB,EAAE;EAEvDC,OAAO,GAAI;AAChC;AACA;AACA;AACA;AACA,CAAC;EAEG,MAAMC,QAAQ,CAACC,KAAY,EAAEC,OAAsB,EAAE;IACjD,MAAMC,MAAM,GAAG,IAAIC,0BAAW,EAAE;IAEhC,KAAK,MAAMC,IAAI,IAAIJ,KAAK,CAACK,YAAY,EAAE;MACnC,QAAQD,IAAI,CAACE,KAAK;QACd,KAAKC,eAAU;UACX,IAAI,CAACC,kBAAkB,CAACN,MAAM,EAAEE,IAAI,CAAe;UACnD;QAEJ,KAAKK,SAAI;UACL,IAAI,CAACC,YAAY,CAACR,MAAM,EAAEE,IAAI,CAAS;UACvC;QAEJ,KAAKO,cAAS;UACV,IAAI,CAACC,aAAa,CAACV,MAAM,EAAEE,IAAI,CAAc;UAC7C;QAEJ,KAAKS,cAAS;UACV,IAAI,CAACC,iBAAiB,CAACZ,MAAM,EAAEE,IAAI,CAAc;UACjD;MAAM;IAElB;IAEA,MAAMW,OAAO,GAAId,OAAO,CAACe,MAAM,IAAe,wBAAwB;IACtE,IAAI,CAACC,WAAE,CAACC,UAAU,CAACC,aAAI,CAACC,OAAO,CAACL,OAAO,CAAC,CAAC,EAAE;MACvCE,WAAE,CAACI,SAAS,CAACF,aAAI,CAACC,OAAO,CAACL,OAAO,CAAC,EAAE;QAAEO,SAAS,EAAE;MAAK,CAAC,CAAC;IAC5D;IACA,MAAM,IAAAC,mBAAS,EAACR,OAAO,EAAE,IAAI,CAACjB,OAAO,GAAGI,MAAM,CAACsB,QAAQ,EAAE,CAAC;;IAE1D;IACA,MAAM,IAAAC,mBAAQ,EAAE,gCAA+BV,OAAQ,EAAC,CAAC;EAC7D;EAEQP,kBAAkB,CAACN,MAAmB,EAAEwB,UAAsB,EAAE;IACpE,IAAIC,QAA4B,GAAGC,SAAS;IAC5C,IAAIC,GAAoC,GAAGD,SAAS;IACpD,IAAIE,iBAAkD,GAAGF,SAAS;IAElE,KAAK,MAAMG,CAAC,IAAIL,UAAU,CAACM,MAAM,EAAE;MAC/B,QAAQD,CAAC,CAACE,IAAI;QACV,KAAK,UAAU;UAAE;YACb,IAAI,IAAI,CAACC,eAAe,CAACH,CAAC,CAACI,KAAK,CAAC,EAAE;cAC/BR,QAAQ,GAAGI,CAAC,CAACI,KAAK,CAACA,KAAe;YACtC,CAAC,MAAM;cACH,MAAM,IAAIC,gBAAW,CAAC,6CAA6C,CAAC;YACxE;YACA;UACJ;QAEA,KAAK,KAAK;UAAE;YACR,MAAMC,CAAC,GAAG,IAAI,CAACC,oBAAoB,CAACP,CAAC,CAACI,KAAK,CAAC;YAC5C,IAAI,CAACE,CAAC,EAAE;cACJ,MAAM,IAAID,gBAAW,CAAC,kCAAkC,CAAC;YAC7D;YACAP,GAAG,GAAGQ,CAAC;YACP;UACJ;QAEA,KAAK,mBAAmB;UAAE;YACtB,MAAMA,CAAC,GAAG,IAAI,CAACC,oBAAoB,CAACP,CAAC,CAACI,KAAK,CAAC;YAC5C,IAAI,CAACE,CAAC,EAAE;cACJ,MAAM,IAAID,gBAAW,CAAC,kCAAkC,CAAC;YAC7D;YACAN,iBAAiB,GAAGO,CAAC;YACrB;UACJ;MAAC;IAET;IAEA,IAAI,CAACV,QAAQ,EAAE;MACX,MAAM,IAAIS,gBAAW,CAAC,wCAAwC,CAAC;IACnE;IACA,IAAI,CAACP,GAAG,EAAE;MACN,MAAM,IAAIO,gBAAW,CAAC,mCAAmC,CAAC;IAC9D;IAEAlC,MAAM,CAACqC,aAAa,CAACb,UAAU,CAACO,IAAI,EAAEN,QAAQ,EAAEE,GAAG,EAAEC,iBAAiB,CAAC;EAC3E;EAEQQ,oBAAoB,CAACE,UAAwC,EAAE;IAAA;IACnE,IAAI,IAAI,CAACN,eAAe,CAACM,UAAU,CAAC,EAAE;MAClC,OAAO,IAAIC,4BAAmB,CAACD,UAAU,CAACL,KAAK,EAAY,KAAK,CAAC;IACrE,CAAC,MAAM,IACH,IAAAO,qBAAgB,EAACF,UAAU,CAAC,IAC5B,0BAAAA,UAAU,CAACG,QAAQ,CAACC,GAAG,0DAAvB,sBAAyBX,IAAI,MAAK,KAAK,IACvCO,UAAU,CAACK,IAAI,CAACC,MAAM,KAAK,CAAC,IAC5B,IAAI,CAACZ,eAAe,CAACM,UAAU,CAACK,IAAI,CAAC,CAAC,CAAC,CAACV,KAAK,CAAC,EAChD;MACE,OAAO,IAAIM,4BAAmB,CAACD,UAAU,CAACK,IAAI,CAAC,CAAC,CAAC,CAACV,KAAK,CAACA,KAAK,EAAY,IAAI,CAAC;IAClF,CAAC,MAAM;MACH,OAAO,IAAI;IACf;EACJ;EAEQrB,iBAAiB,CAACZ,MAAmB,EAAEE,IAAe,EAAE;IAC5DF,MAAM,CAAC6C,YAAY,CACf3C,IAAI,CAAC6B,IAAI,EACT7B,IAAI,CAAC4B,MAAM,CAACgB,GAAG,CAAEjB,CAAC,IAAK;MACnB,MAAMI,KAAK,GAAG,IAAAc,gBAAW,EAAClB,CAAC,CAACI,KAAK,CAAC,GAAG,IAAAe,oBAAe,EAACnB,CAAC,CAACI,KAAK,CAAC,GAAG,IAAAgB,eAAU,EAACpB,CAAC,CAACI,KAAK,CAAC;MACnF,OAAO;QAAEF,IAAI,EAAEF,CAAC,CAACE,IAAI;QAAEE;MAAM,CAAC;IAClC,CAAC,CAAC,CACL;EACL;EAEQvB,aAAa,CAACV,MAAmB,EAAEE,IAAe,EAAE;IACxD,MAAMJ,KAAK,GAAGE,MAAM,CAACkD,QAAQ,CAAChD,IAAI,CAAC6B,IAAI,CAAC;IACxC,KAAK,MAAMoB,KAAK,IAAIjD,IAAI,CAAC4B,MAAM,EAAE;MAC7B,IAAI,CAACsB,kBAAkB,CAACtD,KAAK,EAAEqD,KAAK,CAAC;IACzC;IAEA,MAAM;MAAEE,QAAQ;MAAEC,OAAO;MAAEC;IAAmB,CAAC,GAAG,IAAAC,yBAAe,EAACtD,IAAI,CAAC;IAEvE,IAAK,CAACmD,QAAQ,IAAI,CAACC,OAAO,IAAKC,kBAAkB,EAAE;MAC/C;;MAEA;MACAzD,KAAK,CAAC2D,QAAQ,CAACC,qBAAgB,EAAE,SAAS,EAAE,CACxC,IAAIC,6BAAoB,CAAC,UAAU,EAAE,CACjC,IAAIC,2BAAkB,CAAClC,SAAS,EAAE,IAAImC,gCAAuB,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAClF,CAAC,CACL,CAAC;;MAEF;MACA/D,KAAK,CAAC2D,QAAQ,CAACK,2BAAsB,EAAE,SAAS,CAAC;;MAEjD;MACAhE,KAAK,CAACiE,YAAY,CAAC,SAAS,EAAE,CAC1B,IAAIH,2BAAkB,CAClBlC,SAAS,EACT,IAAImC,gCAAuB,CAAC,OAAO,EAAE,CACjC,IAAIA,gCAAuB,CAAC,gBAAgB,EAAEC,2BAAsB,CAAC,CACxE,CAAC,CACL,CACJ,CAAC;IACN;IAEA,KAAK,MAAME,IAAI,IAAI9D,IAAI,CAAC+D,UAAU,CAACC,MAAM,CAAEF,IAAI,IAAKA,IAAI,CAAC9D,IAAI,CAACwC,GAAG,IAAI,IAAI,CAACyB,iBAAiB,CAACH,IAAI,CAAC9D,IAAI,CAACwC,GAAG,CAAC,CAAC,EAAE;MACzG,IAAI,CAAC0B,sBAAsB,CAACtE,KAAK,EAAEkE,IAAI,CAAC;IAC5C;IAEA9D,IAAI,CAAC+D,UAAU,CACVC,MAAM,CAAEF,IAAI,IAAKA,IAAI,CAAC9D,IAAI,CAACwC,GAAG,IAAI,CAAC,IAAI,CAACyB,iBAAiB,CAACH,IAAI,CAAC9D,IAAI,CAACwC,GAAG,CAAC,CAAC,CACzE2B,OAAO,CAAEL,IAAI,IAAKlE,KAAK,CAACwE,UAAU,CAAC,IAAI,CAAC5E,eAAe,CAAC6E,iBAAiB,CAACP,IAAI,CAAC,CAAC,CAAC;EAC1F;EAEQG,iBAAiB,CAACH,IAAe,EAAE;IACvC,OAAO,CAAC,CAACA,IAAI,CAACC,UAAU,CAACO,IAAI,CAAEC,CAAC;MAAA;MAAA,OAAK,gBAAAA,CAAC,CAACvE,IAAI,CAACwC,GAAG,gDAAV,YAAYX,IAAI,MAAK,WAAW;IAAA,EAAC;EAC1E;EAEQqB,kBAAkB,CAACtD,KAAsB,EAAEqD,KAAqB,EAAE;IAAA;IACtE,MAAMuB,SAAS,GAAGvB,KAAK,CAACwB,IAAI,CAACA,IAAI,8BAAIxB,KAAK,CAACwB,IAAI,CAACC,SAAS,oFAApB,sBAAsBlC,GAAG,2DAAzB,uBAA2BX,IAAI;IACpE,IAAI,CAAC2C,SAAS,EAAE;MACZ,MAAM,IAAIxC,gBAAW,CAAE,+BAA8BiB,KAAK,CAAC0B,UAAU,CAAC9C,IAAK,IAAGoB,KAAK,CAACpB,IAAK,EAAC,CAAC;IAC/F;IAEA,MAAM4C,IAAI,GAAG,IAAIG,6BAAc,CAACJ,SAAS,EAAEvB,KAAK,CAACwB,IAAI,CAACI,KAAK,EAAE5B,KAAK,CAACwB,IAAI,CAACK,QAAQ,CAAC;IAEjF,MAAMf,UAAU,GAAGd,KAAK,CAACc,UAAU,CAC9BC,MAAM,CAAEF,IAAI,IAAKA,IAAI,CAAC9D,IAAI,CAACwC,GAAG,IAAI,IAAI,CAACyB,iBAAiB,CAACH,IAAI,CAAC9D,IAAI,CAACwC,GAAG,CAAC,CAAC,CACxEI,GAAG,CAAEkB,IAAI,IAAK,IAAI,CAACiB,kBAAkB,CAACjB,IAAI,CAAC,CAAC;IAEjD,MAAMkB,mBAAmB,GAAG/B,KAAK,CAACc,UAAU,CAACC,MAAM,CAC9CF,IAAI,IAAK,CAACA,IAAI,CAAC9D,IAAI,CAACwC,GAAG,IAAI,CAAC,IAAI,CAACyB,iBAAiB,CAACH,IAAI,CAAC9D,IAAI,CAACwC,GAAG,CAAC,CACrE;IAED,MAAMyC,cAAc,GAAGD,mBAAmB,CAACpC,GAAG,CAAEkB,IAAI,IAAK,IAAI,CAACtE,eAAe,CAAC6E,iBAAiB,CAACP,IAAI,CAAC,CAAC;IAEtGlE,KAAK,CAAC2D,QAAQ,CAACN,KAAK,CAACpB,IAAI,EAAE4C,IAAI,EAAEV,UAAU,EAAEkB,cAAc,CAAC;EAChE;EAEQF,kBAAkB,CAACjB,IAA6B,EAAE;IACtD,OAAO,IAAIL,6BAAoB,CAC3B,IAAAyB,aAAQ,EAACpB,IAAI,CAAC9D,IAAI,CAAC,CAAC6B,IAAI,EACxBiC,IAAI,CAACrB,IAAI,CAACG,GAAG,CAAEuC,GAAG,IAAK,IAAI,CAACC,gBAAgB,CAACD,GAAG,CAAC,CAAC,CACrD;EACL;EAEQC,gBAAgB,CAACD,GAAiB,EAAsB;IAC5D,OAAO,IAAIzB,2BAAkB,CAACyB,GAAG,CAACtD,IAAI,EAAE,IAAI,CAACwD,qBAAqB,CAACF,GAAG,CAACpD,KAAK,CAAC,CAAC;EAClF;EAEQsD,qBAAqB,CAACC,IAAgB,EAA2B;IACrE,IAAI,IAAAC,kBAAa,EAACD,IAAI,CAAC,EAAE;MACrB,QAAQ,OAAOA,IAAI,CAACvD,KAAK;QACrB,KAAK,QAAQ;UACT,OAAO,IAAI4B,gCAAuB,CAAC,QAAQ,EAAE2B,IAAI,CAACvD,KAAK,CAAC;QAC5D,KAAK,QAAQ;UACT,OAAO,IAAI4B,gCAAuB,CAAC,QAAQ,EAAE2B,IAAI,CAACvD,KAAK,CAAC;QAC5D,KAAK,SAAS;UACV,OAAO,IAAI4B,gCAAuB,CAAC,SAAS,EAAE2B,IAAI,CAACvD,KAAK,CAAC;QAC7D;UACI,MAAM,IAAIC,gBAAW,CAAE,4BAA2B,OAAOsD,IAAI,CAACvD,KAAM,EAAC,CAAC;MAAC;IAEnF,CAAC,MAAM,IAAI,IAAAc,gBAAW,EAACyC,IAAI,CAAC,EAAE;MAC1B,OAAO,IAAI3B,gCAAuB,CAC9B,OAAO,EACP,IAAI6B,KAAK,CAAC,GAAGF,IAAI,CAACG,KAAK,CAAC7C,GAAG,CAAE8C,IAAI,IAAK,IAAI,CAACL,qBAAqB,CAACK,IAAI,CAAC,CAAC,CAAC,CAC3E;IACL,CAAC,MAAM,IAAI,IAAAC,oBAAe,EAACL,IAAI,CAAC,EAAE;MAC9B,OAAO,IAAI3B,gCAAuB,CAC9B,gBAAgB,EAChB,IAAIiC,6BAAoB,CACpB,IAAAV,aAAQ,EAACI,IAAI,CAACO,MAAM,CAAC,CAAChE,IAAI,EAC1ByD,IAAI,CAAC7C,IAAI,CAACG,GAAG,CAAEuC,GAAG,IAAK,IAAIW,gCAAuB,CAACX,GAAG,CAACtD,IAAI,EAAEsD,GAAG,CAACpD,KAAK,CAAC,CAAC,CAC3E,CACJ;IACL,CAAC,MAAM,IAAI,IAAAO,qBAAgB,EAACgD,IAAI,CAAC,EAAE;MAC/B;MACA,OAAO,IAAI3B,gCAAuB,CAAC,cAAc,EAAE,IAAI,CAACoC,gBAAgB,CAACT,IAAI,CAAC,CAAC;IACnF,CAAC,MAAM;MACH,MAAM,IAAItD,gBAAW,CAAE,mDAAkDsD,IAAI,CAACpF,KAAM,EAAC,CAAC;IAC1F;EACJ;EAEA6F,gBAAgB,CAACT,IAAoB,EAAsB;IACvD,OAAO,IAAIU,2BAAkB,CACzB,IAAAd,aAAQ,EAACI,IAAI,CAAC/C,QAAQ,CAAC,CAACV,IAAI,EAC5ByD,IAAI,CAAC7C,IAAI,CAACG,GAAG,CAAEuC,GAAG,IAAK;MACnB,IAAI,CAAC,IAAAI,kBAAa,EAACJ,GAAG,CAACpD,KAAK,CAAC,EAAE;QAC3B,MAAM,IAAIC,gBAAW,CAAC,wCAAwC,CAAC;MACnE;MACA,OAAO,IAAIiE,8BAAqB,CAACd,GAAG,CAACtD,IAAI,EAAEsD,GAAG,CAACpD,KAAK,CAACA,KAAK,CAAC;IAC/D,CAAC,CAAC,CACL;EACL;EAEQmC,sBAAsB,CAACtE,KAAsB,EAAEkE,IAAwB,EAAE;IAC7ElE,KAAK,CAACmE,UAAU,CAACmC,IAAI,CACjB,IAAIC,6BAAoB,CACpB,IAAAjB,aAAQ,EAACpB,IAAI,CAAC9D,IAAI,CAAC,CAAC6B,IAAI,EACxBiC,IAAI,CAACrB,IAAI,CAACG,GAAG,CAAEuC,GAAG,IAAK,IAAI,CAACC,gBAAgB,CAACD,GAAG,CAAC,CAAC,CACrD,CACJ;EACL;EAEQ7E,YAAY,CAACR,MAAmB,EAAEE,IAAU,EAAE;IAClDF,MAAM,CAACsG,OAAO,CACVpG,IAAI,CAAC6B,IAAI,EACT7B,IAAI,CAAC4B,MAAM,CAACgB,GAAG,CAAEjB,CAAC,IAAKA,CAAC,CAACE,IAAI,CAAC,CACjC;EACL;EAEQC,eAAe,CAACwD,IAAa,EAAuB;IACxD,OAAO,IAAAC,kBAAa,EAACD,IAAI,CAAC,IAAI,OAAOA,IAAI,CAACvD,KAAK,KAAK,QAAQ;EAChE;AACJ;AAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { Argument, AttributeArg, BinaryExpr, DataModelAttribute, DataModelFieldAttribute, Expression, InvocationExpr, LiteralExpr, MemberAccessExpr, ReferenceArg, ReferenceExpr, UnaryExpr } from '@zenstackhq/language/ast';
|
|
2
|
+
/**
|
|
3
|
+
* Options for the generator.
|
|
4
|
+
*/
|
|
5
|
+
export interface ZModelCodeOptions {
|
|
6
|
+
binaryExprNumberOfSpaces: number;
|
|
7
|
+
unaryExprNumberOfSpaces: number;
|
|
8
|
+
}
|
|
9
|
+
export default class ZModelCodeGenerator {
|
|
10
|
+
private readonly options;
|
|
11
|
+
constructor(options?: Partial<ZModelCodeOptions>);
|
|
12
|
+
generateAttribute(ast: DataModelAttribute | DataModelFieldAttribute): string;
|
|
13
|
+
generateAttributeArg(ast: AttributeArg): string;
|
|
14
|
+
generateExpression(ast: Expression): string;
|
|
15
|
+
generateLiteralExpr(ast: LiteralExpr): string;
|
|
16
|
+
generateUnaryExpr(ast: UnaryExpr): string;
|
|
17
|
+
generateBinaryExpr(ast: BinaryExpr): string;
|
|
18
|
+
generateReferenceExpr(ast: ReferenceExpr): string;
|
|
19
|
+
generateReferenceArg(ast: ReferenceArg): string;
|
|
20
|
+
generateMemberExpr(ast: MemberAccessExpr): string;
|
|
21
|
+
generateInvocationExpr(ast: InvocationExpr): string;
|
|
22
|
+
generateArgument(ast: Argument): string;
|
|
23
|
+
private get binaryExprSpace();
|
|
24
|
+
private get unaryExprSpace();
|
|
25
|
+
private isParenthesesNeededForBinaryExpr;
|
|
26
|
+
private isCollectionPredicateOperator;
|
|
27
|
+
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
7
|
+
var _ast = require("@zenstackhq/language/ast");
|
|
8
|
+
var _sdk = require("@zenstackhq/sdk");
|
|
9
|
+
class ZModelCodeGenerator {
|
|
10
|
+
constructor(options) {
|
|
11
|
+
this.options = {
|
|
12
|
+
binaryExprNumberOfSpaces: (options === null || options === void 0 ? void 0 : options.binaryExprNumberOfSpaces) ?? 1,
|
|
13
|
+
unaryExprNumberOfSpaces: (options === null || options === void 0 ? void 0 : options.unaryExprNumberOfSpaces) ?? 0
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
generateAttribute(ast) {
|
|
17
|
+
const args = ast.args.length ? `(${ast.args.map(x => this.generateAttributeArg(x)).join(', ')})` : '';
|
|
18
|
+
return `${(0, _sdk.resolved)(ast.decl).name}${args}`;
|
|
19
|
+
}
|
|
20
|
+
generateAttributeArg(ast) {
|
|
21
|
+
return this.generateExpression(ast.value);
|
|
22
|
+
}
|
|
23
|
+
generateExpression(ast) {
|
|
24
|
+
switch (ast.$type) {
|
|
25
|
+
case _ast.LiteralExpr:
|
|
26
|
+
return this.generateLiteralExpr(ast);
|
|
27
|
+
case _ast.UnaryExpr:
|
|
28
|
+
return this.generateUnaryExpr(ast);
|
|
29
|
+
case _ast.BinaryExpr:
|
|
30
|
+
return this.generateBinaryExpr(ast);
|
|
31
|
+
case _ast.ReferenceExpr:
|
|
32
|
+
return this.generateReferenceExpr(ast);
|
|
33
|
+
case _ast.MemberAccessExpr:
|
|
34
|
+
return this.generateMemberExpr(ast);
|
|
35
|
+
case _ast.InvocationExpr:
|
|
36
|
+
return this.generateInvocationExpr(ast);
|
|
37
|
+
case _ast.NullExpr:
|
|
38
|
+
case _ast.ThisExpr:
|
|
39
|
+
return ast.value;
|
|
40
|
+
default:
|
|
41
|
+
throw new Error(`Not implemented: ${ast.$type}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
generateLiteralExpr(ast) {
|
|
45
|
+
return typeof ast.value === 'string' ? `'${ast.value}'` : ast.value.toString();
|
|
46
|
+
}
|
|
47
|
+
generateUnaryExpr(ast) {
|
|
48
|
+
return `${ast.operator}${this.unaryExprSpace}${this.generateExpression(ast.operand)}`;
|
|
49
|
+
}
|
|
50
|
+
generateBinaryExpr(ast) {
|
|
51
|
+
const operator = ast.operator;
|
|
52
|
+
const isCollectionPredicate = this.isCollectionPredicateOperator(operator);
|
|
53
|
+
const rightExpr = this.generateExpression(ast.right);
|
|
54
|
+
const {
|
|
55
|
+
left: isLeftParenthesis,
|
|
56
|
+
right: isRightParenthesis
|
|
57
|
+
} = this.isParenthesesNeededForBinaryExpr(ast);
|
|
58
|
+
return `${isLeftParenthesis ? '(' : ''}${this.generateExpression(ast.left)}${isLeftParenthesis ? ')' : ''}${this.binaryExprSpace}${operator}${this.binaryExprSpace}${isRightParenthesis ? '(' : ''}${isCollectionPredicate ? `[${rightExpr}]` : rightExpr}${isRightParenthesis ? ')' : ''}`;
|
|
59
|
+
}
|
|
60
|
+
generateReferenceExpr(ast) {
|
|
61
|
+
var _ast$target$ref;
|
|
62
|
+
const args = ast.args.length ? `(${ast.args.map(x => this.generateReferenceArg(x)).join(', ')})` : '';
|
|
63
|
+
return `${(_ast$target$ref = ast.target.ref) === null || _ast$target$ref === void 0 ? void 0 : _ast$target$ref.name}${args}`;
|
|
64
|
+
}
|
|
65
|
+
generateReferenceArg(ast) {
|
|
66
|
+
return `${ast.name}:${ast.value}`;
|
|
67
|
+
}
|
|
68
|
+
generateMemberExpr(ast) {
|
|
69
|
+
var _ast$member$ref;
|
|
70
|
+
return `${this.generateExpression(ast.operand)}.${(_ast$member$ref = ast.member.ref) === null || _ast$member$ref === void 0 ? void 0 : _ast$member$ref.name}`;
|
|
71
|
+
}
|
|
72
|
+
generateInvocationExpr(ast) {
|
|
73
|
+
var _ast$function$ref;
|
|
74
|
+
return `${(_ast$function$ref = ast.function.ref) === null || _ast$function$ref === void 0 ? void 0 : _ast$function$ref.name}(${ast.args.map(x => this.generateArgument(x)).join(', ')})`;
|
|
75
|
+
}
|
|
76
|
+
generateArgument(ast) {
|
|
77
|
+
return `${ast.name && ':'} ${this.generateExpression(ast.value)}`;
|
|
78
|
+
}
|
|
79
|
+
get binaryExprSpace() {
|
|
80
|
+
return ' '.repeat(this.options.binaryExprNumberOfSpaces);
|
|
81
|
+
}
|
|
82
|
+
get unaryExprSpace() {
|
|
83
|
+
return ' '.repeat(this.options.unaryExprNumberOfSpaces);
|
|
84
|
+
}
|
|
85
|
+
isParenthesesNeededForBinaryExpr(ast) {
|
|
86
|
+
const result = {
|
|
87
|
+
left: false,
|
|
88
|
+
right: false
|
|
89
|
+
};
|
|
90
|
+
const operator = ast.operator;
|
|
91
|
+
const isCollectionPredicate = this.isCollectionPredicateOperator(operator);
|
|
92
|
+
const currentPriority = _ast.BinaryExprOperatorPriority[operator];
|
|
93
|
+
if (ast.left.$type === _ast.BinaryExpr && _ast.BinaryExprOperatorPriority[ast.left['operator']] < currentPriority) {
|
|
94
|
+
result.left = true;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* 1 collection predicate operator has [] around the right operand, no need to add parenthesis.
|
|
98
|
+
* 2 grammar is left associative, so if the right operand has the same priority still need to add parenthesis.
|
|
99
|
+
**/
|
|
100
|
+
if (!isCollectionPredicate && ast.right.$type === _ast.BinaryExpr && _ast.BinaryExprOperatorPriority[ast.right['operator']] <= currentPriority) {
|
|
101
|
+
result.right = true;
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
isCollectionPredicateOperator(op) {
|
|
106
|
+
return ['?', '!', '^'].includes(op);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.default = ZModelCodeGenerator;
|
|
110
|
+
//# sourceMappingURL=zmodel-code-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zmodel-code-generator.js","names":["ZModelCodeGenerator","constructor","options","binaryExprNumberOfSpaces","unaryExprNumberOfSpaces","generateAttribute","ast","args","length","map","x","generateAttributeArg","join","resolved","decl","name","generateExpression","value","$type","LiteralExpr","generateLiteralExpr","UnaryExpr","generateUnaryExpr","BinaryExpr","generateBinaryExpr","ReferenceExpr","generateReferenceExpr","MemberAccessExpr","generateMemberExpr","InvocationExpr","generateInvocationExpr","NullExpr","ThisExpr","Error","toString","operator","unaryExprSpace","operand","isCollectionPredicate","isCollectionPredicateOperator","rightExpr","right","left","isLeftParenthesis","isRightParenthesis","isParenthesesNeededForBinaryExpr","binaryExprSpace","generateReferenceArg","target","ref","member","function","generateArgument","repeat","result","currentPriority","BinaryExprOperatorPriority","op","includes"],"sources":["../../../src/plugins/zmodel-code/zmodel-code-generator.ts"],"sourcesContent":["import {\n Argument,\n AttributeArg,\n BinaryExpr,\n DataModelAttribute,\n DataModelFieldAttribute,\n Expression,\n InvocationExpr,\n LiteralExpr,\n MemberAccessExpr,\n NullExpr,\n ReferenceArg,\n ReferenceExpr,\n ThisExpr,\n UnaryExpr,\n BinaryExprOperatorPriority,\n} from '@zenstackhq/language/ast';\nimport { resolved } from '@zenstackhq/sdk';\n\n/**\n * Options for the generator.\n */\nexport interface ZModelCodeOptions {\n binaryExprNumberOfSpaces: number;\n unaryExprNumberOfSpaces: number;\n}\n\nexport default class ZModelCodeGenerator {\n private readonly options: ZModelCodeOptions;\n constructor(options?: Partial<ZModelCodeOptions>) {\n this.options = {\n binaryExprNumberOfSpaces: options?.binaryExprNumberOfSpaces ?? 1,\n unaryExprNumberOfSpaces: options?.unaryExprNumberOfSpaces ?? 0,\n };\n }\n generateAttribute(ast: DataModelAttribute | DataModelFieldAttribute): string {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generateAttributeArg(x)).join(', ')})` : '';\n return `${resolved(ast.decl).name}${args}`;\n }\n\n generateAttributeArg(ast: AttributeArg) {\n return this.generateExpression(ast.value);\n }\n\n generateExpression(ast: Expression): string {\n switch (ast.$type) {\n case LiteralExpr:\n return this.generateLiteralExpr(ast as LiteralExpr);\n case UnaryExpr:\n return this.generateUnaryExpr(ast as UnaryExpr);\n case BinaryExpr:\n return this.generateBinaryExpr(ast as BinaryExpr);\n case ReferenceExpr:\n return this.generateReferenceExpr(ast as ReferenceExpr);\n case MemberAccessExpr:\n return this.generateMemberExpr(ast as MemberAccessExpr);\n case InvocationExpr:\n return this.generateInvocationExpr(ast as InvocationExpr);\n case NullExpr:\n case ThisExpr:\n return (ast as NullExpr | ThisExpr).value;\n default:\n throw new Error(`Not implemented: ${ast.$type}`);\n }\n }\n\n generateLiteralExpr(ast: LiteralExpr) {\n return typeof ast.value === 'string' ? `'${ast.value}'` : ast.value.toString();\n }\n\n generateUnaryExpr(ast: UnaryExpr) {\n return `${ast.operator}${this.unaryExprSpace}${this.generateExpression(ast.operand)}`;\n }\n\n generateBinaryExpr(ast: BinaryExpr) {\n const operator = ast.operator;\n const isCollectionPredicate = this.isCollectionPredicateOperator(operator);\n const rightExpr = this.generateExpression(ast.right);\n\n const { left: isLeftParenthesis, right: isRightParenthesis } = this.isParenthesesNeededForBinaryExpr(ast);\n\n return `${isLeftParenthesis ? '(' : ''}${this.generateExpression(ast.left)}${isLeftParenthesis ? ')' : ''}${\n this.binaryExprSpace\n }${operator}${this.binaryExprSpace}${isRightParenthesis ? '(' : ''}${\n isCollectionPredicate ? `[${rightExpr}]` : rightExpr\n }${isRightParenthesis ? ')' : ''}`;\n }\n\n generateReferenceExpr(ast: ReferenceExpr) {\n const args = ast.args.length ? `(${ast.args.map((x) => this.generateReferenceArg(x)).join(', ')})` : '';\n return `${ast.target.ref?.name}${args}`;\n }\n\n generateReferenceArg(ast: ReferenceArg) {\n return `${ast.name}:${ast.value}`;\n }\n\n generateMemberExpr(ast: MemberAccessExpr) {\n return `${this.generateExpression(ast.operand)}.${ast.member.ref?.name}`;\n }\n\n generateInvocationExpr(ast: InvocationExpr) {\n return `${ast.function.ref?.name}(${ast.args.map((x) => this.generateArgument(x)).join(', ')})`;\n }\n\n generateArgument(ast: Argument) {\n return `${ast.name && ':'} ${this.generateExpression(ast.value)}`;\n }\n\n private get binaryExprSpace(): string {\n return ' '.repeat(this.options.binaryExprNumberOfSpaces);\n }\n\n private get unaryExprSpace(): string {\n return ' '.repeat(this.options.unaryExprNumberOfSpaces);\n }\n\n private isParenthesesNeededForBinaryExpr(ast: BinaryExpr): { left: boolean; right: boolean } {\n const result = { left: false, right: false };\n const operator = ast.operator;\n const isCollectionPredicate = this.isCollectionPredicateOperator(operator);\n\n const currentPriority = BinaryExprOperatorPriority[operator];\n\n if (\n ast.left.$type === BinaryExpr &&\n BinaryExprOperatorPriority[(ast.left as BinaryExpr)['operator']] < currentPriority\n ) {\n result.left = true;\n }\n /**\n * 1 collection predicate operator has [] around the right operand, no need to add parenthesis.\n * 2 grammar is left associative, so if the right operand has the same priority still need to add parenthesis.\n **/\n if (\n !isCollectionPredicate &&\n ast.right.$type === BinaryExpr &&\n BinaryExprOperatorPriority[(ast.right as BinaryExpr)['operator']] <= currentPriority\n ) {\n result.right = true;\n }\n\n return result;\n }\n\n private isCollectionPredicateOperator(op: BinaryExpr['operator']) {\n return ['?', '!', '^'].includes(op);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
// This is a sample model to get you started.
|
|
2
|
+
// Learn how to model you app: https://zenstack.dev/#/modeling-your-app.
|
|
3
|
+
|
|
4
|
+
/*
|
|
5
|
+
* A sample data source using local sqlite db.
|
|
6
|
+
* See how to use a different db: https://zenstack.dev/#/zmodel-data-source.
|
|
7
|
+
*/
|
|
8
|
+
datasource db {
|
|
9
|
+
provider = 'sqlite'
|
|
10
|
+
url = 'file:./todo.db'
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/*
|
|
14
|
+
* User model
|
|
15
|
+
*/
|
|
16
|
+
model User {
|
|
17
|
+
id String @id @default(cuid())
|
|
18
|
+
email String @unique @email
|
|
19
|
+
password String @password @omit @length(8, 16)
|
|
20
|
+
posts Post[]
|
|
21
|
+
|
|
22
|
+
// everybody can signup
|
|
23
|
+
@@allow('create', true)
|
|
24
|
+
|
|
25
|
+
// full access by self
|
|
26
|
+
@@allow('all', auth() == this)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/*
|
|
30
|
+
* Post model
|
|
31
|
+
*/
|
|
32
|
+
model Post {
|
|
33
|
+
id String @id @default(cuid())
|
|
34
|
+
createdAt DateTime @default(now())
|
|
35
|
+
updatedAt DateTime @updatedAt
|
|
36
|
+
title String @length(1, 256)
|
|
37
|
+
content String
|
|
38
|
+
published Boolean @default(false)
|
|
39
|
+
author User? @relation(fields: [authorId], references: [id])
|
|
40
|
+
authorId String?
|
|
41
|
+
|
|
42
|
+
// allow read for all signin users
|
|
43
|
+
@@allow('read', auth() != null && published)
|
|
44
|
+
|
|
45
|
+
// full access by author
|
|
46
|
+
@@allow('all', author == auth())
|
|
47
|
+
}
|
package/telemetry.js
CHANGED
|
@@ -4,14 +4,15 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.default = exports.Telemetry = void 0;
|
|
7
|
+
var _asyncExitHook = _interopRequireDefault(require("async-exit-hook"));
|
|
8
|
+
var _commander = require("commander");
|
|
9
|
+
var _cuid = _interopRequireDefault(require("cuid"));
|
|
7
10
|
var _mixpanel = require("mixpanel");
|
|
8
11
|
var _nodeMachineId = require("node-machine-id");
|
|
9
|
-
var _cuid = _interopRequireDefault(require("cuid"));
|
|
10
12
|
var os = _interopRequireWildcard(require("os"));
|
|
11
13
|
var _sleepPromise = _interopRequireDefault(require("sleep-promise"));
|
|
12
|
-
var _asyncExitHook = _interopRequireDefault(require("async-exit-hook"));
|
|
13
14
|
var _cliError = require("./cli/cli-error");
|
|
14
|
-
var
|
|
15
|
+
var _versionUtils = require("./utils/version-utils");
|
|
15
16
|
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
17
|
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
18
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
@@ -23,8 +24,7 @@ class Telemetry {
|
|
|
23
24
|
sessionid = (0, _cuid.default)();
|
|
24
25
|
trackingToken = process && process.env && process.env.TELEMETRY_TRACKING_TOKEN || "74944eb779d7d3b4ce185be843fde9fc";
|
|
25
26
|
_os = os.platform();
|
|
26
|
-
|
|
27
|
-
version = require('./package.json').version;
|
|
27
|
+
version = (0, _versionUtils.getVersion)();
|
|
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","
|
|
1
|
+
{"version":3,"file":"telemetry.js","names":["Telemetry","hostId","machineIdSync","sessionid","cuid","trackingToken","_os","os","platform","version","getVersion","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 exitHook from 'async-exit-hook';\nimport { CommanderError } from 'commander';\nimport cuid from 'cuid';\nimport { init, Mixpanel } from 'mixpanel';\nimport { machineIdSync } from 'node-machine-id';\nimport * as os from 'os';\nimport sleep from 'sleep-promise';\nimport { CliError } from './cli/cli-error';\nimport { getVersion } from './utils/version-utils';\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 private readonly version = getVersion();\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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"}
|
package/utils/exec-utils.d.ts
CHANGED
|
@@ -3,4 +3,4 @@ import { StdioOptions } from 'child_process';
|
|
|
3
3
|
/**
|
|
4
4
|
* Utility for executing command synchronously and prints outputs on current console
|
|
5
5
|
*/
|
|
6
|
-
export declare function execSync(cmd: string, stdio?: StdioOptions): void;
|
|
6
|
+
export declare function execSync(cmd: string, stdio?: StdioOptions, env?: Record<string, string>): void;
|
package/utils/exec-utils.js
CHANGED
|
@@ -8,10 +8,15 @@ var _child_process = require("child_process");
|
|
|
8
8
|
/**
|
|
9
9
|
* Utility for executing command synchronously and prints outputs on current console
|
|
10
10
|
*/
|
|
11
|
-
function execSync(cmd, stdio = 'inherit') {
|
|
11
|
+
function execSync(cmd, stdio = 'inherit', env) {
|
|
12
|
+
const mergedEnv = {
|
|
13
|
+
...process.env,
|
|
14
|
+
...env
|
|
15
|
+
};
|
|
12
16
|
(0, _child_process.execSync)(cmd, {
|
|
13
17
|
encoding: 'utf-8',
|
|
14
|
-
stdio
|
|
18
|
+
stdio,
|
|
19
|
+
env: mergedEnv
|
|
15
20
|
});
|
|
16
21
|
}
|
|
17
22
|
//# sourceMappingURL=exec-utils.js.map
|
package/utils/exec-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"exec-utils.js","names":["execSync","cmd","stdio","_exec","encoding"],"sources":["../../src/utils/exec-utils.ts"],"sourcesContent":["import { execSync as _exec, StdioOptions } from 'child_process';\n\n/**\n * Utility for executing command synchronously and prints outputs on current console\n */\nexport function execSync(cmd: string, stdio: StdioOptions = 'inherit'): void {\n _exec(cmd, { encoding: 'utf-8', stdio });\n}\n"],"mappings":";;;;;;AAAA;AAEA;AACA;AACA;AACO,SAASA,QAAQ,CAACC,GAAW,EAAEC,KAAmB,GAAG,SAAS,EAAQ;
|
|
1
|
+
{"version":3,"file":"exec-utils.js","names":["execSync","cmd","stdio","env","mergedEnv","process","_exec","encoding"],"sources":["../../src/utils/exec-utils.ts"],"sourcesContent":["import { execSync as _exec, StdioOptions } from 'child_process';\n\n/**\n * Utility for executing command synchronously and prints outputs on current console\n */\nexport function execSync(cmd: string, stdio: StdioOptions = 'inherit', env?: Record<string, string>): void {\n const mergedEnv = { ...process.env, ...env };\n _exec(cmd, { encoding: 'utf-8', stdio, env: mergedEnv });\n}\n"],"mappings":";;;;;;AAAA;AAEA;AACA;AACA;AACO,SAASA,QAAQ,CAACC,GAAW,EAAEC,KAAmB,GAAG,SAAS,EAAEC,GAA4B,EAAQ;EACvG,MAAMC,SAAS,GAAG;IAAE,GAAGC,OAAO,CAACF,GAAG;IAAE,GAAGA;EAAI,CAAC;EAC5C,IAAAG,uBAAK,EAACL,GAAG,EAAE;IAAEM,QAAQ,EAAE,OAAO;IAAEL,KAAK;IAAEC,GAAG,EAAEC;EAAU,CAAC,CAAC;AAC5D"}
|
package/utils/pkg-utils.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export declare type PackageManagers = 'npm' | 'yarn' | 'pnpm';
|
|
2
|
-
export declare function installPackage(pkg: string, dev: boolean, pkgManager?: PackageManagers | undefined, projectPath?: string): void;
|
|
2
|
+
export declare function installPackage(pkg: string, dev: boolean, pkgManager?: PackageManagers | undefined, tag?: string, projectPath?: string): void;
|
|
3
3
|
export declare function ensurePackage(pkg: string, dev: boolean, pkgManager?: PackageManagers | undefined, projectPath?: string): void;
|
package/utils/pkg-utils.js
CHANGED
|
@@ -18,18 +18,18 @@ function getPackageManager(projectPath = '.') {
|
|
|
18
18
|
return 'npm';
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
|
-
function installPackage(pkg, dev, pkgManager = undefined, projectPath = '.') {
|
|
21
|
+
function installPackage(pkg, dev, pkgManager = undefined, tag = 'latest', projectPath = '.') {
|
|
22
22
|
const manager = pkgManager ?? getPackageManager(projectPath);
|
|
23
23
|
console.log(`Installing package "${pkg}" with ${manager}`);
|
|
24
24
|
switch (manager) {
|
|
25
25
|
case 'yarn':
|
|
26
|
-
(0, _execUtils.execSync)(`yarn --cwd "${projectPath}" add ${pkg} ${dev ? ' --dev' : ''} --ignore-engines`);
|
|
26
|
+
(0, _execUtils.execSync)(`yarn --cwd "${projectPath}" add ${pkg}@${tag} ${dev ? ' --dev' : ''} --ignore-engines`);
|
|
27
27
|
break;
|
|
28
28
|
case 'pnpm':
|
|
29
|
-
(0, _execUtils.execSync)(`pnpm add -C "${projectPath}" ${dev ? ' --save-dev' : ''} ${pkg}`);
|
|
29
|
+
(0, _execUtils.execSync)(`pnpm add -C "${projectPath}" ${dev ? ' --save-dev' : ''} ${pkg}@${tag}`);
|
|
30
30
|
break;
|
|
31
31
|
default:
|
|
32
|
-
(0, _execUtils.execSync)(`npm install --prefix "${projectPath}" ${dev ? ' --save-dev' : ''} ${pkg}`);
|
|
32
|
+
(0, _execUtils.execSync)(`npm install --prefix "${projectPath}" ${dev ? ' --save-dev' : ''} ${pkg}@${tag}`);
|
|
33
33
|
break;
|
|
34
34
|
}
|
|
35
35
|
}
|
package/utils/pkg-utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pkg-utils.js","names":["getPackageManager","projectPath","fs","existsSync","path","join","installPackage","pkg","dev","pkgManager","undefined","manager","console","log","execSync","ensurePackage","require"],"sources":["../../src/utils/pkg-utils.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { execSync } from './exec-utils';\n\nexport type PackageManagers = 'npm' | 'yarn' | 'pnpm';\n\nfunction getPackageManager(projectPath = '.'): PackageManagers {\n if (fs.existsSync(path.join(projectPath, 'yarn.lock'))) {\n return 'yarn';\n } else if (fs.existsSync(path.join(projectPath, 'pnpm-lock.yaml'))) {\n return 'pnpm';\n } else {\n return 'npm';\n }\n}\n\nexport function installPackage(\n pkg: string,\n dev: boolean,\n pkgManager: PackageManagers | undefined = undefined,\n projectPath = '.'\n) {\n const manager = pkgManager ?? getPackageManager(projectPath);\n console.log(`Installing package \"${pkg}\" with ${manager}`);\n switch (manager) {\n case 'yarn':\n execSync(`yarn --cwd \"${projectPath}\" add ${pkg} ${dev ? ' --dev' : ''} --ignore-engines`);\n break;\n\n case 'pnpm':\n execSync(`pnpm add -C \"${projectPath}\" ${dev ? ' --save-dev' : ''} ${pkg}`);\n break;\n\n default:\n execSync(`npm install --prefix \"${projectPath}\" ${dev ? ' --save-dev' : ''} ${pkg}`);\n break;\n }\n}\n\nexport function ensurePackage(\n pkg: string,\n dev: boolean,\n pkgManager: PackageManagers | undefined = undefined,\n projectPath = '.'\n) {\n try {\n require(pkg);\n } catch {\n installPackage(pkg, dev, pkgManager, projectPath);\n }\n}\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AAAwC;AAIxC,SAASA,iBAAiB,CAACC,WAAW,GAAG,GAAG,EAAmB;EAC3D,IAAIC,WAAE,CAACC,UAAU,CAACC,aAAI,CAACC,IAAI,CAACJ,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE;IACpD,OAAO,MAAM;EACjB,CAAC,MAAM,IAAIC,WAAE,CAACC,UAAU,CAACC,aAAI,CAACC,IAAI,CAACJ,WAAW,EAAE,gBAAgB,CAAC,CAAC,EAAE;IAChE,OAAO,MAAM;EACjB,CAAC,MAAM;IACH,OAAO,KAAK;EAChB;AACJ;AAEO,SAASK,cAAc,CAC1BC,GAAW,EACXC,GAAY,EACZC,UAAuC,GAAGC,SAAS,
|
|
1
|
+
{"version":3,"file":"pkg-utils.js","names":["getPackageManager","projectPath","fs","existsSync","path","join","installPackage","pkg","dev","pkgManager","undefined","tag","manager","console","log","execSync","ensurePackage","require"],"sources":["../../src/utils/pkg-utils.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { execSync } from './exec-utils';\n\nexport type PackageManagers = 'npm' | 'yarn' | 'pnpm';\n\nfunction getPackageManager(projectPath = '.'): PackageManagers {\n if (fs.existsSync(path.join(projectPath, 'yarn.lock'))) {\n return 'yarn';\n } else if (fs.existsSync(path.join(projectPath, 'pnpm-lock.yaml'))) {\n return 'pnpm';\n } else {\n return 'npm';\n }\n}\n\nexport function installPackage(\n pkg: string,\n dev: boolean,\n pkgManager: PackageManagers | undefined = undefined,\n tag = 'latest',\n projectPath = '.'\n) {\n const manager = pkgManager ?? getPackageManager(projectPath);\n console.log(`Installing package \"${pkg}\" with ${manager}`);\n switch (manager) {\n case 'yarn':\n execSync(`yarn --cwd \"${projectPath}\" add ${pkg}@${tag} ${dev ? ' --dev' : ''} --ignore-engines`);\n break;\n\n case 'pnpm':\n execSync(`pnpm add -C \"${projectPath}\" ${dev ? ' --save-dev' : ''} ${pkg}@${tag}`);\n break;\n\n default:\n execSync(`npm install --prefix \"${projectPath}\" ${dev ? ' --save-dev' : ''} ${pkg}@${tag}`);\n break;\n }\n}\n\nexport function ensurePackage(\n pkg: string,\n dev: boolean,\n pkgManager: PackageManagers | undefined = undefined,\n projectPath = '.'\n) {\n try {\n require(pkg);\n } catch {\n installPackage(pkg, dev, pkgManager, projectPath);\n }\n}\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AAAwC;AAIxC,SAASA,iBAAiB,CAACC,WAAW,GAAG,GAAG,EAAmB;EAC3D,IAAIC,WAAE,CAACC,UAAU,CAACC,aAAI,CAACC,IAAI,CAACJ,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE;IACpD,OAAO,MAAM;EACjB,CAAC,MAAM,IAAIC,WAAE,CAACC,UAAU,CAACC,aAAI,CAACC,IAAI,CAACJ,WAAW,EAAE,gBAAgB,CAAC,CAAC,EAAE;IAChE,OAAO,MAAM;EACjB,CAAC,MAAM;IACH,OAAO,KAAK;EAChB;AACJ;AAEO,SAASK,cAAc,CAC1BC,GAAW,EACXC,GAAY,EACZC,UAAuC,GAAGC,SAAS,EACnDC,GAAG,GAAG,QAAQ,EACdV,WAAW,GAAG,GAAG,EACnB;EACE,MAAMW,OAAO,GAAGH,UAAU,IAAIT,iBAAiB,CAACC,WAAW,CAAC;EAC5DY,OAAO,CAACC,GAAG,CAAE,uBAAsBP,GAAI,UAASK,OAAQ,EAAC,CAAC;EAC1D,QAAQA,OAAO;IACX,KAAK,MAAM;MACP,IAAAG,mBAAQ,EAAE,eAAcd,WAAY,SAAQM,GAAI,IAAGI,GAAI,IAAGH,GAAG,GAAG,QAAQ,GAAG,EAAG,mBAAkB,CAAC;MACjG;IAEJ,KAAK,MAAM;MACP,IAAAO,mBAAQ,EAAE,gBAAed,WAAY,KAAIO,GAAG,GAAG,aAAa,GAAG,EAAG,IAAGD,GAAI,IAAGI,GAAI,EAAC,CAAC;MAClF;IAEJ;MACI,IAAAI,mBAAQ,EAAE,yBAAwBd,WAAY,KAAIO,GAAG,GAAG,aAAa,GAAG,EAAG,IAAGD,GAAI,IAAGI,GAAI,EAAC,CAAC;MAC3F;EAAM;AAElB;AAEO,SAASK,aAAa,CACzBT,GAAW,EACXC,GAAY,EACZC,UAAuC,GAAGC,SAAS,EACnDT,WAAW,GAAG,GAAG,EACnB;EACE,IAAI;IACAgB,OAAO,CAACV,GAAG,CAAC;EAChB,CAAC,CAAC,MAAM;IACJD,cAAc,CAACC,GAAG,EAAEC,GAAG,EAAEC,UAAU,EAAER,WAAW,CAAC;EACrD;AACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getVersion(): any;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getVersion = getVersion;
|
|
7
|
+
/* eslint-disable @typescript-eslint/no-var-requires */
|
|
8
|
+
function getVersion() {
|
|
9
|
+
try {
|
|
10
|
+
return require('../package.json').version;
|
|
11
|
+
} catch {
|
|
12
|
+
return require('../../package.json').version;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=version-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version-utils.js","names":["getVersion","require","version"],"sources":["../../src/utils/version-utils.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nexport function getVersion() {\n try {\n return require('../package.json').version;\n } catch {\n return require('../../package.json').version;\n }\n}\n"],"mappings":";;;;;;AAAA;AACO,SAASA,UAAU,GAAG;EACzB,IAAI;IACA,OAAOC,OAAO,CAAC,iBAAiB,CAAC,CAACC,OAAO;EAC7C,CAAC,CAAC,MAAM;IACJ,OAAOD,OAAO,CAAC,oBAAoB,CAAC,CAACC,OAAO;EAChD;AACJ"}
|