zenstack 1.0.0-alpha.23 → 1.0.0-alpha.25

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.
Files changed (84) hide show
  1. package/README.md +79 -9
  2. package/cli/cli-error.js +3 -5
  3. package/cli/cli-error.js.map +1 -1
  4. package/cli/cli-util.js +123 -105
  5. package/cli/cli-util.js.map +1 -1
  6. package/cli/index.js +105 -63
  7. package/cli/index.js.map +1 -1
  8. package/cli/plugin-runner.js +130 -127
  9. package/cli/plugin-runner.js.map +1 -1
  10. package/language-server/constants.js +5 -13
  11. package/language-server/constants.js.map +1 -1
  12. package/language-server/main.js +8 -15
  13. package/language-server/main.js.map +1 -1
  14. package/language-server/types.js +3 -1
  15. package/language-server/types.js.map +1 -1
  16. package/language-server/utils.js +13 -16
  17. package/language-server/utils.js.map +1 -1
  18. package/language-server/validator/attribute-validator.js +3 -7
  19. package/language-server/validator/attribute-validator.js.map +1 -1
  20. package/language-server/validator/datamodel-validator.js +293 -347
  21. package/language-server/validator/datamodel-validator.js.map +1 -1
  22. package/language-server/validator/datasource-validator.js +61 -71
  23. package/language-server/validator/datasource-validator.js.map +1 -1
  24. package/language-server/validator/enum-validator.js +6 -10
  25. package/language-server/validator/enum-validator.js.map +1 -1
  26. package/language-server/validator/expression-validator.js +25 -31
  27. package/language-server/validator/expression-validator.js.map +1 -1
  28. package/language-server/validator/schema-validator.js +18 -25
  29. package/language-server/validator/schema-validator.js.map +1 -1
  30. package/language-server/validator/utils.js +86 -85
  31. package/language-server/validator/utils.js.map +1 -1
  32. package/language-server/validator/zmodel-validator.js +55 -58
  33. package/language-server/validator/zmodel-validator.js.map +1 -1
  34. package/language-server/zmodel-formatter.js +40 -21
  35. package/language-server/zmodel-formatter.js.map +1 -1
  36. package/language-server/zmodel-linker.js +328 -331
  37. package/language-server/zmodel-linker.js.map +1 -1
  38. package/language-server/zmodel-module.js +50 -59
  39. package/language-server/zmodel-module.js.map +1 -1
  40. package/language-server/zmodel-scope.js +35 -25
  41. package/language-server/zmodel-scope.js.map +1 -1
  42. package/language-server/zmodel-workspace-manager.js +30 -18
  43. package/language-server/zmodel-workspace-manager.js.map +1 -1
  44. package/package.json +8 -12
  45. package/plugins/access-policy/expression-writer.js +301 -292
  46. package/plugins/access-policy/expression-writer.js.map +1 -1
  47. package/plugins/access-policy/index.js +20 -11
  48. package/plugins/access-policy/index.js.map +1 -1
  49. package/plugins/access-policy/policy-guard-generator.js +327 -321
  50. package/plugins/access-policy/policy-guard-generator.js.map +1 -1
  51. package/plugins/access-policy/typescript-expression-transformer.js +94 -95
  52. package/plugins/access-policy/typescript-expression-transformer.js.map +1 -1
  53. package/plugins/access-policy/utils.js +7 -9
  54. package/plugins/access-policy/utils.js.map +1 -1
  55. package/plugins/access-policy/zod-schema-generator.js +143 -159
  56. package/plugins/access-policy/zod-schema-generator.js.map +1 -1
  57. package/plugins/model-meta/index.js +97 -102
  58. package/plugins/model-meta/index.js.map +1 -1
  59. package/plugins/plugin-utils.js +34 -40
  60. package/plugins/plugin-utils.js.map +1 -1
  61. package/plugins/prisma/indent-string.js +4 -8
  62. package/plugins/prisma/indent-string.js.map +1 -1
  63. package/plugins/prisma/index.js +20 -11
  64. package/plugins/prisma/index.js.map +1 -1
  65. package/plugins/prisma/prisma-builder.js +235 -213
  66. package/plugins/prisma/prisma-builder.js.map +1 -1
  67. package/plugins/prisma/schema-generator.js +205 -192
  68. package/plugins/prisma/schema-generator.js.map +1 -1
  69. package/plugins/prisma/zmodel-code-generator.js +109 -114
  70. package/plugins/prisma/zmodel-code-generator.js.map +1 -1
  71. package/telemetry.js +107 -90
  72. package/telemetry.js.map +1 -1
  73. package/types.js +3 -1
  74. package/types.js.map +1 -1
  75. package/utils/ast-utils.js +67 -67
  76. package/utils/ast-utils.js.map +1 -1
  77. package/utils/exec-utils.js +6 -15
  78. package/utils/exec-utils.js.map +1 -1
  79. package/utils/pkg-utils.js +38 -35
  80. package/utils/pkg-utils.js.map +1 -1
  81. package/utils/version-utils.js +9 -10
  82. package/utils/version-utils.js.map +1 -1
  83. package/global.d.js +0 -1
  84. package/global.d.js.map +0 -1
package/README.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <div align="center">
2
- <img src="https://user-images.githubusercontent.com/104139426/204459273-35c65630-9faf-42bb-bd2c-07c1580a0772.png" style="max-width: 512px; width: 100%; height: auto; margin-bottom: 1rem;"
2
+ <img src="https://user-images.githubusercontent.com/104139426/214809937-4ed30485-a683-4fea-b737-928c48e86fd7.png" style="max-width: 512px; width: 100%; height: auto; margin-bottom: 1rem;"
3
3
  >
4
4
  <div></div>
5
5
  <a href="https://www.npmjs.com/package/zenstack">
@@ -19,29 +19,99 @@
19
19
 
20
20
  ## What it is
21
21
 
22
- ZenStack is a toolkit for building secure CRUD apps with Next.js + Typescript. It lets you define data models, relations and access policies all in one place, and generates database schema, backend CRUD services and frontend React hooks for you automatically.
22
+ ZenStack is a toolkit that simplifies the development of a web app's backend. It supercharges [Prisma ORM](https://prisma.io) with a powerful access control layer and unleashes its full potential for web development.
23
23
 
24
24
  Our goal is to let you save time writing boilerplate code and focus on building real features!
25
25
 
26
+ ## How it works
27
+
28
+ ZenStack extended Prisma schema language for supporting custom attributes and functions and, based on that, implemented a flexible access control layer around Prisma.
29
+
30
+ ```prisma
31
+ // schema.zmodel
32
+
33
+ model Post {
34
+ id String @id
35
+ title String
36
+ published Boolean @default(false)
37
+ author User @relation(fields: [authorId], references: [id])
38
+ authorId String
39
+
40
+ // 🔐 allow logged-in users to read published posts
41
+ @@allow('read', auth() != null && published)
42
+
43
+ // 🔐 allow full CRUD by author
44
+ @@allow('all', author == auth())
45
+ }
46
+ ```
47
+
48
+ At runtime, transparent proxies are created around Prisma clients for intercepting queries and mutations to enforce access policies. Moreover, framework integration packages help you wrap an access-control-enabled Prisma client into backend APIs that can be safely called from the frontend.
49
+
50
+ ```ts
51
+ // Next.js example: pages/api/model/[...path].ts
52
+
53
+ import { requestHandler } from '@zenstackhq/next';
54
+ import { withPolicy } from '@zenstackhq/runtime';
55
+ import { getSessionUser } from '@lib/auth';
56
+ import { prisma } from '@lib/db';
57
+
58
+ export default requestHandler({
59
+ getPrisma: (req, res) => withPolicy(prisma, { user: getSessionUser(req, res) }),
60
+ });
61
+ ```
62
+
63
+ Plugins can generate strong-typed client libraries that talk to the APIs:
64
+
65
+ ```tsx
66
+ // React example: components/MyPosts.tsx
67
+
68
+ import { usePost } from '@lib/hooks';
69
+
70
+ const MyPosts = () => {
71
+ // Post CRUD hooks
72
+ const { findMany } = usePost();
73
+
74
+ // list all posts that're visible to the current user, together with their authors
75
+ const { data: posts } = findMany({
76
+ include: { author: true },
77
+ orderBy: { createdAt: 'desc' },
78
+ });
79
+
80
+ return (
81
+ <ul>
82
+ {posts?.map((post) => (
83
+ <li key={post.id}>
84
+ {post.title} by {post.author.name}
85
+ </li>
86
+ ))}
87
+ </ul>
88
+ );
89
+ };
90
+ ```
91
+
26
92
  ## Links
27
93
 
28
- - [Documentation](https://zenstack.dev)
94
+ - [Home](https://zenstack.dev)
95
+ - [Documentation](https://zenstack.dev/docs)
29
96
  - [Community chat](https://go.zenstack.dev/chat)
30
97
  - [Twitter](https://twitter.com/zenstackhq)
31
98
  - [Blog](https://dev.to/zenstack)
32
99
 
33
100
  ## Features
34
101
 
35
- - Intuitive data & authorization modeling language
36
- - Generating RESTful CRUD services and React hooks
102
+ - Access control and data validation rules right inside your Prisma schema
103
+ - Auto-generated RESTful API and client library
37
104
  - End-to-end type safety
38
- - Support for all major relational databases
39
- - Integration with authentication libraries (like [NextAuth](https://next-auth.js.org/) and [iron-session](https://www.npmjs.com/package/iron-session))
40
- - [VSCode extension](https://marketplace.visualstudio.com/items?itemName=zenstack.zenstack) for model authoring
105
+ - Extensible: custom attributes, functions, and a plugin system
106
+ - Framework agnostic
107
+ - Uncompromised performance
41
108
 
42
109
  ## Examples
43
110
 
44
- Check out the [Collaborative Todo App](https://zenstack-todo.vercel.app/) for a running example. You can find the source code [here](https://github.com/zenstackhq/zenstack/tree/main/samples/todo).
111
+ Check out the [Collaborative Todo App](https://zenstack-todo.vercel.app/) for a running example. You can find the source code below:
112
+
113
+ - [Next.js + React hooks implementation](https://github.com/zenstackhq/sample-todo-nextjs)
114
+ - [Next.js + tRPC implementation](https://github.com/zenstackhq/sample-todo-trpc)
45
115
 
46
116
  ## Community
47
117
 
package/cli/cli-error.js CHANGED
@@ -1,12 +1,10 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
2
+ Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.CliError = void 0;
7
4
  /**
8
5
  * Indicating an error during CLI execution
9
6
  */
10
- class CliError extends Error {}
7
+ class CliError extends Error {
8
+ }
11
9
  exports.CliError = CliError;
12
10
  //# sourceMappingURL=cli-error.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-error.js","names":["CliError","Error"],"sources":["../../src/cli/cli-error.ts"],"sourcesContent":["/**\n * Indicating an error during CLI execution\n */\nexport class CliError extends Error {}\n"],"mappings":";;;;;;AAAA;AACA;AACA;AACO,MAAMA,QAAQ,SAASC,KAAK,CAAC;AAAE"}
1
+ {"version":3,"file":"cli-error.js","sourceRoot":"","sources":["../../src/cli/cli-error.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACH,MAAa,QAAS,SAAQ,KAAK;CAAG;AAAtC,4BAAsC"}
package/cli/cli-util.js CHANGED
@@ -1,123 +1,141 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.initProject = initProject;
7
- exports.loadDocument = loadDocument;
8
- exports.runPlugins = runPlugins;
9
- var _sdk = require("@zenstackhq/sdk");
10
- var _colors = _interopRequireDefault(require("colors"));
11
- var _fs = _interopRequireDefault(require("fs"));
12
- var _node = require("langium/node");
13
- var _path = _interopRequireDefault(require("path"));
14
- var _vscodeUri = require("vscode-uri");
15
- var _constants = require("../language-server/constants");
16
- var _zmodelModule = require("../language-server/zmodel-module");
17
- var _pkgUtils = require("../utils/pkg-utils");
18
- var _cliError = require("./cli-error");
19
- var _pluginRunner = require("./plugin-runner");
20
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.runPlugins = exports.loadDocument = exports.initProject = void 0;
16
+ const sdk_1 = require("@zenstackhq/sdk");
17
+ const colors_1 = __importDefault(require("colors"));
18
+ const fs_1 = __importDefault(require("fs"));
19
+ const node_1 = require("langium/node");
20
+ const path_1 = __importDefault(require("path"));
21
+ const vscode_uri_1 = require("vscode-uri");
22
+ const constants_1 = require("../language-server/constants");
23
+ const zmodel_module_1 = require("../language-server/zmodel-module");
24
+ const pkg_utils_1 = require("../utils/pkg-utils");
25
+ const cli_error_1 = require("./cli-error");
26
+ const plugin_runner_1 = require("./plugin-runner");
21
27
  /**
22
28
  * Initializes an existing project for ZenStack
23
29
  */
24
- async function initProject(projectPath, prismaSchema, packageManager, tag) {
25
- if (!_fs.default.existsSync(projectPath)) {
26
- console.error(`Path does not exist: ${projectPath}`);
27
- throw new _cliError.CliError('project path does not exist');
28
- }
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');
34
- }
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;
51
- }
52
- }
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)}
30
+ function initProject(projectPath, prismaSchema, packageManager, tag) {
31
+ return __awaiter(this, void 0, void 0, function* () {
32
+ if (!fs_1.default.existsSync(projectPath)) {
33
+ console.error(`Path does not exist: ${projectPath}`);
34
+ throw new cli_error_1.CliError('project path does not exist');
35
+ }
36
+ const defaultPrismaSchemaLocation = './prisma/schema.prisma';
37
+ if (prismaSchema) {
38
+ if (!fs_1.default.existsSync(prismaSchema)) {
39
+ console.error(`Prisma schema file does not exist: ${prismaSchema}`);
40
+ throw new cli_error_1.CliError('prisma schema does not exist');
41
+ }
42
+ }
43
+ else if (fs_1.default.existsSync(defaultPrismaSchemaLocation)) {
44
+ prismaSchema = defaultPrismaSchemaLocation;
45
+ }
46
+ const zmodelFile = path_1.default.join(projectPath, './schema.zmodel');
47
+ let sampleModelGenerated = false;
48
+ if (fs_1.default.existsSync(zmodelFile)) {
49
+ console.warn(`ZenStack model already exists at ${zmodelFile}, not generating a new one.`);
50
+ }
51
+ else {
52
+ if (prismaSchema) {
53
+ // copy over schema.prisma
54
+ fs_1.default.copyFileSync(prismaSchema, zmodelFile);
55
+ }
56
+ else {
57
+ // create a new model
58
+ const starterContent = fs_1.default.readFileSync(path_1.default.join(__dirname, '../res/starter.zmodel'), 'utf-8');
59
+ fs_1.default.writeFileSync(zmodelFile, starterContent);
60
+ sampleModelGenerated = true;
61
+ }
62
+ }
63
+ (0, pkg_utils_1.installPackage)('zenstack', true, packageManager, tag, projectPath);
64
+ (0, pkg_utils_1.installPackage)('@zenstackhq/runtime', false, packageManager, tag, projectPath);
65
+ if (sampleModelGenerated) {
66
+ console.log(`Sample model generated at: ${colors_1.default.blue(zmodelFile)}
57
67
 
58
68
  Please check the following guide on how to model your app:
59
69
  https://zenstack.dev/#/modeling-your-app.`);
60
- } else {
61
- console.log(`Your current Prisma schema "${prismaSchema}" has been copied to "${zmodelFile}".
70
+ }
71
+ else {
72
+ console.log(`Your current Prisma schema "${prismaSchema}" has been copied to "${zmodelFile}".
62
73
  Moving forward please edit this file and run "zenstack generate" to regenerate Prisma schema.`);
63
- }
64
- console.log(_colors.default.green('\nProject initialized successfully!'));
74
+ }
75
+ console.log(colors_1.default.green('\nProject initialized successfully!'));
76
+ });
65
77
  }
66
-
78
+ exports.initProject = initProject;
67
79
  /**
68
80
  * Loads a zmodel document from a file.
69
81
  * @param fileName File name
70
82
  * @param services Language services
71
83
  * @returns Parsed and validated AST
72
84
  */
73
- async function loadDocument(fileName, services) {
74
- const extensions = services.LanguageMetaData.fileExtensions;
75
- if (!extensions.includes(_path.default.extname(fileName))) {
76
- console.error(_colors.default.yellow(`Please choose a file with extension: ${extensions}.`));
77
- throw new _cliError.CliError('invalid schema file');
78
- }
79
- if (!_fs.default.existsSync(fileName)) {
80
- console.error(_colors.default.red(`File ${fileName} does not exist.`));
81
- throw new _cliError.CliError('schema file does not exist');
82
- }
83
-
84
- // load standard library
85
- const stdLib = services.shared.workspace.LangiumDocuments.getOrCreateDocument(_vscodeUri.URI.file(_path.default.resolve(_path.default.join(__dirname, '../res', _constants.STD_LIB_MODULE_NAME))));
86
-
87
- // load the document
88
- const document = services.shared.workspace.LangiumDocuments.getOrCreateDocument(_vscodeUri.URI.file(_path.default.resolve(fileName)));
89
-
90
- // build the document together with standard library
91
- await services.shared.workspace.DocumentBuilder.build([stdLib, document], {
92
- validationChecks: 'all'
93
- });
94
- const validationErrors = (document.diagnostics ?? []).filter(e => e.severity === 1);
95
- if (validationErrors.length > 0) {
96
- console.error(_colors.default.red('Validation errors:'));
97
- for (const validationError of validationErrors) {
98
- console.error(_colors.default.red(`line ${validationError.range.start.line + 1}: ${validationError.message} [${document.textDocument.getText(validationError.range)}]`));
99
- }
100
- throw new _cliError.CliError('schema validation errors');
101
- }
102
- return document.parseResult.value;
85
+ function loadDocument(fileName, services) {
86
+ var _a;
87
+ return __awaiter(this, void 0, void 0, function* () {
88
+ const extensions = services.LanguageMetaData.fileExtensions;
89
+ if (!extensions.includes(path_1.default.extname(fileName))) {
90
+ console.error(colors_1.default.yellow(`Please choose a file with extension: ${extensions}.`));
91
+ throw new cli_error_1.CliError('invalid schema file');
92
+ }
93
+ if (!fs_1.default.existsSync(fileName)) {
94
+ console.error(colors_1.default.red(`File ${fileName} does not exist.`));
95
+ throw new cli_error_1.CliError('schema file does not exist');
96
+ }
97
+ // load standard library
98
+ const stdLib = services.shared.workspace.LangiumDocuments.getOrCreateDocument(vscode_uri_1.URI.file(path_1.default.resolve(path_1.default.join(__dirname, '../res', constants_1.STD_LIB_MODULE_NAME))));
99
+ // load the document
100
+ const document = services.shared.workspace.LangiumDocuments.getOrCreateDocument(vscode_uri_1.URI.file(path_1.default.resolve(fileName)));
101
+ // build the document together with standard library
102
+ yield services.shared.workspace.DocumentBuilder.build([stdLib, document], {
103
+ validationChecks: 'all',
104
+ });
105
+ const validationErrors = ((_a = document.diagnostics) !== null && _a !== void 0 ? _a : []).filter((e) => e.severity === 1);
106
+ if (validationErrors.length > 0) {
107
+ console.error(colors_1.default.red('Validation errors:'));
108
+ for (const validationError of validationErrors) {
109
+ console.error(colors_1.default.red(`line ${validationError.range.start.line + 1}: ${validationError.message} [${document.textDocument.getText(validationError.range)}]`));
110
+ }
111
+ throw new cli_error_1.CliError('schema validation errors');
112
+ }
113
+ return document.parseResult.value;
114
+ });
103
115
  }
104
- async function runPlugins(options) {
105
- const services = (0, _zmodelModule.createZModelServices)(_node.NodeFileSystem).ZModel;
106
- const model = await loadDocument(options.schema, services);
107
- const context = {
108
- schema: model,
109
- schemaPath: _path.default.resolve(options.schema),
110
- outDir: _path.default.dirname(options.schema)
111
- };
112
- try {
113
- await new _pluginRunner.PluginRunner().run(context);
114
- } catch (err) {
115
- if (err instanceof _sdk.PluginError) {
116
- console.error(_colors.default.red(err.message));
117
- throw new _cliError.CliError(err.message);
118
- } else {
119
- throw err;
120
- }
121
- }
116
+ exports.loadDocument = loadDocument;
117
+ function runPlugins(options) {
118
+ return __awaiter(this, void 0, void 0, function* () {
119
+ const services = (0, zmodel_module_1.createZModelServices)(node_1.NodeFileSystem).ZModel;
120
+ const model = yield loadDocument(options.schema, services);
121
+ const context = {
122
+ schema: model,
123
+ schemaPath: path_1.default.resolve(options.schema),
124
+ outDir: path_1.default.dirname(options.schema),
125
+ };
126
+ try {
127
+ yield new plugin_runner_1.PluginRunner().run(context);
128
+ }
129
+ catch (err) {
130
+ if (err instanceof sdk_1.PluginError) {
131
+ console.error(colors_1.default.red(err.message));
132
+ throw new cli_error_1.CliError(err.message);
133
+ }
134
+ else {
135
+ throw err;
136
+ }
137
+ }
138
+ });
122
139
  }
140
+ exports.runPlugins = runPlugins;
123
141
  //# sourceMappingURL=cli-util.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli-util.js","names":["initProject","projectPath","prismaSchema","packageManager","tag","fs","existsSync","console","error","CliError","defaultPrismaSchemaLocation","zmodelFile","path","join","sampleModelGenerated","warn","copyFileSync","starterContent","readFileSync","__dirname","writeFileSync","installPackage","log","colors","blue","green","loadDocument","fileName","services","extensions","LanguageMetaData","fileExtensions","includes","extname","yellow","red","stdLib","shared","workspace","LangiumDocuments","getOrCreateDocument","URI","file","resolve","STD_LIB_MODULE_NAME","document","DocumentBuilder","build","validationChecks","validationErrors","diagnostics","filter","e","severity","length","validationError","range","start","line","message","textDocument","getText","parseResult","value","runPlugins","options","createZModelServices","NodeFileSystem","ZModel","model","schema","context","schemaPath","outDir","dirname","PluginRunner","run","err","PluginError"],"sources":["../../src/cli/cli-util.ts"],"sourcesContent":["import { Model } from '@zenstackhq/language/ast';\nimport { PluginError } from '@zenstackhq/sdk';\nimport colors from 'colors';\nimport fs from 'fs';\nimport { LangiumServices } from 'langium';\nimport { NodeFileSystem } from 'langium/node';\nimport path from 'path';\nimport { URI } from 'vscode-uri';\nimport { STD_LIB_MODULE_NAME } from '../language-server/constants';\nimport { createZModelServices } from '../language-server/zmodel-module';\nimport { Context } from '../types';\nimport { installPackage, PackageManagers } from '../utils/pkg-utils';\nimport { CliError } from './cli-error';\nimport { PluginRunner } from './plugin-runner';\n\n/**\n * Initializes an existing project for ZenStack\n */\nexport async function initProject(\n projectPath: string,\n prismaSchema: string | undefined,\n packageManager: PackageManagers | undefined,\n tag: string\n) {\n if (!fs.existsSync(projectPath)) {\n console.error(`Path does not exist: ${projectPath}`);\n throw new CliError('project path does not exist');\n }\n\n const defaultPrismaSchemaLocation = './prisma/schema.prisma';\n if (prismaSchema) {\n if (!fs.existsSync(prismaSchema)) {\n console.error(`Prisma schema file does not exist: ${prismaSchema}`);\n throw new CliError('prisma schema does not exist');\n }\n } else if (fs.existsSync(defaultPrismaSchemaLocation)) {\n prismaSchema = defaultPrismaSchemaLocation;\n }\n\n const zmodelFile = path.join(projectPath, './schema.zmodel');\n let sampleModelGenerated = false;\n\n if (fs.existsSync(zmodelFile)) {\n console.warn(`ZenStack model already exists at ${zmodelFile}, not generating a new one.`);\n } else {\n if (prismaSchema) {\n // copy over schema.prisma\n fs.copyFileSync(prismaSchema, zmodelFile);\n } else {\n // create a new model\n const starterContent = fs.readFileSync(path.join(__dirname, '../res/starter.zmodel'), 'utf-8');\n fs.writeFileSync(zmodelFile, starterContent);\n sampleModelGenerated = true;\n }\n }\n\n installPackage('zenstack', true, packageManager, tag, projectPath);\n installPackage('@zenstackhq/runtime', false, packageManager, tag, projectPath);\n\n if (sampleModelGenerated) {\n console.log(`Sample model generated at: ${colors.blue(zmodelFile)}\n\nPlease check the following guide on how to model your app:\n https://zenstack.dev/#/modeling-your-app.`);\n } else {\n console.log(\n `Your current Prisma schema \"${prismaSchema}\" has been copied to \"${zmodelFile}\".\nMoving forward please edit this file and run \"zenstack generate\" to regenerate Prisma schema.`\n );\n }\n\n console.log(colors.green('\\nProject initialized successfully!'));\n}\n\n/**\n * Loads a zmodel document from a file.\n * @param fileName File name\n * @param services Language services\n * @returns Parsed and validated AST\n */\nexport async function loadDocument(fileName: string, services: LangiumServices): Promise<Model> {\n const extensions = services.LanguageMetaData.fileExtensions;\n if (!extensions.includes(path.extname(fileName))) {\n console.error(colors.yellow(`Please choose a file with extension: ${extensions}.`));\n throw new CliError('invalid schema file');\n }\n\n if (!fs.existsSync(fileName)) {\n console.error(colors.red(`File ${fileName} does not exist.`));\n throw new CliError('schema file does not exist');\n }\n\n // load standard library\n const stdLib = services.shared.workspace.LangiumDocuments.getOrCreateDocument(\n URI.file(path.resolve(path.join(__dirname, '../res', STD_LIB_MODULE_NAME)))\n );\n\n // load the document\n const document = services.shared.workspace.LangiumDocuments.getOrCreateDocument(URI.file(path.resolve(fileName)));\n\n // build the document together with standard library\n await services.shared.workspace.DocumentBuilder.build([stdLib, document], {\n validationChecks: 'all',\n });\n\n const validationErrors = (document.diagnostics ?? []).filter((e) => e.severity === 1);\n if (validationErrors.length > 0) {\n console.error(colors.red('Validation errors:'));\n for (const validationError of validationErrors) {\n console.error(\n colors.red(\n `line ${validationError.range.start.line + 1}: ${\n validationError.message\n } [${document.textDocument.getText(validationError.range)}]`\n )\n );\n }\n throw new CliError('schema validation errors');\n }\n\n return document.parseResult.value as Model;\n}\n\nexport async function runPlugins(options: { schema: string; packageManager: PackageManagers | undefined }) {\n const services = createZModelServices(NodeFileSystem).ZModel;\n const model = await loadDocument(options.schema, services);\n\n const context: Context = {\n schema: model,\n schemaPath: path.resolve(options.schema),\n outDir: path.dirname(options.schema),\n };\n\n try {\n await new PluginRunner().run(context);\n } catch (err) {\n if (err instanceof PluginError) {\n console.error(colors.red(err.message));\n throw new CliError(err.message);\n } else {\n throw err;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"cli-util.js","sourceRoot":"","sources":["../../src/cli/cli-util.ts"],"names":[],"mappings":"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"}
package/cli/index.js CHANGED
@@ -1,75 +1,117 @@
1
1
  "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
5
17
  });
6
- exports.createProgram = createProgram;
7
- exports.default = _default;
8
- exports.requiredPrismaVersion = exports.initAction = exports.generateAction = void 0;
9
- var _module = require("@zenstackhq/language/module");
10
- var _colors = _interopRequireDefault(require("colors"));
11
- var _commander = require("commander");
12
- var semver = _interopRequireWildcard(require("semver"));
13
- var _telemetry = _interopRequireDefault(require("../telemetry"));
14
- var _versionUtils = require("../utils/version-utils");
15
- var _cliError = require("./cli-error");
16
- var _cliUtil = require("./cli-util");
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); }
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; }
19
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
26
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
27
+ return new (P || (P = Promise))(function (resolve, reject) {
28
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
29
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
30
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
31
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
32
+ });
33
+ };
34
+ var __importDefault = (this && this.__importDefault) || function (mod) {
35
+ return (mod && mod.__esModule) ? mod : { "default": mod };
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.createProgram = exports.generateAction = exports.initAction = exports.requiredPrismaVersion = void 0;
20
39
  /* eslint-disable @typescript-eslint/no-explicit-any */
21
-
40
+ const module_1 = require("@zenstackhq/language/module");
41
+ const colors_1 = __importDefault(require("colors"));
42
+ const commander_1 = require("commander");
43
+ const semver = __importStar(require("semver"));
44
+ const telemetry_1 = __importDefault(require("../telemetry"));
45
+ const version_utils_1 = require("../utils/version-utils");
46
+ const cli_error_1 = require("./cli-error");
47
+ const cli_util_1 = require("./cli-util");
22
48
  // required minimal version of Prisma
23
- const requiredPrismaVersion = '4.0.0';
24
- exports.requiredPrismaVersion = requiredPrismaVersion;
25
- const initAction = async (projectPath, options) => {
26
- await _telemetry.default.trackSpan('cli:command:start', 'cli:command:complete', 'cli:command:error', {
27
- command: 'init'
28
- }, () => (0, _cliUtil.initProject)(projectPath, options.prisma, options.packageManager, options.tag));
29
- };
49
+ exports.requiredPrismaVersion = '4.0.0';
50
+ const initAction = (projectPath, options) => __awaiter(void 0, void 0, void 0, function* () {
51
+ yield telemetry_1.default.trackSpan('cli:command:start', 'cli:command:complete', 'cli:command:error', { command: 'init' }, () => (0, cli_util_1.initProject)(projectPath, options.prisma, options.packageManager, options.tag));
52
+ });
30
53
  exports.initAction = initAction;
31
- const generateAction = async options => {
32
- checkRequiredPackage('prisma', requiredPrismaVersion);
33
- checkRequiredPackage('@prisma/client', requiredPrismaVersion);
34
- await _telemetry.default.trackSpan('cli:command:start', 'cli:command:complete', 'cli:command:error', {
35
- command: 'generate'
36
- }, () => (0, _cliUtil.runPlugins)(options));
37
- };
54
+ const generateAction = (options) => __awaiter(void 0, void 0, void 0, function* () {
55
+ checkRequiredPackage('prisma', exports.requiredPrismaVersion);
56
+ checkRequiredPackage('@prisma/client', exports.requiredPrismaVersion);
57
+ yield telemetry_1.default.trackSpan('cli:command:start', 'cli:command:complete', 'cli:command:error', { command: 'generate' }, () => (0, cli_util_1.runPlugins)(options));
58
+ });
38
59
  exports.generateAction = generateAction;
39
60
  const checkRequiredPackage = (packageName, minVersion) => {
40
- let packageVersion;
41
- try {
42
- // eslint-disable-next-line @typescript-eslint/no-var-requires
43
- packageVersion = require(`${packageName}/package.json`).version;
44
- } catch (error) {
45
- console.error(_colors.default.red(`${packageName} not found, please install it`));
46
- throw new _cliError.CliError(`${packageName} not found`);
47
- }
48
- if (minVersion && semver.lt(packageVersion, minVersion)) {
49
- console.error(_colors.default.red(`${packageName} needs to be above ${minVersion}, the installed version is ${packageVersion}, please upgrade it`));
50
- throw new _cliError.CliError(`${packageName} version is too low`);
51
- }
61
+ let packageVersion;
62
+ try {
63
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
64
+ packageVersion = require(`${packageName}/package.json`).version;
65
+ }
66
+ catch (error) {
67
+ console.error(colors_1.default.red(`${packageName} not found, please install it`));
68
+ throw new cli_error_1.CliError(`${packageName} not found`);
69
+ }
70
+ if (minVersion && semver.lt(packageVersion, minVersion)) {
71
+ console.error(colors_1.default.red(`${packageName} needs to be above ${minVersion}, the installed version is ${packageVersion}, please upgrade it`));
72
+ throw new cli_error_1.CliError(`${packageName} version is too low`);
73
+ }
52
74
  };
53
75
  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('canary')).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;
76
+ const program = new commander_1.Command('zenstack');
77
+ program.version((0, version_utils_1.getVersion)(), '-v --version', 'display CLI version');
78
+ const schemaExtensions = module_1.ZModelLanguageMetaData.fileExtensions.join(', ');
79
+ program
80
+ .description(`${colors_1.default.bold.blue('ζ')} ZenStack is a Prisma power pack for building full-stack apps.\n\nDocumentation: https://zenstack.dev.`)
81
+ .showHelpAfterError()
82
+ .showSuggestionAfterError();
83
+ const schemaOption = new commander_1.Option('--schema <file>', `schema file (with extension ${schemaExtensions})`).default('./schema.zmodel');
84
+ const pmOption = new commander_1.Option('-p, --package-manager <pm>', 'package manager to use').choices([
85
+ 'npm',
86
+ 'yarn',
87
+ 'pnpm',
88
+ ]);
89
+ program
90
+ .command('init')
91
+ .description('Initialize an existing project for ZenStack.')
92
+ .addOption(pmOption)
93
+ .addOption(new commander_1.Option('--prisma <file>', 'location of Prisma schema file to bootstrap from'))
94
+ .addOption(new commander_1.Option('--tag <tag>', 'the NPM package tag to use when installing dependencies').default('canary'))
95
+ .argument('[path]', 'project path', '.')
96
+ .action(exports.initAction);
97
+ program
98
+ .command('generate')
99
+ .description('Generates RESTful API and Typescript client for your data model.')
100
+ .addOption(schemaOption)
101
+ .addOption(pmOption)
102
+ .action(exports.generateAction);
103
+ return program;
63
104
  }
64
- async function _default() {
65
- await _telemetry.default.trackSpan('cli:start', 'cli:complete', 'cli:error', {
66
- args: process.argv
67
- }, async () => {
68
- const program = createProgram();
69
-
70
- // handle errors explicitly to ensure telemetry
71
- program.exitOverride();
72
- await program.parseAsync(process.argv);
73
- });
105
+ exports.createProgram = createProgram;
106
+ function default_1() {
107
+ return __awaiter(this, void 0, void 0, function* () {
108
+ yield telemetry_1.default.trackSpan('cli:start', 'cli:complete', 'cli:error', { args: process.argv }, () => __awaiter(this, void 0, void 0, function* () {
109
+ const program = createProgram();
110
+ // handle errors explicitly to ensure telemetry
111
+ program.exitOverride();
112
+ yield program.parseAsync(process.argv);
113
+ }));
114
+ });
74
115
  }
116
+ exports.default = default_1;
75
117
  //# sourceMappingURL=index.js.map