Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 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
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
4 changes: 4 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
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>
Comment on lines +31 to +36
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Prevent default navigation and add a non-JS fallback URL

href="#" causes a jump to top. Provide a real link (good for accessibility and no-JS users), open in a new tab, and prevent default when JS is available.

-            <div className="mb-1">
-                Click{' '}
-                <a href="#" onClick={() => sdk.openGithubProject(repoPath, options)}>
-                    here
-                </a>{' '}
-                to open an interactive playground.
-            </div>
+            <div className="mb-1">
+                Click{' '}
+                <a
+                    href={`https://stackblitz.com/github/${repoPath}?file=${encodeURIComponent(openFile)}&view=editor`}
+                    target="_blank"
+                    rel="noopener noreferrer"
+                    onClick={(e) => {
+                        e.preventDefault();
+                        void sdk.openGithubProject(repoPath, options);
+                    }}
+                >
+                    here
+                </a>{' '}
+                to open an interactive playground.
+            </div>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
Click{' '}
<a href="#" onClick={() => sdk.openGithubProject(repoPath, options)}>
here
</a>{' '}
to open an interactive playground.
</div>
<div className="mb-1">
Click{' '}
<a
href={`https://stackblitz.com/github/${repoPath}?file=${encodeURIComponent(openFile)}&view=editor`}
target="_blank"
rel="noopener noreferrer"
onClick={(e) => {
e.preventDefault();
void sdk.openGithubProject(repoPath, options);
}}
>
here
</a>{' '}
to open an interactive playground.
</div>
🤖 Prompt for AI Agents
In src/components/StackBlitzGithub.tsx around lines 31 to 36, the anchor uses
href="#" which causes a jump-to-top and provides no non-JS fallback; change the
anchor to use a real URL (e.g. construct the GitHub project URL from repoPath
like https://github.com/{repoPath} or use repoPath if it is already a full URL),
add target="_blank" and rel="noopener noreferrer" for a safe new tab, and update
the onClick to preventDefault before calling sdk.openGithubProject(repoPath,
options) so JS users get the SDK behavior while non-JS users can still open the
project via the link.

{plainCodeFiles.map((file) => (
<GithubCodeBlock key={file} repoPath={repoPath} file={file} />
))}
</>
);
};

export default StackBlitzGithub;
2 changes: 1 addition & 1 deletion src/lib/prism-zmodel.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Prism.languages.zmodel = Prism.languages.extend('clike', {
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc)\b/,
keyword: /\b(?:datasource|enum|generator|model|type|abstract|import|extends|attribute|view|plugin|proc|with)\b/,
'type-class-name': /(\b()\s+)[\w.\\]+/,
});

Expand Down
28 changes: 28 additions & 0 deletions versioned_docs/version-3.x/_components/PackageExec.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import CodeBlock from '@theme/CodeBlock';
import TabItem from '@theme/TabItem';
import Tabs from '@theme/Tabs';

interface Props {
command: string;
}

const pkgManagers = [
{ name: 'npm', command: 'npx' },
{ name: 'pnpm', command: 'pnpm' },
{ name: 'bun', command: 'bunx' },
{ name: 'yarn', command: 'npx' },
];

const PackageInstall = ({ command }: Props) => {
return (
<Tabs>
{pkgManagers.map((pkg) => (
<TabItem key={pkg.name} value={pkg.name} label={pkg.name}>
<CodeBlock language="bash">{`${pkg.command} ${command}`}</CodeBlock>
</TabItem>
))}
</Tabs>
);
};

export default PackageInstall;
33 changes: 33 additions & 0 deletions versioned_docs/version-3.x/_components/PackageInstall.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import CodeBlock from '@theme/CodeBlock';
import TabItem from '@theme/TabItem';
import Tabs from '@theme/Tabs';

interface Props {
devDependencies: string[];
dependencies: string[];
}

const pkgManagers = [
{ name: 'npm', command: 'npm install', dev: '--save-dev' },
{ name: 'pnpm', command: 'pnpm add', dev: '--save-dev' },
{ name: 'bun', command: 'bun add', dev: '--dev' },
{ name: 'yarn', command: 'yarn add', dev: '--dev' },
];

const PackageInstall = ({ devDependencies, dependencies }: Props) => {
return (
<Tabs>
{pkgManagers.map((pkg) => (
<TabItem key={pkg.name} value={pkg.name} label={pkg.name}>
<CodeBlock language="bash">
{`${devDependencies?.length ? `${pkg.command} ${pkg.dev} ${devDependencies.join(' ')}\n` : ''}${
dependencies?.length ? `${pkg.command} ${dependencies.join(' ')}` : ''
}`}
</CodeBlock>
</TabItem>
))}
</Tabs>
);
};

export default PackageInstall;
16 changes: 16 additions & 0 deletions versioned_docs/version-3.x/_components/ZModelVsPSL.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import React, { FC } from 'react';
import Admonition from '@theme/Admonition';

interface ZModelVsPSLProps {
children: React.ReactNode;
}

const ZModelVsPSL: FC<ZModelVsPSLProps> = ({ children }) => {
return (
<Admonition type="info" title="🔋 ZModel vs Prisma Schema">
{children}
</Admonition>
);
};

export default ZModelVsPSL;
16 changes: 16 additions & 0 deletions versioned_docs/version-3.x/_components/ZenStackVsPrisma.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import React, { FC } from 'react';
import Admonition from '@theme/Admonition';

interface ZenStackVsPrismaProps {
children: React.ReactNode;
}

const ZenStackVsPrisma: FC<ZenStackVsPrismaProps> = ({ children }) => {
return (
<Admonition type="info" title="🔋 ZenStack vs Prisma">
{children}
</Admonition>
);
};

export default ZenStackVsPrisma;
23 changes: 23 additions & 0 deletions versioned_docs/version-3.x/_components/_zmodel-starter.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
```zmodel
datasource db {
provider = 'sqlite'
url = 'file:./dev.db'
}

model User {
id String @id @default(cuid())
email String @unique
posts Post[]
}

model Post {
id String @id @default(cuid())
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
title String
content String
published Boolean @default(false)
author User @relation(fields: [authorId], references: [id])
authorId String
}
```
Loading