create-fate 0.0.0 → 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/LICENSE +21 -0
- package/README.md +24 -0
- package/bin/create-fate.mjs +412 -0
- package/package.json +26 -3
- package/templates/fate/README.md +8 -0
- package/templates/fate/drizzle/.github/workflows/push.yml +27 -0
- package/templates/fate/drizzle/.oxfmtrc.jsonc +23 -0
- package/templates/fate/drizzle/.vite-hooks/pre-commit +1 -0
- package/templates/fate/drizzle/.vscode/extensions.json +12 -0
- package/templates/fate/drizzle/.vscode/settings.json +25 -0
- package/templates/fate/drizzle/AGENTS.md +55 -0
- package/templates/fate/drizzle/README.md +112 -0
- package/templates/fate/drizzle/_gitignore +20 -0
- package/templates/fate/drizzle/client/package.json +58 -0
- package/templates/fate/drizzle/client/pages/index.tsx +96 -0
- package/templates/fate/drizzle/client/pages/layout.tsx +104 -0
- package/templates/fate/drizzle/client/pages/login.tsx +107 -0
- package/templates/fate/drizzle/client/pages/post/[id].tsx +22 -0
- package/templates/fate/drizzle/client/pages/search.tsx +95 -0
- package/templates/fate/drizzle/client/public/icon.svg +1 -0
- package/templates/fate/drizzle/client/src/App.css +153 -0
- package/templates/fate/drizzle/client/src/lib/AvailableLanguages.tsx +5 -0
- package/templates/fate/drizzle/client/src/lib/cx.tsx +6 -0
- package/templates/fate/drizzle/client/src/lib/env.tsx +5 -0
- package/templates/fate/drizzle/client/src/ui/Badge.tsx +31 -0
- package/templates/fate/drizzle/client/src/ui/Button.tsx +108 -0
- package/templates/fate/drizzle/client/src/ui/Card.tsx +32 -0
- package/templates/fate/drizzle/client/src/ui/CommentCard.tsx +75 -0
- package/templates/fate/drizzle/client/src/ui/Error.tsx +19 -0
- package/templates/fate/drizzle/client/src/ui/H2.tsx +15 -0
- package/templates/fate/drizzle/client/src/ui/H3.tsx +20 -0
- package/templates/fate/drizzle/client/src/ui/Header.tsx +96 -0
- package/templates/fate/drizzle/client/src/ui/Input.tsx +17 -0
- package/templates/fate/drizzle/client/src/ui/Link.tsx +11 -0
- package/templates/fate/drizzle/client/src/ui/LocaleSwitcher.tsx +52 -0
- package/templates/fate/drizzle/client/src/ui/PostCard.tsx +284 -0
- package/templates/fate/drizzle/client/src/ui/Section.tsx +23 -0
- package/templates/fate/drizzle/client/src/ui/UserCard.tsx +131 -0
- package/templates/fate/drizzle/client/src/user/AuthClient.tsx +6 -0
- package/templates/fate/drizzle/client/translations/de_DE.json +689 -0
- package/templates/fate/drizzle/client/translations/ja_JP.json +689 -0
- package/templates/fate/drizzle/client/vite.config.ts +39 -0
- package/templates/fate/drizzle/client/void.json +29 -0
- package/templates/fate/drizzle/docker-compose.yml +11 -0
- package/templates/fate/drizzle/package.json +46 -0
- package/templates/fate/drizzle/pnpm-workspace.yaml +36 -0
- package/templates/fate/drizzle/public/fate-logo-dark.svg +4 -0
- package/templates/fate/drizzle/public/fate-logo.svg +4 -0
- package/templates/fate/drizzle/server/.env.example +5 -0
- package/templates/fate/drizzle/server/drizzle.config.ts +11 -0
- package/templates/fate/drizzle/server/package.json +48 -0
- package/templates/fate/drizzle/server/src/__tests__/index.test.tsx +5 -0
- package/templates/fate/drizzle/server/src/app.tsx +44 -0
- package/templates/fate/drizzle/server/src/drizzle/db.ts +25 -0
- package/templates/fate/drizzle/server/src/drizzle/queries.ts +89 -0
- package/templates/fate/drizzle/server/src/drizzle/schema.ts +174 -0
- package/templates/fate/drizzle/server/src/drizzle/seed.tsx +77 -0
- package/templates/fate/drizzle/server/src/drizzle/seedData.ts +205 -0
- package/templates/fate/drizzle/server/src/index.tsx +24 -0
- package/templates/fate/drizzle/server/src/lib/auth.ts +33 -0
- package/templates/fate/drizzle/server/src/lib/env.ts +3 -0
- package/templates/fate/drizzle/server/src/lib/origins.ts +18 -0
- package/templates/fate/drizzle/server/src/router.ts +15 -0
- package/templates/fate/drizzle/server/src/trpc/connection.ts +4 -0
- package/templates/fate/drizzle/server/src/trpc/context.ts +22 -0
- package/templates/fate/drizzle/server/src/trpc/init.ts +51 -0
- package/templates/fate/drizzle/server/src/trpc/routers/comment.ts +146 -0
- package/templates/fate/drizzle/server/src/trpc/routers/post.ts +99 -0
- package/templates/fate/drizzle/server/src/trpc/routers/user.ts +68 -0
- package/templates/fate/drizzle/server/src/trpc/views.ts +75 -0
- package/templates/fate/drizzle/server/src/user/SessionUser.tsx +17 -0
- package/templates/fate/drizzle/server/vite.config.ts +8 -0
- package/templates/fate/drizzle/tsconfig.json +33 -0
- package/templates/fate/drizzle/vite.config.ts +71 -0
- package/templates/fate/http/.github/workflows/push.yml +27 -0
- package/templates/fate/http/.oxfmtrc.jsonc +23 -0
- package/templates/fate/http/.vite-hooks/pre-commit +1 -0
- package/templates/fate/http/.vscode/extensions.json +12 -0
- package/templates/fate/http/.vscode/settings.json +25 -0
- package/templates/fate/http/AGENTS.md +55 -0
- package/templates/fate/http/README.md +112 -0
- package/templates/fate/http/_gitignore +20 -0
- package/templates/fate/http/client/package.json +56 -0
- package/templates/fate/http/client/pages/index.tsx +96 -0
- package/templates/fate/http/client/pages/layout.tsx +89 -0
- package/templates/fate/http/client/pages/login.tsx +107 -0
- package/templates/fate/http/client/pages/post/[id].tsx +22 -0
- package/templates/fate/http/client/pages/search.tsx +95 -0
- package/templates/fate/http/client/public/icon.svg +1 -0
- package/templates/fate/http/client/src/App.css +153 -0
- package/templates/fate/http/client/src/lib/AvailableLanguages.tsx +5 -0
- package/templates/fate/http/client/src/lib/cx.tsx +6 -0
- package/templates/fate/http/client/src/lib/env.tsx +5 -0
- package/templates/fate/http/client/src/ui/Badge.tsx +31 -0
- package/templates/fate/http/client/src/ui/Button.tsx +108 -0
- package/templates/fate/http/client/src/ui/Card.tsx +32 -0
- package/templates/fate/http/client/src/ui/CommentCard.tsx +75 -0
- package/templates/fate/http/client/src/ui/Error.tsx +19 -0
- package/templates/fate/http/client/src/ui/H2.tsx +15 -0
- package/templates/fate/http/client/src/ui/H3.tsx +20 -0
- package/templates/fate/http/client/src/ui/Header.tsx +96 -0
- package/templates/fate/http/client/src/ui/Input.tsx +17 -0
- package/templates/fate/http/client/src/ui/Link.tsx +11 -0
- package/templates/fate/http/client/src/ui/LocaleSwitcher.tsx +52 -0
- package/templates/fate/http/client/src/ui/PostCard.tsx +281 -0
- package/templates/fate/http/client/src/ui/Section.tsx +23 -0
- package/templates/fate/http/client/src/ui/UserCard.tsx +131 -0
- package/templates/fate/http/client/src/user/AuthClient.tsx +6 -0
- package/templates/fate/http/client/translations/de_DE.json +689 -0
- package/templates/fate/http/client/translations/ja_JP.json +689 -0
- package/templates/fate/http/client/vite.config.ts +40 -0
- package/templates/fate/http/client/void.json +29 -0
- package/templates/fate/http/docker-compose.yml +11 -0
- package/templates/fate/http/package.json +46 -0
- package/templates/fate/http/pnpm-workspace.yaml +36 -0
- package/templates/fate/http/public/fate-logo-dark.svg +4 -0
- package/templates/fate/http/public/fate-logo.svg +4 -0
- package/templates/fate/http/server/.env.example +5 -0
- package/templates/fate/http/server/drizzle.config.ts +11 -0
- package/templates/fate/http/server/package.json +46 -0
- package/templates/fate/http/server/src/__tests__/index.test.tsx +5 -0
- package/templates/fate/http/server/src/app.tsx +36 -0
- package/templates/fate/http/server/src/drizzle/db.ts +25 -0
- package/templates/fate/http/server/src/drizzle/queries.ts +89 -0
- package/templates/fate/http/server/src/drizzle/schema.ts +174 -0
- package/templates/fate/http/server/src/drizzle/seed.tsx +77 -0
- package/templates/fate/http/server/src/drizzle/seedData.ts +205 -0
- package/templates/fate/http/server/src/fate/context.ts +20 -0
- package/templates/fate/http/server/src/fate/server.ts +285 -0
- package/templates/fate/http/server/src/fate/views.ts +75 -0
- package/templates/fate/http/server/src/index.tsx +24 -0
- package/templates/fate/http/server/src/lib/auth.ts +33 -0
- package/templates/fate/http/server/src/lib/env.ts +3 -0
- package/templates/fate/http/server/src/lib/origins.ts +18 -0
- package/templates/fate/http/server/src/router.ts +2 -0
- package/templates/fate/http/server/src/user/SessionUser.tsx +17 -0
- package/templates/fate/http/server/vite.config.ts +8 -0
- package/templates/fate/http/tsconfig.json +33 -0
- package/templates/fate/http/vite.config.ts +71 -0
- package/templates/fate/prisma/.github/workflows/push.yml +27 -0
- package/templates/fate/prisma/.oxfmtrc.jsonc +23 -0
- package/templates/fate/prisma/.vite-hooks/pre-commit +1 -0
- package/templates/fate/prisma/.vscode/extensions.json +12 -0
- package/templates/fate/prisma/.vscode/settings.json +25 -0
- package/templates/fate/prisma/AGENTS.md +55 -0
- package/templates/fate/prisma/README.md +126 -0
- package/templates/fate/prisma/_gitignore +20 -0
- package/templates/fate/prisma/client/package.json +58 -0
- package/templates/fate/prisma/client/pages/index.tsx +96 -0
- package/templates/fate/prisma/client/pages/layout.tsx +94 -0
- package/templates/fate/prisma/client/pages/login.tsx +107 -0
- package/templates/fate/prisma/client/pages/post/[id].tsx +22 -0
- package/templates/fate/prisma/client/pages/search.tsx +95 -0
- package/templates/fate/prisma/client/public/icon.svg +1 -0
- package/templates/fate/prisma/client/src/App.css +153 -0
- package/templates/fate/prisma/client/src/lib/AvailableLanguages.tsx +5 -0
- package/templates/fate/prisma/client/src/lib/cx.tsx +6 -0
- package/templates/fate/prisma/client/src/lib/env.tsx +5 -0
- package/templates/fate/prisma/client/src/ui/Badge.tsx +31 -0
- package/templates/fate/prisma/client/src/ui/Button.tsx +108 -0
- package/templates/fate/prisma/client/src/ui/Card.tsx +32 -0
- package/templates/fate/prisma/client/src/ui/CommentCard.tsx +75 -0
- package/templates/fate/prisma/client/src/ui/Error.tsx +19 -0
- package/templates/fate/prisma/client/src/ui/H2.tsx +15 -0
- package/templates/fate/prisma/client/src/ui/H3.tsx +20 -0
- package/templates/fate/prisma/client/src/ui/Header.tsx +96 -0
- package/templates/fate/prisma/client/src/ui/Input.tsx +17 -0
- package/templates/fate/prisma/client/src/ui/Link.tsx +11 -0
- package/templates/fate/prisma/client/src/ui/LocaleSwitcher.tsx +52 -0
- package/templates/fate/prisma/client/src/ui/PostCard.tsx +281 -0
- package/templates/fate/prisma/client/src/ui/Section.tsx +23 -0
- package/templates/fate/prisma/client/src/ui/UserCard.tsx +131 -0
- package/templates/fate/prisma/client/src/user/AuthClient.tsx +6 -0
- package/templates/fate/prisma/client/translations/de_DE.json +689 -0
- package/templates/fate/prisma/client/translations/ja_JP.json +689 -0
- package/templates/fate/prisma/client/vite.config.ts +39 -0
- package/templates/fate/prisma/client/void.json +29 -0
- package/templates/fate/prisma/docker-compose.yml +11 -0
- package/templates/fate/prisma/package.json +47 -0
- package/templates/fate/prisma/pnpm-workspace.yaml +39 -0
- package/templates/fate/prisma/public/fate-logo-dark.svg +4 -0
- package/templates/fate/prisma/public/fate-logo.svg +4 -0
- package/templates/fate/prisma/server/.env.example +5 -0
- package/templates/fate/prisma/server/package.json +42 -0
- package/templates/fate/prisma/server/prisma.config.ts +21 -0
- package/templates/fate/prisma/server/src/__tests__/index.test.tsx +5 -0
- package/templates/fate/prisma/server/src/app.tsx +40 -0
- package/templates/fate/prisma/server/src/index.tsx +24 -0
- package/templates/fate/prisma/server/src/lib/auth.ts +31 -0
- package/templates/fate/prisma/server/src/lib/env.ts +3 -0
- package/templates/fate/prisma/server/src/lib/origins.ts +18 -0
- package/templates/fate/prisma/server/src/prisma/prisma.ts +9 -0
- package/templates/fate/prisma/server/src/prisma/schema.prisma +98 -0
- package/templates/fate/prisma/server/src/prisma/seed.tsx +71 -0
- package/templates/fate/prisma/server/src/prisma/seedData.ts +205 -0
- package/templates/fate/prisma/server/src/router.ts +14 -0
- package/templates/fate/prisma/server/src/trpc/connection.ts +4 -0
- package/templates/fate/prisma/server/src/trpc/context.ts +22 -0
- package/templates/fate/prisma/server/src/trpc/init.ts +8 -0
- package/templates/fate/prisma/server/src/trpc/routers/comment.ts +176 -0
- package/templates/fate/prisma/server/src/trpc/routers/post.ts +154 -0
- package/templates/fate/prisma/server/src/trpc/routers/user.ts +71 -0
- package/templates/fate/prisma/server/src/trpc/views.ts +77 -0
- package/templates/fate/prisma/server/src/user/SessionUser.tsx +17 -0
- package/templates/fate/prisma/server/vite.config.ts +8 -0
- package/templates/fate/prisma/tsconfig.json +33 -0
- package/templates/fate/prisma/vite.config.ts +72 -0
- package/templates/fate/void/.oxfmtrc.jsonc +14 -0
- package/templates/fate/void/README.md +55 -0
- package/templates/fate/void/auth.ts +22 -0
- package/templates/fate/void/db/migrations/20260508073357_initial_schema.sql +133 -0
- package/templates/fate/void/db/migrations/20260508120500_seed_void_demo.sql +170 -0
- package/templates/fate/void/db/migrations/meta/20260508073357_snapshot.json +868 -0
- package/templates/fate/void/db/migrations/meta/_journal.json +20 -0
- package/templates/fate/void/db/queries.ts +211 -0
- package/templates/fate/void/db/schema.ts +325 -0
- package/templates/fate/void/db/seed-auth.ts +31 -0
- package/templates/fate/void/db/seed.ts +163 -0
- package/templates/fate/void/middleware/01.shared.ts +29 -0
- package/templates/fate/void/package.json +65 -0
- package/templates/fate/void/pages/category/[id].tsx +23 -0
- package/templates/fate/void/pages/index.tsx +153 -0
- package/templates/fate/void/pages/layout.tsx +46 -0
- package/templates/fate/void/pages/login.tsx +103 -0
- package/templates/fate/void/pages/post/[id].tsx +20 -0
- package/templates/fate/void/pages/search.tsx +81 -0
- package/templates/fate/void/pnpm-workspace.yaml +31 -0
- package/templates/fate/void/public/.assetsignore +1 -0
- package/templates/fate/void/public/icon.svg +1 -0
- package/templates/fate/void/routes/fate-live.ts +8 -0
- package/templates/fate/void/routes/fate.ts +8 -0
- package/templates/fate/void/seedData.ts +535 -0
- package/templates/fate/void/src/App.css +130 -0
- package/templates/fate/void/src/fate/__tests__/commentPermissions.test.ts +31 -0
- package/templates/fate/void/src/fate/commentPermissions.ts +17 -0
- package/templates/fate/void/src/fate/context.ts +15 -0
- package/templates/fate/void/src/fate/live.ts +6 -0
- package/templates/fate/void/src/fate/server.ts +401 -0
- package/templates/fate/void/src/fate/views.ts +164 -0
- package/templates/fate/void/src/lib/cx.tsx +6 -0
- package/templates/fate/void/src/lib/formatLabel.tsx +6 -0
- package/templates/fate/void/src/lib/shared.ts +10 -0
- package/templates/fate/void/src/ui/Badge.tsx +31 -0
- package/templates/fate/void/src/ui/Button.tsx +92 -0
- package/templates/fate/void/src/ui/Card.tsx +29 -0
- package/templates/fate/void/src/ui/CategoryCard.tsx +105 -0
- package/templates/fate/void/src/ui/CommentCard.tsx +80 -0
- package/templates/fate/void/src/ui/CreatePost.tsx +111 -0
- package/templates/fate/void/src/ui/Error.tsx +19 -0
- package/templates/fate/void/src/ui/EventCard.tsx +152 -0
- package/templates/fate/void/src/ui/H2.tsx +15 -0
- package/templates/fate/void/src/ui/H3.tsx +20 -0
- package/templates/fate/void/src/ui/Header.tsx +96 -0
- package/templates/fate/void/src/ui/Input.tsx +33 -0
- package/templates/fate/void/src/ui/Link.tsx +11 -0
- package/templates/fate/void/src/ui/Number.tsx +5 -0
- package/templates/fate/void/src/ui/PostCard.tsx +294 -0
- package/templates/fate/void/src/ui/Section.tsx +23 -0
- package/templates/fate/void/src/ui/TagBadge.tsx +23 -0
- package/templates/fate/void/src/ui/UserCard.tsx +129 -0
- package/templates/fate/void/src/user/AuthClient.tsx +1 -0
- package/templates/fate/void/src/user/SessionUser.tsx +17 -0
- package/templates/fate/void/tsconfig.json +34 -0
- package/templates/fate/void/vite.config.ts +83 -0
- package/templates/fate/void/void.json +32 -0
- package/templates/fate/void/wrangler.jsonc +16 -0
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
packages:
|
|
2
|
+
- .
|
|
3
|
+
|
|
4
|
+
allowBuilds:
|
|
5
|
+
'@swc/core': true
|
|
6
|
+
better-sqlite3: true
|
|
7
|
+
esbuild: true
|
|
8
|
+
sharp: true
|
|
9
|
+
workerd: true
|
|
10
|
+
|
|
11
|
+
catalog:
|
|
12
|
+
vite: npm:@voidzero-dev/vite-plus-core@0.1.20
|
|
13
|
+
vite-plus: 0.1.20
|
|
14
|
+
|
|
15
|
+
onlyBuiltDependencies:
|
|
16
|
+
- '@swc/core'
|
|
17
|
+
- '@tailwindcss/oxide'
|
|
18
|
+
- better-sqlite3
|
|
19
|
+
- esbuild
|
|
20
|
+
- msgpackr-extract
|
|
21
|
+
- sharp
|
|
22
|
+
- workerd
|
|
23
|
+
|
|
24
|
+
overrides:
|
|
25
|
+
vite: 'catalog:'
|
|
26
|
+
|
|
27
|
+
peerDependencyRules:
|
|
28
|
+
allowAny:
|
|
29
|
+
- vite
|
|
30
|
+
allowedVersions:
|
|
31
|
+
vite: '*'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.DS_Store
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMidYMax" viewBox="0 0 160 160"><path d="M108.301 17.465h.272c1.797-.005 3.563.177 5.331.496l.349.063c5.588 1.02 10.731 3.447 15.201 6.933l.347.267c1.579 1.26 3.083 2.684 4.386 4.227l.161.186c4.018 4.719 6.924 10.686 7.767 16.852l.033.239c.262 1.848.351 3.688.352 5.551l.001.307c-.001 1.623-.092 3.188-.386 4.788l-.05.292c-1.003 5.874-3.476 11.447-7.286 16.034l-.29.358c-1.422 1.721-3.011 3.382-4.797 4.729l-.444.354c-3.046 2.405-6.436 4.147-10.084 5.442l-.497.186c-1.766.627-3.615.974-5.465 1.266l-.364.058c-1.591.238-3.185.286-4.791.281h-.499l-1.339-.002h-1.408c-.886-.001-1.772-.001-2.656-.003-3.085-.001-6.163-.005-9.247-.008v-12.78l3.606-.006 2.282-.007c1.205-.006 2.407-.01 3.611-.011.878 0 1.754-.003 2.63-.007.462-.002.928-.005 1.389-.002 6.302.01 12.003-1.72 16.65-6.117l.291-.272c3.951-3.807 6.097-9.302 6.241-14.736.04-3.078-.476-6.048-1.68-8.892l-.104-.244c-2.382-5.559-6.98-9.439-12.504-11.675-2.204-.816-4.522-1.16-6.863-1.134-.301.004-.606.004-.909.001-1.677.003-3.304.127-4.924.591l-.331.098c-2.625.758-5.093 1.928-7.254 3.607l-.323.249c-1.046.817-2.031 1.682-2.873 2.71l-.154.179c-2.354 2.782-3.9 5.988-4.727 9.529l-.054.229c-.391 1.8-.423 3.633-.42 5.471l-.001.74c.002 1.4.001 2.801-.004 4.201l-.004 3.779c0 1.824-.001 3.649-.003 5.473l-.006 2.813-.005 6.076-.001.267-.008 8.614c-.001 2.023-.004 4.045-.006 6.066v.259l-.004 2.55-.006 5.46c0 1.331-.001 2.658-.003 3.985-.002.72-.002 1.438-.002 2.156 0 .658 0 1.317-.002 1.978v.708c.004 2.098-.07 4.214-.545 6.263l-.077.359-.161.716c-.071.302-.136.605-.199.909-.55 2.538-1.6 5.067-2.832 7.348l-.214.42c-.965 1.921-2.22 3.714-3.574 5.38l-.152.183c-.78.973-1.639 1.866-2.519 2.751l-.308.313a25.81 25.81 0 0 1-2.226 1.955l-.22.179c-3.698 2.953-7.975 5.044-12.538 6.262-.212.056-.422.115-.631.176-8.366 2.287-17.8.738-25.278-3.512-3.639-2.122-7.171-4.945-9.721-8.307-.121-.15-.241-.298-.356-.448a36.247 36.247 0 0 1-2.605-3.814l-.144-.234c-.889-1.466-1.562-3.034-2.222-4.617l-.11-.265c-3.253-7.791-2.911-17.367.184-25.133.865-2.069 1.869-4.089 3.123-5.951l.172-.261a31.91 31.91 0 0 1 2.547-3.29l.229-.263c.13-.152.266-.304.396-.452l.425-.493c1.216-1.389 2.593-2.615 4.068-3.723.208-.157.414-.315.62-.476 1.184-.901 2.437-1.665 3.729-2.4l.272-.159c1.586-.893 3.235-1.573 4.934-2.21l.253-.097c4.232-1.567 8.615-1.836 13.079-1.82 1.359 0 2.732.002 4.093.007 1.209.005 2.417.006 3.621.006 1.899.002 3.794.007 5.688.012v12.78l-3.612.013-2.282.011c-1.201.005-2.401.012-3.61.016-.876.003-1.751.005-2.629.013-.463.002-.924.005-1.387.006-4.322.005-8.193.592-12.033 2.662l-.217.114c-1.458.773-2.697 1.731-3.908 2.849-.206.185-.413.362-.63.535-.435.376-.794.788-1.16 1.232l-.153.18a21.18 21.18 0 0 0-4.474 8.651l-.094.342c-.42 1.682-.54 3.395-.536 5.127v.272c.019 5.672 2.392 10.671 6.206 14.769l.215.237c3.296 3.453 8.483 5.917 13.247 6.046.448.008.896.01 1.345.01.276 0 .553.003.835.005 4.917.019 9.864-1.73 13.577-4.995l.303-.267c.299-.263.592-.527.881-.799l.262-.247c.787-.756 1.451-1.599 2.104-2.474l.151-.201c1.929-2.606 3.117-5.723 3.635-8.909l.059-.362c.194-1.296.21-2.573.207-3.883l.003-.74v-2.02c0-.73 0-1.459.005-2.188v-3.782c0-1.827.004-3.654.007-5.481 0-.939 0-1.877.004-2.816l.003-6.082v-.268c.005-2.876.008-5.75.008-8.627l.013-8.883c.004-1.823.004-3.646.004-5.469 0-1.33.004-2.659.004-3.989.003-.721.003-1.442.003-2.159v-1.98c.005-.237.005-.473 0-.711-.011-8.523 3.072-17.023 8.941-23.268.244-.263.483-.531.717-.805.416-.48.861-.918 1.324-1.352l.252-.232a26.259 26.259 0 0 1 2.184-1.812l.46-.349c1.39-1.058 2.837-1.951 4.375-2.775l.318-.172c5.005-2.666 10.5-3.877 16.15-3.889Z" style="transform-box:fill-box;transform-origin:50% 50%" transform="rotate(-31 0 0)"/></svg>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { defineVoidFateRoute } from 'void-fate/server';
|
|
2
|
+
import { fateStream } from '../src/fate/live.ts';
|
|
3
|
+
import { fateLive, fateServer } from '../src/fate/server.ts';
|
|
4
|
+
|
|
5
|
+
const route = defineVoidFateRoute(fateServer, fateLive, { stream: fateStream });
|
|
6
|
+
|
|
7
|
+
export const GET = route.GET;
|
|
8
|
+
export const POST = route.POST;
|
|
@@ -0,0 +1,535 @@
|
|
|
1
|
+
export const users = [
|
|
2
|
+
{
|
|
3
|
+
data: {
|
|
4
|
+
username: 'alex',
|
|
5
|
+
},
|
|
6
|
+
email: 'alex@example.com',
|
|
7
|
+
name: 'Alex',
|
|
8
|
+
password: 'password-alex',
|
|
9
|
+
role: 'admin',
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
data: {
|
|
13
|
+
username: 'ari',
|
|
14
|
+
},
|
|
15
|
+
email: 'ari@nakazawa.dev',
|
|
16
|
+
name: 'Ari',
|
|
17
|
+
password: 'password-ari',
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
data: {
|
|
21
|
+
username: 'dina',
|
|
22
|
+
},
|
|
23
|
+
email: 'dina@nakazawa.dev',
|
|
24
|
+
name: 'Dina',
|
|
25
|
+
password: 'password-dina',
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
data: {
|
|
29
|
+
username: 'hana',
|
|
30
|
+
},
|
|
31
|
+
email: 'hana@nakazawa.dev',
|
|
32
|
+
name: 'Hana',
|
|
33
|
+
password: 'password-hana',
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
data: {
|
|
37
|
+
username: 'jamal',
|
|
38
|
+
},
|
|
39
|
+
email: 'jamal@nakazawa.dev',
|
|
40
|
+
name: 'Jamal',
|
|
41
|
+
password: 'password-jamal',
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
data: {
|
|
45
|
+
username: 'kai',
|
|
46
|
+
},
|
|
47
|
+
email: 'kai@nakazawa.dev',
|
|
48
|
+
name: 'Kai',
|
|
49
|
+
password: 'password-kai',
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
data: {
|
|
53
|
+
username: 'lena',
|
|
54
|
+
},
|
|
55
|
+
email: 'lena@nakazawa.dev',
|
|
56
|
+
name: 'Lena',
|
|
57
|
+
password: 'password-lena',
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
data: {
|
|
61
|
+
username: 'mika',
|
|
62
|
+
},
|
|
63
|
+
email: 'mika@nakazawa.dev',
|
|
64
|
+
name: 'Mika',
|
|
65
|
+
password: 'password-mika',
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
data: {
|
|
69
|
+
username: 'noah',
|
|
70
|
+
},
|
|
71
|
+
email: 'noah@nakazawa.dev',
|
|
72
|
+
name: 'Noah',
|
|
73
|
+
password: 'password-noah',
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
data: {
|
|
77
|
+
username: 'sora',
|
|
78
|
+
},
|
|
79
|
+
email: 'sora@nakazawa.dev',
|
|
80
|
+
name: 'Sora',
|
|
81
|
+
password: 'password-sora',
|
|
82
|
+
},
|
|
83
|
+
] as const;
|
|
84
|
+
|
|
85
|
+
export const categories = [
|
|
86
|
+
{
|
|
87
|
+
description: 'Core ideas behind views, ViewRefs, strict selection, and data masking.',
|
|
88
|
+
name: 'Core Concepts',
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
description: 'Async React, Suspense, Actions, and the react-fate hooks.',
|
|
92
|
+
name: 'React Integration',
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
description: 'Prisma, Drizzle, native HTTP, tRPC, and source adapter notes.',
|
|
96
|
+
name: 'Server Integrations',
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
description: 'Live views, live lists, SSE streams, and update events.',
|
|
100
|
+
name: 'Realtime',
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
description: 'Progress reports from the alpha releases and example applications.',
|
|
104
|
+
name: 'Release Notes',
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
description: 'Practical migration notes for teams moving away from request-centric state.',
|
|
108
|
+
name: 'Migration Notes',
|
|
109
|
+
},
|
|
110
|
+
] as const;
|
|
111
|
+
|
|
112
|
+
export const tags = [
|
|
113
|
+
{
|
|
114
|
+
description: 'Co-located data requirements composed into one request.',
|
|
115
|
+
name: 'views',
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
description: 'Object records keyed by typename and id.',
|
|
119
|
+
name: 'normalized-cache',
|
|
120
|
+
},
|
|
121
|
+
{
|
|
122
|
+
description: 'Strict field selection and masked component data.',
|
|
123
|
+
name: 'data-masking',
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
description: 'Suspense, Actions, use, and concurrent rendering patterns.',
|
|
127
|
+
name: 'async-react',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
description: 'Declarative optimistic updates and automatic rollback behavior.',
|
|
131
|
+
name: 'optimistic-updates',
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
description: 'Connection-style lists with cursors and load-more flows.',
|
|
135
|
+
name: 'pagination',
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
description: 'Object and connection subscriptions over a single SSE stream.',
|
|
139
|
+
name: 'live-views',
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
description: 'The native fate protocol for clients that do not need tRPC.',
|
|
143
|
+
name: 'http-transport',
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
description: 'Prisma, Drizzle, and server-side data view adapters.',
|
|
147
|
+
name: 'server-adapters',
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
description: 'Generated client types produced by the Vite plugin.',
|
|
151
|
+
name: 'vite-plugin',
|
|
152
|
+
},
|
|
153
|
+
{
|
|
154
|
+
description: 'The Void example and full-stack routing experiment.',
|
|
155
|
+
name: 'void',
|
|
156
|
+
},
|
|
157
|
+
] as const;
|
|
158
|
+
|
|
159
|
+
export const posts = [
|
|
160
|
+
{
|
|
161
|
+
authorEmail: 'alex@example.com',
|
|
162
|
+
category: 'Core Concepts',
|
|
163
|
+
content:
|
|
164
|
+
'The first note in this demo restates the core promise from the announcement: fate keeps component data requirements co-located, then composes them into one request at the screen root. Instead of deciding when every component should fetch, you describe what each component needs. The result feels close to Relay fragments, but it stays in plain TypeScript with no GraphQL schema or query language to adopt.',
|
|
165
|
+
likes: 128,
|
|
166
|
+
tags: ['views', 'data-masking'],
|
|
167
|
+
title: 'Thinking in views instead of requests',
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
authorEmail: 'ari@nakazawa.dev',
|
|
171
|
+
category: 'Core Concepts',
|
|
172
|
+
content:
|
|
173
|
+
'ViewRefs are intentionally small: a typename, an id, and enough metadata for fate to resolve masked data against a view. Passing refs through the tree keeps component props light and lets each component declare the fields it reads. This post walks through how a PostCard can select title and author while a detail route adds comments, tags, and counts without creating another hand-written data shape.',
|
|
174
|
+
likes: 93,
|
|
175
|
+
tags: ['views', 'normalized-cache'],
|
|
176
|
+
title: 'ViewRefs as the boundary between components',
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
authorEmail: 'dina@nakazawa.dev',
|
|
180
|
+
category: 'Core Concepts',
|
|
181
|
+
content:
|
|
182
|
+
'Strict selection is the feature that makes a demo like this stay honest. If a component did not select content, content is not part of its usable data. That protects teams from accidental coupling, makes refactors smaller, and gives code generation tools a predictable surface. The cache may know more about an object, but the component only sees the fields its view asked for.',
|
|
183
|
+
likes: 87,
|
|
184
|
+
tags: ['data-masking', 'views'],
|
|
185
|
+
title: 'Data masking as a team contract',
|
|
186
|
+
},
|
|
187
|
+
{
|
|
188
|
+
authorEmail: 'hana@nakazawa.dev',
|
|
189
|
+
category: 'Core Concepts',
|
|
190
|
+
content:
|
|
191
|
+
'fate stores records by __typename and id, then points roots and lists at those records. That is why liking a post can update every view that selected likes without touching views that only selected title. This article follows one Post record through the home feed, category page, search results, and detail route to show how normalized data removes duplicate cache entries.',
|
|
192
|
+
likes: 111,
|
|
193
|
+
tags: ['normalized-cache', 'optimistic-updates'],
|
|
194
|
+
title: 'A normalized cache without manual key math',
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
authorEmail: 'jamal@nakazawa.dev',
|
|
198
|
+
category: 'React Integration',
|
|
199
|
+
content:
|
|
200
|
+
'The React integration leans on Suspense instead of local loading flags. A root useRequest call can suspend while the composed selection is fetched, and errors bubble to normal error boundaries. The components underneath can stay focused on rendering masked data. The post also shows why this is useful for AI-generated code: there are fewer branches and fewer imperative states to keep in sync.',
|
|
201
|
+
likes: 76,
|
|
202
|
+
tags: ['async-react', 'views'],
|
|
203
|
+
title: 'Suspense-first screens with useRequest',
|
|
204
|
+
},
|
|
205
|
+
{
|
|
206
|
+
authorEmail: 'kai@nakazawa.dev',
|
|
207
|
+
category: 'React Integration',
|
|
208
|
+
content:
|
|
209
|
+
'Actions in fate are exposed for useActionState, and mutations can carry an optimistic object alongside the input. The cache applies the optimistic update immediately, re-renders affected views, and rolls the affected records back if the server rejects the mutation. This example uses the like button because it is easy to see, but the same model works for comments and other records.',
|
|
210
|
+
likes: 82,
|
|
211
|
+
tags: ['async-react', 'optimistic-updates'],
|
|
212
|
+
title: 'Optimistic actions that roll back cleanly',
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
authorEmail: 'lena@nakazawa.dev',
|
|
216
|
+
category: 'React Integration',
|
|
217
|
+
content:
|
|
218
|
+
'The comments under each post use connection-style lists so the UI can load more without inventing a pagination protocol per screen. fate tracks cursor arguments as part of the list state, merges pages into the same connection, and keeps the records normalized. The home feed starts small on purpose so the load-more button exercises this path in the example.',
|
|
219
|
+
likes: 69,
|
|
220
|
+
tags: ['pagination', 'normalized-cache'],
|
|
221
|
+
title: 'Connection lists for comments and feeds',
|
|
222
|
+
},
|
|
223
|
+
{
|
|
224
|
+
authorEmail: 'mika@nakazawa.dev',
|
|
225
|
+
category: 'Realtime',
|
|
226
|
+
content:
|
|
227
|
+
'useLiveView has the same shape as useView, but it subscribes to updates for the selected object through the native live transport. The client keeps one SSE stream open, sends subscribe and unsubscribe control messages, and merges returned records into the same normalized cache used by requests and mutations. Components keep their view definitions and just opt into live data.',
|
|
228
|
+
likes: 104,
|
|
229
|
+
tags: ['live-views', 'normalized-cache'],
|
|
230
|
+
title: 'Live views over a single SSE stream',
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
authorEmail: 'noah@nakazawa.dev',
|
|
234
|
+
category: 'Realtime',
|
|
235
|
+
content:
|
|
236
|
+
'Live list views extend the same idea to connections. When a comment is added, the server can emit a prepend event for Post.comments and fate updates the visible connection without deleting the underlying Comment record. By default, pagination boundaries are respected, and streams like chat can opt into visible insertion. That gives realtime behavior without turning every list into special-case UI code.',
|
|
237
|
+
likes: 97,
|
|
238
|
+
tags: ['live-views', 'pagination'],
|
|
239
|
+
title: 'Live list views for active threads',
|
|
240
|
+
},
|
|
241
|
+
{
|
|
242
|
+
authorEmail: 'sora@nakazawa.dev',
|
|
243
|
+
category: 'Realtime',
|
|
244
|
+
content:
|
|
245
|
+
'Deletion events are just as important as updates. If a comment disappears, fate removes the record from the normalized cache and prunes lists or object fields that reference it. The demo comment controls exercise that behavior so the post detail route, live comment list, and comment count stay aligned after a mutation completes.',
|
|
246
|
+
likes: 64,
|
|
247
|
+
tags: ['live-views', 'optimistic-updates'],
|
|
248
|
+
title: 'Keeping deletions consistent across lists',
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
authorEmail: 'ari@nakazawa.dev',
|
|
252
|
+
category: 'Server Integrations',
|
|
253
|
+
content:
|
|
254
|
+
'The launch post introduced fate with tRPC, but the repo now includes a native HTTP transport too. The generated client can point at a fate endpoint, send requests through the protocol package, and use GET and POST routes for live updates. tRPC remains a supported adapter, but the core model no longer depends on it.',
|
|
255
|
+
likes: 88,
|
|
256
|
+
tags: ['http-transport', 'server-adapters'],
|
|
257
|
+
title: 'Native HTTP transport after the alpha launch',
|
|
258
|
+
},
|
|
259
|
+
{
|
|
260
|
+
authorEmail: 'dina@nakazawa.dev',
|
|
261
|
+
category: 'Server Integrations',
|
|
262
|
+
content:
|
|
263
|
+
'The server adapters now cover Prisma and Drizzle with the same data view concepts. Sources describe how to resolve records, fields, lists, counts, and computed values, while fate builds the selected shape for the client. This makes the examples useful for teams with different database layers without changing the React component model.',
|
|
264
|
+
likes: 84,
|
|
265
|
+
tags: ['server-adapters', 'views'],
|
|
266
|
+
title: 'Prisma and Drizzle source adapters',
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
authorEmail: 'hana@nakazawa.dev',
|
|
270
|
+
category: 'Server Integrations',
|
|
271
|
+
content:
|
|
272
|
+
'Arguments are part of request identity, but pagination cursors are merged into the same connection when the user loads another page. This post explains why category filters, search terms, and sort options belong in the cache key while after and before control pagination state. The result follows Relay connection semantics without asking app code to manage query keys.',
|
|
273
|
+
likes: 73,
|
|
274
|
+
tags: ['pagination', 'server-adapters'],
|
|
275
|
+
title: 'Request arguments and connection identity',
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
authorEmail: 'jamal@nakazawa.dev',
|
|
279
|
+
category: 'Release Notes',
|
|
280
|
+
content:
|
|
281
|
+
'The code generator is now optional for CI and custom workflows because the Vite plugin handles the common path during development. The plugin generates the typed client from the server surface, keeps imports fresh, and reduces the number of manual setup steps in a new app. It is one of the changes that makes the default template feel much closer to normal Vite development.',
|
|
282
|
+
likes: 91,
|
|
283
|
+
tags: ['vite-plugin', 'http-transport'],
|
|
284
|
+
title: 'The Vite plugin replaces everyday codegen',
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
authorEmail: 'kai@nakazawa.dev',
|
|
288
|
+
category: 'Release Notes',
|
|
289
|
+
content:
|
|
290
|
+
'The cache now tracks retained requests so screens can release data when they unmount and let garbage collection clean up records that are no longer needed. For manual client.request calls, code can retain the descriptor for as long as the work needs it. The important part is that cache lifetime becomes explicit without forcing every component to think about cleanup.',
|
|
291
|
+
likes: 58,
|
|
292
|
+
tags: ['normalized-cache', 'async-react'],
|
|
293
|
+
title: 'Garbage collection for request lifetimes',
|
|
294
|
+
},
|
|
295
|
+
{
|
|
296
|
+
authorEmail: 'lena@nakazawa.dev',
|
|
297
|
+
category: 'Release Notes',
|
|
298
|
+
content:
|
|
299
|
+
'Stable refs were a small change with a large ergonomic payoff. When a record has not changed, fate can keep ViewRefs stable across renders, which helps memoized components and reduces avoidable updates. Combined with strict selection, this keeps rendering tied to the fields a component actually requested instead of the shape of a whole server response.',
|
|
300
|
+
likes: 67,
|
|
301
|
+
tags: ['views', 'normalized-cache'],
|
|
302
|
+
title: 'Stable refs and smaller rerenders',
|
|
303
|
+
},
|
|
304
|
+
{
|
|
305
|
+
authorEmail: 'mika@nakazawa.dev',
|
|
306
|
+
category: 'Migration Notes',
|
|
307
|
+
content:
|
|
308
|
+
'Migrating from request-centric libraries starts with a mindset shift. Instead of passing server data down as custom prop types, define small views next to the components that render them and compose those views at the route. The cache then works by object identity, so mutations and live updates update the relevant records rather than a spread of unrelated request results.',
|
|
309
|
+
likes: 79,
|
|
310
|
+
tags: ['views', 'normalized-cache'],
|
|
311
|
+
title: 'Moving away from request-centric state',
|
|
312
|
+
},
|
|
313
|
+
{
|
|
314
|
+
authorEmail: 'noah@nakazawa.dev',
|
|
315
|
+
category: 'Migration Notes',
|
|
316
|
+
content:
|
|
317
|
+
'The safest adoption path is incremental. Add byId and list procedures or source adapters next to existing server routes, generate a client, and move one screen to views. The first win is usually removing loading branches and manual cache patches from a feed or detail page. From there, optimistic actions and live views can be introduced without rewriting the whole app.',
|
|
318
|
+
likes: 62,
|
|
319
|
+
tags: ['server-adapters', 'async-react'],
|
|
320
|
+
title: 'An incremental adoption checklist',
|
|
321
|
+
},
|
|
322
|
+
{
|
|
323
|
+
authorEmail: 'sora@nakazawa.dev',
|
|
324
|
+
category: 'Release Notes',
|
|
325
|
+
content:
|
|
326
|
+
'The Void example uses the same fate ideas in a full-stack app with file-system routing, shared data, auth, mutations, live comments, categories, tags, and events. It exists to prove the core protocol and React APIs are not tied to one server framework. The seed data includes this post so search and category views can show the newest example alongside the Prisma and Drizzle servers.',
|
|
327
|
+
likes: 86,
|
|
328
|
+
tags: ['void', 'http-transport'],
|
|
329
|
+
title: 'What the Void example proves',
|
|
330
|
+
},
|
|
331
|
+
] as const;
|
|
332
|
+
|
|
333
|
+
export const comments = [
|
|
334
|
+
'The view-first framing is the clearest way I have seen to explain why request hooks create so much incidental state.',
|
|
335
|
+
'Passing ViewRefs through components made the example easier to read than a stack of custom DTO types.',
|
|
336
|
+
'Strict selection caught a missing field in my test component immediately, which is exactly the kind of failure I want.',
|
|
337
|
+
'The normalized cache explanation finally connected likes, comments, categories, and search results for our team.',
|
|
338
|
+
'Suspense at the request root keeps the route code small, and the error boundary story feels like normal React.',
|
|
339
|
+
'The useActionState integration is practical because the form code still looks like React instead of a custom mutation framework.',
|
|
340
|
+
'Connection lists are a good fit for this demo because the small home feed forces loadNext to be exercised.',
|
|
341
|
+
'The single SSE connection model is reassuring; we were worried live views would create one stream per card.',
|
|
342
|
+
'Live list events matching Post.comments is the detail that made the comment thread behavior click for me.',
|
|
343
|
+
'Deletion pruning is the kind of edge case that usually gets missed in hand-written cache updates.',
|
|
344
|
+
'Native HTTP transport makes adoption easier for teams that like the fate model but are not on tRPC.',
|
|
345
|
+
'Having Prisma and Drizzle examples side by side makes the server adapter story much more concrete.',
|
|
346
|
+
'The distinction between filters and pagination cursors is useful for avoiding accidental cache fragmentation.',
|
|
347
|
+
'The Vite plugin removing the regular codegen step will help a lot in demos and fresh projects.',
|
|
348
|
+
'Explicit retain and release behavior answers the question of how long normalized data should live.',
|
|
349
|
+
'Stable refs should make a visible difference in large feeds with memoized cards.',
|
|
350
|
+
'The migration checklist is realistic because it starts with one screen instead of a full rewrite.',
|
|
351
|
+
'I appreciate that the examples still work with existing server routes while adding the fate procedures.',
|
|
352
|
+
'The Void example is a nice proof that the transport and React APIs are portable.',
|
|
353
|
+
'Search results and category pages sharing Post records is a good way to show the cache doing real work.',
|
|
354
|
+
'Optimistic likes are simple, but they make the rollback behavior easy to test in front of someone.',
|
|
355
|
+
'Live comments plus optimistic comments give the demo a lot more texture than a static blog feed.',
|
|
356
|
+
'The data masking examples should be required reading before anyone adds fields to a shared component.',
|
|
357
|
+
'I like that the posts use product language instead of pretending this is a generic social network.',
|
|
358
|
+
'The server adapter notes helped me understand why fields and lists can share one selection pipeline.',
|
|
359
|
+
'The HTTP transport post answers the biggest question I had after reading the original announcement.',
|
|
360
|
+
'Connection identity following Relay semantics is a strong choice for teams that already know that model.',
|
|
361
|
+
'Garbage collection is easy to ignore until a long-lived app starts leaking records during navigation.',
|
|
362
|
+
'The stable ref change sounds small, but it explains a lot of the rerender fixes in the history.',
|
|
363
|
+
'The new seed data makes the event cards useful because the topics map to real fate features.',
|
|
364
|
+
'I used the strict selection post to explain why overfetching is not just a network problem.',
|
|
365
|
+
'The live deletion path matters for moderation workflows where comments disappear from multiple views.',
|
|
366
|
+
'The native protocol should make it easier to build examples outside of Hono and tRPC.',
|
|
367
|
+
'This makes me want a small debugging panel that shows which views selected a field.',
|
|
368
|
+
'The Vite plugin note clarifies why the generated client is still present without making codegen feel mandatory.',
|
|
369
|
+
'The migration sequence matches how we would try this inside an existing dashboard.',
|
|
370
|
+
'The comments list is long enough now to exercise load-more behavior without creating fake lorem ipsum.',
|
|
371
|
+
'The category descriptions make the sidebar useful for navigating the demo.',
|
|
372
|
+
'Seeing optimistic actions and live updates use the same normalized cache is the key idea.',
|
|
373
|
+
'The Void example deserves a walkthrough because it proves the framework integration boundary is small.',
|
|
374
|
+
'I would link the stable refs note from the performance section of the docs.',
|
|
375
|
+
'The source adapter post helped our backend team map data views to our existing models.',
|
|
376
|
+
'The React integration posts make it clear that fate is not trying to replace React state.',
|
|
377
|
+
'The event seed data now looks like something a real project would use for launch planning.',
|
|
378
|
+
'The cache lifetime post is a good reminder to retain manual requests outside React.',
|
|
379
|
+
'The search route feels more convincing when it can find live views, adapters, and migration content.',
|
|
380
|
+
'The examples now cover the features added after the announcement instead of stopping at the initial alpha.',
|
|
381
|
+
'I like that the same records can appear in the feed, categories, search, and detail pages without duplicate cache data.',
|
|
382
|
+
] as const;
|
|
383
|
+
|
|
384
|
+
export const events = [
|
|
385
|
+
{
|
|
386
|
+
attendees: [
|
|
387
|
+
{
|
|
388
|
+
notes: 'Hosting the walkthrough and collecting alpha feedback.',
|
|
389
|
+
status: 'GOING',
|
|
390
|
+
userEmail: 'alex@example.com',
|
|
391
|
+
},
|
|
392
|
+
{
|
|
393
|
+
notes: 'Preparing questions about native HTTP deployments.',
|
|
394
|
+
status: 'GOING',
|
|
395
|
+
userEmail: 'ari@nakazawa.dev',
|
|
396
|
+
},
|
|
397
|
+
{
|
|
398
|
+
notes: 'Wants to compare the tRPC and HTTP client setup.',
|
|
399
|
+
status: 'INTERESTED',
|
|
400
|
+
userEmail: 'dina@nakazawa.dev',
|
|
401
|
+
},
|
|
402
|
+
],
|
|
403
|
+
capacity: 300,
|
|
404
|
+
description:
|
|
405
|
+
'A guided tour of the current alpha covering views, normalized caching, native HTTP, and the updated example apps.',
|
|
406
|
+
endAt: new Date('2026-05-20T18:30:00.000Z'),
|
|
407
|
+
hostEmail: 'alex@example.com',
|
|
408
|
+
livestreamUrl: 'https://fate.technology',
|
|
409
|
+
location: 'Online',
|
|
410
|
+
name: 'fate alpha progress call',
|
|
411
|
+
startAt: new Date('2026-05-20T17:30:00.000Z'),
|
|
412
|
+
topics: ['Views', 'Native HTTP', 'Examples'],
|
|
413
|
+
type: 'COMMUNITY_CALL',
|
|
414
|
+
},
|
|
415
|
+
{
|
|
416
|
+
attendees: [
|
|
417
|
+
{
|
|
418
|
+
notes: 'Bringing a feed screen to convert during the session.',
|
|
419
|
+
status: 'GOING',
|
|
420
|
+
userEmail: 'hana@nakazawa.dev',
|
|
421
|
+
},
|
|
422
|
+
{
|
|
423
|
+
notes: 'Interested in data masking and missing-field failures.',
|
|
424
|
+
status: 'GOING',
|
|
425
|
+
userEmail: 'jamal@nakazawa.dev',
|
|
426
|
+
},
|
|
427
|
+
{
|
|
428
|
+
notes: 'Comparing ViewRefs with their current DTO props.',
|
|
429
|
+
status: 'INTERESTED',
|
|
430
|
+
userEmail: 'kai@nakazawa.dev',
|
|
431
|
+
},
|
|
432
|
+
],
|
|
433
|
+
capacity: 120,
|
|
434
|
+
description:
|
|
435
|
+
'Hands-on workshop for replacing request hooks with co-located views, root requests, and Suspense boundaries.',
|
|
436
|
+
endAt: new Date('2026-05-28T20:00:00.000Z'),
|
|
437
|
+
hostEmail: 'ari@nakazawa.dev',
|
|
438
|
+
livestreamUrl: 'https://fate.technology',
|
|
439
|
+
location: 'Nakazawa Tech Studio',
|
|
440
|
+
name: 'From request hooks to views',
|
|
441
|
+
startAt: new Date('2026-05-28T16:00:00.000Z'),
|
|
442
|
+
topics: ['Migration', 'Suspense', 'Data masking'],
|
|
443
|
+
type: 'WORKSHOP',
|
|
444
|
+
},
|
|
445
|
+
{
|
|
446
|
+
attendees: [
|
|
447
|
+
{
|
|
448
|
+
notes: 'Showing comment prepend and delete events.',
|
|
449
|
+
status: 'GOING',
|
|
450
|
+
userEmail: 'mika@nakazawa.dev',
|
|
451
|
+
},
|
|
452
|
+
{
|
|
453
|
+
notes: 'Testing reconnection behavior for event streams.',
|
|
454
|
+
status: 'INTERESTED',
|
|
455
|
+
userEmail: 'noah@nakazawa.dev',
|
|
456
|
+
},
|
|
457
|
+
{
|
|
458
|
+
notes: 'Taking notes for the live views guide.',
|
|
459
|
+
status: 'GOING',
|
|
460
|
+
userEmail: 'sora@nakazawa.dev',
|
|
461
|
+
},
|
|
462
|
+
],
|
|
463
|
+
capacity: 180,
|
|
464
|
+
description:
|
|
465
|
+
'Live demo of object updates, connection events, visible inserts, deletion pruning, and one SSE stream per client.',
|
|
466
|
+
endAt: new Date('2026-06-04T19:00:00.000Z'),
|
|
467
|
+
hostEmail: 'mika@nakazawa.dev',
|
|
468
|
+
livestreamUrl: 'https://fate.technology',
|
|
469
|
+
location: 'Online',
|
|
470
|
+
name: 'Live views lab',
|
|
471
|
+
startAt: new Date('2026-06-04T17:30:00.000Z'),
|
|
472
|
+
topics: ['Live views', 'SSE', 'Pagination'],
|
|
473
|
+
type: 'MEETUP',
|
|
474
|
+
},
|
|
475
|
+
{
|
|
476
|
+
attendees: [
|
|
477
|
+
{
|
|
478
|
+
notes: 'Bringing a Prisma schema with computed counts.',
|
|
479
|
+
status: 'GOING',
|
|
480
|
+
userEmail: 'dina@nakazawa.dev',
|
|
481
|
+
},
|
|
482
|
+
{
|
|
483
|
+
notes: 'Mapping Drizzle relations to source adapters.',
|
|
484
|
+
status: 'GOING',
|
|
485
|
+
userEmail: 'lena@nakazawa.dev',
|
|
486
|
+
},
|
|
487
|
+
{
|
|
488
|
+
notes: 'Checking how native HTTP fits their deployment.',
|
|
489
|
+
status: 'INTERESTED',
|
|
490
|
+
userEmail: 'ari@nakazawa.dev',
|
|
491
|
+
},
|
|
492
|
+
],
|
|
493
|
+
capacity: 90,
|
|
494
|
+
description:
|
|
495
|
+
'Server-focused session on data views, source adapters, Prisma, Drizzle, and the native fate HTTP handler.',
|
|
496
|
+
endAt: new Date('2026-06-12T18:30:00.000Z'),
|
|
497
|
+
hostEmail: 'dina@nakazawa.dev',
|
|
498
|
+
livestreamUrl: 'https://fate.technology',
|
|
499
|
+
location: 'Online',
|
|
500
|
+
name: 'Server adapter office hours',
|
|
501
|
+
startAt: new Date('2026-06-12T17:00:00.000Z'),
|
|
502
|
+
topics: ['Prisma', 'Drizzle', 'HTTP transport'],
|
|
503
|
+
type: 'AMA',
|
|
504
|
+
},
|
|
505
|
+
{
|
|
506
|
+
attendees: [
|
|
507
|
+
{
|
|
508
|
+
notes: 'Demoing the Void example home route.',
|
|
509
|
+
status: 'GOING',
|
|
510
|
+
userEmail: 'sora@nakazawa.dev',
|
|
511
|
+
},
|
|
512
|
+
{
|
|
513
|
+
notes: 'Testing the generated client in a full-stack app.',
|
|
514
|
+
status: 'GOING',
|
|
515
|
+
userEmail: 'jamal@nakazawa.dev',
|
|
516
|
+
},
|
|
517
|
+
{
|
|
518
|
+
notes: 'Watching for SSR and routing integration notes.',
|
|
519
|
+
status: 'INTERESTED',
|
|
520
|
+
userEmail: 'hana@nakazawa.dev',
|
|
521
|
+
},
|
|
522
|
+
],
|
|
523
|
+
capacity: 150,
|
|
524
|
+
description:
|
|
525
|
+
'Launch review for the Void example, including routing, auth, seed data, live comments, and fate client generation.',
|
|
526
|
+
endAt: new Date('2026-06-24T18:00:00.000Z'),
|
|
527
|
+
hostEmail: 'sora@nakazawa.dev',
|
|
528
|
+
livestreamUrl: 'https://fate.technology',
|
|
529
|
+
location: 'Online',
|
|
530
|
+
name: 'Void example launch review',
|
|
531
|
+
startAt: new Date('2026-06-24T17:00:00.000Z'),
|
|
532
|
+
topics: ['Void', 'Vite plugin', 'Examples'],
|
|
533
|
+
type: 'LAUNCH',
|
|
534
|
+
},
|
|
535
|
+
] as const;
|