@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.
- package/dist/add-ons.js +91 -5
- package/dist/add.js +125 -0
- package/dist/cli.js +132 -0
- package/dist/config-file.js +9 -14
- package/dist/constants.js +2 -0
- package/dist/create-app.js +451 -142
- package/dist/custom-add-on.js +254 -0
- package/dist/environment.js +32 -64
- package/dist/file-helper.js +18 -0
- package/dist/index.js +1 -17
- package/dist/mcp.js +229 -0
- package/dist/options.js +333 -9
- package/dist/package-manager.js +6 -51
- package/dist/templates.js +6 -0
- package/dist/toolchain.js +6 -0
- package/dist/types/add-ons.d.ts +8 -3
- package/dist/types/add.d.ts +3 -0
- package/dist/types/cli.d.ts +7 -0
- package/dist/types/config-file.d.ts +4 -6
- package/dist/types/constants.d.ts +3 -0
- package/dist/types/create-app.d.ts +7 -1
- package/dist/types/custom-add-on.d.ts +3 -0
- package/dist/types/environment.d.ts +1 -2
- package/dist/types/file-helper.d.ts +2 -0
- package/dist/types/index.d.ts +1 -20
- package/dist/types/mcp.d.ts +7 -0
- package/dist/types/options.d.ts +6 -2
- package/dist/types/package-manager.d.ts +1 -18
- package/dist/types/templates.d.ts +1 -0
- package/dist/types/toolchain.d.ts +3 -0
- package/dist/types/types.d.ts +85 -788
- package/dist/types/utils.d.ts +0 -5
- package/dist/types.js +1 -65
- package/dist/utils.js +0 -9
- package/package.json +12 -9
- package/src/add-ons.ts +123 -7
- package/src/add.ts +186 -0
- package/src/cli.ts +210 -0
- package/src/config-file.ts +17 -26
- package/src/constants.ts +5 -0
- package/src/create-app.ts +730 -180
- package/src/custom-add-on.ts +325 -0
- package/src/environment.ts +33 -77
- package/src/file-helper.ts +20 -0
- package/src/index.ts +1 -77
- package/src/mcp.ts +302 -0
- package/src/options.ts +409 -8
- package/src/package-manager.ts +9 -80
- package/src/templates.ts +7 -0
- package/src/toolchain.ts +7 -0
- package/src/types.ts +87 -175
- package/src/utils.ts +0 -17
- package/templates/react/add-on/clerk/README.md +3 -0
- package/templates/react/add-on/clerk/assets/_dot_env.local.append +2 -0
- package/templates/react/add-on/clerk/assets/src/integrations/clerk/header-user.tsx +19 -0
- package/templates/react/add-on/clerk/assets/src/integrations/clerk/provider.tsx +18 -0
- package/templates/react/add-on/clerk/assets/src/routes/demo.clerk.tsx +20 -0
- package/templates/react/add-on/clerk/info.json +13 -0
- package/templates/react/add-on/clerk/package.json +5 -0
- package/templates/react/add-on/convex/README.md +4 -0
- package/templates/react/add-on/convex/assets/_dot_cursorrules.append +93 -0
- package/templates/react/add-on/convex/assets/_dot_env.local.append +3 -0
- package/templates/react/add-on/convex/assets/convex/products.ts +8 -0
- package/templates/react/add-on/convex/assets/convex/schema.ts +10 -0
- package/templates/react/add-on/convex/assets/src/integrations/convex/provider.tsx +20 -0
- package/templates/react/add-on/convex/assets/src/routes/demo.convex.tsx +33 -0
- package/templates/react/add-on/convex/info.json +13 -0
- package/templates/react/add-on/convex/package.json +6 -0
- package/templates/react/add-on/form/assets/src/components/demo.FormComponents.tsx.ejs +300 -0
- package/templates/react/add-on/form/assets/src/hooks/demo.form-context.ts +4 -0
- package/templates/react/add-on/form/assets/src/hooks/demo.form.ts +22 -0
- package/templates/react/add-on/form/assets/src/routes/demo.form.address.tsx.ejs +213 -0
- package/templates/react/add-on/form/assets/src/routes/demo.form.simple.tsx.ejs +77 -0
- package/templates/react/add-on/form/info.json +26 -0
- package/templates/react/add-on/form/package.json +6 -0
- package/templates/react/add-on/module-federation/assets/module-federation.config.js.ejs +31 -0
- package/templates/react/add-on/module-federation/assets/src/demo-mf-component.tsx +3 -0
- package/templates/react/add-on/module-federation/assets/src/demo-mf-self-contained.tsx +11 -0
- package/templates/react/add-on/module-federation/info.json +7 -0
- package/templates/react/add-on/module-federation/package.json +5 -0
- package/templates/react/add-on/netlify/README.md +11 -0
- package/templates/react/add-on/netlify/info.json +7 -0
- package/templates/react/add-on/sentry/assets/_dot_cursorrules.append +22 -0
- package/templates/react/add-on/sentry/assets/_dot_env.local.append +11 -0
- package/templates/react/add-on/sentry/assets/src/app/global-middleware.ts +11 -0
- package/templates/react/add-on/sentry/assets/src/routes/demo.sentry.testing.tsx +489 -0
- package/templates/react/add-on/sentry/info.json +14 -0
- package/templates/react/add-on/sentry/package.json +5 -0
- package/templates/react/add-on/shadcn/README.md +7 -0
- package/templates/react/add-on/shadcn/assets/_dot_cursorrules.append +7 -0
- package/templates/react/add-on/shadcn/assets/components.json +21 -0
- package/templates/react/add-on/shadcn/assets/src/lib/utils.ts +6 -0
- package/templates/react/add-on/shadcn/assets/src/styles.css +138 -0
- package/templates/react/add-on/shadcn/info.json +7 -0
- package/templates/react/add-on/shadcn/package.json +9 -0
- package/templates/react/add-on/start/assets/_dot_gitignore.append +2 -0
- package/templates/react/add-on/start/assets/app.config.ts.ejs +32 -0
- package/templates/react/add-on/start/assets/src/api.ts +6 -0
- package/templates/react/add-on/start/assets/src/client.tsx.ejs +33 -0
- package/templates/react/add-on/start/assets/src/router.tsx.ejs +48 -0
- package/templates/react/add-on/start/assets/src/routes/api.demo-names.ts +11 -0
- package/templates/react/add-on/start/assets/src/routes/demo.start.api-request.tsx.ejs +33 -0
- package/templates/react/add-on/start/assets/src/routes/demo.start.server-funcs.tsx +50 -0
- package/templates/react/add-on/start/assets/src/ssr.tsx.ejs +30 -0
- package/templates/react/add-on/start/info.json +18 -0
- package/templates/react/add-on/start/package.json +13 -0
- package/templates/react/add-on/store/assets/src/lib/demo-store.ts +13 -0
- package/templates/react/add-on/store/assets/src/routes/demo.store.tsx.ejs +75 -0
- package/templates/react/add-on/store/info.json +13 -0
- package/templates/react/add-on/store/package.json +6 -0
- package/templates/react/add-on/t3env/README.md +16 -0
- package/templates/react/add-on/t3env/assets/src/env.ts +39 -0
- package/templates/react/add-on/t3env/info.json +10 -0
- package/templates/react/add-on/t3env/package.json +6 -0
- package/templates/react/add-on/tRPC/assets/src/integrations/trpc/init.ts +9 -0
- package/templates/react/add-on/tRPC/assets/src/integrations/trpc/react.ts +4 -0
- package/templates/react/add-on/tRPC/assets/src/integrations/trpc/router.ts +18 -0
- package/templates/react/add-on/tRPC/assets/src/routes/api.trpc.$.tsx +16 -0
- package/templates/react/add-on/tRPC/info.json +9 -0
- package/templates/react/add-on/tRPC/package.json +9 -0
- package/templates/react/add-on/table/assets/src/data/demo-table-data.ts +50 -0
- package/templates/react/add-on/table/assets/src/routes/demo.table.tsx.ejs +373 -0
- package/templates/react/add-on/table/info.json +13 -0
- package/templates/react/add-on/table/package.json +7 -0
- package/templates/react/add-on/tanstack-query/assets/src/integrations/tanstack-query/layout.tsx +5 -0
- package/templates/react/add-on/tanstack-query/assets/src/integrations/tanstack-query/root-provider.tsx.ejs +70 -0
- package/templates/react/add-on/tanstack-query/assets/src/routes/demo.tanstack-query.tsx.ejs +53 -0
- package/templates/react/add-on/tanstack-query/info.json +13 -0
- package/templates/react/add-on/tanstack-query/package.json +6 -0
- package/templates/react/base/README.md.ejs +558 -0
- package/templates/react/base/_dot_gitignore +5 -0
- package/templates/react/base/_dot_vscode/settings.biome.json +35 -0
- package/templates/react/base/_dot_vscode/settings.json +11 -0
- package/templates/react/base/index.html.ejs +20 -0
- package/templates/react/base/package.biome.json +10 -0
- package/templates/react/base/package.eslintprettier.json +11 -0
- package/templates/react/base/package.json +30 -0
- package/templates/react/base/package.ts.json +7 -0
- package/templates/react/base/package.tw.json +6 -0
- package/templates/react/base/public/favicon.ico +0 -0
- package/templates/react/base/public/logo192.png +0 -0
- package/templates/react/base/public/logo512.png +0 -0
- package/templates/react/base/public/manifest.json +25 -0
- package/templates/react/base/public/robots.txt +3 -0
- package/templates/react/base/src/App.css +38 -0
- package/templates/react/base/src/App.test.tsx.ejs +10 -0
- package/templates/react/base/src/App.tsx.ejs +74 -0
- package/templates/react/base/src/components/Header.tsx.ejs +27 -0
- package/templates/react/base/src/logo.svg +44 -0
- package/templates/react/base/src/reportWebVitals.ts.ejs +28 -0
- package/templates/react/base/src/styles.css.ejs +15 -0
- package/templates/react/base/toolchain/.prettierignore +3 -0
- package/templates/react/base/toolchain/biome.json +31 -0
- package/templates/react/base/toolchain/eslint.config.js +5 -0
- package/templates/react/base/toolchain/prettier.config.js +10 -0
- package/templates/react/base/tsconfig.json.ejs +29 -0
- package/templates/react/base/vite.config.js.ejs +23 -0
- package/templates/react/code-router/src/main.tsx.ejs +92 -0
- package/templates/react/example/tanchat/README.md +37 -0
- package/templates/react/example/tanchat/assets/_dot_env.local.append +2 -0
- package/templates/react/example/tanchat/assets/public/example-guitar-flowers.jpg +0 -0
- package/templates/react/example/tanchat/assets/public/example-guitar-motherboard.jpg +0 -0
- package/templates/react/example/tanchat/assets/public/example-guitar-racing.jpg +0 -0
- package/templates/react/example/tanchat/assets/public/example-guitar-steamer-trunk.jpg +0 -0
- package/templates/react/example/tanchat/assets/public/example-guitar-superhero.jpg +0 -0
- package/templates/react/example/tanchat/assets/public/example-guitar-traveling.jpg +0 -0
- package/templates/react/example/tanchat/assets/public/example-guitar-video-games.jpg +0 -0
- package/templates/react/example/tanchat/assets/src/components/example-AIAssistant.tsx +173 -0
- package/templates/react/example/tanchat/assets/src/components/example-GuitarRecommendation.tsx +47 -0
- package/templates/react/example/tanchat/assets/src/data/example-guitars.ts +83 -0
- package/templates/react/example/tanchat/assets/src/demo.index.css +220 -0
- package/templates/react/example/tanchat/assets/src/integrations/tanchat/header-user.tsx +5 -0
- package/templates/react/example/tanchat/assets/src/routes/api.messages.ts +24 -0
- package/templates/react/example/tanchat/assets/src/routes/api.sse.ts +23 -0
- package/templates/react/example/tanchat/assets/src/routes/example.chat.tsx +159 -0
- package/templates/react/example/tanchat/assets/src/routes/example.guitars/$guitarId.tsx +50 -0
- package/templates/react/example/tanchat/assets/src/routes/example.guitars/index.tsx +54 -0
- package/templates/react/example/tanchat/assets/src/store/example-assistant.ts +3 -0
- package/templates/react/example/tanchat/assets/src/utils/demo.ai.ts +62 -0
- package/templates/react/example/tanchat/assets/src/utils/demo.sse.ts +31 -0
- package/templates/react/example/tanchat/assets/src/utils/demo.tools.ts +47 -0
- package/templates/react/example/tanchat/info.json +19 -0
- package/templates/react/example/tanchat/package.json +16 -0
- package/templates/react/file-router/package.fr.json +5 -0
- package/templates/react/file-router/src/main.tsx.ejs +55 -0
- package/templates/react/file-router/src/routes/__root.tsx.ejs +82 -0
- package/templates/solid/add-on/form/assets/src/routes/demo.form.tsx.ejs +352 -0
- package/templates/solid/add-on/form/info.json +13 -0
- package/templates/solid/add-on/form/package.json +5 -0
- package/templates/solid/add-on/module-federation/assets/module-federation.config.js.ejs +27 -0
- package/templates/solid/add-on/module-federation/assets/src/demo-mf-component.tsx +3 -0
- package/templates/solid/add-on/module-federation/assets/src/demo-mf-self-contained.tsx +9 -0
- package/templates/solid/add-on/module-federation/info.json +7 -0
- package/templates/solid/add-on/module-federation/package.json +5 -0
- package/templates/solid/add-on/sentry/assets/_dot_cursorrules.append +22 -0
- package/templates/solid/add-on/sentry/assets/_dot_env.local.append +2 -0
- package/templates/solid/add-on/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +20 -0
- package/templates/solid/add-on/sentry/info.json +13 -0
- package/templates/solid/add-on/sentry/package.json +5 -0
- package/templates/solid/add-on/solid-ui/README.md +9 -0
- package/templates/solid/add-on/solid-ui/assets/src/lib/utils.ts +6 -0
- package/templates/solid/add-on/solid-ui/assets/src/styles.css +138 -0
- package/templates/solid/add-on/solid-ui/assets/ui.config.json +13 -0
- package/templates/solid/add-on/solid-ui/info.json +11 -0
- package/templates/solid/add-on/solid-ui/package.json +9 -0
- package/templates/solid/add-on/start/assets/app.config.ts +16 -0
- package/templates/solid/add-on/start/assets/src/api.ts +6 -0
- package/templates/solid/add-on/start/assets/src/client.tsx +7 -0
- package/templates/solid/add-on/start/assets/src/router.tsx.ejs +24 -0
- package/templates/solid/add-on/start/assets/src/routes/demo.start.server-funcs.tsx +49 -0
- package/templates/solid/add-on/start/assets/src/ssr.tsx +12 -0
- package/templates/solid/add-on/start/info.json +14 -0
- package/templates/solid/add-on/start/package.json +12 -0
- package/templates/solid/add-on/store/assets/src/lib/demo-store.ts +13 -0
- package/templates/solid/add-on/store/assets/src/routes/demo.store.tsx.ejs +77 -0
- package/templates/solid/add-on/store/info.json +13 -0
- package/templates/solid/add-on/store/package.json +6 -0
- package/templates/solid/add-on/t3env/README.md +16 -0
- package/templates/solid/add-on/t3env/assets/src/env.ts +39 -0
- package/templates/solid/add-on/t3env/info.json +10 -0
- package/templates/solid/add-on/t3env/package.json +6 -0
- package/templates/solid/add-on/tanstack-query/assets/src/integrations/tanstack-query/header-user.tsx +5 -0
- package/templates/solid/add-on/tanstack-query/assets/src/integrations/tanstack-query/provider.tsx +15 -0
- package/templates/solid/add-on/tanstack-query/assets/src/routes/demo.tanstack-query.tsx +30 -0
- package/templates/solid/add-on/tanstack-query/info.json +13 -0
- package/templates/solid/add-on/tanstack-query/package.json +6 -0
- package/templates/solid/base/README.md.ejs +215 -0
- package/templates/solid/base/_dot_cursorrules.append +35 -0
- package/templates/solid/base/_dot_gitignore +5 -0
- package/templates/solid/base/_dot_vscode/settings.biome.json +35 -0
- package/templates/solid/base/_dot_vscode/settings.json +11 -0
- package/templates/solid/base/index.html.ejs +20 -0
- package/templates/solid/base/package.biome.json +10 -0
- package/templates/solid/base/package.eslintprettier.json +11 -0
- package/templates/solid/base/package.json +23 -0
- package/templates/solid/base/package.ts.json +5 -0
- package/templates/solid/base/package.tw.json +6 -0
- package/templates/solid/base/public/favicon.ico +0 -0
- package/templates/solid/base/public/logo192.png +0 -0
- package/templates/solid/base/public/logo512.png +0 -0
- package/templates/solid/base/public/manifest.json +25 -0
- package/templates/solid/base/public/robots.txt +3 -0
- package/templates/solid/base/src/App.css +0 -0
- package/templates/solid/base/src/App.tsx.ejs +47 -0
- package/templates/solid/base/src/components/Header.tsx.ejs +26 -0
- package/templates/solid/base/src/logo.svg +120 -0
- package/templates/solid/base/src/styles.css.ejs +15 -0
- package/templates/solid/base/toolchain/.prettierignore +3 -0
- package/templates/solid/base/toolchain/biome.json +31 -0
- package/templates/solid/base/toolchain/eslint.config.js +5 -0
- package/templates/solid/base/toolchain/prettier.config.js +10 -0
- package/templates/solid/base/tsconfig.json.ejs +31 -0
- package/templates/solid/base/vite.config.js.ejs +22 -0
- package/templates/solid/code-router/src/main.tsx.ejs +71 -0
- package/templates/solid/example/tanchat/README.md +52 -0
- package/templates/solid/example/tanchat/assets/ai-streaming-server/README.md +110 -0
- package/templates/solid/example/tanchat/assets/ai-streaming-server/_dot_env.example +1 -0
- package/templates/solid/example/tanchat/assets/ai-streaming-server/package.json +26 -0
- package/templates/solid/example/tanchat/assets/ai-streaming-server/src/index.ts +102 -0
- package/templates/solid/example/tanchat/assets/ai-streaming-server/tsconfig.json +15 -0
- package/templates/solid/example/tanchat/assets/src/components/demo.SettingsDialog.tsx +149 -0
- package/templates/solid/example/tanchat/assets/src/demo.index.css +227 -0
- package/templates/solid/example/tanchat/assets/src/lib/demo-store.ts +13 -0
- package/templates/solid/example/tanchat/assets/src/routes/example.chat.tsx +435 -0
- package/templates/solid/example/tanchat/assets/src/store/demo.hooks.ts +17 -0
- package/templates/solid/example/tanchat/assets/src/store/demo.store.ts +133 -0
- package/templates/solid/example/tanchat/info.json +14 -0
- package/templates/solid/example/tanchat/package.json +7 -0
- package/templates/solid/file-router/package.fr.json +5 -0
- package/templates/solid/file-router/src/main.tsx.ejs +47 -0
- package/templates/solid/file-router/src/routes/__root.tsx.ejs +41 -0
- package/templates/solid/file-router/src/routes/index.tsx +43 -0
- package/tests/cra.test.ts +293 -0
- package/tests/snapshots/cra/cr-js-npm.json +33 -0
- package/tests/snapshots/cra/cr-ts-npm.json +34 -0
- package/tests/snapshots/cra/cr-ts-start-npm.json +38 -0
- package/tests/snapshots/cra/fr-ts-npm.json +34 -0
- package/tests/snapshots/cra/fr-ts-tw-npm.json +33 -0
- package/tests/snapshots/cra/solid-cr-js-npm.json +31 -0
- package/tests/snapshots/cra/solid-cr-ts-npm.json +32 -0
- package/tests/snapshots/cra/solid-cr-ts-start-npm.json +36 -0
- package/tests/snapshots/cra/solid-fr-ts-npm.json +33 -0
- package/tests/snapshots/cra/solid-fr-ts-tw-npm.json +32 -0
- package/tests/test-utilities.ts +87 -0
- package/dist/add-to-app.js +0 -169
- package/dist/custom-add-ons/add-on.js +0 -175
- package/dist/custom-add-ons/shared.js +0 -117
- package/dist/custom-add-ons/starter.js +0 -84
- package/dist/file-helpers.js +0 -165
- package/dist/frameworks.js +0 -92
- package/dist/integrations/git.js +0 -4
- package/dist/integrations/shadcn.js +0 -33
- package/dist/package-json.js +0 -48
- package/dist/special-steps/index.js +0 -24
- package/dist/special-steps/rimraf-node-modules.js +0 -16
- package/dist/template-file.js +0 -112
- package/dist/types/add-to-app.d.ts +0 -17
- package/dist/types/custom-add-ons/add-on.d.ts +0 -69
- package/dist/types/custom-add-ons/shared.d.ts +0 -15
- package/dist/types/custom-add-ons/starter.d.ts +0 -7
- package/dist/types/file-helpers.d.ts +0 -15
- package/dist/types/frameworks.d.ts +0 -7
- package/dist/types/integrations/git.d.ts +0 -2
- package/dist/types/integrations/shadcn.d.ts +0 -2
- package/dist/types/package-json.d.ts +0 -7
- package/dist/types/special-steps/index.d.ts +0 -2
- package/dist/types/special-steps/rimraf-node-modules.d.ts +0 -2
- package/dist/types/template-file.d.ts +0 -2
- package/src/add-to-app.ts +0 -274
- package/src/custom-add-ons/add-on.ts +0 -261
- package/src/custom-add-ons/shared.ts +0 -161
- package/src/custom-add-ons/starter.ts +0 -126
- package/src/file-helpers.ts +0 -235
- package/src/frameworks.ts +0 -134
- package/src/integrations/git.ts +0 -7
- package/src/integrations/shadcn.ts +0 -54
- package/src/package-json.ts +0 -69
- package/src/special-steps/index.ts +0 -36
- package/src/special-steps/rimraf-node-modules.ts +0 -25
- package/src/template-file.ts +0 -150
- package/tests/add-ons.test.ts +0 -67
- package/tests/add-to-app.test.ts +0 -358
- package/tests/config-file.test.ts +0 -68
- package/tests/create-app.test.ts +0 -120
- package/tests/custom-add-ons/add-on.test.ts +0 -12
- package/tests/custom-add-ons/shared.test.ts +0 -257
- package/tests/custom-add-ons/starter.test.ts +0 -58
- package/tests/environment.test.ts +0 -115
- package/tests/file-helper.test.ts +0 -90
- package/tests/frameworks.test.ts +0 -95
- package/tests/index.test.ts +0 -9
- package/tests/integrations/git.test.ts +0 -20
- package/tests/integrations/shadcn.test.ts +0 -91
- package/tests/options.test.ts +0 -42
- package/tests/package-json.test.ts +0 -63
- package/tests/package-manager.test.ts +0 -154
- package/tests/setupVitest.ts +0 -6
- package/tests/template-file.test.ts +0 -178
- package/tests/utils.test.ts +0 -23
- package/vitest.config.ts +0 -21
package/src/add-to-app.ts
DELETED
|
@@ -1,274 +0,0 @@
|
|
|
1
|
-
import { basename, resolve } from 'node:path'
|
|
2
|
-
|
|
3
|
-
import { CONFIG_FILE } from './constants.js'
|
|
4
|
-
import { finalizeAddOns } from './add-ons.js'
|
|
5
|
-
import { getFrameworkById } from './frameworks.js'
|
|
6
|
-
import { createMemoryEnvironment } from './environment.js'
|
|
7
|
-
import { createApp } from './create-app.js'
|
|
8
|
-
import {
|
|
9
|
-
readConfigFileFromEnvironment,
|
|
10
|
-
writeConfigFileToEnvironment,
|
|
11
|
-
} from './config-file.js'
|
|
12
|
-
import { formatCommand } from './utils.js'
|
|
13
|
-
import { packageManagerInstall } from './package-manager.js'
|
|
14
|
-
import {
|
|
15
|
-
isBase64,
|
|
16
|
-
recursivelyGatherFilesFromEnvironment,
|
|
17
|
-
} from './file-helpers.js'
|
|
18
|
-
import { mergePackageJSON } from './package-json.js'
|
|
19
|
-
import { runSpecialSteps } from './special-steps/index.js'
|
|
20
|
-
|
|
21
|
-
import type { Environment, Mode, Options } from './types.js'
|
|
22
|
-
import type { PersistedOptions } from './config-file.js'
|
|
23
|
-
|
|
24
|
-
export async function hasPendingGitChanges(
|
|
25
|
-
environment: Environment,
|
|
26
|
-
cwd: string,
|
|
27
|
-
) {
|
|
28
|
-
const { stdout } = await environment.execute(
|
|
29
|
-
'git',
|
|
30
|
-
['status', '--porcelain'],
|
|
31
|
-
cwd,
|
|
32
|
-
)
|
|
33
|
-
return stdout.length > 0
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
async function createOptions(
|
|
37
|
-
json: PersistedOptions,
|
|
38
|
-
addOns: Array<string>,
|
|
39
|
-
targetDir: string,
|
|
40
|
-
): Promise<Options> {
|
|
41
|
-
const framework = getFrameworkById(json.framework)
|
|
42
|
-
|
|
43
|
-
// TODO: Load the starter
|
|
44
|
-
|
|
45
|
-
return {
|
|
46
|
-
...json,
|
|
47
|
-
framework,
|
|
48
|
-
tailwind: true,
|
|
49
|
-
addOns: true,
|
|
50
|
-
chosenAddOns: await finalizeAddOns(framework!, json.mode as Mode, [
|
|
51
|
-
...json.existingAddOns,
|
|
52
|
-
...addOns,
|
|
53
|
-
]),
|
|
54
|
-
targetDir,
|
|
55
|
-
} as Options
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
async function runCreateApp(options: Required<Options>) {
|
|
59
|
-
const { environment, output } = createMemoryEnvironment(options.targetDir)
|
|
60
|
-
await createApp(environment, options)
|
|
61
|
-
return output
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
export async function getCurrentConfiguration(
|
|
65
|
-
environment: Environment,
|
|
66
|
-
cwd: string,
|
|
67
|
-
) {
|
|
68
|
-
const persistedOptions = await readConfigFileFromEnvironment(environment, cwd)
|
|
69
|
-
if (!persistedOptions) {
|
|
70
|
-
environment.error(
|
|
71
|
-
'There is no .cta.json file in your project.',
|
|
72
|
-
'This is probably because this was created with an older version of create-tsrouter-app.',
|
|
73
|
-
)
|
|
74
|
-
return undefined
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
return persistedOptions
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
export async function writeFiles(
|
|
81
|
-
environment: Environment,
|
|
82
|
-
cwd: string,
|
|
83
|
-
output: {
|
|
84
|
-
files: Record<string, string>
|
|
85
|
-
deletedFiles: Array<string>
|
|
86
|
-
},
|
|
87
|
-
forced: boolean,
|
|
88
|
-
) {
|
|
89
|
-
const currentFiles = await recursivelyGatherFilesFromEnvironment(
|
|
90
|
-
environment,
|
|
91
|
-
cwd,
|
|
92
|
-
false,
|
|
93
|
-
)
|
|
94
|
-
|
|
95
|
-
const overwrittenFiles: Array<string> = []
|
|
96
|
-
const changedFiles: Array<string> = []
|
|
97
|
-
for (const file of Object.keys(output.files)) {
|
|
98
|
-
const relativeFile = file.replace(cwd, '')
|
|
99
|
-
if (currentFiles[relativeFile]) {
|
|
100
|
-
if (currentFiles[relativeFile] !== output.files[file]) {
|
|
101
|
-
overwrittenFiles.push(relativeFile)
|
|
102
|
-
}
|
|
103
|
-
} else {
|
|
104
|
-
changedFiles.push(relativeFile)
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
if (!forced && overwrittenFiles.length) {
|
|
109
|
-
environment.warn(
|
|
110
|
-
'The following will be overwritten',
|
|
111
|
-
[...overwrittenFiles, ...output.deletedFiles].join('\n'),
|
|
112
|
-
)
|
|
113
|
-
const shouldContinue = await environment.confirm('Do you want to continue?')
|
|
114
|
-
if (!shouldContinue) {
|
|
115
|
-
throw new Error('User cancelled')
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
for (const file of output.deletedFiles) {
|
|
120
|
-
if (environment.exists(resolve(cwd, file))) {
|
|
121
|
-
await environment.deleteFile(resolve(cwd, file))
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
environment.startStep({
|
|
126
|
-
id: 'write-files',
|
|
127
|
-
type: 'file',
|
|
128
|
-
message: 'Writing add-on files...',
|
|
129
|
-
})
|
|
130
|
-
|
|
131
|
-
for (const file of [...changedFiles, ...overwrittenFiles]) {
|
|
132
|
-
const fName = basename(file)
|
|
133
|
-
const contents = output.files[file]
|
|
134
|
-
if (fName === 'package.json') {
|
|
135
|
-
const currentJson = JSON.parse(
|
|
136
|
-
await environment.readFile(resolve(cwd, file)),
|
|
137
|
-
)
|
|
138
|
-
const newJSON = mergePackageJSON(currentJson, JSON.parse(contents))
|
|
139
|
-
environment.writeFile(
|
|
140
|
-
resolve(cwd, file),
|
|
141
|
-
JSON.stringify(newJSON, null, 2),
|
|
142
|
-
)
|
|
143
|
-
} else if (fName !== CONFIG_FILE) {
|
|
144
|
-
if (isBase64(contents)) {
|
|
145
|
-
await environment.writeFileBase64(resolve(cwd, file), contents)
|
|
146
|
-
} else {
|
|
147
|
-
await environment.writeFile(resolve(cwd, file), contents)
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
environment.finishStep('write-files', 'Add-on files written')
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export async function runNewCommands(
|
|
156
|
-
environment: Environment,
|
|
157
|
-
originalOptions: PersistedOptions,
|
|
158
|
-
cwd: string,
|
|
159
|
-
output: {
|
|
160
|
-
commands: Array<{
|
|
161
|
-
command: string
|
|
162
|
-
args: Array<string>
|
|
163
|
-
}>
|
|
164
|
-
},
|
|
165
|
-
) {
|
|
166
|
-
const originalOutput = await runCreateApp({
|
|
167
|
-
...(await createOptions(originalOptions, [], cwd)),
|
|
168
|
-
} as Required<Options>)
|
|
169
|
-
|
|
170
|
-
const originalCommands = new Set(
|
|
171
|
-
originalOutput.commands.map((c) => [c.command, ...c.args].join(' ')),
|
|
172
|
-
)
|
|
173
|
-
|
|
174
|
-
for (const command of output.commands) {
|
|
175
|
-
const commandString = [command.command, ...command.args].join(' ')
|
|
176
|
-
if (!originalCommands.has(commandString)) {
|
|
177
|
-
environment.startStep({
|
|
178
|
-
id: 'run-commands',
|
|
179
|
-
type: 'command',
|
|
180
|
-
message: `Running ${formatCommand({ command: command.command, args: command.args })}...`,
|
|
181
|
-
})
|
|
182
|
-
await environment.execute(command.command, command.args, cwd)
|
|
183
|
-
environment.finishStep('run-commands', 'Setup commands complete')
|
|
184
|
-
}
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
export async function addToApp(
|
|
189
|
-
environment: Environment,
|
|
190
|
-
addOns: Array<string>,
|
|
191
|
-
cwd: string,
|
|
192
|
-
options?: {
|
|
193
|
-
forced?: boolean
|
|
194
|
-
},
|
|
195
|
-
) {
|
|
196
|
-
const persistedOptions = await getCurrentConfiguration(environment, cwd)
|
|
197
|
-
if (!persistedOptions) {
|
|
198
|
-
return
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
if (!options?.forced && (await hasPendingGitChanges(environment, cwd))) {
|
|
202
|
-
environment.error(
|
|
203
|
-
'You have pending git changes.',
|
|
204
|
-
'Please commit or stash them before adding add-ons.',
|
|
205
|
-
)
|
|
206
|
-
return
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
environment.intro(`Adding ${addOns.join(', ')} to the project...`)
|
|
210
|
-
environment.startStep({
|
|
211
|
-
id: 'processing-new-app-setup',
|
|
212
|
-
type: 'file',
|
|
213
|
-
message: 'Processing new app setup...',
|
|
214
|
-
})
|
|
215
|
-
|
|
216
|
-
const newOptions = await createOptions(persistedOptions, addOns, cwd)
|
|
217
|
-
|
|
218
|
-
const output = await runCreateApp({
|
|
219
|
-
...newOptions,
|
|
220
|
-
targetDir: cwd,
|
|
221
|
-
} as Required<Options>)
|
|
222
|
-
|
|
223
|
-
await writeFiles(environment, cwd, output, !!options?.forced)
|
|
224
|
-
|
|
225
|
-
environment.finishStep(
|
|
226
|
-
'processing-new-app-setup',
|
|
227
|
-
'Application files written',
|
|
228
|
-
)
|
|
229
|
-
|
|
230
|
-
// Run any special steps for the new add-ons
|
|
231
|
-
|
|
232
|
-
const specialSteps = new Set<string>([])
|
|
233
|
-
for (const addOn of newOptions.chosenAddOns) {
|
|
234
|
-
for (const step of addOn.addOnSpecialSteps || []) {
|
|
235
|
-
if (addOns.includes(addOn.id)) {
|
|
236
|
-
specialSteps.add(step)
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
|
-
}
|
|
240
|
-
if (specialSteps.size) {
|
|
241
|
-
await runSpecialSteps(environment, newOptions, Array.from(specialSteps))
|
|
242
|
-
}
|
|
243
|
-
|
|
244
|
-
// Install dependencies
|
|
245
|
-
|
|
246
|
-
environment.startStep({
|
|
247
|
-
id: 'install-dependencies',
|
|
248
|
-
type: 'package-manager',
|
|
249
|
-
message: `Installing dependencies via ${newOptions.packageManager}...`,
|
|
250
|
-
})
|
|
251
|
-
const s = environment.spinner()
|
|
252
|
-
s.start(`Installing dependencies via ${newOptions.packageManager}...`)
|
|
253
|
-
await packageManagerInstall(
|
|
254
|
-
environment,
|
|
255
|
-
newOptions.targetDir,
|
|
256
|
-
newOptions.packageManager,
|
|
257
|
-
)
|
|
258
|
-
s.stop(`Installed dependencies`)
|
|
259
|
-
environment.finishStep('install-dependencies', 'Dependencies installed')
|
|
260
|
-
|
|
261
|
-
// Handle new commands
|
|
262
|
-
|
|
263
|
-
await runNewCommands(environment, persistedOptions, cwd, output)
|
|
264
|
-
|
|
265
|
-
environment.startStep({
|
|
266
|
-
id: 'write-config-file',
|
|
267
|
-
type: 'file',
|
|
268
|
-
message: 'Writing config file...',
|
|
269
|
-
})
|
|
270
|
-
writeConfigFileToEnvironment(environment, newOptions)
|
|
271
|
-
environment.finishStep('write-config-file', 'Config file written')
|
|
272
|
-
|
|
273
|
-
environment.outro('Add-ons added successfully!')
|
|
274
|
-
}
|
|
@@ -1,261 +0,0 @@
|
|
|
1
|
-
import { readFile } from 'node:fs/promises'
|
|
2
|
-
import { existsSync, mkdirSync, writeFileSync } from 'node:fs'
|
|
3
|
-
import { basename, dirname, resolve } from 'node:path'
|
|
4
|
-
|
|
5
|
-
import { AddOnCompiledSchema } from '../types.js'
|
|
6
|
-
import { createIgnore, recursivelyGatherFiles } 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
|
-
AddOn,
|
|
18
|
-
AddOnCompiled,
|
|
19
|
-
AddOnInfo,
|
|
20
|
-
Environment,
|
|
21
|
-
Options,
|
|
22
|
-
} from '../types'
|
|
23
|
-
|
|
24
|
-
const ADD_ON_DIR = '.add-on'
|
|
25
|
-
|
|
26
|
-
export const ADD_ON_IGNORE_FILES: Array<string> = [
|
|
27
|
-
'main.jsx',
|
|
28
|
-
'App.jsx',
|
|
29
|
-
'main.tsx',
|
|
30
|
-
'App.tsx',
|
|
31
|
-
'routeTree.gen.ts',
|
|
32
|
-
]
|
|
33
|
-
|
|
34
|
-
const INFO_FILE = '.add-on/info.json'
|
|
35
|
-
const COMPILED_FILE = 'add-on.json'
|
|
36
|
-
|
|
37
|
-
const ASSETS_DIR = 'assets'
|
|
38
|
-
|
|
39
|
-
export function camelCase(str: string) {
|
|
40
|
-
return str
|
|
41
|
-
.split(/(\.|-|\/)/)
|
|
42
|
-
.filter((part) => /^[a-zA-Z]+$/.test(part))
|
|
43
|
-
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
44
|
-
.join('')
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
export function templatize(routeCode: string, routeFile: string) {
|
|
48
|
-
let code = routeCode
|
|
49
|
-
|
|
50
|
-
// Replace the import
|
|
51
|
-
code = code.replace(
|
|
52
|
-
/import { createFileRoute } from ['"]@tanstack\/react-router['"]/g,
|
|
53
|
-
`import { <% if (fileRouter) { %>createFileRoute<% } else { %>createRoute<% } %> } from '@tanstack/react-router'`,
|
|
54
|
-
)
|
|
55
|
-
|
|
56
|
-
// Extract route path and definition, then transform the route declaration
|
|
57
|
-
const routeMatch = code.match(
|
|
58
|
-
/export\s+const\s+Route\s*=\s*createFileRoute\(['"]([^'"]+)['"]\)\s*\(\{([^}]+)\}\)/,
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
let path = ''
|
|
62
|
-
|
|
63
|
-
if (routeMatch) {
|
|
64
|
-
const fullMatch = routeMatch[0]
|
|
65
|
-
path = routeMatch[1]
|
|
66
|
-
const routeDefinition = routeMatch[2]
|
|
67
|
-
code = code.replace(
|
|
68
|
-
fullMatch,
|
|
69
|
-
`<% if (codeRouter) { %>
|
|
70
|
-
import type { RootRoute } from '@tanstack/react-router'
|
|
71
|
-
<% } else { %>
|
|
72
|
-
export const Route = createFileRoute('${path}')({${routeDefinition}})
|
|
73
|
-
<% } %>`,
|
|
74
|
-
)
|
|
75
|
-
|
|
76
|
-
code += `
|
|
77
|
-
<% if (codeRouter) { %>
|
|
78
|
-
export default (parentRoute: RootRoute) => createRoute({
|
|
79
|
-
path: '${path}',
|
|
80
|
-
${routeDefinition}
|
|
81
|
-
getParentRoute: () => parentRoute,
|
|
82
|
-
})
|
|
83
|
-
<% } %>
|
|
84
|
-
`
|
|
85
|
-
} else {
|
|
86
|
-
console.error(`No route found in the file: ${routeFile}`)
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
const name = basename(path)
|
|
90
|
-
.replace('.tsx', '')
|
|
91
|
-
.replace(/^demo/, '')
|
|
92
|
-
.replace('.', ' ')
|
|
93
|
-
.trim()
|
|
94
|
-
|
|
95
|
-
const jsName = camelCase(basename(path))
|
|
96
|
-
|
|
97
|
-
return { url: path, code, name, jsName }
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export async function validateAddOnSetup(environment: Environment) {
|
|
101
|
-
const options = await readCurrentProjectOptions(environment)
|
|
102
|
-
|
|
103
|
-
if (options.mode !== 'file-router') {
|
|
104
|
-
environment.error(
|
|
105
|
-
'This project is not using file-router mode.',
|
|
106
|
-
'To create an add-on, the project must be created with the file-router mode.',
|
|
107
|
-
)
|
|
108
|
-
process.exit(1)
|
|
109
|
-
}
|
|
110
|
-
if (!options.tailwind) {
|
|
111
|
-
environment.error(
|
|
112
|
-
'This project is not using Tailwind CSS.',
|
|
113
|
-
'To create an add-on, the project must be created with Tailwind CSS.',
|
|
114
|
-
)
|
|
115
|
-
process.exit(1)
|
|
116
|
-
}
|
|
117
|
-
if (!options.typescript) {
|
|
118
|
-
environment.error(
|
|
119
|
-
'This project is not using TypeScript.',
|
|
120
|
-
'To create an add-on, the project must be created with TypeScript.',
|
|
121
|
-
)
|
|
122
|
-
process.exit(1)
|
|
123
|
-
}
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export async function readOrGenerateAddOnInfo(
|
|
127
|
-
options: PersistedOptions,
|
|
128
|
-
): Promise<AddOnInfo> {
|
|
129
|
-
return existsSync(INFO_FILE)
|
|
130
|
-
? JSON.parse((await readFile(INFO_FILE)).toString())
|
|
131
|
-
: ({
|
|
132
|
-
id: `${options.projectName}-add-on`,
|
|
133
|
-
name: `${options.projectName}-add-on`,
|
|
134
|
-
version: '0.0.1',
|
|
135
|
-
description: 'Add-on',
|
|
136
|
-
author: 'Jane Smith <jane.smith@example.com>',
|
|
137
|
-
license: 'MIT',
|
|
138
|
-
link: `https://github.com/jane-smith/${options.projectName}-add-on`,
|
|
139
|
-
shadcnComponents: [],
|
|
140
|
-
framework: options.framework,
|
|
141
|
-
modes: [options.mode],
|
|
142
|
-
routes: [],
|
|
143
|
-
warning: '',
|
|
144
|
-
phase: 'add-on',
|
|
145
|
-
type: 'add-on',
|
|
146
|
-
packageAdditions: {
|
|
147
|
-
scripts: {},
|
|
148
|
-
dependencies: {},
|
|
149
|
-
devDependencies: {},
|
|
150
|
-
},
|
|
151
|
-
dependsOn: options.existingAddOns,
|
|
152
|
-
} as AddOnInfo)
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export async function generateProject(persistedOptions: PersistedOptions) {
|
|
156
|
-
const info = await readOrGenerateAddOnInfo(persistedOptions)
|
|
157
|
-
|
|
158
|
-
const output = await runCreateApp(
|
|
159
|
-
(await createAppOptionsFromPersisted(
|
|
160
|
-
persistedOptions,
|
|
161
|
-
)) as Required<Options>,
|
|
162
|
-
)
|
|
163
|
-
|
|
164
|
-
return { info, output }
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
export async function buildAssetsDirectory(
|
|
168
|
-
output: {
|
|
169
|
-
files: Record<string, string>
|
|
170
|
-
},
|
|
171
|
-
info: AddOnInfo,
|
|
172
|
-
) {
|
|
173
|
-
const assetsDir = resolve(ADD_ON_DIR, ASSETS_DIR)
|
|
174
|
-
const ignore = createIgnore(process.cwd())
|
|
175
|
-
|
|
176
|
-
if (!existsSync(assetsDir)) {
|
|
177
|
-
const changedFiles: Record<string, string> = {}
|
|
178
|
-
await compareFilesRecursively('.', ignore, output.files, changedFiles)
|
|
179
|
-
|
|
180
|
-
for (const file of Object.keys(changedFiles).filter(
|
|
181
|
-
(file) => !ADD_ON_IGNORE_FILES.includes(basename(file)),
|
|
182
|
-
)) {
|
|
183
|
-
mkdirSync(dirname(resolve(assetsDir, file)), {
|
|
184
|
-
recursive: true,
|
|
185
|
-
})
|
|
186
|
-
if (file.includes('/routes/')) {
|
|
187
|
-
const { url, code, name, jsName } = templatize(changedFiles[file], file)
|
|
188
|
-
info.routes ||= []
|
|
189
|
-
if (!info.routes.find((r) => r.url === url)) {
|
|
190
|
-
info.routes.push({
|
|
191
|
-
url,
|
|
192
|
-
name,
|
|
193
|
-
jsName,
|
|
194
|
-
path: file,
|
|
195
|
-
})
|
|
196
|
-
}
|
|
197
|
-
writeFileSync(resolve(assetsDir, `${file}.ejs`), code)
|
|
198
|
-
} else {
|
|
199
|
-
writeFileSync(resolve(assetsDir, file), changedFiles[file])
|
|
200
|
-
}
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
export async function updateAddOnInfo(environment: Environment) {
|
|
206
|
-
const { info, output } = await generateProject(
|
|
207
|
-
await readCurrentProjectOptions(environment),
|
|
208
|
-
)
|
|
209
|
-
|
|
210
|
-
info.packageAdditions = createPackageAdditions(
|
|
211
|
-
JSON.parse(output.files['./package.json']),
|
|
212
|
-
JSON.parse((await readFile('package.json')).toString()),
|
|
213
|
-
)
|
|
214
|
-
|
|
215
|
-
await buildAssetsDirectory(output, info)
|
|
216
|
-
|
|
217
|
-
mkdirSync(resolve(dirname(INFO_FILE)), { recursive: true })
|
|
218
|
-
writeFileSync(INFO_FILE, JSON.stringify(info, null, 2))
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
export async function compileAddOn(environment: Environment) {
|
|
222
|
-
const info = await readOrGenerateAddOnInfo(
|
|
223
|
-
await readCurrentProjectOptions(environment),
|
|
224
|
-
)
|
|
225
|
-
|
|
226
|
-
const assetsDir = resolve(ADD_ON_DIR, ASSETS_DIR)
|
|
227
|
-
|
|
228
|
-
const compiledInfo: AddOnCompiled = {
|
|
229
|
-
...info,
|
|
230
|
-
files: await recursivelyGatherFiles(assetsDir),
|
|
231
|
-
deletedFiles: [],
|
|
232
|
-
}
|
|
233
|
-
|
|
234
|
-
writeFileSync(COMPILED_FILE, JSON.stringify(compiledInfo, null, 2))
|
|
235
|
-
}
|
|
236
|
-
|
|
237
|
-
export async function initAddOn(environment: Environment) {
|
|
238
|
-
await validateAddOnSetup(environment)
|
|
239
|
-
await updateAddOnInfo(environment)
|
|
240
|
-
await compileAddOn(environment)
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
export async function loadRemoteAddOn(url: string): Promise<AddOn> {
|
|
244
|
-
const response = await fetch(url)
|
|
245
|
-
const jsonContent = await response.json()
|
|
246
|
-
|
|
247
|
-
const checked = AddOnCompiledSchema.safeParse(jsonContent)
|
|
248
|
-
if (!checked.success) {
|
|
249
|
-
throw new Error(`Invalid add-on: ${url}`)
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
const addOn = checked.data
|
|
253
|
-
addOn.id = url
|
|
254
|
-
const out = {
|
|
255
|
-
...addOn,
|
|
256
|
-
getFiles: () => Promise.resolve(Object.keys(addOn.files)),
|
|
257
|
-
getFileContents: (path: string) => Promise.resolve(addOn.files[path]),
|
|
258
|
-
getDeletedFiles: () => Promise.resolve(addOn.deletedFiles),
|
|
259
|
-
}
|
|
260
|
-
return out
|
|
261
|
-
}
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import { readdir } from 'node:fs/promises'
|
|
2
|
-
import { resolve } from 'node:path'
|
|
3
|
-
import { createApp } from '../create-app.js'
|
|
4
|
-
import { createMemoryEnvironment } from '../environment.js'
|
|
5
|
-
import { finalizeAddOns } from '../add-ons.js'
|
|
6
|
-
import { getFrameworkById } from '../frameworks.js'
|
|
7
|
-
import { readConfigFileFromEnvironment } from '../config-file.js'
|
|
8
|
-
import { readFileHelper } from '../file-helpers.js'
|
|
9
|
-
import { loadStarter } from '../custom-add-ons/starter.js'
|
|
10
|
-
|
|
11
|
-
import type { Environment, Mode, Options, SerializedOptions } from '../types.js'
|
|
12
|
-
import type { PersistedOptions } from '../config-file.js'
|
|
13
|
-
|
|
14
|
-
export function createPackageAdditions(
|
|
15
|
-
originalPackageJson: Record<string, any>,
|
|
16
|
-
currentPackageJson: Record<string, any>,
|
|
17
|
-
) {
|
|
18
|
-
const packageAdditions: Record<string, any> = {}
|
|
19
|
-
|
|
20
|
-
const scripts: Record<string, any> = {}
|
|
21
|
-
for (const script of Object.keys(currentPackageJson.scripts || {})) {
|
|
22
|
-
if (
|
|
23
|
-
originalPackageJson.scripts[script] !== currentPackageJson.scripts[script]
|
|
24
|
-
) {
|
|
25
|
-
scripts[script] = currentPackageJson.scripts[script]
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
packageAdditions.scripts = Object.keys(scripts).length ? scripts : undefined
|
|
29
|
-
|
|
30
|
-
const dependencies: Record<string, string> = {}
|
|
31
|
-
for (const dependency of Object.keys(currentPackageJson.dependencies || {})) {
|
|
32
|
-
if (
|
|
33
|
-
originalPackageJson.dependencies[dependency] !==
|
|
34
|
-
currentPackageJson.dependencies[dependency]
|
|
35
|
-
) {
|
|
36
|
-
dependencies[dependency] = currentPackageJson.dependencies[dependency]
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
packageAdditions.dependencies = Object.keys(dependencies).length
|
|
40
|
-
? dependencies
|
|
41
|
-
: undefined
|
|
42
|
-
|
|
43
|
-
const devDependencies: Record<string, string> = {}
|
|
44
|
-
for (const dependency of Object.keys(
|
|
45
|
-
currentPackageJson.devDependencies || {},
|
|
46
|
-
)) {
|
|
47
|
-
if (
|
|
48
|
-
originalPackageJson.devDependencies[dependency] !==
|
|
49
|
-
currentPackageJson.devDependencies[dependency]
|
|
50
|
-
) {
|
|
51
|
-
devDependencies[dependency] =
|
|
52
|
-
currentPackageJson.devDependencies[dependency]
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
packageAdditions.devDependencies = Object.keys(devDependencies).length
|
|
56
|
-
? devDependencies
|
|
57
|
-
: undefined
|
|
58
|
-
|
|
59
|
-
return packageAdditions
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export async function createAppOptionsFromPersisted(
|
|
63
|
-
json: PersistedOptions,
|
|
64
|
-
): Promise<Options> {
|
|
65
|
-
/* eslint-disable unused-imports/no-unused-vars */
|
|
66
|
-
const { version, ...rest } = json
|
|
67
|
-
/* eslint-enable unused-imports/no-unused-vars */
|
|
68
|
-
const framework = getFrameworkById(rest.framework)
|
|
69
|
-
return {
|
|
70
|
-
...rest,
|
|
71
|
-
mode: json.mode as Mode,
|
|
72
|
-
projectName: json.projectName!,
|
|
73
|
-
typescript: json.typescript!,
|
|
74
|
-
tailwind: json.tailwind!,
|
|
75
|
-
git: json.git!,
|
|
76
|
-
packageManager: json.packageManager!,
|
|
77
|
-
targetDir: '',
|
|
78
|
-
framework: framework!,
|
|
79
|
-
starter: json.starter ? await loadStarter(json.starter) : undefined,
|
|
80
|
-
chosenAddOns: await finalizeAddOns(framework!, json.mode as Mode, [
|
|
81
|
-
...json.existingAddOns,
|
|
82
|
-
]),
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
export function createSerializedOptionsFromPersisted(
|
|
87
|
-
json: PersistedOptions,
|
|
88
|
-
): SerializedOptions {
|
|
89
|
-
/* eslint-disable unused-imports/no-unused-vars */
|
|
90
|
-
const { version, ...rest } = json
|
|
91
|
-
/* eslint-enable unused-imports/no-unused-vars */
|
|
92
|
-
return {
|
|
93
|
-
...rest,
|
|
94
|
-
mode: json.mode as Mode,
|
|
95
|
-
projectName: json.projectName!,
|
|
96
|
-
typescript: json.typescript!,
|
|
97
|
-
tailwind: json.tailwind!,
|
|
98
|
-
git: json.git!,
|
|
99
|
-
packageManager: json.packageManager!,
|
|
100
|
-
targetDir: '',
|
|
101
|
-
framework: json.framework,
|
|
102
|
-
starter: json.starter,
|
|
103
|
-
chosenAddOns: json.existingAddOns,
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
export async function runCreateApp(options: Required<Options>) {
|
|
108
|
-
const { environment, output } = createMemoryEnvironment()
|
|
109
|
-
|
|
110
|
-
const targetDir = resolve(process.cwd())
|
|
111
|
-
|
|
112
|
-
await createApp(environment, {
|
|
113
|
-
...options,
|
|
114
|
-
targetDir,
|
|
115
|
-
})
|
|
116
|
-
|
|
117
|
-
output.files = Object.fromEntries(
|
|
118
|
-
Object.entries(output.files).map(([key, value]) => {
|
|
119
|
-
return [key.replace(targetDir, '.'), value]
|
|
120
|
-
}),
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
return output
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
export async function compareFilesRecursively(
|
|
127
|
-
path: string,
|
|
128
|
-
ignore: (filePath: string) => boolean,
|
|
129
|
-
original: Record<string, string>,
|
|
130
|
-
changedFiles: Record<string, string>,
|
|
131
|
-
) {
|
|
132
|
-
const files = await readdir(path, { withFileTypes: true })
|
|
133
|
-
for (const file of files) {
|
|
134
|
-
const filePath = `${path}/${file.name}`
|
|
135
|
-
if (!ignore(file.name)) {
|
|
136
|
-
if (file.isDirectory()) {
|
|
137
|
-
await compareFilesRecursively(filePath, ignore, original, changedFiles)
|
|
138
|
-
} else {
|
|
139
|
-
const contents = await readFileHelper(filePath)
|
|
140
|
-
if (!original[filePath] || original[filePath] !== contents) {
|
|
141
|
-
changedFiles[filePath] = contents
|
|
142
|
-
}
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
export async function readCurrentProjectOptions(environment: Environment) {
|
|
149
|
-
const persistedOptions = await readConfigFileFromEnvironment(
|
|
150
|
-
environment,
|
|
151
|
-
process.cwd(),
|
|
152
|
-
)
|
|
153
|
-
if (!persistedOptions) {
|
|
154
|
-
environment.error(
|
|
155
|
-
'There is no .cta.json file in your project.',
|
|
156
|
-
`This is probably because this was created with an older version of create-tsrouter-app.`,
|
|
157
|
-
)
|
|
158
|
-
process.exit(1)
|
|
159
|
-
}
|
|
160
|
-
return persistedOptions
|
|
161
|
-
}
|