@tanstack/cta-engine 0.10.0-alpha.10

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 (272) hide show
  1. package/LICENSE +21 -0
  2. package/dist/add-ons.js +109 -0
  3. package/dist/add.js +125 -0
  4. package/dist/cli.js +119 -0
  5. package/dist/config-file.js +23 -0
  6. package/dist/constants.js +5 -0
  7. package/dist/create-app.js +491 -0
  8. package/dist/custom-add-on.js +253 -0
  9. package/dist/environment.js +119 -0
  10. package/dist/index.js +1 -0
  11. package/dist/mcp.js +213 -0
  12. package/dist/options.js +328 -0
  13. package/dist/package-manager.js +30 -0
  14. package/dist/templates.js +6 -0
  15. package/dist/toolchain.js +6 -0
  16. package/dist/types/add-ons.d.ts +5 -0
  17. package/dist/types/add.d.ts +3 -0
  18. package/dist/types/cli.d.ts +5 -0
  19. package/dist/types/config-file.d.ts +7 -0
  20. package/dist/types/constants.d.ts +6 -0
  21. package/dist/types/create-app.d.ts +7 -0
  22. package/dist/types/custom-add-on.d.ts +3 -0
  23. package/dist/types/environment.d.ts +12 -0
  24. package/dist/types/index.d.ts +1 -0
  25. package/dist/types/mcp.d.ts +1 -0
  26. package/dist/types/options.d.ts +6 -0
  27. package/dist/types/package-manager.d.ts +6 -0
  28. package/dist/types/templates.d.ts +1 -0
  29. package/dist/types/toolchain.d.ts +3 -0
  30. package/dist/types/types.d.ts +107 -0
  31. package/dist/types/utils.d.ts +1 -0
  32. package/dist/types.js +1 -0
  33. package/dist/utils.js +8 -0
  34. package/package.json +49 -0
  35. package/src/add-ons.ts +145 -0
  36. package/src/add.ts +186 -0
  37. package/src/cli.ts +181 -0
  38. package/src/config-file.ts +45 -0
  39. package/src/constants.ts +9 -0
  40. package/src/create-app.ts +793 -0
  41. package/src/custom-add-on.ts +326 -0
  42. package/src/environment.ts +144 -0
  43. package/src/index.ts +1 -0
  44. package/src/mcp.ts +254 -0
  45. package/src/options.ts +392 -0
  46. package/src/package-manager.ts +46 -0
  47. package/src/templates.ts +7 -0
  48. package/src/toolchain.ts +7 -0
  49. package/src/types.ts +119 -0
  50. package/src/utils.ts +10 -0
  51. package/templates/react/add-on/clerk/README.md +3 -0
  52. package/templates/react/add-on/clerk/assets/_dot_env.local.append +2 -0
  53. package/templates/react/add-on/clerk/assets/src/integrations/clerk/header-user.tsx +19 -0
  54. package/templates/react/add-on/clerk/assets/src/integrations/clerk/provider.tsx +18 -0
  55. package/templates/react/add-on/clerk/assets/src/routes/demo.clerk.tsx +20 -0
  56. package/templates/react/add-on/clerk/info.json +13 -0
  57. package/templates/react/add-on/clerk/package.json +5 -0
  58. package/templates/react/add-on/convex/README.md +4 -0
  59. package/templates/react/add-on/convex/assets/_dot_cursorrules.append +93 -0
  60. package/templates/react/add-on/convex/assets/_dot_env.local.append +3 -0
  61. package/templates/react/add-on/convex/assets/convex/products.ts +8 -0
  62. package/templates/react/add-on/convex/assets/convex/schema.ts +10 -0
  63. package/templates/react/add-on/convex/assets/src/integrations/convex/provider.tsx +20 -0
  64. package/templates/react/add-on/convex/assets/src/routes/demo.convex.tsx +33 -0
  65. package/templates/react/add-on/convex/info.json +13 -0
  66. package/templates/react/add-on/convex/package.json +6 -0
  67. package/templates/react/add-on/form/assets/src/components/demo.FormComponents.tsx.ejs +300 -0
  68. package/templates/react/add-on/form/assets/src/hooks/demo.form-context.ts +4 -0
  69. package/templates/react/add-on/form/assets/src/hooks/demo.form.ts +22 -0
  70. package/templates/react/add-on/form/assets/src/routes/demo.form.address.tsx.ejs +213 -0
  71. package/templates/react/add-on/form/assets/src/routes/demo.form.simple.tsx.ejs +77 -0
  72. package/templates/react/add-on/form/info.json +26 -0
  73. package/templates/react/add-on/form/package.json +6 -0
  74. package/templates/react/add-on/module-federation/assets/module-federation.config.js.ejs +31 -0
  75. package/templates/react/add-on/module-federation/assets/src/demo-mf-component.tsx +3 -0
  76. package/templates/react/add-on/module-federation/assets/src/demo-mf-self-contained.tsx +11 -0
  77. package/templates/react/add-on/module-federation/info.json +7 -0
  78. package/templates/react/add-on/module-federation/package.json +5 -0
  79. package/templates/react/add-on/netlify/README.md +11 -0
  80. package/templates/react/add-on/netlify/info.json +7 -0
  81. package/templates/react/add-on/sentry/assets/_dot_cursorrules.append +22 -0
  82. package/templates/react/add-on/sentry/assets/_dot_env.local.append +2 -0
  83. package/templates/react/add-on/sentry/assets/src/app/global-middleware.ts +25 -0
  84. package/templates/react/add-on/sentry/assets/src/routes/demo.sentry.testing.tsx +480 -0
  85. package/templates/react/add-on/sentry/info.json +14 -0
  86. package/templates/react/add-on/sentry/package.json +7 -0
  87. package/templates/react/add-on/shadcn/README.md +7 -0
  88. package/templates/react/add-on/shadcn/assets/_dot_cursorrules.append +7 -0
  89. package/templates/react/add-on/shadcn/assets/components.json +21 -0
  90. package/templates/react/add-on/shadcn/assets/src/lib/utils.ts +6 -0
  91. package/templates/react/add-on/shadcn/assets/src/styles.css +138 -0
  92. package/templates/react/add-on/shadcn/info.json +7 -0
  93. package/templates/react/add-on/shadcn/package.json +9 -0
  94. package/templates/react/add-on/start/assets/_dot_gitignore.append +2 -0
  95. package/templates/react/add-on/start/assets/app.config.ts.ejs +19 -0
  96. package/templates/react/add-on/start/assets/src/api.ts +6 -0
  97. package/templates/react/add-on/start/assets/src/client.tsx +8 -0
  98. package/templates/react/add-on/start/assets/src/router.tsx.ejs +77 -0
  99. package/templates/react/add-on/start/assets/src/routes/api.demo-names.ts +11 -0
  100. package/templates/react/add-on/start/assets/src/routes/demo.start.api-request.tsx.ejs +33 -0
  101. package/templates/react/add-on/start/assets/src/routes/demo.start.server-funcs.tsx +50 -0
  102. package/templates/react/add-on/start/assets/src/ssr.tsx +12 -0
  103. package/templates/react/add-on/start/info.json +18 -0
  104. package/templates/react/add-on/start/package.json +13 -0
  105. package/templates/react/add-on/store/assets/src/lib/demo-store.ts +13 -0
  106. package/templates/react/add-on/store/assets/src/routes/demo.store.tsx.ejs +75 -0
  107. package/templates/react/add-on/store/info.json +13 -0
  108. package/templates/react/add-on/store/package.json +6 -0
  109. package/templates/react/add-on/tRPC/assets/src/integrations/trpc/init.ts +9 -0
  110. package/templates/react/add-on/tRPC/assets/src/integrations/trpc/react.ts +4 -0
  111. package/templates/react/add-on/tRPC/assets/src/integrations/trpc/router.ts +18 -0
  112. package/templates/react/add-on/tRPC/assets/src/routes/api.trpc.$.tsx +16 -0
  113. package/templates/react/add-on/tRPC/info.json +9 -0
  114. package/templates/react/add-on/tRPC/package.json +9 -0
  115. package/templates/react/add-on/table/assets/src/data/demo-table-data.ts +50 -0
  116. package/templates/react/add-on/table/assets/src/routes/demo.table.tsx.ejs +373 -0
  117. package/templates/react/add-on/table/info.json +13 -0
  118. package/templates/react/add-on/table/package.json +7 -0
  119. package/templates/react/add-on/tanstack-query/assets/src/integrations/tanstack-query/layout.tsx +5 -0
  120. package/templates/react/add-on/tanstack-query/assets/src/integrations/tanstack-query/root-provider.tsx.ejs +70 -0
  121. package/templates/react/add-on/tanstack-query/assets/src/routes/demo.tanstack-query.tsx.ejs +53 -0
  122. package/templates/react/add-on/tanstack-query/info.json +13 -0
  123. package/templates/react/add-on/tanstack-query/package.json +6 -0
  124. package/templates/react/base/README.md.ejs +558 -0
  125. package/templates/react/base/_dot_gitignore +5 -0
  126. package/templates/react/base/_dot_vscode/settings.biome.json +38 -0
  127. package/templates/react/base/_dot_vscode/settings.json +11 -0
  128. package/templates/react/base/index.html.ejs +20 -0
  129. package/templates/react/base/package.biome.json +10 -0
  130. package/templates/react/base/package.eslintprettier.json +11 -0
  131. package/templates/react/base/package.json +29 -0
  132. package/templates/react/base/package.ts.json +7 -0
  133. package/templates/react/base/package.tw.json +6 -0
  134. package/templates/react/base/public/favicon.ico +0 -0
  135. package/templates/react/base/public/logo192.png +0 -0
  136. package/templates/react/base/public/logo512.png +0 -0
  137. package/templates/react/base/public/manifest.json +25 -0
  138. package/templates/react/base/public/robots.txt +3 -0
  139. package/templates/react/base/src/App.css +38 -0
  140. package/templates/react/base/src/App.test.tsx.ejs +10 -0
  141. package/templates/react/base/src/App.tsx.ejs +74 -0
  142. package/templates/react/base/src/components/Header.tsx.ejs +27 -0
  143. package/templates/react/base/src/logo.svg +44 -0
  144. package/templates/react/base/src/reportWebVitals.ts.ejs +28 -0
  145. package/templates/react/base/src/styles.css.ejs +15 -0
  146. package/templates/react/base/toolchain/.prettierignore +3 -0
  147. package/templates/react/base/toolchain/biome.json +31 -0
  148. package/templates/react/base/toolchain/eslint.config.js +5 -0
  149. package/templates/react/base/toolchain/prettier.config.js +10 -0
  150. package/templates/react/base/tsconfig.json.ejs +29 -0
  151. package/templates/react/base/vite.config.js.ejs +23 -0
  152. package/templates/react/code-router/src/main.tsx.ejs +92 -0
  153. package/templates/react/example/tanchat/README.md +37 -0
  154. package/templates/react/example/tanchat/assets/_dot_env.local.append +2 -0
  155. package/templates/react/example/tanchat/assets/public/example-guitar-flowers.jpg +0 -0
  156. package/templates/react/example/tanchat/assets/public/example-guitar-motherboard.jpg +0 -0
  157. package/templates/react/example/tanchat/assets/public/example-guitar-racing.jpg +0 -0
  158. package/templates/react/example/tanchat/assets/public/example-guitar-steamer-trunk.jpg +0 -0
  159. package/templates/react/example/tanchat/assets/public/example-guitar-superhero.jpg +0 -0
  160. package/templates/react/example/tanchat/assets/public/example-guitar-traveling.jpg +0 -0
  161. package/templates/react/example/tanchat/assets/public/example-guitar-video-games.jpg +0 -0
  162. package/templates/react/example/tanchat/assets/src/components/example-AIAssistant.tsx +173 -0
  163. package/templates/react/example/tanchat/assets/src/components/example-GuitarRecommendation.tsx +47 -0
  164. package/templates/react/example/tanchat/assets/src/data/example-guitars.ts +83 -0
  165. package/templates/react/example/tanchat/assets/src/demo.index.css +220 -0
  166. package/templates/react/example/tanchat/assets/src/integrations/tanchat/header-user.tsx +5 -0
  167. package/templates/react/example/tanchat/assets/src/routes/example.chat.tsx +159 -0
  168. package/templates/react/example/tanchat/assets/src/routes/example.guitars/$guitarId.tsx +50 -0
  169. package/templates/react/example/tanchat/assets/src/routes/example.guitars/index.tsx +54 -0
  170. package/templates/react/example/tanchat/assets/src/store/example-assistant.ts +3 -0
  171. package/templates/react/example/tanchat/assets/src/utils/demo.ai.ts +62 -0
  172. package/templates/react/example/tanchat/assets/src/utils/demo.tools.ts +47 -0
  173. package/templates/react/example/tanchat/info.json +19 -0
  174. package/templates/react/example/tanchat/package.json +15 -0
  175. package/templates/react/file-router/package.fr.json +5 -0
  176. package/templates/react/file-router/src/main.tsx.ejs +55 -0
  177. package/templates/react/file-router/src/routes/__root.tsx.ejs +82 -0
  178. package/templates/solid/add-on/form/assets/src/routes/demo.form.tsx.ejs +352 -0
  179. package/templates/solid/add-on/form/info.json +13 -0
  180. package/templates/solid/add-on/form/package.json +5 -0
  181. package/templates/solid/add-on/module-federation/assets/module-federation.config.js.ejs +27 -0
  182. package/templates/solid/add-on/module-federation/assets/src/demo-mf-component.tsx +3 -0
  183. package/templates/solid/add-on/module-federation/assets/src/demo-mf-self-contained.tsx +9 -0
  184. package/templates/solid/add-on/module-federation/info.json +7 -0
  185. package/templates/solid/add-on/module-federation/package.json +5 -0
  186. package/templates/solid/add-on/sentry/assets/_dot_cursorrules.append +22 -0
  187. package/templates/solid/add-on/sentry/assets/_dot_env.local.append +2 -0
  188. package/templates/solid/add-on/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +20 -0
  189. package/templates/solid/add-on/sentry/info.json +13 -0
  190. package/templates/solid/add-on/sentry/package.json +5 -0
  191. package/templates/solid/add-on/solid-ui/README.md +9 -0
  192. package/templates/solid/add-on/solid-ui/assets/src/lib/utils.ts +6 -0
  193. package/templates/solid/add-on/solid-ui/assets/src/styles.css +138 -0
  194. package/templates/solid/add-on/solid-ui/assets/ui.config.json +13 -0
  195. package/templates/solid/add-on/solid-ui/info.json +11 -0
  196. package/templates/solid/add-on/solid-ui/package.json +9 -0
  197. package/templates/solid/add-on/start/assets/app.config.ts +16 -0
  198. package/templates/solid/add-on/start/assets/src/api.ts +6 -0
  199. package/templates/solid/add-on/start/assets/src/client.tsx +7 -0
  200. package/templates/solid/add-on/start/assets/src/router.tsx.ejs +24 -0
  201. package/templates/solid/add-on/start/assets/src/routes/demo.start.server-funcs.tsx +49 -0
  202. package/templates/solid/add-on/start/assets/src/ssr.tsx +12 -0
  203. package/templates/solid/add-on/start/info.json +14 -0
  204. package/templates/solid/add-on/start/package.json +12 -0
  205. package/templates/solid/add-on/store/assets/src/lib/demo-store.ts +13 -0
  206. package/templates/solid/add-on/store/assets/src/routes/demo.store.tsx.ejs +77 -0
  207. package/templates/solid/add-on/store/info.json +13 -0
  208. package/templates/solid/add-on/store/package.json +6 -0
  209. package/templates/solid/add-on/tanstack-query/assets/src/integrations/tanstack-query/header-user.tsx +5 -0
  210. package/templates/solid/add-on/tanstack-query/assets/src/integrations/tanstack-query/provider.tsx +15 -0
  211. package/templates/solid/add-on/tanstack-query/assets/src/routes/demo.tanstack-query.tsx +30 -0
  212. package/templates/solid/add-on/tanstack-query/info.json +13 -0
  213. package/templates/solid/add-on/tanstack-query/package.json +6 -0
  214. package/templates/solid/base/README.md.ejs +215 -0
  215. package/templates/solid/base/_dot_cursorrules.append +35 -0
  216. package/templates/solid/base/_dot_gitignore +5 -0
  217. package/templates/solid/base/_dot_vscode/settings.biome.json +38 -0
  218. package/templates/solid/base/_dot_vscode/settings.json +11 -0
  219. package/templates/solid/base/index.html.ejs +20 -0
  220. package/templates/solid/base/package.biome.json +10 -0
  221. package/templates/solid/base/package.eslintprettier.json +11 -0
  222. package/templates/solid/base/package.json +22 -0
  223. package/templates/solid/base/package.ts.json +5 -0
  224. package/templates/solid/base/package.tw.json +6 -0
  225. package/templates/solid/base/public/favicon.ico +0 -0
  226. package/templates/solid/base/public/logo192.png +0 -0
  227. package/templates/solid/base/public/logo512.png +0 -0
  228. package/templates/solid/base/public/manifest.json +25 -0
  229. package/templates/solid/base/public/robots.txt +3 -0
  230. package/templates/solid/base/src/App.css +0 -0
  231. package/templates/solid/base/src/App.tsx.ejs +47 -0
  232. package/templates/solid/base/src/components/Header.tsx.ejs +26 -0
  233. package/templates/solid/base/src/logo.svg +120 -0
  234. package/templates/solid/base/src/styles.css.ejs +15 -0
  235. package/templates/solid/base/toolchain/.prettierignore +3 -0
  236. package/templates/solid/base/toolchain/biome.json +31 -0
  237. package/templates/solid/base/toolchain/eslint.config.js +5 -0
  238. package/templates/solid/base/toolchain/prettier.config.js +10 -0
  239. package/templates/solid/base/tsconfig.json.ejs +31 -0
  240. package/templates/solid/base/vite.config.js.ejs +22 -0
  241. package/templates/solid/code-router/src/main.tsx.ejs +71 -0
  242. package/templates/solid/example/tanchat/README.md +52 -0
  243. package/templates/solid/example/tanchat/assets/ai-streaming-server/README.md +110 -0
  244. package/templates/solid/example/tanchat/assets/ai-streaming-server/_dot_env.example +1 -0
  245. package/templates/solid/example/tanchat/assets/ai-streaming-server/package.json +26 -0
  246. package/templates/solid/example/tanchat/assets/ai-streaming-server/src/index.ts +102 -0
  247. package/templates/solid/example/tanchat/assets/ai-streaming-server/tsconfig.json +15 -0
  248. package/templates/solid/example/tanchat/assets/src/components/demo.SettingsDialog.tsx +149 -0
  249. package/templates/solid/example/tanchat/assets/src/demo.index.css +227 -0
  250. package/templates/solid/example/tanchat/assets/src/lib/demo-store.ts +13 -0
  251. package/templates/solid/example/tanchat/assets/src/routes/example.chat.tsx +435 -0
  252. package/templates/solid/example/tanchat/assets/src/store/demo.hooks.ts +17 -0
  253. package/templates/solid/example/tanchat/assets/src/store/demo.store.ts +133 -0
  254. package/templates/solid/example/tanchat/info.json +14 -0
  255. package/templates/solid/example/tanchat/package.json +7 -0
  256. package/templates/solid/file-router/package.fr.json +5 -0
  257. package/templates/solid/file-router/src/main.tsx.ejs +47 -0
  258. package/templates/solid/file-router/src/routes/__root.tsx.ejs +41 -0
  259. package/templates/solid/file-router/src/routes/index.tsx +43 -0
  260. package/tests/cra.test.ts +293 -0
  261. package/tests/snapshots/cra/cr-js-npm.json +33 -0
  262. package/tests/snapshots/cra/cr-ts-npm.json +34 -0
  263. package/tests/snapshots/cra/cr-ts-start-npm.json +38 -0
  264. package/tests/snapshots/cra/fr-ts-npm.json +34 -0
  265. package/tests/snapshots/cra/fr-ts-tw-npm.json +33 -0
  266. package/tests/snapshots/cra/solid-cr-js-npm.json +31 -0
  267. package/tests/snapshots/cra/solid-cr-ts-npm.json +32 -0
  268. package/tests/snapshots/cra/solid-cr-ts-start-npm.json +36 -0
  269. package/tests/snapshots/cra/solid-fr-ts-npm.json +33 -0
  270. package/tests/snapshots/cra/solid-fr-ts-tw-npm.json +32 -0
  271. package/tests/test-utilities.ts +87 -0
  272. package/tsconfig.json +17 -0
package/src/types.ts ADDED
@@ -0,0 +1,119 @@
1
+ import type { CODE_ROUTER, FILE_ROUTER } from './constants.js'
2
+ import type { PackageManager } from './package-manager.js'
3
+ import type { ToolChain } from './toolchain.js'
4
+
5
+ export type Framework = 'solid' | 'react'
6
+
7
+ export interface Options {
8
+ framework: Framework
9
+ projectName: string
10
+ typescript: boolean
11
+ tailwind: boolean
12
+ packageManager: PackageManager
13
+ toolchain: ToolChain
14
+ mode: typeof CODE_ROUTER | typeof FILE_ROUTER
15
+ addOns: boolean
16
+ chosenAddOns: Array<AddOn>
17
+ git: boolean
18
+ variableValues: Record<string, string | number | boolean>
19
+ overlay?: AddOn | undefined
20
+ }
21
+
22
+ export interface CliOptions {
23
+ template?: 'typescript' | 'javascript' | 'file-router'
24
+ framework?: Framework
25
+ tailwind?: boolean
26
+ packageManager?: PackageManager
27
+ toolchain?: ToolChain
28
+ projectName?: string
29
+ git?: boolean
30
+ addOns?: Array<string> | boolean
31
+ listAddOns?: boolean
32
+ mcp?: boolean
33
+ mcpSse?: boolean
34
+ overlay?: string
35
+ targetDir?: string
36
+ }
37
+
38
+ export type Environment = {
39
+ startRun: () => void
40
+ finishRun: () => void
41
+ getErrors: () => Array<string>
42
+
43
+ appendFile: (path: string, contents: string) => Promise<void>
44
+ copyFile: (from: string, to: string) => Promise<void>
45
+ writeFile: (path: string, contents: string) => Promise<void>
46
+ execute: (command: string, args: Array<string>, cwd: string) => Promise<void>
47
+ deleteFile: (path: string) => Promise<void>
48
+
49
+ readFile: (path: string, encoding?: BufferEncoding) => Promise<string>
50
+ exists: (path: string) => boolean
51
+ readdir: (path: string) => Array<string>
52
+ isDirectory: (path: string) => boolean
53
+ }
54
+
55
+ type BooleanVariable = {
56
+ name: string
57
+ default: boolean
58
+ description: string
59
+ type: 'boolean'
60
+ }
61
+
62
+ type NumberVariable = {
63
+ name: string
64
+ default: number
65
+ description: string
66
+ type: 'number'
67
+ }
68
+
69
+ type StringVariable = {
70
+ name: string
71
+ default: string
72
+ description: string
73
+ type: 'string'
74
+ }
75
+
76
+ export type Variable = BooleanVariable | NumberVariable | StringVariable
77
+
78
+ export type AddOn = {
79
+ id: string
80
+ name: string
81
+ description: string
82
+ type: 'add-on' | 'example' | 'overlay'
83
+ link: string
84
+ templates: Array<string>
85
+ routes: Array<{
86
+ url: string
87
+ name: string
88
+ }>
89
+ packageAdditions: {
90
+ dependencies?: Record<string, string>
91
+ devDependencies?: Record<string, string>
92
+ scripts?: Record<string, string>
93
+ }
94
+ command?: {
95
+ command: string
96
+ args?: Array<string>
97
+ }
98
+ readme?: string
99
+ phase: 'setup' | 'add-on'
100
+ shadcnComponents?: Array<string>
101
+ warning?: string
102
+ dependsOn?: Array<string>
103
+ variables?: Array<Variable>
104
+
105
+ files?: Record<string, string>
106
+ deletedFiles?: Array<string>
107
+ }
108
+
109
+ export type Overlay = AddOn & {
110
+ type: 'overlay'
111
+ version: string
112
+ author: string
113
+ link: string
114
+ license: string
115
+ mode: typeof CODE_ROUTER | typeof FILE_ROUTER
116
+ framework: Framework
117
+ typescript: boolean
118
+ tailwind: boolean
119
+ }
package/src/utils.ts ADDED
@@ -0,0 +1,10 @@
1
+ export function sortObject(
2
+ obj: Record<string, string>,
3
+ ): Record<string, string> {
4
+ return Object.keys(obj)
5
+ .sort()
6
+ .reduce<Record<string, string>>((acc, key) => {
7
+ acc[key] = obj[key]
8
+ return acc
9
+ }, {})
10
+ }
@@ -0,0 +1,3 @@
1
+ ## Setting up Clerk
2
+
3
+ - Set the `VITE_CLERK_PUBLISHABLE_KEY` in your `.env.local`.
@@ -0,0 +1,2 @@
1
+ # Clerk configuration, get this key from your [Dashboard](https://clerk.com/dashboard).
2
+ VITE_CLERK_PUBLISHABLE_KEY=
@@ -0,0 +1,19 @@
1
+ import {
2
+ SignedIn,
3
+ SignInButton,
4
+ SignedOut,
5
+ UserButton,
6
+ } from '@clerk/clerk-react'
7
+
8
+ export default function HeaderUser() {
9
+ return (
10
+ <>
11
+ <SignedIn>
12
+ <UserButton />
13
+ </SignedIn>
14
+ <SignedOut>
15
+ <SignInButton />
16
+ </SignedOut>
17
+ </>
18
+ )
19
+ }
@@ -0,0 +1,18 @@
1
+ import { ClerkProvider } from '@clerk/clerk-react'
2
+
3
+ const PUBLISHABLE_KEY = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY
4
+ if (!PUBLISHABLE_KEY) {
5
+ throw new Error('Add your Clerk Publishable Key to the .env.local file')
6
+ }
7
+
8
+ export default function AppClerkProvider({
9
+ children,
10
+ }: {
11
+ children: React.ReactNode
12
+ }) {
13
+ return (
14
+ <ClerkProvider publishableKey={PUBLISHABLE_KEY} afterSignOutUrl="/">
15
+ {children}
16
+ </ClerkProvider>
17
+ )
18
+ }
@@ -0,0 +1,20 @@
1
+ import { createFileRoute } from '@tanstack/react-router'
2
+ import { useUser } from '@clerk/clerk-react'
3
+
4
+ export const Route = createFileRoute('/demo/clerk')({
5
+ component: App,
6
+ })
7
+
8
+ function App() {
9
+ const { isSignedIn, user, isLoaded } = useUser()
10
+
11
+ if (!isLoaded) {
12
+ return <div className="p-4">Loading...</div>
13
+ }
14
+
15
+ if (!isSignedIn) {
16
+ return <div className="p-4">Sign in to view this page</div>
17
+ }
18
+
19
+ return <div className="p-4">Hello {user.firstName}!</div>
20
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "Clerk",
3
+ "description": "Add Clerk authentication to your application.",
4
+ "phase": "add-on",
5
+ "templates": ["file-router"],
6
+ "link": "https://clerk.com",
7
+ "routes": [
8
+ {
9
+ "url": "/demo/clerk",
10
+ "name": "Clerk"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,5 @@
1
+ {
2
+ "dependencies": {
3
+ "@clerk/clerk-react": "^5.22.13"
4
+ }
5
+ }
@@ -0,0 +1,4 @@
1
+ ## Setting up Convex
2
+
3
+ - Set the `VITE_CONVEX_URL` and `CONVEX_DEPLOYMENT` environment variables in your `.env.local`. (Or run `npx convex init` to set them automatically.)
4
+ - Run `npx convex dev` to start the Convex server.
@@ -0,0 +1,93 @@
1
+ This document serves as some special instructions when working with Convex.
2
+
3
+ # Schemas
4
+
5
+ When designing the schema please see this page on built in System fields and data types available: https://docs.convex.dev/database/types
6
+
7
+ Here are some specifics that are often mishandled:
8
+
9
+ ## v (https://docs.convex.dev/api/modules/values#v)
10
+
11
+ The validator builder.
12
+
13
+ This builder allows you to build validators for Convex values.
14
+
15
+ Validators can be used in schema definitions and as input validators for Convex functions.
16
+
17
+ Type declaration
18
+ Name Type
19
+ id <TableName>(tableName: TableName) => VId<GenericId<TableName>, "required">
20
+ null () => VNull<null, "required">
21
+ number () => VFloat64<number, "required">
22
+ float64 () => VFloat64<number, "required">
23
+ bigint () => VInt64<bigint, "required">
24
+ int64 () => VInt64<bigint, "required">
25
+ boolean () => VBoolean<boolean, "required">
26
+ string () => VString<string, "required">
27
+ bytes () => VBytes<ArrayBuffer, "required">
28
+ literal <T>(literal: T) => VLiteral<T, "required">
29
+ array <T>(element: T) => VArray<T["type"][], T, "required">
30
+ object <T>(fields: T) => VObject<Expand<{ [Property in string | number | symbol]?: Exclude<Infer<T[Property]>, undefined> } & { [Property in string | number | symbol]: Infer<T[Property]> }>, T, "required", { [Property in string | number | symbol]: Property | `${Property & string}.${T[Property]["fieldPaths"]}` }[keyof T] & string>
31
+ record <Key, Value>(keys: Key, values: Value) => VRecord<Record<Infer<Key>, Value["type"]>, Key, Value, "required", string>
32
+ union <T>(...members: T) => VUnion<T[number]["type"], T, "required", T[number]["fieldPaths"]>
33
+ any () => VAny<any, "required", string>
34
+ optional <T>(value: T) => VOptional<T>
35
+
36
+ ## System fields (https://docs.convex.dev/database/types#system-fields)
37
+
38
+ Every document in Convex has two automatically-generated system fields:
39
+
40
+ _id: The document ID of the document.
41
+ _creationTime: The time this document was created, in milliseconds since the Unix epoch.
42
+
43
+ You do not need to add indices as these are added automatically.
44
+
45
+ ## Example Schema
46
+
47
+ This is an example of a well crafted schema.
48
+
49
+ ```ts
50
+ import { defineSchema, defineTable } from "convex/server";
51
+ import { v } from "convex/values";
52
+
53
+ export default defineSchema(
54
+ {
55
+ users: defineTable({
56
+ name: v.string(),
57
+ }),
58
+
59
+ sessions: defineTable({
60
+ userId: v.id("users"),
61
+ sessionId: v.string(),
62
+ }).index("sessionId", ["sessionId"]),
63
+
64
+ threads: defineTable({
65
+ uuid: v.string(),
66
+ summary: v.optional(v.string()),
67
+ summarizer: v.optional(v.id("_scheduled_functions")),
68
+ }).index("uuid", ["uuid"]),
69
+
70
+ messages: defineTable({
71
+ message: v.string(),
72
+ threadId: v.id("threads"),
73
+ author: v.union(
74
+ v.object({
75
+ role: v.literal("system"),
76
+ }),
77
+ v.object({
78
+ role: v.literal("assistant"),
79
+ context: v.array(v.id("messages")),
80
+ model: v.optional(v.string()),
81
+ }),
82
+ v.object({
83
+ role: v.literal("user"),
84
+ userId: v.id("users"),
85
+ }),
86
+ ),
87
+ })
88
+ .index("threadId", ["threadId"]),
89
+ },
90
+ );
91
+ ```
92
+
93
+ Sourced from: https://github.com/PatrickJS/awesome-cursorrules/blob/main/rules/convex-cursorrules-prompt-file/.cursorrules
@@ -0,0 +1,3 @@
1
+ # Convex configuration, get this URL from your [Dashboard](https://convex.dev/dashboard).
2
+ CONVEX_DEPLOYMENT=
3
+ VITE_CONVEX_URL=
@@ -0,0 +1,8 @@
1
+ import { query } from "./_generated/server";
2
+
3
+ export const get = query({
4
+ args: {},
5
+ handler: async (ctx) => {
6
+ return await ctx.db.query("products").collect();
7
+ },
8
+ });
@@ -0,0 +1,10 @@
1
+ import { defineSchema, defineTable } from "convex/server";
2
+ import { v } from "convex/values";
3
+
4
+ export default defineSchema({
5
+ products: defineTable({
6
+ title: v.string(),
7
+ imageId: v.string(),
8
+ price: v.number(),
9
+ }),
10
+ });
@@ -0,0 +1,20 @@
1
+ import { ConvexProvider } from 'convex/react'
2
+ import { ConvexQueryClient } from '@convex-dev/react-query'
3
+
4
+ const CONVEX_URL = (import.meta as any).env.VITE_CONVEX_URL
5
+ if (!CONVEX_URL) {
6
+ console.error('missing envar CONVEX_URL')
7
+ }
8
+ const convexQueryClient = new ConvexQueryClient(CONVEX_URL)
9
+
10
+ export default function AppConvexProvider({
11
+ children,
12
+ }: {
13
+ children: React.ReactNode
14
+ }) {
15
+ return (
16
+ <ConvexProvider client={convexQueryClient.convexClient}>
17
+ {children}
18
+ </ConvexProvider>
19
+ )
20
+ }
@@ -0,0 +1,33 @@
1
+ import { Suspense } from 'react'
2
+ import { createFileRoute } from '@tanstack/react-router'
3
+ import { useQuery } from 'convex/react'
4
+
5
+ import { api } from '../../convex/_generated/api'
6
+
7
+ export const Route = createFileRoute('/demo/convex')({
8
+ component: App,
9
+ })
10
+
11
+ function Products() {
12
+ const products = useQuery(api.products.get)
13
+
14
+ return (
15
+ <ul>
16
+ {(products || []).map((p) => (
17
+ <li key={p._id}>
18
+ {p.title} - {p.price}
19
+ </li>
20
+ ))}
21
+ </ul>
22
+ )
23
+ }
24
+
25
+ function App() {
26
+ return (
27
+ <div className="p-4">
28
+ <Suspense fallback={<div>Loading...</div>}>
29
+ <Products />
30
+ </Suspense>
31
+ </div>
32
+ )
33
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "name": "Convex",
3
+ "description": "Add the Convex database to your application.",
4
+ "link": "https://convex.dev",
5
+ "phase": "add-on",
6
+ "templates": ["file-router"],
7
+ "routes": [
8
+ {
9
+ "url": "/demo/convex",
10
+ "name": "Convex"
11
+ }
12
+ ]
13
+ }
@@ -0,0 +1,6 @@
1
+ {
2
+ "dependencies": {
3
+ "@convex-dev/react-query": "0.0.0-alpha.8",
4
+ "convex": "^1.19.2"
5
+ }
6
+ }