zenstack 1.0.0 → 1.0.16
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/LICENSE +1 -1
- package/README.md +126 -1
- package/bin/cli +3 -0
- package/bin/post-install.js +24 -0
- package/cli/cli-error.d.ts +5 -0
- package/cli/cli-error.js +10 -0
- package/cli/cli-error.js.map +1 -0
- package/cli/cli-util.d.ts +18 -0
- package/cli/cli-util.js +143 -0
- package/cli/cli-util.js.map +1 -0
- package/cli/index.d.ts +15 -0
- package/cli/index.js +121 -0
- package/cli/index.js.map +1 -0
- package/cli/plugin-runner.d.ts +14 -0
- package/cli/plugin-runner.js +145 -0
- package/cli/plugin-runner.js.map +1 -0
- package/constants.d.ts +1 -0
- package/constants.js +6 -0
- package/constants.js.map +1 -0
- package/language-server/constants.d.ts +15 -0
- package/language-server/constants.js +20 -0
- package/language-server/constants.js.map +1 -0
- package/language-server/main.d.ts +1 -0
- package/language-server/main.js +13 -0
- package/language-server/main.js.map +1 -0
- package/language-server/types.d.ts +10 -0
- package/language-server/types.js +3 -0
- package/language-server/types.js.map +1 -0
- package/language-server/utils.d.ts +18 -0
- package/language-server/utils.js +58 -0
- package/language-server/utils.js.map +1 -0
- package/language-server/validator/attribute-validator.d.ts +9 -0
- package/language-server/validator/attribute-validator.js +11 -0
- package/language-server/validator/attribute-validator.js.map +1 -0
- package/language-server/validator/datamodel-validator.d.ts +15 -0
- package/language-server/validator/datamodel-validator.js +278 -0
- package/language-server/validator/datamodel-validator.js.map +1 -0
- package/language-server/validator/datasource-validator.d.ts +12 -0
- package/language-server/validator/datasource-validator.js +66 -0
- package/language-server/validator/datasource-validator.js.map +1 -0
- package/language-server/validator/enum-validator.d.ts +11 -0
- package/language-server/validator/enum-validator.js +28 -0
- package/language-server/validator/enum-validator.js.map +1 -0
- package/language-server/validator/expression-validator.d.ts +10 -0
- package/language-server/validator/expression-validator.js +30 -0
- package/language-server/validator/expression-validator.js.map +1 -0
- package/language-server/validator/schema-validator.d.ts +10 -0
- package/language-server/validator/schema-validator.js +28 -0
- package/language-server/validator/schema-validator.js.map +1 -0
- package/language-server/validator/utils.d.ts +25 -0
- package/language-server/validator/utils.js +257 -0
- package/language-server/validator/utils.js.map +1 -0
- package/language-server/validator/zmodel-validator.d.ts +21 -0
- package/language-server/validator/zmodel-validator.js +69 -0
- package/language-server/validator/zmodel-validator.js.map +1 -0
- package/language-server/zmodel-code-action.d.ts +14 -0
- package/language-server/zmodel-code-action.js +93 -0
- package/language-server/zmodel-code-action.js.map +1 -0
- package/language-server/zmodel-formatter.d.ts +9 -0
- package/language-server/zmodel-formatter.js +76 -0
- package/language-server/zmodel-formatter.js.map +1 -0
- package/language-server/zmodel-linker.d.ts +29 -0
- package/language-server/zmodel-linker.js +366 -0
- package/language-server/zmodel-linker.js.map +1 -0
- package/language-server/zmodel-module.d.ts +41 -0
- package/language-server/zmodel-module.js +80 -0
- package/language-server/zmodel-module.js.map +1 -0
- package/language-server/zmodel-scope.d.ts +10 -0
- package/language-server/zmodel-scope.js +44 -0
- package/language-server/zmodel-scope.js.map +1 -0
- package/language-server/zmodel-workspace-manager.d.ts +8 -0
- package/language-server/zmodel-workspace-manager.js +37 -0
- package/language-server/zmodel-workspace-manager.js.map +1 -0
- package/package.json +133 -8
- package/plugins/access-policy/expression-writer.d.ts +39 -0
- package/plugins/access-policy/expression-writer.js +361 -0
- package/plugins/access-policy/expression-writer.js.map +1 -0
- package/plugins/access-policy/index.d.ts +4 -0
- package/plugins/access-policy/index.js +24 -0
- package/plugins/access-policy/index.js.map +1 -0
- package/plugins/access-policy/policy-guard-generator.d.ts +15 -0
- package/plugins/access-policy/policy-guard-generator.js +349 -0
- package/plugins/access-policy/policy-guard-generator.js.map +1 -0
- package/plugins/access-policy/typescript-expression-transformer.d.ts +26 -0
- package/plugins/access-policy/typescript-expression-transformer.js +111 -0
- package/plugins/access-policy/typescript-expression-transformer.js.map +1 -0
- package/plugins/access-policy/utils.d.ts +5 -0
- package/plugins/access-policy/utils.js +14 -0
- package/plugins/access-policy/utils.js.map +1 -0
- package/plugins/access-policy/zod-schema-generator.d.ts +12 -0
- package/plugins/access-policy/zod-schema-generator.js +158 -0
- package/plugins/access-policy/zod-schema-generator.js.map +1 -0
- package/plugins/model-meta/index.d.ts +4 -0
- package/plugins/model-meta/index.js +168 -0
- package/plugins/model-meta/index.js.map +1 -0
- package/plugins/plugin-utils.d.ts +16 -0
- package/plugins/plugin-utils.js +54 -0
- package/plugins/plugin-utils.js.map +1 -0
- package/plugins/prisma/indent-string.d.ts +4 -0
- package/plugins/prisma/indent-string.js +12 -0
- package/plugins/prisma/indent-string.js.map +1 -0
- package/plugins/prisma/index.d.ts +4 -0
- package/plugins/prisma/index.js +24 -0
- package/plugins/prisma/index.js.map +1 -0
- package/plugins/prisma/prisma-builder.d.ts +152 -0
- package/plugins/prisma/prisma-builder.js +363 -0
- package/plugins/prisma/prisma-builder.js.map +1 -0
- package/plugins/prisma/schema-generator.d.ts +25 -0
- package/plugins/prisma/schema-generator.js +292 -0
- package/plugins/prisma/schema-generator.js.map +1 -0
- package/plugins/prisma/zmodel-code-generator.d.ts +28 -0
- package/plugins/prisma/zmodel-code-generator.js +114 -0
- package/plugins/prisma/zmodel-code-generator.js.map +1 -0
- package/res/prism-zmodel.js +20 -0
- package/res/starter.zmodel +51 -0
- package/res/stdlib.zmodel +346 -0
- package/telemetry.d.ts +20 -0
- package/telemetry.js +119 -0
- package/telemetry.js.map +1 -0
- package/types.d.ts +12 -0
- package/types.js +3 -0
- package/types.js.map +1 -0
- package/utils/ast-utils.d.ts +16 -0
- package/utils/ast-utils.js +85 -0
- package/utils/ast-utils.js.map +1 -0
- package/utils/exec-utils.d.ts +6 -0
- package/utils/exec-utils.js +13 -0
- package/utils/exec-utils.js.map +1 -0
- package/utils/pkg-utils.d.ts +3 -0
- package/utils/pkg-utils.js +46 -0
- package/utils/pkg-utils.js.map +1 -0
- package/utils/version-utils.d.ts +1 -0
- package/utils/version-utils.js +14 -0
- package/utils/version-utils.js.map +1 -0
- package/.vscode/extensions.json +0 -7
- package/.vscode/launch.json +0 -49
- package/.vscode/settings.json +0 -4
- package/packages/internal/jest.config.ts +0 -32
- package/packages/internal/package.json +0 -42
- package/packages/internal/src/constants.ts +0 -1
- package/packages/internal/src/handler/data/guard-utils.ts +0 -7
- package/packages/internal/src/handler/data/handler.ts +0 -415
- package/packages/internal/src/handler/data/query-processor.ts +0 -504
- package/packages/internal/src/handler/index.ts +0 -1
- package/packages/internal/src/handler/types.ts +0 -20
- package/packages/internal/src/index.ts +0 -3
- package/packages/internal/src/request-handler.ts +0 -27
- package/packages/internal/src/request.ts +0 -101
- package/packages/internal/src/types.ts +0 -40
- package/packages/internal/tests/query-processor.test.ts +0 -172
- package/packages/internal/tsconfig.json +0 -21
- package/packages/runtime/auth.d.ts +0 -1
- package/packages/runtime/auth.js +0 -3
- package/packages/runtime/hooks.d.ts +0 -10
- package/packages/runtime/hooks.js +0 -3
- package/packages/runtime/index.d.ts +0 -3
- package/packages/runtime/index.js +0 -1
- package/packages/runtime/package-lock.json +0 -512
- package/packages/runtime/package.json +0 -16
- package/packages/runtime/server.d.ts +0 -1
- package/packages/runtime/server.js +0 -3
- package/packages/runtime/types.d.ts +0 -1
- package/packages/runtime/types.js +0 -3
- package/packages/schema/.eslintrc.json +0 -13
- package/packages/schema/.vscodeignore +0 -4
- package/packages/schema/asset/logo-dark.png +0 -0
- package/packages/schema/asset/logo-light.png +0 -0
- package/packages/schema/bin/cli +0 -3
- package/packages/schema/jest.config.ts +0 -32
- package/packages/schema/langium-config.json +0 -14
- package/packages/schema/langium-quickstart.md +0 -41
- package/packages/schema/language-configuration.json +0 -30
- package/packages/schema/package.json +0 -96
- package/packages/schema/src/cli/cli-util.ts +0 -80
- package/packages/schema/src/cli/index.ts +0 -64
- package/packages/schema/src/extension.ts +0 -76
- package/packages/schema/src/generator/constants.ts +0 -5
- package/packages/schema/src/generator/index.ts +0 -92
- package/packages/schema/src/generator/next-auth/index.ts +0 -197
- package/packages/schema/src/generator/package.template.json +0 -9
- package/packages/schema/src/generator/prisma/expression-writer.ts +0 -352
- package/packages/schema/src/generator/prisma/index.ts +0 -32
- package/packages/schema/src/generator/prisma/plain-expression-builder.ts +0 -91
- package/packages/schema/src/generator/prisma/prisma-builder.ts +0 -366
- package/packages/schema/src/generator/prisma/query-gard-generator.ts +0 -208
- package/packages/schema/src/generator/prisma/schema-generator.ts +0 -300
- package/packages/schema/src/generator/react-hooks/index.ts +0 -181
- package/packages/schema/src/generator/service/index.ts +0 -107
- package/packages/schema/src/generator/tsconfig.template.json +0 -17
- package/packages/schema/src/generator/types.ts +0 -17
- package/packages/schema/src/generator/utils.ts +0 -9
- package/packages/schema/src/language-server/generated/ast.ts +0 -603
- package/packages/schema/src/language-server/generated/grammar.ts +0 -2190
- package/packages/schema/src/language-server/generated/module.ts +0 -24
- package/packages/schema/src/language-server/main.ts +0 -12
- package/packages/schema/src/language-server/stdlib.zmodel +0 -22
- package/packages/schema/src/language-server/types.ts +0 -9
- package/packages/schema/src/language-server/zmodel-index.ts +0 -33
- package/packages/schema/src/language-server/zmodel-linker.ts +0 -409
- package/packages/schema/src/language-server/zmodel-module.ts +0 -90
- package/packages/schema/src/language-server/zmodel-scope.ts +0 -21
- package/packages/schema/src/language-server/zmodel-validator.ts +0 -35
- package/packages/schema/src/language-server/zmodel.langium +0 -186
- package/packages/schema/src/utils/exec-utils.ts +0 -5
- package/packages/schema/src/utils/indent-string.ts +0 -6
- package/packages/schema/syntaxes/zmodel.json +0 -57
- package/packages/schema/syntaxes/zmodel.tmLanguage.json +0 -57
- package/packages/schema/tests/generator/expression-writer.test.ts +0 -676
- package/packages/schema/tests/generator/prisma-builder.test.ts +0 -138
- package/packages/schema/tests/schema/parser.test.ts +0 -423
- package/packages/schema/tests/schema/sample-todo.test.ts +0 -14
- package/packages/schema/tests/utils.ts +0 -38
- package/packages/schema/tsconfig.json +0 -23
- package/pnpm-workspace.yaml +0 -3
- package/samples/todo/.env +0 -2
- package/samples/todo/.eslintrc.json +0 -3
- package/samples/todo/.vscode/launch.json +0 -11
- package/samples/todo/README.md +0 -34
- package/samples/todo/components/AuthGuard.tsx +0 -17
- package/samples/todo/components/Avatar.tsx +0 -22
- package/samples/todo/components/BreadCrumb.tsx +0 -44
- package/samples/todo/components/ManageMembers.tsx +0 -134
- package/samples/todo/components/NavBar.tsx +0 -57
- package/samples/todo/components/SpaceMembers.tsx +0 -76
- package/samples/todo/components/Spaces.tsx +0 -28
- package/samples/todo/components/TimeInfo.tsx +0 -17
- package/samples/todo/components/Todo.tsx +0 -72
- package/samples/todo/components/TodoList.tsx +0 -77
- package/samples/todo/lib/context.ts +0 -31
- package/samples/todo/next.config.js +0 -10
- package/samples/todo/package-lock.json +0 -7527
- package/samples/todo/package.json +0 -45
- package/samples/todo/pages/_app.tsx +0 -50
- package/samples/todo/pages/api/auth/[...nextauth].ts +0 -83
- package/samples/todo/pages/api/zenstack/[...path].ts +0 -16
- package/samples/todo/pages/create-space.tsx +0 -114
- package/samples/todo/pages/index.tsx +0 -32
- package/samples/todo/pages/space/[slug]/[listId]/index.tsx +0 -88
- package/samples/todo/pages/space/[slug]/index.tsx +0 -169
- package/samples/todo/postcss.config.js +0 -6
- package/samples/todo/public/avatar.jpg +0 -0
- package/samples/todo/public/favicon.ico +0 -0
- package/samples/todo/public/logo.png +0 -0
- package/samples/todo/public/vercel.svg +0 -4
- package/samples/todo/styles/globals.css +0 -7
- package/samples/todo/tailwind.config.js +0 -11
- package/samples/todo/tsconfig.json +0 -28
- package/samples/todo/types/next-auth.d.ts +0 -14
- package/samples/todo/types/next.d.ts +0 -16
- package/samples/todo/zenstack/migrations/20221014084317_init/migration.sql +0 -153
- package/samples/todo/zenstack/migrations/20221020094651_upate_cli/migration.sql +0 -23
- package/samples/todo/zenstack/migrations/migration_lock.toml +0 -3
- package/samples/todo/zenstack/schema.prisma +0 -126
- package/samples/todo/zenstack/schema.zmodel +0 -161
- package/tests/integration/jest.config.ts +0 -16
- package/tests/integration/package-lock.json +0 -1081
- package/tests/integration/package.json +0 -27
- package/tests/integration/tests/operation-coverate.test.ts +0 -563
- package/tests/integration/tests/operations.zmodel +0 -69
- package/tests/integration/tests/todo-e2e.test.ts +0 -577
- package/tests/integration/tests/todo.zmodel +0 -123
- package/tests/integration/tests/tsconfig.template.json +0 -10
- package/tests/integration/tests/utils.ts +0 -133
- package/tests/integration/tsconfig.json +0 -10
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1 +1,126 @@
|
|
|
1
|
-
<
|
|
1
|
+
<div align="center">
|
|
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
|
+
>
|
|
4
|
+
<div></div>
|
|
5
|
+
<a href="https://www.npmjs.com/package/zenstack">
|
|
6
|
+
<img src="https://img.shields.io/npm/v/zenstack">
|
|
7
|
+
</a>
|
|
8
|
+
<img src="https://github.com/zenstackhq/zenstack/actions/workflows/build-test.yml/badge.svg">
|
|
9
|
+
<a href="https://twitter.com/zenstackhq">
|
|
10
|
+
<img src="https://img.shields.io/twitter/url?style=social&url=https%3A%2F%2Fgithub.com%2Fzenstackhq%2Fzenstack">
|
|
11
|
+
</a>
|
|
12
|
+
<a href="https://go.zenstack.dev/chat">
|
|
13
|
+
<img src="https://img.shields.io/discord/1035538056146595961">
|
|
14
|
+
</a>
|
|
15
|
+
<a href="https://github.com/zenstackhq/zenstack/blob/main/LICENSE">
|
|
16
|
+
<img src="https://img.shields.io/badge/license-MIT-green">
|
|
17
|
+
</a>
|
|
18
|
+
</div>
|
|
19
|
+
|
|
20
|
+
## What it is
|
|
21
|
+
|
|
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
|
+
|
|
24
|
+
Our goal is to let you save time writing boilerplate code and focus on building real features!
|
|
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
|
+
|
|
92
|
+
The following diagram gives a high-level overview of how it works.
|
|
93
|
+
|
|
94
|
+

|
|
95
|
+
|
|
96
|
+
## Links
|
|
97
|
+
|
|
98
|
+
- [Home](https://zenstack.dev)
|
|
99
|
+
- [Documentation](https://zenstack.dev/docs)
|
|
100
|
+
- [Community chat](https://go.zenstack.dev/chat)
|
|
101
|
+
- [Twitter](https://twitter.com/zenstackhq)
|
|
102
|
+
- [Blog](https://dev.to/zenstack)
|
|
103
|
+
|
|
104
|
+
## Features
|
|
105
|
+
|
|
106
|
+
- Access control and data validation rules right inside your Prisma schema
|
|
107
|
+
- Auto-generated RESTful API and client library
|
|
108
|
+
- End-to-end type safety
|
|
109
|
+
- Extensible: custom attributes, functions, and a plugin system
|
|
110
|
+
- Framework agnostic
|
|
111
|
+
- Uncompromised performance
|
|
112
|
+
|
|
113
|
+
## Examples
|
|
114
|
+
|
|
115
|
+
Check out the [Collaborative Todo App](https://zenstack-todo.vercel.app/) for a running example. You can find the source code below:
|
|
116
|
+
|
|
117
|
+
- [Next.js + React hooks implementation](https://github.com/zenstackhq/sample-todo-nextjs)
|
|
118
|
+
- [Next.js + tRPC implementation](https://github.com/zenstackhq/sample-todo-trpc)
|
|
119
|
+
|
|
120
|
+
## Community
|
|
121
|
+
|
|
122
|
+
Join our [discord server](https://go.zenstack.dev/chat) for chat and updates!
|
|
123
|
+
|
|
124
|
+
## License
|
|
125
|
+
|
|
126
|
+
[MIT](LICENSE)
|
package/bin/cli
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
try {
|
|
2
|
+
if (process.env.DO_NOT_TRACK == '1') {
|
|
3
|
+
process.exit(0);
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
const Mixpanel = require('mixpanel');
|
|
7
|
+
const machineId = require('node-machine-id');
|
|
8
|
+
const os = require('os');
|
|
9
|
+
|
|
10
|
+
const mixpanel = Mixpanel.init('', {
|
|
11
|
+
geolocate: true,
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
const version = require('../package.json').version;
|
|
15
|
+
const payload = {
|
|
16
|
+
distinct_id: machineId.machineIdSync(),
|
|
17
|
+
nodeVersion: process.version,
|
|
18
|
+
time: new Date(),
|
|
19
|
+
$os: os.platform(),
|
|
20
|
+
version,
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
mixpanel.track('npm:install', payload);
|
|
24
|
+
} catch {}
|
package/cli/cli-error.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CliError = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Indicating an error during CLI execution
|
|
6
|
+
*/
|
|
7
|
+
class CliError extends Error {
|
|
8
|
+
}
|
|
9
|
+
exports.CliError = CliError;
|
|
10
|
+
//# sourceMappingURL=cli-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Model } from '@zenstackhq/language/ast';
|
|
2
|
+
import { LangiumServices } from 'langium';
|
|
3
|
+
import { PackageManagers } from '../utils/pkg-utils';
|
|
4
|
+
/**
|
|
5
|
+
* Initializes an existing project for ZenStack
|
|
6
|
+
*/
|
|
7
|
+
export declare function initProject(projectPath: string, prismaSchema: string | undefined, packageManager: PackageManagers | undefined, tag: string): Promise<void>;
|
|
8
|
+
/**
|
|
9
|
+
* Loads a zmodel document from a file.
|
|
10
|
+
* @param fileName File name
|
|
11
|
+
* @param services Language services
|
|
12
|
+
* @returns Parsed and validated AST
|
|
13
|
+
*/
|
|
14
|
+
export declare function loadDocument(fileName: string, services: LangiumServices): Promise<Model>;
|
|
15
|
+
export declare function runPlugins(options: {
|
|
16
|
+
schema: string;
|
|
17
|
+
packageManager: PackageManagers | undefined;
|
|
18
|
+
}): Promise<void>;
|
package/cli/cli-util.js
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
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");
|
|
27
|
+
/**
|
|
28
|
+
* Initializes an existing project for ZenStack
|
|
29
|
+
*/
|
|
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.ensurePackage)('prisma', true, packageManager, 'latest', projectPath);
|
|
64
|
+
(0, pkg_utils_1.ensurePackage)('@prisma/client', false, packageManager, 'latest', projectPath);
|
|
65
|
+
(0, pkg_utils_1.installPackage)('zenstack', true, packageManager, tag, projectPath);
|
|
66
|
+
(0, pkg_utils_1.installPackage)('@zenstackhq/runtime', false, packageManager, tag, projectPath);
|
|
67
|
+
if (sampleModelGenerated) {
|
|
68
|
+
console.log(`Sample model generated at: ${colors_1.default.blue(zmodelFile)}
|
|
69
|
+
|
|
70
|
+
Please check the following guide on how to model your app:
|
|
71
|
+
https://zenstack.dev/#/modeling-your-app.`);
|
|
72
|
+
}
|
|
73
|
+
else {
|
|
74
|
+
console.log(`Your current Prisma schema "${prismaSchema}" has been copied to "${zmodelFile}".
|
|
75
|
+
Moving forward please edit this file and run "zenstack generate" to regenerate Prisma schema.`);
|
|
76
|
+
}
|
|
77
|
+
console.log(colors_1.default.green('\nProject initialized successfully!'));
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
exports.initProject = initProject;
|
|
81
|
+
/**
|
|
82
|
+
* Loads a zmodel document from a file.
|
|
83
|
+
* @param fileName File name
|
|
84
|
+
* @param services Language services
|
|
85
|
+
* @returns Parsed and validated AST
|
|
86
|
+
*/
|
|
87
|
+
function loadDocument(fileName, services) {
|
|
88
|
+
var _a;
|
|
89
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
90
|
+
const extensions = services.LanguageMetaData.fileExtensions;
|
|
91
|
+
if (!extensions.includes(path_1.default.extname(fileName))) {
|
|
92
|
+
console.error(colors_1.default.yellow(`Please choose a file with extension: ${extensions}.`));
|
|
93
|
+
throw new cli_error_1.CliError('invalid schema file');
|
|
94
|
+
}
|
|
95
|
+
if (!fs_1.default.existsSync(fileName)) {
|
|
96
|
+
console.error(colors_1.default.red(`File ${fileName} does not exist.`));
|
|
97
|
+
throw new cli_error_1.CliError('schema file does not exist');
|
|
98
|
+
}
|
|
99
|
+
// load standard library
|
|
100
|
+
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))));
|
|
101
|
+
// load the document
|
|
102
|
+
const document = services.shared.workspace.LangiumDocuments.getOrCreateDocument(vscode_uri_1.URI.file(path_1.default.resolve(fileName)));
|
|
103
|
+
// build the document together with standard library
|
|
104
|
+
yield services.shared.workspace.DocumentBuilder.build([stdLib, document], {
|
|
105
|
+
validationChecks: 'all',
|
|
106
|
+
});
|
|
107
|
+
const validationErrors = ((_a = document.diagnostics) !== null && _a !== void 0 ? _a : []).filter((e) => e.severity === 1);
|
|
108
|
+
if (validationErrors.length > 0) {
|
|
109
|
+
console.error(colors_1.default.red('Validation errors:'));
|
|
110
|
+
for (const validationError of validationErrors) {
|
|
111
|
+
console.error(colors_1.default.red(`line ${validationError.range.start.line + 1}: ${validationError.message} [${document.textDocument.getText(validationError.range)}]`));
|
|
112
|
+
}
|
|
113
|
+
throw new cli_error_1.CliError('schema validation errors');
|
|
114
|
+
}
|
|
115
|
+
return document.parseResult.value;
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
exports.loadDocument = loadDocument;
|
|
119
|
+
function runPlugins(options) {
|
|
120
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
121
|
+
const services = (0, zmodel_module_1.createZModelServices)(node_1.NodeFileSystem).ZModel;
|
|
122
|
+
const model = yield loadDocument(options.schema, services);
|
|
123
|
+
const context = {
|
|
124
|
+
schema: model,
|
|
125
|
+
schemaPath: path_1.default.resolve(options.schema),
|
|
126
|
+
outDir: path_1.default.dirname(options.schema),
|
|
127
|
+
};
|
|
128
|
+
try {
|
|
129
|
+
yield new plugin_runner_1.PluginRunner().run(context);
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
if (err instanceof sdk_1.PluginError) {
|
|
133
|
+
console.error(colors_1.default.red(err.message));
|
|
134
|
+
throw new cli_error_1.CliError(err.message);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
throw err;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
}
|
|
142
|
+
exports.runPlugins = runPlugins;
|
|
143
|
+
//# sourceMappingURL=cli-util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-util.js","sourceRoot":"","sources":["../../src/cli/cli-util.ts"],"names":[],"mappings":"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"}
|
package/cli/index.d.ts
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Command } from 'commander';
|
|
2
|
+
import { PackageManagers } from '../utils/pkg-utils';
|
|
3
|
+
export declare const requiredPrismaVersion = "4.0.0";
|
|
4
|
+
export declare const initAction: (projectPath: string, options: {
|
|
5
|
+
prisma: string | undefined;
|
|
6
|
+
packageManager: PackageManagers | undefined;
|
|
7
|
+
tag: string;
|
|
8
|
+
}) => Promise<void>;
|
|
9
|
+
export declare const generateAction: (options: {
|
|
10
|
+
schema: string;
|
|
11
|
+
packageManager: PackageManagers | undefined;
|
|
12
|
+
dependencyCheck: boolean;
|
|
13
|
+
}) => Promise<void>;
|
|
14
|
+
export declare function createProgram(): Command;
|
|
15
|
+
export default function (): Promise<void>;
|
package/cli/index.js
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
"use strict";
|
|
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;
|
|
17
|
+
});
|
|
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;
|
|
39
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
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");
|
|
48
|
+
// required minimal version of Prisma
|
|
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
|
+
});
|
|
53
|
+
exports.initAction = initAction;
|
|
54
|
+
const generateAction = (options) => __awaiter(void 0, void 0, void 0, function* () {
|
|
55
|
+
if (options.dependencyCheck) {
|
|
56
|
+
checkRequiredPackage('prisma', exports.requiredPrismaVersion);
|
|
57
|
+
checkRequiredPackage('@prisma/client', exports.requiredPrismaVersion);
|
|
58
|
+
}
|
|
59
|
+
yield telemetry_1.default.trackSpan('cli:command:start', 'cli:command:complete', 'cli:command:error', { command: 'generate' }, () => (0, cli_util_1.runPlugins)(options));
|
|
60
|
+
});
|
|
61
|
+
exports.generateAction = generateAction;
|
|
62
|
+
const checkRequiredPackage = (packageName, minVersion) => {
|
|
63
|
+
let packageVersion;
|
|
64
|
+
try {
|
|
65
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
66
|
+
packageVersion = require(`${packageName}/package.json`).version;
|
|
67
|
+
}
|
|
68
|
+
catch (error) {
|
|
69
|
+
console.error(colors_1.default.red(`${packageName} not found, please install it`));
|
|
70
|
+
throw new cli_error_1.CliError(`${packageName} not found`);
|
|
71
|
+
}
|
|
72
|
+
if (minVersion && semver.lt(packageVersion, minVersion)) {
|
|
73
|
+
console.error(colors_1.default.red(`${packageName} needs to be above ${minVersion}, the installed version is ${packageVersion}, please upgrade it`));
|
|
74
|
+
throw new cli_error_1.CliError(`${packageName} version is too low`);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
function createProgram() {
|
|
78
|
+
const program = new commander_1.Command('zenstack');
|
|
79
|
+
program.version((0, version_utils_1.getVersion)(), '-v --version', 'display CLI version');
|
|
80
|
+
const schemaExtensions = module_1.ZModelLanguageMetaData.fileExtensions.join(', ');
|
|
81
|
+
program
|
|
82
|
+
.description(`${colors_1.default.bold.blue('ζ')} ZenStack is a Prisma power pack for building full-stack apps.\n\nDocumentation: https://zenstack.dev.`)
|
|
83
|
+
.showHelpAfterError()
|
|
84
|
+
.showSuggestionAfterError();
|
|
85
|
+
const schemaOption = new commander_1.Option('--schema <file>', `schema file (with extension ${schemaExtensions})`).default('./schema.zmodel');
|
|
86
|
+
const pmOption = new commander_1.Option('-p, --package-manager <pm>', 'package manager to use').choices([
|
|
87
|
+
'npm',
|
|
88
|
+
'yarn',
|
|
89
|
+
'pnpm',
|
|
90
|
+
]);
|
|
91
|
+
const noDependencyCheck = new commander_1.Option('--no-dependency-check', 'do not check if dependencies are installed');
|
|
92
|
+
program
|
|
93
|
+
.command('init')
|
|
94
|
+
.description('Initialize an existing project for ZenStack.')
|
|
95
|
+
.addOption(pmOption)
|
|
96
|
+
.addOption(new commander_1.Option('--prisma <file>', 'location of Prisma schema file to bootstrap from'))
|
|
97
|
+
.addOption(new commander_1.Option('--tag <tag>', 'the NPM package tag to use when installing dependencies').default('latest'))
|
|
98
|
+
.argument('[path]', 'project path', '.')
|
|
99
|
+
.action(exports.initAction);
|
|
100
|
+
program
|
|
101
|
+
.command('generate')
|
|
102
|
+
.description('Run code generation.')
|
|
103
|
+
.addOption(schemaOption)
|
|
104
|
+
.addOption(pmOption)
|
|
105
|
+
.addOption(noDependencyCheck)
|
|
106
|
+
.action(exports.generateAction);
|
|
107
|
+
return program;
|
|
108
|
+
}
|
|
109
|
+
exports.createProgram = createProgram;
|
|
110
|
+
function default_1() {
|
|
111
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
112
|
+
yield telemetry_1.default.trackSpan('cli:start', 'cli:complete', 'cli:error', { args: process.argv }, () => __awaiter(this, void 0, void 0, function* () {
|
|
113
|
+
const program = createProgram();
|
|
114
|
+
// handle errors explicitly to ensure telemetry
|
|
115
|
+
program.exitOverride();
|
|
116
|
+
yield program.parseAsync(process.argv);
|
|
117
|
+
}));
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
exports.default = default_1;
|
|
121
|
+
//# sourceMappingURL=index.js.map
|
package/cli/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Context } from '../types';
|
|
2
|
+
/**
|
|
3
|
+
* ZenStack code generator
|
|
4
|
+
*/
|
|
5
|
+
export declare class PluginRunner {
|
|
6
|
+
/**
|
|
7
|
+
* Runs a series of nested generators
|
|
8
|
+
*/
|
|
9
|
+
run(context: Context): Promise<void>;
|
|
10
|
+
private getPluginName;
|
|
11
|
+
private getPluginProvider;
|
|
12
|
+
private runPlugin;
|
|
13
|
+
private getPluginModulePath;
|
|
14
|
+
}
|