diff --git a/samples/todo/lib/context.ts b/samples/todo/lib/context.ts
index 0fa24e751..33220359b 100644
--- a/samples/todo/lib/context.ts
+++ b/samples/todo/lib/context.ts
@@ -17,15 +17,16 @@ export const SpaceContext = createContext
(undefined);
export function useCurrentSpace() {
const router = useRouter();
const { find } = useSpace();
- const spaces = find({
- where: {
- slug: router.query.slug as string,
+ const spaces = find(
+ {
+ where: {
+ slug: router.query.slug as string,
+ },
},
- });
-
- if (!router.query.slug) {
- return undefined;
- }
+ {
+ disabled: !router.query.slug,
+ }
+ );
return spaces.data?.[0];
}
diff --git a/samples/todo/package-lock.json b/samples/todo/package-lock.json
index a67305e3e..f7130ad13 100644
--- a/samples/todo/package-lock.json
+++ b/samples/todo/package-lock.json
@@ -1,17 +1,17 @@
{
"name": "todo",
- "version": "0.3.4",
+ "version": "0.3.8",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "todo",
- "version": "0.3.4",
+ "version": "0.3.8",
"dependencies": {
"@heroicons/react": "^2.0.12",
"@prisma/client": "^4.4.0",
- "@zenstackhq/internal": "^0.3.4",
- "@zenstackhq/runtime": "^0.3.4",
+ "@zenstackhq/internal": "^0.3.8",
+ "@zenstackhq/runtime": "^0.3.8",
"bcryptjs": "^2.4.3",
"daisyui": "^2.31.0",
"moment": "^2.29.4",
@@ -36,7 +36,7 @@
"postcss": "^8.4.16",
"tailwindcss": "^3.1.8",
"typescript": "^4.6.2",
- "zenstack": "^0.3.4"
+ "zenstack": "^0.3.8"
}
},
"node_modules/@babel/code-frame": {
@@ -723,9 +723,9 @@
}
},
"node_modules/@zenstackhq/internal": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/@zenstackhq/internal/-/internal-0.3.4.tgz",
- "integrity": "sha512-fBRbVC/AGmBX1l0U66lP/d1AaEY2rmxoPa2g1xMIeeoPnnTetymxZloUKdC2+J54/sV6q4TWfN6g5UC11SCthQ==",
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@zenstackhq/internal/-/internal-0.3.8.tgz",
+ "integrity": "sha512-h99TnZuYruHRdVSJ253o9cRxpY6QUa6Dkoi+hxhw43toaGkJ4I2HVH3iCpkGhKgyvihfl6cj9mvIU+DHJ67mJA==",
"dependencies": {
"bcryptjs": "^2.4.3",
"colors": "1.4.0",
@@ -744,9 +744,9 @@
}
},
"node_modules/@zenstackhq/runtime": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/@zenstackhq/runtime/-/runtime-0.3.4.tgz",
- "integrity": "sha512-AH6FnHeWQ18NQmEjL3NH3zwKrrKuQ5xga3sDA5MmWyiOwnAzDI7btXfr/mpo4iCycxyDfcwSFKIAan+ddlPgGQ==",
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@zenstackhq/runtime/-/runtime-0.3.8.tgz",
+ "integrity": "sha512-EuWPBSUrWxhnncVLECSLBXLvHTwRrL5tWU+r6dp1bG1yWduj0kG9V4YIqzAyqV8EWk2BnGKKRBHCARoOtNWT/Q==",
"dependencies": {
"@zenstackhq/internal": "latest"
},
@@ -793,6 +793,18 @@
"node": ">=0.4.0"
}
},
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
"node_modules/ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -960,6 +972,15 @@
"node": ">=8"
}
},
+ "node_modules/async-exit-hook": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
+ "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
"node_modules/autoprefixer": {
"version": "10.4.12",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz",
@@ -2419,6 +2440,19 @@
"tslib": "^2.0.3"
}
},
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/ignore": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
@@ -2901,6 +2935,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/mixpanel": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/mixpanel/-/mixpanel-0.17.0.tgz",
+ "integrity": "sha512-DY5WeOy/hmkPrNiiZugJpWR0iMuOwuj1a3u0bgwB2eUFRV6oIew/pIahhpawdbNjb+Bye4a8ID3gefeNPvL81g==",
+ "dev": true,
+ "dependencies": {
+ "https-proxy-agent": "5.0.0"
+ },
+ "engines": {
+ "node": ">=10.0"
+ }
+ },
"node_modules/mkdirp": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
@@ -3070,6 +3116,12 @@
"tslib": "^2.0.3"
}
},
+ "node_modules/node-machine-id": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz",
+ "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==",
+ "dev": true
+ },
"node_modules/node-releases": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
@@ -3901,6 +3953,12 @@
"node": ">=8"
}
},
+ "node_modules/sleep-promise": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/sleep-promise/-/sleep-promise-9.1.0.tgz",
+ "integrity": "sha512-UHYzVpz9Xn8b+jikYSD6bqvf754xL2uBUzDFwiU6NcdZeifPr6UfgU43xpkPu67VMS88+TI2PSI7Eohgqf2fKA==",
+ "dev": true
+ },
"node_modules/slice-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
@@ -4529,20 +4587,25 @@
}
},
"node_modules/zenstack": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/zenstack/-/zenstack-0.3.4.tgz",
- "integrity": "sha512-kUqBrO6/j0PRBMbKiUvM/J6F7IWsYEkmozc3TgppJGC88LuvLDmjEZnIq7TRCCQebTPxgFu/mhYjiMUVC8fdAA==",
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/zenstack/-/zenstack-0.3.8.tgz",
+ "integrity": "sha512-ratdTBrswZgUem+vuQbclBf7OV1Ww0CRFvrlZmnTfeI4ObRgIfi+DanYl8zBjys9qKyZ7SoLXmcbu9lBGTcxdw==",
"dev": true,
"dependencies": {
- "@zenstackhq/internal": "0.3.4",
+ "@zenstackhq/internal": "0.3.8",
+ "async-exit-hook": "^2.0.1",
"change-case": "^4.1.2",
"chevrotain": "^9.1.0",
"colors": "1.4.0",
"commander": "^8.3.0",
+ "cuid": "^2.1.8",
"langium": "^0.5.0",
+ "mixpanel": "^0.17.0",
+ "node-machine-id": "^1.1.12",
"pluralize": "^8.0.0",
"prisma": "^4.5.0",
"promisify": "^0.0.3",
+ "sleep-promise": "^9.1.0",
"ts-morph": "^16.0.0",
"uuid": "^9.0.0",
"vscode-jsonrpc": "^8.0.2",
@@ -5048,9 +5111,9 @@
}
},
"@zenstackhq/internal": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/@zenstackhq/internal/-/internal-0.3.4.tgz",
- "integrity": "sha512-fBRbVC/AGmBX1l0U66lP/d1AaEY2rmxoPa2g1xMIeeoPnnTetymxZloUKdC2+J54/sV6q4TWfN6g5UC11SCthQ==",
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@zenstackhq/internal/-/internal-0.3.8.tgz",
+ "integrity": "sha512-h99TnZuYruHRdVSJ253o9cRxpY6QUa6Dkoi+hxhw43toaGkJ4I2HVH3iCpkGhKgyvihfl6cj9mvIU+DHJ67mJA==",
"requires": {
"bcryptjs": "^2.4.3",
"colors": "1.4.0",
@@ -5063,9 +5126,9 @@
}
},
"@zenstackhq/runtime": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/@zenstackhq/runtime/-/runtime-0.3.4.tgz",
- "integrity": "sha512-AH6FnHeWQ18NQmEjL3NH3zwKrrKuQ5xga3sDA5MmWyiOwnAzDI7btXfr/mpo4iCycxyDfcwSFKIAan+ddlPgGQ==",
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/@zenstackhq/runtime/-/runtime-0.3.8.tgz",
+ "integrity": "sha512-EuWPBSUrWxhnncVLECSLBXLvHTwRrL5tWU+r6dp1bG1yWduj0kG9V4YIqzAyqV8EWk2BnGKKRBHCARoOtNWT/Q==",
"requires": {
"@zenstackhq/internal": "latest"
}
@@ -5097,6 +5160,15 @@
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz",
"integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA=="
},
+ "agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "requires": {
+ "debug": "4"
+ }
+ },
"ajv": {
"version": "6.12.6",
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
@@ -5218,6 +5290,12 @@
"integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
"dev": true
},
+ "async-exit-hook": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/async-exit-hook/-/async-exit-hook-2.0.1.tgz",
+ "integrity": "sha512-NW2cX8m1Q7KPA7a5M2ULQeZ2wR5qI5PAbw5L0UOMxdioVk9PMZ0h1TmyZEkPYrCvYjDlFICusOu1dlEKAAeXBw==",
+ "dev": true
+ },
"autoprefixer": {
"version": "10.4.12",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.12.tgz",
@@ -6313,6 +6391,16 @@
"tslib": "^2.0.3"
}
},
+ "https-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==",
+ "dev": true,
+ "requires": {
+ "agent-base": "6",
+ "debug": "4"
+ }
+ },
"ignore": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
@@ -6666,6 +6754,15 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
"integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g=="
},
+ "mixpanel": {
+ "version": "0.17.0",
+ "resolved": "https://registry.npmjs.org/mixpanel/-/mixpanel-0.17.0.tgz",
+ "integrity": "sha512-DY5WeOy/hmkPrNiiZugJpWR0iMuOwuj1a3u0bgwB2eUFRV6oIew/pIahhpawdbNjb+Bye4a8ID3gefeNPvL81g==",
+ "dev": true,
+ "requires": {
+ "https-proxy-agent": "5.0.0"
+ }
+ },
"mkdirp": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
@@ -6763,6 +6860,12 @@
"tslib": "^2.0.3"
}
},
+ "node-machine-id": {
+ "version": "1.1.12",
+ "resolved": "https://registry.npmjs.org/node-machine-id/-/node-machine-id-1.1.12.tgz",
+ "integrity": "sha512-QNABxbrPa3qEIfrE6GOJ7BYIuignnJw7iQ2YPbc3Nla1HzRJjXzZOiikfF8m7eAMfichLt3M4VgLOetqgDmgGQ==",
+ "dev": true
+ },
"node-releases": {
"version": "2.0.6",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz",
@@ -7328,6 +7431,12 @@
"integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
"dev": true
},
+ "sleep-promise": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/sleep-promise/-/sleep-promise-9.1.0.tgz",
+ "integrity": "sha512-UHYzVpz9Xn8b+jikYSD6bqvf754xL2uBUzDFwiU6NcdZeifPr6UfgU43xpkPu67VMS88+TI2PSI7Eohgqf2fKA==",
+ "dev": true
+ },
"slice-ansi": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
@@ -7805,20 +7914,25 @@
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
},
"zenstack": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/zenstack/-/zenstack-0.3.4.tgz",
- "integrity": "sha512-kUqBrO6/j0PRBMbKiUvM/J6F7IWsYEkmozc3TgppJGC88LuvLDmjEZnIq7TRCCQebTPxgFu/mhYjiMUVC8fdAA==",
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/zenstack/-/zenstack-0.3.8.tgz",
+ "integrity": "sha512-ratdTBrswZgUem+vuQbclBf7OV1Ww0CRFvrlZmnTfeI4ObRgIfi+DanYl8zBjys9qKyZ7SoLXmcbu9lBGTcxdw==",
"dev": true,
"requires": {
- "@zenstackhq/internal": "0.3.4",
+ "@zenstackhq/internal": "0.3.8",
+ "async-exit-hook": "^2.0.1",
"change-case": "^4.1.2",
"chevrotain": "^9.1.0",
"colors": "1.4.0",
"commander": "^8.3.0",
+ "cuid": "^2.1.8",
"langium": "^0.5.0",
+ "mixpanel": "^0.17.0",
+ "node-machine-id": "^1.1.12",
"pluralize": "^8.0.0",
"prisma": "^4.5.0",
"promisify": "^0.0.3",
+ "sleep-promise": "^9.1.0",
"ts-morph": "^16.0.0",
"uuid": "^9.0.0",
"vscode-jsonrpc": "^8.0.2",
diff --git a/samples/todo/package.json b/samples/todo/package.json
index 15d5e2965..3a7c3d855 100644
--- a/samples/todo/package.json
+++ b/samples/todo/package.json
@@ -1,6 +1,6 @@
{
"name": "todo",
- "version": "0.3.7",
+ "version": "0.3.8",
"private": true,
"scripts": {
"dev": "next dev",
@@ -20,8 +20,8 @@
"dependencies": {
"@heroicons/react": "^2.0.12",
"@prisma/client": "^4.4.0",
- "@zenstackhq/internal": "^0.3.4",
- "@zenstackhq/runtime": "^0.3.4",
+ "@zenstackhq/internal": "^0.3.8",
+ "@zenstackhq/runtime": "^0.3.8",
"bcryptjs": "^2.4.3",
"daisyui": "^2.31.0",
"moment": "^2.29.4",
@@ -46,6 +46,6 @@
"postcss": "^8.4.16",
"tailwindcss": "^3.1.8",
"typescript": "^4.6.2",
- "zenstack": "^0.3.4"
+ "zenstack": "^0.3.8"
}
}
diff --git a/samples/todo/pages/space/[slug]/index.tsx b/samples/todo/pages/space/[slug]/index.tsx
index a29c2652d..773f20a3e 100644
--- a/samples/todo/pages/space/[slug]/index.tsx
+++ b/samples/todo/pages/space/[slug]/index.tsx
@@ -121,19 +121,24 @@ export default function SpaceHome() {
const space = useContext(SpaceContext);
const { find } = useList();
- const { data: lists, mutate: invalidateLists } = find({
- where: {
- space: {
- id: space?.id,
+ const { data: lists, mutate: invalidateLists } = find(
+ {
+ where: {
+ space: {
+ id: space?.id,
+ },
+ },
+ include: {
+ owner: true,
+ },
+ orderBy: {
+ updatedAt: 'desc',
},
},
- include: {
- owner: true,
- },
- orderBy: {
- updatedAt: 'desc',
- },
- });
+ {
+ disabled: !space,
+ }
+ );
return (
<>
From 739662d7a2fc1bd46b9d639baee32a0243bb9e3f Mon Sep 17 00:00:00 2001
From: Yiming <104139426+ymc9@users.noreply.github.com>
Date: Mon, 21 Nov 2022 10:48:58 +0800
Subject: [PATCH 07/22] fix: change 'get' hook's id parameter to allow
'undefined' (#107)
---
package.json | 2 +-
packages/internal/package.json | 2 +-
packages/runtime/package.json | 2 +-
packages/schema/package.json | 2 +-
.../schema/src/generator/react-hooks/index.ts | 2 +-
samples/todo/components/AuthGuard.tsx | 2 +-
samples/todo/components/BreadCrumb.tsx | 6 +--
samples/todo/package-lock.json | 50 +++++++++----------
samples/todo/package.json | 8 +--
.../pages/space/[slug]/[listId]/index.tsx | 23 +++++----
10 files changed, 51 insertions(+), 48 deletions(-)
diff --git a/package.json b/package.json
index f56011ede..6678de452 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "zenstack-monorepo",
- "version": "0.3.8",
+ "version": "0.3.9",
"description": "",
"scripts": {
"build": "pnpm -r build",
diff --git a/packages/internal/package.json b/packages/internal/package.json
index 3081d4d44..c4f420314 100644
--- a/packages/internal/package.json
+++ b/packages/internal/package.json
@@ -1,6 +1,6 @@
{
"name": "@zenstackhq/internal",
- "version": "0.3.8",
+ "version": "0.3.9",
"displayName": "ZenStack Internal Library",
"description": "ZenStack internal runtime library. This package is for supporting runtime functionality of ZenStack and not supposed to be used directly.",
"repository": {
diff --git a/packages/runtime/package.json b/packages/runtime/package.json
index d54ad6719..fe6f3854b 100644
--- a/packages/runtime/package.json
+++ b/packages/runtime/package.json
@@ -1,7 +1,7 @@
{
"name": "@zenstackhq/runtime",
"displayName": "ZenStack Runtime Library",
- "version": "0.3.8",
+ "version": "0.3.9",
"description": "This package contains runtime library for consuming client and server side code generated by ZenStack.",
"repository": {
"type": "git",
diff --git a/packages/schema/package.json b/packages/schema/package.json
index 80d82d272..2cb3d1a5d 100644
--- a/packages/schema/package.json
+++ b/packages/schema/package.json
@@ -3,7 +3,7 @@
"publisher": "zenstack",
"displayName": "ZenStack Language Tools",
"description": "A toolkit for modeling data and access policies in full-stack development with Next.js and Typescript",
- "version": "0.3.8",
+ "version": "0.3.9",
"author": {
"name": "ZenStack Team"
},
diff --git a/packages/schema/src/generator/react-hooks/index.ts b/packages/schema/src/generator/react-hooks/index.ts
index e2df73bfa..e402480ed 100644
--- a/packages/schema/src/generator/react-hooks/index.ts
+++ b/packages/schema/src/generator/react-hooks/index.ts
@@ -138,7 +138,7 @@ export default class ReactHooksGenerator implements Generator {
parameters: [
{
name: 'id',
- type: 'String',
+ type: 'String | undefined',
},
{
name: 'args?',
diff --git a/samples/todo/components/AuthGuard.tsx b/samples/todo/components/AuthGuard.tsx
index 36ef8e254..bf05da434 100644
--- a/samples/todo/components/AuthGuard.tsx
+++ b/samples/todo/components/AuthGuard.tsx
@@ -9,7 +9,7 @@ export default function AuthGuard({ children }: Props) {
if (status === 'loading') {
return Loading...
;
} else if (status === 'unauthenticated') {
- signIn();
+ signIn(undefined, { callbackUrl: '/' });
return <>>;
} else {
return <>{children}>;
diff --git a/samples/todo/components/BreadCrumb.tsx b/samples/todo/components/BreadCrumb.tsx
index cfc973d1d..6b02bb4fa 100644
--- a/samples/todo/components/BreadCrumb.tsx
+++ b/samples/todo/components/BreadCrumb.tsx
@@ -19,10 +19,10 @@ export default function BreadCrumb() {
items.push({ text: 'Home', link: '/' });
items.push({ text: space?.name || '', link: `/space/${slug}` });
- if (listId) {
- const { data } = getList(listId);
+ const { data: list } = getList(listId);
+ if (list) {
items.push({
- text: data?.title || '',
+ text: list?.title || '',
link: `/space/${slug}/${listId}`,
});
}
diff --git a/samples/todo/package-lock.json b/samples/todo/package-lock.json
index f7130ad13..f4b1e71c4 100644
--- a/samples/todo/package-lock.json
+++ b/samples/todo/package-lock.json
@@ -1,17 +1,17 @@
{
"name": "todo",
- "version": "0.3.8",
+ "version": "0.3.9",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "todo",
- "version": "0.3.8",
+ "version": "0.3.9",
"dependencies": {
"@heroicons/react": "^2.0.12",
"@prisma/client": "^4.4.0",
- "@zenstackhq/internal": "^0.3.8",
- "@zenstackhq/runtime": "^0.3.8",
+ "@zenstackhq/internal": "^0.3.9",
+ "@zenstackhq/runtime": "^0.3.9",
"bcryptjs": "^2.4.3",
"daisyui": "^2.31.0",
"moment": "^2.29.4",
@@ -36,7 +36,7 @@
"postcss": "^8.4.16",
"tailwindcss": "^3.1.8",
"typescript": "^4.6.2",
- "zenstack": "^0.3.8"
+ "zenstack": "^0.3.9"
}
},
"node_modules/@babel/code-frame": {
@@ -723,9 +723,9 @@
}
},
"node_modules/@zenstackhq/internal": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/@zenstackhq/internal/-/internal-0.3.8.tgz",
- "integrity": "sha512-h99TnZuYruHRdVSJ253o9cRxpY6QUa6Dkoi+hxhw43toaGkJ4I2HVH3iCpkGhKgyvihfl6cj9mvIU+DHJ67mJA==",
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@zenstackhq/internal/-/internal-0.3.9.tgz",
+ "integrity": "sha512-dyJW7+WYpTLHiwvZG9GoFn5RJF20Seq/wHiugVYtqLxEnH0Ow7MXLslBnKzTd4Z1TA5/nGY8kynyfiHIhjUPqg==",
"dependencies": {
"bcryptjs": "^2.4.3",
"colors": "1.4.0",
@@ -744,9 +744,9 @@
}
},
"node_modules/@zenstackhq/runtime": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/@zenstackhq/runtime/-/runtime-0.3.8.tgz",
- "integrity": "sha512-EuWPBSUrWxhnncVLECSLBXLvHTwRrL5tWU+r6dp1bG1yWduj0kG9V4YIqzAyqV8EWk2BnGKKRBHCARoOtNWT/Q==",
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@zenstackhq/runtime/-/runtime-0.3.9.tgz",
+ "integrity": "sha512-qskz4iVf04c/xsXDQkoMx+BdsjWQj47tHz/PEcuctAeYK9TFjSq/mPBVXIV+ZDsYoEJBz3Utc5JXr93PWer9Hg==",
"dependencies": {
"@zenstackhq/internal": "latest"
},
@@ -4587,12 +4587,12 @@
}
},
"node_modules/zenstack": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/zenstack/-/zenstack-0.3.8.tgz",
- "integrity": "sha512-ratdTBrswZgUem+vuQbclBf7OV1Ww0CRFvrlZmnTfeI4ObRgIfi+DanYl8zBjys9qKyZ7SoLXmcbu9lBGTcxdw==",
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/zenstack/-/zenstack-0.3.9.tgz",
+ "integrity": "sha512-2RAVQE1jPMwO+Y+yHSjAkZ4q/B881ZoUMy6F2PrDBWS0TS7l+FDmsn1DEkhmkKxL3D1P6KetfFz8IYiS0NVaBA==",
"dev": true,
"dependencies": {
- "@zenstackhq/internal": "0.3.8",
+ "@zenstackhq/internal": "0.3.9",
"async-exit-hook": "^2.0.1",
"change-case": "^4.1.2",
"chevrotain": "^9.1.0",
@@ -5111,9 +5111,9 @@
}
},
"@zenstackhq/internal": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/@zenstackhq/internal/-/internal-0.3.8.tgz",
- "integrity": "sha512-h99TnZuYruHRdVSJ253o9cRxpY6QUa6Dkoi+hxhw43toaGkJ4I2HVH3iCpkGhKgyvihfl6cj9mvIU+DHJ67mJA==",
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@zenstackhq/internal/-/internal-0.3.9.tgz",
+ "integrity": "sha512-dyJW7+WYpTLHiwvZG9GoFn5RJF20Seq/wHiugVYtqLxEnH0Ow7MXLslBnKzTd4Z1TA5/nGY8kynyfiHIhjUPqg==",
"requires": {
"bcryptjs": "^2.4.3",
"colors": "1.4.0",
@@ -5126,9 +5126,9 @@
}
},
"@zenstackhq/runtime": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/@zenstackhq/runtime/-/runtime-0.3.8.tgz",
- "integrity": "sha512-EuWPBSUrWxhnncVLECSLBXLvHTwRrL5tWU+r6dp1bG1yWduj0kG9V4YIqzAyqV8EWk2BnGKKRBHCARoOtNWT/Q==",
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/@zenstackhq/runtime/-/runtime-0.3.9.tgz",
+ "integrity": "sha512-qskz4iVf04c/xsXDQkoMx+BdsjWQj47tHz/PEcuctAeYK9TFjSq/mPBVXIV+ZDsYoEJBz3Utc5JXr93PWer9Hg==",
"requires": {
"@zenstackhq/internal": "latest"
}
@@ -7914,12 +7914,12 @@
"integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg=="
},
"zenstack": {
- "version": "0.3.8",
- "resolved": "https://registry.npmjs.org/zenstack/-/zenstack-0.3.8.tgz",
- "integrity": "sha512-ratdTBrswZgUem+vuQbclBf7OV1Ww0CRFvrlZmnTfeI4ObRgIfi+DanYl8zBjys9qKyZ7SoLXmcbu9lBGTcxdw==",
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/zenstack/-/zenstack-0.3.9.tgz",
+ "integrity": "sha512-2RAVQE1jPMwO+Y+yHSjAkZ4q/B881ZoUMy6F2PrDBWS0TS7l+FDmsn1DEkhmkKxL3D1P6KetfFz8IYiS0NVaBA==",
"dev": true,
"requires": {
- "@zenstackhq/internal": "0.3.8",
+ "@zenstackhq/internal": "0.3.9",
"async-exit-hook": "^2.0.1",
"change-case": "^4.1.2",
"chevrotain": "^9.1.0",
diff --git a/samples/todo/package.json b/samples/todo/package.json
index 3a7c3d855..620af9d33 100644
--- a/samples/todo/package.json
+++ b/samples/todo/package.json
@@ -1,6 +1,6 @@
{
"name": "todo",
- "version": "0.3.8",
+ "version": "0.3.9",
"private": true,
"scripts": {
"dev": "next dev",
@@ -20,8 +20,8 @@
"dependencies": {
"@heroicons/react": "^2.0.12",
"@prisma/client": "^4.4.0",
- "@zenstackhq/internal": "^0.3.8",
- "@zenstackhq/runtime": "^0.3.8",
+ "@zenstackhq/internal": "^0.3.9",
+ "@zenstackhq/runtime": "^0.3.9",
"bcryptjs": "^2.4.3",
"daisyui": "^2.31.0",
"moment": "^2.29.4",
@@ -46,6 +46,6 @@
"postcss": "^8.4.16",
"tailwindcss": "^3.1.8",
"typescript": "^4.6.2",
- "zenstack": "^0.3.8"
+ "zenstack": "^0.3.9"
}
}
diff --git a/samples/todo/pages/space/[slug]/[listId]/index.tsx b/samples/todo/pages/space/[slug]/[listId]/index.tsx
index 40752a3b2..8e61bcdde 100644
--- a/samples/todo/pages/space/[slug]/[listId]/index.tsx
+++ b/samples/todo/pages/space/[slug]/[listId]/index.tsx
@@ -14,17 +14,20 @@ export default function TodoList() {
const [title, setTitle] = useState('');
const { data: list } = getList(router.query.listId as string);
- const { data: todos, mutate: invalidateTodos } = findTodos({
- where: {
- listId: list?.id,
- },
- include: {
- owner: true,
- },
- orderBy: {
- updatedAt: 'desc',
+ const { data: todos, mutate: invalidateTodos } = findTodos(
+ {
+ where: {
+ listId: list?.id,
+ },
+ include: {
+ owner: true,
+ },
+ orderBy: {
+ updatedAt: 'desc',
+ },
},
- });
+ { disabled: !list }
+ );
if (!list) {
return Loading ...
;
From db78780a9fdf6341fba412af338072230491cba4 Mon Sep 17 00:00:00 2001
From: Yiming <104139426+ymc9@users.noreply.github.com>
Date: Thu, 24 Nov 2022 13:48:14 +0800
Subject: [PATCH 08/22] feat: add docsify website (#108)
---
docs/.nojekyll | 0
docs/CNAME | 1 +
docs/README.md | 28 +
docs/_coverpage.md | 12 +
docs/_media/cli-shot.png | Bin 0 -> 156029 bytes
docs/_media/logo.png | Bin 0 -> 23566 bytes
docs/_media/og-image.png | Bin 0 -> 26591 bytes
docs/_media/starter-shot.png | Bin 0 -> 89412 bytes
docs/_navbar.md | 3 +
docs/_sidebar.md | 32 ++
docs/building-your-app.md | 169 ++++++
docs/choosing-a-database.md | 11 +
docs/cli-commands.md | 123 +++++
docs/code-generation.md | 15 +
docs/evolving-model-with-migration.md | 65 +++
docs/index.html | 86 ++++
docs/integrating-authentication.md | 1 +
docs/modeling-your-app.md | 168 ++++++
docs/quick-start.md | 62 +++
docs/setup-logging.md | 92 ++++
docs/vscode-extension.md | 5 +
docs/zh-cn/README.md | 3 +
docs/zmodel-access-policy.md | 203 ++++++++
docs/zmodel-attribute.md | 480 ++++++++++++++++++
docs/zmodel-data-model.md | 35 ++
docs/zmodel-data-source.md | 80 +++
docs/zmodel-enum.md | 30 ++
docs/zmodel-field-constraint.md | 71 +++
docs/zmodel-field.md | 66 +++
docs/zmodel-overview.md | 13 +
docs/zmodel-referential-action.md | 68 +++
docs/zmodel-relation.md | 88 ++++
packages/schema/src/cli/index.ts | 51 +-
.../schema/src/language-server/constants.ts | 3 +-
packages/schema/src/res/stdlib.zmodel | 24 +
.../validation/datasource-validation.test.ts | 4 +-
36 files changed, 2066 insertions(+), 26 deletions(-)
create mode 100644 docs/.nojekyll
create mode 100644 docs/CNAME
create mode 100644 docs/README.md
create mode 100644 docs/_coverpage.md
create mode 100644 docs/_media/cli-shot.png
create mode 100644 docs/_media/logo.png
create mode 100644 docs/_media/og-image.png
create mode 100644 docs/_media/starter-shot.png
create mode 100644 docs/_navbar.md
create mode 100644 docs/_sidebar.md
create mode 100644 docs/building-your-app.md
create mode 100644 docs/choosing-a-database.md
create mode 100644 docs/cli-commands.md
create mode 100644 docs/code-generation.md
create mode 100644 docs/evolving-model-with-migration.md
create mode 100644 docs/index.html
create mode 100644 docs/integrating-authentication.md
create mode 100644 docs/modeling-your-app.md
create mode 100644 docs/quick-start.md
create mode 100644 docs/setup-logging.md
create mode 100644 docs/vscode-extension.md
create mode 100644 docs/zh-cn/README.md
create mode 100644 docs/zmodel-access-policy.md
create mode 100644 docs/zmodel-attribute.md
create mode 100644 docs/zmodel-data-model.md
create mode 100644 docs/zmodel-data-source.md
create mode 100644 docs/zmodel-enum.md
create mode 100644 docs/zmodel-field-constraint.md
create mode 100644 docs/zmodel-field.md
create mode 100644 docs/zmodel-overview.md
create mode 100644 docs/zmodel-referential-action.md
create mode 100644 docs/zmodel-relation.md
diff --git a/docs/.nojekyll b/docs/.nojekyll
new file mode 100644
index 000000000..e69de29bb
diff --git a/docs/CNAME b/docs/CNAME
new file mode 100644
index 000000000..d031bf46c
--- /dev/null
+++ b/docs/CNAME
@@ -0,0 +1 @@
+zenstack.dev
\ No newline at end of file
diff --git a/docs/README.md b/docs/README.md
new file mode 100644
index 000000000..50e6e9cc5
--- /dev/null
+++ b/docs/README.md
@@ -0,0 +1,28 @@
+# ZenStack
+
+> A toolkit for building secure CRUD apps with Next.js.
+
+## What it is
+
+ZenStack is a schema-first toolkit for defining data models, relations and access policies. It generates database schema, backend CRUD services and frontend React hooks for you automatically from the model. Our goal is to let you save time writing boilerplate code and focus on building real features!
+
+_NOTE_: ZenStack is built above [Prisma ORM](https://www.prisma.io/) - the greatest ORM solution for Typescript. It extends Prisma's power from database handling to full-stack development.
+
+See the [Quick start](quick-start.md) guide for more details.
+
+## Features
+
+- Intuitive data & authorization modeling language
+- Generating RESTful CRUD services and React hooks
+- End-to-end type safety
+- Support for [all major relational databases](zmodel-data-source.md#supported-databases)
+- Integration with authentication libraries (like [NextAuth](https://next-auth.js.org/ ':target=_blank'))
+- [VSCode extension](https://marketplace.visualstudio.com/items?itemName=zenstack.zenstack ':target=_blank') for model authoring
+
+## Examples
+
+Check out the [Collaborative Todo App](https://zenstack-todo.vercel.app/ ':target=_blank') for a running example. You can find the source code [here](https://github.com/zenstackhq/todo-demo-sqlite ':target=_blank').
+
+## Community
+
+Join our [discord server](https://go.zenstack.dev/chat ':target=_blank') for chat and updates!
diff --git a/docs/_coverpage.md b/docs/_coverpage.md
new file mode 100644
index 000000000..539dc966a
--- /dev/null
+++ b/docs/_coverpage.md
@@ -0,0 +1,12 @@
+
+
+# ZenStack 0.4.0
+
+> A toolkit for building secure CRUD apps with Next.js + Typescript.
+
+- Full-stack toolkit made for front-end developers
+- Intuitive and flexible data modeling
+- No more boilerplate CRUD code
+
+[GitHub](https://github.com/zenstackhq/zenstack/)
+[Get Started](#zenstack)
diff --git a/docs/_media/cli-shot.png b/docs/_media/cli-shot.png
new file mode 100644
index 0000000000000000000000000000000000000000..6f7fdbc6e083c09917f79cc403fa825d32aea828
GIT binary patch
literal 156029
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νSO<@ip0OQ66_uoD{O
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