@tanstack/cta-engine 0.14.3 → 0.15.0
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 +5 -91
- package/dist/add-to-app.js +171 -0
- package/dist/config-file.js +34 -11
- package/dist/constants.js +0 -2
- package/dist/create-app.js +142 -451
- package/dist/custom-add-ons/add-on.js +175 -0
- package/dist/custom-add-ons/shared.js +116 -0
- package/dist/custom-add-ons/starter.js +84 -0
- package/dist/environment.js +67 -44
- package/dist/file-helpers.js +165 -0
- package/dist/frameworks.js +92 -0
- package/dist/index.js +18 -1
- package/dist/integrations/git.js +4 -0
- package/dist/integrations/shadcn.js +33 -0
- package/dist/options.js +9 -333
- package/dist/package-json.js +48 -0
- package/dist/package-manager.js +51 -6
- package/dist/registry.js +56 -0
- package/dist/special-steps/index.js +24 -0
- package/dist/special-steps/rimraf-node-modules.js +16 -0
- package/dist/template-file.js +112 -0
- package/dist/types/add-ons.d.ts +3 -8
- package/dist/types/add-to-app.d.ts +17 -0
- package/dist/types/config-file.d.ts +7 -4
- package/dist/types/constants.d.ts +0 -3
- package/dist/types/create-app.d.ts +1 -7
- package/dist/types/custom-add-ons/add-on.d.ts +69 -0
- package/dist/types/custom-add-ons/shared.d.ts +15 -0
- package/dist/types/custom-add-ons/starter.d.ts +7 -0
- package/dist/types/environment.d.ts +2 -1
- package/dist/types/file-helpers.d.ts +15 -0
- package/dist/types/frameworks.d.ts +7 -0
- package/dist/types/index.d.ts +21 -1
- package/dist/types/integrations/git.d.ts +2 -0
- package/dist/types/integrations/shadcn.d.ts +2 -0
- package/dist/types/options.d.ts +2 -6
- package/dist/types/package-json.d.ts +7 -0
- package/dist/types/package-manager.d.ts +18 -1
- package/dist/types/registry.d.ts +25 -0
- package/dist/types/special-steps/index.d.ts +2 -0
- package/dist/types/special-steps/rimraf-node-modules.d.ts +2 -0
- package/dist/types/template-file.d.ts +2 -0
- package/dist/types/types.d.ts +788 -85
- package/dist/types/utils.d.ts +5 -0
- package/dist/types.js +65 -1
- package/dist/utils.js +9 -0
- package/package.json +9 -12
- package/src/add-ons.ts +7 -123
- package/src/add-to-app.ts +276 -0
- package/src/config-file.ts +51 -20
- package/src/constants.ts +0 -5
- package/src/create-app.ts +180 -730
- package/src/custom-add-ons/add-on.ts +261 -0
- package/src/custom-add-ons/shared.ts +160 -0
- package/src/custom-add-ons/starter.ts +126 -0
- package/src/environment.ts +80 -45
- package/src/file-helpers.ts +235 -0
- package/src/frameworks.ts +134 -0
- package/src/index.ts +85 -1
- package/src/integrations/git.ts +7 -0
- package/src/integrations/shadcn.ts +54 -0
- package/src/options.ts +8 -409
- package/src/package-json.ts +69 -0
- package/src/package-manager.ts +80 -9
- package/src/registry.ts +92 -0
- package/src/special-steps/index.ts +36 -0
- package/src/special-steps/rimraf-node-modules.ts +25 -0
- package/src/template-file.ts +150 -0
- package/src/types.ts +175 -87
- package/src/utils.ts +17 -0
- package/tests/add-ons.test.ts +67 -0
- package/tests/add-to-app.test.ts +358 -0
- package/tests/config-file.test.ts +105 -0
- package/tests/create-app.test.ts +120 -0
- package/tests/custom-add-ons/add-on.test.ts +12 -0
- package/tests/custom-add-ons/shared.test.ts +253 -0
- package/tests/custom-add-ons/starter.test.ts +58 -0
- package/tests/environment.test.ts +115 -0
- package/tests/file-helper.test.ts +90 -0
- package/tests/frameworks.test.ts +95 -0
- package/tests/index.test.ts +9 -0
- package/tests/integrations/git.test.ts +20 -0
- package/tests/integrations/shadcn.test.ts +91 -0
- package/tests/options.test.ts +42 -0
- package/tests/package-json.test.ts +63 -0
- package/tests/package-manager.test.ts +154 -0
- package/tests/setupVitest.ts +6 -0
- package/tests/template-file.test.ts +178 -0
- package/tests/utils.test.ts +23 -0
- package/vitest.config.ts +21 -0
- package/dist/add.js +0 -125
- package/dist/cli.js +0 -132
- package/dist/custom-add-on.js +0 -254
- package/dist/file-helper.js +0 -18
- package/dist/mcp.js +0 -229
- package/dist/templates.js +0 -6
- package/dist/toolchain.js +0 -6
- package/dist/types/add.d.ts +0 -3
- package/dist/types/cli.d.ts +0 -7
- package/dist/types/custom-add-on.d.ts +0 -3
- package/dist/types/file-helper.d.ts +0 -2
- package/dist/types/mcp.d.ts +0 -7
- package/dist/types/templates.d.ts +0 -1
- package/dist/types/toolchain.d.ts +0 -3
- package/src/add.ts +0 -186
- package/src/cli.ts +0 -210
- package/src/custom-add-on.ts +0 -325
- package/src/file-helper.ts +0 -20
- package/src/mcp.ts +0 -302
- package/src/templates.ts +0 -7
- package/src/toolchain.ts +0 -7
- package/templates/react/add-on/clerk/README.md +0 -3
- package/templates/react/add-on/clerk/assets/_dot_env.local.append +0 -2
- package/templates/react/add-on/clerk/assets/src/integrations/clerk/header-user.tsx +0 -19
- package/templates/react/add-on/clerk/assets/src/integrations/clerk/provider.tsx +0 -18
- package/templates/react/add-on/clerk/assets/src/routes/demo.clerk.tsx +0 -20
- package/templates/react/add-on/clerk/info.json +0 -13
- package/templates/react/add-on/clerk/package.json +0 -5
- package/templates/react/add-on/convex/README.md +0 -4
- package/templates/react/add-on/convex/assets/_dot_cursorrules.append +0 -93
- package/templates/react/add-on/convex/assets/_dot_env.local.append +0 -3
- package/templates/react/add-on/convex/assets/convex/products.ts +0 -8
- package/templates/react/add-on/convex/assets/convex/schema.ts +0 -10
- package/templates/react/add-on/convex/assets/src/integrations/convex/provider.tsx +0 -20
- package/templates/react/add-on/convex/assets/src/routes/demo.convex.tsx +0 -33
- package/templates/react/add-on/convex/info.json +0 -13
- package/templates/react/add-on/convex/package.json +0 -6
- package/templates/react/add-on/form/assets/src/components/demo.FormComponents.tsx.ejs +0 -300
- package/templates/react/add-on/form/assets/src/hooks/demo.form-context.ts +0 -4
- package/templates/react/add-on/form/assets/src/hooks/demo.form.ts +0 -22
- package/templates/react/add-on/form/assets/src/routes/demo.form.address.tsx.ejs +0 -213
- package/templates/react/add-on/form/assets/src/routes/demo.form.simple.tsx.ejs +0 -77
- package/templates/react/add-on/form/info.json +0 -26
- package/templates/react/add-on/form/package.json +0 -6
- package/templates/react/add-on/module-federation/assets/module-federation.config.js.ejs +0 -31
- package/templates/react/add-on/module-federation/assets/src/demo-mf-component.tsx +0 -3
- package/templates/react/add-on/module-federation/assets/src/demo-mf-self-contained.tsx +0 -11
- package/templates/react/add-on/module-federation/info.json +0 -7
- package/templates/react/add-on/module-federation/package.json +0 -5
- package/templates/react/add-on/netlify/README.md +0 -11
- package/templates/react/add-on/netlify/info.json +0 -7
- package/templates/react/add-on/sentry/assets/_dot_cursorrules.append +0 -22
- package/templates/react/add-on/sentry/assets/_dot_env.local.append +0 -11
- package/templates/react/add-on/sentry/assets/src/app/global-middleware.ts +0 -11
- package/templates/react/add-on/sentry/assets/src/routes/demo.sentry.testing.tsx +0 -489
- package/templates/react/add-on/sentry/info.json +0 -14
- package/templates/react/add-on/sentry/package.json +0 -5
- package/templates/react/add-on/shadcn/README.md +0 -7
- package/templates/react/add-on/shadcn/assets/_dot_cursorrules.append +0 -7
- package/templates/react/add-on/shadcn/assets/components.json +0 -21
- package/templates/react/add-on/shadcn/assets/src/lib/utils.ts +0 -6
- package/templates/react/add-on/shadcn/assets/src/styles.css +0 -138
- package/templates/react/add-on/shadcn/info.json +0 -7
- package/templates/react/add-on/shadcn/package.json +0 -9
- package/templates/react/add-on/start/assets/_dot_gitignore.append +0 -2
- package/templates/react/add-on/start/assets/app.config.ts.ejs +0 -32
- package/templates/react/add-on/start/assets/src/api.ts +0 -6
- package/templates/react/add-on/start/assets/src/client.tsx.ejs +0 -33
- package/templates/react/add-on/start/assets/src/router.tsx.ejs +0 -48
- package/templates/react/add-on/start/assets/src/routes/api.demo-names.ts +0 -11
- package/templates/react/add-on/start/assets/src/routes/demo.start.api-request.tsx.ejs +0 -33
- package/templates/react/add-on/start/assets/src/routes/demo.start.server-funcs.tsx +0 -50
- package/templates/react/add-on/start/assets/src/ssr.tsx.ejs +0 -30
- package/templates/react/add-on/start/info.json +0 -18
- package/templates/react/add-on/start/package.json +0 -13
- package/templates/react/add-on/store/assets/src/lib/demo-store.ts +0 -13
- package/templates/react/add-on/store/assets/src/routes/demo.store.tsx.ejs +0 -75
- package/templates/react/add-on/store/info.json +0 -13
- package/templates/react/add-on/store/package.json +0 -6
- package/templates/react/add-on/t3env/README.md +0 -16
- package/templates/react/add-on/t3env/assets/src/env.ts +0 -39
- package/templates/react/add-on/t3env/info.json +0 -10
- package/templates/react/add-on/t3env/package.json +0 -6
- package/templates/react/add-on/tRPC/assets/src/integrations/trpc/init.ts +0 -9
- package/templates/react/add-on/tRPC/assets/src/integrations/trpc/react.ts +0 -4
- package/templates/react/add-on/tRPC/assets/src/integrations/trpc/router.ts +0 -18
- package/templates/react/add-on/tRPC/assets/src/routes/api.trpc.$.tsx +0 -16
- package/templates/react/add-on/tRPC/info.json +0 -9
- package/templates/react/add-on/tRPC/package.json +0 -9
- package/templates/react/add-on/table/assets/src/data/demo-table-data.ts +0 -50
- package/templates/react/add-on/table/assets/src/routes/demo.table.tsx.ejs +0 -373
- package/templates/react/add-on/table/info.json +0 -13
- package/templates/react/add-on/table/package.json +0 -7
- package/templates/react/add-on/tanstack-query/assets/src/integrations/tanstack-query/layout.tsx +0 -5
- package/templates/react/add-on/tanstack-query/assets/src/integrations/tanstack-query/root-provider.tsx.ejs +0 -70
- package/templates/react/add-on/tanstack-query/assets/src/routes/demo.tanstack-query.tsx.ejs +0 -53
- package/templates/react/add-on/tanstack-query/info.json +0 -13
- package/templates/react/add-on/tanstack-query/package.json +0 -6
- package/templates/react/base/README.md.ejs +0 -558
- package/templates/react/base/_dot_gitignore +0 -5
- package/templates/react/base/_dot_vscode/settings.biome.json +0 -38
- package/templates/react/base/_dot_vscode/settings.json +0 -11
- package/templates/react/base/index.html.ejs +0 -20
- package/templates/react/base/package.biome.json +0 -10
- package/templates/react/base/package.eslintprettier.json +0 -11
- package/templates/react/base/package.json +0 -30
- package/templates/react/base/package.ts.json +0 -7
- package/templates/react/base/package.tw.json +0 -6
- 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 +0 -25
- package/templates/react/base/public/robots.txt +0 -3
- package/templates/react/base/src/App.css +0 -38
- package/templates/react/base/src/App.test.tsx.ejs +0 -10
- package/templates/react/base/src/App.tsx.ejs +0 -74
- package/templates/react/base/src/components/Header.tsx.ejs +0 -27
- package/templates/react/base/src/logo.svg +0 -44
- package/templates/react/base/src/reportWebVitals.ts.ejs +0 -28
- package/templates/react/base/src/styles.css.ejs +0 -15
- package/templates/react/base/toolchain/.prettierignore +0 -3
- package/templates/react/base/toolchain/biome.json +0 -31
- package/templates/react/base/toolchain/eslint.config.js +0 -5
- package/templates/react/base/toolchain/prettier.config.js +0 -10
- package/templates/react/base/tsconfig.json.ejs +0 -29
- package/templates/react/base/vite.config.js.ejs +0 -23
- package/templates/react/code-router/src/main.tsx.ejs +0 -92
- package/templates/react/example/tanchat/README.md +0 -37
- package/templates/react/example/tanchat/assets/_dot_env.local.append +0 -2
- 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 +0 -173
- package/templates/react/example/tanchat/assets/src/components/example-GuitarRecommendation.tsx +0 -47
- package/templates/react/example/tanchat/assets/src/data/example-guitars.ts +0 -83
- package/templates/react/example/tanchat/assets/src/demo.index.css +0 -220
- package/templates/react/example/tanchat/assets/src/integrations/tanchat/header-user.tsx +0 -5
- package/templates/react/example/tanchat/assets/src/routes/api.messages.ts +0 -24
- package/templates/react/example/tanchat/assets/src/routes/api.sse.ts +0 -23
- package/templates/react/example/tanchat/assets/src/routes/example.chat.tsx +0 -159
- package/templates/react/example/tanchat/assets/src/routes/example.guitars/$guitarId.tsx +0 -50
- package/templates/react/example/tanchat/assets/src/routes/example.guitars/index.tsx +0 -54
- package/templates/react/example/tanchat/assets/src/store/example-assistant.ts +0 -3
- package/templates/react/example/tanchat/assets/src/utils/demo.ai.ts +0 -62
- package/templates/react/example/tanchat/assets/src/utils/demo.sse.ts +0 -31
- package/templates/react/example/tanchat/assets/src/utils/demo.tools.ts +0 -47
- package/templates/react/example/tanchat/info.json +0 -19
- package/templates/react/example/tanchat/package.json +0 -16
- package/templates/react/file-router/package.fr.json +0 -5
- package/templates/react/file-router/src/main.tsx.ejs +0 -55
- package/templates/react/file-router/src/routes/__root.tsx.ejs +0 -82
- package/templates/solid/add-on/form/assets/src/routes/demo.form.tsx.ejs +0 -352
- package/templates/solid/add-on/form/info.json +0 -13
- package/templates/solid/add-on/form/package.json +0 -5
- package/templates/solid/add-on/module-federation/assets/module-federation.config.js.ejs +0 -27
- package/templates/solid/add-on/module-federation/assets/src/demo-mf-component.tsx +0 -3
- package/templates/solid/add-on/module-federation/assets/src/demo-mf-self-contained.tsx +0 -9
- package/templates/solid/add-on/module-federation/info.json +0 -7
- package/templates/solid/add-on/module-federation/package.json +0 -5
- package/templates/solid/add-on/sentry/assets/_dot_cursorrules.append +0 -22
- package/templates/solid/add-on/sentry/assets/_dot_env.local.append +0 -2
- package/templates/solid/add-on/sentry/assets/src/routes/demo.sentry.bad-event-handler.tsx +0 -20
- package/templates/solid/add-on/sentry/info.json +0 -13
- package/templates/solid/add-on/sentry/package.json +0 -5
- package/templates/solid/add-on/solid-ui/README.md +0 -9
- package/templates/solid/add-on/solid-ui/assets/src/lib/utils.ts +0 -6
- package/templates/solid/add-on/solid-ui/assets/src/styles.css +0 -138
- package/templates/solid/add-on/solid-ui/assets/ui.config.json +0 -13
- package/templates/solid/add-on/solid-ui/info.json +0 -11
- package/templates/solid/add-on/solid-ui/package.json +0 -9
- package/templates/solid/add-on/start/assets/app.config.ts +0 -16
- package/templates/solid/add-on/start/assets/src/api.ts +0 -6
- package/templates/solid/add-on/start/assets/src/client.tsx +0 -7
- package/templates/solid/add-on/start/assets/src/router.tsx.ejs +0 -24
- package/templates/solid/add-on/start/assets/src/routes/demo.start.server-funcs.tsx +0 -49
- package/templates/solid/add-on/start/assets/src/ssr.tsx +0 -12
- package/templates/solid/add-on/start/info.json +0 -14
- package/templates/solid/add-on/start/package.json +0 -12
- package/templates/solid/add-on/store/assets/src/lib/demo-store.ts +0 -13
- package/templates/solid/add-on/store/assets/src/routes/demo.store.tsx.ejs +0 -77
- package/templates/solid/add-on/store/info.json +0 -13
- package/templates/solid/add-on/store/package.json +0 -6
- package/templates/solid/add-on/t3env/README.md +0 -16
- package/templates/solid/add-on/t3env/assets/src/env.ts +0 -39
- package/templates/solid/add-on/t3env/info.json +0 -10
- package/templates/solid/add-on/t3env/package.json +0 -6
- package/templates/solid/add-on/tanstack-query/assets/src/integrations/tanstack-query/header-user.tsx +0 -5
- package/templates/solid/add-on/tanstack-query/assets/src/integrations/tanstack-query/provider.tsx +0 -15
- package/templates/solid/add-on/tanstack-query/assets/src/routes/demo.tanstack-query.tsx +0 -30
- package/templates/solid/add-on/tanstack-query/info.json +0 -13
- package/templates/solid/add-on/tanstack-query/package.json +0 -6
- package/templates/solid/base/README.md.ejs +0 -215
- package/templates/solid/base/_dot_cursorrules.append +0 -35
- package/templates/solid/base/_dot_gitignore +0 -5
- package/templates/solid/base/_dot_vscode/settings.biome.json +0 -38
- package/templates/solid/base/_dot_vscode/settings.json +0 -11
- package/templates/solid/base/index.html.ejs +0 -20
- package/templates/solid/base/package.biome.json +0 -10
- package/templates/solid/base/package.eslintprettier.json +0 -11
- package/templates/solid/base/package.json +0 -23
- package/templates/solid/base/package.ts.json +0 -5
- package/templates/solid/base/package.tw.json +0 -6
- 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 +0 -25
- package/templates/solid/base/public/robots.txt +0 -3
- package/templates/solid/base/src/App.css +0 -0
- package/templates/solid/base/src/App.tsx.ejs +0 -47
- package/templates/solid/base/src/components/Header.tsx.ejs +0 -26
- package/templates/solid/base/src/logo.svg +0 -120
- package/templates/solid/base/src/styles.css.ejs +0 -15
- package/templates/solid/base/toolchain/.prettierignore +0 -3
- package/templates/solid/base/toolchain/biome.json +0 -31
- package/templates/solid/base/toolchain/eslint.config.js +0 -5
- package/templates/solid/base/toolchain/prettier.config.js +0 -10
- package/templates/solid/base/tsconfig.json.ejs +0 -31
- package/templates/solid/base/vite.config.js.ejs +0 -22
- package/templates/solid/code-router/src/main.tsx.ejs +0 -71
- package/templates/solid/example/tanchat/README.md +0 -52
- package/templates/solid/example/tanchat/assets/ai-streaming-server/README.md +0 -110
- package/templates/solid/example/tanchat/assets/ai-streaming-server/_dot_env.example +0 -1
- package/templates/solid/example/tanchat/assets/ai-streaming-server/package.json +0 -26
- package/templates/solid/example/tanchat/assets/ai-streaming-server/src/index.ts +0 -102
- package/templates/solid/example/tanchat/assets/ai-streaming-server/tsconfig.json +0 -15
- package/templates/solid/example/tanchat/assets/src/components/demo.SettingsDialog.tsx +0 -149
- package/templates/solid/example/tanchat/assets/src/demo.index.css +0 -227
- package/templates/solid/example/tanchat/assets/src/lib/demo-store.ts +0 -13
- package/templates/solid/example/tanchat/assets/src/routes/example.chat.tsx +0 -435
- package/templates/solid/example/tanchat/assets/src/store/demo.hooks.ts +0 -17
- package/templates/solid/example/tanchat/assets/src/store/demo.store.ts +0 -133
- package/templates/solid/example/tanchat/info.json +0 -14
- package/templates/solid/example/tanchat/package.json +0 -7
- package/templates/solid/file-router/package.fr.json +0 -5
- package/templates/solid/file-router/src/main.tsx.ejs +0 -47
- package/templates/solid/file-router/src/routes/__root.tsx.ejs +0 -41
- package/templates/solid/file-router/src/routes/index.tsx +0 -43
- package/tests/cra.test.ts +0 -293
- package/tests/snapshots/cra/cr-js-npm.json +0 -33
- package/tests/snapshots/cra/cr-ts-npm.json +0 -34
- package/tests/snapshots/cra/cr-ts-start-npm.json +0 -38
- package/tests/snapshots/cra/fr-ts-npm.json +0 -34
- package/tests/snapshots/cra/fr-ts-tw-npm.json +0 -33
- package/tests/snapshots/cra/solid-cr-js-npm.json +0 -31
- package/tests/snapshots/cra/solid-cr-ts-npm.json +0 -32
- package/tests/snapshots/cra/solid-cr-ts-start-npm.json +0 -36
- package/tests/snapshots/cra/solid-fr-ts-npm.json +0 -33
- package/tests/snapshots/cra/solid-fr-ts-tw-npm.json +0 -32
- package/tests/test-utilities.ts +0 -87
package/dist/create-app.js
CHANGED
|
@@ -1,491 +1,182 @@
|
|
|
1
|
-
import { basename,
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
toRoot) {
|
|
1
|
+
import { basename, resolve } from 'node:path';
|
|
2
|
+
import { isBase64 } from './file-helpers.js';
|
|
3
|
+
import { formatCommand } from './utils.js';
|
|
4
|
+
import { writeConfigFileToEnvironment } from './config-file.js';
|
|
5
|
+
import { getPackageManagerScriptCommand, packageManagerInstall, } from './package-manager.js';
|
|
6
|
+
import { createPackageJSON } from './package-json.js';
|
|
7
|
+
import { createTemplateFile } from './template-file.js';
|
|
8
|
+
import { installShadcnComponents } from './integrations/shadcn.js';
|
|
9
|
+
import { setupGit } from './integrations/git.js';
|
|
10
|
+
import { runSpecialSteps } from './special-steps/index.js';
|
|
11
|
+
async function writeFiles(environment, options) {
|
|
12
|
+
const templateFileFromContent = createTemplateFile(environment, options);
|
|
13
|
+
async function writeFileBundle(bundle) {
|
|
14
|
+
const files = await bundle.getFiles();
|
|
16
15
|
for (const file of files) {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
16
|
+
const contents = await bundle.getFileContents(file);
|
|
17
|
+
const isBinaryFile = isBase64(contents);
|
|
18
|
+
if (isBinaryFile) {
|
|
19
|
+
await environment.writeFileBase64(resolve(options.targetDir, file), contents);
|
|
21
20
|
}
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
function jsSafeName(name) {
|
|
27
|
-
return name
|
|
28
|
-
.split(/[^a-zA-Z0-9]/)
|
|
29
|
-
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
30
|
-
.join('');
|
|
31
|
-
}
|
|
32
|
-
function createTemplateFile(environment, projectName, options, targetDir) {
|
|
33
|
-
return async function templateFile(file, content, targetFileName, extraTemplateValues) {
|
|
34
|
-
function getPackageManagerAddScript(packageName, isDev = false) {
|
|
35
|
-
let command;
|
|
36
|
-
switch (options.packageManager) {
|
|
37
|
-
case 'yarn':
|
|
38
|
-
case 'pnpm':
|
|
39
|
-
command = isDev
|
|
40
|
-
? `${options.packageManager} add ${packageName} --dev`
|
|
41
|
-
: `${options.packageManager} add ${packageName}`;
|
|
42
|
-
break;
|
|
43
|
-
default:
|
|
44
|
-
command = isDev
|
|
45
|
-
? `${options.packageManager} install ${packageName} -D`
|
|
46
|
-
: `${options.packageManager} install ${packageName}`;
|
|
47
|
-
break;
|
|
48
|
-
}
|
|
49
|
-
return command;
|
|
50
|
-
}
|
|
51
|
-
function getPackageManagerRunScript(scriptName) {
|
|
52
|
-
let command;
|
|
53
|
-
switch (options.packageManager) {
|
|
54
|
-
case 'yarn':
|
|
55
|
-
case 'pnpm':
|
|
56
|
-
command = `${options.packageManager} ${scriptName}`;
|
|
57
|
-
break;
|
|
58
|
-
case 'deno':
|
|
59
|
-
command = `${options.packageManager} task ${scriptName}`;
|
|
60
|
-
break;
|
|
61
|
-
default:
|
|
62
|
-
command = `${options.packageManager} run ${scriptName}`;
|
|
63
|
-
break;
|
|
64
|
-
}
|
|
65
|
-
return command;
|
|
66
|
-
}
|
|
67
|
-
const templateValues = {
|
|
68
|
-
packageManager: options.packageManager,
|
|
69
|
-
projectName: projectName,
|
|
70
|
-
typescript: options.typescript,
|
|
71
|
-
tailwind: options.tailwind,
|
|
72
|
-
toolchain: options.toolchain,
|
|
73
|
-
js: options.typescript ? 'ts' : 'js',
|
|
74
|
-
jsx: options.typescript ? 'tsx' : 'jsx',
|
|
75
|
-
fileRouter: options.mode === FILE_ROUTER,
|
|
76
|
-
codeRouter: options.mode === CODE_ROUTER,
|
|
77
|
-
addOnEnabled: options.chosenAddOns.reduce((acc, addOn) => {
|
|
78
|
-
acc[addOn.id] = true;
|
|
79
|
-
return acc;
|
|
80
|
-
}, {}),
|
|
81
|
-
addOns: options.chosenAddOns,
|
|
82
|
-
...extraTemplateValues,
|
|
83
|
-
getPackageManagerAddScript,
|
|
84
|
-
getPackageManagerRunScript,
|
|
85
|
-
};
|
|
86
|
-
try {
|
|
87
|
-
content = render(content, templateValues);
|
|
88
|
-
}
|
|
89
|
-
catch (error) {
|
|
90
|
-
console.error(chalk.red(`EJS error in file ${file}`));
|
|
91
|
-
console.error(error);
|
|
92
|
-
process.exit(1);
|
|
93
|
-
}
|
|
94
|
-
const target = targetFileName ?? file.replace('.ejs', '');
|
|
95
|
-
if (target.endsWith('.ts') || target.endsWith('.tsx')) {
|
|
96
|
-
content = await format(content, {
|
|
97
|
-
semi: false,
|
|
98
|
-
singleQuote: true,
|
|
99
|
-
trailingComma: 'all',
|
|
100
|
-
parser: 'typescript',
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
await environment.writeFile(resolve(targetDir, target), content);
|
|
104
|
-
};
|
|
105
|
-
}
|
|
106
|
-
async function createPackageJSON(environment, projectName, options, templateDir, routerDir, targetDir, addOns) {
|
|
107
|
-
let packageJSON = JSON.parse(await environment.readFile(resolve(templateDir, 'package.json'), 'utf8'));
|
|
108
|
-
packageJSON.name = projectName;
|
|
109
|
-
if (options.typescript) {
|
|
110
|
-
const tsPackageJSON = JSON.parse(await environment.readFile(resolve(templateDir, 'package.ts.json'), 'utf8'));
|
|
111
|
-
packageJSON = {
|
|
112
|
-
...packageJSON,
|
|
113
|
-
devDependencies: {
|
|
114
|
-
...packageJSON.devDependencies,
|
|
115
|
-
...tsPackageJSON.devDependencies,
|
|
116
|
-
},
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
if (options.tailwind) {
|
|
120
|
-
const twPackageJSON = JSON.parse(await environment.readFile(resolve(templateDir, 'package.tw.json'), 'utf8'));
|
|
121
|
-
packageJSON = {
|
|
122
|
-
...packageJSON,
|
|
123
|
-
dependencies: {
|
|
124
|
-
...packageJSON.dependencies,
|
|
125
|
-
...twPackageJSON.dependencies,
|
|
126
|
-
},
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
if (options.toolchain === 'biome') {
|
|
130
|
-
const biomePackageJSON = JSON.parse(await environment.readFile(resolve(templateDir, 'package.biome.json'), 'utf8'));
|
|
131
|
-
packageJSON = {
|
|
132
|
-
...packageJSON,
|
|
133
|
-
scripts: {
|
|
134
|
-
...packageJSON.scripts,
|
|
135
|
-
...biomePackageJSON.scripts,
|
|
136
|
-
},
|
|
137
|
-
devDependencies: {
|
|
138
|
-
...packageJSON.devDependencies,
|
|
139
|
-
...biomePackageJSON.devDependencies,
|
|
140
|
-
},
|
|
141
|
-
};
|
|
142
|
-
}
|
|
143
|
-
if (options.toolchain === 'eslint+prettier') {
|
|
144
|
-
const eslintPrettierPackageJSON = JSON.parse(await environment.readFile(resolve(templateDir, 'package.eslintprettier.json'), 'utf-8'));
|
|
145
|
-
packageJSON = {
|
|
146
|
-
...packageJSON,
|
|
147
|
-
scripts: {
|
|
148
|
-
...packageJSON.scripts,
|
|
149
|
-
...eslintPrettierPackageJSON.scripts,
|
|
150
|
-
},
|
|
151
|
-
devDependencies: {
|
|
152
|
-
...packageJSON.devDependencies,
|
|
153
|
-
...eslintPrettierPackageJSON.devDependencies,
|
|
154
|
-
},
|
|
155
|
-
};
|
|
156
|
-
}
|
|
157
|
-
if (options.mode === FILE_ROUTER) {
|
|
158
|
-
const frPackageJSON = JSON.parse(await environment.readFile(resolve(routerDir, 'package.fr.json'), 'utf8'));
|
|
159
|
-
packageJSON = {
|
|
160
|
-
...packageJSON,
|
|
161
|
-
dependencies: {
|
|
162
|
-
...packageJSON.dependencies,
|
|
163
|
-
...frPackageJSON.dependencies,
|
|
164
|
-
},
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
for (const addOn of addOns) {
|
|
168
|
-
packageJSON = {
|
|
169
|
-
...packageJSON,
|
|
170
|
-
dependencies: {
|
|
171
|
-
...packageJSON.dependencies,
|
|
172
|
-
...addOn.dependencies,
|
|
173
|
-
},
|
|
174
|
-
devDependencies: {
|
|
175
|
-
...packageJSON.devDependencies,
|
|
176
|
-
...addOn.devDependencies,
|
|
177
|
-
},
|
|
178
|
-
scripts: {
|
|
179
|
-
...packageJSON.scripts,
|
|
180
|
-
...addOn.scripts,
|
|
181
|
-
},
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
packageJSON.dependencies = sortObject(packageJSON.dependencies);
|
|
185
|
-
packageJSON.devDependencies = sortObject(packageJSON.devDependencies);
|
|
186
|
-
await environment.writeFile(resolve(targetDir, 'package.json'), JSON.stringify(packageJSON, null, 2));
|
|
187
|
-
}
|
|
188
|
-
async function copyAddOnFile(environment, content, target, targetPath, templateFile) {
|
|
189
|
-
let targetFile = basename(target).replace(/^_dot_/, '.');
|
|
190
|
-
let isTemplate = false;
|
|
191
|
-
if (targetFile.endsWith('.ejs')) {
|
|
192
|
-
targetFile = targetFile.replace('.ejs', '');
|
|
193
|
-
isTemplate = true;
|
|
194
|
-
}
|
|
195
|
-
let isAppend = false;
|
|
196
|
-
if (targetFile.endsWith('.append')) {
|
|
197
|
-
targetFile = targetFile.replace('.append', '');
|
|
198
|
-
isAppend = true;
|
|
199
|
-
}
|
|
200
|
-
const finalTargetPath = resolve(dirname(targetPath), targetFile);
|
|
201
|
-
const binaryContent = getBinaryFile(content);
|
|
202
|
-
if (binaryContent) {
|
|
203
|
-
await environment.writeFile(finalTargetPath, binaryContent);
|
|
204
|
-
return;
|
|
205
|
-
}
|
|
206
|
-
if (isTemplate) {
|
|
207
|
-
await templateFile(content, finalTargetPath);
|
|
208
|
-
}
|
|
209
|
-
else {
|
|
210
|
-
if (isAppend) {
|
|
211
|
-
await environment.appendFile(finalTargetPath, content);
|
|
212
|
-
}
|
|
213
|
-
else {
|
|
214
|
-
await environment.writeFile(finalTargetPath, content);
|
|
215
|
-
}
|
|
216
|
-
}
|
|
217
|
-
}
|
|
218
|
-
export async function createApp(options, { silent = false, environment, cwd, appName = 'TanStack', }) {
|
|
219
|
-
environment.startRun();
|
|
220
|
-
const templateDirBase = resolve(getTemplatesRoot(), options.framework, 'base');
|
|
221
|
-
const templateDirRouter = resolve(getTemplatesRoot(), options.framework, options.mode);
|
|
222
|
-
let targetDir = cwd || '';
|
|
223
|
-
if (!targetDir.length) {
|
|
224
|
-
targetDir = resolve(process.cwd(), options.projectName);
|
|
225
|
-
}
|
|
226
|
-
const copyFiles = createCopyFiles(environment, targetDir);
|
|
227
|
-
const templateFileFromContent = createTemplateFile(environment, options.projectName, options, targetDir);
|
|
228
|
-
async function templateFile(templateBase, file, targetFileName, extraTemplateValues) {
|
|
229
|
-
const content = await environment.readFile(resolve(templateBase, file), 'utf-8');
|
|
230
|
-
return templateFileFromContent(file, content.toString(), targetFileName, extraTemplateValues);
|
|
231
|
-
}
|
|
232
|
-
const isAddOnEnabled = (id) => options.chosenAddOns.find((a) => a.id === id);
|
|
233
|
-
async function runAddOn(addOn) {
|
|
234
|
-
if (addOn.files) {
|
|
235
|
-
for (const file of Object.keys(addOn.files)) {
|
|
236
|
-
await copyAddOnFile(environment, addOn.files[file], file, resolve(targetDir, file), (content, targetFileName) => templateFileFromContent(targetFileName, content));
|
|
21
|
+
else {
|
|
22
|
+
await templateFileFromContent(file, contents);
|
|
237
23
|
}
|
|
238
24
|
}
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
if (addOn.command && addOn.command.command) {
|
|
245
|
-
await environment.execute(addOn.command.command, addOn.command.args || [], resolve(targetDir));
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
// Setup the .vscode directory
|
|
249
|
-
switch (options.toolchain) {
|
|
250
|
-
case 'biome':
|
|
251
|
-
await environment.copyFile(resolve(templateDirBase, '_dot_vscode/settings.biome.json'), resolve(targetDir, '.vscode/settings.json'));
|
|
252
|
-
break;
|
|
253
|
-
case 'none':
|
|
254
|
-
default:
|
|
255
|
-
await environment.copyFile(resolve(templateDirBase, '_dot_vscode/settings.json'), resolve(targetDir, '.vscode/settings.json'));
|
|
256
|
-
}
|
|
257
|
-
// Fill the public directory
|
|
258
|
-
copyFiles(templateDirBase, [
|
|
259
|
-
'./public/robots.txt',
|
|
260
|
-
'./public/favicon.ico',
|
|
261
|
-
'./public/manifest.json',
|
|
262
|
-
'./public/logo192.png',
|
|
263
|
-
'./public/logo512.png',
|
|
264
|
-
]);
|
|
265
|
-
// Check for a .cursorrules file
|
|
266
|
-
if (environment.exists(resolve(templateDirBase, '.cursorrules'))) {
|
|
267
|
-
await environment.copyFile(resolve(templateDirBase, '.cursorrules'), resolve(targetDir, '.cursorrules'));
|
|
268
|
-
}
|
|
269
|
-
// Copy in Vite and Tailwind config and CSS
|
|
270
|
-
if (!options.tailwind) {
|
|
271
|
-
await copyFiles(templateDirBase, ['./src/App.css']);
|
|
272
|
-
}
|
|
273
|
-
// Don't create a vite.config.js file if we are building a Start app
|
|
274
|
-
if (!isAddOnEnabled('start')) {
|
|
275
|
-
await templateFile(templateDirBase, './vite.config.js.ejs');
|
|
276
|
-
}
|
|
277
|
-
await templateFile(templateDirBase, './src/styles.css.ejs');
|
|
278
|
-
copyFiles(templateDirBase, ['./src/logo.svg']);
|
|
279
|
-
if (options.toolchain === 'biome') {
|
|
280
|
-
copyFiles(templateDirBase, ['./toolchain/biome.json'], true);
|
|
281
|
-
}
|
|
282
|
-
if (options.toolchain === 'eslint+prettier') {
|
|
283
|
-
copyFiles(templateDirBase, [
|
|
284
|
-
'./toolchain/eslint.config.js',
|
|
285
|
-
'./toolchain/prettier.config.js',
|
|
286
|
-
'./toolchain/.prettierignore',
|
|
287
|
-
], true);
|
|
288
|
-
}
|
|
289
|
-
// Setup reportWebVitals
|
|
290
|
-
if (!isAddOnEnabled('start') && options.framework === 'react') {
|
|
291
|
-
if (options.typescript) {
|
|
292
|
-
await templateFile(templateDirBase, './src/reportWebVitals.ts.ejs');
|
|
293
|
-
}
|
|
294
|
-
else {
|
|
295
|
-
await templateFile(templateDirBase, './src/reportWebVitals.ts.ejs', './src/reportWebVitals.js');
|
|
25
|
+
const deletedFiles = await bundle.getDeletedFiles();
|
|
26
|
+
for (const file of deletedFiles) {
|
|
27
|
+
await environment.deleteFile(resolve(options.targetDir, file));
|
|
296
28
|
}
|
|
297
29
|
}
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
// Setup the package.json file, optionally with typescript, tailwind and formatter/linter
|
|
308
|
-
await createPackageJSON(environment, options.projectName, options, templateDirBase, templateDirRouter, targetDir, options.chosenAddOns.map((addOn) => addOn.packageAdditions));
|
|
309
|
-
// Copy all the asset files from the addons
|
|
310
|
-
const s = silent ? null : spinner();
|
|
311
|
-
for (const type of ['add-on', 'example']) {
|
|
30
|
+
environment.startStep({
|
|
31
|
+
id: 'write-framework-files',
|
|
32
|
+
type: 'file',
|
|
33
|
+
message: 'Writing framework files...',
|
|
34
|
+
});
|
|
35
|
+
await writeFileBundle(options.framework);
|
|
36
|
+
environment.finishStep('write-framework-files', 'Framework files written');
|
|
37
|
+
let wroteAddonFiles = false;
|
|
38
|
+
for (const type of ['add-on', 'example', 'toolchain']) {
|
|
312
39
|
for (const phase of ['setup', 'add-on', 'example']) {
|
|
313
40
|
for (const addOn of options.chosenAddOns.filter((addOn) => addOn.phase === phase && addOn.type === type)) {
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
41
|
+
environment.startStep({
|
|
42
|
+
id: 'write-addon-files',
|
|
43
|
+
type: 'file',
|
|
44
|
+
message: `Writing ${addOn.name} files...`,
|
|
45
|
+
});
|
|
46
|
+
await writeFileBundle(addOn);
|
|
47
|
+
wroteAddonFiles = true;
|
|
317
48
|
}
|
|
318
49
|
}
|
|
319
50
|
}
|
|
320
|
-
if (
|
|
321
|
-
|
|
322
|
-
for (const addOn of options.chosenAddOns) {
|
|
323
|
-
if (addOn.shadcnComponents) {
|
|
324
|
-
for (const component of addOn.shadcnComponents) {
|
|
325
|
-
shadcnComponents.add(component);
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}
|
|
329
|
-
if (options.overlay) {
|
|
330
|
-
if (options.overlay.shadcnComponents) {
|
|
331
|
-
for (const component of options.overlay.shadcnComponents) {
|
|
332
|
-
shadcnComponents.add(component);
|
|
333
|
-
}
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
if (shadcnComponents.size > 0) {
|
|
337
|
-
s?.start(`Installing shadcn components (${Array.from(shadcnComponents).join(', ')})...`);
|
|
338
|
-
await packageManagerExecute(environment, options.packageManager, 'shadcn@latest', ['add', '--silent', '--yes', ...shadcnComponents], resolve(targetDir));
|
|
339
|
-
s?.stop(`Installed additional shadcn components`);
|
|
340
|
-
}
|
|
51
|
+
if (wroteAddonFiles) {
|
|
52
|
+
environment.finishStep('write-addon-files', 'Add-on files written');
|
|
341
53
|
}
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
54
|
+
if (options.starter) {
|
|
55
|
+
environment.startStep({
|
|
56
|
+
id: 'write-starter-files',
|
|
57
|
+
type: 'file',
|
|
58
|
+
message: 'Writing starter files...',
|
|
59
|
+
});
|
|
60
|
+
await writeFileBundle(options.starter);
|
|
61
|
+
environment.finishStep('write-starter-files', 'Starter files written');
|
|
62
|
+
}
|
|
63
|
+
environment.startStep({
|
|
64
|
+
id: 'write-package-json',
|
|
65
|
+
type: 'file',
|
|
66
|
+
message: 'Writing package.json...',
|
|
67
|
+
});
|
|
68
|
+
await environment.writeFile(resolve(options.targetDir, './package.json'), JSON.stringify(createPackageJSON(options), null, 2));
|
|
69
|
+
environment.finishStep('write-package-json', 'Package.json written');
|
|
70
|
+
environment.startStep({
|
|
71
|
+
id: 'write-config-file',
|
|
72
|
+
type: 'file',
|
|
73
|
+
message: 'Writing config file...',
|
|
74
|
+
});
|
|
75
|
+
await writeConfigFileToEnvironment(environment, options);
|
|
76
|
+
environment.finishStep('write-config-file', 'Config file written');
|
|
77
|
+
}
|
|
78
|
+
async function runCommandsAndInstallDependencies(environment, options) {
|
|
79
|
+
const s = environment.spinner();
|
|
80
|
+
// Setup git
|
|
81
|
+
if (options.git) {
|
|
82
|
+
s.start(`Initializing git repository...`);
|
|
83
|
+
environment.startStep({
|
|
84
|
+
id: 'initialize-git-repository',
|
|
85
|
+
type: 'command',
|
|
86
|
+
message: 'Initializing git repository...',
|
|
87
|
+
});
|
|
88
|
+
await setupGit(environment, options.targetDir);
|
|
89
|
+
environment.finishStep('initialize-git-repository', 'Initialized git repository');
|
|
90
|
+
s.stop(`Initialized git repository`);
|
|
375
91
|
}
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
routes.push({
|
|
382
|
-
path: `./routes/${name}`,
|
|
383
|
-
name: safeRouteName,
|
|
384
|
-
});
|
|
92
|
+
// Run any special steps for the new add-ons
|
|
93
|
+
const specialSteps = new Set([]);
|
|
94
|
+
for (const addOn of options.chosenAddOns) {
|
|
95
|
+
for (const step of addOn.createSpecialSteps || []) {
|
|
96
|
+
specialSteps.add(step);
|
|
385
97
|
}
|
|
386
98
|
}
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
99
|
+
if (specialSteps.size) {
|
|
100
|
+
await runSpecialSteps(environment, options, Array.from(specialSteps));
|
|
101
|
+
}
|
|
102
|
+
// Install dependencies
|
|
103
|
+
s.start(`Installing dependencies via ${options.packageManager}...`);
|
|
104
|
+
environment.startStep({
|
|
105
|
+
id: 'install-dependencies',
|
|
106
|
+
type: 'package-manager',
|
|
107
|
+
message: `Installing dependencies via ${options.packageManager}...`,
|
|
108
|
+
});
|
|
109
|
+
await packageManagerInstall(environment, options.targetDir, options.packageManager);
|
|
110
|
+
environment.finishStep('install-dependencies', 'Installed dependencies');
|
|
111
|
+
s.stop(`Installed dependencies`);
|
|
112
|
+
for (const phase of ['setup', 'add-on', 'example']) {
|
|
113
|
+
for (const addOn of options.chosenAddOns.filter((addOn) => addOn.phase === phase && addOn.command && addOn.command.command)) {
|
|
114
|
+
s.start(`Running commands for ${addOn.name}...`);
|
|
115
|
+
const cmd = formatCommand({
|
|
116
|
+
command: addOn.command.command,
|
|
117
|
+
args: addOn.command.args || [],
|
|
393
118
|
});
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
integrations,
|
|
119
|
+
environment.startStep({
|
|
120
|
+
id: 'run-commands',
|
|
121
|
+
type: 'command',
|
|
122
|
+
message: cmd,
|
|
399
123
|
});
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
124
|
+
await environment.execute(addOn.command.command, addOn.command.args || [], options.targetDir);
|
|
125
|
+
environment.finishStep('run-commands', 'Setup commands complete');
|
|
126
|
+
s.stop(`${addOn.name} commands complete`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
// Adding starter
|
|
130
|
+
if (options.starter &&
|
|
131
|
+
options.starter.command &&
|
|
132
|
+
options.starter.command.command) {
|
|
133
|
+
s.start(`Setting up starter ${options.starter.name}...`);
|
|
134
|
+
const cmd = formatCommand({
|
|
135
|
+
command: options.starter.command.command,
|
|
136
|
+
args: options.starter.command.args || [],
|
|
406
137
|
});
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
if (options.framework === 'react') {
|
|
412
|
-
await templateFile(templateDirBase, './src/App.test.tsx.ejs', options.typescript ? undefined : './src/App.test.jsx');
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
if (routes.length > 0 ||
|
|
416
|
-
options.chosenAddOns.length > 0 ||
|
|
417
|
-
integrations.length > 0) {
|
|
418
|
-
await templateFile(templateDirBase, './src/components/Header.tsx.ejs', './src/components/Header.tsx', {
|
|
419
|
-
integrations,
|
|
138
|
+
environment.startStep({
|
|
139
|
+
id: 'run-starter-command',
|
|
140
|
+
type: 'command',
|
|
141
|
+
message: cmd,
|
|
420
142
|
});
|
|
143
|
+
await environment.execute(options.starter.command.command, options.starter.command.args || [], options.targetDir);
|
|
144
|
+
environment.finishStep('run-starter-command', 'Starter command complete');
|
|
145
|
+
s.stop(`${options.starter.name} commands complete`);
|
|
421
146
|
}
|
|
147
|
+
await installShadcnComponents(environment, options.targetDir, options);
|
|
148
|
+
}
|
|
149
|
+
function report(environment, options) {
|
|
422
150
|
const warnings = [];
|
|
423
151
|
for (const addOn of options.chosenAddOns) {
|
|
424
152
|
if (addOn.warning) {
|
|
425
153
|
warnings.push(addOn.warning);
|
|
426
154
|
}
|
|
427
155
|
}
|
|
428
|
-
// Create the README.md
|
|
429
|
-
await templateFile(templateDirBase, 'README.md.ejs');
|
|
430
|
-
// Adding overlay
|
|
431
|
-
if (options.overlay) {
|
|
432
|
-
s?.start(`Setting up overlay ${options.overlay.name}...`);
|
|
433
|
-
await runAddOn(options.overlay);
|
|
434
|
-
s?.stop(`Overlay ${options.overlay.name} setup complete`);
|
|
435
|
-
}
|
|
436
|
-
// Install dependencies
|
|
437
|
-
s?.start(`Installing dependencies via ${options.packageManager}...`);
|
|
438
|
-
await environment.execute(options.packageManager, ['install'], resolve(targetDir));
|
|
439
|
-
s?.stop(`Installed dependencies`);
|
|
440
156
|
if (warnings.length > 0) {
|
|
441
|
-
|
|
442
|
-
log.warn(chalk.red(warnings.join('\n')));
|
|
443
|
-
}
|
|
157
|
+
environment.warn('Warnings', warnings.join('\n'));
|
|
444
158
|
}
|
|
445
|
-
|
|
446
|
-
s?.start(`Applying toolchain ${options.toolchain}...`);
|
|
447
|
-
switch (options.packageManager) {
|
|
448
|
-
case 'pnpm':
|
|
449
|
-
// pnpm automatically forwards extra arguments
|
|
450
|
-
await environment.execute(options.packageManager, ['run', 'check', '--fix'], resolve(targetDir));
|
|
451
|
-
break;
|
|
452
|
-
default:
|
|
453
|
-
await environment.execute(options.packageManager, ['run', 'check', '--', '--fix'], resolve(targetDir));
|
|
454
|
-
break;
|
|
455
|
-
}
|
|
456
|
-
s?.stop(`Applied toolchain ${options.toolchain}...`);
|
|
457
|
-
}
|
|
458
|
-
if (options.toolchain === 'eslint+prettier') {
|
|
459
|
-
s?.start(`Applying toolchain ${options.toolchain}...`);
|
|
460
|
-
await environment.execute(options.packageManager, ['run', 'check'], targetDir);
|
|
461
|
-
s?.stop(`Applied toolchain ${options.toolchain}...`);
|
|
462
|
-
}
|
|
463
|
-
if (options.git) {
|
|
464
|
-
s?.start(`Initializing git repository...`);
|
|
465
|
-
await environment.execute('git', ['init'], resolve(targetDir));
|
|
466
|
-
s?.stop(`Initialized git repository`);
|
|
467
|
-
}
|
|
468
|
-
await writeConfigFile(environment, targetDir, options);
|
|
469
|
-
environment.finishRun();
|
|
159
|
+
// Format errors
|
|
470
160
|
let errorStatement = '';
|
|
471
161
|
if (environment.getErrors().length) {
|
|
472
162
|
errorStatement = `
|
|
473
163
|
|
|
474
|
-
|
|
164
|
+
Errors were encountered during the creation of your app:
|
|
475
165
|
|
|
476
166
|
${environment.getErrors().join('\n')}`;
|
|
477
167
|
}
|
|
478
|
-
|
|
479
|
-
let startCommand = `${options.packageManager} ${isAddOnEnabled('start') ? 'dev' : 'start'}`;
|
|
480
|
-
if (options.packageManager === 'deno') {
|
|
481
|
-
startCommand = `deno ${isAddOnEnabled('start') ? 'task dev' : 'start'}`;
|
|
482
|
-
}
|
|
483
|
-
outro(`Your ${appName} app is ready in '${basename(targetDir)}'.
|
|
168
|
+
environment.outro(`Your ${environment.appName} app is ready in '${basename(options.targetDir)}'.
|
|
484
169
|
|
|
485
170
|
Use the following commands to start your app:
|
|
486
171
|
% cd ${options.projectName}
|
|
487
|
-
% ${
|
|
172
|
+
% ${formatCommand(getPackageManagerScriptCommand(options.packageManager, ['dev']))}
|
|
488
173
|
|
|
489
|
-
Please check the README.md for more information on testing, styling, adding routes,
|
|
490
|
-
|
|
174
|
+
Please check the README.md for more information on testing, styling, adding routes, etc.${errorStatement}`);
|
|
175
|
+
}
|
|
176
|
+
export async function createApp(environment, options) {
|
|
177
|
+
environment.startRun();
|
|
178
|
+
await writeFiles(environment, options);
|
|
179
|
+
await runCommandsAndInstallDependencies(environment, options);
|
|
180
|
+
environment.finishRun();
|
|
181
|
+
report(environment, options);
|
|
491
182
|
}
|