@tanstack/cta-engine 0.10.0-alpha.21 → 0.10.0-alpha.25

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 (340) hide show
  1. package/dist/add-ons.js +91 -5
  2. package/dist/add.js +125 -0
  3. package/dist/cli.js +132 -0
  4. package/dist/config-file.js +9 -14
  5. package/dist/constants.js +2 -0
  6. package/dist/create-app.js +451 -142
  7. package/dist/custom-add-on.js +254 -0
  8. package/dist/environment.js +32 -64
  9. package/dist/file-helper.js +18 -0
  10. package/dist/index.js +1 -17
  11. package/dist/mcp.js +229 -0
  12. package/dist/options.js +333 -9
  13. package/dist/package-manager.js +6 -51
  14. package/dist/templates.js +6 -0
  15. package/dist/toolchain.js +6 -0
  16. package/dist/types/add-ons.d.ts +8 -3
  17. package/dist/types/add.d.ts +3 -0
  18. package/dist/types/cli.d.ts +7 -0
  19. package/dist/types/config-file.d.ts +4 -6
  20. package/dist/types/constants.d.ts +3 -0
  21. package/dist/types/create-app.d.ts +7 -1
  22. package/dist/types/custom-add-on.d.ts +3 -0
  23. package/dist/types/environment.d.ts +1 -2
  24. package/dist/types/file-helper.d.ts +2 -0
  25. package/dist/types/index.d.ts +1 -20
  26. package/dist/types/mcp.d.ts +7 -0
  27. package/dist/types/options.d.ts +6 -2
  28. package/dist/types/package-manager.d.ts +1 -18
  29. package/dist/types/templates.d.ts +1 -0
  30. package/dist/types/toolchain.d.ts +3 -0
  31. package/dist/types/types.d.ts +85 -788
  32. package/dist/types/utils.d.ts +0 -5
  33. package/dist/types.js +1 -65
  34. package/dist/utils.js +0 -9
  35. package/package.json +12 -9
  36. package/src/add-ons.ts +123 -7
  37. package/src/add.ts +186 -0
  38. package/src/cli.ts +210 -0
  39. package/src/config-file.ts +17 -26
  40. package/src/constants.ts +5 -0
  41. package/src/create-app.ts +730 -180
  42. package/src/custom-add-on.ts +325 -0
  43. package/src/environment.ts +33 -77
  44. package/src/file-helper.ts +20 -0
  45. package/src/index.ts +1 -77
  46. package/src/mcp.ts +302 -0
  47. package/src/options.ts +409 -8
  48. package/src/package-manager.ts +9 -80
  49. package/src/templates.ts +7 -0
  50. package/src/toolchain.ts +7 -0
  51. package/src/types.ts +87 -175
  52. package/src/utils.ts +0 -17
  53. package/templates/react/add-on/clerk/README.md +3 -0
  54. package/templates/react/add-on/clerk/assets/_dot_env.local.append +2 -0
  55. package/templates/react/add-on/clerk/assets/src/integrations/clerk/header-user.tsx +19 -0
  56. package/templates/react/add-on/clerk/assets/src/integrations/clerk/provider.tsx +18 -0
  57. package/templates/react/add-on/clerk/assets/src/routes/demo.clerk.tsx +20 -0
  58. package/templates/react/add-on/clerk/info.json +13 -0
  59. package/templates/react/add-on/clerk/package.json +5 -0
  60. package/templates/react/add-on/convex/README.md +4 -0
  61. package/templates/react/add-on/convex/assets/_dot_cursorrules.append +93 -0
  62. package/templates/react/add-on/convex/assets/_dot_env.local.append +3 -0
  63. package/templates/react/add-on/convex/assets/convex/products.ts +8 -0
  64. package/templates/react/add-on/convex/assets/convex/schema.ts +10 -0
  65. package/templates/react/add-on/convex/assets/src/integrations/convex/provider.tsx +20 -0
  66. package/templates/react/add-on/convex/assets/src/routes/demo.convex.tsx +33 -0
  67. package/templates/react/add-on/convex/info.json +13 -0
  68. package/templates/react/add-on/convex/package.json +6 -0
  69. package/templates/react/add-on/form/assets/src/components/demo.FormComponents.tsx.ejs +300 -0
  70. package/templates/react/add-on/form/assets/src/hooks/demo.form-context.ts +4 -0
  71. package/templates/react/add-on/form/assets/src/hooks/demo.form.ts +22 -0
  72. package/templates/react/add-on/form/assets/src/routes/demo.form.address.tsx.ejs +213 -0
  73. package/templates/react/add-on/form/assets/src/routes/demo.form.simple.tsx.ejs +77 -0
  74. package/templates/react/add-on/form/info.json +26 -0
  75. package/templates/react/add-on/form/package.json +6 -0
  76. package/templates/react/add-on/module-federation/assets/module-federation.config.js.ejs +31 -0
  77. package/templates/react/add-on/module-federation/assets/src/demo-mf-component.tsx +3 -0
  78. package/templates/react/add-on/module-federation/assets/src/demo-mf-self-contained.tsx +11 -0
  79. package/templates/react/add-on/module-federation/info.json +7 -0
  80. package/templates/react/add-on/module-federation/package.json +5 -0
  81. package/templates/react/add-on/netlify/README.md +11 -0
  82. package/templates/react/add-on/netlify/info.json +7 -0
  83. package/templates/react/add-on/sentry/assets/_dot_cursorrules.append +22 -0
  84. package/templates/react/add-on/sentry/assets/_dot_env.local.append +11 -0
  85. package/templates/react/add-on/sentry/assets/src/app/global-middleware.ts +11 -0
  86. package/templates/react/add-on/sentry/assets/src/routes/demo.sentry.testing.tsx +489 -0
  87. package/templates/react/add-on/sentry/info.json +14 -0
  88. package/templates/react/add-on/sentry/package.json +5 -0
  89. package/templates/react/add-on/shadcn/README.md +7 -0
  90. package/templates/react/add-on/shadcn/assets/_dot_cursorrules.append +7 -0
  91. package/templates/react/add-on/shadcn/assets/components.json +21 -0
  92. package/templates/react/add-on/shadcn/assets/src/lib/utils.ts +6 -0
  93. package/templates/react/add-on/shadcn/assets/src/styles.css +138 -0
  94. package/templates/react/add-on/shadcn/info.json +7 -0
  95. package/templates/react/add-on/shadcn/package.json +9 -0
  96. package/templates/react/add-on/start/assets/_dot_gitignore.append +2 -0
  97. package/templates/react/add-on/start/assets/app.config.ts.ejs +32 -0
  98. package/templates/react/add-on/start/assets/src/api.ts +6 -0
  99. package/templates/react/add-on/start/assets/src/client.tsx.ejs +33 -0
  100. package/templates/react/add-on/start/assets/src/router.tsx.ejs +48 -0
  101. package/templates/react/add-on/start/assets/src/routes/api.demo-names.ts +11 -0
  102. package/templates/react/add-on/start/assets/src/routes/demo.start.api-request.tsx.ejs +33 -0
  103. package/templates/react/add-on/start/assets/src/routes/demo.start.server-funcs.tsx +50 -0
  104. package/templates/react/add-on/start/assets/src/ssr.tsx.ejs +30 -0
  105. package/templates/react/add-on/start/info.json +18 -0
  106. package/templates/react/add-on/start/package.json +13 -0
  107. package/templates/react/add-on/store/assets/src/lib/demo-store.ts +13 -0
  108. package/templates/react/add-on/store/assets/src/routes/demo.store.tsx.ejs +75 -0
  109. package/templates/react/add-on/store/info.json +13 -0
  110. package/templates/react/add-on/store/package.json +6 -0
  111. package/templates/react/add-on/t3env/README.md +16 -0
  112. package/templates/react/add-on/t3env/assets/src/env.ts +39 -0
  113. package/templates/react/add-on/t3env/info.json +10 -0
  114. package/templates/react/add-on/t3env/package.json +6 -0
  115. package/templates/react/add-on/tRPC/assets/src/integrations/trpc/init.ts +9 -0
  116. package/templates/react/add-on/tRPC/assets/src/integrations/trpc/react.ts +4 -0
  117. package/templates/react/add-on/tRPC/assets/src/integrations/trpc/router.ts +18 -0
  118. package/templates/react/add-on/tRPC/assets/src/routes/api.trpc.$.tsx +16 -0
  119. package/templates/react/add-on/tRPC/info.json +9 -0
  120. package/templates/react/add-on/tRPC/package.json +9 -0
  121. package/templates/react/add-on/table/assets/src/data/demo-table-data.ts +50 -0
  122. package/templates/react/add-on/table/assets/src/routes/demo.table.tsx.ejs +373 -0
  123. package/templates/react/add-on/table/info.json +13 -0
  124. package/templates/react/add-on/table/package.json +7 -0
  125. package/templates/react/add-on/tanstack-query/assets/src/integrations/tanstack-query/layout.tsx +5 -0
  126. package/templates/react/add-on/tanstack-query/assets/src/integrations/tanstack-query/root-provider.tsx.ejs +70 -0
  127. package/templates/react/add-on/tanstack-query/assets/src/routes/demo.tanstack-query.tsx.ejs +53 -0
  128. package/templates/react/add-on/tanstack-query/info.json +13 -0
  129. package/templates/react/add-on/tanstack-query/package.json +6 -0
  130. package/templates/react/base/README.md.ejs +558 -0
  131. package/templates/react/base/_dot_gitignore +5 -0
  132. package/templates/react/base/_dot_vscode/settings.biome.json +35 -0
  133. package/templates/react/base/_dot_vscode/settings.json +11 -0
  134. package/templates/react/base/index.html.ejs +20 -0
  135. package/templates/react/base/package.biome.json +10 -0
  136. package/templates/react/base/package.eslintprettier.json +11 -0
  137. package/templates/react/base/package.json +30 -0
  138. package/templates/react/base/package.ts.json +7 -0
  139. package/templates/react/base/package.tw.json +6 -0
  140. package/templates/react/base/public/favicon.ico +0 -0
  141. package/templates/react/base/public/logo192.png +0 -0
  142. package/templates/react/base/public/logo512.png +0 -0
  143. package/templates/react/base/public/manifest.json +25 -0
  144. package/templates/react/base/public/robots.txt +3 -0
  145. package/templates/react/base/src/App.css +38 -0
  146. package/templates/react/base/src/App.test.tsx.ejs +10 -0
  147. package/templates/react/base/src/App.tsx.ejs +74 -0
  148. package/templates/react/base/src/components/Header.tsx.ejs +27 -0
  149. package/templates/react/base/src/logo.svg +44 -0
  150. package/templates/react/base/src/reportWebVitals.ts.ejs +28 -0
  151. package/templates/react/base/src/styles.css.ejs +15 -0
  152. package/templates/react/base/toolchain/.prettierignore +3 -0
  153. package/templates/react/base/toolchain/biome.json +31 -0
  154. package/templates/react/base/toolchain/eslint.config.js +5 -0
  155. package/templates/react/base/toolchain/prettier.config.js +10 -0
  156. package/templates/react/base/tsconfig.json.ejs +29 -0
  157. package/templates/react/base/vite.config.js.ejs +23 -0
  158. package/templates/react/code-router/src/main.tsx.ejs +92 -0
  159. package/templates/react/example/tanchat/README.md +37 -0
  160. package/templates/react/example/tanchat/assets/_dot_env.local.append +2 -0
  161. package/templates/react/example/tanchat/assets/public/example-guitar-flowers.jpg +0 -0
  162. package/templates/react/example/tanchat/assets/public/example-guitar-motherboard.jpg +0 -0
  163. package/templates/react/example/tanchat/assets/public/example-guitar-racing.jpg +0 -0
  164. package/templates/react/example/tanchat/assets/public/example-guitar-steamer-trunk.jpg +0 -0
  165. package/templates/react/example/tanchat/assets/public/example-guitar-superhero.jpg +0 -0
  166. package/templates/react/example/tanchat/assets/public/example-guitar-traveling.jpg +0 -0
  167. package/templates/react/example/tanchat/assets/public/example-guitar-video-games.jpg +0 -0
  168. package/templates/react/example/tanchat/assets/src/components/example-AIAssistant.tsx +173 -0
  169. package/templates/react/example/tanchat/assets/src/components/example-GuitarRecommendation.tsx +47 -0
  170. package/templates/react/example/tanchat/assets/src/data/example-guitars.ts +83 -0
  171. package/templates/react/example/tanchat/assets/src/demo.index.css +220 -0
  172. package/templates/react/example/tanchat/assets/src/integrations/tanchat/header-user.tsx +5 -0
  173. package/templates/react/example/tanchat/assets/src/routes/api.messages.ts +24 -0
  174. package/templates/react/example/tanchat/assets/src/routes/api.sse.ts +23 -0
  175. package/templates/react/example/tanchat/assets/src/routes/example.chat.tsx +159 -0
  176. package/templates/react/example/tanchat/assets/src/routes/example.guitars/$guitarId.tsx +50 -0
  177. package/templates/react/example/tanchat/assets/src/routes/example.guitars/index.tsx +54 -0
  178. package/templates/react/example/tanchat/assets/src/store/example-assistant.ts +3 -0
  179. package/templates/react/example/tanchat/assets/src/utils/demo.ai.ts +62 -0
  180. package/templates/react/example/tanchat/assets/src/utils/demo.sse.ts +31 -0
  181. package/templates/react/example/tanchat/assets/src/utils/demo.tools.ts +47 -0
  182. package/templates/react/example/tanchat/info.json +19 -0
  183. package/templates/react/example/tanchat/package.json +16 -0
  184. package/templates/react/file-router/package.fr.json +5 -0
  185. package/templates/react/file-router/src/main.tsx.ejs +55 -0
  186. package/templates/react/file-router/src/routes/__root.tsx.ejs +82 -0
  187. package/templates/solid/add-on/form/assets/src/routes/demo.form.tsx.ejs +352 -0
  188. package/templates/solid/add-on/form/info.json +13 -0
  189. package/templates/solid/add-on/form/package.json +5 -0
  190. package/templates/solid/add-on/module-federation/assets/module-federation.config.js.ejs +27 -0
  191. package/templates/solid/add-on/module-federation/assets/src/demo-mf-component.tsx +3 -0
  192. package/templates/solid/add-on/module-federation/assets/src/demo-mf-self-contained.tsx +9 -0
  193. package/templates/solid/add-on/module-federation/info.json +7 -0
  194. package/templates/solid/add-on/module-federation/package.json +5 -0
  195. package/templates/solid/add-on/sentry/assets/_dot_cursorrules.append +22 -0
  196. package/templates/solid/add-on/sentry/assets/_dot_env.local.append +2 -0
  197. package/templates/solid/add-on/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +20 -0
  198. package/templates/solid/add-on/sentry/info.json +13 -0
  199. package/templates/solid/add-on/sentry/package.json +5 -0
  200. package/templates/solid/add-on/solid-ui/README.md +9 -0
  201. package/templates/solid/add-on/solid-ui/assets/src/lib/utils.ts +6 -0
  202. package/templates/solid/add-on/solid-ui/assets/src/styles.css +138 -0
  203. package/templates/solid/add-on/solid-ui/assets/ui.config.json +13 -0
  204. package/templates/solid/add-on/solid-ui/info.json +11 -0
  205. package/templates/solid/add-on/solid-ui/package.json +9 -0
  206. package/templates/solid/add-on/start/assets/app.config.ts +16 -0
  207. package/templates/solid/add-on/start/assets/src/api.ts +6 -0
  208. package/templates/solid/add-on/start/assets/src/client.tsx +7 -0
  209. package/templates/solid/add-on/start/assets/src/router.tsx.ejs +24 -0
  210. package/templates/solid/add-on/start/assets/src/routes/demo.start.server-funcs.tsx +49 -0
  211. package/templates/solid/add-on/start/assets/src/ssr.tsx +12 -0
  212. package/templates/solid/add-on/start/info.json +14 -0
  213. package/templates/solid/add-on/start/package.json +12 -0
  214. package/templates/solid/add-on/store/assets/src/lib/demo-store.ts +13 -0
  215. package/templates/solid/add-on/store/assets/src/routes/demo.store.tsx.ejs +77 -0
  216. package/templates/solid/add-on/store/info.json +13 -0
  217. package/templates/solid/add-on/store/package.json +6 -0
  218. package/templates/solid/add-on/t3env/README.md +16 -0
  219. package/templates/solid/add-on/t3env/assets/src/env.ts +39 -0
  220. package/templates/solid/add-on/t3env/info.json +10 -0
  221. package/templates/solid/add-on/t3env/package.json +6 -0
  222. package/templates/solid/add-on/tanstack-query/assets/src/integrations/tanstack-query/header-user.tsx +5 -0
  223. package/templates/solid/add-on/tanstack-query/assets/src/integrations/tanstack-query/provider.tsx +15 -0
  224. package/templates/solid/add-on/tanstack-query/assets/src/routes/demo.tanstack-query.tsx +30 -0
  225. package/templates/solid/add-on/tanstack-query/info.json +13 -0
  226. package/templates/solid/add-on/tanstack-query/package.json +6 -0
  227. package/templates/solid/base/README.md.ejs +215 -0
  228. package/templates/solid/base/_dot_cursorrules.append +35 -0
  229. package/templates/solid/base/_dot_gitignore +5 -0
  230. package/templates/solid/base/_dot_vscode/settings.biome.json +35 -0
  231. package/templates/solid/base/_dot_vscode/settings.json +11 -0
  232. package/templates/solid/base/index.html.ejs +20 -0
  233. package/templates/solid/base/package.biome.json +10 -0
  234. package/templates/solid/base/package.eslintprettier.json +11 -0
  235. package/templates/solid/base/package.json +23 -0
  236. package/templates/solid/base/package.ts.json +5 -0
  237. package/templates/solid/base/package.tw.json +6 -0
  238. package/templates/solid/base/public/favicon.ico +0 -0
  239. package/templates/solid/base/public/logo192.png +0 -0
  240. package/templates/solid/base/public/logo512.png +0 -0
  241. package/templates/solid/base/public/manifest.json +25 -0
  242. package/templates/solid/base/public/robots.txt +3 -0
  243. package/templates/solid/base/src/App.css +0 -0
  244. package/templates/solid/base/src/App.tsx.ejs +47 -0
  245. package/templates/solid/base/src/components/Header.tsx.ejs +26 -0
  246. package/templates/solid/base/src/logo.svg +120 -0
  247. package/templates/solid/base/src/styles.css.ejs +15 -0
  248. package/templates/solid/base/toolchain/.prettierignore +3 -0
  249. package/templates/solid/base/toolchain/biome.json +31 -0
  250. package/templates/solid/base/toolchain/eslint.config.js +5 -0
  251. package/templates/solid/base/toolchain/prettier.config.js +10 -0
  252. package/templates/solid/base/tsconfig.json.ejs +31 -0
  253. package/templates/solid/base/vite.config.js.ejs +22 -0
  254. package/templates/solid/code-router/src/main.tsx.ejs +71 -0
  255. package/templates/solid/example/tanchat/README.md +52 -0
  256. package/templates/solid/example/tanchat/assets/ai-streaming-server/README.md +110 -0
  257. package/templates/solid/example/tanchat/assets/ai-streaming-server/_dot_env.example +1 -0
  258. package/templates/solid/example/tanchat/assets/ai-streaming-server/package.json +26 -0
  259. package/templates/solid/example/tanchat/assets/ai-streaming-server/src/index.ts +102 -0
  260. package/templates/solid/example/tanchat/assets/ai-streaming-server/tsconfig.json +15 -0
  261. package/templates/solid/example/tanchat/assets/src/components/demo.SettingsDialog.tsx +149 -0
  262. package/templates/solid/example/tanchat/assets/src/demo.index.css +227 -0
  263. package/templates/solid/example/tanchat/assets/src/lib/demo-store.ts +13 -0
  264. package/templates/solid/example/tanchat/assets/src/routes/example.chat.tsx +435 -0
  265. package/templates/solid/example/tanchat/assets/src/store/demo.hooks.ts +17 -0
  266. package/templates/solid/example/tanchat/assets/src/store/demo.store.ts +133 -0
  267. package/templates/solid/example/tanchat/info.json +14 -0
  268. package/templates/solid/example/tanchat/package.json +7 -0
  269. package/templates/solid/file-router/package.fr.json +5 -0
  270. package/templates/solid/file-router/src/main.tsx.ejs +47 -0
  271. package/templates/solid/file-router/src/routes/__root.tsx.ejs +41 -0
  272. package/templates/solid/file-router/src/routes/index.tsx +43 -0
  273. package/tests/cra.test.ts +293 -0
  274. package/tests/snapshots/cra/cr-js-npm.json +33 -0
  275. package/tests/snapshots/cra/cr-ts-npm.json +34 -0
  276. package/tests/snapshots/cra/cr-ts-start-npm.json +38 -0
  277. package/tests/snapshots/cra/fr-ts-npm.json +34 -0
  278. package/tests/snapshots/cra/fr-ts-tw-npm.json +33 -0
  279. package/tests/snapshots/cra/solid-cr-js-npm.json +31 -0
  280. package/tests/snapshots/cra/solid-cr-ts-npm.json +32 -0
  281. package/tests/snapshots/cra/solid-cr-ts-start-npm.json +36 -0
  282. package/tests/snapshots/cra/solid-fr-ts-npm.json +33 -0
  283. package/tests/snapshots/cra/solid-fr-ts-tw-npm.json +32 -0
  284. package/tests/test-utilities.ts +87 -0
  285. package/dist/add-to-app.js +0 -169
  286. package/dist/custom-add-ons/add-on.js +0 -175
  287. package/dist/custom-add-ons/shared.js +0 -117
  288. package/dist/custom-add-ons/starter.js +0 -84
  289. package/dist/file-helpers.js +0 -165
  290. package/dist/frameworks.js +0 -92
  291. package/dist/integrations/git.js +0 -4
  292. package/dist/integrations/shadcn.js +0 -33
  293. package/dist/package-json.js +0 -48
  294. package/dist/special-steps/index.js +0 -24
  295. package/dist/special-steps/rimraf-node-modules.js +0 -16
  296. package/dist/template-file.js +0 -112
  297. package/dist/types/add-to-app.d.ts +0 -17
  298. package/dist/types/custom-add-ons/add-on.d.ts +0 -69
  299. package/dist/types/custom-add-ons/shared.d.ts +0 -15
  300. package/dist/types/custom-add-ons/starter.d.ts +0 -7
  301. package/dist/types/file-helpers.d.ts +0 -15
  302. package/dist/types/frameworks.d.ts +0 -7
  303. package/dist/types/integrations/git.d.ts +0 -2
  304. package/dist/types/integrations/shadcn.d.ts +0 -2
  305. package/dist/types/package-json.d.ts +0 -7
  306. package/dist/types/special-steps/index.d.ts +0 -2
  307. package/dist/types/special-steps/rimraf-node-modules.d.ts +0 -2
  308. package/dist/types/template-file.d.ts +0 -2
  309. package/src/add-to-app.ts +0 -274
  310. package/src/custom-add-ons/add-on.ts +0 -261
  311. package/src/custom-add-ons/shared.ts +0 -161
  312. package/src/custom-add-ons/starter.ts +0 -126
  313. package/src/file-helpers.ts +0 -235
  314. package/src/frameworks.ts +0 -134
  315. package/src/integrations/git.ts +0 -7
  316. package/src/integrations/shadcn.ts +0 -54
  317. package/src/package-json.ts +0 -69
  318. package/src/special-steps/index.ts +0 -36
  319. package/src/special-steps/rimraf-node-modules.ts +0 -25
  320. package/src/template-file.ts +0 -150
  321. package/tests/add-ons.test.ts +0 -67
  322. package/tests/add-to-app.test.ts +0 -358
  323. package/tests/config-file.test.ts +0 -68
  324. package/tests/create-app.test.ts +0 -120
  325. package/tests/custom-add-ons/add-on.test.ts +0 -12
  326. package/tests/custom-add-ons/shared.test.ts +0 -257
  327. package/tests/custom-add-ons/starter.test.ts +0 -58
  328. package/tests/environment.test.ts +0 -115
  329. package/tests/file-helper.test.ts +0 -90
  330. package/tests/frameworks.test.ts +0 -95
  331. package/tests/index.test.ts +0 -9
  332. package/tests/integrations/git.test.ts +0 -20
  333. package/tests/integrations/shadcn.test.ts +0 -91
  334. package/tests/options.test.ts +0 -42
  335. package/tests/package-json.test.ts +0 -63
  336. package/tests/package-manager.test.ts +0 -154
  337. package/tests/setupVitest.ts +0 -6
  338. package/tests/template-file.test.ts +0 -178
  339. package/tests/utils.test.ts +0 -23
  340. package/vitest.config.ts +0 -21
@@ -24,94 +24,23 @@ export function getPackageManager(): PackageManager | undefined {
24
24
  return packageManager
25
25
  }
26
26
 
27
- export function getPackageManagerScriptCommand(
28
- packagerManager: PackageManager,
29
- args: Array<string> = [],
30
- ) {
31
- switch (packagerManager) {
32
- case 'yarn':
33
- return { command: 'yarn', args: ['run', ...args] }
34
- case 'pnpm':
35
- return { command: 'pnpm', args: [...args] }
36
- case 'bun':
37
- return { command: 'bunx', args: ['--bun', 'run', ...args] }
38
- case 'deno':
39
- return { command: 'deno', args: ['task', ...args] }
40
- default:
41
- return { command: 'npm', args: ['run', ...args] }
42
- }
43
- }
44
-
45
- export function getPackageManagerExecuteCommand(
27
+ export function packageManagerExecute(
28
+ environment: Environment,
46
29
  packagerManager: PackageManager,
47
30
  pkg: string,
48
- args: Array<string> = [],
31
+ args: Array<string>,
32
+ cwd: string,
49
33
  ) {
50
34
  switch (packagerManager) {
51
35
  case 'yarn':
52
- return { command: 'yarn', args: ['dlx', pkg, ...args] }
36
+ return environment.execute('yarn', ['dlx', pkg, ...args], cwd)
53
37
  case 'pnpm':
54
- return { command: 'pnpx', args: [pkg, ...args] }
38
+ return environment.execute('pnpx', [pkg, ...args], cwd)
55
39
  case 'bun':
56
- return { command: 'bunx', args: ['--bun', pkg, ...args] }
40
+ return environment.execute('bunx', ['--bun', pkg, ...args], cwd)
57
41
  case 'deno':
58
- return { command: 'deno', args: ['run', `npm:${pkg}`, ...args] }
42
+ return environment.execute('deno', ['run', `npm:${pkg}`, ...args], cwd)
59
43
  default:
60
- return { command: 'npx', args: [pkg, ...args] }
44
+ return environment.execute('npx', [pkg, ...args], cwd)
61
45
  }
62
46
  }
63
-
64
- export function getPackageManagerInstallCommand(
65
- packagerManager: PackageManager,
66
- pkg?: string,
67
- isDev: boolean = false,
68
- ) {
69
- if (pkg) {
70
- switch (packagerManager) {
71
- case 'yarn':
72
- case 'pnpm':
73
- return {
74
- command: packagerManager,
75
- args: ['add', pkg, isDev ? '--dev' : ''],
76
- }
77
- default:
78
- return {
79
- command: packagerManager,
80
- args: ['install', pkg, isDev ? '-D' : ''],
81
- }
82
- }
83
- } else {
84
- return {
85
- command: packagerManager,
86
- args: ['install'],
87
- }
88
- }
89
- }
90
-
91
- export function packageManagerInstall(
92
- environment: Environment,
93
- cwd: string,
94
- packagerManager: PackageManager,
95
- pkg?: string,
96
- ) {
97
- const { command, args: commandArgs } = getPackageManagerInstallCommand(
98
- packagerManager,
99
- pkg,
100
- )
101
- return environment.execute(command, commandArgs, cwd)
102
- }
103
-
104
- export function packageManagerExecute(
105
- environment: Environment,
106
- cwd: string,
107
- packagerManager: PackageManager,
108
- pkg: string,
109
- args: Array<string>,
110
- ) {
111
- const { command, args: commandArgs } = getPackageManagerExecuteCommand(
112
- packagerManager,
113
- pkg,
114
- args,
115
- )
116
- return environment.execute(command, commandArgs, cwd)
117
- }
@@ -0,0 +1,7 @@
1
+ import { dirname, join } from 'node:path'
2
+ import { fileURLToPath } from 'node:url'
3
+
4
+ export function getTemplatesRoot() {
5
+ // Get the parent directory because the compiled code is in the dist folder
6
+ return join(dirname(dirname(fileURLToPath(import.meta.url))), 'templates')
7
+ }
@@ -0,0 +1,7 @@
1
+ export const SUPPORTED_TOOLCHAINS = [
2
+ 'none',
3
+ 'biome',
4
+ 'eslint+prettier',
5
+ ] as const
6
+ export type ToolChain = (typeof SUPPORTED_TOOLCHAINS)[number]
7
+ export const DEFAULT_TOOLCHAIN: ToolChain = 'none'
package/src/types.ts CHANGED
@@ -1,212 +1,124 @@
1
- import z from 'zod'
2
-
3
1
  import type { CODE_ROUTER, FILE_ROUTER } from './constants.js'
4
2
  import type { PackageManager } from './package-manager.js'
3
+ import type { ToolChain } from './toolchain.js'
5
4
 
6
- export type Mode = typeof CODE_ROUTER | typeof FILE_ROUTER
7
-
8
- export type StatusStepType =
9
- | 'file'
10
- | 'command'
11
- | 'info'
12
- | 'package-manager'
13
- | 'other'
14
-
15
- export const AddOnBaseSchema = z.object({
16
- id: z.string(),
17
- name: z.string(),
18
- description: z.string(),
19
- author: z.string().optional(),
20
- version: z.string().optional(),
21
- link: z.string().optional(),
22
- license: z.string().optional(),
23
- warning: z.string().optional(),
24
- type: z.enum(['add-on', 'example', 'starter', 'toolchain']),
25
- command: z
26
- .object({
27
- command: z.string(),
28
- args: z.array(z.string()).optional(),
29
- })
30
- .optional(),
31
- routes: z
32
- .array(
33
- z.object({
34
- url: z.string().optional(),
35
- name: z.string().optional(),
36
- path: z.string(),
37
- jsName: z.string(),
38
- }),
39
- )
40
- .optional(),
41
- packageAdditions: z
42
- .object({
43
- dependencies: z.record(z.string(), z.string()).optional(),
44
- devDependencies: z.record(z.string(), z.string()).optional(),
45
- scripts: z.record(z.string(), z.string()).optional(),
46
- })
47
- .optional(),
48
- shadcnComponents: z.array(z.string()).optional(),
49
- dependsOn: z.array(z.string()).optional(),
50
- smallLogo: z.string().optional(),
51
- logo: z.string().optional(),
52
- addOnSpecialSteps: z.array(z.string()).optional(),
53
- createSpecialSteps: z.array(z.string()).optional(),
54
- })
55
-
56
- export const StarterSchema = AddOnBaseSchema.extend({
57
- framework: z.string(),
58
- mode: z.string(),
59
- typescript: z.boolean(),
60
- tailwind: z.boolean(),
61
- banner: z.string().optional(),
62
- })
63
-
64
- export const StarterCompiledSchema = StarterSchema.extend({
65
- files: z.record(z.string(), z.string()),
66
- deletedFiles: z.array(z.string()),
67
- })
68
-
69
- export const IntegrationSchema = z.object({
70
- type: z.string(),
71
- path: z.string(),
72
- jsName: z.string(),
73
- })
74
-
75
- export const AddOnInfoSchema = AddOnBaseSchema.extend({
76
- modes: z.array(z.string()),
77
- integrations: z.array(IntegrationSchema).optional(),
78
- phase: z.enum(['setup', 'add-on']),
79
- readme: z.string().optional(),
80
- })
5
+ export type Framework = 'solid' | 'react'
81
6
 
82
- export const AddOnCompiledSchema = AddOnInfoSchema.extend({
83
- files: z.record(z.string(), z.string()),
84
- deletedFiles: z.array(z.string()),
85
- })
86
-
87
- export type Integration = z.infer<typeof IntegrationSchema>
88
-
89
- export type AddOnBase = z.infer<typeof AddOnBaseSchema>
90
-
91
- export type StarterInfo = z.infer<typeof StarterSchema>
92
-
93
- export type StarterCompiled = z.infer<typeof StarterCompiledSchema>
94
-
95
- export type AddOnInfo = z.infer<typeof AddOnInfoSchema>
96
-
97
- export type AddOnCompiled = z.infer<typeof AddOnCompiledSchema>
98
-
99
- export type FileBundleHandler = {
100
- getFiles: () => Promise<Array<string>>
101
- getFileContents: (path: string) => Promise<string>
102
- getDeletedFiles: () => Promise<Array<string>>
103
- }
7
+ export type TemplateOptions = 'typescript' | 'javascript' | 'file-router'
104
8
 
105
- export type AddOn = AddOnInfo & FileBundleHandler
106
-
107
- export type Starter = StarterCompiled & FileBundleHandler
108
-
109
- export type FrameworkDefinition = {
110
- id: string
111
- name: string
112
- description: string
113
- version: string
114
-
115
- baseDirectory: string
116
- addOnsDirectories: Array<string>
117
- examplesDirectory: string
118
- }
119
-
120
- export type Framework = FrameworkDefinition &
121
- FileBundleHandler & {
122
- basePackageJSON: Record<string, any>
123
- optionalPackages: Record<string, any>
124
-
125
- getAddOns: () => Array<AddOn>
126
- }
9
+ export type Mode = typeof CODE_ROUTER | typeof FILE_ROUTER
127
10
 
128
11
  export interface Options {
129
- projectName: string
130
- targetDir: string
131
-
132
12
  framework: Framework
133
- mode: Mode
134
-
13
+ projectName: string
135
14
  typescript: boolean
136
15
  tailwind: boolean
137
-
138
16
  packageManager: PackageManager
139
- git: boolean
140
-
17
+ toolchain: ToolChain
18
+ mode: Mode
19
+ addOns: boolean
141
20
  chosenAddOns: Array<AddOn>
142
- starter?: Starter | undefined
21
+ git: boolean
22
+ variableValues: Record<string, string | number | boolean>
23
+ overlay?: AddOn | undefined
143
24
  }
144
25
 
145
- export type SerializedOptions = Omit<
146
- Options,
147
- 'chosenAddOns' | 'starter' | 'framework'
148
- > & {
149
- chosenAddOns: Array<string>
150
- starter?: string | undefined
151
- framework: string
26
+ export interface CliOptions {
27
+ template?: TemplateOptions
28
+ framework?: Framework
29
+ tailwind?: boolean
30
+ packageManager?: PackageManager
31
+ toolchain?: ToolChain
32
+ projectName?: string
33
+ git?: boolean
34
+ addOns?: Array<string> | boolean
35
+ listAddOns?: boolean
36
+ mcp?: boolean
37
+ mcpSse?: boolean
38
+ overlay?: string
39
+ targetDir?: string
40
+ interactive?: boolean
152
41
  }
153
42
 
154
- type ProjectEnvironment = {
43
+ export type Environment = {
155
44
  startRun: () => void
156
45
  finishRun: () => void
157
46
  getErrors: () => Array<string>
158
- }
159
47
 
160
- type FileEnvironment = {
161
48
  appendFile: (path: string, contents: string) => Promise<void>
162
49
  copyFile: (from: string, to: string) => Promise<void>
163
50
  writeFile: (path: string, contents: string) => Promise<void>
164
- writeFileBase64: (path: string, base64Contents: string) => Promise<void>
165
- execute: (
166
- command: string,
167
- args: Array<string>,
168
- cwd: string,
169
- ) => Promise<{ stdout: string }>
51
+ execute: (command: string, args: Array<string>, cwd: string) => Promise<void>
170
52
  deleteFile: (path: string) => Promise<void>
171
53
 
54
+ readFile: (path: string, encoding?: BufferEncoding) => Promise<string>
172
55
  exists: (path: string) => boolean
56
+ readdir: (path: string) => Array<string>
173
57
  isDirectory: (path: string) => boolean
174
- readFile: (path: string) => Promise<string>
175
- readdir: (path: string) => Promise<Array<string>>
176
- rimraf: (path: string) => Promise<void>
177
58
  }
178
59
 
179
- export type StatusEvent = {
180
- id: string
181
- type: StatusStepType
182
- message: string
183
- }
184
- export type StopEvent = {
185
- id: string
60
+ type BooleanVariable = {
61
+ name: string
62
+ default: boolean
63
+ description: string
64
+ type: 'boolean'
186
65
  }
187
66
 
188
- type UIEnvironment = {
189
- appName: string
190
-
191
- startStep: (info: {
192
- id: string
193
- type: StatusStepType
194
- message: string
195
- }) => void
196
- finishStep: (id: string, finalMessage: string) => void
67
+ type NumberVariable = {
68
+ name: string
69
+ default: number
70
+ description: string
71
+ type: 'number'
72
+ }
197
73
 
198
- intro: (message: string) => void
199
- outro: (message: string) => void
74
+ type StringVariable = {
75
+ name: string
76
+ default: string
77
+ description: string
78
+ type: 'string'
79
+ }
200
80
 
201
- info: (title?: string, message?: string) => void
202
- error: (title?: string, message?: string) => void
203
- warn: (title?: string, message?: string) => void
81
+ export type Variable = BooleanVariable | NumberVariable | StringVariable
204
82
 
205
- spinner: () => {
206
- start: (message: string) => void
207
- stop: (message: string) => void
83
+ export type AddOn = {
84
+ id: string
85
+ name: string
86
+ description: string
87
+ type: 'add-on' | 'example' | 'overlay'
88
+ link: string
89
+ templates: Array<string>
90
+ routes: Array<{
91
+ url: string
92
+ name: string
93
+ }>
94
+ packageAdditions: {
95
+ dependencies?: Record<string, string>
96
+ devDependencies?: Record<string, string>
97
+ scripts?: Record<string, string>
208
98
  }
209
- confirm: (message: string) => Promise<boolean>
99
+ command?: {
100
+ command: string
101
+ args?: Array<string>
102
+ }
103
+ readme?: string
104
+ phase: 'setup' | 'add-on'
105
+ shadcnComponents?: Array<string>
106
+ warning?: string
107
+ dependsOn?: Array<string>
108
+ variables?: Array<Variable>
109
+
110
+ files?: Record<string, string>
111
+ deletedFiles?: Array<string>
210
112
  }
211
113
 
212
- export type Environment = ProjectEnvironment & FileEnvironment & UIEnvironment
114
+ export type Overlay = AddOn & {
115
+ type: 'overlay'
116
+ version: string
117
+ author: string
118
+ link: string
119
+ license: string
120
+ mode: Mode
121
+ framework: Framework
122
+ typescript: boolean
123
+ tailwind: boolean
124
+ }
package/src/utils.ts CHANGED
@@ -8,20 +8,3 @@ export function sortObject(
8
8
  return acc
9
9
  }, {})
10
10
  }
11
-
12
- export function jsSafeName(name: string) {
13
- return name
14
- .split(/[^a-zA-Z0-9]/)
15
- .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
16
- .join('')
17
- }
18
-
19
- export function formatCommand({
20
- command,
21
- args,
22
- }: {
23
- command: string
24
- args: Array<string>
25
- }) {
26
- return `${command} ${args.join(' ')}`.trim()
27
- }
@@ -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](dashboard.clerk.com)
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](dashboard.convex.dev)
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
+ }