zenstack 1.0.0 → 1.0.1
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 +194 -1
- package/bin/cli +3 -0
- package/bin/post-install.js +24 -0
- package/cli/actions/generate.d.ts +13 -0
- package/cli/actions/generate.js +71 -0
- package/cli/actions/generate.js.map +1 -0
- package/cli/actions/index.d.ts +3 -0
- package/cli/actions/index.js +20 -0
- package/cli/actions/index.js.map +1 -0
- package/cli/actions/info.d.ts +4 -0
- package/cli/actions/info.js +63 -0
- package/cli/actions/info.js.map +1 -0
- package/cli/actions/init.d.ts +12 -0
- package/cli/actions/init.js +83 -0
- package/cli/actions/init.js.map +1 -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 +21 -0
- package/cli/cli-util.js +211 -0
- package/cli/cli-util.js.map +1 -0
- package/cli/config.d.ts +10 -0
- package/cli/config.js +62 -0
- package/cli/config.js.map +1 -0
- package/cli/index.d.ts +7 -0
- package/cli/index.js +128 -0
- package/cli/index.js.map +1 -0
- package/cli/plugin-runner.d.ts +24 -0
- package/cli/plugin-runner.js +229 -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 +22 -0
- package/language-server/constants.js +27 -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 +5 -0
- package/language-server/utils.js +22 -0
- package/language-server/utils.js.map +1 -0
- package/language-server/validator/attribute-application-validator.d.ts +15 -0
- package/language-server/validator/attribute-application-validator.js +246 -0
- package/language-server/validator/attribute-application-validator.js.map +1 -0
- package/language-server/validator/attribute-validator.d.ts +9 -0
- package/language-server/validator/attribute-validator.js +14 -0
- package/language-server/validator/attribute-validator.js.map +1 -0
- package/language-server/validator/datamodel-validator.d.ts +22 -0
- package/language-server/validator/datamodel-validator.js +329 -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 +25 -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 +135 -0
- package/language-server/validator/expression-validator.js.map +1 -0
- package/language-server/validator/function-decl-validator.d.ts +9 -0
- package/language-server/validator/function-decl-validator.js +13 -0
- package/language-server/validator/function-decl-validator.js.map +1 -0
- package/language-server/validator/function-invocation-validator.d.ts +11 -0
- package/language-server/validator/function-invocation-validator.js +135 -0
- package/language-server/validator/function-invocation-validator.js.map +1 -0
- package/language-server/validator/schema-validator.d.ts +13 -0
- package/language-server/validator/schema-validator.js +49 -0
- package/language-server/validator/schema-validator.js.map +1 -0
- package/language-server/validator/utils.d.ts +24 -0
- package/language-server/validator/utils.js +154 -0
- package/language-server/validator/utils.js.map +1 -0
- package/language-server/validator/zmodel-validator.d.ts +25 -0
- package/language-server/validator/zmodel-validator.js +83 -0
- package/language-server/validator/zmodel-validator.js.map +1 -0
- package/language-server/zmodel-code-action.d.ts +15 -0
- package/language-server/zmodel-code-action.js +118 -0
- package/language-server/zmodel-code-action.js.map +1 -0
- package/language-server/zmodel-definition.d.ts +7 -0
- package/language-server/zmodel-definition.js +31 -0
- package/language-server/zmodel-definition.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 +32 -0
- package/language-server/zmodel-linker.js +447 -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 +83 -0
- package/language-server/zmodel-module.js.map +1 -0
- package/language-server/zmodel-scope.d.ts +16 -0
- package/language-server/zmodel-scope.js +100 -0
- package/language-server/zmodel-scope.js.map +1 -0
- package/language-server/zmodel-workspace-manager.d.ts +12 -0
- package/language-server/zmodel-workspace-manager.js +138 -0
- package/language-server/zmodel-workspace-manager.js.map +1 -0
- package/package.json +140 -8
- package/plugins/access-policy/expression-writer.d.ts +46 -0
- package/plugins/access-policy/expression-writer.js +580 -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 +22 -0
- package/plugins/access-policy/index.js.map +1 -0
- package/plugins/access-policy/policy-guard-generator.d.ts +22 -0
- package/plugins/access-policy/policy-guard-generator.js +634 -0
- package/plugins/access-policy/policy-guard-generator.js.map +1 -0
- package/plugins/model-meta/index.d.ts +4 -0
- package/plugins/model-meta/index.js +232 -0
- package/plugins/model-meta/index.js.map +1 -0
- package/plugins/plugin-utils.d.ts +17 -0
- package/plugins/plugin-utils.js +80 -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 +22 -0
- package/plugins/prisma/index.js.map +1 -0
- package/plugins/prisma/prisma-builder.d.ts +145 -0
- package/plugins/prisma/prisma-builder.js +358 -0
- package/plugins/prisma/prisma-builder.js.map +1 -0
- package/plugins/prisma/schema-generator.d.ts +29 -0
- package/plugins/prisma/schema-generator.js +336 -0
- package/plugins/prisma/schema-generator.js.map +1 -0
- package/plugins/prisma/zmodel-code-generator.d.ts +30 -0
- package/plugins/prisma/zmodel-code-generator.js +124 -0
- package/plugins/prisma/zmodel-code-generator.js.map +1 -0
- package/plugins/zod/generator.d.ts +4 -0
- package/plugins/zod/generator.js +254 -0
- package/plugins/zod/generator.js.map +1 -0
- package/plugins/zod/index.d.ts +4 -0
- package/plugins/zod/index.js +24 -0
- package/plugins/zod/index.js.map +1 -0
- package/plugins/zod/transformer.d.ts +68 -0
- package/plugins/zod/transformer.js +554 -0
- package/plugins/zod/transformer.js.map +1 -0
- package/plugins/zod/types.d.ts +25 -0
- package/plugins/zod/types.js +3 -0
- package/plugins/zod/types.js.map +1 -0
- package/plugins/zod/utils/removeDir.d.ts +1 -0
- package/plugins/zod/utils/removeDir.js +30 -0
- package/plugins/zod/utils/removeDir.js.map +1 -0
- package/plugins/zod/utils/schema-gen.d.ts +3 -0
- package/plugins/zod/utils/schema-gen.js +188 -0
- package/plugins/zod/utils/schema-gen.js.map +1 -0
- package/res/prism-zmodel.js +20 -0
- package/res/starter.zmodel +51 -0
- package/res/stdlib.zmodel +506 -0
- package/telemetry.d.ts +21 -0
- package/telemetry.js +129 -0
- package/telemetry.js.map +1 -0
- package/utils/ast-utils.d.ts +13 -0
- package/utils/ast-utils.js +136 -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 +64 -0
- package/utils/pkg-utils.js.map +1 -0
- package/utils/typescript-expression-transformer.d.ts +54 -0
- package/utils/typescript-expression-transformer.js +326 -0
- package/utils/typescript-expression-transformer.js.map +1 -0
- package/utils/version-utils.d.ts +1 -0
- package/utils/version-utils.js +20 -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,194 @@
|
|
|
1
|
-
<
|
|
1
|
+
<div align="center">
|
|
2
|
+
<a href="https://zenstack.dev">
|
|
3
|
+
<picture>
|
|
4
|
+
<source media="(prefers-color-scheme: dark)" srcset="https://raw.githubusercontent.com/zenstackhq/zenstack-docs/main/static/img/logo-dark.png">
|
|
5
|
+
<img src="https://raw.githubusercontent.com/zenstackhq/zenstack-docs/main/static/img/logo.png" height="128">
|
|
6
|
+
</picture>
|
|
7
|
+
</a>
|
|
8
|
+
<h1>ZenStack</h1>
|
|
9
|
+
<a href="https://www.npmjs.com/package/zenstack">
|
|
10
|
+
<img src="https://img.shields.io/npm/v/zenstack">
|
|
11
|
+
</a>
|
|
12
|
+
<img src="https://github.com/zenstackhq/zenstack/actions/workflows/build-test.yml/badge.svg">
|
|
13
|
+
<a href="https://twitter.com/zenstackhq">
|
|
14
|
+
<img src="https://img.shields.io/twitter/url?style=social&url=https%3A%2F%2Fgithub.com%2Fzenstackhq%2Fzenstack">
|
|
15
|
+
</a>
|
|
16
|
+
<a href="https://go.zenstack.dev/chat">
|
|
17
|
+
<img src="https://img.shields.io/discord/1035538056146595961">
|
|
18
|
+
</a>
|
|
19
|
+
<a href="https://github.com/zenstackhq/zenstack/blob/main/LICENSE">
|
|
20
|
+
<img src="https://img.shields.io/badge/license-MIT-green">
|
|
21
|
+
</a>
|
|
22
|
+
</div>
|
|
23
|
+
|
|
24
|
+
## What it is
|
|
25
|
+
|
|
26
|
+
ZenStack is a Node.js/TypeScript 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 full-stack development.
|
|
27
|
+
|
|
28
|
+
Our goal is to let you save time writing boilerplate code and focus on building real features!
|
|
29
|
+
|
|
30
|
+
## How it works
|
|
31
|
+
|
|
32
|
+
> Read full documentation at 👉🏻 [zenstack.dev](https://zenstack.dev).
|
|
33
|
+
|
|
34
|
+
ZenStack incrementally extends Prisma's power with the following four layers:
|
|
35
|
+
|
|
36
|
+
### 1. ZModel - an extended Prisma schema language
|
|
37
|
+
|
|
38
|
+
ZenStack introduces a data modeling language called "ZModel" - a superset of Prisma schema language. It extended Prisma schema with custom attributes and functions and, based on that, implemented a flexible access control layer around Prisma.
|
|
39
|
+
|
|
40
|
+
```prisma
|
|
41
|
+
// schema.zmodel
|
|
42
|
+
|
|
43
|
+
model Post {
|
|
44
|
+
id String @id
|
|
45
|
+
title String
|
|
46
|
+
published Boolean @default(false)
|
|
47
|
+
author User @relation(fields: [authorId], references: [id])
|
|
48
|
+
authorId String
|
|
49
|
+
|
|
50
|
+
// 🔐 allow logged-in users to read published posts
|
|
51
|
+
@@allow('read', auth() != null && published)
|
|
52
|
+
|
|
53
|
+
// 🔐 allow full CRUD by author
|
|
54
|
+
@@allow('all', author == auth())
|
|
55
|
+
}
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
The `zenstack` CLI transpiles the ZModel into a standard Prisma schema, which you can use with the regular Prisma workflows.
|
|
59
|
+
|
|
60
|
+
### 2. Runtime enhancements to Prisma client
|
|
61
|
+
|
|
62
|
+
At runtime, transparent proxies are created around Prisma clients for intercepting queries and mutations to enforce access policies.
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
import { enhance } from '@zenstackhq/runtime';
|
|
66
|
+
|
|
67
|
+
// a regular Prisma client
|
|
68
|
+
const prisma = new PrismaClient();
|
|
69
|
+
|
|
70
|
+
async function getPosts(userId: string) {
|
|
71
|
+
// create an enhanced Prisma client that has access control enabled
|
|
72
|
+
const enhanced = enhance(prisma, { user: userId });
|
|
73
|
+
|
|
74
|
+
// only posts that're visible to the user will be returned
|
|
75
|
+
return enhanced.post.findMany();
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
### 3. Automatic RESTful APIs through server adapters
|
|
80
|
+
|
|
81
|
+
Server adapter packages help you wrap an access-control-enabled Prisma client into backend CRUD APIs that can be safely called from the frontend. Here's an example for Next.js:
|
|
82
|
+
|
|
83
|
+
```ts
|
|
84
|
+
// pages/api/model/[...path].ts
|
|
85
|
+
|
|
86
|
+
import { requestHandler } from '@zenstackhq/next';
|
|
87
|
+
import { enhance } from '@zenstackhq/runtime';
|
|
88
|
+
import { getSessionUser } from '@lib/auth';
|
|
89
|
+
import { prisma } from '@lib/db';
|
|
90
|
+
|
|
91
|
+
// Mount Prisma-style APIs: "/api/model/post/findMany", "/api/model/post/create", etc.
|
|
92
|
+
// Can be configured to provide standard RESTful APIs (using JSON:API) instead.
|
|
93
|
+
export default requestHandler({
|
|
94
|
+
getPrisma: (req, res) => enhance(prisma, { user: getSessionUser(req, res) }),
|
|
95
|
+
});
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### 4. Generated client libraries (hooks) for data access
|
|
99
|
+
|
|
100
|
+
Plugins can generate strong-typed client libraries that talk to the aforementioned APIs. Here's an example for React:
|
|
101
|
+
|
|
102
|
+
```tsx
|
|
103
|
+
// components/MyPosts.tsx
|
|
104
|
+
|
|
105
|
+
import { useFindManyPost } from '@lib/hooks';
|
|
106
|
+
|
|
107
|
+
const MyPosts = () => {
|
|
108
|
+
// list all posts that're visible to the current user, together with their authors
|
|
109
|
+
const { data: posts } = useFindManyPost({
|
|
110
|
+
include: { author: true },
|
|
111
|
+
orderBy: { createdAt: 'desc' },
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
return (
|
|
115
|
+
<ul>
|
|
116
|
+
{posts?.map((post) => (
|
|
117
|
+
<li key={post.id}>
|
|
118
|
+
{post.title} by {post.author.name}
|
|
119
|
+
</li>
|
|
120
|
+
))}
|
|
121
|
+
</ul>
|
|
122
|
+
);
|
|
123
|
+
};
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
## Architecture
|
|
127
|
+
|
|
128
|
+
The following diagram gives a high-level architecture overview of ZenStack.
|
|
129
|
+
|
|
130
|
+

|
|
131
|
+
|
|
132
|
+
## Links
|
|
133
|
+
|
|
134
|
+
- [Home](https://zenstack.dev)
|
|
135
|
+
- [Documentation](https://zenstack.dev/docs)
|
|
136
|
+
- [Community chat](https://go.zenstack.dev/chat)
|
|
137
|
+
- [Twitter](https://twitter.com/zenstackhq)
|
|
138
|
+
- [Blog](https://zenstack.dev/blog)
|
|
139
|
+
|
|
140
|
+
## Features
|
|
141
|
+
|
|
142
|
+
- Access control and data validation rules right inside your Prisma schema
|
|
143
|
+
- Auto-generated OpenAPI (RESTful) specifications, services, and client libraries
|
|
144
|
+
- End-to-end type safety
|
|
145
|
+
- Extensible: custom attributes, functions, and a plugin system
|
|
146
|
+
- A framework-agnostic core with framework-specific adapters
|
|
147
|
+
- Uncompromised performance
|
|
148
|
+
|
|
149
|
+
### Plugins
|
|
150
|
+
|
|
151
|
+
- Prisma schema generator
|
|
152
|
+
- Zod schema generator
|
|
153
|
+
- [SWR](https://github.com/vercel/swr) and [TanStack Query](https://github.com/TanStack/query) hooks generator
|
|
154
|
+
- OpenAPI specification generator
|
|
155
|
+
- [tRPC](https://trpc.io) router generator
|
|
156
|
+
- 🙋🏻 [Request for a plugin](https://go.zenstack.dev/chat)
|
|
157
|
+
|
|
158
|
+
### Framework adapters
|
|
159
|
+
|
|
160
|
+
- [Next.js](https://zenstack.dev/docs/reference/server-adapters/next) (including support for the new "app directory" in Next.js 13)
|
|
161
|
+
- [SvelteKit](https://zenstack.dev/docs/reference/server-adapters/sveltekit)
|
|
162
|
+
- [Fastify](https://zenstack.dev/docs/reference/server-adapters/fastify)
|
|
163
|
+
- [ExpressJS](https://zenstack.dev/docs/reference/server-adapters/express)
|
|
164
|
+
- Nuxt.js (Future)
|
|
165
|
+
- 🙋🏻 [Request for an adapter](https://go.zenstack.dev/chat)
|
|
166
|
+
|
|
167
|
+
### Prisma schema extensions
|
|
168
|
+
|
|
169
|
+
- [Custom attributes and functions](https://zenstack.dev/docs/reference/zmodel-language#custom-attributes-and-functions)
|
|
170
|
+
- [Multi-file schema and model inheritance](https://zenstack.dev/docs/guides/multiple-schema)
|
|
171
|
+
- Strong-typed JSON field (coming soon)
|
|
172
|
+
- Polymorphism (future)
|
|
173
|
+
- 🙋🏻 [Request for an extension](https://go.zenstack.dev/chat)
|
|
174
|
+
|
|
175
|
+
## Examples
|
|
176
|
+
|
|
177
|
+
Check out the [Collaborative Todo App](https://zenstack-todo.vercel.app/) for a running example. You can find different implementations below:
|
|
178
|
+
|
|
179
|
+
- [Next.js + SWR hooks](https://github.com/zenstackhq/sample-todo-nextjs)
|
|
180
|
+
- [Next.js + TanStack Query](https://github.com/zenstackhq/sample-todo-nextjs-tanstack)
|
|
181
|
+
- [Next.js + tRPC](https://github.com/zenstackhq/sample-todo-trpc)
|
|
182
|
+
- [SvelteKit + TanStack Query](https://github.com/zenstackhq/sample-todo-sveltekit)
|
|
183
|
+
|
|
184
|
+
## Community
|
|
185
|
+
|
|
186
|
+
Join our [discord server](https://discord.gg/Ykhr738dUe) for chat and updates!
|
|
187
|
+
|
|
188
|
+
## Contributing
|
|
189
|
+
|
|
190
|
+
If you like ZenStack, join us to make it a better tool! Please use the [Contributing Guide](CONTRIBUTING.md) for details on how to get started, and don't hesitate to join [Discord](https://discord.gg/Ykhr738dUe) to share your thoughts.
|
|
191
|
+
|
|
192
|
+
## License
|
|
193
|
+
|
|
194
|
+
[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('74944eb779d7d3b4ce185be843fde9fc', {
|
|
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 {}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
declare type Options = {
|
|
2
|
+
schema: string;
|
|
3
|
+
output?: string;
|
|
4
|
+
dependencyCheck: boolean;
|
|
5
|
+
versionCheck: boolean;
|
|
6
|
+
compile: boolean;
|
|
7
|
+
defaultPlugins: boolean;
|
|
8
|
+
};
|
|
9
|
+
/**
|
|
10
|
+
* CLI action for generating code from schema
|
|
11
|
+
*/
|
|
12
|
+
export declare function generate(projectPath: string, options: Options): Promise<void>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1,71 @@
|
|
|
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.generate = void 0;
|
|
16
|
+
const sdk_1 = require("@zenstackhq/sdk");
|
|
17
|
+
const colors_1 = __importDefault(require("colors"));
|
|
18
|
+
const path_1 = __importDefault(require("path"));
|
|
19
|
+
const cli_error_1 = require("../cli-error");
|
|
20
|
+
const cli_util_1 = require("../cli-util");
|
|
21
|
+
const plugin_runner_1 = require("../plugin-runner");
|
|
22
|
+
/**
|
|
23
|
+
* CLI action for generating code from schema
|
|
24
|
+
*/
|
|
25
|
+
function generate(projectPath, options) {
|
|
26
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
27
|
+
if (options.dependencyCheck) {
|
|
28
|
+
(0, cli_util_1.checkRequiredPackage)('prisma', cli_util_1.requiredPrismaVersion);
|
|
29
|
+
(0, cli_util_1.checkRequiredPackage)('@prisma/client', cli_util_1.requiredPrismaVersion);
|
|
30
|
+
}
|
|
31
|
+
// check for multiple versions of Zenstack packages
|
|
32
|
+
const packages = (0, cli_util_1.getZenStackPackages)(projectPath);
|
|
33
|
+
if (packages) {
|
|
34
|
+
const versions = new Set(packages.map((p) => p.version));
|
|
35
|
+
if (versions.size > 1) {
|
|
36
|
+
console.warn(colors_1.default.yellow('WARNING: Multiple versions of Zenstack packages detected. Run "zenstack info" to see details.'));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
const tasks = [runPlugins(options)];
|
|
40
|
+
if (options.versionCheck) {
|
|
41
|
+
tasks.push((0, cli_util_1.checkNewVersion)());
|
|
42
|
+
}
|
|
43
|
+
yield Promise.all(tasks);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
exports.generate = generate;
|
|
47
|
+
function runPlugins(options) {
|
|
48
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
49
|
+
const model = yield (0, cli_util_1.loadDocument)(options.schema);
|
|
50
|
+
const runnerOpts = {
|
|
51
|
+
schema: model,
|
|
52
|
+
schemaPath: path_1.default.resolve(options.schema),
|
|
53
|
+
defaultPlugins: options.defaultPlugins,
|
|
54
|
+
output: options.output,
|
|
55
|
+
compile: options.compile,
|
|
56
|
+
};
|
|
57
|
+
try {
|
|
58
|
+
yield new plugin_runner_1.PluginRunner().run(runnerOpts);
|
|
59
|
+
}
|
|
60
|
+
catch (err) {
|
|
61
|
+
if (err instanceof sdk_1.PluginError) {
|
|
62
|
+
console.error(colors_1.default.red(`${err.plugin}: ${err.message}`));
|
|
63
|
+
throw new cli_error_1.CliError(err.message);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
throw err;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=generate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate.js","sourceRoot":"","sources":["../../../src/cli/actions/generate.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,yCAA8C;AAC9C,oDAA4B;AAC5B,gDAAwB;AACxB,4CAAwC;AACxC,0CAMqB;AACrB,oDAAqE;AAWrE;;GAEG;AACH,SAAsB,QAAQ,CAAC,WAAmB,EAAE,OAAgB;;QAChE,IAAI,OAAO,CAAC,eAAe,EAAE;YACzB,IAAA,+BAAoB,EAAC,QAAQ,EAAE,gCAAqB,CAAC,CAAC;YACtD,IAAA,+BAAoB,EAAC,gBAAgB,EAAE,gCAAqB,CAAC,CAAC;SACjE;QAED,mDAAmD;QACnD,MAAM,QAAQ,GAAG,IAAA,8BAAmB,EAAC,WAAW,CAAC,CAAC;QAClD,IAAI,QAAQ,EAAE;YACV,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAS,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;YACjE,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE;gBACnB,OAAO,CAAC,IAAI,CACR,gBAAM,CAAC,MAAM,CACT,+FAA+F,CAClG,CACJ,CAAC;aACL;SACJ;QAED,MAAM,KAAK,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;QAEpC,IAAI,OAAO,CAAC,YAAY,EAAE;YACtB,KAAK,CAAC,IAAI,CAAC,IAAA,0BAAe,GAAE,CAAC,CAAC;SACjC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;CAAA;AA1BD,4BA0BC;AAED,SAAe,UAAU,CAAC,OAAgB;;QACtC,MAAM,KAAK,GAAG,MAAM,IAAA,uBAAY,EAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QAEjD,MAAM,UAAU,GAAwB;YACpC,MAAM,EAAE,KAAK;YACb,UAAU,EAAE,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC;YACxC,cAAc,EAAE,OAAO,CAAC,cAAc;YACtC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,OAAO,EAAE,OAAO,CAAC,OAAO;SAC3B,CAAC;QAEF,IAAI;YACA,MAAM,IAAI,4BAAY,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;SAC5C;QAAC,OAAO,GAAG,EAAE;YACV,IAAI,GAAG,YAAY,iBAAW,EAAE;gBAC5B,OAAO,CAAC,KAAK,CAAC,gBAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAC3D,MAAM,IAAI,oBAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;aACnC;iBAAM;gBACH,MAAM,GAAG,CAAC;aACb;SACJ;IACL,CAAC;CAAA"}
|
|
@@ -0,0 +1,20 @@
|
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./generate"), exports);
|
|
18
|
+
__exportStar(require("./info"), exports);
|
|
19
|
+
__exportStar(require("./init"), exports);
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cli/actions/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,yCAAuB;AACvB,yCAAuB"}
|
|
@@ -0,0 +1,63 @@
|
|
|
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.info = void 0;
|
|
16
|
+
const colors_1 = __importDefault(require("colors"));
|
|
17
|
+
const get_latest_version_1 = __importDefault(require("get-latest-version"));
|
|
18
|
+
const ora_1 = __importDefault(require("ora"));
|
|
19
|
+
const semver_1 = __importDefault(require("semver"));
|
|
20
|
+
const cli_util_1 = require("../cli-util");
|
|
21
|
+
/**
|
|
22
|
+
* CLI action for getting information about installed ZenStack packages
|
|
23
|
+
*/
|
|
24
|
+
function info(projectPath) {
|
|
25
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
26
|
+
const packages = (0, cli_util_1.getZenStackPackages)(projectPath);
|
|
27
|
+
if (!packages) {
|
|
28
|
+
console.error('Unable to locate package.json. Are you in a valid project directory?');
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
console.log('Installed ZenStack Packages:');
|
|
32
|
+
const versions = new Set();
|
|
33
|
+
for (const { pkg, version } of packages) {
|
|
34
|
+
versions.add(version);
|
|
35
|
+
console.log(` ${colors_1.default.green(pkg.padEnd(20))}\t${version}`);
|
|
36
|
+
}
|
|
37
|
+
if (versions.size > 1) {
|
|
38
|
+
console.warn(colors_1.default.yellow('WARNING: Multiple versions of Zenstack packages detected. This may cause issues.'));
|
|
39
|
+
}
|
|
40
|
+
else if (versions.size > 0) {
|
|
41
|
+
const spinner = (0, ora_1.default)('Checking npm registry').start();
|
|
42
|
+
const latest = yield (0, get_latest_version_1.default)('zenstack');
|
|
43
|
+
if (!latest) {
|
|
44
|
+
spinner.fail('unable to check for latest version');
|
|
45
|
+
}
|
|
46
|
+
else {
|
|
47
|
+
spinner.succeed();
|
|
48
|
+
const version = [...versions][0];
|
|
49
|
+
if (semver_1.default.gt(latest, version)) {
|
|
50
|
+
console.log(`A newer version of Zenstack is available: ${latest}.`);
|
|
51
|
+
}
|
|
52
|
+
else if (semver_1.default.gt(version, latest)) {
|
|
53
|
+
console.log('You are using a pre-release version of Zenstack.');
|
|
54
|
+
}
|
|
55
|
+
else {
|
|
56
|
+
console.log('You are using the latest version of Zenstack.');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
exports.info = info;
|
|
63
|
+
//# sourceMappingURL=info.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"info.js","sourceRoot":"","sources":["../../../src/cli/actions/info.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,oDAA4B;AAC5B,4EAAkD;AAClD,8CAAsB;AACtB,oDAA4B;AAC5B,0CAAkD;AAElD;;GAEG;AACH,SAAsB,IAAI,CAAC,WAAmB;;QAC1C,MAAM,QAAQ,GAAG,IAAA,8BAAmB,EAAC,WAAW,CAAC,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE;YACX,OAAO,CAAC,KAAK,CAAC,sEAAsE,CAAC,CAAC;YACtF,OAAO;SACV;QAED,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,QAAQ,EAAE;YACrC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACtB,OAAO,CAAC,GAAG,CAAC,OAAO,gBAAM,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,KAAK,OAAO,EAAE,CAAC,CAAC;SAClE;QAED,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE;YACnB,OAAO,CAAC,IAAI,CAAC,gBAAM,CAAC,MAAM,CAAC,kFAAkF,CAAC,CAAC,CAAC;SACnH;aAAM,IAAI,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE;YAC1B,MAAM,OAAO,GAAG,IAAA,aAAG,EAAC,uBAAuB,CAAC,CAAC,KAAK,EAAE,CAAC;YACrD,MAAM,MAAM,GAAG,MAAM,IAAA,4BAAgB,EAAC,UAAU,CAAC,CAAC;YAElD,IAAI,CAAC,MAAM,EAAE;gBACT,OAAO,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;aACtD;iBAAM;gBACH,OAAO,CAAC,OAAO,EAAE,CAAC;gBAClB,MAAM,OAAO,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;gBACjC,IAAI,gBAAM,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE;oBAC5B,OAAO,CAAC,GAAG,CAAC,6CAA6C,MAAM,GAAG,CAAC,CAAC;iBACvE;qBAAM,IAAI,gBAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,EAAE;oBACnC,OAAO,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC;iBACnE;qBAAM;oBACH,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;iBAChE;aACJ;SACJ;IACL,CAAC;CAAA;AAlCD,oBAkCC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { PackageManagers } from '../../utils/pkg-utils';
|
|
2
|
+
declare type Options = {
|
|
3
|
+
prisma: string | undefined;
|
|
4
|
+
packageManager: PackageManagers | undefined;
|
|
5
|
+
versionCheck: boolean;
|
|
6
|
+
tag?: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* CLI action for initializing an existing project
|
|
10
|
+
*/
|
|
11
|
+
export declare function init(projectPath: string, options: Options): Promise<void>;
|
|
12
|
+
export {};
|
|
@@ -0,0 +1,83 @@
|
|
|
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.init = void 0;
|
|
16
|
+
const colors_1 = __importDefault(require("colors"));
|
|
17
|
+
const fs_1 = __importDefault(require("fs"));
|
|
18
|
+
const path_1 = __importDefault(require("path"));
|
|
19
|
+
const pkg_utils_1 = require("../../utils/pkg-utils");
|
|
20
|
+
const version_utils_1 = require("../../utils/version-utils");
|
|
21
|
+
const cli_error_1 = require("../cli-error");
|
|
22
|
+
const cli_util_1 = require("../cli-util");
|
|
23
|
+
/**
|
|
24
|
+
* CLI action for initializing an existing project
|
|
25
|
+
*/
|
|
26
|
+
function init(projectPath, options) {
|
|
27
|
+
var _a;
|
|
28
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
29
|
+
if (!fs_1.default.existsSync(projectPath)) {
|
|
30
|
+
console.error(`Path does not exist: ${projectPath}`);
|
|
31
|
+
throw new cli_error_1.CliError('project path does not exist');
|
|
32
|
+
}
|
|
33
|
+
const defaultPrismaSchemaLocation = './prisma/schema.prisma';
|
|
34
|
+
let prismaSchema = options.prisma;
|
|
35
|
+
if (prismaSchema) {
|
|
36
|
+
if (!fs_1.default.existsSync(prismaSchema)) {
|
|
37
|
+
console.error(`Prisma schema file does not exist: ${prismaSchema}`);
|
|
38
|
+
throw new cli_error_1.CliError('prisma schema does not exist');
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
else if (fs_1.default.existsSync(defaultPrismaSchemaLocation)) {
|
|
42
|
+
prismaSchema = defaultPrismaSchemaLocation;
|
|
43
|
+
}
|
|
44
|
+
const zmodelFile = path_1.default.join(projectPath, './schema.zmodel');
|
|
45
|
+
let sampleModelGenerated = false;
|
|
46
|
+
if (fs_1.default.existsSync(zmodelFile)) {
|
|
47
|
+
console.warn(`ZenStack model already exists at ${zmodelFile}, not generating a new one.`);
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
if (prismaSchema) {
|
|
51
|
+
// copy over schema.prisma
|
|
52
|
+
fs_1.default.copyFileSync(prismaSchema, zmodelFile);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
// create a new model
|
|
56
|
+
const starterContent = fs_1.default.readFileSync(path_1.default.join(__dirname, '../../res/starter.zmodel'), 'utf-8');
|
|
57
|
+
fs_1.default.writeFileSync(zmodelFile, starterContent);
|
|
58
|
+
sampleModelGenerated = true;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
(0, pkg_utils_1.ensurePackage)('prisma', true, options.packageManager, 'latest', projectPath);
|
|
62
|
+
(0, pkg_utils_1.ensurePackage)('@prisma/client', false, options.packageManager, 'latest', projectPath);
|
|
63
|
+
const tag = (_a = options.tag) !== null && _a !== void 0 ? _a : (0, version_utils_1.getVersion)();
|
|
64
|
+
(0, pkg_utils_1.installPackage)('zenstack', true, options.packageManager, tag, projectPath);
|
|
65
|
+
(0, pkg_utils_1.installPackage)('@zenstackhq/runtime', false, options.packageManager, tag, projectPath);
|
|
66
|
+
if (sampleModelGenerated) {
|
|
67
|
+
console.log(`Sample model generated at: ${colors_1.default.blue(zmodelFile)}
|
|
68
|
+
|
|
69
|
+
Please check the following guide on how to model your app:
|
|
70
|
+
https://zenstack.dev/#/modeling-your-app.`);
|
|
71
|
+
}
|
|
72
|
+
else if (prismaSchema) {
|
|
73
|
+
console.log(`Your current Prisma schema "${prismaSchema}" has been copied to "${zmodelFile}".
|
|
74
|
+
Moving forward please edit this file and run "zenstack generate" to regenerate Prisma schema.`);
|
|
75
|
+
}
|
|
76
|
+
console.log(colors_1.default.green('\nProject initialized successfully!'));
|
|
77
|
+
if (options.versionCheck) {
|
|
78
|
+
yield (0, cli_util_1.checkNewVersion)();
|
|
79
|
+
}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
exports.init = init;
|
|
83
|
+
//# sourceMappingURL=init.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/actions/init.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,oDAA4B;AAC5B,4CAAoB;AACpB,gDAAwB;AACxB,qDAAuF;AACvF,6DAAuD;AACvD,4CAAwC;AACxC,0CAA8C;AAS9C;;GAEG;AACH,SAAsB,IAAI,CAAC,WAAmB,EAAE,OAAgB;;;QAC5D,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE;YAC7B,OAAO,CAAC,KAAK,CAAC,wBAAwB,WAAW,EAAE,CAAC,CAAC;YACrD,MAAM,IAAI,oBAAQ,CAAC,6BAA6B,CAAC,CAAC;SACrD;QAED,MAAM,2BAA2B,GAAG,wBAAwB,CAAC;QAC7D,IAAI,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;QAClC,IAAI,YAAY,EAAE;YACd,IAAI,CAAC,YAAE,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;gBAC9B,OAAO,CAAC,KAAK,CAAC,sCAAsC,YAAY,EAAE,CAAC,CAAC;gBACpE,MAAM,IAAI,oBAAQ,CAAC,8BAA8B,CAAC,CAAC;aACtD;SACJ;aAAM,IAAI,YAAE,CAAC,UAAU,CAAC,2BAA2B,CAAC,EAAE;YACnD,YAAY,GAAG,2BAA2B,CAAC;SAC9C;QAED,MAAM,UAAU,GAAG,cAAI,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;QAC7D,IAAI,oBAAoB,GAAG,KAAK,CAAC;QAEjC,IAAI,YAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE;YAC3B,OAAO,CAAC,IAAI,CAAC,oCAAoC,UAAU,6BAA6B,CAAC,CAAC;SAC7F;aAAM;YACH,IAAI,YAAY,EAAE;gBACd,0BAA0B;gBAC1B,YAAE,CAAC,YAAY,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;aAC7C;iBAAM;gBACH,qBAAqB;gBACrB,MAAM,cAAc,GAAG,YAAE,CAAC,YAAY,CAAC,cAAI,CAAC,IAAI,CAAC,SAAS,EAAE,0BAA0B,CAAC,EAAE,OAAO,CAAC,CAAC;gBAClG,YAAE,CAAC,aAAa,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;gBAC7C,oBAAoB,GAAG,IAAI,CAAC;aAC/B;SACJ;QAED,IAAA,yBAAa,EAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,cAAc,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QAC7E,IAAA,yBAAa,EAAC,gBAAgB,EAAE,KAAK,EAAE,OAAO,CAAC,cAAc,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC;QAEtF,MAAM,GAAG,GAAG,MAAA,OAAO,CAAC,GAAG,mCAAI,IAAA,0BAAU,GAAE,CAAC;QACxC,IAAA,0BAAc,EAAC,UAAU,EAAE,IAAI,EAAE,OAAO,CAAC,cAAc,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QAC3E,IAAA,0BAAc,EAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,CAAC,cAAc,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;QAEvF,IAAI,oBAAoB,EAAE;YACtB,OAAO,CAAC,GAAG,CAAC,8BAA8B,gBAAM,CAAC,IAAI,CAAC,UAAU,CAAC;;;8CAG3B,CAAC,CAAC;SAC3C;aAAM,IAAI,YAAY,EAAE;YACrB,OAAO,CAAC,GAAG,CACP,+BAA+B,YAAY,yBAAyB,UAAU;8FACI,CACrF,CAAC;SACL;QAED,OAAO,CAAC,GAAG,CAAC,gBAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC,CAAC;QAEjE,IAAI,OAAO,CAAC,YAAY,EAAE;YACtB,MAAM,IAAA,0BAAe,GAAE,CAAC;SAC3B;;CACJ;AA1DD,oBA0DC"}
|
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,21 @@
|
|
|
1
|
+
import { Model } from '@zenstackhq/language/ast';
|
|
2
|
+
import { LangiumDocument, LangiumDocuments } from 'langium';
|
|
3
|
+
import { URI } from 'vscode-uri';
|
|
4
|
+
import { ZModelServices } from '../language-server/zmodel-module';
|
|
5
|
+
export declare const requiredPrismaVersion = "4.8.0";
|
|
6
|
+
/**
|
|
7
|
+
* Loads a zmodel document from a file.
|
|
8
|
+
* @param fileName File name
|
|
9
|
+
* @param services Language services
|
|
10
|
+
* @returns Parsed and validated AST
|
|
11
|
+
*/
|
|
12
|
+
export declare function loadDocument(fileName: string): Promise<Model>;
|
|
13
|
+
export declare function eagerLoadAllImports(document: LangiumDocument, documents: LangiumDocuments, uris?: Set<string>): URI[];
|
|
14
|
+
export declare function mergeImportsDeclarations(documents: LangiumDocuments, model: Model): void;
|
|
15
|
+
export declare function getPluginDocuments(services: ZModelServices, fileName: string): Promise<LangiumDocument[]>;
|
|
16
|
+
export declare function getZenStackPackages(projectPath: string): {
|
|
17
|
+
pkg: string;
|
|
18
|
+
version: any;
|
|
19
|
+
}[] | undefined;
|
|
20
|
+
export declare function checkRequiredPackage(packageName: string, minVersion?: string): void;
|
|
21
|
+
export declare function checkNewVersion(): Promise<void>;
|