@tanstack/create 0.49.1 → 0.49.3
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/CHANGELOG.md +13 -0
- package/LICENSE +21 -0
- package/dist/file-helpers.js +3 -1
- package/dist/frameworks/react/add-ons/ai/assets/src/data/demo-guitars.ts +93 -0
- package/dist/frameworks/react/add-ons/ai/assets/src/hooks/demo-useAudioRecorder.ts +85 -0
- package/dist/frameworks/react/add-ons/ai/assets/src/hooks/demo-useTTS.ts +78 -0
- package/dist/frameworks/react/add-ons/ai/assets/src/lib/demo-ai-hook.ts +22 -0
- package/dist/frameworks/react/add-ons/ai/assets/src/lib/demo-guitar-tools.ts +40 -0
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/api.ai.chat.ts +99 -0
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/api.ai.image.ts +72 -0
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/api.ai.structured.ts +136 -0
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/api.ai.transcription.ts +89 -0
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/api.ai.tts.ts +81 -0
- package/dist/frameworks/react/add-ons/better-auth/assets/src/lib/auth-client.ts +3 -0
- package/dist/frameworks/react/add-ons/better-auth/assets/src/lib/auth.ts +9 -0
- package/dist/frameworks/react/add-ons/better-auth/assets/src/routes/api/auth/$.ts +11 -0
- package/dist/frameworks/react/add-ons/convex/assets/convex/schema.ts +14 -0
- package/dist/frameworks/react/add-ons/convex/assets/convex/todos.ts +43 -0
- package/dist/frameworks/react/add-ons/db/assets/src/db-collections/index.ts +20 -0
- package/dist/frameworks/react/add-ons/db/assets/src/hooks/demo.useChat.ts +62 -0
- package/dist/frameworks/react/add-ons/db/assets/src/routes/demo/db-chat-api.ts +83 -0
- package/dist/frameworks/react/add-ons/form/assets/src/hooks/demo.form-context.ts +4 -0
- package/dist/frameworks/react/add-ons/form/assets/src/hooks/demo.form.ts +22 -0
- package/dist/frameworks/react/add-ons/mcp/assets/src/mcp-todos.ts +51 -0
- package/dist/frameworks/react/add-ons/mcp/assets/src/routes/demo/api.mcp-todos.ts +37 -0
- package/dist/frameworks/react/add-ons/mcp/assets/src/routes/{mcp.js → mcp.ts} +27 -17
- package/dist/frameworks/react/add-ons/mcp/assets/src/utils/mcp-handler.ts +61 -0
- package/dist/frameworks/react/add-ons/neon/assets/neon-vite-plugin.ts +10 -0
- package/dist/frameworks/react/add-ons/neon/assets/src/db.ts +13 -0
- package/dist/frameworks/react/add-ons/oRPC/assets/src/orpc/client.ts +29 -0
- package/dist/frameworks/react/add-ons/oRPC/assets/src/orpc/router/index.ts +6 -0
- package/dist/frameworks/react/add-ons/oRPC/assets/src/orpc/router/todos.ts +20 -0
- package/dist/frameworks/react/add-ons/oRPC/assets/src/orpc/schema.ts +6 -0
- package/dist/frameworks/react/add-ons/oRPC/assets/src/{polyfill.js → polyfill.ts} +4 -1
- package/dist/frameworks/react/add-ons/oRPC/assets/src/routes/api.$.ts +77 -0
- package/dist/frameworks/react/add-ons/oRPC/assets/src/routes/api.rpc.$.ts +29 -0
- package/dist/frameworks/react/add-ons/shadcn/assets/src/lib/utils.ts +6 -0
- package/dist/frameworks/react/add-ons/start/assets/src/data/demo.punk-songs.ts +13 -0
- package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/api.names.ts +10 -0
- package/dist/frameworks/react/add-ons/store/assets/src/lib/demo-store.ts +13 -0
- package/dist/frameworks/react/add-ons/storybook/assets/_dot_storybook/main.ts +17 -0
- package/dist/frameworks/react/add-ons/storybook/assets/_dot_storybook/preview.ts +15 -0
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/button.stories.ts +67 -0
- package/dist/{types/frameworks/react/add-ons/storybook/assets/src/components/storybook/index.d.ts → frameworks/react/add-ons/storybook/assets/src/components/storybook/index.ts} +4 -0
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/input.stories.ts +43 -0
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/radio-group.stories.ts +53 -0
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/slider.stories.ts +55 -0
- package/dist/frameworks/{solid/add-ons/strapi/assets/src/lib/strapiClient.js → react/add-ons/strapi/assets/src/lib/strapiClient.ts} +3 -1
- package/dist/frameworks/react/add-ons/t3env/assets/src/env.ts +39 -0
- package/dist/frameworks/react/add-ons/tRPC/assets/src/integrations/trpc/{init.js → init.ts} +3 -1
- package/dist/frameworks/react/add-ons/tRPC/assets/src/integrations/trpc/react.ts +4 -0
- package/dist/frameworks/react/add-ons/tRPC/assets/src/integrations/trpc/router.ts +27 -0
- package/dist/frameworks/react/add-ons/table/assets/src/data/demo-table-data.ts +50 -0
- package/dist/frameworks/react/examples/events/assets/content-collections.ts +56 -0
- package/dist/frameworks/react/examples/events/assets/src/lib/conference-ai-hook.ts +26 -0
- package/dist/frameworks/react/examples/events/assets/src/lib/conference-tools.ts +210 -0
- package/dist/frameworks/react/examples/events/assets/src/lib/utils.ts +6 -0
- package/dist/frameworks/react/examples/events/assets/src/routes/api.remy-chat.ts +121 -0
- package/dist/frameworks/react/examples/resume/assets/content-collections.ts +36 -0
- package/dist/frameworks/react/examples/resume/assets/src/lib/resume-ai-hook.ts +21 -0
- package/dist/frameworks/react/examples/resume/assets/src/lib/resume-tools.ts +165 -0
- package/dist/frameworks/react/examples/resume/assets/src/lib/utils.ts +6 -0
- package/dist/frameworks/react/examples/resume/assets/src/routes/api.resume-chat.ts +110 -0
- package/dist/frameworks/solid/add-ons/better-auth/assets/src/lib/auth-client.ts +3 -0
- package/dist/frameworks/solid/add-ons/better-auth/assets/src/lib/auth.ts +9 -0
- package/dist/frameworks/solid/add-ons/better-auth/assets/src/routes/api/auth/$.ts +11 -0
- package/dist/frameworks/solid/add-ons/convex/assets/convex/schema.ts +14 -0
- package/dist/frameworks/solid/add-ons/convex/assets/convex/todos.ts +43 -0
- package/dist/frameworks/solid/add-ons/solid-ui/assets/src/lib/utils.ts +6 -0
- package/dist/frameworks/solid/add-ons/store/assets/src/lib/demo-store.ts +13 -0
- package/dist/frameworks/{react/add-ons/strapi/assets/src/lib/strapiClient.js → solid/add-ons/strapi/assets/src/lib/strapiClient.ts} +3 -1
- package/dist/frameworks/solid/add-ons/t3env/assets/src/env.ts +39 -0
- package/dist/frameworks/solid/examples/tanchat/assets/ai-streaming-server/src/index.ts +102 -0
- package/dist/frameworks/solid/examples/tanchat/assets/src/lib/demo-store.ts +13 -0
- package/dist/frameworks/solid/examples/tanchat/assets/src/store/demo.hooks.ts +17 -0
- package/dist/frameworks/solid/examples/tanchat/assets/src/store/demo.store.ts +133 -0
- package/dist/special-steps/post-init-script.js +6 -6
- package/package.json +11 -12
- package/src/file-helpers.ts +4 -1
- package/src/special-steps/post-init-script.ts +6 -6
- package/tests/copy-assets.test.ts +53 -0
- package/tests/file-helper.test.ts +19 -0
- package/tests/special-steps.test.ts +12 -12
- package/dist/frameworks/react/add-ons/ai/assets/src/data/demo-guitars.js +0 -67
- package/dist/frameworks/react/add-ons/ai/assets/src/hooks/demo-useAudioRecorder.js +0 -70
- package/dist/frameworks/react/add-ons/ai/assets/src/hooks/demo-useTTS.js +0 -66
- package/dist/frameworks/react/add-ons/ai/assets/src/lib/demo-ai-hook.js +0 -11
- package/dist/frameworks/react/add-ons/ai/assets/src/lib/demo-guitar-tools.js +0 -32
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/api.ai.chat.js +0 -87
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/api.ai.image.js +0 -55
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/api.ai.structured.js +0 -116
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/api.ai.transcription.js +0 -73
- package/dist/frameworks/react/add-ons/ai/assets/src/routes/demo/api.ai.tts.js +0 -58
- package/dist/frameworks/react/add-ons/better-auth/assets/src/lib/auth-client.js +0 -2
- package/dist/frameworks/react/add-ons/better-auth/assets/src/lib/auth.js +0 -8
- package/dist/frameworks/react/add-ons/better-auth/assets/src/routes/api/auth/$.js +0 -10
- package/dist/frameworks/react/add-ons/convex/assets/convex/schema.js +0 -13
- package/dist/frameworks/react/add-ons/convex/assets/convex/todos.js +0 -39
- package/dist/frameworks/react/add-ons/db/assets/src/db-collections/index.js +0 -11
- package/dist/frameworks/react/add-ons/db/assets/src/hooks/demo.useChat.js +0 -47
- package/dist/frameworks/react/add-ons/db/assets/src/routes/demo/db-chat-api.js +0 -68
- package/dist/frameworks/react/add-ons/form/assets/src/hooks/demo.form-context.js +0 -2
- package/dist/frameworks/react/add-ons/form/assets/src/hooks/demo.form.js +0 -15
- package/dist/frameworks/react/add-ons/mcp/assets/src/mcp-todos.js +0 -40
- package/dist/frameworks/react/add-ons/mcp/assets/src/routes/demo/api.mcp-todos.js +0 -36
- package/dist/frameworks/react/add-ons/mcp/assets/src/utils/mcp-handler.js +0 -41
- package/dist/frameworks/react/add-ons/neon/assets/neon-vite-plugin.js +0 -9
- package/dist/frameworks/react/add-ons/neon/assets/src/db.js +0 -11
- package/dist/frameworks/react/add-ons/oRPC/assets/src/orpc/client.js +0 -21
- package/dist/frameworks/react/add-ons/oRPC/assets/src/orpc/router/index.js +0 -5
- package/dist/frameworks/react/add-ons/oRPC/assets/src/orpc/router/todos.js +0 -17
- package/dist/frameworks/react/add-ons/oRPC/assets/src/orpc/schema.js +0 -5
- package/dist/frameworks/react/add-ons/oRPC/assets/src/routes/api.$.js +0 -71
- package/dist/frameworks/react/add-ons/oRPC/assets/src/routes/api.rpc.$.js +0 -24
- package/dist/frameworks/react/add-ons/shadcn/assets/src/lib/utils.js +0 -5
- package/dist/frameworks/react/add-ons/start/assets/src/data/demo.punk-songs.js +0 -12
- package/dist/frameworks/react/add-ons/start/assets/src/routes/demo/api.names.js +0 -9
- package/dist/frameworks/react/add-ons/store/assets/src/lib/demo-store.js +0 -10
- package/dist/frameworks/react/add-ons/storybook/assets/_dot_storybook/main.js +0 -15
- package/dist/frameworks/react/add-ons/storybook/assets/_dot_storybook/preview.js +0 -12
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/button.stories.js +0 -55
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/index.js +0 -5
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/input.stories.js +0 -35
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/radio-group.stories.js +0 -45
- package/dist/frameworks/react/add-ons/storybook/assets/src/components/storybook/slider.stories.js +0 -46
- package/dist/frameworks/react/add-ons/t3env/assets/src/env.js +0 -34
- package/dist/frameworks/react/add-ons/tRPC/assets/src/integrations/trpc/react.js +0 -2
- package/dist/frameworks/react/add-ons/tRPC/assets/src/integrations/trpc/router.js +0 -20
- package/dist/frameworks/react/add-ons/table/assets/src/data/demo-table-data.js +0 -35
- package/dist/frameworks/react/examples/events/assets/content-collections.js +0 -53
- package/dist/frameworks/react/examples/events/assets/src/lib/conference-ai-hook.js +0 -16
- package/dist/frameworks/react/examples/events/assets/src/lib/conference-tools.js +0 -177
- package/dist/frameworks/react/examples/events/assets/src/lib/utils.js +0 -5
- package/dist/frameworks/react/examples/events/assets/src/routes/api.remy-chat.js +0 -103
- package/dist/frameworks/react/examples/resume/assets/content-collections.js +0 -33
- package/dist/frameworks/react/examples/resume/assets/src/lib/resume-ai-hook.js +0 -11
- package/dist/frameworks/react/examples/resume/assets/src/lib/resume-tools.js +0 -135
- package/dist/frameworks/react/examples/resume/assets/src/lib/utils.js +0 -5
- package/dist/frameworks/react/examples/resume/assets/src/routes/api.resume-chat.js +0 -92
- package/dist/frameworks/solid/add-ons/better-auth/assets/src/lib/auth-client.js +0 -2
- package/dist/frameworks/solid/add-ons/better-auth/assets/src/lib/auth.js +0 -8
- package/dist/frameworks/solid/add-ons/better-auth/assets/src/routes/api/auth/$.js +0 -10
- package/dist/frameworks/solid/add-ons/convex/assets/convex/schema.js +0 -13
- package/dist/frameworks/solid/add-ons/convex/assets/convex/todos.js +0 -39
- package/dist/frameworks/solid/add-ons/solid-ui/assets/src/lib/utils.js +0 -5
- package/dist/frameworks/solid/add-ons/store/assets/src/lib/demo-store.js +0 -10
- package/dist/frameworks/solid/add-ons/t3env/assets/src/env.js +0 -34
- package/dist/frameworks/solid/examples/tanchat/assets/ai-streaming-server/src/index.js +0 -73
- package/dist/frameworks/solid/examples/tanchat/assets/src/lib/demo-store.js +0 -10
- package/dist/frameworks/solid/examples/tanchat/assets/src/store/demo.hooks.js +0 -12
- package/dist/frameworks/solid/examples/tanchat/assets/src/store/demo.store.js +0 -92
- package/dist/types/frameworks/react/add-ons/ai/assets/src/data/demo-guitars.d.ts +0 -10
- package/dist/types/frameworks/react/add-ons/ai/assets/src/hooks/demo-useAudioRecorder.d.ts +0 -9
- package/dist/types/frameworks/react/add-ons/ai/assets/src/hooks/demo-useTTS.d.ts +0 -8
- package/dist/types/frameworks/react/add-ons/ai/assets/src/lib/demo-ai-hook.d.ts +0 -5
- package/dist/types/frameworks/react/add-ons/ai/assets/src/lib/demo-guitar-tools.d.ts +0 -3
- package/dist/types/frameworks/react/add-ons/ai/assets/src/routes/demo/api.ai.chat.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/ai/assets/src/routes/demo/api.ai.image.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/ai/assets/src/routes/demo/api.ai.structured.d.ts +0 -83
- package/dist/types/frameworks/react/add-ons/ai/assets/src/routes/demo/api.ai.transcription.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/ai/assets/src/routes/demo/api.ai.tts.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/better-auth/assets/src/lib/auth-client.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/better-auth/assets/src/lib/auth.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/better-auth/assets/src/routes/api/auth/$.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/convex/assets/convex/schema.d.ts +0 -2
- package/dist/types/frameworks/react/add-ons/convex/assets/convex/todos.d.ts +0 -4
- package/dist/types/frameworks/react/add-ons/db/assets/src/db-collections/index.d.ts +0 -17
- package/dist/types/frameworks/react/add-ons/db/assets/src/hooks/demo.useChat.d.ts +0 -5
- package/dist/types/frameworks/react/add-ons/db/assets/src/routes/demo/db-chat-api.d.ts +0 -19
- package/dist/types/frameworks/react/add-ons/form/assets/src/hooks/demo.form-context.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/form/assets/src/hooks/demo.form.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/mcp/assets/src/mcp-todos.d.ts +0 -7
- package/dist/types/frameworks/react/add-ons/mcp/assets/src/routes/demo/api.mcp-todos.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/mcp/assets/src/routes/mcp.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/mcp/assets/src/utils/mcp-handler.d.ts +0 -2
- package/dist/types/frameworks/react/add-ons/neon/assets/neon-vite-plugin.d.ts +0 -2
- package/dist/types/frameworks/react/add-ons/neon/assets/src/db.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/oRPC/assets/src/orpc/client.d.ts +0 -4
- package/dist/types/frameworks/react/add-ons/oRPC/assets/src/orpc/router/index.d.ts +0 -5
- package/dist/types/frameworks/react/add-ons/oRPC/assets/src/orpc/router/todos.d.ts +0 -2
- package/dist/types/frameworks/react/add-ons/oRPC/assets/src/orpc/schema.d.ts +0 -11
- package/dist/types/frameworks/react/add-ons/oRPC/assets/src/polyfill.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/oRPC/assets/src/routes/api.$.d.ts +0 -2
- package/dist/types/frameworks/react/add-ons/oRPC/assets/src/routes/api.rpc.$.d.ts +0 -2
- package/dist/types/frameworks/react/add-ons/shadcn/assets/src/lib/utils.d.ts +0 -2
- package/dist/types/frameworks/react/add-ons/start/assets/src/data/demo.punk-songs.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/start/assets/src/routes/demo/api.names.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/store/assets/src/lib/demo-store.d.ts +0 -2
- package/dist/types/frameworks/react/add-ons/storybook/assets/_dot_storybook/main.d.ts +0 -3
- package/dist/types/frameworks/react/add-ons/storybook/assets/_dot_storybook/preview.d.ts +0 -4
- package/dist/types/frameworks/react/add-ons/storybook/assets/src/components/storybook/button.stories.d.ts +0 -11
- package/dist/types/frameworks/react/add-ons/storybook/assets/src/components/storybook/input.stories.d.ts +0 -7
- package/dist/types/frameworks/react/add-ons/storybook/assets/src/components/storybook/radio-group.stories.d.ts +0 -7
- package/dist/types/frameworks/react/add-ons/storybook/assets/src/components/storybook/slider.stories.d.ts +0 -8
- package/dist/types/frameworks/react/add-ons/strapi/assets/src/lib/strapiClient.d.ts +0 -2
- package/dist/types/frameworks/react/add-ons/t3env/assets/src/env.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/tRPC/assets/src/integrations/trpc/init.d.ts +0 -2
- package/dist/types/frameworks/react/add-ons/tRPC/assets/src/integrations/trpc/react.d.ts +0 -1
- package/dist/types/frameworks/react/add-ons/tRPC/assets/src/integrations/trpc/router.d.ts +0 -2
- package/dist/types/frameworks/react/add-ons/table/assets/src/data/demo-table-data.d.ts +0 -11
- package/dist/types/frameworks/react/examples/events/assets/content-collections.d.ts +0 -2
- package/dist/types/frameworks/react/examples/events/assets/src/lib/conference-ai-hook.d.ts +0 -5
- package/dist/types/frameworks/react/examples/events/assets/src/lib/conference-tools.d.ts +0 -10
- package/dist/types/frameworks/react/examples/events/assets/src/lib/utils.d.ts +0 -2
- package/dist/types/frameworks/react/examples/events/assets/src/routes/api.remy-chat.d.ts +0 -1
- package/dist/types/frameworks/react/examples/resume/assets/content-collections.d.ts +0 -2
- package/dist/types/frameworks/react/examples/resume/assets/src/lib/resume-ai-hook.d.ts +0 -5
- package/dist/types/frameworks/react/examples/resume/assets/src/lib/resume-tools.d.ts +0 -8
- package/dist/types/frameworks/react/examples/resume/assets/src/lib/utils.d.ts +0 -2
- package/dist/types/frameworks/react/examples/resume/assets/src/routes/api.resume-chat.d.ts +0 -1
- package/dist/types/frameworks/solid/add-ons/better-auth/assets/src/lib/auth-client.d.ts +0 -1
- package/dist/types/frameworks/solid/add-ons/better-auth/assets/src/lib/auth.d.ts +0 -1
- package/dist/types/frameworks/solid/add-ons/better-auth/assets/src/routes/api/auth/$.d.ts +0 -1
- package/dist/types/frameworks/solid/add-ons/convex/assets/convex/schema.d.ts +0 -2
- package/dist/types/frameworks/solid/add-ons/convex/assets/convex/todos.d.ts +0 -4
- package/dist/types/frameworks/solid/add-ons/solid-ui/assets/src/lib/utils.d.ts +0 -2
- package/dist/types/frameworks/solid/add-ons/store/assets/src/lib/demo-store.d.ts +0 -2
- package/dist/types/frameworks/solid/add-ons/strapi/assets/src/lib/strapiClient.d.ts +0 -2
- package/dist/types/frameworks/solid/add-ons/t3env/assets/src/env.d.ts +0 -1
- package/dist/types/frameworks/solid/examples/tanchat/assets/ai-streaming-server/src/index.d.ts +0 -1
- package/dist/types/frameworks/solid/examples/tanchat/assets/src/lib/demo-store.d.ts +0 -2
- package/dist/types/frameworks/solid/examples/tanchat/assets/src/store/demo.hooks.d.ts +0 -23
- package/dist/types/frameworks/solid/examples/tanchat/assets/src/store/demo.store.d.ts +0 -40
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { createFileRoute } from '@tanstack/react-router'
|
|
2
|
+
import { chat, maxIterations, toServerSentEventsResponse } from '@tanstack/ai'
|
|
3
|
+
import { anthropicText } from '@tanstack/ai-anthropic'
|
|
4
|
+
import { openaiText } from '@tanstack/ai-openai'
|
|
5
|
+
import { geminiText } from '@tanstack/ai-gemini'
|
|
6
|
+
import { ollamaText } from '@tanstack/ai-ollama'
|
|
7
|
+
|
|
8
|
+
import {
|
|
9
|
+
getJobsBySkill,
|
|
10
|
+
getAllJobs,
|
|
11
|
+
getAllEducation,
|
|
12
|
+
searchExperience,
|
|
13
|
+
} from '@/lib/resume-tools'
|
|
14
|
+
|
|
15
|
+
export const Route = createFileRoute('/api/resume-chat')({
|
|
16
|
+
server: {
|
|
17
|
+
handlers: {
|
|
18
|
+
POST: async ({ request }) => {
|
|
19
|
+
const requestSignal = request.signal
|
|
20
|
+
|
|
21
|
+
if (requestSignal.aborted) {
|
|
22
|
+
return new Response(null, { status: 499 })
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const abortController = new AbortController()
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
const body = await request.json()
|
|
29
|
+
const { messages } = body
|
|
30
|
+
const data = body.data || {}
|
|
31
|
+
|
|
32
|
+
const SYSTEM_PROMPT = `You are a helpful resume assistant helping recruiters and hiring managers evaluate if this candidate is a good fit for their job requirements.
|
|
33
|
+
|
|
34
|
+
CAPABILITIES:
|
|
35
|
+
1. Use getJobsBySkill to find jobs where the candidate used specific technologies or skills
|
|
36
|
+
2. Use getAllJobs to get the candidate's complete work history with all details
|
|
37
|
+
3. Use getAllEducation to get the candidate's educational background
|
|
38
|
+
4. Use searchExperience to search for specific types of roles or experience by keywords
|
|
39
|
+
|
|
40
|
+
INSTRUCTIONS:
|
|
41
|
+
- When asked about specific technologies or skills, use getJobsBySkill to find relevant experience
|
|
42
|
+
- When asked about overall experience or career progression, use getAllJobs
|
|
43
|
+
- When asked about education or training, use getAllEducation
|
|
44
|
+
- When asked about specific types of roles (e.g., "senior", "lead"), use searchExperience
|
|
45
|
+
- Be professional, concise, and helpful in your responses
|
|
46
|
+
- Provide specific details from the resume when available
|
|
47
|
+
- When calculating years of experience, consider the date ranges provided
|
|
48
|
+
- If the candidate has experience with something, highlight specific roles and time periods
|
|
49
|
+
- If the candidate lacks certain experience, be honest but constructive
|
|
50
|
+
|
|
51
|
+
CONTEXT: You are helping evaluate this candidate's qualifications for potential job opportunities.`
|
|
52
|
+
|
|
53
|
+
// Determine the best available provider
|
|
54
|
+
let provider: 'anthropic' | 'openai' | 'gemini' | 'ollama' = data.provider || 'ollama'
|
|
55
|
+
let model: string = data.model || 'mistral:7b'
|
|
56
|
+
|
|
57
|
+
// Use the first available provider with an API key, fallback to ollama
|
|
58
|
+
if (process.env.ANTHROPIC_API_KEY) {
|
|
59
|
+
provider = 'anthropic'
|
|
60
|
+
model = 'claude-haiku-4-5'
|
|
61
|
+
} else if (process.env.OPENAI_API_KEY) {
|
|
62
|
+
provider = 'openai'
|
|
63
|
+
model = 'gpt-4o'
|
|
64
|
+
} else if (process.env.GEMINI_API_KEY) {
|
|
65
|
+
provider = 'gemini'
|
|
66
|
+
model = 'gemini-2.0-flash-exp'
|
|
67
|
+
}
|
|
68
|
+
// else keep ollama as default
|
|
69
|
+
|
|
70
|
+
// Adapter factory pattern for multi-vendor support
|
|
71
|
+
const adapterConfig = {
|
|
72
|
+
anthropic: () =>
|
|
73
|
+
anthropicText((model || 'claude-haiku-4-5') as any),
|
|
74
|
+
openai: () => openaiText((model || 'gpt-4o') as any),
|
|
75
|
+
gemini: () => geminiText((model || 'gemini-2.0-flash-exp') as any),
|
|
76
|
+
ollama: () => ollamaText((model || 'mistral:7b') as any),
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
const adapter = adapterConfig[provider]()
|
|
80
|
+
|
|
81
|
+
const stream = chat({
|
|
82
|
+
adapter,
|
|
83
|
+
tools: [getJobsBySkill, getAllJobs, getAllEducation, searchExperience],
|
|
84
|
+
systemPrompts: [SYSTEM_PROMPT],
|
|
85
|
+
agentLoopStrategy: maxIterations(5),
|
|
86
|
+
messages,
|
|
87
|
+
abortController,
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
return toServerSentEventsResponse(stream, { abortController })
|
|
91
|
+
} catch (error: any) {
|
|
92
|
+
console.error('Resume chat error:', error)
|
|
93
|
+
if (error.name === 'AbortError' || abortController.signal.aborted) {
|
|
94
|
+
return new Response(null, { status: 499 })
|
|
95
|
+
}
|
|
96
|
+
return new Response(
|
|
97
|
+
JSON.stringify({
|
|
98
|
+
error: 'Failed to process chat request',
|
|
99
|
+
message: error.message,
|
|
100
|
+
}),
|
|
101
|
+
{
|
|
102
|
+
status: 500,
|
|
103
|
+
headers: { 'Content-Type': 'application/json' },
|
|
104
|
+
},
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
},
|
|
110
|
+
})
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createFileRoute } from '@tanstack/solid-router'
|
|
2
|
+
import { auth } from '../../../lib/auth'
|
|
3
|
+
|
|
4
|
+
export const Route = createFileRoute('/api/auth/$')({
|
|
5
|
+
server: {
|
|
6
|
+
handlers: {
|
|
7
|
+
GET: ({ request }) => auth.handler(request),
|
|
8
|
+
POST: ({ request }) => auth.handler(request),
|
|
9
|
+
},
|
|
10
|
+
},
|
|
11
|
+
})
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { defineSchema, defineTable } from 'convex/server'
|
|
2
|
+
import { v } from 'convex/values'
|
|
3
|
+
|
|
4
|
+
export default defineSchema({
|
|
5
|
+
products: defineTable({
|
|
6
|
+
title: v.string(),
|
|
7
|
+
imageId: v.string(),
|
|
8
|
+
price: v.number(),
|
|
9
|
+
}),
|
|
10
|
+
todos: defineTable({
|
|
11
|
+
text: v.string(),
|
|
12
|
+
completed: v.boolean(),
|
|
13
|
+
}),
|
|
14
|
+
})
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { mutation, query } from './_generated/server'
|
|
2
|
+
import { v } from 'convex/values'
|
|
3
|
+
|
|
4
|
+
export const list = query({
|
|
5
|
+
args: {},
|
|
6
|
+
handler: async (ctx) => {
|
|
7
|
+
return await ctx.db
|
|
8
|
+
.query('todos')
|
|
9
|
+
.withIndex('by_creation_time')
|
|
10
|
+
.order('desc')
|
|
11
|
+
.collect()
|
|
12
|
+
},
|
|
13
|
+
})
|
|
14
|
+
|
|
15
|
+
export const add = mutation({
|
|
16
|
+
args: { text: v.string() },
|
|
17
|
+
handler: async (ctx, args) => {
|
|
18
|
+
return await ctx.db.insert('todos', {
|
|
19
|
+
text: args.text,
|
|
20
|
+
completed: false,
|
|
21
|
+
})
|
|
22
|
+
},
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
export const toggle = mutation({
|
|
26
|
+
args: { id: v.id('todos') },
|
|
27
|
+
handler: async (ctx, args) => {
|
|
28
|
+
const todo = await ctx.db.get(args.id)
|
|
29
|
+
if (!todo) {
|
|
30
|
+
throw new Error('Todo not found')
|
|
31
|
+
}
|
|
32
|
+
return await ctx.db.patch(args.id, {
|
|
33
|
+
completed: !todo.completed,
|
|
34
|
+
})
|
|
35
|
+
},
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
export const remove = mutation({
|
|
39
|
+
args: { id: v.id('todos') },
|
|
40
|
+
handler: async (ctx, args) => {
|
|
41
|
+
return await ctx.db.delete(args.id)
|
|
42
|
+
},
|
|
43
|
+
})
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Derived, Store } from '@tanstack/store'
|
|
2
|
+
|
|
3
|
+
export const store = new Store({
|
|
4
|
+
firstName: 'Jane',
|
|
5
|
+
lastName: 'Smith',
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
export const fullName = new Derived({
|
|
9
|
+
fn: () => `${store.state.firstName} ${store.state.lastName}`,
|
|
10
|
+
deps: [store],
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
fullName.mount()
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { createEnv } from "@t3-oss/env-core";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
|
|
4
|
+
export const env = createEnv({
|
|
5
|
+
server: {
|
|
6
|
+
SERVER_URL: z.url().optional(),
|
|
7
|
+
},
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The prefix that client-side variables must have. This is enforced both at
|
|
11
|
+
* a type-level and at runtime.
|
|
12
|
+
*/
|
|
13
|
+
clientPrefix: "VITE_",
|
|
14
|
+
|
|
15
|
+
client: {
|
|
16
|
+
VITE_APP_TITLE: z.string().min(1).optional(),
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* What object holds the environment variables at runtime. This is usually
|
|
21
|
+
* `process.env` or `import.meta.env`.
|
|
22
|
+
*/
|
|
23
|
+
runtimeEnv: import.meta.env,
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* By default, this library will feed the environment variables directly to
|
|
27
|
+
* the Zod validator.
|
|
28
|
+
*
|
|
29
|
+
* This means that if you have an empty string for a value that is supposed
|
|
30
|
+
* to be a number (e.g. `PORT=` in a ".env" file), Zod will incorrectly flag
|
|
31
|
+
* it as a type mismatch violation. Additionally, if you have an empty string
|
|
32
|
+
* for a value that is supposed to be a string with a default value (e.g.
|
|
33
|
+
* `DOMAIN=` in an ".env" file), the default value will never be applied.
|
|
34
|
+
*
|
|
35
|
+
* In order to solve these issues, we recommend that all new projects
|
|
36
|
+
* explicitly specify this option as true.
|
|
37
|
+
*/
|
|
38
|
+
emptyStringAsUndefined: true,
|
|
39
|
+
});
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import express, { Request, Response } from 'express'
|
|
2
|
+
import cors from 'cors'
|
|
3
|
+
import dotenv from 'dotenv'
|
|
4
|
+
import Anthropic from '@anthropic-ai/sdk'
|
|
5
|
+
|
|
6
|
+
// Load environment variables
|
|
7
|
+
dotenv.config()
|
|
8
|
+
|
|
9
|
+
const app = express()
|
|
10
|
+
const port = process.env.PORT || 8080
|
|
11
|
+
|
|
12
|
+
// Middleware
|
|
13
|
+
app.use(cors())
|
|
14
|
+
app.use(express.json())
|
|
15
|
+
|
|
16
|
+
// Initialize Anthropic client
|
|
17
|
+
const anthropic = new Anthropic({
|
|
18
|
+
apiKey: process.env.ANTHROPIC_API_KEY,
|
|
19
|
+
})
|
|
20
|
+
|
|
21
|
+
// Define types for the request body
|
|
22
|
+
interface ChatMessage {
|
|
23
|
+
role: 'user' | 'assistant'
|
|
24
|
+
content: string
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface ChatRequest {
|
|
28
|
+
messages: ChatMessage[]
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Streaming chat endpoint
|
|
32
|
+
app.post(
|
|
33
|
+
'/api/chat',
|
|
34
|
+
async (req: Request<{}, {}, ChatRequest>, res: Response) => {
|
|
35
|
+
try {
|
|
36
|
+
const { messages } = req.body
|
|
37
|
+
|
|
38
|
+
if (!messages || !Array.isArray(messages)) {
|
|
39
|
+
return res.status(400).json({ error: 'Messages array is required' })
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Validate message format
|
|
43
|
+
const isValidMessages = messages.every(
|
|
44
|
+
(msg): msg is ChatMessage =>
|
|
45
|
+
typeof msg === 'object' &&
|
|
46
|
+
(msg.role === 'user' || msg.role === 'assistant') &&
|
|
47
|
+
typeof msg.content === 'string',
|
|
48
|
+
)
|
|
49
|
+
|
|
50
|
+
if (!isValidMessages) {
|
|
51
|
+
return res.status(400).json({
|
|
52
|
+
error:
|
|
53
|
+
"Invalid message format. Each message must have 'role' and 'content'",
|
|
54
|
+
})
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Set up SSE headers
|
|
58
|
+
res.setHeader('Content-Type', 'text/event-stream')
|
|
59
|
+
res.setHeader('Cache-Control', 'no-cache')
|
|
60
|
+
res.setHeader('Connection', 'keep-alive')
|
|
61
|
+
|
|
62
|
+
// Create the message stream
|
|
63
|
+
const stream = await anthropic.messages.create({
|
|
64
|
+
messages: messages.map((msg) => ({
|
|
65
|
+
role: msg.role,
|
|
66
|
+
content: msg.content,
|
|
67
|
+
})),
|
|
68
|
+
model: 'claude-3-opus-20240229',
|
|
69
|
+
max_tokens: 4096,
|
|
70
|
+
stream: true,
|
|
71
|
+
})
|
|
72
|
+
|
|
73
|
+
// Stream the response
|
|
74
|
+
for await (const chunk of stream) {
|
|
75
|
+
if (chunk.type === 'content_block_delta') {
|
|
76
|
+
res.write(`data: ${JSON.stringify(chunk)}\n\n`)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// End the stream
|
|
81
|
+
res.write('data: [DONE]\n\n')
|
|
82
|
+
res.end()
|
|
83
|
+
} catch (error) {
|
|
84
|
+
console.error('Error:', error)
|
|
85
|
+
// If headers haven't been sent yet, send error response
|
|
86
|
+
if (!res.headersSent) {
|
|
87
|
+
res.status(500).json({ error: 'Internal server error' })
|
|
88
|
+
} else {
|
|
89
|
+
// If streaming has started, send error event
|
|
90
|
+
const errorMessage =
|
|
91
|
+
error instanceof Error ? error.message : 'Unknown error'
|
|
92
|
+
res.write(`data: ${JSON.stringify({ error: errorMessage })}\n\n`)
|
|
93
|
+
res.end()
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
)
|
|
98
|
+
|
|
99
|
+
// Start the server
|
|
100
|
+
app.listen(port, () => {
|
|
101
|
+
console.log(`Server is running on port ${port}`)
|
|
102
|
+
})
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Derived, Store } from '@tanstack/store'
|
|
2
|
+
|
|
3
|
+
export const store = new Store({
|
|
4
|
+
firstName: 'Jane',
|
|
5
|
+
lastName: 'Smith',
|
|
6
|
+
})
|
|
7
|
+
|
|
8
|
+
export const fullName = new Derived({
|
|
9
|
+
fn: () => `${store.state.firstName} ${store.state.lastName}`,
|
|
10
|
+
deps: [store],
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
fullName.mount()
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { useStore } from '@tanstack/solid-store'
|
|
2
|
+
import { store, actions, selectors } from './demo.store'
|
|
3
|
+
|
|
4
|
+
export type { State, Prompt, Conversation } from './demo.store'
|
|
5
|
+
|
|
6
|
+
export function useAppState() {
|
|
7
|
+
const state = useStore(store)
|
|
8
|
+
return state;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function useAppActions() {
|
|
12
|
+
return actions
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export function useAppSelectors() {
|
|
16
|
+
return selectors
|
|
17
|
+
}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { Store } from '@tanstack/store'
|
|
2
|
+
import type { Message } from '../utils/demo.ai'
|
|
3
|
+
|
|
4
|
+
// Types
|
|
5
|
+
export interface Prompt {
|
|
6
|
+
id: string
|
|
7
|
+
name: string
|
|
8
|
+
content: string
|
|
9
|
+
is_active: boolean
|
|
10
|
+
created_at: number
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface Conversation {
|
|
14
|
+
id: string
|
|
15
|
+
title: string
|
|
16
|
+
messages: Message[]
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface State {
|
|
20
|
+
prompts: Prompt[]
|
|
21
|
+
conversations: Conversation[]
|
|
22
|
+
currentConversationId: string | null
|
|
23
|
+
isLoading: boolean
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const initialState: State = {
|
|
27
|
+
prompts: [],
|
|
28
|
+
conversations: [],
|
|
29
|
+
currentConversationId: null,
|
|
30
|
+
isLoading: false
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export const store = new Store<State>(initialState)
|
|
34
|
+
|
|
35
|
+
export const actions = {
|
|
36
|
+
// Prompt actions
|
|
37
|
+
createPrompt: (name: string, content: string) => {
|
|
38
|
+
const id = Date.now().toString()
|
|
39
|
+
store.setState(state => {
|
|
40
|
+
const updatedPrompts = state.prompts.map(p => ({ ...p, is_active: false }))
|
|
41
|
+
return {
|
|
42
|
+
...state,
|
|
43
|
+
prompts: [
|
|
44
|
+
...updatedPrompts,
|
|
45
|
+
{
|
|
46
|
+
id,
|
|
47
|
+
name,
|
|
48
|
+
content,
|
|
49
|
+
is_active: true,
|
|
50
|
+
created_at: Date.now()
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
})
|
|
55
|
+
},
|
|
56
|
+
|
|
57
|
+
deletePrompt: (id: string) => {
|
|
58
|
+
store.setState(state => ({
|
|
59
|
+
...state,
|
|
60
|
+
prompts: state.prompts.filter(p => p.id !== id)
|
|
61
|
+
}))
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
setPromptActive: (id: string, shouldActivate: boolean) => {
|
|
65
|
+
store.setState(state => ({
|
|
66
|
+
...state,
|
|
67
|
+
prompts: state.prompts.map(p => ({
|
|
68
|
+
...p,
|
|
69
|
+
is_active: p.id === id ? shouldActivate : false
|
|
70
|
+
}))
|
|
71
|
+
}))
|
|
72
|
+
},
|
|
73
|
+
|
|
74
|
+
// Chat actions
|
|
75
|
+
setConversations: (conversations: Conversation[]) => {
|
|
76
|
+
store.setState(state => ({ ...state, conversations }))
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
setCurrentConversationId: (id: string | null) => {
|
|
80
|
+
store.setState(state => ({ ...state, currentConversationId: id }))
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
addConversation: (conversation: Conversation) => {
|
|
84
|
+
store.setState(state => ({
|
|
85
|
+
...state,
|
|
86
|
+
conversations: [...state.conversations, conversation],
|
|
87
|
+
currentConversationId: conversation.id
|
|
88
|
+
}))
|
|
89
|
+
},
|
|
90
|
+
|
|
91
|
+
updateConversationTitle: (id: string, title: string) => {
|
|
92
|
+
store.setState(state => ({
|
|
93
|
+
...state,
|
|
94
|
+
conversations: state.conversations.map(conv =>
|
|
95
|
+
conv.id === id ? { ...conv, title } : conv
|
|
96
|
+
)
|
|
97
|
+
}))
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
deleteConversation: (id: string) => {
|
|
101
|
+
store.setState(state => ({
|
|
102
|
+
...state,
|
|
103
|
+
conversations: state.conversations.filter(conv => conv.id !== id),
|
|
104
|
+
currentConversationId: state.currentConversationId === id ? null : state.currentConversationId
|
|
105
|
+
}))
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
addMessage: (conversationId: string, message: Message) => {
|
|
109
|
+
store.setState(state => ({
|
|
110
|
+
...state,
|
|
111
|
+
conversations: state.conversations.map(conv =>
|
|
112
|
+
conv.id === conversationId
|
|
113
|
+
? { ...conv, messages: [...conv.messages, message] }
|
|
114
|
+
: conv
|
|
115
|
+
)
|
|
116
|
+
}))
|
|
117
|
+
},
|
|
118
|
+
|
|
119
|
+
setLoading: (isLoading: boolean) => {
|
|
120
|
+
store.setState(state => ({ ...state, isLoading }))
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Selectors
|
|
125
|
+
export const selectors = {
|
|
126
|
+
getActivePrompt: (state: State) => state.prompts.find(p => p.is_active),
|
|
127
|
+
getCurrentConversation: (state: State) =>
|
|
128
|
+
state.conversations.find(c => c.id === state.currentConversationId),
|
|
129
|
+
getPrompts: (state: State) => state.prompts,
|
|
130
|
+
getConversations: (state: State) => state.conversations,
|
|
131
|
+
getCurrentConversationId: (state: State) => state.currentConversationId,
|
|
132
|
+
getIsLoading: (state: State) => state.isLoading
|
|
133
|
+
}
|
|
@@ -4,28 +4,28 @@ import { getPackageManagerScriptCommand } from '../package-manager.js';
|
|
|
4
4
|
export async function postInitScript(environment, options) {
|
|
5
5
|
const packageJsonPath = resolve(options.targetDir, 'package.json');
|
|
6
6
|
if (!environment.exists(packageJsonPath)) {
|
|
7
|
-
environment.warn('Warning', 'No package.json found, skipping post-
|
|
7
|
+
environment.warn('Warning', 'No package.json found, skipping post-create-init script');
|
|
8
8
|
return;
|
|
9
9
|
}
|
|
10
10
|
try {
|
|
11
11
|
const packageJsonContent = readFileSync(packageJsonPath, 'utf-8');
|
|
12
12
|
const packageJson = JSON.parse(packageJsonContent);
|
|
13
|
-
if (!packageJson.scripts || !packageJson.scripts['post-
|
|
14
|
-
// No post-
|
|
13
|
+
if (!packageJson.scripts || !packageJson.scripts['post-create-init']) {
|
|
14
|
+
// No post-create-init script found, skip silently
|
|
15
15
|
return;
|
|
16
16
|
}
|
|
17
17
|
environment.startStep({
|
|
18
18
|
id: 'post-init-script',
|
|
19
19
|
type: 'command',
|
|
20
|
-
message: 'Running post-
|
|
20
|
+
message: 'Running post-create-init script...',
|
|
21
21
|
});
|
|
22
|
-
const { command, args } = getPackageManagerScriptCommand(options.packageManager, ['post-
|
|
22
|
+
const { command, args } = getPackageManagerScriptCommand(options.packageManager, ['post-create-init']);
|
|
23
23
|
await environment.execute(command, args, options.targetDir, {
|
|
24
24
|
inherit: true,
|
|
25
25
|
});
|
|
26
26
|
environment.finishStep('post-init-script', 'Post-cta-init script complete');
|
|
27
27
|
}
|
|
28
28
|
catch (error) {
|
|
29
|
-
environment.error(`Failed to run post-
|
|
29
|
+
environment.error(`Failed to run post-create-init script: ${error instanceof Error ? error.message : String(error)}`);
|
|
30
30
|
}
|
|
31
31
|
}
|
package/package.json
CHANGED
|
@@ -1,21 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/create",
|
|
3
|
-
"version": "0.49.
|
|
3
|
+
"version": "0.49.3",
|
|
4
4
|
"description": "TanStack Application Builder Engine",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
7
7
|
"types": "./dist/types/index.d.ts",
|
|
8
|
-
"scripts": {
|
|
9
|
-
"build": "tsc && npm run copy-assets",
|
|
10
|
-
"copy-assets": "node -e \"const fs=require('fs');const path=require('path');function copyDir(src,dest){if(!fs.existsSync(dest))fs.mkdirSync(dest,{recursive:true});for(const entry of fs.readdirSync(src,{withFileTypes:true})){const srcPath=path.join(src,entry.name);const destPath=path.join(dest,entry.name);if(entry.isDirectory())copyDir(srcPath,destPath);else if(!entry.name.endsWith('.ts')||entry.name.endsWith('.d.ts'))fs.copyFileSync(srcPath,destPath)}}['react','solid'].forEach(fw=>{['add-ons','toolchains','hosts','examples','project'].forEach(dir=>{const src='src/frameworks/'+fw+'/'+dir;const dest='dist/frameworks/'+fw+'/'+dir;if(fs.existsSync(src))copyDir(src,dest)})})\"",
|
|
11
|
-
"dev": "tsc --watch",
|
|
12
|
-
"test": "eslint ./src && vitest run",
|
|
13
|
-
"test:watch": "vitest",
|
|
14
|
-
"test:coverage": "vitest run --coverage"
|
|
15
|
-
},
|
|
16
8
|
"repository": {
|
|
17
9
|
"type": "git",
|
|
18
|
-
"url": "git+https://github.com/TanStack/
|
|
10
|
+
"url": "git+https://github.com/TanStack/cli.git",
|
|
19
11
|
"directory": "packages/create"
|
|
20
12
|
},
|
|
21
13
|
"homepage": "https://tanstack.com/router",
|
|
@@ -30,7 +22,6 @@
|
|
|
30
22
|
],
|
|
31
23
|
"author": "Jack Herrington <jherr@pobox.com>",
|
|
32
24
|
"license": "MIT",
|
|
33
|
-
"packageManager": "pnpm@9.15.5",
|
|
34
25
|
"dependencies": {
|
|
35
26
|
"ejs": "^3.1.10",
|
|
36
27
|
"execa": "^9.5.2",
|
|
@@ -50,5 +41,13 @@
|
|
|
50
41
|
"typescript": "^5.6.3",
|
|
51
42
|
"vitest": "^3.0.8",
|
|
52
43
|
"vitest-fetch-mock": "^0.4.5"
|
|
44
|
+
},
|
|
45
|
+
"scripts": {
|
|
46
|
+
"build": "tsc && npm run copy-assets",
|
|
47
|
+
"copy-assets": "node -e \"const fs=require('fs');const path=require('path');function copyDir(src,dest){if(!fs.existsSync(dest))fs.mkdirSync(dest,{recursive:true});for(const entry of fs.readdirSync(src,{withFileTypes:true})){const srcPath=path.join(src,entry.name);const destPath=path.join(dest,entry.name);if(entry.isDirectory())copyDir(srcPath,destPath);else fs.copyFileSync(srcPath,destPath)}}['react','solid'].forEach(fw=>{['add-ons','toolchains','hosts','examples','project'].forEach(dir=>{const src='src/frameworks/'+fw+'/'+dir;const dest='dist/frameworks/'+fw+'/'+dir;if(fs.existsSync(src))copyDir(src,dest)})})\"",
|
|
48
|
+
"dev": "tsc --watch",
|
|
49
|
+
"test": "eslint ./src && vitest run",
|
|
50
|
+
"test:watch": "vitest",
|
|
51
|
+
"test:coverage": "vitest run --coverage"
|
|
53
52
|
}
|
|
54
|
-
}
|
|
53
|
+
}
|
package/src/file-helpers.ts
CHANGED
|
@@ -42,7 +42,10 @@ export function getBinaryFile(content: string): string | null {
|
|
|
42
42
|
*/
|
|
43
43
|
export function toCleanPath(absolutePath: string, baseDir: string): string {
|
|
44
44
|
let cleanPath = absolutePath.replace(baseDir, '')
|
|
45
|
-
|
|
45
|
+
// Handle both Unix (/) and Windows (\) path separators
|
|
46
|
+
if (cleanPath.startsWith('/') || cleanPath.startsWith('\\')) {
|
|
47
|
+
cleanPath = cleanPath.slice(1)
|
|
48
|
+
}
|
|
46
49
|
return cleanPath
|
|
47
50
|
}
|
|
48
51
|
|
|
@@ -14,7 +14,7 @@ export async function postInitScript(
|
|
|
14
14
|
if (!environment.exists(packageJsonPath)) {
|
|
15
15
|
environment.warn(
|
|
16
16
|
'Warning',
|
|
17
|
-
'No package.json found, skipping post-
|
|
17
|
+
'No package.json found, skipping post-create-init script',
|
|
18
18
|
)
|
|
19
19
|
return
|
|
20
20
|
}
|
|
@@ -23,20 +23,20 @@ export async function postInitScript(
|
|
|
23
23
|
const packageJsonContent = readFileSync(packageJsonPath, 'utf-8')
|
|
24
24
|
const packageJson = JSON.parse(packageJsonContent)
|
|
25
25
|
|
|
26
|
-
if (!packageJson.scripts || !packageJson.scripts['post-
|
|
27
|
-
// No post-
|
|
26
|
+
if (!packageJson.scripts || !packageJson.scripts['post-create-init']) {
|
|
27
|
+
// No post-create-init script found, skip silently
|
|
28
28
|
return
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
environment.startStep({
|
|
32
32
|
id: 'post-init-script',
|
|
33
33
|
type: 'command',
|
|
34
|
-
message: 'Running post-
|
|
34
|
+
message: 'Running post-create-init script...',
|
|
35
35
|
})
|
|
36
36
|
|
|
37
37
|
const { command, args } = getPackageManagerScriptCommand(
|
|
38
38
|
options.packageManager,
|
|
39
|
-
['post-
|
|
39
|
+
['post-create-init'],
|
|
40
40
|
)
|
|
41
41
|
|
|
42
42
|
await environment.execute(command, args, options.targetDir, {
|
|
@@ -46,7 +46,7 @@ export async function postInitScript(
|
|
|
46
46
|
environment.finishStep('post-init-script', 'Post-cta-init script complete')
|
|
47
47
|
} catch (error) {
|
|
48
48
|
environment.error(
|
|
49
|
-
`Failed to run post-
|
|
49
|
+
`Failed to run post-create-init script: ${error instanceof Error ? error.message : String(error)}`,
|
|
50
50
|
)
|
|
51
51
|
}
|
|
52
52
|
}
|