@tanstack/cta-engine 0.10.0-alpha.16 → 0.10.0-alpha.17
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 +73 -8
- package/dist/{add-to-app.js → add.js} +19 -19
- package/dist/cli.js +125 -0
- package/dist/config-file.js +3 -6
- package/dist/constants.js +2 -0
- package/dist/create-app.js +460 -76
- package/dist/custom-add-on.js +254 -0
- package/dist/environment.js +26 -11
- package/dist/file-helper.js +18 -0
- package/dist/index.js +1 -10
- package/dist/mcp.js +229 -0
- package/dist/options.js +330 -0
- 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 +6 -2
- package/dist/types/add.d.ts +3 -0
- package/dist/types/cli.d.ts +7 -0
- package/dist/types/config-file.d.ts +2 -3
- package/dist/types/constants.d.ts +3 -0
- package/dist/types/custom-add-on.d.ts +3 -0
- package/dist/types/file-helper.d.ts +2 -0
- package/dist/types/index.d.ts +1 -13
- package/dist/types/mcp.d.ts +7 -0
- package/dist/types/options.d.ts +6 -0
- package/dist/types/package-manager.d.ts +1 -14
- package/dist/types/templates.d.ts +1 -0
- package/dist/types/toolchain.d.ts +3 -0
- package/dist/types/types.d.ts +63 -84
- package/dist/types/utils.d.ts +0 -5
- package/dist/utils.js +0 -9
- package/package.json +13 -3
- package/src/add-ons.ts +104 -11
- package/src/{add-to-app.ts → add.ts} +35 -29
- package/src/cli.ts +196 -0
- package/src/config-file.ts +6 -12
- package/src/constants.ts +5 -0
- package/src/create-app.ts +727 -126
- package/src/custom-add-on.ts +325 -0
- package/src/environment.ts +27 -12
- package/src/file-helper.ts +20 -0
- package/src/index.ts +1 -42
- package/src/mcp.ts +302 -0
- package/src/options.ts +410 -0
- package/src/package-manager.ts +9 -80
- package/src/templates.ts +7 -0
- package/src/toolchain.ts +7 -0
- package/src/types.ts +69 -98
- 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 +2 -0
- package/templates/react/add-on/sentry/assets/src/app/global-middleware.ts +25 -0
- package/templates/react/add-on/sentry/assets/src/routes/demo.sentry.testing.tsx +480 -0
- package/templates/react/add-on/sentry/info.json +14 -0
- package/templates/react/add-on/sentry/package.json +7 -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 +19 -0
- package/templates/react/add-on/start/assets/src/api.ts +6 -0
- package/templates/react/add-on/start/assets/src/client.tsx +8 -0
- package/templates/react/add-on/start/assets/src/router.tsx.ejs +77 -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 +12 -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 +38 -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 +38 -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/file-helpers.js +0 -59
- package/dist/frameworks.js +0 -78
- package/dist/integrations/git.js +0 -4
- package/dist/integrations/shadcn.js +0 -27
- package/dist/package-json.js +0 -46
- package/dist/template-file.js +0 -108
- package/dist/types/add-to-app.d.ts +0 -4
- package/dist/types/file-helpers.d.ts +0 -5
- package/dist/types/frameworks.d.ts +0 -5
- 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 -2
- package/dist/types/template-file.d.ts +0 -2
- package/src/file-helpers.ts +0 -73
- package/src/frameworks.ts +0 -114
- package/src/integrations/git.ts +0 -7
- package/src/integrations/shadcn.ts +0 -44
- package/src/package-json.ts +0 -62
- package/src/template-file.ts +0 -146
- package/tests/file-helper.test.ts +0 -37
- package/tests/package-manager.test.ts +0 -154
package/dist/add-ons.js
CHANGED
|
@@ -1,10 +1,73 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import { readFile } from 'node:fs/promises';
|
|
2
|
+
import { existsSync, readdirSync, statSync } from 'node:fs';
|
|
3
|
+
import { resolve } from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
5
|
+
import { getTemplatesRoot } from './templates.js';
|
|
6
|
+
import { DEFAULT_FRAMEWORK } from './constants.js';
|
|
7
|
+
import { readFileHelper } from './file-helper.js';
|
|
8
|
+
function isDirectory(path) {
|
|
9
|
+
return statSync(path).isDirectory();
|
|
10
|
+
}
|
|
11
|
+
function findFilesRecursively(path, files) {
|
|
12
|
+
const dirFiles = readdirSync(path);
|
|
13
|
+
for (const file of dirFiles) {
|
|
14
|
+
const filePath = resolve(path, file);
|
|
15
|
+
if (isDirectory(filePath)) {
|
|
16
|
+
findFilesRecursively(filePath, files);
|
|
17
|
+
}
|
|
18
|
+
else {
|
|
19
|
+
files[filePath] = readFileHelper(filePath);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
export async function getAllAddOns(framework, template) {
|
|
24
|
+
const addOns = [];
|
|
25
|
+
for (const type of ['add-on', 'example']) {
|
|
26
|
+
const addOnsBase = resolve(getTemplatesRoot(), framework, type);
|
|
27
|
+
if (!existsSync(addOnsBase)) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
for (const dir of await readdirSync(addOnsBase).filter((file) => isDirectory(resolve(addOnsBase, file)))) {
|
|
31
|
+
const filePath = resolve(addOnsBase, dir, 'info.json');
|
|
32
|
+
const fileContent = await readFile(filePath, 'utf-8');
|
|
33
|
+
const info = JSON.parse(fileContent);
|
|
34
|
+
if (!info.templates.includes(template)) {
|
|
35
|
+
continue;
|
|
36
|
+
}
|
|
37
|
+
let packageAdditions = {};
|
|
38
|
+
if (existsSync(resolve(addOnsBase, dir, 'package.json'))) {
|
|
39
|
+
packageAdditions = JSON.parse(await readFile(resolve(addOnsBase, dir, 'package.json'), 'utf-8'));
|
|
40
|
+
}
|
|
41
|
+
let readme;
|
|
42
|
+
if (existsSync(resolve(addOnsBase, dir, 'README.md'))) {
|
|
43
|
+
readme = await readFile(resolve(addOnsBase, dir, 'README.md'), 'utf-8');
|
|
44
|
+
}
|
|
45
|
+
const absoluteFiles = {};
|
|
46
|
+
const assetsDir = resolve(addOnsBase, dir, 'assets');
|
|
47
|
+
if (existsSync(assetsDir)) {
|
|
48
|
+
await findFilesRecursively(assetsDir, absoluteFiles);
|
|
49
|
+
}
|
|
50
|
+
const files = {};
|
|
51
|
+
for (const file of Object.keys(absoluteFiles)) {
|
|
52
|
+
files[file.replace(assetsDir, '.')] = absoluteFiles[file];
|
|
53
|
+
}
|
|
54
|
+
addOns.push({
|
|
55
|
+
...info,
|
|
56
|
+
id: dir,
|
|
57
|
+
type,
|
|
58
|
+
packageAdditions,
|
|
59
|
+
readme,
|
|
60
|
+
files,
|
|
61
|
+
deletedFiles: [],
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return addOns;
|
|
3
66
|
}
|
|
4
67
|
// Turn the list of chosen add-on IDs into a final list of add-ons by resolving dependencies
|
|
5
68
|
export async function finalizeAddOns(framework, template, chosenAddOnIDs) {
|
|
6
69
|
const finalAddOnIDs = new Set(chosenAddOnIDs);
|
|
7
|
-
const addOns = getAllAddOns(framework, template);
|
|
70
|
+
const addOns = await getAllAddOns(framework, template);
|
|
8
71
|
for (const addOnID of finalAddOnIDs) {
|
|
9
72
|
let addOn;
|
|
10
73
|
const localAddOn = addOns.find((a) => a.id === addOnID);
|
|
@@ -29,6 +92,12 @@ export async function finalizeAddOns(framework, template, chosenAddOnIDs) {
|
|
|
29
92
|
const finalAddOns = [...finalAddOnIDs].map((id) => addOns.find((a) => a.id === id));
|
|
30
93
|
return finalAddOns;
|
|
31
94
|
}
|
|
95
|
+
export async function listAddOns(options, { forcedMode, forcedAddOns = [], }) {
|
|
96
|
+
const addOns = await getAllAddOns(options.framework || DEFAULT_FRAMEWORK, forcedMode || options.template || 'typescript');
|
|
97
|
+
for (const addOn of addOns.filter((a) => !forcedAddOns.includes(a.id))) {
|
|
98
|
+
console.log(`${chalk.bold(addOn.id)}: ${addOn.description}`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
32
101
|
function loadAddOn(addOn) {
|
|
33
102
|
return addOn;
|
|
34
103
|
}
|
|
@@ -36,9 +105,5 @@ export async function loadRemoteAddOn(url) {
|
|
|
36
105
|
const response = await fetch(url);
|
|
37
106
|
const fileContent = await response.json();
|
|
38
107
|
fileContent.id = url;
|
|
39
|
-
return
|
|
40
|
-
...fileContent,
|
|
41
|
-
getFiles: () => Promise.resolve(Object.keys(fileContent.files)),
|
|
42
|
-
getFileContents: (path) => Promise.resolve(fileContent.files[path]),
|
|
43
|
-
};
|
|
108
|
+
return fileContent;
|
|
44
109
|
}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
2
2
|
import { existsSync, statSync } from 'node:fs';
|
|
3
3
|
import { basename, dirname, resolve } from 'node:path';
|
|
4
|
+
import chalk from 'chalk';
|
|
4
5
|
import { execa, execaSync } from 'execa';
|
|
6
|
+
import { cancel, confirm, intro, isCancel, log, outro, spinner, } from '@clack/prompts';
|
|
5
7
|
import { CONFIG_FILE } from './constants.js';
|
|
6
|
-
import { finalizeAddOns } from './add-ons.js';
|
|
7
|
-
import { getFrameworkById } from './frameworks.js';
|
|
8
8
|
import { createDefaultEnvironment, createMemoryEnvironment, } from './environment.js';
|
|
9
9
|
import { createApp } from './create-app.js';
|
|
10
|
-
import {
|
|
10
|
+
import { finalizeAddOns } from './add-ons.js';
|
|
11
11
|
import { sortObject } from './utils.js';
|
|
12
|
+
import { readConfigFile, writeConfigFile } from './config-file.js';
|
|
12
13
|
function isDirectory(path) {
|
|
13
14
|
return statSync(path).isDirectory();
|
|
14
15
|
}
|
|
@@ -17,16 +18,10 @@ async function hasPendingGitChanges() {
|
|
|
17
18
|
return status.stdout.length > 0;
|
|
18
19
|
}
|
|
19
20
|
async function createOptions(json, addOns) {
|
|
20
|
-
const framework = getFrameworkById(json.framework);
|
|
21
21
|
return {
|
|
22
22
|
...json,
|
|
23
|
-
framework,
|
|
24
23
|
tailwind: true,
|
|
25
|
-
|
|
26
|
-
chosenAddOns: await finalizeAddOns(framework, json.mode, [
|
|
27
|
-
...json.existingAddOns,
|
|
28
|
-
...addOns,
|
|
29
|
-
]),
|
|
24
|
+
chosenAddOns: await finalizeAddOns(json.framework, json.mode, [...json.existingAddOns, ...addOns]),
|
|
30
25
|
};
|
|
31
26
|
}
|
|
32
27
|
async function runCreateApp(options) {
|
|
@@ -39,17 +34,19 @@ async function runCreateApp(options) {
|
|
|
39
34
|
});
|
|
40
35
|
return output;
|
|
41
36
|
}
|
|
42
|
-
export async function
|
|
37
|
+
export async function add(addOns, { silent = false, } = {}) {
|
|
43
38
|
const persistedOptions = await readConfigFile(process.cwd());
|
|
44
39
|
if (!persistedOptions) {
|
|
45
|
-
|
|
40
|
+
console.error(`${chalk.red('There is no .cta.json file in your project.')}
|
|
41
|
+
|
|
42
|
+
This is probably because this was created with an older version of create-tsrouter-app.`);
|
|
46
43
|
return;
|
|
47
44
|
}
|
|
48
45
|
if (!silent) {
|
|
49
|
-
|
|
46
|
+
intro(`Adding ${addOns.join(', ')} to the project...`);
|
|
50
47
|
}
|
|
51
48
|
if (await hasPendingGitChanges()) {
|
|
52
|
-
|
|
49
|
+
log.error(`${chalk.red('You have pending git changes.')} Please commit or stash them before adding add-ons.`);
|
|
53
50
|
return;
|
|
54
51
|
}
|
|
55
52
|
const newOptions = await createOptions(persistedOptions, addOns);
|
|
@@ -75,9 +72,12 @@ export async function addToApp(addOns, { silent = false, } = {}, environment) {
|
|
|
75
72
|
}
|
|
76
73
|
}
|
|
77
74
|
if (overwrittenFiles.length > 0 && !silent) {
|
|
78
|
-
|
|
79
|
-
const shouldContinue = await
|
|
80
|
-
|
|
75
|
+
log.warn(`${chalk.yellow('The following will be overwritten:')}\n${overwrittenFiles.join('\n')}`);
|
|
76
|
+
const shouldContinue = await confirm({
|
|
77
|
+
message: 'Do you want to continue?',
|
|
78
|
+
});
|
|
79
|
+
if (isCancel(shouldContinue)) {
|
|
80
|
+
cancel('Operation cancelled.');
|
|
81
81
|
process.exit(0);
|
|
82
82
|
}
|
|
83
83
|
}
|
|
@@ -115,11 +115,11 @@ export async function addToApp(addOns, { silent = false, } = {}, environment) {
|
|
|
115
115
|
}
|
|
116
116
|
const realEnvironment = createDefaultEnvironment();
|
|
117
117
|
writeConfigFile(realEnvironment, process.cwd(), newOptions);
|
|
118
|
-
const s = silent ? null :
|
|
118
|
+
const s = silent ? null : spinner();
|
|
119
119
|
s?.start(`Installing dependencies via ${newOptions.packageManager}...`);
|
|
120
120
|
await realEnvironment.execute(newOptions.packageManager, ['install'], resolve(process.cwd()));
|
|
121
121
|
s?.stop(`Installed dependencies`);
|
|
122
122
|
if (!silent) {
|
|
123
|
-
|
|
123
|
+
outro('Add-ons added successfully!');
|
|
124
124
|
}
|
|
125
125
|
}
|
package/dist/cli.js
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { Command, InvalidArgumentError } from 'commander';
|
|
2
|
+
import { intro, log } from '@clack/prompts';
|
|
3
|
+
import { createApp } from './create-app.js';
|
|
4
|
+
import { normalizeOptions, promptForOptions } from './options.js';
|
|
5
|
+
import { SUPPORTED_PACKAGE_MANAGERS } from './package-manager.js';
|
|
6
|
+
import { SUPPORTED_TOOLCHAINS } from './toolchain.js';
|
|
7
|
+
import runServer from './mcp.js';
|
|
8
|
+
import { listAddOns } from './add-ons.js';
|
|
9
|
+
import { DEFAULT_FRAMEWORK, SUPPORTED_FRAMEWORKS } from './constants.js';
|
|
10
|
+
// import { initAddOn } from './custom-add-on.js'
|
|
11
|
+
import { createDefaultEnvironment } from './environment.js';
|
|
12
|
+
export function cli({ name, appName, forcedMode, forcedAddOns, }) {
|
|
13
|
+
const program = new Command();
|
|
14
|
+
program.name(name).description(`CLI to create a new ${appName} application`);
|
|
15
|
+
// program
|
|
16
|
+
// .command('add')
|
|
17
|
+
// .argument('add-on', 'Name of the add-on (or add-ons separated by commas)')
|
|
18
|
+
// .action(async (addOn: string) => {
|
|
19
|
+
// await add(addOn.split(',').map((addon) => addon.trim()))
|
|
20
|
+
// })
|
|
21
|
+
// program
|
|
22
|
+
// .command('update-add-on')
|
|
23
|
+
// .description('Create or update an add-on from the current project')
|
|
24
|
+
// .action(async () => {
|
|
25
|
+
// await initAddOn('add-on')
|
|
26
|
+
// })
|
|
27
|
+
// program
|
|
28
|
+
// .command('update-overlay')
|
|
29
|
+
// .description('Create or update a project overlay from the current project')
|
|
30
|
+
// .action(async () => {
|
|
31
|
+
// await initAddOn('overlay')
|
|
32
|
+
// })
|
|
33
|
+
program.argument('[project-name]', 'name of the project');
|
|
34
|
+
if (!forcedMode) {
|
|
35
|
+
program.option('--template <type>', 'project template (typescript, javascript, file-router)', (value) => {
|
|
36
|
+
if (value !== 'typescript' &&
|
|
37
|
+
value !== 'javascript' &&
|
|
38
|
+
value !== 'file-router') {
|
|
39
|
+
throw new InvalidArgumentError(`Invalid template: ${value}. Only the following are allowed: typescript, javascript, file-router`);
|
|
40
|
+
}
|
|
41
|
+
return value;
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
program
|
|
45
|
+
.option('--framework <type>', 'project framework (solid, react)', (value) => {
|
|
46
|
+
if (!SUPPORTED_FRAMEWORKS.includes(value)) {
|
|
47
|
+
throw new InvalidArgumentError(`Invalid framework: ${value}. Only the following are allowed: ${SUPPORTED_FRAMEWORKS.join(', ')}`);
|
|
48
|
+
}
|
|
49
|
+
return value;
|
|
50
|
+
}, DEFAULT_FRAMEWORK)
|
|
51
|
+
// .option('--overlay [url]', 'add an overlay from a URL', false)
|
|
52
|
+
.option(`--package-manager <${SUPPORTED_PACKAGE_MANAGERS.join('|')}>`, `Explicitly tell the CLI to use this package manager`, (value) => {
|
|
53
|
+
if (!SUPPORTED_PACKAGE_MANAGERS.includes(value)) {
|
|
54
|
+
throw new InvalidArgumentError(`Invalid package manager: ${value}. The following are allowed: ${SUPPORTED_PACKAGE_MANAGERS.join(', ')}`);
|
|
55
|
+
}
|
|
56
|
+
return value;
|
|
57
|
+
})
|
|
58
|
+
.option(`--toolchain <${SUPPORTED_TOOLCHAINS.join('|')}>`, `Explicitly tell the CLI to use this toolchain`, (value) => {
|
|
59
|
+
if (!SUPPORTED_TOOLCHAINS.includes(value)) {
|
|
60
|
+
throw new InvalidArgumentError(`Invalid toolchain: ${value}. The following are allowed: ${SUPPORTED_TOOLCHAINS.join(', ')}`);
|
|
61
|
+
}
|
|
62
|
+
return value;
|
|
63
|
+
})
|
|
64
|
+
.option('--tailwind', 'add Tailwind CSS', false)
|
|
65
|
+
.option('--add-ons [...add-ons]', 'pick from a list of available add-ons (comma separated list)', (value) => {
|
|
66
|
+
let addOns = !!value;
|
|
67
|
+
if (typeof value === 'string') {
|
|
68
|
+
addOns = value.split(',').map((addon) => addon.trim());
|
|
69
|
+
}
|
|
70
|
+
return addOns;
|
|
71
|
+
})
|
|
72
|
+
.option('--list-add-ons', 'list all available add-ons', false)
|
|
73
|
+
.option('--no-git', 'do not create a git repository')
|
|
74
|
+
.option('--target-dir <path>', 'the target directory for the application root')
|
|
75
|
+
.option('--mcp', 'run the MCP server', false)
|
|
76
|
+
.option('--mcp-sse', 'run the MCP server in SSE mode', false);
|
|
77
|
+
program.action(async (projectName, options) => {
|
|
78
|
+
if (options.listAddOns) {
|
|
79
|
+
await listAddOns(options, {
|
|
80
|
+
forcedMode: forcedMode,
|
|
81
|
+
forcedAddOns,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
else if (options.mcp || options.mcpSse) {
|
|
85
|
+
await runServer(!!options.mcpSse, {
|
|
86
|
+
forcedMode: forcedMode,
|
|
87
|
+
forcedAddOns,
|
|
88
|
+
appName,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
else {
|
|
92
|
+
try {
|
|
93
|
+
const cliOptions = {
|
|
94
|
+
projectName,
|
|
95
|
+
...options,
|
|
96
|
+
};
|
|
97
|
+
if (forcedMode) {
|
|
98
|
+
cliOptions.template = forcedMode;
|
|
99
|
+
}
|
|
100
|
+
let finalOptions = await normalizeOptions(cliOptions, forcedMode, forcedAddOns);
|
|
101
|
+
if (finalOptions) {
|
|
102
|
+
intro(`Creating a new ${appName} app in ${projectName}...`);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
intro(`Let's configure your ${appName} application`);
|
|
106
|
+
finalOptions = await promptForOptions(cliOptions, {
|
|
107
|
+
forcedMode: forcedMode,
|
|
108
|
+
forcedAddOns,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
await createApp(finalOptions, {
|
|
112
|
+
environment: createDefaultEnvironment(),
|
|
113
|
+
cwd: options.targetDir || undefined,
|
|
114
|
+
name,
|
|
115
|
+
appName,
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
log.error(error instanceof Error ? error.message : 'An unknown error occurred');
|
|
120
|
+
process.exit(1);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
program.parse();
|
|
125
|
+
}
|
package/dist/config-file.js
CHANGED
|
@@ -2,22 +2,19 @@ import { readFile } from 'node:fs/promises';
|
|
|
2
2
|
import { resolve } from 'node:path';
|
|
3
3
|
import { CONFIG_FILE } from './constants.js';
|
|
4
4
|
export async function writeConfigFile(environment, targetDir, options) {
|
|
5
|
-
/* eslint-disable unused-imports/no-unused-vars */
|
|
6
|
-
const { addOns, chosenAddOns, framework, ...rest } = options;
|
|
7
|
-
/* eslint-enable unused-imports/no-unused-vars */
|
|
8
5
|
const persistedOptions = {
|
|
9
|
-
...
|
|
6
|
+
...options,
|
|
10
7
|
version: 1,
|
|
11
|
-
framework: options.framework.id,
|
|
12
8
|
existingAddOns: options.chosenAddOns.map((addOn) => addOn.id),
|
|
13
9
|
};
|
|
10
|
+
delete persistedOptions.addOns;
|
|
11
|
+
delete persistedOptions.chosenAddOns;
|
|
14
12
|
await environment.writeFile(resolve(targetDir, CONFIG_FILE), JSON.stringify(persistedOptions, null, 2));
|
|
15
13
|
}
|
|
16
14
|
export async function readConfigFile(targetDir) {
|
|
17
15
|
try {
|
|
18
16
|
const configFile = resolve(targetDir, CONFIG_FILE);
|
|
19
17
|
const config = await readFile(configFile, 'utf8');
|
|
20
|
-
// TODO: Look for old config files and convert them to the new format
|
|
21
18
|
return JSON.parse(config);
|
|
22
19
|
}
|
|
23
20
|
catch {
|