@tanstack/cta-engine 0.10.0-alpha.6
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/LICENSE +21 -0
- package/dist/add-ons.js +109 -0
- package/dist/add.js +127 -0
- package/dist/cli.js +112 -0
- package/dist/config-file.js +23 -0
- package/dist/constants.js +5 -0
- package/dist/create-app.js +491 -0
- package/dist/custom-add-on.js +254 -0
- package/dist/environment.js +119 -0
- package/dist/index.js +1 -0
- package/dist/mcp.js +211 -0
- package/dist/options.js +309 -0
- package/dist/package-manager.js +30 -0
- package/dist/templates.js +6 -0
- package/dist/toolchain.js +6 -0
- package/dist/types/add-ons.d.ts +5 -0
- package/dist/types/add.d.ts +3 -0
- package/dist/types/cli.d.ts +1 -0
- package/dist/types/config-file.d.ts +7 -0
- package/dist/types/constants.d.ts +6 -0
- package/dist/types/create-app.d.ts +6 -0
- package/dist/types/custom-add-on.d.ts +3 -0
- package/dist/types/environment.d.ts +12 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/mcp.d.ts +1 -0
- package/dist/types/options.d.ts +3 -0
- package/dist/types/package-manager.d.ts +6 -0
- package/dist/types/templates.d.ts +1 -0
- package/dist/types/toolchain.d.ts +3 -0
- package/dist/types/types.d.ts +107 -0
- package/dist/types/utils.d.ts +1 -0
- package/dist/types.js +1 -0
- package/dist/utils.js +8 -0
- package/package.json +49 -0
- package/src/add-ons.ts +145 -0
- package/src/add.ts +184 -0
- package/src/cli.ts +163 -0
- package/src/config-file.ts +45 -0
- package/src/constants.ts +9 -0
- package/src/create-app.ts +791 -0
- package/src/custom-add-on.ts +323 -0
- package/src/environment.ts +144 -0
- package/src/index.ts +1 -0
- package/src/mcp.ts +252 -0
- package/src/options.ts +359 -0
- package/src/package-manager.ts +46 -0
- package/src/templates.ts +7 -0
- package/src/toolchain.ts +7 -0
- package/src/types.ts +119 -0
- package/src/utils.ts +10 -0
- 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/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 +29 -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/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.tools.ts +47 -0
- package/templates/react/example/tanchat/info.json +19 -0
- package/templates/react/example/tanchat/package.json +15 -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/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 +22 -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/tsconfig.json +11 -0
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { Link, createFileRoute } from '@tanstack/react-router'
|
|
2
|
+
import guitars from '../../data/example-guitars'
|
|
3
|
+
|
|
4
|
+
export const Route = createFileRoute('/example/guitars/$guitarId')({
|
|
5
|
+
component: RouteComponent,
|
|
6
|
+
loader: async ({ params }) => {
|
|
7
|
+
const guitar = guitars.find((guitar) => guitar.id === +params.guitarId)
|
|
8
|
+
if (!guitar) {
|
|
9
|
+
throw new Error('Guitar not found')
|
|
10
|
+
}
|
|
11
|
+
return guitar
|
|
12
|
+
},
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
function RouteComponent() {
|
|
16
|
+
const guitar = Route.useLoaderData()
|
|
17
|
+
|
|
18
|
+
return (
|
|
19
|
+
<div className="relative min-h-[100vh] flex items-center bg-black text-white p-5">
|
|
20
|
+
<div className="relative z-10 w-[60%] bg-gray-900/60 backdrop-blur-md rounded-2xl p-8 border border-gray-800/50 shadow-xl">
|
|
21
|
+
<Link
|
|
22
|
+
to="/example/guitars"
|
|
23
|
+
className="inline-block mb-4 text-emerald-400 hover:text-emerald-300"
|
|
24
|
+
>
|
|
25
|
+
← Back to all guitars
|
|
26
|
+
</Link>
|
|
27
|
+
<h1 className="text-3xl font-bold mb-4">{guitar.name}</h1>
|
|
28
|
+
<p className="text-gray-300 mb-6">{guitar.description}</p>
|
|
29
|
+
<div className="flex items-center justify-between">
|
|
30
|
+
<div className="text-2xl font-bold text-emerald-400">
|
|
31
|
+
${guitar.price}
|
|
32
|
+
</div>
|
|
33
|
+
<button className="bg-emerald-600 hover:bg-emerald-500 text-white px-6 py-2 rounded-lg transition-colors">
|
|
34
|
+
Add to Cart
|
|
35
|
+
</button>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<div className="absolute top-0 right-0 w-[55%] h-full z-0">
|
|
40
|
+
<div className="w-full h-full overflow-hidden rounded-2xl border-4 border-gray-800 shadow-2xl">
|
|
41
|
+
<img
|
|
42
|
+
src={guitar.image}
|
|
43
|
+
alt={guitar.name}
|
|
44
|
+
className="w-full h-full object-cover guitar-image"
|
|
45
|
+
/>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
)
|
|
50
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Link, createFileRoute } from '@tanstack/react-router'
|
|
2
|
+
import guitars from '../../data/example-guitars'
|
|
3
|
+
|
|
4
|
+
export const Route = createFileRoute('/example/guitars/')({
|
|
5
|
+
component: GuitarsIndex,
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
function GuitarsIndex() {
|
|
9
|
+
return (
|
|
10
|
+
<div className="bg-black text-white p-5">
|
|
11
|
+
<h1 className="text-3xl font-bold mb-8 text-center">Featured Guitars</h1>
|
|
12
|
+
<div className="flex flex-wrap gap-12 justify-center">
|
|
13
|
+
{guitars.map((guitar) => (
|
|
14
|
+
<div
|
|
15
|
+
key={guitar.id}
|
|
16
|
+
className="w-full md:w-[calc(50%-1.5rem)] xl:w-[calc(33.333%-2rem)] relative mb-24"
|
|
17
|
+
>
|
|
18
|
+
<Link
|
|
19
|
+
to="/example/guitars/$guitarId"
|
|
20
|
+
params={{
|
|
21
|
+
guitarId: guitar.id.toString(),
|
|
22
|
+
}}
|
|
23
|
+
>
|
|
24
|
+
<div className="relative z-0 w-full aspect-square mb-8">
|
|
25
|
+
<div className="w-full h-full overflow-hidden rounded-2xl border-4 border-gray-800 shadow-2xl">
|
|
26
|
+
<img
|
|
27
|
+
src={guitar.image}
|
|
28
|
+
alt={guitar.name}
|
|
29
|
+
className="w-full h-full object-cover guitar-image group-hover:scale-105 transition-transform duration-500"
|
|
30
|
+
/>
|
|
31
|
+
<div className="absolute inset-0 bg-gradient-to-t from-black/40 to-transparent opacity-0 group-hover:opacity-100 transition-opacity duration-300"></div>
|
|
32
|
+
</div>
|
|
33
|
+
|
|
34
|
+
<div className="absolute bottom-4 left-1/2 transform -translate-x-1/2 bg-emerald-500/80 text-white px-4 py-2 rounded-full text-sm font-medium opacity-0 group-hover:opacity-100 transition-opacity duration-300 backdrop-blur-sm">
|
|
35
|
+
View Details
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
|
|
39
|
+
<div className="absolute bottom-0 right-0 z-10 w-[80%] bg-gray-900/60 backdrop-blur-md rounded-2xl p-5 border border-gray-800/50 shadow-xl transform translate-y-[40%]">
|
|
40
|
+
<h2 className="text-xl font-bold mb-2">{guitar.name}</h2>
|
|
41
|
+
<p className="text-gray-300 mb-3 line-clamp-2">
|
|
42
|
+
{guitar.shortDescription}
|
|
43
|
+
</p>
|
|
44
|
+
<div className="text-xl font-bold text-emerald-400">
|
|
45
|
+
${guitar.price}
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
</Link>
|
|
49
|
+
</div>
|
|
50
|
+
))}
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
)
|
|
54
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { createServerFn } from '@tanstack/react-start'
|
|
2
|
+
import { anthropic } from '@ai-sdk/anthropic'
|
|
3
|
+
import { streamText } from 'ai'
|
|
4
|
+
|
|
5
|
+
import getTools from './demo.tools'
|
|
6
|
+
|
|
7
|
+
export interface Message {
|
|
8
|
+
id: string
|
|
9
|
+
role: 'user' | 'assistant'
|
|
10
|
+
content: string
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const SYSTEM_PROMPT = `You are a helpful assistant for a store that sells guitars.
|
|
14
|
+
|
|
15
|
+
You can use the following tools to help the user:
|
|
16
|
+
|
|
17
|
+
- getGuitars: Get all guitars from the database
|
|
18
|
+
- recommendGuitar: Recommend a guitar to the user
|
|
19
|
+
`
|
|
20
|
+
|
|
21
|
+
export const genAIResponse = createServerFn({ method: 'POST', response: 'raw' })
|
|
22
|
+
.validator(
|
|
23
|
+
(d: {
|
|
24
|
+
messages: Array<Message>
|
|
25
|
+
systemPrompt?: { value: string; enabled: boolean }
|
|
26
|
+
}) => d,
|
|
27
|
+
)
|
|
28
|
+
.handler(async ({ data }) => {
|
|
29
|
+
const messages = data.messages
|
|
30
|
+
.filter(
|
|
31
|
+
(msg) =>
|
|
32
|
+
msg.content.trim() !== '' &&
|
|
33
|
+
!msg.content.startsWith('Sorry, I encountered an error'),
|
|
34
|
+
)
|
|
35
|
+
.map((msg) => ({
|
|
36
|
+
role: msg.role,
|
|
37
|
+
content: msg.content.trim(),
|
|
38
|
+
}))
|
|
39
|
+
|
|
40
|
+
const tools = await getTools()
|
|
41
|
+
|
|
42
|
+
try {
|
|
43
|
+
const result = streamText({
|
|
44
|
+
model: anthropic('claude-3-5-sonnet-latest'),
|
|
45
|
+
messages,
|
|
46
|
+
system: SYSTEM_PROMPT,
|
|
47
|
+
maxSteps: 10,
|
|
48
|
+
tools,
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
return result.toDataStreamResponse()
|
|
52
|
+
} catch (error) {
|
|
53
|
+
console.error('Error in genAIResponse:', error)
|
|
54
|
+
if (error instanceof Error && error.message.includes('rate limit')) {
|
|
55
|
+
return { error: 'Rate limit exceeded. Please try again in a moment.' }
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
error:
|
|
59
|
+
error instanceof Error ? error.message : 'Failed to get AI response',
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
})
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { experimental_createMCPClient, tool } from 'ai'
|
|
2
|
+
//import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
3
|
+
import { z } from 'zod'
|
|
4
|
+
import guitars from '../data/example-guitars'
|
|
5
|
+
|
|
6
|
+
// Example of using an SSE MCP server
|
|
7
|
+
// const mcpClient = await experimental_createMCPClient({
|
|
8
|
+
// transport: {
|
|
9
|
+
// type: "sse",
|
|
10
|
+
// url: "http://localhost:8081/sse",
|
|
11
|
+
// },
|
|
12
|
+
// name: "Demo Service",
|
|
13
|
+
// });
|
|
14
|
+
|
|
15
|
+
// Example of using an STDIO MCP server
|
|
16
|
+
// const mcpClient = await experimental_createMCPClient({
|
|
17
|
+
// transport: new StdioClientTransport({
|
|
18
|
+
// command: "node",
|
|
19
|
+
// args: [
|
|
20
|
+
// "stdio-server.js",
|
|
21
|
+
// ],
|
|
22
|
+
// }),
|
|
23
|
+
// });
|
|
24
|
+
|
|
25
|
+
const getGuitars = tool({
|
|
26
|
+
description: 'Get all products from the database',
|
|
27
|
+
parameters: z.object({}),
|
|
28
|
+
execute: async () => {
|
|
29
|
+
return Promise.resolve(guitars)
|
|
30
|
+
},
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
const recommendGuitar = tool({
|
|
34
|
+
description: 'Use this tool to recommend a guitar to the user',
|
|
35
|
+
parameters: z.object({
|
|
36
|
+
id: z.string().describe('The id of the guitar to recommend'),
|
|
37
|
+
}),
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
export default async function getTools() {
|
|
41
|
+
// const mcpTools = await mcpCient.tools()
|
|
42
|
+
return {
|
|
43
|
+
// ...mcpTools,
|
|
44
|
+
getGuitars,
|
|
45
|
+
recommendGuitar,
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "TanStack Chat",
|
|
3
|
+
"description": "A chat example that uses TanStack Start and TanStack Store. Features chat with Anthropic Sonnet, chat history and custom prompts.",
|
|
4
|
+
"phase": "example",
|
|
5
|
+
"templates": ["file-router"],
|
|
6
|
+
"link": "",
|
|
7
|
+
"routes": [
|
|
8
|
+
{
|
|
9
|
+
"url": "/example/chat",
|
|
10
|
+
"name": "Chat"
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
"url": "/example/guitars",
|
|
14
|
+
"name": "Guitar Demo"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"dependsOn": ["start", "store"],
|
|
18
|
+
"variables": []
|
|
19
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"dependencies": {
|
|
3
|
+
"@ai-sdk/anthropic": "^1.1.17",
|
|
4
|
+
"@ai-sdk/react": "^1.1.23",
|
|
5
|
+
"ai": "^4.1.65",
|
|
6
|
+
"highlight.js": "^11.11.1",
|
|
7
|
+
"react-markdown": "^9.0.1",
|
|
8
|
+
"rehype-highlight": "^7.0.0",
|
|
9
|
+
"rehype-raw": "^7.0.0",
|
|
10
|
+
"rehype-sanitize": "^6.0.0",
|
|
11
|
+
"remark-gfm": "^4.0.1",
|
|
12
|
+
"lucide-react": "^0.475.0",
|
|
13
|
+
"zod": "^3.24.2"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { StrictMode } from "react";
|
|
2
|
+
import ReactDOM from "react-dom/client";
|
|
3
|
+
import { RouterProvider, createRouter } from "@tanstack/react-router";
|
|
4
|
+
<% for(const integration of integrations.filter(i => i.type === 'root-provider')) { %>
|
|
5
|
+
import * as <%= integration.name %> from "./<%= integration.path %>";
|
|
6
|
+
<% } %>
|
|
7
|
+
|
|
8
|
+
// Import the generated route tree
|
|
9
|
+
import { routeTree } from "./routeTree.gen";
|
|
10
|
+
|
|
11
|
+
import "./styles.css";
|
|
12
|
+
import reportWebVitals from "./reportWebVitals.<%= js %>";
|
|
13
|
+
|
|
14
|
+
// Create a new router instance
|
|
15
|
+
const router = createRouter({
|
|
16
|
+
routeTree,
|
|
17
|
+
context: {
|
|
18
|
+
<% for(const integration of integrations.filter(i => i.type === 'root-provider')) { %>
|
|
19
|
+
...<%= integration.name %>.getContext(),
|
|
20
|
+
<% } %>
|
|
21
|
+
},
|
|
22
|
+
defaultPreload: "intent",
|
|
23
|
+
scrollRestoration: true,
|
|
24
|
+
defaultStructuralSharing: true,
|
|
25
|
+
defaultPreloadStaleTime: 0,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
// Register the router instance for type safety
|
|
29
|
+
declare module "@tanstack/react-router" {
|
|
30
|
+
interface Register {
|
|
31
|
+
router: typeof router;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Render the app
|
|
36
|
+
const rootElement = document.getElementById("app");
|
|
37
|
+
if (rootElement && !rootElement.innerHTML) {
|
|
38
|
+
const root = ReactDOM.createRoot(rootElement);
|
|
39
|
+
root.render(
|
|
40
|
+
<StrictMode>
|
|
41
|
+
<% for(const integration of integrations.filter(i => i.type === 'root-provider')) { %>
|
|
42
|
+
<<%= integration.name %>.Provider>
|
|
43
|
+
<% } %>
|
|
44
|
+
<RouterProvider router={router} />
|
|
45
|
+
<% for(const integration of integrations.filter(i => i.type === 'root-provider').reverse()) { %>
|
|
46
|
+
</<%= integration.name %>.Provider>
|
|
47
|
+
<% } %>
|
|
48
|
+
</StrictMode>
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// If you want to start measuring performance in your app, pass a function
|
|
53
|
+
// to log results (for example: reportWebVitals(console.log))
|
|
54
|
+
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
|
|
55
|
+
reportWebVitals();
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { Outlet<% if (addOnEnabled.start) { %>
|
|
2
|
+
, HeadContent, Scripts<% } %>, <% if (addOnEnabled["tanstack-query"]) { %>createRootRouteWithContext<% } else { %>createRootRoute<% } %> } from '@tanstack/react-router'
|
|
3
|
+
import { TanStackRouterDevtools } from '@tanstack/react-router-devtools'
|
|
4
|
+
<% if (addOns.length) { %>
|
|
5
|
+
import Header from '../components/Header'
|
|
6
|
+
<% } %><% for(const integration of integrations.filter(i => i.type === 'layout' || i.type === 'provider')) { %>
|
|
7
|
+
import <%= integration.name %> from "../<%= integration.path %>";
|
|
8
|
+
<% } %>
|
|
9
|
+
<% if (addOnEnabled.start) { %>
|
|
10
|
+
import appCss from '../styles.css?url'
|
|
11
|
+
<% } %><% if (addOnEnabled["tanstack-query"]) { %>
|
|
12
|
+
import type { QueryClient } from '@tanstack/react-query'
|
|
13
|
+
<% if (addOnEnabled.tRPC) { %>
|
|
14
|
+
import type { TRPCRouter } from '@/integrations/trpc/router'
|
|
15
|
+
import type { TRPCOptionsProxy } from '@trpc/tanstack-react-query'
|
|
16
|
+
<% } %>
|
|
17
|
+
|
|
18
|
+
interface MyRouterContext {
|
|
19
|
+
queryClient: QueryClient
|
|
20
|
+
<% if (addOnEnabled.tRPC) { %>
|
|
21
|
+
trpc: TRPCOptionsProxy<TRPCRouter>
|
|
22
|
+
<% } %>
|
|
23
|
+
}<% } %>
|
|
24
|
+
|
|
25
|
+
export const Route = <% if (addOnEnabled["tanstack-query"]) { %>createRootRouteWithContext<MyRouterContext>()<% } else { %>createRootRoute<% } %>({
|
|
26
|
+
<% if (addOnEnabled.start) { %>
|
|
27
|
+
head: () => ({
|
|
28
|
+
meta: [
|
|
29
|
+
{
|
|
30
|
+
charSet: 'utf-8',
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
name: 'viewport',
|
|
34
|
+
content: 'width=device-width, initial-scale=1',
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
title: 'TanStack Start Starter',
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
links: [
|
|
41
|
+
{
|
|
42
|
+
rel: 'stylesheet',
|
|
43
|
+
href: appCss,
|
|
44
|
+
},
|
|
45
|
+
],
|
|
46
|
+
}),
|
|
47
|
+
<% } %>
|
|
48
|
+
component: () => (
|
|
49
|
+
<% if (addOnEnabled.start) { %><RootDocument><% } else { %><><% } %>
|
|
50
|
+
<% for(const integration of integrations.filter(i => i.type === 'provider')) { %>
|
|
51
|
+
<<%= integration.name %>>
|
|
52
|
+
<% } %>
|
|
53
|
+
<% if (addOns.length) { %>
|
|
54
|
+
<Header />
|
|
55
|
+
<% } %>
|
|
56
|
+
<Outlet />
|
|
57
|
+
<TanStackRouterDevtools />
|
|
58
|
+
<% for(const integration of integrations.filter(i => i.type === 'layout')) { %>
|
|
59
|
+
<<%= integration.name %> />
|
|
60
|
+
<% } %>
|
|
61
|
+
<% for(const integration of integrations.filter(i => i.type === 'provider').reverse()) { %>
|
|
62
|
+
</<%= integration.name %>>
|
|
63
|
+
<% } %>
|
|
64
|
+
<% if (addOnEnabled.start) { %></RootDocument><% } else { %></><% } %>
|
|
65
|
+
),
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
<% if (addOnEnabled.start) { %>
|
|
69
|
+
function RootDocument({ children }: { children: React.ReactNode }) {
|
|
70
|
+
return (
|
|
71
|
+
<html lang="en">
|
|
72
|
+
<head>
|
|
73
|
+
<HeadContent />
|
|
74
|
+
</head>
|
|
75
|
+
<body>
|
|
76
|
+
{children}
|
|
77
|
+
<Scripts />
|
|
78
|
+
</body>
|
|
79
|
+
</html>
|
|
80
|
+
)
|
|
81
|
+
}
|
|
82
|
+
<% } %>
|