@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
@@ -1,126 +0,0 @@
1
- import { readFile } from 'node:fs/promises'
2
- import { existsSync, writeFileSync } from 'node:fs'
3
- import { resolve } from 'node:path'
4
-
5
- import { StarterCompiledSchema } from '../types.js'
6
- import { createIgnore } from '../file-helpers.js'
7
- import {
8
- compareFilesRecursively,
9
- createAppOptionsFromPersisted,
10
- createPackageAdditions,
11
- readCurrentProjectOptions,
12
- runCreateApp,
13
- } from './shared.js'
14
-
15
- import type { PersistedOptions } from '../config-file'
16
- import type {
17
- Environment,
18
- Options,
19
- Starter,
20
- StarterCompiled,
21
- StarterInfo,
22
- } from '../types'
23
-
24
- const INFO_FILE = 'starter-info.json'
25
- const COMPILED_FILE = 'starter.json'
26
-
27
- export async function readOrGenerateStarterInfo(
28
- options: PersistedOptions,
29
- ): Promise<StarterInfo> {
30
- return existsSync(INFO_FILE)
31
- ? JSON.parse((await readFile(INFO_FILE)).toString())
32
- : {
33
- id: `${options.projectName}-starter`,
34
- name: `${options.projectName}-starter`,
35
- version: '0.0.1',
36
- description: 'Project starter',
37
- author: 'Jane Smith <jane.smith@example.com>',
38
- license: 'MIT',
39
- link: `https://github.com/jane-smith/${options.projectName}-starter`,
40
- shadcnComponents: [],
41
- framework: options.framework,
42
- mode: options.mode!,
43
- routes: [],
44
- warning: '',
45
- type: 'starter',
46
- packageAdditions: {
47
- scripts: {},
48
- dependencies: {},
49
- devDependencies: {},
50
- },
51
- dependsOn: options.existingAddOns,
52
- typescript: options.typescript!,
53
- tailwind: options.tailwind!,
54
- }
55
- }
56
-
57
- async function loadCurrentStarterInfo(environment: Environment) {
58
- const persistedOptions = await readCurrentProjectOptions(environment)
59
- const info = await readOrGenerateStarterInfo(persistedOptions)
60
-
61
- const output = await runCreateApp(
62
- (await createAppOptionsFromPersisted(
63
- persistedOptions,
64
- )) as Required<Options>,
65
- )
66
-
67
- return { info, output }
68
- }
69
-
70
- export async function updateStarterInfo(environment: Environment) {
71
- const { info, output } = await loadCurrentStarterInfo(environment)
72
-
73
- info.packageAdditions = createPackageAdditions(
74
- JSON.parse(output.files['./package.json']),
75
- JSON.parse((await readFile('package.json')).toString()),
76
- )
77
-
78
- writeFileSync(INFO_FILE, JSON.stringify(info, null, 2))
79
- }
80
-
81
- export async function compileStarter(environment: Environment) {
82
- const { info, output } = await loadCurrentStarterInfo(environment)
83
-
84
- const ignore = createIgnore(process.cwd())
85
- const changedFiles: Record<string, string> = {}
86
- await compareFilesRecursively('.', ignore, output.files, changedFiles)
87
-
88
- const deletedFiles: Array<string> = []
89
- for (const file of Object.keys(output.files)) {
90
- if (!existsSync(resolve(process.cwd(), file))) {
91
- deletedFiles.push(file)
92
- }
93
- }
94
-
95
- const compiledInfo: StarterCompiled = {
96
- ...info,
97
- files: changedFiles,
98
- deletedFiles,
99
- }
100
-
101
- writeFileSync(COMPILED_FILE, JSON.stringify(compiledInfo, null, 2))
102
- }
103
-
104
- export async function initStarter(environment: Environment) {
105
- await updateStarterInfo(environment)
106
- await compileStarter(environment)
107
- }
108
-
109
- export async function loadStarter(url: string): Promise<Starter> {
110
- const response = await fetch(url)
111
- const jsonContent = await response.json()
112
-
113
- const checked = StarterCompiledSchema.safeParse(jsonContent)
114
- if (!checked.success) {
115
- throw new Error(`Invalid starter: ${url}`)
116
- }
117
-
118
- const starter = checked.data
119
- starter.id = url
120
- return {
121
- ...starter,
122
- getFiles: () => Promise.resolve(Object.keys(starter.files)),
123
- getFileContents: (path: string) => Promise.resolve(starter.files[path]),
124
- getDeletedFiles: () => Promise.resolve(starter.deletedFiles),
125
- }
126
- }
@@ -1,235 +0,0 @@
1
- import { readdir } from 'node:fs/promises'
2
- import { existsSync, readFileSync, readdirSync, statSync } from 'node:fs'
3
- import { basename, extname, resolve } from 'node:path'
4
- import parseGitignore from 'parse-gitignore'
5
- import ignore from 'ignore'
6
-
7
- import type { Environment } from './types'
8
-
9
- const BINARY_EXTENSIONS = ['.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico']
10
-
11
- export function readFileHelper(path: string): string {
12
- if (isBinaryFile(path)) {
13
- return `base64::${readFileSync(path).toString('base64')}`
14
- } else {
15
- return readFileSync(path, 'utf-8').toString()
16
- }
17
- }
18
-
19
- export function isBinaryFile(path: string): boolean {
20
- return BINARY_EXTENSIONS.includes(extname(path))
21
- }
22
-
23
- export function convertBinaryContentsToBase64(contents: any): string {
24
- return `base64::${Buffer.from(contents).toString('base64')}`
25
- }
26
-
27
- export function isBase64(content: string): boolean {
28
- return content.startsWith('base64::')
29
- }
30
-
31
- export function getBinaryFile(content: string): string | null {
32
- if (content.startsWith('base64::')) {
33
- const binaryContent = Buffer.from(content.replace('base64::', ''), 'base64')
34
- return binaryContent as unknown as string
35
- }
36
- return null
37
- }
38
-
39
- export function relativePath(from: string, to: string) {
40
- const cleanedFrom = from.startsWith('./') ? from.slice(2) : from
41
- const cleanedTo = to.startsWith('./') ? to.slice(2) : to
42
-
43
- const fromSegments = cleanedFrom.split('/')
44
- const toSegments = cleanedTo.split('/')
45
-
46
- fromSegments.pop()
47
- toSegments.pop()
48
-
49
- let commonIndex = 0
50
- while (
51
- commonIndex < fromSegments.length &&
52
- commonIndex < toSegments.length &&
53
- fromSegments[commonIndex] === toSegments[commonIndex]
54
- ) {
55
- commonIndex++
56
- }
57
-
58
- const upLevels = fromSegments.length - commonIndex
59
- const downLevels = toSegments.slice(commonIndex)
60
-
61
- if (upLevels === 0 && downLevels.length === 0) {
62
- return `./${basename(to)}`
63
- } else if (upLevels === 0 && downLevels.length > 0) {
64
- return `./${downLevels.join('/')}/${basename(to)}`
65
- } else {
66
- const relativePath = [...Array(upLevels).fill('..'), ...downLevels].join(
67
- '/',
68
- )
69
- return `${relativePath}/${basename(to)}`
70
- }
71
- }
72
-
73
- export function isDirectory(path: string): boolean {
74
- return statSync(path).isDirectory()
75
- }
76
-
77
- export function findFilesRecursively(
78
- path: string,
79
- files: Record<string, string>,
80
- ) {
81
- const dirFiles = readdirSync(path)
82
- for (const file of dirFiles) {
83
- const filePath = resolve(path, file)
84
- if (isDirectory(filePath)) {
85
- findFilesRecursively(filePath, files)
86
- } else {
87
- files[filePath] = readFileHelper(filePath)
88
- }
89
- }
90
- }
91
-
92
- async function recursivelyGatherFilesHelper(
93
- basePath: string,
94
- path: string,
95
- files: Record<string, string>,
96
- ignore: (filePath: string) => boolean,
97
- ) {
98
- const dirFiles = await readdir(path, { withFileTypes: true })
99
- for (const file of dirFiles) {
100
- if (ignore(file.name)) {
101
- continue
102
- }
103
- if (file.isDirectory()) {
104
- await recursivelyGatherFilesHelper(
105
- basePath,
106
- resolve(path, file.name),
107
- files,
108
- ignore,
109
- )
110
- } else {
111
- const filePath = resolve(path, file.name)
112
- files[filePath.replace(basePath, '.')] = await readFileHelper(filePath)
113
- }
114
- }
115
- }
116
-
117
- export async function recursivelyGatherFiles(
118
- path: string,
119
- includeProjectFiles = true,
120
- ) {
121
- const ignore = createIgnore(path, includeProjectFiles)
122
- const files: Record<string, string> = {}
123
- await recursivelyGatherFilesHelper(path, path, files, ignore)
124
- return files
125
- }
126
-
127
- async function recursivelyGatherFilesFromEnvironmentHelper(
128
- environment: Environment,
129
- basePath: string,
130
- path: string,
131
- files: Record<string, string>,
132
- ignore: (filePath: string) => boolean,
133
- ) {
134
- const dirFiles = await environment.readdir(path)
135
- for (const file of dirFiles) {
136
- if (ignore(file)) {
137
- continue
138
- }
139
- if (environment.isDirectory(resolve(path, file))) {
140
- await recursivelyGatherFilesFromEnvironmentHelper(
141
- environment,
142
- basePath,
143
- resolve(path, file),
144
- files,
145
- ignore,
146
- )
147
- } else {
148
- const filePath = resolve(path, file)
149
- files[filePath.replace(basePath, '.')] =
150
- await environment.readFile(filePath)
151
- }
152
- }
153
- }
154
-
155
- export async function recursivelyGatherFilesFromEnvironment(
156
- environment: Environment,
157
- path: string,
158
- includeProjectFiles = true,
159
- ) {
160
- const ignore = createIgnore(path, includeProjectFiles)
161
- const files: Record<string, string> = {}
162
- await recursivelyGatherFilesFromEnvironmentHelper(
163
- environment,
164
- path,
165
- path,
166
- files,
167
- ignore,
168
- )
169
- return files
170
- }
171
-
172
- export const IGNORE_FILES = [
173
- '.starter',
174
- '.add-on',
175
- '.cta.json',
176
- '.git',
177
- 'add-on-info.json',
178
- 'add-on.json',
179
- 'build',
180
- 'bun.lock',
181
- 'bun.lockb',
182
- 'deno.lock',
183
- 'dist',
184
- 'node_modules',
185
- 'package-lock.json',
186
- 'pnpm-lock.yaml',
187
- 'starter.json',
188
- 'starter-info.json',
189
- 'yarn.lock',
190
- ]
191
-
192
- const PROJECT_FILES = ['package.json']
193
-
194
- export function createIgnore(path: string, includeProjectFiles = true) {
195
- const ignoreList = existsSync(resolve(path, '.gitignore'))
196
- ? (
197
- parseGitignore(
198
- readFileSync(resolve(path, '.gitignore')),
199
- ) as unknown as { patterns: Array<string> }
200
- ).patterns
201
- : []
202
- const ig = ignore().add(ignoreList)
203
- return (filePath: string) => {
204
- const fileName = basename(filePath)
205
- if (
206
- IGNORE_FILES.includes(fileName) ||
207
- (includeProjectFiles && PROJECT_FILES.includes(fileName))
208
- ) {
209
- return true
210
- }
211
- const nameWithoutDotSlash = fileName.replace(/^\.\//, '')
212
- return ig.ignores(nameWithoutDotSlash)
213
- }
214
- }
215
-
216
- export function cleanUpFiles(
217
- files: Record<string, string>,
218
- targetDir?: string,
219
- ) {
220
- return Object.keys(files).reduce<Record<string, string>>((acc, file) => {
221
- if (basename(file) !== '.cta.json') {
222
- acc[targetDir ? file.replace(targetDir, '.') : file] = files[file]
223
- }
224
- return acc
225
- }, {})
226
- }
227
-
228
- export function cleanUpFileArray(files: Array<string>, targetDir?: string) {
229
- return files.reduce<Array<string>>((acc, file) => {
230
- if (basename(file) !== '.cta.json') {
231
- acc.push(targetDir ? file.replace(targetDir, '.') : file)
232
- }
233
- return acc
234
- }, [])
235
- }
package/src/frameworks.ts DELETED
@@ -1,134 +0,0 @@
1
- import { existsSync, readFileSync, readdirSync } from 'node:fs'
2
- import { resolve } from 'node:path'
3
-
4
- import {
5
- findFilesRecursively,
6
- isDirectory,
7
- readFileHelper,
8
- } from './file-helpers.js'
9
-
10
- import type { AddOn, Framework, FrameworkDefinition } from './types.js'
11
-
12
- const frameworks: Array<Framework> = []
13
-
14
- function getAddOns(framework: FrameworkDefinition) {
15
- const addOns: Array<AddOn> = []
16
-
17
- for (const addOnsBase of framework.addOnsDirectories) {
18
- for (const dir of readdirSync(addOnsBase).filter((file) =>
19
- isDirectory(resolve(addOnsBase, file)),
20
- )) {
21
- const filePath = resolve(addOnsBase, dir, 'info.json')
22
- const fileContent = readFileSync(filePath, 'utf-8')
23
- const info = JSON.parse(fileContent)
24
-
25
- let packageAdditions: Record<string, string> = {}
26
- if (existsSync(resolve(addOnsBase, dir, 'package.json'))) {
27
- packageAdditions = JSON.parse(
28
- readFileSync(resolve(addOnsBase, dir, 'package.json'), 'utf-8'),
29
- )
30
- }
31
-
32
- let readme: string | undefined
33
- if (existsSync(resolve(addOnsBase, dir, 'README.md'))) {
34
- readme = readFileSync(resolve(addOnsBase, dir, 'README.md'), 'utf-8')
35
- }
36
-
37
- let smallLogo: string | undefined
38
- if (existsSync(resolve(addOnsBase, dir, 'small-logo.svg'))) {
39
- smallLogo = readFileSync(
40
- resolve(addOnsBase, dir, 'small-logo.svg'),
41
- 'utf-8',
42
- )
43
- }
44
-
45
- const absoluteFiles: Record<string, string> = {}
46
- const assetsDir = resolve(addOnsBase, dir, 'assets')
47
- if (existsSync(assetsDir)) {
48
- findFilesRecursively(assetsDir, absoluteFiles)
49
- }
50
- const files: Record<string, string> = {}
51
- for (const file of Object.keys(absoluteFiles)) {
52
- files[file.replace(assetsDir, '.')] = readFileHelper(file)
53
- }
54
-
55
- const getFiles = () => {
56
- return Promise.resolve(Object.keys(files))
57
- }
58
- const getFileContents = (path: string) => {
59
- return Promise.resolve(files[path])
60
- }
61
-
62
- addOns.push({
63
- ...info,
64
- id: dir,
65
- packageAdditions,
66
- readme,
67
- files,
68
- smallLogo,
69
- getFiles,
70
- getFileContents,
71
- getDeletedFiles: () => Promise.resolve(info.deletedFiles ?? []),
72
- })
73
- }
74
- }
75
-
76
- return addOns
77
- }
78
-
79
- export function __testRegisterFramework(framework: Framework) {
80
- frameworks.push(framework)
81
- }
82
-
83
- export function __testClearFrameworks() {
84
- frameworks.length = 0
85
- }
86
-
87
- export function registerFramework(framework: FrameworkDefinition) {
88
- const baseAssetsDirectory = resolve(framework.baseDirectory, 'base')
89
-
90
- const basePackageJSON = JSON.parse(
91
- readFileSync(resolve(baseAssetsDirectory, 'package.json'), 'utf8'),
92
- )
93
- const optionalPackages = JSON.parse(
94
- readFileSync(resolve(framework.baseDirectory, 'packages.json'), 'utf8'),
95
- )
96
-
97
- const addOns = getAddOns(framework)
98
-
99
- const frameworkWithBundler: Framework = {
100
- ...framework,
101
- getFiles: () => {
102
- const files: Record<string, string> = {}
103
- findFilesRecursively(baseAssetsDirectory, files)
104
- return Promise.resolve(
105
- Object.keys(files).map((path) =>
106
- path.replace(baseAssetsDirectory, '.'),
107
- ),
108
- )
109
- },
110
- getFileContents: (path: string) => {
111
- return Promise.resolve(readFileHelper(resolve(baseAssetsDirectory, path)))
112
- },
113
- getDeletedFiles: () => {
114
- return Promise.resolve([])
115
- },
116
- basePackageJSON,
117
- optionalPackages,
118
- getAddOns: () => addOns,
119
- }
120
-
121
- frameworks.push(frameworkWithBundler)
122
- }
123
-
124
- export function getFrameworkById(id: string) {
125
- return frameworks.find((framework) => framework.id === id)
126
- }
127
-
128
- export function getFrameworkByName(name: string) {
129
- return frameworks.find((framework) => framework.name === name)
130
- }
131
-
132
- export function getFrameworks() {
133
- return frameworks
134
- }
@@ -1,7 +0,0 @@
1
- import { resolve } from 'node:path'
2
-
3
- import type { Environment } from '../types.js'
4
-
5
- export async function setupGit(environment: Environment, targetDir: string) {
6
- await environment.execute('git', ['init'], resolve(targetDir))
7
- }
@@ -1,54 +0,0 @@
1
- import { resolve } from 'node:path'
2
- import { packageManagerExecute } from '../package-manager.js'
3
- import type { Environment, Options } from '../types.js'
4
-
5
- export async function installShadcnComponents(
6
- environment: Environment,
7
- targetDir: string,
8
- options: Options,
9
- ) {
10
- const s = environment.spinner()
11
-
12
- if (options.chosenAddOns.find((a) => a.id === 'shadcn')) {
13
- const shadcnComponents = new Set<string>()
14
- for (const addOn of options.chosenAddOns) {
15
- if (addOn.shadcnComponents) {
16
- for (const component of addOn.shadcnComponents) {
17
- shadcnComponents.add(component)
18
- }
19
- }
20
- }
21
- if (options.starter) {
22
- if (options.starter.shadcnComponents) {
23
- for (const component of options.starter.shadcnComponents) {
24
- shadcnComponents.add(component)
25
- }
26
- }
27
- }
28
-
29
- if (shadcnComponents.size > 0) {
30
- s.start(
31
- `Installing shadcn components (${Array.from(shadcnComponents).join(', ')})...`,
32
- )
33
- environment.startStep({
34
- id: 'install-shadcn-components',
35
- type: 'command',
36
- message: `Installing shadcn components (${Array.from(shadcnComponents).join(', ')})...`,
37
- })
38
-
39
- await packageManagerExecute(
40
- environment,
41
- resolve(targetDir),
42
- options.packageManager,
43
- 'shadcn@latest',
44
- ['add', '--silent', '--yes', ...Array.from(shadcnComponents)],
45
- )
46
-
47
- environment.finishStep(
48
- 'install-shadcn-components',
49
- 'Shadcn components installed',
50
- )
51
- s.stop(`Installed additional shadcn components`)
52
- }
53
- }
54
- }
@@ -1,69 +0,0 @@
1
- import { FILE_ROUTER } from './constants.js'
2
- import { sortObject } from './utils.js'
3
-
4
- import type { Options } from './types.js'
5
-
6
- export function mergePackageJSON(
7
- packageJSON: Record<string, any>,
8
- overlayPackageJSON?: Record<string, any>,
9
- ) {
10
- return {
11
- ...packageJSON,
12
- dependencies: {
13
- ...packageJSON.dependencies,
14
- ...(overlayPackageJSON?.dependencies || {}),
15
- },
16
- devDependencies: {
17
- ...packageJSON.devDependencies,
18
- ...(overlayPackageJSON?.devDependencies || {}),
19
- },
20
- scripts: {
21
- ...packageJSON.scripts,
22
- ...(overlayPackageJSON?.scripts || {}),
23
- },
24
- }
25
- }
26
-
27
- export function createPackageJSON(options: Options) {
28
- let packageJSON = {
29
- ...JSON.parse(JSON.stringify(options.framework.basePackageJSON)),
30
- name: options.projectName,
31
- }
32
-
33
- const additions: Array<Record<string, any> | undefined> = [
34
- options.typescript
35
- ? options.framework.optionalPackages.typescript
36
- : undefined,
37
- options.tailwind
38
- ? options.framework.optionalPackages.tailwindcss
39
- : undefined,
40
- options.mode === FILE_ROUTER
41
- ? options.framework.optionalPackages['file-router']
42
- : undefined,
43
- ]
44
- for (const addition of additions.filter(Boolean)) {
45
- packageJSON = mergePackageJSON(packageJSON, addition)
46
- }
47
-
48
- for (const addOn of options.chosenAddOns.map(
49
- (addOn) => addOn.packageAdditions,
50
- )) {
51
- packageJSON = mergePackageJSON(packageJSON, addOn)
52
- }
53
-
54
- if (options.starter) {
55
- packageJSON = mergePackageJSON(
56
- packageJSON,
57
- options.starter.packageAdditions,
58
- )
59
- }
60
-
61
- packageJSON.dependencies = sortObject(
62
- (packageJSON.dependencies ?? {}) as Record<string, string>,
63
- )
64
- packageJSON.devDependencies = sortObject(
65
- (packageJSON.devDependencies ?? {}) as Record<string, string>,
66
- )
67
-
68
- return packageJSON
69
- }
@@ -1,36 +0,0 @@
1
- import { rimrafNodeModules } from './rimraf-node-modules.js'
2
-
3
- import type { Environment, Options } from '../types.js'
4
-
5
- const specialStepsLookup: Record<
6
- string,
7
- (environment: Environment, options: Options) => Promise<void>
8
- > = {
9
- 'rimraf-node-modules': rimrafNodeModules,
10
- }
11
-
12
- export async function runSpecialSteps(
13
- environment: Environment,
14
- options: Options,
15
- specialSteps: Array<string>,
16
- ) {
17
- if (specialSteps.length) {
18
- environment.startStep({
19
- id: 'special-steps',
20
- type: 'command',
21
- message: 'Removing node_modules...',
22
- })
23
-
24
- for (const step of specialSteps) {
25
- const stepFunction = specialStepsLookup[step]
26
- /* eslint-disable @typescript-eslint/no-unnecessary-condition */
27
- if (stepFunction) {
28
- await stepFunction(environment, options)
29
- } else {
30
- environment.error(`Special step ${step} not found`)
31
- }
32
- }
33
-
34
- environment.finishStep('special-steps', 'Special steps complete')
35
- }
36
- }
@@ -1,25 +0,0 @@
1
- import { resolve } from 'node:path'
2
-
3
- import type { Environment, Options } from '../types.js'
4
-
5
- const lockFiles = ['package-lock.json', 'yarn.lock', 'pnpm-lock.yaml']
6
-
7
- export async function rimrafNodeModules(
8
- environment: Environment,
9
- options: Options,
10
- ) {
11
- environment.startStep({
12
- id: 'special-steps',
13
- type: 'command',
14
- message: 'Removing node_modules...',
15
- })
16
-
17
- await environment.rimraf(resolve(options.targetDir, 'node_modules'))
18
-
19
- for (const lockFile of lockFiles) {
20
- const lockFilePath = resolve(options.targetDir, lockFile)
21
- if (environment.exists(lockFilePath)) {
22
- await environment.deleteFile(lockFilePath)
23
- }
24
- }
25
- }