@tanstack/cta-engine 0.10.0-alpha.15 → 0.10.0-alpha.16

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 (294) 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 +76 -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 +8 -3
  10. package/dist/integrations/git.js +4 -0
  11. package/dist/integrations/shadcn.js +27 -0
  12. package/dist/package-json.js +46 -0
  13. package/dist/package-manager.js +51 -6
  14. package/dist/template-file.js +108 -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 +10 -4
  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 +83 -62
  28. package/dist/types/utils.d.ts +5 -0
  29. package/dist/utils.js +9 -0
  30. package/package.json +3 -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 +126 -727
  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 +35 -4
  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 +146 -0
  45. package/src/types.ts +97 -68
  46. package/src/utils.ts +17 -0
  47. package/tests/file-helper.test.ts +37 -0
  48. package/tests/package-manager.test.ts +154 -0
  49. package/dist/cli.js +0 -126
  50. package/dist/custom-add-on.js +0 -256
  51. package/dist/file-helper.js +0 -18
  52. package/dist/mcp.js +0 -229
  53. package/dist/options.js +0 -328
  54. package/dist/templates.js +0 -6
  55. package/dist/toolchain.js +0 -6
  56. package/dist/types/add.d.ts +0 -3
  57. package/dist/types/cli.d.ts +0 -6
  58. package/dist/types/custom-add-on.d.ts +0 -6
  59. package/dist/types/file-helper.d.ts +0 -2
  60. package/dist/types/mcp.d.ts +0 -7
  61. package/dist/types/options.d.ts +0 -6
  62. package/dist/types/templates.d.ts +0 -1
  63. package/dist/types/toolchain.d.ts +0 -3
  64. package/src/cli.ts +0 -196
  65. package/src/custom-add-on.ts +0 -327
  66. package/src/file-helper.ts +0 -20
  67. package/src/mcp.ts +0 -302
  68. package/src/options.ts +0 -399
  69. package/src/templates.ts +0 -7
  70. package/src/toolchain.ts +0 -7
  71. package/templates/react/add-on/clerk/README.md +0 -3
  72. package/templates/react/add-on/clerk/assets/_dot_env.local.append +0 -2
  73. package/templates/react/add-on/clerk/assets/src/integrations/clerk/header-user.tsx +0 -19
  74. package/templates/react/add-on/clerk/assets/src/integrations/clerk/provider.tsx +0 -18
  75. package/templates/react/add-on/clerk/assets/src/routes/demo.clerk.tsx +0 -20
  76. package/templates/react/add-on/clerk/info.json +0 -13
  77. package/templates/react/add-on/clerk/package.json +0 -5
  78. package/templates/react/add-on/convex/README.md +0 -4
  79. package/templates/react/add-on/convex/assets/_dot_cursorrules.append +0 -93
  80. package/templates/react/add-on/convex/assets/_dot_env.local.append +0 -3
  81. package/templates/react/add-on/convex/assets/convex/products.ts +0 -8
  82. package/templates/react/add-on/convex/assets/convex/schema.ts +0 -10
  83. package/templates/react/add-on/convex/assets/src/integrations/convex/provider.tsx +0 -20
  84. package/templates/react/add-on/convex/assets/src/routes/demo.convex.tsx +0 -33
  85. package/templates/react/add-on/convex/info.json +0 -13
  86. package/templates/react/add-on/convex/package.json +0 -6
  87. package/templates/react/add-on/form/assets/src/components/demo.FormComponents.tsx.ejs +0 -300
  88. package/templates/react/add-on/form/assets/src/hooks/demo.form-context.ts +0 -4
  89. package/templates/react/add-on/form/assets/src/hooks/demo.form.ts +0 -22
  90. package/templates/react/add-on/form/assets/src/routes/demo.form.address.tsx.ejs +0 -213
  91. package/templates/react/add-on/form/assets/src/routes/demo.form.simple.tsx.ejs +0 -77
  92. package/templates/react/add-on/form/info.json +0 -26
  93. package/templates/react/add-on/form/package.json +0 -6
  94. package/templates/react/add-on/module-federation/assets/module-federation.config.js.ejs +0 -31
  95. package/templates/react/add-on/module-federation/assets/src/demo-mf-component.tsx +0 -3
  96. package/templates/react/add-on/module-federation/assets/src/demo-mf-self-contained.tsx +0 -11
  97. package/templates/react/add-on/module-federation/info.json +0 -7
  98. package/templates/react/add-on/module-federation/package.json +0 -5
  99. package/templates/react/add-on/netlify/README.md +0 -11
  100. package/templates/react/add-on/netlify/info.json +0 -7
  101. package/templates/react/add-on/sentry/assets/_dot_cursorrules.append +0 -22
  102. package/templates/react/add-on/sentry/assets/_dot_env.local.append +0 -2
  103. package/templates/react/add-on/sentry/assets/src/app/global-middleware.ts +0 -25
  104. package/templates/react/add-on/sentry/assets/src/routes/demo.sentry.testing.tsx +0 -480
  105. package/templates/react/add-on/sentry/info.json +0 -14
  106. package/templates/react/add-on/sentry/package.json +0 -7
  107. package/templates/react/add-on/shadcn/README.md +0 -7
  108. package/templates/react/add-on/shadcn/assets/_dot_cursorrules.append +0 -7
  109. package/templates/react/add-on/shadcn/assets/components.json +0 -21
  110. package/templates/react/add-on/shadcn/assets/src/lib/utils.ts +0 -6
  111. package/templates/react/add-on/shadcn/assets/src/styles.css +0 -138
  112. package/templates/react/add-on/shadcn/info.json +0 -7
  113. package/templates/react/add-on/shadcn/package.json +0 -9
  114. package/templates/react/add-on/start/assets/_dot_gitignore.append +0 -2
  115. package/templates/react/add-on/start/assets/app.config.ts.ejs +0 -19
  116. package/templates/react/add-on/start/assets/src/api.ts +0 -6
  117. package/templates/react/add-on/start/assets/src/client.tsx +0 -8
  118. package/templates/react/add-on/start/assets/src/router.tsx.ejs +0 -77
  119. package/templates/react/add-on/start/assets/src/routes/api.demo-names.ts +0 -11
  120. package/templates/react/add-on/start/assets/src/routes/demo.start.api-request.tsx.ejs +0 -33
  121. package/templates/react/add-on/start/assets/src/routes/demo.start.server-funcs.tsx +0 -50
  122. package/templates/react/add-on/start/assets/src/ssr.tsx +0 -12
  123. package/templates/react/add-on/start/info.json +0 -18
  124. package/templates/react/add-on/start/package.json +0 -13
  125. package/templates/react/add-on/store/assets/src/lib/demo-store.ts +0 -13
  126. package/templates/react/add-on/store/assets/src/routes/demo.store.tsx.ejs +0 -75
  127. package/templates/react/add-on/store/info.json +0 -13
  128. package/templates/react/add-on/store/package.json +0 -6
  129. package/templates/react/add-on/tRPC/assets/src/integrations/trpc/init.ts +0 -9
  130. package/templates/react/add-on/tRPC/assets/src/integrations/trpc/react.ts +0 -4
  131. package/templates/react/add-on/tRPC/assets/src/integrations/trpc/router.ts +0 -18
  132. package/templates/react/add-on/tRPC/assets/src/routes/api.trpc.$.tsx +0 -16
  133. package/templates/react/add-on/tRPC/info.json +0 -9
  134. package/templates/react/add-on/tRPC/package.json +0 -9
  135. package/templates/react/add-on/table/assets/src/data/demo-table-data.ts +0 -50
  136. package/templates/react/add-on/table/assets/src/routes/demo.table.tsx.ejs +0 -373
  137. package/templates/react/add-on/table/info.json +0 -13
  138. package/templates/react/add-on/table/package.json +0 -7
  139. package/templates/react/add-on/tanstack-query/assets/src/integrations/tanstack-query/layout.tsx +0 -5
  140. package/templates/react/add-on/tanstack-query/assets/src/integrations/tanstack-query/root-provider.tsx.ejs +0 -70
  141. package/templates/react/add-on/tanstack-query/assets/src/routes/demo.tanstack-query.tsx.ejs +0 -53
  142. package/templates/react/add-on/tanstack-query/info.json +0 -13
  143. package/templates/react/add-on/tanstack-query/package.json +0 -6
  144. package/templates/react/base/README.md.ejs +0 -558
  145. package/templates/react/base/_dot_gitignore +0 -5
  146. package/templates/react/base/_dot_vscode/settings.biome.json +0 -38
  147. package/templates/react/base/_dot_vscode/settings.json +0 -11
  148. package/templates/react/base/index.html.ejs +0 -20
  149. package/templates/react/base/package.biome.json +0 -10
  150. package/templates/react/base/package.eslintprettier.json +0 -11
  151. package/templates/react/base/package.json +0 -29
  152. package/templates/react/base/package.ts.json +0 -7
  153. package/templates/react/base/package.tw.json +0 -6
  154. package/templates/react/base/public/favicon.ico +0 -0
  155. package/templates/react/base/public/logo192.png +0 -0
  156. package/templates/react/base/public/logo512.png +0 -0
  157. package/templates/react/base/public/manifest.json +0 -25
  158. package/templates/react/base/public/robots.txt +0 -3
  159. package/templates/react/base/src/App.css +0 -38
  160. package/templates/react/base/src/App.test.tsx.ejs +0 -10
  161. package/templates/react/base/src/App.tsx.ejs +0 -74
  162. package/templates/react/base/src/components/Header.tsx.ejs +0 -27
  163. package/templates/react/base/src/logo.svg +0 -44
  164. package/templates/react/base/src/reportWebVitals.ts.ejs +0 -28
  165. package/templates/react/base/src/styles.css.ejs +0 -15
  166. package/templates/react/base/toolchain/.prettierignore +0 -3
  167. package/templates/react/base/toolchain/biome.json +0 -31
  168. package/templates/react/base/toolchain/eslint.config.js +0 -5
  169. package/templates/react/base/toolchain/prettier.config.js +0 -10
  170. package/templates/react/base/tsconfig.json.ejs +0 -29
  171. package/templates/react/base/vite.config.js.ejs +0 -23
  172. package/templates/react/code-router/src/main.tsx.ejs +0 -92
  173. package/templates/react/example/tanchat/README.md +0 -37
  174. package/templates/react/example/tanchat/assets/_dot_env.local.append +0 -2
  175. package/templates/react/example/tanchat/assets/public/example-guitar-flowers.jpg +0 -0
  176. package/templates/react/example/tanchat/assets/public/example-guitar-motherboard.jpg +0 -0
  177. package/templates/react/example/tanchat/assets/public/example-guitar-racing.jpg +0 -0
  178. package/templates/react/example/tanchat/assets/public/example-guitar-steamer-trunk.jpg +0 -0
  179. package/templates/react/example/tanchat/assets/public/example-guitar-superhero.jpg +0 -0
  180. package/templates/react/example/tanchat/assets/public/example-guitar-traveling.jpg +0 -0
  181. package/templates/react/example/tanchat/assets/public/example-guitar-video-games.jpg +0 -0
  182. package/templates/react/example/tanchat/assets/src/components/example-AIAssistant.tsx +0 -173
  183. package/templates/react/example/tanchat/assets/src/components/example-GuitarRecommendation.tsx +0 -47
  184. package/templates/react/example/tanchat/assets/src/data/example-guitars.ts +0 -83
  185. package/templates/react/example/tanchat/assets/src/demo.index.css +0 -220
  186. package/templates/react/example/tanchat/assets/src/integrations/tanchat/header-user.tsx +0 -5
  187. package/templates/react/example/tanchat/assets/src/routes/api.messages.ts +0 -24
  188. package/templates/react/example/tanchat/assets/src/routes/api.sse.ts +0 -23
  189. package/templates/react/example/tanchat/assets/src/routes/example.chat.tsx +0 -159
  190. package/templates/react/example/tanchat/assets/src/routes/example.guitars/$guitarId.tsx +0 -50
  191. package/templates/react/example/tanchat/assets/src/routes/example.guitars/index.tsx +0 -54
  192. package/templates/react/example/tanchat/assets/src/store/example-assistant.ts +0 -3
  193. package/templates/react/example/tanchat/assets/src/utils/demo.ai.ts +0 -62
  194. package/templates/react/example/tanchat/assets/src/utils/demo.sse.ts +0 -31
  195. package/templates/react/example/tanchat/assets/src/utils/demo.tools.ts +0 -47
  196. package/templates/react/example/tanchat/info.json +0 -19
  197. package/templates/react/example/tanchat/package.json +0 -16
  198. package/templates/react/file-router/package.fr.json +0 -5
  199. package/templates/react/file-router/src/main.tsx.ejs +0 -55
  200. package/templates/react/file-router/src/routes/__root.tsx.ejs +0 -82
  201. package/templates/solid/add-on/form/assets/src/routes/demo.form.tsx.ejs +0 -352
  202. package/templates/solid/add-on/form/info.json +0 -13
  203. package/templates/solid/add-on/form/package.json +0 -5
  204. package/templates/solid/add-on/module-federation/assets/module-federation.config.js.ejs +0 -27
  205. package/templates/solid/add-on/module-federation/assets/src/demo-mf-component.tsx +0 -3
  206. package/templates/solid/add-on/module-federation/assets/src/demo-mf-self-contained.tsx +0 -9
  207. package/templates/solid/add-on/module-federation/info.json +0 -7
  208. package/templates/solid/add-on/module-federation/package.json +0 -5
  209. package/templates/solid/add-on/sentry/assets/_dot_cursorrules.append +0 -22
  210. package/templates/solid/add-on/sentry/assets/_dot_env.local.append +0 -2
  211. package/templates/solid/add-on/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +0 -20
  212. package/templates/solid/add-on/sentry/info.json +0 -13
  213. package/templates/solid/add-on/sentry/package.json +0 -5
  214. package/templates/solid/add-on/solid-ui/README.md +0 -9
  215. package/templates/solid/add-on/solid-ui/assets/src/lib/utils.ts +0 -6
  216. package/templates/solid/add-on/solid-ui/assets/src/styles.css +0 -138
  217. package/templates/solid/add-on/solid-ui/assets/ui.config.json +0 -13
  218. package/templates/solid/add-on/solid-ui/info.json +0 -11
  219. package/templates/solid/add-on/solid-ui/package.json +0 -9
  220. package/templates/solid/add-on/start/assets/app.config.ts +0 -16
  221. package/templates/solid/add-on/start/assets/src/api.ts +0 -6
  222. package/templates/solid/add-on/start/assets/src/client.tsx +0 -7
  223. package/templates/solid/add-on/start/assets/src/router.tsx.ejs +0 -24
  224. package/templates/solid/add-on/start/assets/src/routes/demo.start.server-funcs.tsx +0 -49
  225. package/templates/solid/add-on/start/assets/src/ssr.tsx +0 -12
  226. package/templates/solid/add-on/start/info.json +0 -14
  227. package/templates/solid/add-on/start/package.json +0 -12
  228. package/templates/solid/add-on/store/assets/src/lib/demo-store.ts +0 -13
  229. package/templates/solid/add-on/store/assets/src/routes/demo.store.tsx.ejs +0 -77
  230. package/templates/solid/add-on/store/info.json +0 -13
  231. package/templates/solid/add-on/store/package.json +0 -6
  232. package/templates/solid/add-on/tanstack-query/assets/src/integrations/tanstack-query/header-user.tsx +0 -5
  233. package/templates/solid/add-on/tanstack-query/assets/src/integrations/tanstack-query/provider.tsx +0 -15
  234. package/templates/solid/add-on/tanstack-query/assets/src/routes/demo.tanstack-query.tsx +0 -30
  235. package/templates/solid/add-on/tanstack-query/info.json +0 -13
  236. package/templates/solid/add-on/tanstack-query/package.json +0 -6
  237. package/templates/solid/base/README.md.ejs +0 -215
  238. package/templates/solid/base/_dot_cursorrules.append +0 -35
  239. package/templates/solid/base/_dot_gitignore +0 -5
  240. package/templates/solid/base/_dot_vscode/settings.biome.json +0 -38
  241. package/templates/solid/base/_dot_vscode/settings.json +0 -11
  242. package/templates/solid/base/index.html.ejs +0 -20
  243. package/templates/solid/base/package.biome.json +0 -10
  244. package/templates/solid/base/package.eslintprettier.json +0 -11
  245. package/templates/solid/base/package.json +0 -22
  246. package/templates/solid/base/package.ts.json +0 -5
  247. package/templates/solid/base/package.tw.json +0 -6
  248. package/templates/solid/base/public/favicon.ico +0 -0
  249. package/templates/solid/base/public/logo192.png +0 -0
  250. package/templates/solid/base/public/logo512.png +0 -0
  251. package/templates/solid/base/public/manifest.json +0 -25
  252. package/templates/solid/base/public/robots.txt +0 -3
  253. package/templates/solid/base/src/App.css +0 -0
  254. package/templates/solid/base/src/App.tsx.ejs +0 -47
  255. package/templates/solid/base/src/components/Header.tsx.ejs +0 -26
  256. package/templates/solid/base/src/logo.svg +0 -120
  257. package/templates/solid/base/src/styles.css.ejs +0 -15
  258. package/templates/solid/base/toolchain/.prettierignore +0 -3
  259. package/templates/solid/base/toolchain/biome.json +0 -31
  260. package/templates/solid/base/toolchain/eslint.config.js +0 -5
  261. package/templates/solid/base/toolchain/prettier.config.js +0 -10
  262. package/templates/solid/base/tsconfig.json.ejs +0 -31
  263. package/templates/solid/base/vite.config.js.ejs +0 -22
  264. package/templates/solid/code-router/src/main.tsx.ejs +0 -71
  265. package/templates/solid/example/tanchat/README.md +0 -52
  266. package/templates/solid/example/tanchat/assets/ai-streaming-server/README.md +0 -110
  267. package/templates/solid/example/tanchat/assets/ai-streaming-server/_dot_env.example +0 -1
  268. package/templates/solid/example/tanchat/assets/ai-streaming-server/package.json +0 -26
  269. package/templates/solid/example/tanchat/assets/ai-streaming-server/src/index.ts +0 -102
  270. package/templates/solid/example/tanchat/assets/ai-streaming-server/tsconfig.json +0 -15
  271. package/templates/solid/example/tanchat/assets/src/components/demo.SettingsDialog.tsx +0 -149
  272. package/templates/solid/example/tanchat/assets/src/demo.index.css +0 -227
  273. package/templates/solid/example/tanchat/assets/src/lib/demo-store.ts +0 -13
  274. package/templates/solid/example/tanchat/assets/src/routes/example.chat.tsx +0 -435
  275. package/templates/solid/example/tanchat/assets/src/store/demo.hooks.ts +0 -17
  276. package/templates/solid/example/tanchat/assets/src/store/demo.store.ts +0 -133
  277. package/templates/solid/example/tanchat/info.json +0 -14
  278. package/templates/solid/example/tanchat/package.json +0 -7
  279. package/templates/solid/file-router/package.fr.json +0 -5
  280. package/templates/solid/file-router/src/main.tsx.ejs +0 -47
  281. package/templates/solid/file-router/src/routes/__root.tsx.ejs +0 -41
  282. package/templates/solid/file-router/src/routes/index.tsx +0 -43
  283. package/tests/cra.test.ts +0 -293
  284. package/tests/snapshots/cra/cr-js-npm.json +0 -33
  285. package/tests/snapshots/cra/cr-ts-npm.json +0 -34
  286. package/tests/snapshots/cra/cr-ts-start-npm.json +0 -38
  287. package/tests/snapshots/cra/fr-ts-npm.json +0 -34
  288. package/tests/snapshots/cra/fr-ts-tw-npm.json +0 -33
  289. package/tests/snapshots/cra/solid-cr-js-npm.json +0 -31
  290. package/tests/snapshots/cra/solid-cr-ts-npm.json +0 -32
  291. package/tests/snapshots/cra/solid-cr-ts-start-npm.json +0 -36
  292. package/tests/snapshots/cra/solid-fr-ts-npm.json +0 -33
  293. package/tests/snapshots/cra/solid-fr-ts-tw-npm.json +0 -32
  294. package/tests/test-utilities.ts +0 -87
package/dist/options.js DELETED
@@ -1,328 +0,0 @@
1
- import { cancel, confirm, isCancel, multiselect, select, text, } from '@clack/prompts';
2
- import { DEFAULT_PACKAGE_MANAGER, SUPPORTED_PACKAGE_MANAGERS, getPackageManager, } from './package-manager.js';
3
- import { DEFAULT_TOOLCHAIN, SUPPORTED_TOOLCHAINS } from './toolchain.js';
4
- import { CODE_ROUTER, DEFAULT_FRAMEWORK, FILE_ROUTER } from './constants.js';
5
- import { finalizeAddOns, getAllAddOns, loadRemoteAddOn } from './add-ons.js';
6
- // If all CLI options are provided, use them directly
7
- export async function normalizeOptions(cliOptions, forcedAddOns) {
8
- // in some cases, if you use windows/powershell, the argument for addons
9
- // if sepparated by comma is not really passed as an array, but as a string
10
- // with spaces, We need to normalize this edge case.
11
- if (Array.isArray(cliOptions.addOns) && cliOptions.addOns.length === 1) {
12
- const parseSeparatedArgs = cliOptions.addOns[0].split(' ');
13
- if (parseSeparatedArgs.length > 1) {
14
- cliOptions.addOns = parseSeparatedArgs;
15
- }
16
- }
17
- if (cliOptions.projectName) {
18
- let typescript = cliOptions.template === 'typescript' ||
19
- cliOptions.template === 'file-router' ||
20
- cliOptions.framework === 'solid';
21
- let tailwind = !!cliOptions.tailwind;
22
- if (cliOptions.framework === 'solid') {
23
- tailwind = true;
24
- }
25
- let mode = cliOptions.template === 'file-router' ? FILE_ROUTER : CODE_ROUTER;
26
- const starter = cliOptions.starter
27
- ? (await loadRemoteAddOn(cliOptions.starter))
28
- : undefined;
29
- if (starter) {
30
- tailwind = starter.tailwind;
31
- typescript = starter.typescript;
32
- cliOptions.framework = starter.framework;
33
- mode = starter.mode;
34
- }
35
- let addOns = false;
36
- let chosenAddOns = [];
37
- if (Array.isArray(cliOptions.addOns) ||
38
- starter?.dependsOn ||
39
- forcedAddOns) {
40
- addOns = true;
41
- let finalAddOns = Array.from(new Set([...(starter?.dependsOn || []), ...(forcedAddOns || [])]));
42
- if (cliOptions.addOns && Array.isArray(cliOptions.addOns)) {
43
- finalAddOns = Array.from(new Set([
44
- ...(forcedAddOns || []),
45
- ...finalAddOns,
46
- ...cliOptions.addOns,
47
- ]));
48
- }
49
- chosenAddOns = await finalizeAddOns(cliOptions.framework || DEFAULT_FRAMEWORK, cliOptions.template === 'file-router' ? FILE_ROUTER : CODE_ROUTER, finalAddOns);
50
- tailwind = true;
51
- typescript = true;
52
- }
53
- return {
54
- framework: cliOptions.framework || 'react',
55
- projectName: cliOptions.projectName,
56
- typescript,
57
- tailwind,
58
- packageManager: cliOptions.packageManager ||
59
- getPackageManager() ||
60
- DEFAULT_PACKAGE_MANAGER,
61
- toolchain: cliOptions.toolchain || DEFAULT_TOOLCHAIN,
62
- mode,
63
- git: !!cliOptions.git,
64
- addOns,
65
- chosenAddOns,
66
- variableValues: {},
67
- starter,
68
- };
69
- }
70
- }
71
- async function collectVariables(variables) {
72
- const responses = {};
73
- for (const variable of variables) {
74
- if (variable.type === 'string') {
75
- const response = await text({
76
- message: variable.description,
77
- initialValue: variable.default,
78
- });
79
- if (isCancel(response)) {
80
- cancel('Operation cancelled.');
81
- process.exit(0);
82
- }
83
- responses[variable.name] = response;
84
- }
85
- else if (variable.type === 'number') {
86
- const response = await text({
87
- message: variable.description,
88
- initialValue: variable.default.toString(),
89
- });
90
- if (isCancel(response)) {
91
- cancel('Operation cancelled.');
92
- process.exit(0);
93
- }
94
- responses[variable.name] = Number(response);
95
- }
96
- else {
97
- const response = await confirm({
98
- message: variable.description,
99
- initialValue: variable.default === true,
100
- });
101
- if (isCancel(response)) {
102
- cancel('Operation cancelled.');
103
- process.exit(0);
104
- }
105
- responses[variable.name] = response;
106
- }
107
- }
108
- return responses;
109
- }
110
- export async function promptForOptions(cliOptions, { forcedAddOns = [], forcedMode, }) {
111
- const options = {};
112
- options.framework = cliOptions.framework || DEFAULT_FRAMEWORK;
113
- if (options.framework === 'solid') {
114
- options.typescript = true;
115
- options.tailwind = true;
116
- }
117
- if (cliOptions.addOns) {
118
- options.typescript = true;
119
- }
120
- if (!cliOptions.projectName) {
121
- const value = await text({
122
- message: 'What would you like to name your project?',
123
- defaultValue: 'my-app',
124
- validate(value) {
125
- if (!value) {
126
- return 'Please enter a name';
127
- }
128
- },
129
- });
130
- if (isCancel(value)) {
131
- cancel('Operation cancelled.');
132
- process.exit(0);
133
- }
134
- options.projectName = value;
135
- }
136
- // Router type selection
137
- if (!cliOptions.template && !forcedMode) {
138
- const routerType = await select({
139
- message: 'Select the router type:',
140
- options: [
141
- {
142
- value: FILE_ROUTER,
143
- label: 'File Router - File-based routing structure',
144
- },
145
- {
146
- value: CODE_ROUTER,
147
- label: 'Code Router - Traditional code-based routing',
148
- },
149
- ],
150
- initialValue: FILE_ROUTER,
151
- });
152
- if (isCancel(routerType)) {
153
- cancel('Operation cancelled.');
154
- process.exit(0);
155
- }
156
- options.mode = routerType;
157
- }
158
- else if (forcedMode) {
159
- options.mode = forcedMode === 'file-router' ? FILE_ROUTER : CODE_ROUTER;
160
- options.typescript = options.mode === FILE_ROUTER;
161
- }
162
- else {
163
- options.mode =
164
- cliOptions.template === 'file-router' ? FILE_ROUTER : CODE_ROUTER;
165
- if (options.mode === FILE_ROUTER) {
166
- options.typescript = true;
167
- }
168
- }
169
- // TypeScript selection (if using Code Router)
170
- if (!options.typescript) {
171
- if (options.mode === CODE_ROUTER) {
172
- const typescriptEnable = await confirm({
173
- message: 'Would you like to use TypeScript?',
174
- initialValue: true,
175
- });
176
- if (isCancel(typescriptEnable)) {
177
- cancel('Operation cancelled.');
178
- process.exit(0);
179
- }
180
- options.typescript = typescriptEnable;
181
- }
182
- else {
183
- options.typescript = true;
184
- }
185
- }
186
- // Tailwind selection
187
- if (!cliOptions.tailwind && options.framework === 'react') {
188
- const tailwind = await confirm({
189
- message: 'Would you like to use Tailwind CSS?',
190
- initialValue: true,
191
- });
192
- if (isCancel(tailwind)) {
193
- cancel('Operation cancelled.');
194
- process.exit(0);
195
- }
196
- options.tailwind = tailwind;
197
- }
198
- else {
199
- options.tailwind = options.framework === 'solid' || !!cliOptions.tailwind;
200
- }
201
- // Package manager selection
202
- if (cliOptions.packageManager === undefined) {
203
- const detectedPackageManager = getPackageManager();
204
- if (!detectedPackageManager) {
205
- const pm = await select({
206
- message: 'Select package manager:',
207
- options: SUPPORTED_PACKAGE_MANAGERS.map((pm) => ({
208
- value: pm,
209
- label: pm,
210
- })),
211
- initialValue: DEFAULT_PACKAGE_MANAGER,
212
- });
213
- if (isCancel(pm)) {
214
- cancel('Operation cancelled.');
215
- process.exit(0);
216
- }
217
- options.packageManager = pm;
218
- }
219
- else {
220
- options.packageManager = detectedPackageManager;
221
- }
222
- }
223
- else {
224
- options.packageManager = cliOptions.packageManager;
225
- }
226
- // Toolchain selection
227
- if (cliOptions.toolchain === undefined) {
228
- const tc = await select({
229
- message: 'Select toolchain',
230
- options: SUPPORTED_TOOLCHAINS.map((tc) => ({
231
- value: tc,
232
- label: tc,
233
- })),
234
- initialValue: DEFAULT_TOOLCHAIN,
235
- });
236
- if (isCancel(tc)) {
237
- cancel('Operation cancelled.');
238
- process.exit(0);
239
- }
240
- options.toolchain = tc;
241
- }
242
- else {
243
- options.toolchain = cliOptions.toolchain;
244
- }
245
- options.chosenAddOns = [];
246
- if (Array.isArray(cliOptions.addOns)) {
247
- options.chosenAddOns = await finalizeAddOns(options.framework, options.mode, Array.from(new Set([...cliOptions.addOns, ...forcedAddOns])));
248
- options.tailwind = true;
249
- }
250
- else if (cliOptions.addOns) {
251
- // Select any add-ons
252
- const allAddOns = await getAllAddOns(options.framework, options.mode);
253
- const addOns = allAddOns.filter((addOn) => addOn.type === 'add-on');
254
- let selectedAddOns = [];
255
- if (options.typescript && addOns.length > 0) {
256
- const value = await multiselect({
257
- message: 'What add-ons would you like for your project:',
258
- options: addOns
259
- .filter((addOn) => !forcedAddOns.includes(addOn.id))
260
- .map((addOn) => ({
261
- value: addOn.id,
262
- label: addOn.name,
263
- hint: addOn.description,
264
- })),
265
- required: false,
266
- });
267
- if (isCancel(value)) {
268
- cancel('Operation cancelled.');
269
- process.exit(0);
270
- }
271
- selectedAddOns = value;
272
- }
273
- // Select any examples
274
- let selectedExamples = [];
275
- const examples = allAddOns.filter((addOn) => addOn.type === 'example');
276
- if (options.typescript && examples.length > 0) {
277
- const value = await multiselect({
278
- message: 'Would you like any examples?',
279
- options: examples
280
- .filter((addOn) => !forcedAddOns.includes(addOn.id))
281
- .map((addOn) => ({
282
- value: addOn.id,
283
- label: addOn.name,
284
- hint: addOn.description,
285
- })),
286
- required: false,
287
- });
288
- if (isCancel(value)) {
289
- cancel('Operation cancelled.');
290
- process.exit(0);
291
- }
292
- selectedExamples = value;
293
- }
294
- if (selectedAddOns.length > 0 ||
295
- selectedExamples.length > 0 ||
296
- forcedAddOns.length > 0) {
297
- options.chosenAddOns = await finalizeAddOns(options.framework, options.mode, Array.from(new Set([...selectedAddOns, ...selectedExamples, ...forcedAddOns])));
298
- options.tailwind = true;
299
- }
300
- }
301
- else if (forcedAddOns.length > 0) {
302
- options.chosenAddOns = await finalizeAddOns(options.framework, options.mode, forcedAddOns);
303
- }
304
- // Collect variables
305
- const variables = [];
306
- for (const addOn of options.chosenAddOns) {
307
- for (const variable of addOn.variables ?? []) {
308
- variables.push(variable);
309
- }
310
- }
311
- options.variableValues = await collectVariables(variables);
312
- // Git selection
313
- if (cliOptions.git === undefined) {
314
- const git = await confirm({
315
- message: 'Would you like to initialize a new git repository?',
316
- initialValue: true,
317
- });
318
- if (isCancel(git)) {
319
- cancel('Operation cancelled.');
320
- process.exit(0);
321
- }
322
- options.git = git;
323
- }
324
- else {
325
- options.git = !!cliOptions.git;
326
- }
327
- return options;
328
- }
package/dist/templates.js DELETED
@@ -1,6 +0,0 @@
1
- import { dirname, join } from 'node:path';
2
- import { fileURLToPath } from 'node:url';
3
- export function getTemplatesRoot() {
4
- // Get the parent directory because the compiled code is in the dist folder
5
- return join(dirname(dirname(fileURLToPath(import.meta.url))), 'templates');
6
- }
package/dist/toolchain.js DELETED
@@ -1,6 +0,0 @@
1
- export const SUPPORTED_TOOLCHAINS = [
2
- 'none',
3
- 'biome',
4
- 'eslint+prettier',
5
- ];
6
- export const DEFAULT_TOOLCHAIN = 'none';
@@ -1,3 +0,0 @@
1
- export declare function add(addOns: Array<string>, { silent, }?: {
2
- silent?: boolean;
3
- }): Promise<void>;
@@ -1,6 +0,0 @@
1
- export declare function cli({ name, appName, forcedMode, forcedAddOns, }: {
2
- name: string;
3
- appName: string;
4
- forcedMode?: 'typescript' | 'javascript' | 'file-router';
5
- forcedAddOns?: Array<string>;
6
- }): void;
@@ -1,6 +0,0 @@
1
- import type { Options } from './types.js';
2
- import type { PersistedOptions } from './config-file.js';
3
- type AddOnMode = 'add-on' | 'starter';
4
- export declare function createAppOptionsFromPersisted(json: PersistedOptions): Promise<Required<Options>>;
5
- export declare function initAddOn(mode: AddOnMode): Promise<void>;
6
- export {};
@@ -1,2 +0,0 @@
1
- export declare function readFileHelper(path: string): string;
2
- export declare function getBinaryFile(content: string): string | null;
@@ -1,7 +0,0 @@
1
- import type { TemplateOptions } from './types.js';
2
- export default function runServer(sse: boolean, { forcedAddOns, appName, name, }: {
3
- forcedMode?: TemplateOptions;
4
- forcedAddOns?: Array<string>;
5
- appName?: string;
6
- name?: string;
7
- }): Promise<void>;
@@ -1,6 +0,0 @@
1
- import type { CliOptions, Options } from './types.js';
2
- export declare function normalizeOptions(cliOptions: CliOptions, forcedAddOns?: Array<string>): Promise<Options | undefined>;
3
- export declare function promptForOptions(cliOptions: CliOptions, { forcedAddOns, forcedMode, }: {
4
- forcedAddOns?: Array<string>;
5
- forcedMode?: 'typescript' | 'javascript' | 'file-router';
6
- }): Promise<Required<Options>>;
@@ -1 +0,0 @@
1
- export declare function getTemplatesRoot(): string;
@@ -1,3 +0,0 @@
1
- export declare const SUPPORTED_TOOLCHAINS: readonly ["none", "biome", "eslint+prettier"];
2
- export type ToolChain = (typeof SUPPORTED_TOOLCHAINS)[number];
3
- export declare const DEFAULT_TOOLCHAIN: ToolChain;
package/src/cli.ts DELETED
@@ -1,196 +0,0 @@
1
- import { Command, InvalidArgumentError } from 'commander'
2
- import { intro, log } from '@clack/prompts'
3
-
4
- import { createApp } from './create-app.js'
5
- import { normalizeOptions, promptForOptions } from './options.js'
6
- import { SUPPORTED_PACKAGE_MANAGERS } from './package-manager.js'
7
- import { SUPPORTED_TOOLCHAINS } from './toolchain.js'
8
-
9
- import runServer from './mcp.js'
10
- import { listAddOns } from './add-ons.js'
11
- import { DEFAULT_FRAMEWORK, SUPPORTED_FRAMEWORKS } from './constants.js'
12
- import { initAddOn } from './custom-add-on.js'
13
-
14
- import { createDefaultEnvironment } from './environment.js'
15
- import { add } from './add.js'
16
-
17
- import type { PackageManager } from './package-manager.js'
18
- import type { ToolChain } from './toolchain.js'
19
- import type { CliOptions, Framework } from './types.js'
20
-
21
- export function cli({
22
- name,
23
- appName,
24
- forcedMode,
25
- forcedAddOns,
26
- }: {
27
- name: string
28
- appName: string
29
- forcedMode?: 'typescript' | 'javascript' | 'file-router'
30
- forcedAddOns?: Array<string>
31
- }) {
32
- const program = new Command()
33
-
34
- program.name(name).description(`CLI to create a new ${appName} application`)
35
-
36
- program
37
- .command('add')
38
- .argument('add-on', 'Name of the add-on (or add-ons separated by commas)')
39
- .action(async (addOn: string) => {
40
- await add(addOn.split(',').map((addon) => addon.trim()))
41
- })
42
-
43
- program
44
- .command('update-add-on')
45
- .description('Create or update an add-on from the current project')
46
- .action(async () => {
47
- await initAddOn('add-on')
48
- })
49
-
50
- program
51
- .command('update-starter')
52
- .description('Create or update a project starter from the current project')
53
- .action(async () => {
54
- await initAddOn('starter')
55
- })
56
-
57
- program.argument('[project-name]', 'name of the project')
58
-
59
- if (!forcedMode) {
60
- program.option<'typescript' | 'javascript' | 'file-router'>(
61
- '--template <type>',
62
- 'project template (typescript, javascript, file-router)',
63
- (value) => {
64
- if (
65
- value !== 'typescript' &&
66
- value !== 'javascript' &&
67
- value !== 'file-router'
68
- ) {
69
- throw new InvalidArgumentError(
70
- `Invalid template: ${value}. Only the following are allowed: typescript, javascript, file-router`,
71
- )
72
- }
73
- return value
74
- },
75
- )
76
- }
77
- program
78
- .option<Framework>(
79
- '--framework <type>',
80
- 'project framework (solid, react)',
81
- (value) => {
82
- if (!SUPPORTED_FRAMEWORKS.includes(value as Framework)) {
83
- throw new InvalidArgumentError(
84
- `Invalid framework: ${value}. Only the following are allowed: ${SUPPORTED_FRAMEWORKS.join(
85
- ', ',
86
- )}`,
87
- )
88
- }
89
- return value as Framework
90
- },
91
- DEFAULT_FRAMEWORK,
92
- )
93
- .option(
94
- '--starter [url]',
95
- 'initialize this project from a starter URL',
96
- false,
97
- )
98
- .option<PackageManager>(
99
- `--package-manager <${SUPPORTED_PACKAGE_MANAGERS.join('|')}>`,
100
- `Explicitly tell the CLI to use this package manager`,
101
- (value) => {
102
- if (!SUPPORTED_PACKAGE_MANAGERS.includes(value as PackageManager)) {
103
- throw new InvalidArgumentError(
104
- `Invalid package manager: ${value}. The following are allowed: ${SUPPORTED_PACKAGE_MANAGERS.join(
105
- ', ',
106
- )}`,
107
- )
108
- }
109
- return value as PackageManager
110
- },
111
- )
112
- .option<ToolChain>(
113
- `--toolchain <${SUPPORTED_TOOLCHAINS.join('|')}>`,
114
- `Explicitly tell the CLI to use this toolchain`,
115
- (value) => {
116
- if (!SUPPORTED_TOOLCHAINS.includes(value as ToolChain)) {
117
- throw new InvalidArgumentError(
118
- `Invalid toolchain: ${value}. The following are allowed: ${SUPPORTED_TOOLCHAINS.join(
119
- ', ',
120
- )}`,
121
- )
122
- }
123
- return value as ToolChain
124
- },
125
- )
126
- .option('--tailwind', 'add Tailwind CSS', false)
127
- .option<Array<string> | boolean>(
128
- '--add-ons [...add-ons]',
129
- 'pick from a list of available add-ons (comma separated list)',
130
- (value: string) => {
131
- let addOns: Array<string> | boolean = !!value
132
- if (typeof value === 'string') {
133
- addOns = value.split(',').map((addon) => addon.trim())
134
- }
135
- return addOns
136
- },
137
- )
138
- .option('--list-add-ons', 'list all available add-ons', false)
139
- .option('--no-git', 'do not create a git repository')
140
- .option(
141
- '--target-dir <path>',
142
- 'the target directory for the application root',
143
- )
144
- .option('--mcp', 'run the MCP server', false)
145
- .option('--mcp-sse', 'run the MCP server in SSE mode', false)
146
-
147
- program.action(async (projectName: string, options: CliOptions) => {
148
- if (options.listAddOns) {
149
- await listAddOns(options, {
150
- forcedMode,
151
- forcedAddOns,
152
- })
153
- } else if (options.mcp || options.mcpSse) {
154
- await runServer(!!options.mcpSse, {
155
- forcedMode,
156
- forcedAddOns,
157
- appName,
158
- })
159
- } else {
160
- try {
161
- const cliOptions = {
162
- projectName,
163
- ...options,
164
- } as CliOptions
165
-
166
- if (forcedMode) {
167
- cliOptions.template = forcedMode
168
- }
169
-
170
- let finalOptions = await normalizeOptions(cliOptions, forcedAddOns)
171
- if (finalOptions) {
172
- intro(`Creating a new ${appName} app in ${projectName}...`)
173
- } else {
174
- intro(`Let's configure your ${appName} application`)
175
- finalOptions = await promptForOptions(cliOptions, {
176
- forcedMode,
177
- forcedAddOns,
178
- })
179
- }
180
- await createApp(finalOptions, {
181
- environment: createDefaultEnvironment(),
182
- cwd: options.targetDir || undefined,
183
- name,
184
- appName,
185
- })
186
- } catch (error) {
187
- log.error(
188
- error instanceof Error ? error.message : 'An unknown error occurred',
189
- )
190
- process.exit(1)
191
- }
192
- }
193
- })
194
-
195
- program.parse()
196
- }