create-fate 1.5.2 → 1.6.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 (138) hide show
  1. package/README.md +1 -2
  2. package/bin/create-fate.mjs +14 -50
  3. package/package.json +1 -1
  4. package/templates/fate/README.md +1 -2
  5. package/templates/fate/_shared/vue-app/package.json +4 -3
  6. package/templates/fate/_shared/vue-app/vite.config.ts +18 -11
  7. package/templates/fate/drizzle/client/package.json +6 -6
  8. package/templates/fate/graphql/client/package.json +6 -6
  9. package/templates/fate/graphql/server/.gitignore +5 -0
  10. package/templates/fate/graphql/server/node_modules/.bin/esbuild +22 -0
  11. package/templates/fate/graphql/server/node_modules/.bin/eslint +22 -0
  12. package/templates/fate/graphql/server/node_modules/.bin/fate +22 -0
  13. package/templates/fate/graphql/server/node_modules/.bin/intent +22 -0
  14. package/templates/fate/graphql/server/node_modules/.bin/jiti +22 -0
  15. package/templates/fate/graphql/server/node_modules/.bin/nft +22 -0
  16. package/templates/fate/graphql/server/node_modules/.bin/nodemon +22 -0
  17. package/templates/fate/graphql/server/node_modules/.bin/oxfmt +22 -0
  18. package/templates/fate/graphql/server/node_modules/.bin/oxlint +22 -0
  19. package/templates/fate/graphql/server/node_modules/.bin/prisma +22 -0
  20. package/templates/fate/graphql/server/node_modules/.bin/prisma-json-types-generator +22 -0
  21. package/templates/fate/graphql/server/node_modules/.bin/prisma-pothos-types +22 -0
  22. package/templates/fate/graphql/server/node_modules/.bin/tsc +22 -0
  23. package/templates/fate/graphql/server/node_modules/.bin/tsgolint +22 -0
  24. package/templates/fate/graphql/server/node_modules/.bin/tsx +22 -0
  25. package/templates/fate/graphql/server/node_modules/.bin/vitest +22 -0
  26. package/templates/fate/graphql/server/node_modules/.bin/vp +22 -0
  27. package/templates/fate/graphql/server/node_modules/.bin/vpr +22 -0
  28. package/templates/fate/graphql/server/node_modules/.bin/yaml +22 -0
  29. package/templates/fate/graphql-client/README.md +11 -1
  30. package/templates/fate/graphql-client/env.ts +6 -0
  31. package/templates/fate/graphql-client/package.json +6 -6
  32. package/templates/fate/http/client/package.json +6 -6
  33. package/templates/fate/prisma/client/package.json +6 -6
  34. package/templates/fate/void/README.md +12 -0
  35. package/templates/fate/void/db/migrations/20260918045815_legal_dragon_lord.sql +15 -0
  36. package/templates/fate/{cloudflare/server/db/migrations/meta/20260508073357_snapshot.json → void/db/migrations/meta/20260918045815_snapshot.json} +174 -124
  37. package/templates/fate/void/db/migrations/meta/_journal.json +7 -0
  38. package/templates/fate/void/package.json +6 -7
  39. package/templates/fate/cloudflare/.github/workflows/push.yml +0 -27
  40. package/templates/fate/cloudflare/.vite-hooks/pre-commit +0 -1
  41. package/templates/fate/cloudflare/.vscode/extensions.json +0 -12
  42. package/templates/fate/cloudflare/.vscode/settings.json +0 -25
  43. package/templates/fate/cloudflare/AGENTS.md +0 -55
  44. package/templates/fate/cloudflare/README.md +0 -137
  45. package/templates/fate/cloudflare/_gitignore +0 -20
  46. package/templates/fate/cloudflare/client/node_modules/.bin/browserslist +0 -22
  47. package/templates/fate/cloudflare/client/node_modules/.bin/cf-wrangler +0 -22
  48. package/templates/fate/cloudflare/client/node_modules/.bin/drizzle-kit +0 -22
  49. package/templates/fate/cloudflare/client/node_modules/.bin/esbuild +0 -22
  50. package/templates/fate/cloudflare/client/node_modules/.bin/fate +0 -22
  51. package/templates/fate/cloudflare/client/node_modules/.bin/fbtee +0 -22
  52. package/templates/fate/cloudflare/client/node_modules/.bin/intent +0 -22
  53. package/templates/fate/cloudflare/client/node_modules/.bin/jiti +0 -22
  54. package/templates/fate/cloudflare/client/node_modules/.bin/oxfmt +0 -22
  55. package/templates/fate/cloudflare/client/node_modules/.bin/oxlint +0 -22
  56. package/templates/fate/cloudflare/client/node_modules/.bin/rolldown +0 -22
  57. package/templates/fate/cloudflare/client/node_modules/.bin/tsc +0 -22
  58. package/templates/fate/cloudflare/client/node_modules/.bin/tsx +0 -22
  59. package/templates/fate/cloudflare/client/node_modules/.bin/vitest +0 -22
  60. package/templates/fate/cloudflare/client/node_modules/.bin/void +0 -22
  61. package/templates/fate/cloudflare/client/node_modules/.bin/vp +0 -22
  62. package/templates/fate/cloudflare/client/node_modules/.bin/vpr +0 -22
  63. package/templates/fate/cloudflare/client/node_modules/.bin/workerd +0 -22
  64. package/templates/fate/cloudflare/client/node_modules/.bin/wrangler +0 -22
  65. package/templates/fate/cloudflare/client/node_modules/.bin/wrangler2 +0 -22
  66. package/templates/fate/cloudflare/client/package.json +0 -62
  67. package/templates/fate/cloudflare/client/pages/index.tsx +0 -96
  68. package/templates/fate/cloudflare/client/pages/layout.tsx +0 -68
  69. package/templates/fate/cloudflare/client/pages/login.tsx +0 -107
  70. package/templates/fate/cloudflare/client/pages/post/[id].tsx +0 -22
  71. package/templates/fate/cloudflare/client/pages/search.tsx +0 -99
  72. package/templates/fate/cloudflare/client/public/icon.svg +0 -1
  73. package/templates/fate/cloudflare/client/src/App.css +0 -153
  74. package/templates/fate/cloudflare/client/src/lib/AvailableLanguages.tsx +0 -5
  75. package/templates/fate/cloudflare/client/src/lib/LocaleContext.tsx +0 -61
  76. package/templates/fate/cloudflare/client/src/lib/cx.tsx +0 -6
  77. package/templates/fate/cloudflare/client/src/lib/env.tsx +0 -5
  78. package/templates/fate/cloudflare/client/src/ui/Badge.tsx +0 -31
  79. package/templates/fate/cloudflare/client/src/ui/Button.tsx +0 -108
  80. package/templates/fate/cloudflare/client/src/ui/Card.tsx +0 -32
  81. package/templates/fate/cloudflare/client/src/ui/CommentCard.tsx +0 -75
  82. package/templates/fate/cloudflare/client/src/ui/Error.tsx +0 -19
  83. package/templates/fate/cloudflare/client/src/ui/H2.tsx +0 -15
  84. package/templates/fate/cloudflare/client/src/ui/H3.tsx +0 -20
  85. package/templates/fate/cloudflare/client/src/ui/Header.tsx +0 -98
  86. package/templates/fate/cloudflare/client/src/ui/Input.tsx +0 -17
  87. package/templates/fate/cloudflare/client/src/ui/Link.tsx +0 -11
  88. package/templates/fate/cloudflare/client/src/ui/LocaleSwitcher.tsx +0 -34
  89. package/templates/fate/cloudflare/client/src/ui/PostCard.tsx +0 -303
  90. package/templates/fate/cloudflare/client/src/ui/Section.tsx +0 -23
  91. package/templates/fate/cloudflare/client/src/ui/UserCard.tsx +0 -131
  92. package/templates/fate/cloudflare/client/src/user/AuthClient.tsx +0 -6
  93. package/templates/fate/cloudflare/client/start.mjs +0 -11
  94. package/templates/fate/cloudflare/client/translations/de-DE.json +0 -632
  95. package/templates/fate/cloudflare/client/translations/ja-JP.json +0 -632
  96. package/templates/fate/cloudflare/client/vite.config.ts +0 -41
  97. package/templates/fate/cloudflare/client/void.json +0 -29
  98. package/templates/fate/cloudflare/package.json +0 -42
  99. package/templates/fate/cloudflare/pnpm-workspace.yaml +0 -41
  100. package/templates/fate/cloudflare/server/.env.example +0 -1
  101. package/templates/fate/cloudflare/server/db/db.ts +0 -30
  102. package/templates/fate/cloudflare/server/db/migrations/20260508073357_initial_schema.sql +0 -134
  103. package/templates/fate/cloudflare/server/db/migrations/20260508120500_seed_cloudflare_demo.sql +0 -170
  104. package/templates/fate/cloudflare/server/db/migrations/meta/_journal.json +0 -20
  105. package/templates/fate/cloudflare/server/db/queries.ts +0 -211
  106. package/templates/fate/cloudflare/server/db/schema.ts +0 -331
  107. package/templates/fate/cloudflare/server/node_modules/.bin/cf-wrangler +0 -22
  108. package/templates/fate/cloudflare/server/node_modules/.bin/drizzle-kit +0 -22
  109. package/templates/fate/cloudflare/server/node_modules/.bin/esbuild +0 -22
  110. package/templates/fate/cloudflare/server/node_modules/.bin/fate +0 -22
  111. package/templates/fate/cloudflare/server/node_modules/.bin/intent +0 -22
  112. package/templates/fate/cloudflare/server/node_modules/.bin/jiti +0 -22
  113. package/templates/fate/cloudflare/server/node_modules/.bin/oxfmt +0 -22
  114. package/templates/fate/cloudflare/server/node_modules/.bin/oxlint +0 -22
  115. package/templates/fate/cloudflare/server/node_modules/.bin/tsc +0 -22
  116. package/templates/fate/cloudflare/server/node_modules/.bin/tsx +0 -22
  117. package/templates/fate/cloudflare/server/node_modules/.bin/vitest +0 -22
  118. package/templates/fate/cloudflare/server/node_modules/.bin/vp +0 -22
  119. package/templates/fate/cloudflare/server/node_modules/.bin/vpr +0 -22
  120. package/templates/fate/cloudflare/server/node_modules/.bin/workerd +0 -22
  121. package/templates/fate/cloudflare/server/node_modules/.bin/wrangler +0 -22
  122. package/templates/fate/cloudflare/server/node_modules/.bin/wrangler2 +0 -22
  123. package/templates/fate/cloudflare/server/package.json +0 -34
  124. package/templates/fate/cloudflare/server/src/fate/commentPermissions.ts +0 -17
  125. package/templates/fate/cloudflare/server/src/fate/context.ts +0 -15
  126. package/templates/fate/cloudflare/server/src/fate/live.ts +0 -7
  127. package/templates/fate/cloudflare/server/src/fate/server.ts +0 -414
  128. package/templates/fate/cloudflare/server/src/fate/views.ts +0 -164
  129. package/templates/fate/cloudflare/server/src/index.ts +0 -80
  130. package/templates/fate/cloudflare/server/src/lib/auth.ts +0 -64
  131. package/templates/fate/cloudflare/server/src/lib/origins.ts +0 -17
  132. package/templates/fate/cloudflare/server/src/router.ts +0 -2
  133. package/templates/fate/cloudflare/server/src/user/SessionUser.tsx +0 -17
  134. package/templates/fate/cloudflare/server/tsconfig.json +0 -10
  135. package/templates/fate/cloudflare/server/wrangler.jsonc +0 -29
  136. package/templates/fate/cloudflare/tsconfig.json +0 -24
  137. package/templates/fate/cloudflare/vite.config.ts +0 -75
  138. package/templates/fate/graphql-client/.env.example +0 -3
@@ -1,24 +1,24 @@
1
1
  {
2
2
  "version": "6",
3
3
  "dialect": "sqlite",
4
- "id": "0fd2f219-f586-40bc-b202-307b9977bebc",
5
- "prevId": "00000000-0000-0000-0000-000000000000",
4
+ "id": "a8edb33d-77ee-4778-8b45-031fc56101f0",
5
+ "prevId": "0fd2f219-f586-40bc-b202-307b9977bebc",
6
6
  "tables": {
7
7
  "account": {
8
8
  "name": "account",
9
9
  "columns": {
10
- "accessToken": {
11
- "name": "accessToken",
10
+ "id": {
11
+ "name": "id",
12
12
  "type": "text",
13
- "primaryKey": false,
14
- "notNull": false,
13
+ "primaryKey": true,
14
+ "notNull": true,
15
15
  "autoincrement": false
16
16
  },
17
- "accessTokenExpiresAt": {
18
- "name": "accessTokenExpiresAt",
19
- "type": "integer",
17
+ "issuer": {
18
+ "name": "issuer",
19
+ "type": "text",
20
20
  "primaryKey": false,
21
- "notNull": false,
21
+ "notNull": true,
22
22
  "autoincrement": false
23
23
  },
24
24
  "accountId": {
@@ -28,52 +28,44 @@
28
28
  "notNull": true,
29
29
  "autoincrement": false
30
30
  },
31
- "createdAt": {
32
- "name": "createdAt",
33
- "type": "integer",
34
- "primaryKey": false,
35
- "notNull": true,
36
- "autoincrement": false,
37
- "default": "(unixepoch())"
38
- },
39
- "id": {
40
- "name": "id",
31
+ "providerId": {
32
+ "name": "providerId",
41
33
  "type": "text",
42
- "primaryKey": true,
34
+ "primaryKey": false,
43
35
  "notNull": true,
44
36
  "autoincrement": false
45
37
  },
46
- "idToken": {
47
- "name": "idToken",
38
+ "userId": {
39
+ "name": "userId",
48
40
  "type": "text",
49
41
  "primaryKey": false,
50
- "notNull": false,
42
+ "notNull": true,
51
43
  "autoincrement": false
52
44
  },
53
- "issuer": {
54
- "name": "issuer",
45
+ "accessToken": {
46
+ "name": "accessToken",
55
47
  "type": "text",
56
48
  "primaryKey": false,
57
- "notNull": true,
49
+ "notNull": false,
58
50
  "autoincrement": false
59
51
  },
60
- "password": {
61
- "name": "password",
52
+ "refreshToken": {
53
+ "name": "refreshToken",
62
54
  "type": "text",
63
55
  "primaryKey": false,
64
56
  "notNull": false,
65
57
  "autoincrement": false
66
58
  },
67
- "providerId": {
68
- "name": "providerId",
59
+ "idToken": {
60
+ "name": "idToken",
69
61
  "type": "text",
70
62
  "primaryKey": false,
71
- "notNull": true,
63
+ "notNull": false,
72
64
  "autoincrement": false
73
65
  },
74
- "refreshToken": {
75
- "name": "refreshToken",
76
- "type": "text",
66
+ "accessTokenExpiresAt": {
67
+ "name": "accessTokenExpiresAt",
68
+ "type": "integer",
77
69
  "primaryKey": false,
78
70
  "notNull": false,
79
71
  "autoincrement": false
@@ -92,27 +84,33 @@
92
84
  "notNull": false,
93
85
  "autoincrement": false
94
86
  },
95
- "updatedAt": {
96
- "name": "updatedAt",
87
+ "password": {
88
+ "name": "password",
89
+ "type": "text",
90
+ "primaryKey": false,
91
+ "notNull": false,
92
+ "autoincrement": false
93
+ },
94
+ "createdAt": {
95
+ "name": "createdAt",
97
96
  "type": "integer",
98
97
  "primaryKey": false,
99
98
  "notNull": true,
100
- "autoincrement": false,
101
- "default": "(unixepoch())"
99
+ "autoincrement": false
102
100
  },
103
- "userId": {
104
- "name": "userId",
105
- "type": "text",
101
+ "updatedAt": {
102
+ "name": "updatedAt",
103
+ "type": "integer",
106
104
  "primaryKey": false,
107
105
  "notNull": true,
108
106
  "autoincrement": false
109
107
  }
110
108
  },
111
109
  "indexes": {
112
- "account_issuer_accountId_key": {
113
- "name": "account_issuer_accountId_key",
114
- "columns": ["issuer", "accountId"],
115
- "isUnique": true
110
+ "account_userId_idx": {
111
+ "name": "account_userId_idx",
112
+ "columns": ["userId"],
113
+ "isUnique": false
116
114
  }
117
115
  },
118
116
  "foreignKeys": {
@@ -607,21 +605,6 @@
607
605
  "session": {
608
606
  "name": "session",
609
607
  "columns": {
610
- "createdAt": {
611
- "name": "createdAt",
612
- "type": "integer",
613
- "primaryKey": false,
614
- "notNull": true,
615
- "autoincrement": false,
616
- "default": "(unixepoch())"
617
- },
618
- "expiresAt": {
619
- "name": "expiresAt",
620
- "type": "integer",
621
- "primaryKey": false,
622
- "notNull": true,
623
- "autoincrement": false
624
- },
625
608
  "id": {
626
609
  "name": "id",
627
610
  "type": "text",
@@ -629,11 +612,11 @@
629
612
  "notNull": true,
630
613
  "autoincrement": false
631
614
  },
632
- "ipAddress": {
633
- "name": "ipAddress",
634
- "type": "text",
615
+ "expiresAt": {
616
+ "name": "expiresAt",
617
+ "type": "integer",
635
618
  "primaryKey": false,
636
- "notNull": false,
619
+ "notNull": true,
637
620
  "autoincrement": false
638
621
  },
639
622
  "token": {
@@ -643,13 +626,26 @@
643
626
  "notNull": true,
644
627
  "autoincrement": false
645
628
  },
629
+ "createdAt": {
630
+ "name": "createdAt",
631
+ "type": "integer",
632
+ "primaryKey": false,
633
+ "notNull": true,
634
+ "autoincrement": false
635
+ },
646
636
  "updatedAt": {
647
637
  "name": "updatedAt",
648
638
  "type": "integer",
649
639
  "primaryKey": false,
650
640
  "notNull": true,
651
- "autoincrement": false,
652
- "default": "(unixepoch())"
641
+ "autoincrement": false
642
+ },
643
+ "ipAddress": {
644
+ "name": "ipAddress",
645
+ "type": "text",
646
+ "primaryKey": false,
647
+ "notNull": false,
648
+ "autoincrement": false
653
649
  },
654
650
  "userAgent": {
655
651
  "name": "userAgent",
@@ -664,13 +660,25 @@
664
660
  "primaryKey": false,
665
661
  "notNull": true,
666
662
  "autoincrement": false
663
+ },
664
+ "impersonatedBy": {
665
+ "name": "impersonatedBy",
666
+ "type": "text",
667
+ "primaryKey": false,
668
+ "notNull": false,
669
+ "autoincrement": false
667
670
  }
668
671
  },
669
672
  "indexes": {
670
- "session_token_key": {
671
- "name": "session_token_key",
673
+ "session_token_unique": {
674
+ "name": "session_token_unique",
672
675
  "columns": ["token"],
673
676
  "isUnique": true
677
+ },
678
+ "session_userId_idx": {
679
+ "name": "session_userId_idx",
680
+ "columns": ["userId"],
681
+ "isUnique": false
674
682
  }
675
683
  },
676
684
  "foreignKeys": {
@@ -736,10 +744,59 @@
736
744
  "user": {
737
745
  "name": "user",
738
746
  "columns": {
739
- "banExpires": {
740
- "name": "banExpires",
747
+ "id": {
748
+ "name": "id",
749
+ "type": "text",
750
+ "primaryKey": true,
751
+ "notNull": true,
752
+ "autoincrement": false
753
+ },
754
+ "name": {
755
+ "name": "name",
756
+ "type": "text",
757
+ "primaryKey": false,
758
+ "notNull": true,
759
+ "autoincrement": false
760
+ },
761
+ "email": {
762
+ "name": "email",
763
+ "type": "text",
764
+ "primaryKey": false,
765
+ "notNull": true,
766
+ "autoincrement": false
767
+ },
768
+ "emailVerified": {
769
+ "name": "emailVerified",
741
770
  "type": "integer",
742
771
  "primaryKey": false,
772
+ "notNull": true,
773
+ "autoincrement": false
774
+ },
775
+ "image": {
776
+ "name": "image",
777
+ "type": "text",
778
+ "primaryKey": false,
779
+ "notNull": false,
780
+ "autoincrement": false
781
+ },
782
+ "createdAt": {
783
+ "name": "createdAt",
784
+ "type": "integer",
785
+ "primaryKey": false,
786
+ "notNull": true,
787
+ "autoincrement": false
788
+ },
789
+ "updatedAt": {
790
+ "name": "updatedAt",
791
+ "type": "integer",
792
+ "primaryKey": false,
793
+ "notNull": true,
794
+ "autoincrement": false
795
+ },
796
+ "role": {
797
+ "name": "role",
798
+ "type": "text",
799
+ "primaryKey": false,
743
800
  "notNull": false,
744
801
  "autoincrement": false
745
802
  },
@@ -757,36 +814,48 @@
757
814
  "notNull": false,
758
815
  "autoincrement": false
759
816
  },
760
- "createdAt": {
761
- "name": "createdAt",
817
+ "banExpires": {
818
+ "name": "banExpires",
762
819
  "type": "integer",
763
820
  "primaryKey": false,
764
- "notNull": true,
765
- "autoincrement": false,
766
- "default": "(unixepoch())"
821
+ "notNull": false,
822
+ "autoincrement": false
767
823
  },
768
- "displayUsername": {
769
- "name": "displayUsername",
824
+ "username": {
825
+ "name": "username",
770
826
  "type": "text",
771
827
  "primaryKey": false,
772
828
  "notNull": false,
773
829
  "autoincrement": false
774
830
  },
775
- "email": {
776
- "name": "email",
831
+ "displayUsername": {
832
+ "name": "displayUsername",
777
833
  "type": "text",
778
834
  "primaryKey": false,
779
- "notNull": true,
835
+ "notNull": false,
780
836
  "autoincrement": false
837
+ }
838
+ },
839
+ "indexes": {
840
+ "user_email_unique": {
841
+ "name": "user_email_unique",
842
+ "columns": ["email"],
843
+ "isUnique": true
781
844
  },
782
- "emailVerified": {
783
- "name": "emailVerified",
784
- "type": "integer",
785
- "primaryKey": false,
786
- "notNull": true,
787
- "autoincrement": false,
788
- "default": false
789
- },
845
+ "user_username_unique": {
846
+ "name": "user_username_unique",
847
+ "columns": ["username"],
848
+ "isUnique": true
849
+ }
850
+ },
851
+ "foreignKeys": {},
852
+ "compositePrimaryKeys": {},
853
+ "uniqueConstraints": {},
854
+ "checkConstraints": {}
855
+ },
856
+ "verification": {
857
+ "name": "verification",
858
+ "columns": {
790
859
  "id": {
791
860
  "name": "id",
792
861
  "type": "text",
@@ -794,65 +863,46 @@
794
863
  "notNull": true,
795
864
  "autoincrement": false
796
865
  },
797
- "image": {
798
- "name": "image",
866
+ "identifier": {
867
+ "name": "identifier",
799
868
  "type": "text",
800
869
  "primaryKey": false,
801
- "notNull": false,
870
+ "notNull": true,
802
871
  "autoincrement": false
803
872
  },
804
- "name": {
805
- "name": "name",
873
+ "value": {
874
+ "name": "value",
806
875
  "type": "text",
807
876
  "primaryKey": false,
808
877
  "notNull": true,
809
878
  "autoincrement": false
810
879
  },
811
- "password": {
812
- "name": "password",
813
- "type": "text",
880
+ "expiresAt": {
881
+ "name": "expiresAt",
882
+ "type": "integer",
814
883
  "primaryKey": false,
815
- "notNull": false,
884
+ "notNull": true,
816
885
  "autoincrement": false
817
886
  },
818
- "role": {
819
- "name": "role",
820
- "type": "text",
887
+ "createdAt": {
888
+ "name": "createdAt",
889
+ "type": "integer",
821
890
  "primaryKey": false,
822
891
  "notNull": true,
823
- "autoincrement": false,
824
- "default": "'user'"
892
+ "autoincrement": false
825
893
  },
826
894
  "updatedAt": {
827
895
  "name": "updatedAt",
828
896
  "type": "integer",
829
897
  "primaryKey": false,
830
898
  "notNull": true,
831
- "autoincrement": false,
832
- "default": "(unixepoch())"
833
- },
834
- "username": {
835
- "name": "username",
836
- "type": "text",
837
- "primaryKey": false,
838
- "notNull": false,
839
899
  "autoincrement": false
840
900
  }
841
901
  },
842
902
  "indexes": {
843
- "user_email_key": {
844
- "name": "user_email_key",
845
- "columns": ["email"],
846
- "isUnique": true
847
- },
848
- "user_username_key": {
849
- "name": "user_username_key",
850
- "columns": ["username"],
851
- "isUnique": true
852
- },
853
- "user_id_idx": {
854
- "name": "user_id_idx",
855
- "columns": ["id"],
903
+ "verification_identifier_idx": {
904
+ "name": "verification_identifier_idx",
905
+ "columns": ["identifier"],
856
906
  "isUnique": false
857
907
  }
858
908
  },
@@ -15,6 +15,13 @@
15
15
  "when": 1778232300000,
16
16
  "tag": "20260508120500_seed_void_demo",
17
17
  "breakpoints": false
18
+ },
19
+ {
20
+ "idx": 2,
21
+ "version": "6",
22
+ "when": 1789707495097,
23
+ "tag": "20260918045815_legal_dragon_lord",
24
+ "breakpoints": true
18
25
  }
19
26
  ]
20
27
  }
@@ -29,19 +29,19 @@
29
29
  "@nkzw/fate": "latest",
30
30
  "@nkzw/stack": "^2.3.2",
31
31
  "@radix-ui/react-slot": "^1.3.3",
32
- "@void/react": "^0.10.12",
32
+ "@void/react": "^0.20.1",
33
33
  "better-auth": "1.7.2",
34
34
  "class-variance-authority": "^0.7.1",
35
35
  "clsx": "^2.1.1",
36
36
  "drizzle-orm": "^0.45.2",
37
37
  "fbtee": "^5.0.0",
38
38
  "lucide-react": "^1.34.0",
39
- "react": "^19.2.8",
40
- "react-dom": "^19.2.8",
39
+ "react": "^19.3.0",
40
+ "react-dom": "^19.3.0",
41
41
  "react-error-boundary": "^6.1.3",
42
42
  "react-fate": "latest",
43
43
  "tailwind-merge": "^3.6.0",
44
- "void": "^0.10.12",
44
+ "void": "^0.20.1",
45
45
  "void-fate": "latest",
46
46
  "zod": "^4.4.3"
47
47
  },
@@ -54,11 +54,10 @@
54
54
  "@oxc-node/core": "^0.1.0",
55
55
  "@tailwindcss/vite": "^4.3.3",
56
56
  "@types/node": "^26.4.0",
57
- "@types/react": "^19.2.18",
58
- "@types/react-dom": "^19.2.5",
57
+ "@types/react": "^19.3.0",
58
+ "@types/react-dom": "^19.3.0",
59
59
  "@vitejs/plugin-react": "^6.1.0",
60
60
  "oxc-transform-react": "^0.147.0",
61
- "pg": "8.22.0",
62
61
  "tailwindcss": "^4.3.3",
63
62
  "typescript": "^7.0.2",
64
63
  "vite": "catalog:",
@@ -1,27 +0,0 @@
1
- name: test
2
-
3
- on:
4
- push:
5
- branches:
6
- - main
7
- pull_request:
8
- branches:
9
- - main
10
-
11
- jobs:
12
- test:
13
- runs-on: ubuntu-latest
14
- strategy:
15
- matrix:
16
- node-version: [24]
17
- steps:
18
- - uses: actions/checkout@v4
19
- - uses: voidzero-dev/setup-vp@v1
20
- with:
21
- node-version: ${{ matrix.node-version }}
22
- cache: true
23
- run-install: true
24
- - run: |
25
- vp run dev:setup
26
- vp run test:all
27
- vp run build
@@ -1 +0,0 @@
1
- vp staged
@@ -1,12 +0,0 @@
1
- {
2
- "recommendations": [
3
- "dbaeumer.vscode-eslint",
4
- "oxc.oxc-vscode",
5
- "styled-components.vscode-styled-components",
6
- "sysoev.vscode-open-in-github",
7
- "tailwindcss.intellisense",
8
- "TypeScriptTeam.native-preview",
9
- "usernamehw.errorlens",
10
- "wix.vscode-import-cost"
11
- ]
12
- }
@@ -1,25 +0,0 @@
1
- {
2
- "editor.formatOnSave": true,
3
- "files.insertFinalNewline": true,
4
- "files.trimFinalNewlines": true,
5
- "editor.codeActionsOnSave": {
6
- "source.fixAll.eslint": "explicit"
7
- },
8
- "[javascript]": {
9
- "editor.defaultFormatter": "oxc.oxc-vscode"
10
- },
11
- "[typescriptreact]": {
12
- "editor.defaultFormatter": "oxc.oxc-vscode"
13
- },
14
- "[typescript]": {
15
- "editor.defaultFormatter": "oxc.oxc-vscode"
16
- },
17
- "[json]": {
18
- "editor.defaultFormatter": "oxc.oxc-vscode"
19
- },
20
- "typescript.preferences.importModuleSpecifierEnding": "js",
21
- "typescript.reportStyleChecksAsWarnings": false,
22
- "typescript.updateImportsOnFileMove.enabled": "always",
23
- "typescript.preferences.autoImportFileExcludePatterns": ["**/node_modules/vitest"],
24
- "typescript.experimental.useTsgo": true
25
- }
@@ -1,55 +0,0 @@
1
- # Using _fate_ for React applications
2
-
3
- This guidance is for agents working in projects bootstrapped from the fate template. It focuses on the client-side patterns for fate's view composition and action execution.
4
-
5
- ## Core Workflow
6
-
7
- - **Define views with explicit selections:** Define reusable view objects with `view<T>()({...})`, compose them via spreads, and resolve them with `useView`.
8
- - **Resolve data via references:** Avoid passing raw fetched objects; instead pass `ViewRef`s to downstream components to keep selections scoped and cache-aware. Then call `const result = useView(viewDefinition, ref)` to read only the selected fields while subscribing to cache updates. Name the prop after the result data, and rename it using destructuring in the function arguments: `const PostComponent = ({ post: postRef }: { post: ViewRef<'Post'>}) => { const post = useView(PostView, postRef); ... }`.
9
- - **Request data at screen roots:** Use `useRequest` to compose all views required for a route or screen into a single typed request; wrap roots in `Suspense` and an error boundary since requests may suspend or throw.
10
- - **Compose reusable views:** Extract nested selections into their own views (e.g., `UserView`) and compose them inside parent views (`author: UserView`) to avoid duplication and overfetching. This keeps selections DRY and ensures view updates propagate consistently when the cache changes.
11
-
12
- ## Actions & Mutations
13
-
14
- - **Prefer `fate.actions` with `useActionState`:** Trigger mutations through React Actions to integrate with Suspense/`useTransition`, receiving `[result, action, isPending]`. Call actions via the relevant data inputs, for example `action({input: { id: post.id }})`.
15
- - **Optimistic updates by default:** Pass `optimistic` payloads to immediately update the normalized cache; only views selecting the changed fields re-render and failures roll back automatically. Optimistic payloads should match the expected server data changes of the associated object.
16
- - **Select extra fields when side effects matter:** When a mutation affects related entities (e.g., comment count on a post), pass a `view` to the action to fetch the needed fields in the same round-trip and keep the cache coherent for all dependent views.
17
- - **Imperative escape hatch:** Use `fate.mutations` when you must fire mutations outside React components or without waiting on prior actions; handle loading/error states yourself.
18
- - **Handle deletions and resets explicitly:** Use the `delete: true` flag to evict records from the cache, and send the `'reset'` token to clear stale action errors without re-running the mutation.
19
- - **Error handling model:** Treat expected errors (e.g., 404) at the call site via the action result; unexpected errors bubble to the nearest React error boundary.
20
-
21
- ## Common Pitfalls
22
-
23
- - **Use ViewRefs:** Pass references instead of raw data. Keep components focused on views and `ViewRef`s to let fate manage data masking and updates.
24
- - **Co-locate data needs:** Keep view definitions near their components and compose them upward to the request root for predictable fetching.
25
- - **Use Suspense:** Wrap pages in `Suspense`/`ErrorBoundary` instead of ad-hoc loading/error flags; fate aligns with Async React by design.
26
- - **Do not duplicate types:** Keep generated fate types and views imported from the server package. Avoid redefining entity shapes on the client. This ensures view selections stay type-safe end-to-end.
27
- - **`useRequest` only at the root:** When adding routes or layouts, create a dedicated `useRequest` call per screen root that pulls together all child views; do not scatter `useRequest` across leaf components unless it's necessary to issue requests due to user input.
28
- - **React Actions:** Prefer React Action-friendly UI primitives (buttons/forms that accept an `action` prop). If unavailable, wrap action calls with `startTransition` in `onClick` handlers.
29
- - **fate client support** fate's local client support files are maintained by the Vite/fate tooling. Do not manually edit `.fate` files; make the proper schema changes on the server and run `pnpm fate:generate` when working outside Vite dev.
30
- - **Library Versions:** This repository uses the most recent releases of React, fate, Vite, and more. You might not know about the new releases yet, please don't get confused. The versions you see are real, and there are no feature or version mismatches. You can search the internet for more information about them.
31
-
32
- Full documentation can be found on the filesystem at `./client/node_modules/react-fate/README.md` or online at [fate.technology](https://fate.technology/).
33
-
34
- ## Review Checklist for Agents
35
-
36
- - [ ] Every component that reads server data does so through `useView` and receives a `ViewRef` prop.
37
- - [ ] Root components gather data with a single `useRequest` call.
38
- - [ ] Mutations are wired through `useActionState` with optimistic updates and necessary `view` selections; imperative `fate.mutations` are justified when used.
39
- - [ ] Shared selections live in reusable views using regular JavaScript object spreads rather than duplicated field lists.
40
-
41
- <!--VITE PLUS START-->
42
-
43
- # Using Vite+, the Unified Toolchain for the Web
44
-
45
- This project is using Vite+, a unified toolchain built on top of Vite, Rolldown, Vitest, tsdown, Oxlint, Oxfmt, and Vite Task. Vite+ wraps runtime management, package management, and frontend tooling in a single global CLI called `vp`. Vite+ is distinct from Vite, and it invokes Vite through `vp dev` and `vp build`. Run `vp help` to print a list of commands and `vp <command> --help` for information about a specific command.
46
-
47
- Docs are local at `node_modules/vite-plus/docs` or online at https://viteplus.dev/guide/.
48
-
49
- ## Review Checklist
50
-
51
- - [ ] Run `vp install` after pulling remote changes and before getting started.
52
- - [ ] Run `vp check` and `vp test` to format, lint, type check and test changes.
53
- - [ ] Check if there are `vite.config.ts` tasks or `package.json` scripts necessary for validation, run via `vp run <script>`.
54
-
55
- <!--VITE PLUS END-->