create-fate 1.13.0 → 1.14.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.
Files changed (42) hide show
  1. package/bin/create-fate.mjs +5 -4
  2. package/package.json +1 -1
  3. package/templates/fate/_shared/vue-app/package.json +2 -2
  4. package/templates/fate/_shared/vue-app/src/ui/Link.vue +3 -2
  5. package/templates/fate/drizzle/.vite-hooks/pre-commit +0 -0
  6. package/templates/fate/drizzle/_gitignore +2 -0
  7. package/templates/fate/drizzle/client/package.json +2 -2
  8. package/templates/fate/drizzle/server/src/app.tsx +0 -0
  9. package/templates/fate/drizzle/vite.config.ts +2 -0
  10. package/templates/fate/graphql/.vite-hooks/pre-commit +0 -0
  11. package/templates/fate/graphql/_gitignore +2 -0
  12. package/templates/fate/graphql/client/package.json +2 -2
  13. package/templates/fate/graphql/package.json +1 -1
  14. package/templates/fate/graphql/server/package.json +2 -2
  15. package/templates/fate/graphql/server/scripts/generate-graphql.tsx +0 -0
  16. package/templates/fate/graphql/server/src/app.tsx +0 -0
  17. package/templates/fate/graphql/server/src/prisma/seed.tsx +0 -0
  18. package/templates/fate/graphql/vite.config.ts +2 -0
  19. package/templates/fate/graphql-client/_gitignore +2 -0
  20. package/templates/fate/graphql-client/package.json +2 -2
  21. package/templates/fate/graphql-client/vite.config.ts +16 -2
  22. package/templates/fate/http/.vite-hooks/pre-commit +0 -0
  23. package/templates/fate/http/_gitignore +2 -0
  24. package/templates/fate/http/client/package.json +2 -2
  25. package/templates/fate/http/server/src/app.tsx +0 -0
  26. package/templates/fate/http/vite.config.ts +2 -0
  27. package/templates/fate/prisma/.vite-hooks/pre-commit +0 -0
  28. package/templates/fate/prisma/_gitignore +2 -0
  29. package/templates/fate/prisma/client/package.json +2 -2
  30. package/templates/fate/prisma/server/src/app.tsx +0 -0
  31. package/templates/fate/prisma/server/src/prisma/seed.tsx +0 -0
  32. package/templates/fate/prisma/vite.config.ts +2 -0
  33. package/templates/fate/void/README.md +2 -2
  34. package/templates/fate/void/_gitignore +3 -0
  35. package/templates/fate/void/package.json +5 -5
  36. package/templates/fate/void/pnpm-workspace.yaml +2 -1
  37. package/templates/fate/void/src/ui/Link.tsx +5 -3
  38. package/templates/fate/void/vite.config.ts +18 -2
  39. package/templates/fate/void/void.config.ts +40 -0
  40. package/templates/fate/graphql/server/.gitignore +0 -5
  41. package/templates/fate/void/void.json +0 -32
  42. package/templates/fate/void/wrangler.jsonc +0 -16
@@ -805,6 +805,7 @@ const configureVueTemplate = (targetPath, selectedVariant) => {
805
805
  }
806
806
 
807
807
  if (selectedVariant === 'void') {
808
+ removeIfExists(path.join(frontendRoot, 'void.json'));
808
809
  configureVueVoidServerFiles(frontendRoot);
809
810
  }
810
811
 
@@ -827,12 +828,12 @@ const configureVueTemplate = (targetPath, selectedVariant) => {
827
828
  __FATE_TYPE_MODULE__: config.typeModule,
828
829
  __FMT_IGNORE_PATTERNS__:
829
830
  selectedVariant === 'void' || selectedVariant === 'graphql-client'
830
- ? "['.fate/', '.void/', 'dist/', 'node_modules/', 'pnpm-lock.yaml']"
831
- : "['.fate/', '.void/', 'dist/', 'node_modules/', '../dist/', 'pnpm-lock.yaml']",
831
+ ? "['**/.cloudflare/**', '.fate/', '.void/', '.void-wrangler.jsonc', 'dist/', 'node_modules/', 'pnpm-lock.yaml']"
832
+ : "['**/.cloudflare/**', '.fate/', '.void/', 'dist/', 'node_modules/', '../dist/', 'pnpm-lock.yaml']",
832
833
  __LINT_IGNORE_PATTERNS__:
833
834
  selectedVariant === 'void' || selectedVariant === 'graphql-client'
834
- ? "['.fate', '.void', 'dist', 'node_modules', 'vite.config.ts.timestamp-*']"
835
- : "['.fate', '.void', 'dist', 'node_modules', '../dist', 'vite.config.ts.timestamp-*']",
835
+ ? "['**/.cloudflare/**', '.fate', '.void', '.void-wrangler.jsonc', 'dist', 'node_modules', 'vite.config.ts.timestamp-*']"
836
+ : "['**/.cloudflare/**', '.fate', '.void', 'dist', 'node_modules', '../dist', 'vite.config.ts.timestamp-*']",
836
837
  __TSCONFIG_EXTENDS__:
837
838
  selectedVariant === 'void' || selectedVariant === 'graphql-client'
838
839
  ? './.void/tsconfig.json'
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-fate",
3
- "version": "1.13.0",
3
+ "version": "1.14.0",
4
4
  "description": "Create a new fate app.",
5
5
  "homepage": "https://github.com/nkzw-tech/fate",
6
6
  "license": "MIT",
@@ -22,13 +22,13 @@
22
22
  "@nkzw/core": "^1.3.1",
23
23
  "@nkzw/define-env": "^1.1.0",
24
24
  "@trpc/client": "^11.19.0",
25
- "@void/vue": "^1.3.0",
25
+ "@void/vue": "^1.6.1",
26
26
  "class-variance-authority": "^0.7.1",
27
27
  "clsx": "^2.1.1",
28
28
  "dotenv": "^18.0.9",
29
29
  "graphql-sse": "^2.6.3",
30
30
  "tailwind-merge": "^3.7.0",
31
- "void": "^1.3.0",
31
+ "void": "^1.6.1",
32
32
  "vue": "^3.5.44",
33
33
  "vue-fate": "latest"
34
34
  },
@@ -1,10 +1,11 @@
1
1
  <script setup lang="ts">
2
2
  import { Link as VoidLink } from '@void/vue';
3
+ import type { Href } from 'void/routes';
3
4
 
4
5
  defineProps<{
5
6
  class?: string;
6
- href?: string;
7
- to?: string;
7
+ href?: Href;
8
+ to?: Href;
8
9
  }>();
9
10
  </script>
10
11
 
File without changes
@@ -1,3 +1,5 @@
1
+ .cloudflare/
2
+ **/.cloudflare/
1
3
  .fate/
2
4
  **/.fate/
3
5
  .void/
@@ -27,7 +27,7 @@
27
27
  "@nkzw/stack": "^2.3.2",
28
28
  "@radix-ui/react-slot": "^1.5.0",
29
29
  "@trpc/client": "^11.19.0",
30
- "@void/react": "^1.3.0",
30
+ "@void/react": "^1.6.1",
31
31
  "better-auth": "^1.7.14",
32
32
  "class-variance-authority": "^0.7.1",
33
33
  "clsx": "^2.1.1",
@@ -38,7 +38,7 @@
38
38
  "react-error-boundary": "^6.1.6",
39
39
  "react-fate": "latest",
40
40
  "tailwind-merge": "^3.7.0",
41
- "void": "^1.3.0"
41
+ "void": "^1.6.1"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@nkzw/fbtee-compiler": "^5.0.0",
File without changes
@@ -22,6 +22,7 @@ export default defineConfig({
22
22
  stylesheet: 'client/src/App.css',
23
23
  },
24
24
  ignorePatterns: [
25
+ '**/.cloudflare/**',
25
26
  'coverage/',
26
27
  'dist/',
27
28
  '.fate/',
@@ -35,6 +36,7 @@ export default defineConfig({
35
36
  lint: {
36
37
  extends: [nkzw],
37
38
  ignorePatterns: [
39
+ '**/.cloudflare/**',
38
40
  'coverage',
39
41
  'dist',
40
42
  '.fate',
File without changes
@@ -1,3 +1,5 @@
1
+ .cloudflare/
2
+ **/.cloudflare/
1
3
  .fate/
2
4
  **/.fate/
3
5
  .void/
@@ -26,7 +26,7 @@
26
26
  "@nkzw/define-env": "^1.1.0",
27
27
  "@nkzw/stack": "^2.3.2",
28
28
  "@radix-ui/react-slot": "^1.5.0",
29
- "@void/react": "^1.3.0",
29
+ "@void/react": "^1.6.1",
30
30
  "better-auth": "^1.7.14",
31
31
  "class-variance-authority": "^0.7.1",
32
32
  "clsx": "^2.1.1",
@@ -38,7 +38,7 @@
38
38
  "react-error-boundary": "^6.1.6",
39
39
  "react-fate": "latest",
40
40
  "tailwind-merge": "^3.7.0",
41
- "void": "^1.3.0"
41
+ "void": "^1.6.1"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@nkzw/fbtee-compiler": "^5.0.0",
@@ -28,7 +28,7 @@
28
28
  "@types/node": "^26.6.5",
29
29
  "dotenv": "^18.0.9",
30
30
  "npm-run-all2": "^9.0.4",
31
- "prisma": "^7.10.0",
31
+ "prisma": "^7.10.1",
32
32
  "typescript": "^7.0.2",
33
33
  "vite": "catalog:",
34
34
  "vite-plus": "catalog:",
@@ -46,8 +46,8 @@
46
46
  "glob": "^13.0.6",
47
47
  "nodemon": "^3.1.14",
48
48
  "oxfmt": "^0.65.0",
49
- "prisma": "^7.10.0",
50
- "prisma-json-types-generator": "^5.2.0",
49
+ "prisma": "^7.10.1",
50
+ "prisma-json-types-generator": "^6.0.0",
51
51
  "typescript": "^7.0.2",
52
52
  "vite-plus": "catalog:",
53
53
  "vitest": "catalog:"
File without changes
File without changes
@@ -22,6 +22,7 @@ export default defineConfig({
22
22
  stylesheet: 'client/src/App.css',
23
23
  },
24
24
  ignorePatterns: [
25
+ '**/.cloudflare/**',
25
26
  'coverage/',
26
27
  'dist/',
27
28
  '.fate/',
@@ -36,6 +37,7 @@ export default defineConfig({
36
37
  lint: {
37
38
  extends: [nkzw],
38
39
  ignorePatterns: [
40
+ '**/.cloudflare/**',
39
41
  'coverage',
40
42
  'dist',
41
43
  '.fate',
@@ -1,3 +1,5 @@
1
+ .cloudflare/
2
+ **/.cloudflare/
1
3
  .fate/
2
4
  **/.fate/
3
5
  .void/
@@ -23,7 +23,7 @@
23
23
  },
24
24
  "dependencies": {
25
25
  "@nkzw/fate": "latest",
26
- "@void/react": "^1.3.0",
26
+ "@void/react": "^1.6.1",
27
27
  "fbtee": "^5.0.0",
28
28
  "graphql-sse": "^2.6.3",
29
29
  "lucide-react": "^1.61.0",
@@ -31,7 +31,7 @@
31
31
  "react-dom": "^19.3.1",
32
32
  "react-error-boundary": "^6.1.6",
33
33
  "react-fate": "latest",
34
- "void": "^1.3.0"
34
+ "void": "^1.6.1"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@nkzw/eslint-plugin": "^2.0.0",
@@ -30,12 +30,26 @@ export default defineConfig({
30
30
  experimentalTailwindcss: {
31
31
  stylesheet: 'src/App.css',
32
32
  },
33
- ignorePatterns: ['.fate/', '.void/', 'dist/', 'node_modules/', 'pnpm-lock.yaml'],
33
+ ignorePatterns: [
34
+ '**/.cloudflare/**',
35
+ '.fate/',
36
+ '.void/',
37
+ 'dist/',
38
+ 'node_modules/',
39
+ 'pnpm-lock.yaml',
40
+ ],
34
41
  singleQuote: true,
35
42
  },
36
43
  lint: {
37
44
  extends: [nkzw],
38
- ignorePatterns: ['.fate', '.void', 'dist', 'node_modules', 'vite.config.ts.timestamp-*'],
45
+ ignorePatterns: [
46
+ '**/.cloudflare/**',
47
+ '.fate',
48
+ '.void',
49
+ 'dist',
50
+ 'node_modules',
51
+ 'vite.config.ts.timestamp-*',
52
+ ],
39
53
  options: { typeAware: true, typeCheck: true },
40
54
  overrides: [
41
55
  {
File without changes
@@ -1,3 +1,5 @@
1
+ .cloudflare/
2
+ **/.cloudflare/
1
3
  .fate/
2
4
  **/.fate/
3
5
  .void/
@@ -26,7 +26,7 @@
26
26
  "@nkzw/define-env": "^1.1.0",
27
27
  "@nkzw/stack": "^2.3.2",
28
28
  "@radix-ui/react-slot": "^1.5.0",
29
- "@void/react": "^1.3.0",
29
+ "@void/react": "^1.6.1",
30
30
  "better-auth": "^1.7.14",
31
31
  "class-variance-authority": "^0.7.1",
32
32
  "clsx": "^2.1.1",
@@ -37,7 +37,7 @@
37
37
  "react-error-boundary": "^6.1.6",
38
38
  "react-fate": "latest",
39
39
  "tailwind-merge": "^3.7.0",
40
- "void": "^1.3.0"
40
+ "void": "^1.6.1"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@nkzw/fbtee-compiler": "^5.0.0",
File without changes
@@ -22,6 +22,7 @@ export default defineConfig({
22
22
  stylesheet: 'client/src/App.css',
23
23
  },
24
24
  ignorePatterns: [
25
+ '**/.cloudflare/**',
25
26
  'coverage/',
26
27
  'dist/',
27
28
  '.fate/',
@@ -35,6 +36,7 @@ export default defineConfig({
35
36
  lint: {
36
37
  extends: [nkzw],
37
38
  ignorePatterns: [
39
+ '**/.cloudflare/**',
38
40
  'coverage',
39
41
  'dist',
40
42
  '.fate',
File without changes
@@ -1,3 +1,5 @@
1
+ .cloudflare/
2
+ **/.cloudflare/
1
3
  .fate/
2
4
  **/.fate/
3
5
  .void/
@@ -27,7 +27,7 @@
27
27
  "@nkzw/stack": "^2.3.2",
28
28
  "@radix-ui/react-slot": "^1.5.0",
29
29
  "@trpc/client": "^11.19.0",
30
- "@void/react": "^1.3.0",
30
+ "@void/react": "^1.6.1",
31
31
  "better-auth": "^1.7.14",
32
32
  "class-variance-authority": "^0.7.1",
33
33
  "clsx": "^2.1.1",
@@ -38,7 +38,7 @@
38
38
  "react-error-boundary": "^6.1.6",
39
39
  "react-fate": "latest",
40
40
  "tailwind-merge": "^3.7.0",
41
- "void": "^1.3.0"
41
+ "void": "^1.6.1"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@nkzw/fbtee-compiler": "^5.0.0",
File without changes
File without changes
@@ -22,6 +22,7 @@ export default defineConfig({
22
22
  stylesheet: 'client/src/App.css',
23
23
  },
24
24
  ignorePatterns: [
25
+ '**/.cloudflare/**',
25
26
  'coverage/',
26
27
  'dist/',
27
28
  '.fate/',
@@ -35,6 +36,7 @@ export default defineConfig({
35
36
  lint: {
36
37
  extends: [nkzw],
37
38
  ignorePatterns: [
39
+ '**/.cloudflare/**',
38
40
  'coverage',
39
41
  'dist',
40
42
  '.fate',
@@ -17,7 +17,7 @@ This template uses the Void pages router with Drizzle, `void-fate`, `react-fate`
17
17
 
18
18
  ## Initial Setup
19
19
 
20
- You'll need Node.js 24+ and [Vite+](https://viteplus.dev/guide/).
20
+ You'll need Node.js 24.22+ on the 24.x line or Node.js 26.12+, and [Vite+](https://viteplus.dev/guide/).
21
21
 
22
22
  Install dependencies:
23
23
 
@@ -62,7 +62,7 @@ Deploy directly to your own Cloudflare account:
62
62
  vp exec void deploy --platform cloudflare
63
63
  ```
64
64
 
65
- Void signs you into Cloudflare when needed, provisions resources, applies the checked-in database migrations, and deploys the app. Commit the resource IDs saved in `wrangler.jsonc` for subsequent deployments. Keep the template's `VOID_LIVE` Durable Object binding and class migration for live updates.
65
+ Void signs you into Cloudflare when needed, provisions resources, applies the checked-in database migrations, and deploys the app. Commit the resource IDs saved in `void.lock.json` for subsequent deployments. Keep the template's `VOID_LIVE` Durable Object binding and class migration in `void.config.ts` for live updates.
66
66
 
67
67
  After changing the database schema or auth configuration, run `vp run db:generate`, review and commit the migration, then deploy. The template's migrations include the production Better Auth schema.
68
68
 
@@ -1,5 +1,8 @@
1
+ .cloudflare/
2
+ **/.cloudflare/
1
3
  .fate/
2
4
  .void/
5
+ .void-wrangler.jsonc
3
6
  .wrangler/
4
7
  .eslintcache
5
8
  .pnpm-debug.log
@@ -29,8 +29,8 @@
29
29
  "@nkzw/fate": "latest",
30
30
  "@nkzw/stack": "^2.3.2",
31
31
  "@radix-ui/react-slot": "^1.5.0",
32
- "@void/react": "^1.3.0",
33
- "better-auth": "^1.7.14",
32
+ "@void/react": "^1.6.1",
33
+ "better-auth": "^1.7.15",
34
34
  "class-variance-authority": "^0.7.1",
35
35
  "clsx": "^2.1.1",
36
36
  "drizzle-orm": "^0.45.4",
@@ -41,12 +41,12 @@
41
41
  "react-error-boundary": "^6.1.6",
42
42
  "react-fate": "latest",
43
43
  "tailwind-merge": "^3.7.0",
44
- "void": "^1.3.0",
44
+ "void": "^1.6.1",
45
45
  "void-fate": "latest",
46
46
  "zod": "^4.6.7"
47
47
  },
48
48
  "devDependencies": {
49
- "@cloudflare/workers-types": "5.20261027.1",
49
+ "@cloudflare/workers-types": "5.20261103.1",
50
50
  "@nkzw/eslint-plugin": "^2.0.0",
51
51
  "@nkzw/fbtee-compiler": "^5.0.0",
52
52
  "@nkzw/oxlint-config": "^2.0.1",
@@ -70,7 +70,7 @@
70
70
  "not op_mini all"
71
71
  ],
72
72
  "engines": {
73
- "node": ">=24.0.0",
73
+ "node": "^24.22.0 || >=26.12.0",
74
74
  "pnpm": ">=11.0.0"
75
75
  },
76
76
  "packageManager": "pnpm@12.6.0"
@@ -25,7 +25,8 @@ onlyBuiltDependencies:
25
25
  - workerd
26
26
 
27
27
  overrides:
28
- better-auth: 1.7.14
28
+ '@cloudflare/workers-types': 5.20261103.1
29
+ better-auth: 1.7.15
29
30
  drizzle-orm: 0.45.4
30
31
  kysely: 0.28.17
31
32
  vite: 'catalog:'
@@ -1,9 +1,11 @@
1
1
  import { Link as VoidLink } from '@void/react';
2
2
  import type { ComponentProps } from 'react';
3
3
 
4
- export type LinkProps = Omit<ComponentProps<typeof VoidLink>, 'href'> & {
5
- href?: string;
6
- to?: string;
4
+ type VoidLinkProps = ComponentProps<typeof VoidLink>;
5
+
6
+ export type LinkProps = Omit<VoidLinkProps, 'href'> & {
7
+ href?: VoidLinkProps['href'];
8
+ to?: VoidLinkProps['href'];
7
9
  };
8
10
 
9
11
  export default function Link({ href, to, ...props }: LinkProps) {
@@ -36,12 +36,28 @@ export default defineConfig({
36
36
  experimentalTailwindcss: {
37
37
  stylesheet: 'src/App.css',
38
38
  },
39
- ignorePatterns: ['.fate/', '.void/', 'dist/', 'node_modules/', 'pnpm-lock.yaml'],
39
+ ignorePatterns: [
40
+ '**/.cloudflare/**',
41
+ '.fate/',
42
+ '.void/',
43
+ '.void-wrangler.jsonc',
44
+ 'dist/',
45
+ 'node_modules/',
46
+ 'pnpm-lock.yaml',
47
+ ],
40
48
  singleQuote: true,
41
49
  },
42
50
  lint: {
43
51
  extends: [nkzw],
44
- ignorePatterns: ['.fate', '.void', 'dist', 'node_modules', 'vite.config.ts.timestamp-*'],
52
+ ignorePatterns: [
53
+ '**/.cloudflare/**',
54
+ '.fate',
55
+ '.void',
56
+ '.void-wrangler.jsonc',
57
+ 'dist',
58
+ 'node_modules',
59
+ 'vite.config.ts.timestamp-*',
60
+ ],
45
61
  options: { typeAware: true, typeCheck: true },
46
62
  overrides: [
47
63
  {
@@ -0,0 +1,40 @@
1
+ import { defineConfig } from 'void/config';
2
+
3
+ export default defineConfig({
4
+ auth: {
5
+ providers: ['email'],
6
+ },
7
+ cloudflare: {
8
+ durable_objects: {
9
+ bindings: [
10
+ {
11
+ class_name: 'VoidLiveStreamDurableObject',
12
+ name: 'VOID_LIVE',
13
+ },
14
+ ],
15
+ },
16
+ migrations: [
17
+ {
18
+ new_sqlite_classes: ['VoidLiveStreamDurableObject'],
19
+ tag: 'live-v1',
20
+ },
21
+ ],
22
+ },
23
+ head: {
24
+ htmlAttrs: {
25
+ lang: 'en',
26
+ },
27
+ link: [{ href: '/icon.svg', rel: 'icon' }],
28
+ meta: [
29
+ { charset: 'utf8' },
30
+ { content: 'width=device-width, initial-scale=1', name: 'viewport' },
31
+ ],
32
+ title: 'fate',
33
+ titleTemplate: '%s | fate',
34
+ },
35
+ routing: { typedRoutes: true },
36
+ worker: {
37
+ compatibility_date: '2025-12-01',
38
+ compatibility_flags: ['nodejs_compat', 'no_handle_cross_request_promise_resolution'],
39
+ },
40
+ });
@@ -1,5 +0,0 @@
1
- .pnpm-debug.log
2
- /node_modules/
3
- coverage/
4
- tsconfig.tsbuildinfo
5
- dist/
@@ -1,32 +0,0 @@
1
- {
2
- "$schema": "./node_modules/void/schema.json",
3
- "auth": {
4
- "providers": ["email"]
5
- },
6
- "head": {
7
- "title": "fate",
8
- "titleTemplate": "%s | fate",
9
- "htmlAttrs": {
10
- "lang": "en"
11
- },
12
- "meta": [
13
- {
14
- "charset": "utf-8"
15
- },
16
- {
17
- "name": "viewport",
18
- "content": "width=device-width, initial-scale=1"
19
- }
20
- ],
21
- "link": [
22
- {
23
- "rel": "icon",
24
- "href": "/icon.svg"
25
- }
26
- ]
27
- },
28
- "worker": {
29
- "compatibility_date": "2025-12-01",
30
- "compatibility_flags": ["nodejs_compat", "no_handle_cross_request_promise_resolution"]
31
- }
32
- }
@@ -1,16 +0,0 @@
1
- {
2
- "durable_objects": {
3
- "bindings": [
4
- {
5
- "name": "VOID_LIVE",
6
- "class_name": "VoidLiveStreamDurableObject",
7
- },
8
- ],
9
- },
10
- "migrations": [
11
- {
12
- "tag": "live-v1",
13
- "new_sqlite_classes": ["VoidLiveStreamDurableObject"],
14
- },
15
- ],
16
- }