Skip to content
Merged
Show file tree
Hide file tree
Changes from 44 commits
Commits
Show all changes
53 commits
Select commit Hold shift + click to select a range
29771e6
docs: v3 docs structure
ymc9 Aug 1, 2025
4a3bc18
fix build
ymc9 Aug 1, 2025
ae00828
WIP
ymc9 Aug 3, 2025
2815551
WIP
ymc9 Aug 3, 2025
f215f86
progress on ORM part
ymc9 Aug 5, 2025
a43c1d8
update
ymc9 Aug 5, 2025
f649467
update embed mechanism
ymc9 Aug 5, 2025
5cfdf6d
fix stackblitz embed
ymc9 Aug 5, 2025
2c526ff
make code tabs sync
ymc9 Aug 5, 2025
a9d76ec
complete filter section
ymc9 Aug 9, 2025
09208d3
update docs
ymc9 Aug 9, 2025
b61a2e0
progress on delete
ymc9 Aug 9, 2025
80a8026
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 10, 2025
7531a18
more progress on ORM API
ymc9 Aug 10, 2025
c608cf4
ORM docs progress
ymc9 Aug 12, 2025
710b83c
query builder docs
ymc9 Aug 12, 2025
f0014f0
computed fields
ymc9 Aug 13, 2025
016fc3d
polymorphism
ymc9 Aug 13, 2025
963d91f
plugins part
ymc9 Aug 13, 2025
dda23fc
update plugins part
ymc9 Aug 14, 2025
d7b5e4e
add logging
ymc9 Aug 14, 2025
e087eb8
add inferred types section
ymc9 Aug 15, 2025
617275e
progress
ymc9 Aug 15, 2025
6ff3510
progress
ymc9 Aug 17, 2025
22de9b9
prisma migration guide
ymc9 Aug 17, 2025
63d5c61
Merge remote-tracking branch 'origin/main' into docs/v3
ymc9 Aug 17, 2025
2fd667e
update broken links
ymc9 Aug 17, 2025
b9e6193
update
ymc9 Aug 17, 2025
1a2a102
copywriting
ymc9 Aug 18, 2025
847a11e
zmodel language reference
ymc9 Aug 19, 2025
ec14645
update
ymc9 Aug 19, 2025
3ebe44f
fix links
ymc9 Aug 19, 2025
f847870
almost done
ymc9 Aug 19, 2025
07209d7
updates
ymc9 Aug 19, 2025
16d96b1
update
ymc9 Aug 19, 2025
25822c8
update
ymc9 Aug 20, 2025
192910f
update
ymc9 Aug 21, 2025
db39b21
add feature gap
ymc9 Aug 24, 2025
3dc70c7
update
ymc9 Aug 24, 2025
2a1cbbb
use git submodules to implement code snippet loading
ymc9 Aug 24, 2025
2fe949a
addressing review comments
ymc9 Aug 24, 2025
7d880b0
update
ymc9 Aug 26, 2025
8c059c5
v3 LP
ymc9 Aug 29, 2025
790de90
update
ymc9 Aug 29, 2025
014cbbe
update
ymc9 Aug 29, 2025
1356842
update responsiveness
ymc9 Aug 29, 2025
99c6b5a
update
ymc9 Aug 29, 2025
0fdcf9c
update
ymc9 Aug 30, 2025
2e229b3
update
ymc9 Aug 30, 2025
6b9d453
update
ymc9 Aug 30, 2025
4bd1637
nav bar
ymc9 Sep 1, 2025
277f966
update
ymc9 Sep 1, 2025
0111abb
update submodules
ymc9 Sep 1, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 18 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
[submodule "code-repos/zenstackhq/v3-doc-orm"]
path = code-repos/zenstackhq/v3-doc-orm
url = https://github.com/zenstackhq/v3-doc-orm.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-fields"]
path = code-repos/zenstackhq/v3-doc-orm-computed-fields
url = https://github.com/zenstackhq/v3-doc-orm-computed-fields.git
[submodule "code-repos/zenstackhq/v3-doc-orm-computed-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-computed-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
[submodule "code-repos/zenstackhq/v3-doc-orm-typed-json"]
path = code-repos/zenstackhq/v3-doc-orm-typed-json
url = https://github.com/zenstackhq/v3-doc-orm-typed-json.git
[submodule "code-repos/zenstackhq/v3-doc-quick-start"]
path = code-repos/zenstackhq/v3-doc-quick-start
url = https://github.com/zenstackhq/v3-doc-quick-start.git
[submodule "code-repos/zenstackhq/v3-doc-orm-polymorphism"]
path = code-repos/zenstackhq/v3-doc-orm-polymorphism
url = https://github.com/zenstackhq/v3-doc-orm-polymorphism.git
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm
Submodule v3-doc-orm added at 2c8095
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-computed-fields
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-polymorphism
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-orm-typed-json
Submodule v3-doc-orm-typed-json added at 55c73f
1 change: 1 addition & 0 deletions code-repos/zenstackhq/v3-doc-quick-start
Submodule v3-doc-quick-start added at 81b6de
9 changes: 9 additions & 0 deletions docusaurus.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,10 @@ const config = {
label: '1.x',
banner: 'none',
},
'3.x': {
label: '3.0 Beta',
banner: 'none',
},
},
},
blog: false,
Expand Down Expand Up @@ -100,6 +104,11 @@ const config = {
label: 'Handbook',
},
{ to: '/blog', label: 'Blog', position: 'left' },
{
to: 'v3',
position: 'left',
label: 'V3 Beta 🚀',
},
{
href: 'https://discord.gg/Ykhr738dUe',
label: 'Discord',
Expand Down
6 changes: 5 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,8 @@
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids",
"typecheck": "tsc"
"typecheck": "tsc",
"pull-submodules": "git submodule foreach git pull origin main"
},
"dependencies": {
"@algolia/client-search": "^4.22.1",
Expand All @@ -22,12 +23,15 @@
"@docusaurus/theme-mermaid": "3.4.0",
"@giscus/react": "^2.4.0",
"@mdx-js/react": "^3.0.1",
"@stackblitz/sdk": "^1.11.0",
"autoprefixer": "^10.4.13",
"clsx": "^1.2.1",
"is-mobile": "^5.0.0",
"postcss": "^8.4.21",
"prism-react-renderer": "^2.3.1",
"prism-svelte": "^0.5.0",
"prismjs": "^1.29.0",
"raw-loader": "^4.0.2",
"react": "^18.2.0",
"react-dom": "^18.2.0",
"react-icons": "^5.0.1",
Expand Down
31 changes: 31 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

27 changes: 27 additions & 0 deletions src/components/GithubCodeBlock.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import CodeBlock from '@theme/CodeBlock';

interface GithubCodeBlockProps {
repoPath: string;
file: string;
}

const GithubCodeBlock: React.FC<GithubCodeBlockProps> = ({ repoPath, file }) => {
const code = require(`!!raw-loader!@site/code-repos/${repoPath}/${file}`).default;

const getLanguage = (file: string): string => {
if (file.endsWith('.ts')) {
return 'typescript';
} else if (file.endsWith('.zmodel')) {
return 'zmodel';
} else {
return 'plaintext';
}
};
return (
<CodeBlock language={getLanguage(file)} title={file}>
{code}
</CodeBlock>
);
};

export default GithubCodeBlock;
26 changes: 26 additions & 0 deletions src/components/StackBlitzEmbed.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import React, { useEffect, useRef } from 'react';
import sdk from '@stackblitz/sdk';

interface StackBlitzEmbedProps {
projectId: string;
height?: string;
}

const StackBlitzEmbed: React.FC<StackBlitzEmbedProps> = ({ projectId, height = '600px' }) => {
const containerRef = useRef<HTMLDivElement>(null);

useEffect(() => {
if (containerRef.current) {
sdk.embedProjectId(containerRef.current, projectId, {
openFile: 'main.ts',
height,
view: 'editor',
forceEmbedLayout: true,
});
}
}, [projectId, height]);

return <div ref={containerRef} style={{ width: '100%', height }} />;
};

export default StackBlitzEmbed;
44 changes: 44 additions & 0 deletions src/components/StackBlitzGithub.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import sdk from '@stackblitz/sdk';
import React from 'react';
import GithubCodeBlock from './GithubCodeBlock';

interface StackBlitzGithubProps {
repoPath: string;
openFile?: string;
codeFiles?: string[];
startScript?: string;
}

const StackBlitzGithub: React.FC<StackBlitzGithubProps> = ({
repoPath,
openFile = 'main.ts',
codeFiles: plainCodeFiles = undefined,
startScript,
}) => {
const options = {
openFile,
view: 'editor',
startScript,
} as const;

if (!plainCodeFiles) {
plainCodeFiles = [openFile];
}

return (
<>
<div className="mb-1 italic text-sm">
Click{' '}
<a href="#" onClick={() => sdk.openGithubProject(repoPath, options)}>
here
</a>{' '}
to open an interactive playground.
</div>
{plainCodeFiles.map((file) => (
<GithubCodeBlock key={file} repoPath={repoPath} file={file} />
))}
</>
);
};

export default StackBlitzGithub;
15 changes: 3 additions & 12 deletions src/lib/prism-zmodel.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,10 @@
Prism.languages.zmodel = Prism.languages.extend('clike', {
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc)\b/,
function: /@@?[A-Za-z_]\w*/,
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc|with)\b/,
entity: /\b(?:Int|String|Boolean|DateTime|Float|Decimal|BigInt|Bytes|Json|Unsupported)\b/,
'type-class-name': /(\b()\s+)[\w.\\]+/,
});

Prism.languages.javascript['class-name'][0].pattern =
/(\b(?:model|datasource|enum|generator|type|plugin|abstract)\s+)[\w.\\]+/;

Prism.languages.insertBefore('zmodel', 'function', {
annotation: {
pattern: /(^|[^.])@+\w+/,
lookbehind: true,
alias: 'punctuation',
},
});

Prism.languages.insertBefore('zmodel', 'punctuation', {
'type-args': /\b(?:references|fields|onDelete|onUpdate):/,
});
Expand Down
69 changes: 69 additions & 0 deletions src/pages/v3/_components/AICoding.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
type FeatureItem = {
title: string;
img: string;
description: JSX.Element;
};

const FeatureList: FeatureItem[] = [
{
title: 'Coherent Application Model',
img: '/img/access-control.png',
description: (
<>
With data models, relations, validation rules, and access control policies all defined in one place,
LLMs can easily get a coherent understanding of the entire application.
</>
),
},
{
title: 'Concise Query API',
img: '/img/auto-api.png',
description: (
<>
Concise and expressive, while leveraging existing knowledge of Prisma and Kysely, the query API makes it
easy for LLMs to generate high-quality query code.
</>
),
},
{
title: 'Slim Code Base',
img: '/img/ai-friendly.png',
description: (
<>
By deriving many crucial artifacts from the schema, ZenStack eliminates boilerplate and helps you
maintain a slim code base that is easier for AI to work with.
</>
),
},
];

function Proposition({ title, img, description }: FeatureItem) {
return (
<div className="lg:max-w-1/3 w-full">
<div className="text-center">
<img className="w-48 p-10" src={img} alt={title} />
</div>
<div className="text--center padding-horiz--md">
<h3 className="text-xl text-bold text-center lg:text-2xl text-gray-700 dark:text-gray-300">{title}</h3>
<p className="text-center text-base lg:text-lg text-gray-600 dark:text-gray-400">{description}</p>
</div>
</div>
);
}

export default function AICoding(): JSX.Element {
return (
<div className="flex flex-col items-start lg:items-center w-full">
<div className="w-full">
<h2 className="flex flex-col lg:flex-row text-2xl md:text-3xl lg:text-4xl items-center justify-center pb-4">
Perfect Match for AI-Assisted Programming
</h2>
</div>
<div className="flex flex-wrap gap-4 md:gap-0">
{FeatureList.map((props, idx) => (
<Proposition key={idx} {...props} />
))}
</div>
</div>
);
}
20 changes: 20 additions & 0 deletions src/pages/v3/_components/Notes.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
export default function Notes(): JSX.Element {
return (
<div className="flex flex-col items-start lg:items-center w-full">
<div className="w-full">
<h2 className="flex flex-col lg:flex-row text-xl md:text-2xl lg:text-3xl items-center justify-center pb-4">
<div className="flex items-center">Notes to V2 Users</div>
</h2>
</div>
<div className="flex justify-center text-left">
<blockquote className="lg:max-w-3/4 text-lg italic">
ZenStack V3 has made the bold decision to remove Prisma as a runtime dependency and implement its
own ORM infrastructure on top of <a href="https://kysely.org">Kysely</a>. Albeit the cost of such a
big refactor, we believe this is the right move to gain the flexibility needed to achieve the
project's vision. Please read this <a href="/blog/next-chapter-1">blog post</a> for more thoughts
behind the changes.
</blockquote>
</div>
</div>
);
}
Loading