@tanstack/cta-engine 0.10.0-alpha.17 → 0.10.0-alpha.19

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 (314) hide show
  1. package/dist/add-ons.js +8 -73
  2. package/dist/{add.js → add-to-app.js} +19 -19
  3. package/dist/config-file.js +6 -3
  4. package/dist/constants.js +0 -2
  5. package/dist/create-app.js +67 -460
  6. package/dist/environment.js +11 -26
  7. package/dist/file-helpers.js +59 -0
  8. package/dist/frameworks.js +78 -0
  9. package/dist/index.js +10 -1
  10. package/dist/integrations/git.js +4 -0
  11. package/dist/integrations/shadcn.js +27 -0
  12. package/dist/package-json.js +45 -0
  13. package/dist/package-manager.js +51 -6
  14. package/dist/template-file.js +122 -0
  15. package/dist/types/add-ons.d.ts +2 -6
  16. package/dist/types/add-to-app.d.ts +4 -0
  17. package/dist/types/config-file.d.ts +3 -2
  18. package/dist/types/constants.d.ts +0 -3
  19. package/dist/types/file-helpers.d.ts +5 -0
  20. package/dist/types/frameworks.d.ts +5 -0
  21. package/dist/types/index.d.ts +13 -1
  22. package/dist/types/integrations/git.d.ts +2 -0
  23. package/dist/types/integrations/shadcn.d.ts +2 -0
  24. package/dist/types/package-json.d.ts +2 -0
  25. package/dist/types/package-manager.d.ts +14 -1
  26. package/dist/types/template-file.d.ts +2 -0
  27. package/dist/types/types.d.ts +85 -63
  28. package/dist/types/utils.d.ts +5 -0
  29. package/dist/utils.js +9 -0
  30. package/package.json +4 -13
  31. package/src/add-ons.ts +11 -104
  32. package/src/{add.ts → add-to-app.ts} +29 -35
  33. package/src/config-file.ts +12 -6
  34. package/src/constants.ts +0 -5
  35. package/src/create-app.ts +125 -736
  36. package/src/environment.ts +12 -27
  37. package/src/file-helpers.ts +73 -0
  38. package/src/frameworks.ts +114 -0
  39. package/src/index.ts +42 -1
  40. package/src/integrations/git.ts +7 -0
  41. package/src/integrations/shadcn.ts +44 -0
  42. package/src/package-json.ts +62 -0
  43. package/src/package-manager.ts +80 -9
  44. package/src/template-file.ts +165 -0
  45. package/src/types.ts +100 -69
  46. package/src/utils.ts +17 -0
  47. package/tests/add-ons.test.ts +67 -0
  48. package/tests/config-file.test.ts +64 -0
  49. package/tests/create-app.test.ts +144 -0
  50. package/tests/environment.test.ts +96 -0
  51. package/tests/file-helper.test.ts +90 -0
  52. package/tests/frameworks.test.ts +95 -0
  53. package/tests/index.test.ts +9 -0
  54. package/tests/integrations/git.test.ts +20 -0
  55. package/tests/integrations/shadcn.test.ts +106 -0
  56. package/tests/package-json.test.ts +63 -0
  57. package/tests/package-manager.test.ts +154 -0
  58. package/tests/template-file.test.ts +215 -0
  59. package/tests/utils.test.ts +23 -0
  60. package/vitest.config.ts +19 -0
  61. package/dist/cli.js +0 -125
  62. package/dist/custom-add-on.js +0 -254
  63. package/dist/file-helper.js +0 -18
  64. package/dist/mcp.js +0 -229
  65. package/dist/options.js +0 -330
  66. package/dist/templates.js +0 -6
  67. package/dist/toolchain.js +0 -6
  68. package/dist/types/add.d.ts +0 -3
  69. package/dist/types/cli.d.ts +0 -7
  70. package/dist/types/custom-add-on.d.ts +0 -3
  71. package/dist/types/file-helper.d.ts +0 -2
  72. package/dist/types/mcp.d.ts +0 -7
  73. package/dist/types/options.d.ts +0 -6
  74. package/dist/types/templates.d.ts +0 -1
  75. package/dist/types/toolchain.d.ts +0 -3
  76. package/src/cli.ts +0 -196
  77. package/src/custom-add-on.ts +0 -325
  78. package/src/file-helper.ts +0 -20
  79. package/src/mcp.ts +0 -302
  80. package/src/options.ts +0 -410
  81. package/src/templates.ts +0 -7
  82. package/src/toolchain.ts +0 -7
  83. package/templates/react/add-on/clerk/README.md +0 -3
  84. package/templates/react/add-on/clerk/assets/_dot_env.local.append +0 -2
  85. package/templates/react/add-on/clerk/assets/src/integrations/clerk/header-user.tsx +0 -19
  86. package/templates/react/add-on/clerk/assets/src/integrations/clerk/provider.tsx +0 -18
  87. package/templates/react/add-on/clerk/assets/src/routes/demo.clerk.tsx +0 -20
  88. package/templates/react/add-on/clerk/info.json +0 -13
  89. package/templates/react/add-on/clerk/package.json +0 -5
  90. package/templates/react/add-on/convex/README.md +0 -4
  91. package/templates/react/add-on/convex/assets/_dot_cursorrules.append +0 -93
  92. package/templates/react/add-on/convex/assets/_dot_env.local.append +0 -3
  93. package/templates/react/add-on/convex/assets/convex/products.ts +0 -8
  94. package/templates/react/add-on/convex/assets/convex/schema.ts +0 -10
  95. package/templates/react/add-on/convex/assets/src/integrations/convex/provider.tsx +0 -20
  96. package/templates/react/add-on/convex/assets/src/routes/demo.convex.tsx +0 -33
  97. package/templates/react/add-on/convex/info.json +0 -13
  98. package/templates/react/add-on/convex/package.json +0 -6
  99. package/templates/react/add-on/form/assets/src/components/demo.FormComponents.tsx.ejs +0 -300
  100. package/templates/react/add-on/form/assets/src/hooks/demo.form-context.ts +0 -4
  101. package/templates/react/add-on/form/assets/src/hooks/demo.form.ts +0 -22
  102. package/templates/react/add-on/form/assets/src/routes/demo.form.address.tsx.ejs +0 -213
  103. package/templates/react/add-on/form/assets/src/routes/demo.form.simple.tsx.ejs +0 -77
  104. package/templates/react/add-on/form/info.json +0 -26
  105. package/templates/react/add-on/form/package.json +0 -6
  106. package/templates/react/add-on/module-federation/assets/module-federation.config.js.ejs +0 -31
  107. package/templates/react/add-on/module-federation/assets/src/demo-mf-component.tsx +0 -3
  108. package/templates/react/add-on/module-federation/assets/src/demo-mf-self-contained.tsx +0 -11
  109. package/templates/react/add-on/module-federation/info.json +0 -7
  110. package/templates/react/add-on/module-federation/package.json +0 -5
  111. package/templates/react/add-on/netlify/README.md +0 -11
  112. package/templates/react/add-on/netlify/info.json +0 -7
  113. package/templates/react/add-on/sentry/assets/_dot_cursorrules.append +0 -22
  114. package/templates/react/add-on/sentry/assets/_dot_env.local.append +0 -2
  115. package/templates/react/add-on/sentry/assets/src/app/global-middleware.ts +0 -25
  116. package/templates/react/add-on/sentry/assets/src/routes/demo.sentry.testing.tsx +0 -480
  117. package/templates/react/add-on/sentry/info.json +0 -14
  118. package/templates/react/add-on/sentry/package.json +0 -7
  119. package/templates/react/add-on/shadcn/README.md +0 -7
  120. package/templates/react/add-on/shadcn/assets/_dot_cursorrules.append +0 -7
  121. package/templates/react/add-on/shadcn/assets/components.json +0 -21
  122. package/templates/react/add-on/shadcn/assets/src/lib/utils.ts +0 -6
  123. package/templates/react/add-on/shadcn/assets/src/styles.css +0 -138
  124. package/templates/react/add-on/shadcn/info.json +0 -7
  125. package/templates/react/add-on/shadcn/package.json +0 -9
  126. package/templates/react/add-on/start/assets/_dot_gitignore.append +0 -2
  127. package/templates/react/add-on/start/assets/app.config.ts.ejs +0 -19
  128. package/templates/react/add-on/start/assets/src/api.ts +0 -6
  129. package/templates/react/add-on/start/assets/src/client.tsx +0 -8
  130. package/templates/react/add-on/start/assets/src/router.tsx.ejs +0 -77
  131. package/templates/react/add-on/start/assets/src/routes/api.demo-names.ts +0 -11
  132. package/templates/react/add-on/start/assets/src/routes/demo.start.api-request.tsx.ejs +0 -33
  133. package/templates/react/add-on/start/assets/src/routes/demo.start.server-funcs.tsx +0 -50
  134. package/templates/react/add-on/start/assets/src/ssr.tsx +0 -12
  135. package/templates/react/add-on/start/info.json +0 -18
  136. package/templates/react/add-on/start/package.json +0 -13
  137. package/templates/react/add-on/store/assets/src/lib/demo-store.ts +0 -13
  138. package/templates/react/add-on/store/assets/src/routes/demo.store.tsx.ejs +0 -75
  139. package/templates/react/add-on/store/info.json +0 -13
  140. package/templates/react/add-on/store/package.json +0 -6
  141. package/templates/react/add-on/t3env/README.md +0 -16
  142. package/templates/react/add-on/t3env/assets/src/env.ts +0 -39
  143. package/templates/react/add-on/t3env/info.json +0 -10
  144. package/templates/react/add-on/t3env/package.json +0 -6
  145. package/templates/react/add-on/tRPC/assets/src/integrations/trpc/init.ts +0 -9
  146. package/templates/react/add-on/tRPC/assets/src/integrations/trpc/react.ts +0 -4
  147. package/templates/react/add-on/tRPC/assets/src/integrations/trpc/router.ts +0 -18
  148. package/templates/react/add-on/tRPC/assets/src/routes/api.trpc.$.tsx +0 -16
  149. package/templates/react/add-on/tRPC/info.json +0 -9
  150. package/templates/react/add-on/tRPC/package.json +0 -9
  151. package/templates/react/add-on/table/assets/src/data/demo-table-data.ts +0 -50
  152. package/templates/react/add-on/table/assets/src/routes/demo.table.tsx.ejs +0 -373
  153. package/templates/react/add-on/table/info.json +0 -13
  154. package/templates/react/add-on/table/package.json +0 -7
  155. package/templates/react/add-on/tanstack-query/assets/src/integrations/tanstack-query/layout.tsx +0 -5
  156. package/templates/react/add-on/tanstack-query/assets/src/integrations/tanstack-query/root-provider.tsx.ejs +0 -70
  157. package/templates/react/add-on/tanstack-query/assets/src/routes/demo.tanstack-query.tsx.ejs +0 -53
  158. package/templates/react/add-on/tanstack-query/info.json +0 -13
  159. package/templates/react/add-on/tanstack-query/package.json +0 -6
  160. package/templates/react/base/README.md.ejs +0 -558
  161. package/templates/react/base/_dot_gitignore +0 -5
  162. package/templates/react/base/_dot_vscode/settings.biome.json +0 -38
  163. package/templates/react/base/_dot_vscode/settings.json +0 -11
  164. package/templates/react/base/index.html.ejs +0 -20
  165. package/templates/react/base/package.biome.json +0 -10
  166. package/templates/react/base/package.eslintprettier.json +0 -11
  167. package/templates/react/base/package.json +0 -30
  168. package/templates/react/base/package.ts.json +0 -7
  169. package/templates/react/base/package.tw.json +0 -6
  170. package/templates/react/base/public/favicon.ico +0 -0
  171. package/templates/react/base/public/logo192.png +0 -0
  172. package/templates/react/base/public/logo512.png +0 -0
  173. package/templates/react/base/public/manifest.json +0 -25
  174. package/templates/react/base/public/robots.txt +0 -3
  175. package/templates/react/base/src/App.css +0 -38
  176. package/templates/react/base/src/App.test.tsx.ejs +0 -10
  177. package/templates/react/base/src/App.tsx.ejs +0 -74
  178. package/templates/react/base/src/components/Header.tsx.ejs +0 -27
  179. package/templates/react/base/src/logo.svg +0 -44
  180. package/templates/react/base/src/reportWebVitals.ts.ejs +0 -28
  181. package/templates/react/base/src/styles.css.ejs +0 -15
  182. package/templates/react/base/toolchain/.prettierignore +0 -3
  183. package/templates/react/base/toolchain/biome.json +0 -31
  184. package/templates/react/base/toolchain/eslint.config.js +0 -5
  185. package/templates/react/base/toolchain/prettier.config.js +0 -10
  186. package/templates/react/base/tsconfig.json.ejs +0 -29
  187. package/templates/react/base/vite.config.js.ejs +0 -23
  188. package/templates/react/code-router/src/main.tsx.ejs +0 -92
  189. package/templates/react/example/tanchat/README.md +0 -37
  190. package/templates/react/example/tanchat/assets/_dot_env.local.append +0 -2
  191. package/templates/react/example/tanchat/assets/public/example-guitar-flowers.jpg +0 -0
  192. package/templates/react/example/tanchat/assets/public/example-guitar-motherboard.jpg +0 -0
  193. package/templates/react/example/tanchat/assets/public/example-guitar-racing.jpg +0 -0
  194. package/templates/react/example/tanchat/assets/public/example-guitar-steamer-trunk.jpg +0 -0
  195. package/templates/react/example/tanchat/assets/public/example-guitar-superhero.jpg +0 -0
  196. package/templates/react/example/tanchat/assets/public/example-guitar-traveling.jpg +0 -0
  197. package/templates/react/example/tanchat/assets/public/example-guitar-video-games.jpg +0 -0
  198. package/templates/react/example/tanchat/assets/src/components/example-AIAssistant.tsx +0 -173
  199. package/templates/react/example/tanchat/assets/src/components/example-GuitarRecommendation.tsx +0 -47
  200. package/templates/react/example/tanchat/assets/src/data/example-guitars.ts +0 -83
  201. package/templates/react/example/tanchat/assets/src/demo.index.css +0 -220
  202. package/templates/react/example/tanchat/assets/src/integrations/tanchat/header-user.tsx +0 -5
  203. package/templates/react/example/tanchat/assets/src/routes/api.messages.ts +0 -24
  204. package/templates/react/example/tanchat/assets/src/routes/api.sse.ts +0 -23
  205. package/templates/react/example/tanchat/assets/src/routes/example.chat.tsx +0 -159
  206. package/templates/react/example/tanchat/assets/src/routes/example.guitars/$guitarId.tsx +0 -50
  207. package/templates/react/example/tanchat/assets/src/routes/example.guitars/index.tsx +0 -54
  208. package/templates/react/example/tanchat/assets/src/store/example-assistant.ts +0 -3
  209. package/templates/react/example/tanchat/assets/src/utils/demo.ai.ts +0 -62
  210. package/templates/react/example/tanchat/assets/src/utils/demo.sse.ts +0 -31
  211. package/templates/react/example/tanchat/assets/src/utils/demo.tools.ts +0 -47
  212. package/templates/react/example/tanchat/info.json +0 -19
  213. package/templates/react/example/tanchat/package.json +0 -16
  214. package/templates/react/file-router/package.fr.json +0 -5
  215. package/templates/react/file-router/src/main.tsx.ejs +0 -55
  216. package/templates/react/file-router/src/routes/__root.tsx.ejs +0 -82
  217. package/templates/solid/add-on/form/assets/src/routes/demo.form.tsx.ejs +0 -352
  218. package/templates/solid/add-on/form/info.json +0 -13
  219. package/templates/solid/add-on/form/package.json +0 -5
  220. package/templates/solid/add-on/module-federation/assets/module-federation.config.js.ejs +0 -27
  221. package/templates/solid/add-on/module-federation/assets/src/demo-mf-component.tsx +0 -3
  222. package/templates/solid/add-on/module-federation/assets/src/demo-mf-self-contained.tsx +0 -9
  223. package/templates/solid/add-on/module-federation/info.json +0 -7
  224. package/templates/solid/add-on/module-federation/package.json +0 -5
  225. package/templates/solid/add-on/sentry/assets/_dot_cursorrules.append +0 -22
  226. package/templates/solid/add-on/sentry/assets/_dot_env.local.append +0 -2
  227. package/templates/solid/add-on/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +0 -20
  228. package/templates/solid/add-on/sentry/info.json +0 -13
  229. package/templates/solid/add-on/sentry/package.json +0 -5
  230. package/templates/solid/add-on/solid-ui/README.md +0 -9
  231. package/templates/solid/add-on/solid-ui/assets/src/lib/utils.ts +0 -6
  232. package/templates/solid/add-on/solid-ui/assets/src/styles.css +0 -138
  233. package/templates/solid/add-on/solid-ui/assets/ui.config.json +0 -13
  234. package/templates/solid/add-on/solid-ui/info.json +0 -11
  235. package/templates/solid/add-on/solid-ui/package.json +0 -9
  236. package/templates/solid/add-on/start/assets/app.config.ts +0 -16
  237. package/templates/solid/add-on/start/assets/src/api.ts +0 -6
  238. package/templates/solid/add-on/start/assets/src/client.tsx +0 -7
  239. package/templates/solid/add-on/start/assets/src/router.tsx.ejs +0 -24
  240. package/templates/solid/add-on/start/assets/src/routes/demo.start.server-funcs.tsx +0 -49
  241. package/templates/solid/add-on/start/assets/src/ssr.tsx +0 -12
  242. package/templates/solid/add-on/start/info.json +0 -14
  243. package/templates/solid/add-on/start/package.json +0 -12
  244. package/templates/solid/add-on/store/assets/src/lib/demo-store.ts +0 -13
  245. package/templates/solid/add-on/store/assets/src/routes/demo.store.tsx.ejs +0 -77
  246. package/templates/solid/add-on/store/info.json +0 -13
  247. package/templates/solid/add-on/store/package.json +0 -6
  248. package/templates/solid/add-on/t3env/README.md +0 -16
  249. package/templates/solid/add-on/t3env/assets/src/env.ts +0 -39
  250. package/templates/solid/add-on/t3env/info.json +0 -10
  251. package/templates/solid/add-on/t3env/package.json +0 -6
  252. package/templates/solid/add-on/tanstack-query/assets/src/integrations/tanstack-query/header-user.tsx +0 -5
  253. package/templates/solid/add-on/tanstack-query/assets/src/integrations/tanstack-query/provider.tsx +0 -15
  254. package/templates/solid/add-on/tanstack-query/assets/src/routes/demo.tanstack-query.tsx +0 -30
  255. package/templates/solid/add-on/tanstack-query/info.json +0 -13
  256. package/templates/solid/add-on/tanstack-query/package.json +0 -6
  257. package/templates/solid/base/README.md.ejs +0 -215
  258. package/templates/solid/base/_dot_cursorrules.append +0 -35
  259. package/templates/solid/base/_dot_gitignore +0 -5
  260. package/templates/solid/base/_dot_vscode/settings.biome.json +0 -38
  261. package/templates/solid/base/_dot_vscode/settings.json +0 -11
  262. package/templates/solid/base/index.html.ejs +0 -20
  263. package/templates/solid/base/package.biome.json +0 -10
  264. package/templates/solid/base/package.eslintprettier.json +0 -11
  265. package/templates/solid/base/package.json +0 -23
  266. package/templates/solid/base/package.ts.json +0 -5
  267. package/templates/solid/base/package.tw.json +0 -6
  268. package/templates/solid/base/public/favicon.ico +0 -0
  269. package/templates/solid/base/public/logo192.png +0 -0
  270. package/templates/solid/base/public/logo512.png +0 -0
  271. package/templates/solid/base/public/manifest.json +0 -25
  272. package/templates/solid/base/public/robots.txt +0 -3
  273. package/templates/solid/base/src/App.css +0 -0
  274. package/templates/solid/base/src/App.tsx.ejs +0 -47
  275. package/templates/solid/base/src/components/Header.tsx.ejs +0 -26
  276. package/templates/solid/base/src/logo.svg +0 -120
  277. package/templates/solid/base/src/styles.css.ejs +0 -15
  278. package/templates/solid/base/toolchain/.prettierignore +0 -3
  279. package/templates/solid/base/toolchain/biome.json +0 -31
  280. package/templates/solid/base/toolchain/eslint.config.js +0 -5
  281. package/templates/solid/base/toolchain/prettier.config.js +0 -10
  282. package/templates/solid/base/tsconfig.json.ejs +0 -31
  283. package/templates/solid/base/vite.config.js.ejs +0 -22
  284. package/templates/solid/code-router/src/main.tsx.ejs +0 -71
  285. package/templates/solid/example/tanchat/README.md +0 -52
  286. package/templates/solid/example/tanchat/assets/ai-streaming-server/README.md +0 -110
  287. package/templates/solid/example/tanchat/assets/ai-streaming-server/_dot_env.example +0 -1
  288. package/templates/solid/example/tanchat/assets/ai-streaming-server/package.json +0 -26
  289. package/templates/solid/example/tanchat/assets/ai-streaming-server/src/index.ts +0 -102
  290. package/templates/solid/example/tanchat/assets/ai-streaming-server/tsconfig.json +0 -15
  291. package/templates/solid/example/tanchat/assets/src/components/demo.SettingsDialog.tsx +0 -149
  292. package/templates/solid/example/tanchat/assets/src/demo.index.css +0 -227
  293. package/templates/solid/example/tanchat/assets/src/lib/demo-store.ts +0 -13
  294. package/templates/solid/example/tanchat/assets/src/routes/example.chat.tsx +0 -435
  295. package/templates/solid/example/tanchat/assets/src/store/demo.hooks.ts +0 -17
  296. package/templates/solid/example/tanchat/assets/src/store/demo.store.ts +0 -133
  297. package/templates/solid/example/tanchat/info.json +0 -14
  298. package/templates/solid/example/tanchat/package.json +0 -7
  299. package/templates/solid/file-router/package.fr.json +0 -5
  300. package/templates/solid/file-router/src/main.tsx.ejs +0 -47
  301. package/templates/solid/file-router/src/routes/__root.tsx.ejs +0 -41
  302. package/templates/solid/file-router/src/routes/index.tsx +0 -43
  303. package/tests/cra.test.ts +0 -293
  304. package/tests/snapshots/cra/cr-js-npm.json +0 -33
  305. package/tests/snapshots/cra/cr-ts-npm.json +0 -34
  306. package/tests/snapshots/cra/cr-ts-start-npm.json +0 -38
  307. package/tests/snapshots/cra/fr-ts-npm.json +0 -34
  308. package/tests/snapshots/cra/fr-ts-tw-npm.json +0 -33
  309. package/tests/snapshots/cra/solid-cr-js-npm.json +0 -31
  310. package/tests/snapshots/cra/solid-cr-ts-npm.json +0 -32
  311. package/tests/snapshots/cra/solid-cr-ts-start-npm.json +0 -36
  312. package/tests/snapshots/cra/solid-fr-ts-npm.json +0 -33
  313. package/tests/snapshots/cra/solid-fr-ts-tw-npm.json +0 -32
  314. package/tests/test-utilities.ts +0 -87
package/dist/add-ons.js CHANGED
@@ -1,73 +1,10 @@
1
- import { readFile } from 'node:fs/promises';
2
- import { existsSync, readdirSync, statSync } from 'node:fs';
3
- import { resolve } from 'node:path';
4
- import chalk from 'chalk';
5
- import { getTemplatesRoot } from './templates.js';
6
- import { DEFAULT_FRAMEWORK } from './constants.js';
7
- import { readFileHelper } from './file-helper.js';
8
- function isDirectory(path) {
9
- return statSync(path).isDirectory();
10
- }
11
- function findFilesRecursively(path, files) {
12
- const dirFiles = readdirSync(path);
13
- for (const file of dirFiles) {
14
- const filePath = resolve(path, file);
15
- if (isDirectory(filePath)) {
16
- findFilesRecursively(filePath, files);
17
- }
18
- else {
19
- files[filePath] = readFileHelper(filePath);
20
- }
21
- }
22
- }
23
- export async function getAllAddOns(framework, template) {
24
- const addOns = [];
25
- for (const type of ['add-on', 'example']) {
26
- const addOnsBase = resolve(getTemplatesRoot(), framework, type);
27
- if (!existsSync(addOnsBase)) {
28
- continue;
29
- }
30
- for (const dir of await readdirSync(addOnsBase).filter((file) => isDirectory(resolve(addOnsBase, file)))) {
31
- const filePath = resolve(addOnsBase, dir, 'info.json');
32
- const fileContent = await readFile(filePath, 'utf-8');
33
- const info = JSON.parse(fileContent);
34
- if (!info.templates.includes(template)) {
35
- continue;
36
- }
37
- let packageAdditions = {};
38
- if (existsSync(resolve(addOnsBase, dir, 'package.json'))) {
39
- packageAdditions = JSON.parse(await readFile(resolve(addOnsBase, dir, 'package.json'), 'utf-8'));
40
- }
41
- let readme;
42
- if (existsSync(resolve(addOnsBase, dir, 'README.md'))) {
43
- readme = await readFile(resolve(addOnsBase, dir, 'README.md'), 'utf-8');
44
- }
45
- const absoluteFiles = {};
46
- const assetsDir = resolve(addOnsBase, dir, 'assets');
47
- if (existsSync(assetsDir)) {
48
- await findFilesRecursively(assetsDir, absoluteFiles);
49
- }
50
- const files = {};
51
- for (const file of Object.keys(absoluteFiles)) {
52
- files[file.replace(assetsDir, '.')] = absoluteFiles[file];
53
- }
54
- addOns.push({
55
- ...info,
56
- id: dir,
57
- type,
58
- packageAdditions,
59
- readme,
60
- files,
61
- deletedFiles: [],
62
- });
63
- }
64
- }
65
- return addOns;
1
+ export function getAllAddOns(framework, template) {
2
+ return framework.getAddOns().filter((a) => a.templates.includes(template));
66
3
  }
67
4
  // Turn the list of chosen add-on IDs into a final list of add-ons by resolving dependencies
68
5
  export async function finalizeAddOns(framework, template, chosenAddOnIDs) {
69
6
  const finalAddOnIDs = new Set(chosenAddOnIDs);
70
- const addOns = await getAllAddOns(framework, template);
7
+ const addOns = getAllAddOns(framework, template);
71
8
  for (const addOnID of finalAddOnIDs) {
72
9
  let addOn;
73
10
  const localAddOn = addOns.find((a) => a.id === addOnID);
@@ -92,12 +29,6 @@ export async function finalizeAddOns(framework, template, chosenAddOnIDs) {
92
29
  const finalAddOns = [...finalAddOnIDs].map((id) => addOns.find((a) => a.id === id));
93
30
  return finalAddOns;
94
31
  }
95
- export async function listAddOns(options, { forcedMode, forcedAddOns = [], }) {
96
- const addOns = await getAllAddOns(options.framework || DEFAULT_FRAMEWORK, forcedMode || options.template || 'typescript');
97
- for (const addOn of addOns.filter((a) => !forcedAddOns.includes(a.id))) {
98
- console.log(`${chalk.bold(addOn.id)}: ${addOn.description}`);
99
- }
100
- }
101
32
  function loadAddOn(addOn) {
102
33
  return addOn;
103
34
  }
@@ -105,5 +36,9 @@ export async function loadRemoteAddOn(url) {
105
36
  const response = await fetch(url);
106
37
  const fileContent = await response.json();
107
38
  fileContent.id = url;
108
- return fileContent;
39
+ return {
40
+ ...fileContent,
41
+ getFiles: () => Promise.resolve(Object.keys(fileContent.files)),
42
+ getFileContents: (path) => Promise.resolve(fileContent.files[path]),
43
+ };
109
44
  }
@@ -1,15 +1,14 @@
1
1
  import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
2
  import { existsSync, statSync } from 'node:fs';
3
3
  import { basename, dirname, resolve } from 'node:path';
4
- import chalk from 'chalk';
5
4
  import { execa, execaSync } from 'execa';
6
- import { cancel, confirm, intro, isCancel, log, outro, spinner, } from '@clack/prompts';
7
5
  import { CONFIG_FILE } from './constants.js';
6
+ import { finalizeAddOns } from './add-ons.js';
7
+ import { getFrameworkById } from './frameworks.js';
8
8
  import { createDefaultEnvironment, createMemoryEnvironment, } from './environment.js';
9
9
  import { createApp } from './create-app.js';
10
- import { finalizeAddOns } from './add-ons.js';
11
- import { sortObject } from './utils.js';
12
10
  import { readConfigFile, writeConfigFile } from './config-file.js';
11
+ import { sortObject } from './utils.js';
13
12
  function isDirectory(path) {
14
13
  return statSync(path).isDirectory();
15
14
  }
@@ -18,10 +17,16 @@ async function hasPendingGitChanges() {
18
17
  return status.stdout.length > 0;
19
18
  }
20
19
  async function createOptions(json, addOns) {
20
+ const framework = getFrameworkById(json.framework);
21
21
  return {
22
22
  ...json,
23
+ framework,
23
24
  tailwind: true,
24
- chosenAddOns: await finalizeAddOns(json.framework, json.mode, [...json.existingAddOns, ...addOns]),
25
+ addOns: true,
26
+ chosenAddOns: await finalizeAddOns(framework, json.mode, [
27
+ ...json.existingAddOns,
28
+ ...addOns,
29
+ ]),
25
30
  };
26
31
  }
27
32
  async function runCreateApp(options) {
@@ -34,19 +39,17 @@ async function runCreateApp(options) {
34
39
  });
35
40
  return output;
36
41
  }
37
- export async function add(addOns, { silent = false, } = {}) {
42
+ export async function addToApp(addOns, { silent = false, } = {}, environment) {
38
43
  const persistedOptions = await readConfigFile(process.cwd());
39
44
  if (!persistedOptions) {
40
- console.error(`${chalk.red('There is no .cta.json file in your project.')}
41
-
42
- This is probably because this was created with an older version of create-tsrouter-app.`);
45
+ environment.error('There is no .cta.json file in your project.', 'This is probably because this was created with an older version of create-tsrouter-app.');
43
46
  return;
44
47
  }
45
48
  if (!silent) {
46
- intro(`Adding ${addOns.join(', ')} to the project...`);
49
+ environment.intro(`Adding ${addOns.join(', ')} to the project...`);
47
50
  }
48
51
  if (await hasPendingGitChanges()) {
49
- log.error(`${chalk.red('You have pending git changes.')} Please commit or stash them before adding add-ons.`);
52
+ environment.error('You have pending git changes.', 'Please commit or stash them before adding add-ons.');
50
53
  return;
51
54
  }
52
55
  const newOptions = await createOptions(persistedOptions, addOns);
@@ -72,12 +75,9 @@ This is probably because this was created with an older version of create-tsrout
72
75
  }
73
76
  }
74
77
  if (overwrittenFiles.length > 0 && !silent) {
75
- log.warn(`${chalk.yellow('The following will be overwritten:')}\n${overwrittenFiles.join('\n')}`);
76
- const shouldContinue = await confirm({
77
- message: 'Do you want to continue?',
78
- });
79
- if (isCancel(shouldContinue)) {
80
- cancel('Operation cancelled.');
78
+ environment.warn('The following will be overwritten:', overwrittenFiles.join('\n'));
79
+ const shouldContinue = await environment.confirm('Do you want to continue?');
80
+ if (!shouldContinue) {
81
81
  process.exit(0);
82
82
  }
83
83
  }
@@ -115,11 +115,11 @@ This is probably because this was created with an older version of create-tsrout
115
115
  }
116
116
  const realEnvironment = createDefaultEnvironment();
117
117
  writeConfigFile(realEnvironment, process.cwd(), newOptions);
118
- const s = silent ? null : spinner();
118
+ const s = silent ? null : environment.spinner();
119
119
  s?.start(`Installing dependencies via ${newOptions.packageManager}...`);
120
120
  await realEnvironment.execute(newOptions.packageManager, ['install'], resolve(process.cwd()));
121
121
  s?.stop(`Installed dependencies`);
122
122
  if (!silent) {
123
- outro('Add-ons added successfully!');
123
+ environment.outro('Add-ons added successfully!');
124
124
  }
125
125
  }
@@ -2,19 +2,22 @@ import { readFile } from 'node:fs/promises';
2
2
  import { resolve } from 'node:path';
3
3
  import { CONFIG_FILE } from './constants.js';
4
4
  export async function writeConfigFile(environment, targetDir, options) {
5
+ /* eslint-disable unused-imports/no-unused-vars */
6
+ const { addOns, chosenAddOns, framework, ...rest } = options;
7
+ /* eslint-enable unused-imports/no-unused-vars */
5
8
  const persistedOptions = {
6
- ...options,
9
+ ...rest,
7
10
  version: 1,
11
+ framework: options.framework.id,
8
12
  existingAddOns: options.chosenAddOns.map((addOn) => addOn.id),
9
13
  };
10
- delete persistedOptions.addOns;
11
- delete persistedOptions.chosenAddOns;
12
14
  await environment.writeFile(resolve(targetDir, CONFIG_FILE), JSON.stringify(persistedOptions, null, 2));
13
15
  }
14
16
  export async function readConfigFile(targetDir) {
15
17
  try {
16
18
  const configFile = resolve(targetDir, CONFIG_FILE);
17
19
  const config = await readFile(configFile, 'utf8');
20
+ // TODO: Look for old config files and convert them to the new format
18
21
  return JSON.parse(config);
19
22
  }
20
23
  catch {
package/dist/constants.js CHANGED
@@ -1,5 +1,3 @@
1
1
  export const CODE_ROUTER = 'code-router';
2
2
  export const FILE_ROUTER = 'file-router';
3
- export const SUPPORTED_FRAMEWORKS = ['solid', 'react'];
4
- export const DEFAULT_FRAMEWORK = 'react';
5
3
  export const CONFIG_FILE = '.cta.json';