zenstack 0.1.41 → 1.0.0
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/.vscode/extensions.json +7 -0
- package/.vscode/launch.json +49 -0
- package/.vscode/settings.json +4 -0
- package/README.md +1 -0
- package/package.json +8 -90
- package/packages/internal/jest.config.ts +32 -0
- package/packages/internal/package.json +42 -0
- package/packages/internal/src/constants.ts +1 -0
- package/packages/internal/src/handler/data/guard-utils.ts +7 -0
- package/packages/internal/src/handler/data/handler.ts +415 -0
- package/packages/internal/src/handler/data/query-processor.ts +504 -0
- package/packages/internal/src/handler/index.ts +1 -0
- package/packages/internal/src/handler/types.ts +20 -0
- package/packages/internal/src/index.ts +3 -0
- package/packages/internal/src/request-handler.ts +27 -0
- package/packages/internal/src/request.ts +101 -0
- package/packages/internal/src/types.ts +40 -0
- package/packages/internal/tests/query-processor.test.ts +172 -0
- package/{out/cli/tsconfig.template.json → packages/internal/tsconfig.json} +7 -3
- package/packages/runtime/auth.d.ts +1 -0
- package/packages/runtime/auth.js +3 -0
- package/packages/runtime/hooks.d.ts +10 -0
- package/packages/runtime/hooks.js +3 -0
- package/packages/runtime/index.d.ts +3 -0
- package/packages/runtime/index.js +1 -0
- package/packages/runtime/package-lock.json +512 -0
- package/packages/runtime/package.json +16 -0
- package/packages/runtime/server.d.ts +1 -0
- package/packages/runtime/server.js +3 -0
- package/packages/runtime/types.d.ts +1 -0
- package/packages/runtime/types.js +3 -0
- package/packages/schema/.eslintrc.json +13 -0
- package/packages/schema/.vscodeignore +4 -0
- package/packages/schema/asset/logo-dark.png +0 -0
- package/packages/schema/asset/logo-light.png +0 -0
- package/{bin → packages/schema/bin}/cli +0 -0
- package/packages/schema/jest.config.ts +32 -0
- package/packages/schema/langium-config.json +14 -0
- package/packages/schema/langium-quickstart.md +41 -0
- package/packages/schema/language-configuration.json +30 -0
- package/packages/schema/package.json +96 -0
- package/packages/schema/src/cli/cli-util.ts +80 -0
- package/packages/schema/src/cli/index.ts +64 -0
- package/packages/schema/src/extension.ts +76 -0
- package/packages/schema/src/generator/constants.ts +5 -0
- package/packages/schema/src/generator/index.ts +92 -0
- package/{out/generator/next-auth/index.js → packages/schema/src/generator/next-auth/index.ts} +46 -58
- package/{out → packages/schema/src}/generator/package.template.json +0 -0
- package/packages/schema/src/generator/prisma/expression-writer.ts +352 -0
- package/packages/schema/src/generator/prisma/index.ts +32 -0
- package/packages/schema/src/generator/prisma/plain-expression-builder.ts +91 -0
- package/packages/schema/src/generator/prisma/prisma-builder.ts +366 -0
- package/packages/schema/src/generator/prisma/query-gard-generator.ts +208 -0
- package/packages/schema/src/generator/prisma/schema-generator.ts +300 -0
- package/packages/schema/src/generator/react-hooks/index.ts +181 -0
- package/packages/schema/src/generator/service/index.ts +107 -0
- package/{out → packages/schema/src}/generator/tsconfig.template.json +0 -0
- package/packages/schema/src/generator/types.ts +17 -0
- package/packages/schema/src/generator/utils.ts +9 -0
- package/packages/schema/src/language-server/generated/ast.ts +603 -0
- package/{out/language-server/generated/grammar.js → packages/schema/src/language-server/generated/grammar.ts} +5 -8
- package/packages/schema/src/language-server/generated/module.ts +24 -0
- package/packages/schema/src/language-server/main.ts +12 -0
- package/{out → packages/schema/src}/language-server/stdlib.zmodel +0 -0
- package/packages/schema/src/language-server/types.ts +9 -0
- package/packages/schema/src/language-server/zmodel-index.ts +33 -0
- package/packages/schema/src/language-server/zmodel-linker.ts +409 -0
- package/packages/schema/src/language-server/zmodel-module.ts +90 -0
- package/packages/schema/src/language-server/zmodel-scope.ts +21 -0
- package/packages/schema/src/language-server/zmodel-validator.ts +35 -0
- package/packages/schema/src/language-server/zmodel.langium +186 -0
- package/packages/schema/src/utils/exec-utils.ts +5 -0
- package/packages/schema/src/utils/indent-string.ts +6 -0
- package/packages/schema/syntaxes/zmodel.json +57 -0
- package/packages/schema/syntaxes/zmodel.tmLanguage.json +57 -0
- package/packages/schema/tests/generator/expression-writer.test.ts +676 -0
- package/packages/schema/tests/generator/prisma-builder.test.ts +138 -0
- package/packages/schema/tests/schema/parser.test.ts +423 -0
- package/packages/schema/tests/schema/sample-todo.test.ts +14 -0
- package/packages/schema/tests/utils.ts +38 -0
- package/packages/schema/tsconfig.json +23 -0
- package/pnpm-workspace.yaml +3 -0
- package/samples/todo/.env +2 -0
- package/samples/todo/.eslintrc.json +3 -0
- package/samples/todo/.vscode/launch.json +11 -0
- package/samples/todo/README.md +34 -0
- package/samples/todo/components/AuthGuard.tsx +17 -0
- package/samples/todo/components/Avatar.tsx +22 -0
- package/samples/todo/components/BreadCrumb.tsx +44 -0
- package/samples/todo/components/ManageMembers.tsx +134 -0
- package/samples/todo/components/NavBar.tsx +57 -0
- package/samples/todo/components/SpaceMembers.tsx +76 -0
- package/samples/todo/components/Spaces.tsx +28 -0
- package/samples/todo/components/TimeInfo.tsx +17 -0
- package/samples/todo/components/Todo.tsx +72 -0
- package/samples/todo/components/TodoList.tsx +77 -0
- package/samples/todo/lib/context.ts +31 -0
- package/samples/todo/next.config.js +10 -0
- package/samples/todo/package-lock.json +7527 -0
- package/samples/todo/package.json +45 -0
- package/samples/todo/pages/_app.tsx +50 -0
- package/samples/todo/pages/api/auth/[...nextauth].ts +83 -0
- package/samples/todo/pages/api/zenstack/[...path].ts +16 -0
- package/samples/todo/pages/create-space.tsx +114 -0
- package/samples/todo/pages/index.tsx +32 -0
- package/samples/todo/pages/space/[slug]/[listId]/index.tsx +88 -0
- package/samples/todo/pages/space/[slug]/index.tsx +169 -0
- package/samples/todo/postcss.config.js +6 -0
- 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 +4 -0
- package/samples/todo/styles/globals.css +7 -0
- package/samples/todo/tailwind.config.js +11 -0
- package/samples/todo/tsconfig.json +28 -0
- package/samples/todo/types/next-auth.d.ts +14 -0
- package/samples/todo/types/next.d.ts +16 -0
- package/samples/todo/zenstack/migrations/20221014084317_init/migration.sql +153 -0
- package/samples/todo/zenstack/migrations/20221020094651_upate_cli/migration.sql +23 -0
- package/samples/todo/zenstack/migrations/migration_lock.toml +3 -0
- package/samples/todo/zenstack/schema.prisma +126 -0
- package/samples/todo/zenstack/schema.zmodel +161 -0
- package/tests/integration/jest.config.ts +16 -0
- package/tests/integration/package-lock.json +1081 -0
- package/tests/integration/package.json +27 -0
- package/tests/integration/tests/operation-coverate.test.ts +563 -0
- package/tests/integration/tests/operations.zmodel +69 -0
- package/tests/integration/tests/todo-e2e.test.ts +577 -0
- package/tests/integration/tests/todo.zmodel +123 -0
- package/tests/integration/tests/tsconfig.template.json +10 -0
- package/tests/integration/tests/utils.ts +133 -0
- package/tests/integration/tsconfig.json +10 -0
- package/out/cli/cli-util.js +0 -64
- package/out/cli/cli-util.js.map +0 -1
- package/out/cli/generator.js +0 -1
- package/out/cli/generator.js.map +0 -1
- package/out/cli/index.js +0 -46
- package/out/cli/index.js.map +0 -1
- package/out/cli/package.template.json +0 -10
- package/out/extension.js +0 -81
- package/out/extension.js.map +0 -1
- package/out/generator/constants.js +0 -9
- package/out/generator/constants.js.map +0 -1
- package/out/generator/data-server/index.js +0 -1
- package/out/generator/data-server/index.js.map +0 -1
- package/out/generator/index.js +0 -98
- package/out/generator/index.js.map +0 -1
- package/out/generator/next-auth/index.js.map +0 -1
- package/out/generator/prisma/expression-writer.js +0 -287
- package/out/generator/prisma/expression-writer.js.map +0 -1
- package/out/generator/prisma/index.js +0 -38
- package/out/generator/prisma/index.js.map +0 -1
- package/out/generator/prisma/plain-expression-builder.js +0 -69
- package/out/generator/prisma/plain-expression-builder.js.map +0 -1
- package/out/generator/prisma/prisma-builder.js +0 -307
- package/out/generator/prisma/prisma-builder.js.map +0 -1
- package/out/generator/prisma/query-gard-generator.js +0 -159
- package/out/generator/prisma/query-gard-generator.js.map +0 -1
- package/out/generator/prisma/schema-generator.js +0 -201
- package/out/generator/prisma/schema-generator.js.map +0 -1
- package/out/generator/query-guard/index.js +0 -2
- package/out/generator/query-guard/index.js.map +0 -1
- package/out/generator/react-hooks/index.js +0 -179
- package/out/generator/react-hooks/index.js.map +0 -1
- package/out/generator/server/data/data-generator.js +0 -376
- package/out/generator/server/data/data-generator.js.map +0 -1
- package/out/generator/server/data/expression-writer.js +0 -287
- package/out/generator/server/data/expression-writer.js.map +0 -1
- package/out/generator/server/data/plain-expression-builder.js +0 -69
- package/out/generator/server/data/plain-expression-builder.js.map +0 -1
- package/out/generator/server/data-generator.js +0 -82
- package/out/generator/server/data-generator.js.map +0 -1
- package/out/generator/server/expression-writer.js +0 -1
- package/out/generator/server/expression-writer.js.map +0 -1
- package/out/generator/server/function/function-generator.js +0 -50
- package/out/generator/server/function/function-generator.js.map +0 -1
- package/out/generator/server/function-generator.js +0 -13
- package/out/generator/server/function-generator.js.map +0 -1
- package/out/generator/server/index.js +0 -88
- package/out/generator/server/index.js.map +0 -1
- package/out/generator/server/js-expression-builder.js +0 -1
- package/out/generator/server/js-expression-builder.js.map +0 -1
- package/out/generator/server/plain-expression-builder.js +0 -1
- package/out/generator/server/plain-expression-builder.js.map +0 -1
- package/out/generator/server/server-code-generator.js +0 -3
- package/out/generator/server/server-code-generator.js.map +0 -1
- package/out/generator/server/server-code-writer.js +0 -1
- package/out/generator/server/server-code-writer.js.map +0 -1
- package/out/generator/service/index.js +0 -133
- package/out/generator/service/index.js.map +0 -1
- package/out/generator/types.js +0 -10
- package/out/generator/types.js.map +0 -1
- package/out/generator/utils.js +0 -10
- package/out/generator/utils.js.map +0 -1
- package/out/language-server/generated/ast.js +0 -386
- package/out/language-server/generated/ast.js.map +0 -1
- package/out/language-server/generated/grammar.js.map +0 -1
- package/out/language-server/generated/module.js +0 -23
- package/out/language-server/generated/module.js.map +0 -1
- package/out/language-server/main.js +0 -12
- package/out/language-server/main.js.map +0 -1
- package/out/language-server/types.js +0 -3
- package/out/language-server/types.js.map +0 -1
- package/out/language-server/zmodel-index.js +0 -38
- package/out/language-server/zmodel-index.js.map +0 -1
- package/out/language-server/zmodel-linker.js +0 -241
- package/out/language-server/zmodel-linker.js.map +0 -1
- package/out/language-server/zmodel-module.js +0 -51
- package/out/language-server/zmodel-module.js.map +0 -1
- package/out/language-server/zmodel-scope.js +0 -30
- package/out/language-server/zmodel-scope.js.map +0 -1
- package/out/language-server/zmodel-validator.js +0 -25
- package/out/language-server/zmodel-validator.js.map +0 -1
- package/out/utils/indent-string.js +0 -9
- package/out/utils/indent-string.js.map +0 -1
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Session } from 'next-auth';
|
|
2
|
+
import { JWT } from 'next-auth/jwt';
|
|
3
|
+
|
|
4
|
+
/** Example on how to extend the built-in session types */
|
|
5
|
+
declare module 'next-auth' {
|
|
6
|
+
interface Session {
|
|
7
|
+
user: { id: string; name: string; email: string; image?: string };
|
|
8
|
+
}
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/** Example on how to extend the built-in types for JWT */
|
|
12
|
+
declare module 'next-auth/jwt' {
|
|
13
|
+
interface JWT {}
|
|
14
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { NextComponentType, NextPageContext } from 'next';
|
|
2
|
+
import type { Session } from 'next-auth';
|
|
3
|
+
import type { Router } from 'next/router';
|
|
4
|
+
|
|
5
|
+
declare module 'next/app' {
|
|
6
|
+
type AppProps<P = Record<string, unknown>> = {
|
|
7
|
+
Component: NextComponentType<NextPageContext, any, P>;
|
|
8
|
+
router: Router;
|
|
9
|
+
__N_SSG?: boolean;
|
|
10
|
+
__N_SSP?: boolean;
|
|
11
|
+
pageProps: P & {
|
|
12
|
+
/** Initial session passed in from `getServerSideProps` or `getInitialProps` */
|
|
13
|
+
session?: Session;
|
|
14
|
+
};
|
|
15
|
+
};
|
|
16
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
-- CreateEnum
|
|
2
|
+
CREATE TYPE "SpaceUserRole" AS ENUM ('USER', 'ADMIN');
|
|
3
|
+
|
|
4
|
+
-- CreateTable
|
|
5
|
+
CREATE TABLE "Space" (
|
|
6
|
+
"id" TEXT NOT NULL,
|
|
7
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
8
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
9
|
+
"name" TEXT NOT NULL,
|
|
10
|
+
"slug" TEXT NOT NULL,
|
|
11
|
+
"zenstack_guard" BOOLEAN NOT NULL DEFAULT true,
|
|
12
|
+
|
|
13
|
+
CONSTRAINT "Space_pkey" PRIMARY KEY ("id")
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
-- CreateTable
|
|
17
|
+
CREATE TABLE "SpaceUser" (
|
|
18
|
+
"id" TEXT NOT NULL,
|
|
19
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
20
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
21
|
+
"spaceId" TEXT NOT NULL,
|
|
22
|
+
"userId" TEXT NOT NULL,
|
|
23
|
+
"role" "SpaceUserRole" NOT NULL,
|
|
24
|
+
"zenstack_guard" BOOLEAN NOT NULL DEFAULT true,
|
|
25
|
+
|
|
26
|
+
CONSTRAINT "SpaceUser_pkey" PRIMARY KEY ("id")
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
-- CreateTable
|
|
30
|
+
CREATE TABLE "User" (
|
|
31
|
+
"id" TEXT NOT NULL,
|
|
32
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
33
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
34
|
+
"email" TEXT NOT NULL,
|
|
35
|
+
"emailVerified" TIMESTAMP(3),
|
|
36
|
+
"password" TEXT,
|
|
37
|
+
"name" TEXT,
|
|
38
|
+
"image" TEXT,
|
|
39
|
+
"zenstack_guard" BOOLEAN NOT NULL DEFAULT true,
|
|
40
|
+
|
|
41
|
+
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
-- CreateTable
|
|
45
|
+
CREATE TABLE "List" (
|
|
46
|
+
"id" TEXT NOT NULL,
|
|
47
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
48
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
49
|
+
"spaceId" TEXT NOT NULL,
|
|
50
|
+
"ownerId" TEXT NOT NULL,
|
|
51
|
+
"title" TEXT NOT NULL,
|
|
52
|
+
"private" BOOLEAN NOT NULL DEFAULT false,
|
|
53
|
+
"zenstack_guard" BOOLEAN NOT NULL DEFAULT true,
|
|
54
|
+
|
|
55
|
+
CONSTRAINT "List_pkey" PRIMARY KEY ("id")
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
-- CreateTable
|
|
59
|
+
CREATE TABLE "Todo" (
|
|
60
|
+
"id" TEXT NOT NULL,
|
|
61
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
62
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
63
|
+
"ownerId" TEXT NOT NULL,
|
|
64
|
+
"listId" TEXT NOT NULL,
|
|
65
|
+
"title" TEXT NOT NULL,
|
|
66
|
+
"completedAt" TIMESTAMP(3),
|
|
67
|
+
"zenstack_guard" BOOLEAN NOT NULL DEFAULT true,
|
|
68
|
+
|
|
69
|
+
CONSTRAINT "Todo_pkey" PRIMARY KEY ("id")
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
-- CreateTable
|
|
73
|
+
CREATE TABLE "Account" (
|
|
74
|
+
"id" TEXT NOT NULL,
|
|
75
|
+
"userId" TEXT NOT NULL,
|
|
76
|
+
"type" TEXT NOT NULL,
|
|
77
|
+
"provider" TEXT NOT NULL,
|
|
78
|
+
"providerAccountId" TEXT NOT NULL,
|
|
79
|
+
"refresh_token" TEXT,
|
|
80
|
+
"access_token" TEXT,
|
|
81
|
+
"expires_at" INTEGER,
|
|
82
|
+
"token_type" TEXT,
|
|
83
|
+
"scope" TEXT,
|
|
84
|
+
"id_token" TEXT,
|
|
85
|
+
"session_state" TEXT,
|
|
86
|
+
"zenstack_guard" BOOLEAN NOT NULL DEFAULT true,
|
|
87
|
+
|
|
88
|
+
CONSTRAINT "Account_pkey" PRIMARY KEY ("id")
|
|
89
|
+
);
|
|
90
|
+
|
|
91
|
+
-- CreateTable
|
|
92
|
+
CREATE TABLE "Session" (
|
|
93
|
+
"id" TEXT NOT NULL,
|
|
94
|
+
"sessionToken" TEXT NOT NULL,
|
|
95
|
+
"userId" TEXT NOT NULL,
|
|
96
|
+
"expires" TIMESTAMP(3) NOT NULL,
|
|
97
|
+
"zenstack_guard" BOOLEAN NOT NULL DEFAULT true,
|
|
98
|
+
|
|
99
|
+
CONSTRAINT "Session_pkey" PRIMARY KEY ("id")
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
-- CreateTable
|
|
103
|
+
CREATE TABLE "VerificationToken" (
|
|
104
|
+
"identifier" TEXT NOT NULL,
|
|
105
|
+
"token" TEXT NOT NULL,
|
|
106
|
+
"expires" TIMESTAMP(3) NOT NULL,
|
|
107
|
+
"zenstack_guard" BOOLEAN NOT NULL DEFAULT true
|
|
108
|
+
);
|
|
109
|
+
|
|
110
|
+
-- CreateIndex
|
|
111
|
+
CREATE UNIQUE INDEX "Space_slug_key" ON "Space"("slug");
|
|
112
|
+
|
|
113
|
+
-- CreateIndex
|
|
114
|
+
CREATE UNIQUE INDEX "SpaceUser_userId_spaceId_key" ON "SpaceUser"("userId", "spaceId");
|
|
115
|
+
|
|
116
|
+
-- CreateIndex
|
|
117
|
+
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
|
118
|
+
|
|
119
|
+
-- CreateIndex
|
|
120
|
+
CREATE UNIQUE INDEX "Account_provider_providerAccountId_key" ON "Account"("provider", "providerAccountId");
|
|
121
|
+
|
|
122
|
+
-- CreateIndex
|
|
123
|
+
CREATE UNIQUE INDEX "Session_sessionToken_key" ON "Session"("sessionToken");
|
|
124
|
+
|
|
125
|
+
-- CreateIndex
|
|
126
|
+
CREATE UNIQUE INDEX "VerificationToken_token_key" ON "VerificationToken"("token");
|
|
127
|
+
|
|
128
|
+
-- CreateIndex
|
|
129
|
+
CREATE UNIQUE INDEX "VerificationToken_identifier_token_key" ON "VerificationToken"("identifier", "token");
|
|
130
|
+
|
|
131
|
+
-- AddForeignKey
|
|
132
|
+
ALTER TABLE "SpaceUser" ADD CONSTRAINT "SpaceUser_spaceId_fkey" FOREIGN KEY ("spaceId") REFERENCES "Space"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
133
|
+
|
|
134
|
+
-- AddForeignKey
|
|
135
|
+
ALTER TABLE "SpaceUser" ADD CONSTRAINT "SpaceUser_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
136
|
+
|
|
137
|
+
-- AddForeignKey
|
|
138
|
+
ALTER TABLE "List" ADD CONSTRAINT "List_spaceId_fkey" FOREIGN KEY ("spaceId") REFERENCES "Space"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
139
|
+
|
|
140
|
+
-- AddForeignKey
|
|
141
|
+
ALTER TABLE "List" ADD CONSTRAINT "List_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
142
|
+
|
|
143
|
+
-- AddForeignKey
|
|
144
|
+
ALTER TABLE "Todo" ADD CONSTRAINT "Todo_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
145
|
+
|
|
146
|
+
-- AddForeignKey
|
|
147
|
+
ALTER TABLE "Todo" ADD CONSTRAINT "Todo_listId_fkey" FOREIGN KEY ("listId") REFERENCES "List"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
148
|
+
|
|
149
|
+
-- AddForeignKey
|
|
150
|
+
ALTER TABLE "Account" ADD CONSTRAINT "Account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
151
|
+
|
|
152
|
+
-- AddForeignKey
|
|
153
|
+
ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
-- AlterTable
|
|
2
|
+
ALTER TABLE "Account" ADD COLUMN "zenstack_transaction" TEXT;
|
|
3
|
+
|
|
4
|
+
-- AlterTable
|
|
5
|
+
ALTER TABLE "List" ADD COLUMN "zenstack_transaction" TEXT;
|
|
6
|
+
|
|
7
|
+
-- AlterTable
|
|
8
|
+
ALTER TABLE "Session" ADD COLUMN "zenstack_transaction" TEXT;
|
|
9
|
+
|
|
10
|
+
-- AlterTable
|
|
11
|
+
ALTER TABLE "Space" ADD COLUMN "zenstack_transaction" TEXT;
|
|
12
|
+
|
|
13
|
+
-- AlterTable
|
|
14
|
+
ALTER TABLE "SpaceUser" ADD COLUMN "zenstack_transaction" TEXT;
|
|
15
|
+
|
|
16
|
+
-- AlterTable
|
|
17
|
+
ALTER TABLE "Todo" ADD COLUMN "zenstack_transaction" TEXT;
|
|
18
|
+
|
|
19
|
+
-- AlterTable
|
|
20
|
+
ALTER TABLE "User" ADD COLUMN "zenstack_transaction" TEXT;
|
|
21
|
+
|
|
22
|
+
-- AlterTable
|
|
23
|
+
ALTER TABLE "VerificationToken" ADD COLUMN "zenstack_transaction" TEXT;
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
datasource db {
|
|
2
|
+
provider="postgresql"
|
|
3
|
+
url=env("DATABASE_URL")
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
generator client {
|
|
7
|
+
provider = "prisma-client-js"
|
|
8
|
+
output = "../node_modules/.zenstack/.prisma"
|
|
9
|
+
previewFeatures = ["fieldReference", "interactiveTransactions"]
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
enum SpaceUserRole {
|
|
13
|
+
USER
|
|
14
|
+
ADMIN
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
model Space {
|
|
18
|
+
id String @id() @default(uuid())
|
|
19
|
+
createdAt DateTime @default(now())
|
|
20
|
+
updatedAt DateTime @updatedAt()
|
|
21
|
+
name String
|
|
22
|
+
slug String @unique()
|
|
23
|
+
members SpaceUser[]
|
|
24
|
+
lists List[]
|
|
25
|
+
zenstack_guard Boolean @default(true)
|
|
26
|
+
zenstack_transaction String?
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
model SpaceUser {
|
|
30
|
+
id String @id() @default(uuid())
|
|
31
|
+
createdAt DateTime @default(now())
|
|
32
|
+
updatedAt DateTime @updatedAt()
|
|
33
|
+
space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
|
|
34
|
+
spaceId String
|
|
35
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
36
|
+
userId String
|
|
37
|
+
role SpaceUserRole
|
|
38
|
+
zenstack_guard Boolean @default(true)
|
|
39
|
+
zenstack_transaction String?
|
|
40
|
+
@@unique([userId, spaceId])
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
model User {
|
|
44
|
+
id String @id() @default(uuid())
|
|
45
|
+
createdAt DateTime @default(now())
|
|
46
|
+
updatedAt DateTime @updatedAt()
|
|
47
|
+
email String @unique()
|
|
48
|
+
emailVerified DateTime?
|
|
49
|
+
password String?
|
|
50
|
+
name String?
|
|
51
|
+
spaces SpaceUser[]
|
|
52
|
+
image String?
|
|
53
|
+
lists List[]
|
|
54
|
+
todos Todo[]
|
|
55
|
+
accounts Account[]
|
|
56
|
+
sessions Session[]
|
|
57
|
+
zenstack_guard Boolean @default(true)
|
|
58
|
+
zenstack_transaction String?
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
model List {
|
|
62
|
+
id String @id() @default(uuid())
|
|
63
|
+
createdAt DateTime @default(now())
|
|
64
|
+
updatedAt DateTime @updatedAt()
|
|
65
|
+
space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
|
|
66
|
+
spaceId String
|
|
67
|
+
owner User @relation(fields: [ownerId], references: [id], onDelete: Cascade)
|
|
68
|
+
ownerId String
|
|
69
|
+
title String
|
|
70
|
+
private Boolean @default(false)
|
|
71
|
+
todos Todo[]
|
|
72
|
+
zenstack_guard Boolean @default(true)
|
|
73
|
+
zenstack_transaction String?
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
model Todo {
|
|
77
|
+
id String @id() @default(uuid())
|
|
78
|
+
createdAt DateTime @default(now())
|
|
79
|
+
updatedAt DateTime @updatedAt()
|
|
80
|
+
owner User @relation(fields: [ownerId], references: [id], onDelete: Cascade)
|
|
81
|
+
ownerId String
|
|
82
|
+
list List @relation(fields: [listId], references: [id], onDelete: Cascade)
|
|
83
|
+
listId String
|
|
84
|
+
title String
|
|
85
|
+
completedAt DateTime?
|
|
86
|
+
zenstack_guard Boolean @default(true)
|
|
87
|
+
zenstack_transaction String?
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
model Account {
|
|
91
|
+
id String @id() @default(uuid())
|
|
92
|
+
userId String
|
|
93
|
+
type String
|
|
94
|
+
provider String
|
|
95
|
+
providerAccountId String
|
|
96
|
+
refresh_token String?
|
|
97
|
+
access_token String?
|
|
98
|
+
expires_at Int?
|
|
99
|
+
token_type String?
|
|
100
|
+
scope String?
|
|
101
|
+
id_token String?
|
|
102
|
+
session_state String?
|
|
103
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
104
|
+
zenstack_guard Boolean @default(true)
|
|
105
|
+
zenstack_transaction String?
|
|
106
|
+
@@unique([provider, providerAccountId])
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
model Session {
|
|
110
|
+
id String @id() @default(uuid())
|
|
111
|
+
sessionToken String @unique()
|
|
112
|
+
userId String
|
|
113
|
+
expires DateTime
|
|
114
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
115
|
+
zenstack_guard Boolean @default(true)
|
|
116
|
+
zenstack_transaction String?
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
model VerificationToken {
|
|
120
|
+
identifier String
|
|
121
|
+
token String @unique()
|
|
122
|
+
expires DateTime
|
|
123
|
+
zenstack_guard Boolean @default(true)
|
|
124
|
+
zenstack_transaction String?
|
|
125
|
+
@@unique([identifier, token])
|
|
126
|
+
}
|
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Sample model for a collaborative Todo app
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
datasource db {
|
|
6
|
+
provider = 'postgresql'
|
|
7
|
+
url = env('DATABASE_URL')
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
enum SpaceUserRole {
|
|
11
|
+
USER
|
|
12
|
+
ADMIN
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
model Space {
|
|
16
|
+
id String @id @default(uuid())
|
|
17
|
+
createdAt DateTime @default(now())
|
|
18
|
+
updatedAt DateTime @updatedAt
|
|
19
|
+
name String @length(1, 100)
|
|
20
|
+
slug String @unique @length(1, 20)
|
|
21
|
+
members SpaceUser[]
|
|
22
|
+
lists List[]
|
|
23
|
+
|
|
24
|
+
// require login
|
|
25
|
+
@@deny('all', auth() == null)
|
|
26
|
+
|
|
27
|
+
// everyone can create a space
|
|
28
|
+
@@allow('create', true)
|
|
29
|
+
|
|
30
|
+
// any user in the space can read the space
|
|
31
|
+
@@allow('read', members?[user == auth()])
|
|
32
|
+
|
|
33
|
+
// space admin can update and delete
|
|
34
|
+
@@allow('update,delete', members?[user == auth() && role == ADMIN])
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
model SpaceUser {
|
|
38
|
+
id String @id @default(uuid())
|
|
39
|
+
createdAt DateTime @default(now())
|
|
40
|
+
updatedAt DateTime @updatedAt
|
|
41
|
+
space Space @relation(fields:[spaceId], references: [id], onDelete: Cascade)
|
|
42
|
+
spaceId String
|
|
43
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
44
|
+
userId String
|
|
45
|
+
role SpaceUserRole
|
|
46
|
+
|
|
47
|
+
@@unique([userId, spaceId])
|
|
48
|
+
|
|
49
|
+
// require login
|
|
50
|
+
@@deny('all', auth() == null)
|
|
51
|
+
|
|
52
|
+
// space admin can create/update/delete
|
|
53
|
+
@@allow('create,update,delete', space.members?[user == auth() && role == ADMIN])
|
|
54
|
+
|
|
55
|
+
// user can read entries for spaces which he's a member of
|
|
56
|
+
@@allow('read', space.members?[user == auth()])
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
model User {
|
|
60
|
+
id String @id @default(uuid())
|
|
61
|
+
createdAt DateTime @default(now())
|
|
62
|
+
updatedAt DateTime @updatedAt
|
|
63
|
+
email String @unique @email
|
|
64
|
+
emailVerified DateTime?
|
|
65
|
+
password String?
|
|
66
|
+
name String? @length(1, 100)
|
|
67
|
+
spaces SpaceUser[]
|
|
68
|
+
image String? @url
|
|
69
|
+
lists List[]
|
|
70
|
+
todos Todo[]
|
|
71
|
+
|
|
72
|
+
// next-auth
|
|
73
|
+
accounts Account[]
|
|
74
|
+
sessions Session[]
|
|
75
|
+
|
|
76
|
+
// can be created by anyone, even not logged in
|
|
77
|
+
@@allow('create', true)
|
|
78
|
+
|
|
79
|
+
// can be read by current user or users sharing any space
|
|
80
|
+
@@allow('read', auth() == this || spaces?[space.members?[user == auth()]])
|
|
81
|
+
|
|
82
|
+
// can only be updated and deleted by himeself
|
|
83
|
+
@@allow('update,delete', auth() == this)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
model List {
|
|
87
|
+
id String @id @default(uuid())
|
|
88
|
+
createdAt DateTime @default(now())
|
|
89
|
+
updatedAt DateTime @updatedAt
|
|
90
|
+
space Space @relation(fields: [spaceId], references: [id], onDelete: Cascade)
|
|
91
|
+
spaceId String
|
|
92
|
+
owner User @relation(fields: [ownerId], references: [id], onDelete: Cascade)
|
|
93
|
+
ownerId String
|
|
94
|
+
title String @length(1, 20)
|
|
95
|
+
private Boolean @default(false)
|
|
96
|
+
todos Todo[]
|
|
97
|
+
|
|
98
|
+
// require login
|
|
99
|
+
@@deny('all', auth() == null)
|
|
100
|
+
|
|
101
|
+
// can be read by owner or space members (only if not private)
|
|
102
|
+
@@allow('read', owner == auth() || (space.members?[user == auth()] && !private))
|
|
103
|
+
|
|
104
|
+
// can be created/updated/deleted by owner
|
|
105
|
+
@@allow('create,update,delete', owner == auth() && space.members?[user == auth()])
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
model Todo {
|
|
109
|
+
id String @id @default(uuid())
|
|
110
|
+
createdAt DateTime @default(now())
|
|
111
|
+
updatedAt DateTime @updatedAt
|
|
112
|
+
owner User @relation(fields: [ownerId], references: [id], onDelete: Cascade)
|
|
113
|
+
ownerId String
|
|
114
|
+
list List @relation(fields: [listId], references: [id], onDelete: Cascade)
|
|
115
|
+
listId String
|
|
116
|
+
title String
|
|
117
|
+
completedAt DateTime?
|
|
118
|
+
|
|
119
|
+
// require login
|
|
120
|
+
@@deny('all', auth() == null)
|
|
121
|
+
|
|
122
|
+
// owner has full access, also space members have full access (if the parent List is not private)
|
|
123
|
+
@@allow('all', list.owner == auth())
|
|
124
|
+
@@allow('all', list.space.members?[user == auth()] && !list.private)
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Models used by next-auth
|
|
128
|
+
|
|
129
|
+
model Account {
|
|
130
|
+
id String @id @default(uuid())
|
|
131
|
+
userId String
|
|
132
|
+
type String
|
|
133
|
+
provider String
|
|
134
|
+
providerAccountId String
|
|
135
|
+
refresh_token String?
|
|
136
|
+
access_token String?
|
|
137
|
+
expires_at Int?
|
|
138
|
+
token_type String?
|
|
139
|
+
scope String?
|
|
140
|
+
id_token String?
|
|
141
|
+
session_state String?
|
|
142
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
143
|
+
|
|
144
|
+
@@unique([provider, providerAccountId])
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
model Session {
|
|
148
|
+
id String @id @default(uuid())
|
|
149
|
+
sessionToken String @unique
|
|
150
|
+
userId String
|
|
151
|
+
expires DateTime
|
|
152
|
+
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
model VerificationToken {
|
|
156
|
+
identifier String
|
|
157
|
+
token String @unique
|
|
158
|
+
expires DateTime
|
|
159
|
+
|
|
160
|
+
@@unique([identifier, token])
|
|
161
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* For a detailed explanation regarding each configuration property and type check, visit:
|
|
3
|
+
* https://jestjs.io/docs/configuration
|
|
4
|
+
*/
|
|
5
|
+
export default {
|
|
6
|
+
// Automatically clear mock calls, instances, contexts and results before every test
|
|
7
|
+
clearMocks: true,
|
|
8
|
+
|
|
9
|
+
// A map from regular expressions to paths to transformers
|
|
10
|
+
transform: { '^.+\\.tsx?$': 'ts-jest' },
|
|
11
|
+
|
|
12
|
+
testTimeout: 30000,
|
|
13
|
+
|
|
14
|
+
// explicitly specify moduel paths so that resolution from local dependencies work
|
|
15
|
+
modulePaths: ['<rootDir>/tests/test-run/node_modules'],
|
|
16
|
+
};
|