@amplitude/wizard 1.0.0-beta.2 → 1.0.0-beta.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 +25 -1
- package/README.md +171 -74
- package/dist/bin.js +338 -222
- package/dist/src/lib/agent-interface.js +64 -9
- package/dist/src/lib/agent-runner.js +1 -10
- package/dist/src/lib/api.d.ts +22 -4
- package/dist/src/lib/api.js +114 -12
- package/dist/src/lib/commandments.js +14 -1
- package/dist/src/lib/constants.d.ts +6 -5
- package/dist/src/lib/constants.js +13 -13
- package/dist/src/lib/credential-resolution.d.ts +45 -0
- package/dist/src/lib/credential-resolution.js +311 -0
- package/dist/src/lib/exit-codes.d.ts +10 -0
- package/dist/src/lib/exit-codes.js +12 -0
- package/dist/src/lib/health-checks/statuspage.d.ts +1 -0
- package/dist/src/lib/health-checks/statuspage.js +5 -1
- package/dist/src/lib/mode-config.d.ts +14 -0
- package/dist/src/lib/mode-config.js +14 -0
- package/dist/src/lib/session-checkpoint.d.ts +27 -0
- package/dist/src/lib/session-checkpoint.js +134 -0
- package/dist/src/lib/wizard-session.d.ts +44 -1
- package/dist/src/lib/wizard-session.js +70 -14
- package/dist/src/lib/wizard-tools.js +19 -4
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +3 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +6 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +3 -1
- package/dist/src/ui/agent-ui.d.ts +91 -0
- package/dist/src/ui/agent-ui.js +277 -0
- package/dist/src/ui/logging-ui.js +1 -1
- package/dist/src/ui/tui/App.d.ts +12 -0
- package/dist/src/ui/tui/App.js +29 -18
- package/dist/src/ui/tui/components/AmplitudeLogo.js +16 -17
- package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +0 -2
- package/dist/src/ui/tui/components/AmplitudeTextLogo.js +53 -18
- package/dist/src/ui/tui/components/BrailleSpinner.d.ts +8 -0
- package/dist/src/ui/tui/components/BrailleSpinner.js +15 -0
- package/dist/src/ui/tui/components/ConsoleView.d.ts +8 -11
- package/dist/src/ui/tui/components/ConsoleView.js +51 -34
- package/dist/src/ui/tui/components/HeaderBar.d.ts +12 -0
- package/dist/src/ui/tui/components/HeaderBar.js +17 -0
- package/dist/src/ui/tui/components/JourneyStepper.d.ts +16 -0
- package/dist/src/ui/tui/components/JourneyStepper.js +83 -0
- package/dist/src/ui/tui/components/KeyHintBar.d.ts +19 -0
- package/dist/src/ui/tui/components/KeyHintBar.js +20 -0
- package/dist/src/ui/tui/console-commands.d.ts +1 -2
- package/dist/src/ui/tui/console-commands.js +48 -7
- package/dist/src/ui/tui/flows.d.ts +1 -1
- package/dist/src/ui/tui/flows.js +1 -1
- package/dist/src/ui/tui/hooks/useAsyncEffect.d.ts +15 -0
- package/dist/src/ui/tui/hooks/useAsyncEffect.js +35 -0
- package/dist/src/ui/tui/hooks/useWizardStore.d.ts +9 -0
- package/dist/src/ui/tui/hooks/useWizardStore.js +11 -0
- package/dist/src/ui/tui/ink-ui.js +1 -1
- package/dist/src/ui/tui/primitives/DissolveTransition.js +4 -5
- package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +3 -1
- package/dist/src/ui/tui/primitives/EventPlanViewer.js +8 -3
- package/dist/src/ui/tui/primitives/ProgressList.js +1 -1
- package/dist/src/ui/tui/primitives/SlashCommandInput.js +19 -4
- package/dist/src/ui/tui/primitives/SplitView.d.ts +2 -1
- package/dist/src/ui/tui/primitives/SplitView.js +10 -2
- package/dist/src/ui/tui/primitives/TabContainer.js +10 -2
- package/dist/src/ui/tui/primitives/index.d.ts +0 -1
- package/dist/src/ui/tui/primitives/index.js +0 -1
- package/dist/src/ui/tui/router.js +1 -1
- package/dist/src/ui/tui/screen-registry.d.ts +0 -7
- package/dist/src/ui/tui/screen-registry.js +13 -4
- package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +2 -2
- package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +8 -8
- package/dist/src/ui/tui/screens/AuthScreen.js +57 -27
- package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +2 -12
- package/dist/src/ui/tui/screens/ChecklistScreen.js +22 -33
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +3 -12
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +109 -39
- package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +3 -3
- package/dist/src/ui/tui/screens/DataSetupScreen.js +17 -10
- package/dist/src/ui/tui/screens/IntroScreen.d.ts +5 -3
- package/dist/src/ui/tui/screens/IntroScreen.js +132 -41
- package/dist/src/ui/tui/screens/LoginScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/LoginScreen.js +4 -4
- package/dist/src/ui/tui/screens/LogoutScreen.d.ts +4 -2
- package/dist/src/ui/tui/screens/LogoutScreen.js +17 -5
- package/dist/src/ui/tui/screens/McpScreen.d.ts +4 -4
- package/dist/src/ui/tui/screens/McpScreen.js +25 -17
- package/dist/src/ui/tui/screens/OutageScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/OutageScreen.js +5 -5
- package/dist/src/ui/tui/screens/OutroScreen.d.ts +5 -0
- package/dist/src/ui/tui/screens/OutroScreen.js +21 -14
- package/dist/src/ui/tui/screens/RegionSelectScreen.js +15 -13
- package/dist/src/ui/tui/screens/RunScreen.d.ts +7 -5
- package/dist/src/ui/tui/screens/RunScreen.js +102 -157
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +6 -5
- package/dist/src/ui/tui/screens/SetupScreen.d.ts +1 -1
- package/dist/src/ui/tui/screens/SetupScreen.js +7 -7
- package/dist/src/ui/tui/screens/SlackScreen.d.ts +2 -2
- package/dist/src/ui/tui/screens/SlackScreen.js +60 -35
- package/dist/src/ui/tui/session-constants.d.ts +41 -0
- package/dist/src/ui/tui/session-constants.js +38 -0
- package/dist/src/ui/tui/start-tui.d.ts +3 -1
- package/dist/src/ui/tui/start-tui.js +14 -10
- package/dist/src/ui/tui/store.d.ts +2 -1
- package/dist/src/ui/tui/store.js +33 -7
- package/dist/src/ui/tui/styles.d.ts +75 -19
- package/dist/src/ui/tui/styles.js +101 -19
- package/dist/src/ui/tui/utils/classify-error.d.ts +14 -0
- package/dist/src/ui/tui/utils/classify-error.js +90 -0
- package/dist/src/ui/tui/utils/diagnostics.d.ts +21 -0
- package/dist/src/ui/tui/utils/diagnostics.js +72 -0
- package/dist/src/ui/tui/utils/with-retry.d.ts +12 -0
- package/dist/src/ui/tui/utils/with-retry.js +32 -0
- package/dist/src/ui/tui/utils/with-timeout.d.ts +10 -0
- package/dist/src/ui/tui/utils/with-timeout.js +24 -0
- package/dist/src/utils/ampli-settings.d.ts +1 -1
- package/dist/src/utils/ampli-settings.js +15 -5
- package/dist/src/utils/api-key-store.js +5 -5
- package/dist/src/utils/atomic-write.d.ts +15 -0
- package/dist/src/utils/atomic-write.js +34 -0
- package/dist/src/utils/setup-utils.js +2 -2
- package/dist/src/utils/token-refresh.d.ts +22 -0
- package/dist/src/utils/token-refresh.js +79 -0
- package/dist/src/utils/wizard-abort.js +6 -1
- package/package.json +6 -6
- package/skills/instrumentation/add-analytics-instrumentation/SKILL.md +142 -0
- package/skills/instrumentation/diff-intake/SKILL.md +128 -0
- package/skills/instrumentation/discover-analytics-patterns/SKILL.md +185 -0
- package/skills/instrumentation/discover-event-surfaces/SKILL.md +322 -0
- package/skills/instrumentation/discover-event-surfaces/references/best-practices.md +563 -0
- package/skills/instrumentation/instrument-events/SKILL.md +169 -0
- package/skills/instrumentation/instrument-events/references/best-practices.md +563 -0
- package/skills/integration/integration-android/SKILL.md +49 -0
- package/skills/integration/integration-android/references/EXAMPLE.md +1977 -0
- package/skills/integration/integration-android/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-android/references/analytics.md +1778 -0
- package/skills/integration/integration-android/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-android/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-android/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-android/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-angular/SKILL.md +49 -0
- package/skills/integration/integration-angular/references/EXAMPLE.md +899 -0
- package/skills/integration/integration-angular/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-angular/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-angular/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-angular/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-angular/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-angular/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-hybrid/SKILL.md +56 -0
- package/skills/integration/integration-astro-hybrid/references/EXAMPLE.md +1095 -0
- package/skills/integration/integration-astro-hybrid/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-hybrid/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-hybrid/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-ssr/SKILL.md +52 -0
- package/skills/integration/integration-astro-ssr/references/EXAMPLE.md +1106 -0
- package/skills/integration/integration-astro-ssr/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-ssr/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-ssr/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-static/SKILL.md +49 -0
- package/skills/integration/integration-astro-static/references/EXAMPLE.md +910 -0
- package/skills/integration/integration-astro-static/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-static/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-static/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-astro-view-transitions/SKILL.md +51 -0
- package/skills/integration/integration-astro-view-transitions/references/EXAMPLE.md +979 -0
- package/skills/integration/integration-astro-view-transitions/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-astro-view-transitions/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-astro-view-transitions/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-django/SKILL.md +57 -0
- package/skills/integration/integration-django/references/EXAMPLE.md +1005 -0
- package/skills/integration/integration-django/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-django/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-django/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-django/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-django/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-django/references/python.md +1424 -0
- package/skills/integration/integration-expo/SKILL.md +53 -0
- package/skills/integration/integration-expo/references/EXAMPLE.md +1291 -0
- package/skills/integration/integration-expo/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-expo/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-expo/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-expo/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-expo/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-expo/references/react-native-sdk.md +2819 -0
- package/skills/integration/integration-fastapi/SKILL.md +57 -0
- package/skills/integration/integration-fastapi/references/EXAMPLE.md +1389 -0
- package/skills/integration/integration-fastapi/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-fastapi/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-fastapi/references/python.md +1424 -0
- package/skills/integration/integration-flask/SKILL.md +56 -0
- package/skills/integration/integration-flask/references/EXAMPLE.md +1130 -0
- package/skills/integration/integration-flask/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-flask/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-flask/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-flask/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-flask/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-flask/references/python.md +1424 -0
- package/skills/integration/integration-javascript_node/SKILL.md +54 -0
- package/skills/integration/integration-javascript_node/references/EXAMPLE.md +365 -0
- package/skills/integration/integration-javascript_node/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-javascript_node/references/analytics.md +1778 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-javascript_node/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-javascript_web/SKILL.md +58 -0
- package/skills/integration/integration-javascript_web/references/EXAMPLE.md +451 -0
- package/skills/integration/integration-javascript_web/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-javascript_web/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-javascript_web/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-laravel/SKILL.md +52 -0
- package/skills/integration/integration-laravel/references/EXAMPLE.md +2039 -0
- package/skills/integration/integration-laravel/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-laravel/references/analytics.md +1778 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-laravel/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nextjs-app-router/SKILL.md +54 -0
- package/skills/integration/integration-nextjs-app-router/references/EXAMPLE.md +673 -0
- package/skills/integration/integration-nextjs-app-router/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nextjs-app-router/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nextjs-app-router/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-nextjs-pages-router/SKILL.md +54 -0
- package/skills/integration/integration-nextjs-pages-router/references/EXAMPLE.md +735 -0
- package/skills/integration/integration-nextjs-pages-router/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nextjs-pages-router/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nextjs-pages-router/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-nuxt-3.6/SKILL.md +46 -0
- package/skills/integration/integration-nuxt-3.6/references/EXAMPLE.md +8422 -0
- package/skills/integration/integration-nuxt-3.6/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nuxt-3.6/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nuxt-3.6/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-nuxt-4/SKILL.md +46 -0
- package/skills/integration/integration-nuxt-4/references/EXAMPLE.md +8670 -0
- package/skills/integration/integration-nuxt-4/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-nuxt-4/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-nuxt-4/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-python/SKILL.md +53 -0
- package/skills/integration/integration-python/references/EXAMPLE.md +445 -0
- package/skills/integration/integration-python/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-python/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-python/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-python/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-python/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-python/references/python.md +1424 -0
- package/skills/integration/integration-react-native/SKILL.md +49 -0
- package/skills/integration/integration-react-native/references/EXAMPLE.md +2253 -0
- package/skills/integration/integration-react-native/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-native/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-native/references/react-native-sdk.md +2819 -0
- package/skills/integration/integration-react-react-router-6/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-6/references/EXAMPLE.md +570 -0
- package/skills/integration/integration-react-react-router-6/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-6/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-6/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-react-router-7-data/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-7-data/references/EXAMPLE.md +830 -0
- package/skills/integration/integration-react-react-router-7-data/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-7-data/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-7-data/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-react-router-7-declarative/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/EXAMPLE.md +609 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-7-declarative/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-react-router-7-framework/SKILL.md +53 -0
- package/skills/integration/integration-react-react-router-7-framework/references/EXAMPLE.md +1081 -0
- package/skills/integration/integration-react-react-router-7-framework/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-react-router-7-framework/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-react-router-7-framework/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-tanstack-router-code-based/SKILL.md +57 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/EXAMPLE.md +659 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-tanstack-router-code-based/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-tanstack-router-file-based/SKILL.md +57 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/EXAMPLE.md +777 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-tanstack-router-file-based/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-react-vite/SKILL.md +53 -0
- package/skills/integration/integration-react-vite/references/EXAMPLE.md +542 -0
- package/skills/integration/integration-react-vite/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-react-vite/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-react-vite/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-ruby/SKILL.md +50 -0
- package/skills/integration/integration-ruby/references/EXAMPLE.md +420 -0
- package/skills/integration/integration-ruby/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-ruby/references/analytics.md +1778 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-ruby/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-ruby-on-rails/SKILL.md +55 -0
- package/skills/integration/integration-ruby-on-rails/references/EXAMPLE.md +1013 -0
- package/skills/integration/integration-ruby-on-rails/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-ruby-on-rails/references/analytics.md +1778 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-ruby-on-rails/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-sveltekit/SKILL.md +47 -0
- package/skills/integration/integration-sveltekit/references/EXAMPLE.md +14121 -0
- package/skills/integration/integration-sveltekit/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-sveltekit/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-sveltekit/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-swift/SKILL.md +49 -0
- package/skills/integration/integration-swift/references/EXAMPLE.md +660 -0
- package/skills/integration/integration-swift/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-swift/references/analytics.md +1778 -0
- package/skills/integration/integration-swift/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-swift/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-swift/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-swift/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-tanstack-start/SKILL.md +58 -0
- package/skills/integration/integration-tanstack-start/references/EXAMPLE.md +998 -0
- package/skills/integration/integration-tanstack-start/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-tanstack-start/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-tanstack-start/references/browser-sdk-2.md +4680 -0
- package/skills/integration/integration-vue-3/SKILL.md +46 -0
- package/skills/integration/integration-vue-3/references/EXAMPLE.md +846 -0
- package/skills/integration/integration-vue-3/references/amplitude-quickstart.md +1845 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.0-begin.md +43 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.1-edit.md +35 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.2-revise.md +23 -0
- package/skills/integration/integration-vue-3/references/basic-integration-1.3-conclude.md +57 -0
- package/skills/integration/integration-vue-3/references/browser-sdk-2.md +4680 -0
- package/skills/taxonomy/amplitude-quickstart-taxonomy-agent/SKILL.md +228 -0
- package/dist/src/ui/tui/components/TitleBar.d.ts +0 -8
- package/dist/src/ui/tui/components/TitleBar.js +0 -27
- package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +0 -7
- package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +0 -101
- package/dist/src/utils/anthropic-status.d.ts +0 -17
- package/dist/src/utils/anthropic-status.js +0 -51
|
@@ -0,0 +1,998 @@
|
|
|
1
|
+
# Amplitude TanStack Start Example Project
|
|
2
|
+
|
|
3
|
+
Repository: https://github.com/amplitude/context-hub
|
|
4
|
+
Path: basics/tanstack-start
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## README.md
|
|
9
|
+
|
|
10
|
+
# Amplitude TanStack Start example
|
|
11
|
+
|
|
12
|
+
This is a [TanStack Start](https://tanstack.com/start) example demonstrating Amplitude integration with product analytics and event tracking.
|
|
13
|
+
|
|
14
|
+
### Amplitude SDKs
|
|
15
|
+
|
|
16
|
+
The browser loads the [Browser Unified SDK (npm)](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#unified-sdk-npm): [`@amplitude/unified`](https://www.npmjs.com/package/@amplitude/unified) with `initAll` in `src/routes/__root.tsx`. [Initialize the Unified SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#initialize-the-unified-sdk) describes `initAll` as initializing every product bundled with Unified npm. Optional sections are in [Unified SDK configuration](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#configuration) (`analytics`, `sessionReplay`, `experiment`, `engagement`). The `experiment` block is **Feature Experiment** (`@amplitude/experiment-js-client`). Amplitude’s [product support table](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#product-support-by-installation-method) lists **Web Experiment** (`@amplitude/experiment-tag`, including the visual editor) for Amplitude’s CDN Unified script, not Unified **npm**.
|
|
17
|
+
|
|
18
|
+
Server code uses [`@amplitude/analytics-node`](https://www.npmjs.com/package/@amplitude/analytics-node) in `src/utils/amplitude-server.ts`.
|
|
19
|
+
|
|
20
|
+
## Features
|
|
21
|
+
|
|
22
|
+
- **Product analytics**: Track user events and behaviors
|
|
23
|
+
- **User authentication**: Demo login system with Amplitude user identification
|
|
24
|
+
- **Client and server tracking**: Examples of both client-side and server-side tracking
|
|
25
|
+
|
|
26
|
+
## Getting Started
|
|
27
|
+
|
|
28
|
+
### 1. Install Dependencies
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npm install
|
|
32
|
+
# or
|
|
33
|
+
pnpm install
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### 2. Configure Environment Variables
|
|
37
|
+
|
|
38
|
+
Create a `.env` file in the root directory:
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
VITE_PUBLIC_AMPLITUDE_API_KEY=your_amplitude_api_key
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
Get your Amplitude API key from your [Amplitude project settings](https://app.amplitude.com).
|
|
45
|
+
|
|
46
|
+
### 3. Run the Development Server
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npm run dev
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Open [http://localhost:3000](http://localhost:3000) with your browser to see the app.
|
|
53
|
+
|
|
54
|
+
## Key Integration Points
|
|
55
|
+
|
|
56
|
+
### Client-side initialization (src/routes/\_\_root.tsx)
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import * as amplitude from '@amplitude/unified'
|
|
60
|
+
|
|
61
|
+
void amplitude.initAll(import.meta.env.VITE_PUBLIC_AMPLITUDE_API_KEY)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### User identification (src/contexts/AuthContext.tsx)
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
import * as amplitude from '@amplitude/unified'
|
|
68
|
+
import { Identify } from '@amplitude/unified'
|
|
69
|
+
|
|
70
|
+
amplitude.setUserId(username)
|
|
71
|
+
const identifyObj = new Identify()
|
|
72
|
+
identifyObj.set('username', username)
|
|
73
|
+
amplitude.identify(identifyObj)
|
|
74
|
+
amplitude.track('User Logged In', { username })
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Server-side tracking (src/utils/amplitude-server.ts)
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
import { NodeClient, createInstance } from '@amplitude/analytics-node'
|
|
81
|
+
|
|
82
|
+
const amplitude = getAmplitudeClient()
|
|
83
|
+
amplitude.track('Server Login Completed', { username, source: 'api' }, { user_id: username })
|
|
84
|
+
await amplitude.flush()
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Event tracking (src/routes/burrito.tsx)
|
|
88
|
+
|
|
89
|
+
```typescript
|
|
90
|
+
amplitude.track('Burrito Considered', {
|
|
91
|
+
total_considerations: user.burritoConsiderations + 1,
|
|
92
|
+
username: user.username,
|
|
93
|
+
})
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## Learn More
|
|
97
|
+
|
|
98
|
+
- [Amplitude Documentation](https://amplitude.com/docs)
|
|
99
|
+
- [TanStack Start Documentation](https://tanstack.com/start/latest)
|
|
100
|
+
- [Amplitude Browser SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2)
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## .env.example
|
|
105
|
+
|
|
106
|
+
```example
|
|
107
|
+
VITE_PUBLIC_AMPLITUDE_API_KEY=your_amplitude_api_key_here
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## .prettierignore
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
package-lock.json
|
|
117
|
+
pnpm-lock.yaml
|
|
118
|
+
yarn.lock
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
---
|
|
122
|
+
|
|
123
|
+
## prettier.config.js
|
|
124
|
+
|
|
125
|
+
```js
|
|
126
|
+
// @ts-check
|
|
127
|
+
|
|
128
|
+
/** @type {import('prettier').Config} */
|
|
129
|
+
const config = {
|
|
130
|
+
semi: false,
|
|
131
|
+
singleQuote: true,
|
|
132
|
+
trailingComma: "all",
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
export default config;
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## public/robots.txt
|
|
142
|
+
|
|
143
|
+
```txt
|
|
144
|
+
# https://www.robotstxt.org/robotstxt.html
|
|
145
|
+
User-agent: *
|
|
146
|
+
Disallow:
|
|
147
|
+
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
---
|
|
151
|
+
|
|
152
|
+
## src/components/Header.tsx
|
|
153
|
+
|
|
154
|
+
```tsx
|
|
155
|
+
import { Link } from '@tanstack/react-router'
|
|
156
|
+
import { useAuth } from '../contexts/AuthContext'
|
|
157
|
+
|
|
158
|
+
export default function Header() {
|
|
159
|
+
const { user, logout } = useAuth()
|
|
160
|
+
|
|
161
|
+
return (
|
|
162
|
+
<header className="header">
|
|
163
|
+
<div className="header-container">
|
|
164
|
+
<nav>
|
|
165
|
+
<Link to="/">Home</Link>
|
|
166
|
+
{user && (
|
|
167
|
+
<>
|
|
168
|
+
<Link to="/burrito">Burrito Consideration</Link>
|
|
169
|
+
<Link to="/profile">Profile</Link>
|
|
170
|
+
</>
|
|
171
|
+
)}
|
|
172
|
+
</nav>
|
|
173
|
+
<div className="user-section">
|
|
174
|
+
{user ? (
|
|
175
|
+
<>
|
|
176
|
+
<span>Welcome, {user.username}!</span>
|
|
177
|
+
<button onClick={logout} className="btn-logout">
|
|
178
|
+
Logout
|
|
179
|
+
</button>
|
|
180
|
+
</>
|
|
181
|
+
) : (
|
|
182
|
+
<span>Not logged in</span>
|
|
183
|
+
)}
|
|
184
|
+
</div>
|
|
185
|
+
</div>
|
|
186
|
+
</header>
|
|
187
|
+
)
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## src/contexts/AuthContext.tsx
|
|
195
|
+
|
|
196
|
+
```tsx
|
|
197
|
+
import * as amplitude from '@amplitude/unified'
|
|
198
|
+
import { Identify } from '@amplitude/unified'
|
|
199
|
+
import { createContext, useContext, useState } from 'react'
|
|
200
|
+
import type { ReactNode } from 'react'
|
|
201
|
+
|
|
202
|
+
interface User {
|
|
203
|
+
username: string
|
|
204
|
+
burritoConsiderations: number
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
interface AuthContextType {
|
|
208
|
+
user: User | null
|
|
209
|
+
login: (username: string, password: string) => Promise<boolean>
|
|
210
|
+
logout: () => void
|
|
211
|
+
incrementBurritoConsiderations: () => void
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
const AuthContext = createContext<AuthContextType | undefined>(undefined)
|
|
215
|
+
|
|
216
|
+
const users: Map<string, User> = new Map()
|
|
217
|
+
|
|
218
|
+
export function AuthProvider({ children }: { children: ReactNode }) {
|
|
219
|
+
// Use lazy initializer to read from localStorage only once on mount
|
|
220
|
+
const [user, setUser] = useState<User | null>(() => {
|
|
221
|
+
if (typeof window === 'undefined') return null
|
|
222
|
+
|
|
223
|
+
const storedUsername = localStorage.getItem('currentUser')
|
|
224
|
+
if (storedUsername) {
|
|
225
|
+
const existingUser = users.get(storedUsername)
|
|
226
|
+
if (existingUser) {
|
|
227
|
+
return existingUser
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return null
|
|
231
|
+
})
|
|
232
|
+
|
|
233
|
+
const login = async (
|
|
234
|
+
username: string,
|
|
235
|
+
password: string,
|
|
236
|
+
): Promise<boolean> => {
|
|
237
|
+
try {
|
|
238
|
+
const response = await fetch('/api/auth/login', {
|
|
239
|
+
method: 'POST',
|
|
240
|
+
headers: {
|
|
241
|
+
'Content-Type': 'application/json',
|
|
242
|
+
},
|
|
243
|
+
body: JSON.stringify({ username, password }),
|
|
244
|
+
})
|
|
245
|
+
|
|
246
|
+
if (response.ok) {
|
|
247
|
+
const { user: userData } = await response.json()
|
|
248
|
+
|
|
249
|
+
// Get or create user in local map
|
|
250
|
+
let localUser = users.get(username)
|
|
251
|
+
if (!localUser) {
|
|
252
|
+
localUser = userData as User
|
|
253
|
+
users.set(username, localUser)
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
setUser(localUser)
|
|
257
|
+
if (typeof window !== 'undefined') {
|
|
258
|
+
localStorage.setItem('currentUser', username)
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Identify user in Amplitude using username as user ID
|
|
262
|
+
amplitude.setUserId(username)
|
|
263
|
+
const identifyObj = new Identify()
|
|
264
|
+
identifyObj.set('username', username)
|
|
265
|
+
amplitude.identify(identifyObj)
|
|
266
|
+
|
|
267
|
+
// Track login event
|
|
268
|
+
amplitude.track('User Logged In', { username })
|
|
269
|
+
|
|
270
|
+
return true
|
|
271
|
+
}
|
|
272
|
+
return false
|
|
273
|
+
} catch (error) {
|
|
274
|
+
console.error('Login error:', error)
|
|
275
|
+
return false
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const logout = () => {
|
|
280
|
+
// Track logout event before resetting
|
|
281
|
+
amplitude.track('User Logged Out')
|
|
282
|
+
amplitude.reset()
|
|
283
|
+
|
|
284
|
+
setUser(null)
|
|
285
|
+
if (typeof window !== 'undefined') {
|
|
286
|
+
localStorage.removeItem('currentUser')
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
const incrementBurritoConsiderations = () => {
|
|
291
|
+
if (user) {
|
|
292
|
+
user.burritoConsiderations++
|
|
293
|
+
users.set(user.username, user)
|
|
294
|
+
setUser({ ...user })
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
return (
|
|
299
|
+
<AuthContext.Provider
|
|
300
|
+
value={{ user, login, logout, incrementBurritoConsiderations }}
|
|
301
|
+
>
|
|
302
|
+
{children}
|
|
303
|
+
</AuthContext.Provider>
|
|
304
|
+
)
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
export function useAuth() {
|
|
308
|
+
const context = useContext(AuthContext)
|
|
309
|
+
if (context === undefined) {
|
|
310
|
+
throw new Error('useAuth must be used within an AuthProvider')
|
|
311
|
+
}
|
|
312
|
+
return context
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
---
|
|
318
|
+
|
|
319
|
+
## src/router.tsx
|
|
320
|
+
|
|
321
|
+
```tsx
|
|
322
|
+
import { createRouter } from '@tanstack/react-router'
|
|
323
|
+
|
|
324
|
+
// Import the generated route tree
|
|
325
|
+
import { routeTree } from './routeTree.gen'
|
|
326
|
+
|
|
327
|
+
// Create a new router instance
|
|
328
|
+
export const getRouter = () => {
|
|
329
|
+
return createRouter({
|
|
330
|
+
routeTree,
|
|
331
|
+
scrollRestoration: true,
|
|
332
|
+
defaultPreloadStaleTime: 0,
|
|
333
|
+
})
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
```
|
|
337
|
+
|
|
338
|
+
---
|
|
339
|
+
|
|
340
|
+
## src/routes/__root.tsx
|
|
341
|
+
|
|
342
|
+
```tsx
|
|
343
|
+
import { HeadContent, Scripts, createRootRoute } from '@tanstack/react-router'
|
|
344
|
+
import { TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools'
|
|
345
|
+
import { TanStackDevtools } from '@tanstack/react-devtools'
|
|
346
|
+
import * as amplitude from '@amplitude/unified'
|
|
347
|
+
|
|
348
|
+
import Header from '../components/Header'
|
|
349
|
+
import { AuthProvider } from '../contexts/AuthContext'
|
|
350
|
+
|
|
351
|
+
import appCss from '../styles.css?url'
|
|
352
|
+
|
|
353
|
+
if (typeof window !== 'undefined') {
|
|
354
|
+
void amplitude.initAll(import.meta.env.VITE_PUBLIC_AMPLITUDE_API_KEY)
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
export const Route = createRootRoute({
|
|
358
|
+
head: () => ({
|
|
359
|
+
meta: [
|
|
360
|
+
{
|
|
361
|
+
charSet: 'utf-8',
|
|
362
|
+
},
|
|
363
|
+
{
|
|
364
|
+
name: 'viewport',
|
|
365
|
+
content: 'width=device-width, initial-scale=1',
|
|
366
|
+
},
|
|
367
|
+
{
|
|
368
|
+
title: 'TanStack Start Starter',
|
|
369
|
+
},
|
|
370
|
+
],
|
|
371
|
+
links: [
|
|
372
|
+
{
|
|
373
|
+
rel: 'stylesheet',
|
|
374
|
+
href: appCss,
|
|
375
|
+
},
|
|
376
|
+
],
|
|
377
|
+
}),
|
|
378
|
+
|
|
379
|
+
shellComponent: RootDocument,
|
|
380
|
+
})
|
|
381
|
+
|
|
382
|
+
function RootDocument({ children }: { children: React.ReactNode }) {
|
|
383
|
+
return (
|
|
384
|
+
<html lang="en">
|
|
385
|
+
<head>
|
|
386
|
+
<HeadContent />
|
|
387
|
+
</head>
|
|
388
|
+
<body>
|
|
389
|
+
<AuthProvider>
|
|
390
|
+
<Header />
|
|
391
|
+
{children}
|
|
392
|
+
<TanStackDevtools
|
|
393
|
+
config={{
|
|
394
|
+
position: 'bottom-right',
|
|
395
|
+
}}
|
|
396
|
+
plugins={[
|
|
397
|
+
{
|
|
398
|
+
name: 'Tanstack Router',
|
|
399
|
+
render: <TanStackRouterDevtoolsPanel />,
|
|
400
|
+
},
|
|
401
|
+
]}
|
|
402
|
+
/>
|
|
403
|
+
</AuthProvider>
|
|
404
|
+
<Scripts />
|
|
405
|
+
</body>
|
|
406
|
+
</html>
|
|
407
|
+
)
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
```
|
|
411
|
+
|
|
412
|
+
---
|
|
413
|
+
|
|
414
|
+
## src/routes/api/auth/login.ts
|
|
415
|
+
|
|
416
|
+
```ts
|
|
417
|
+
import { createFileRoute } from '@tanstack/react-router'
|
|
418
|
+
import { json } from '@tanstack/react-start'
|
|
419
|
+
import { getAmplitudeClient } from '../../../utils/amplitude-server'
|
|
420
|
+
|
|
421
|
+
export const Route = createFileRoute('/api/auth/login')({
|
|
422
|
+
server: {
|
|
423
|
+
handlers: {
|
|
424
|
+
POST: async ({ request }) => {
|
|
425
|
+
const body = await request.json()
|
|
426
|
+
const { username, password } = body
|
|
427
|
+
|
|
428
|
+
// Simple validation (in production, you'd verify against a real database)
|
|
429
|
+
if (!username || !password) {
|
|
430
|
+
return json(
|
|
431
|
+
{ error: 'Username and password required' },
|
|
432
|
+
{ status: 400 },
|
|
433
|
+
)
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
// Check if this is a new user (simplified - in production use a database)
|
|
437
|
+
const isNewUser = !username
|
|
438
|
+
|
|
439
|
+
// Create or get user
|
|
440
|
+
const user = {
|
|
441
|
+
username,
|
|
442
|
+
burritoConsiderations: 0,
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
// Capture server-side login event
|
|
446
|
+
const amplitude = getAmplitudeClient()
|
|
447
|
+
amplitude.track('Server Login Completed', {
|
|
448
|
+
username,
|
|
449
|
+
isNewUser,
|
|
450
|
+
source: 'api',
|
|
451
|
+
}, { user_id: username })
|
|
452
|
+
|
|
453
|
+
await amplitude.flush()
|
|
454
|
+
|
|
455
|
+
return json({ success: true, user })
|
|
456
|
+
},
|
|
457
|
+
},
|
|
458
|
+
},
|
|
459
|
+
})
|
|
460
|
+
|
|
461
|
+
```
|
|
462
|
+
|
|
463
|
+
---
|
|
464
|
+
|
|
465
|
+
## src/routes/api/burrito/consider.ts
|
|
466
|
+
|
|
467
|
+
```ts
|
|
468
|
+
import { createFileRoute } from '@tanstack/react-router'
|
|
469
|
+
import { json } from '@tanstack/react-start'
|
|
470
|
+
import { getAmplitudeClient } from '../../../utils/amplitude-server'
|
|
471
|
+
|
|
472
|
+
export const Route = createFileRoute('/api/burrito/consider')({
|
|
473
|
+
server: {
|
|
474
|
+
handlers: {
|
|
475
|
+
POST: async ({ request }) => {
|
|
476
|
+
const body = await request.json()
|
|
477
|
+
const { username, totalConsiderations } = body
|
|
478
|
+
|
|
479
|
+
if (!username) {
|
|
480
|
+
return json(
|
|
481
|
+
{ error: 'Username is required' },
|
|
482
|
+
{ status: 400 },
|
|
483
|
+
)
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
const amplitude = getAmplitudeClient()
|
|
487
|
+
amplitude.track('Burrito Considered', {
|
|
488
|
+
total_considerations: totalConsiderations,
|
|
489
|
+
username,
|
|
490
|
+
source: 'api',
|
|
491
|
+
}, { user_id: username })
|
|
492
|
+
|
|
493
|
+
await amplitude.flush()
|
|
494
|
+
|
|
495
|
+
return json({ success: true })
|
|
496
|
+
},
|
|
497
|
+
},
|
|
498
|
+
},
|
|
499
|
+
})
|
|
500
|
+
|
|
501
|
+
```
|
|
502
|
+
|
|
503
|
+
---
|
|
504
|
+
|
|
505
|
+
## src/routes/burrito.tsx
|
|
506
|
+
|
|
507
|
+
```tsx
|
|
508
|
+
import { createFileRoute, useNavigate } from '@tanstack/react-router'
|
|
509
|
+
import { useState } from 'react'
|
|
510
|
+
import * as amplitude from '@amplitude/unified'
|
|
511
|
+
import { useAuth } from '../contexts/AuthContext'
|
|
512
|
+
|
|
513
|
+
export const Route = createFileRoute('/burrito')({
|
|
514
|
+
component: BurritoPage,
|
|
515
|
+
head: () => ({
|
|
516
|
+
meta: [
|
|
517
|
+
{
|
|
518
|
+
title: 'Burrito Consideration - Burrito Consideration App',
|
|
519
|
+
},
|
|
520
|
+
{
|
|
521
|
+
name: 'description',
|
|
522
|
+
content: 'Consider the potential of burritos',
|
|
523
|
+
},
|
|
524
|
+
],
|
|
525
|
+
}),
|
|
526
|
+
})
|
|
527
|
+
|
|
528
|
+
function BurritoPage() {
|
|
529
|
+
const { user, incrementBurritoConsiderations } = useAuth()
|
|
530
|
+
const navigate = useNavigate()
|
|
531
|
+
const [hasConsidered, setHasConsidered] = useState(false)
|
|
532
|
+
|
|
533
|
+
// Redirect to home if not logged in
|
|
534
|
+
if (!user) {
|
|
535
|
+
navigate({ to: '/' })
|
|
536
|
+
return null
|
|
537
|
+
}
|
|
538
|
+
|
|
539
|
+
const handleClientConsideration = () => {
|
|
540
|
+
incrementBurritoConsiderations()
|
|
541
|
+
setHasConsidered(true)
|
|
542
|
+
setTimeout(() => setHasConsidered(false), 2000)
|
|
543
|
+
|
|
544
|
+
amplitude.track('Burrito Considered', {
|
|
545
|
+
total_considerations: user.burritoConsiderations + 1,
|
|
546
|
+
username: user.username,
|
|
547
|
+
})
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
const handleServerConsideration = async () => {
|
|
551
|
+
incrementBurritoConsiderations()
|
|
552
|
+
setHasConsidered(true)
|
|
553
|
+
setTimeout(() => setHasConsidered(false), 2000)
|
|
554
|
+
|
|
555
|
+
await fetch('/api/burrito/consider', {
|
|
556
|
+
method: 'POST',
|
|
557
|
+
headers: {
|
|
558
|
+
'Content-Type': 'application/json',
|
|
559
|
+
},
|
|
560
|
+
body: JSON.stringify({
|
|
561
|
+
username: user.username,
|
|
562
|
+
totalConsiderations: user.burritoConsiderations + 1,
|
|
563
|
+
}),
|
|
564
|
+
})
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
return (
|
|
568
|
+
<main>
|
|
569
|
+
<div className="container">
|
|
570
|
+
<h1>Burrito consideration zone</h1>
|
|
571
|
+
<p>Take a moment to truly consider the potential of burritos.</p>
|
|
572
|
+
|
|
573
|
+
<div style={{ display: 'flex', flexDirection: 'column', alignItems: 'center', gap: '0.125rem' }}>
|
|
574
|
+
<button
|
|
575
|
+
onClick={handleClientConsideration}
|
|
576
|
+
className="btn-burrito"
|
|
577
|
+
style={{ backgroundColor: '#e07c24', color: '#fff' }}
|
|
578
|
+
>
|
|
579
|
+
Consider burrito (client)
|
|
580
|
+
</button>
|
|
581
|
+
<button
|
|
582
|
+
onClick={handleServerConsideration}
|
|
583
|
+
className="btn-burrito"
|
|
584
|
+
style={{ backgroundColor: '#4a90d9', color: '#fff' }}
|
|
585
|
+
>
|
|
586
|
+
Consider burrito (server)
|
|
587
|
+
</button>
|
|
588
|
+
|
|
589
|
+
{hasConsidered && (
|
|
590
|
+
<p className="success">
|
|
591
|
+
Thank you for your consideration! Count:{' '}
|
|
592
|
+
{user.burritoConsiderations}
|
|
593
|
+
</p>
|
|
594
|
+
)}
|
|
595
|
+
</div>
|
|
596
|
+
|
|
597
|
+
<div className="stats">
|
|
598
|
+
<h3>Consideration stats</h3>
|
|
599
|
+
<p>Total considerations: {user.burritoConsiderations}</p>
|
|
600
|
+
</div>
|
|
601
|
+
</div>
|
|
602
|
+
</main>
|
|
603
|
+
)
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
---
|
|
609
|
+
|
|
610
|
+
## src/routes/index.tsx
|
|
611
|
+
|
|
612
|
+
```tsx
|
|
613
|
+
import { createFileRoute } from '@tanstack/react-router'
|
|
614
|
+
import { useState } from 'react'
|
|
615
|
+
import { useAuth } from '../contexts/AuthContext'
|
|
616
|
+
|
|
617
|
+
export const Route = createFileRoute('/')({
|
|
618
|
+
component: Home,
|
|
619
|
+
head: () => ({
|
|
620
|
+
meta: [
|
|
621
|
+
{
|
|
622
|
+
title: 'Burrito Consideration App',
|
|
623
|
+
},
|
|
624
|
+
{
|
|
625
|
+
name: 'description',
|
|
626
|
+
content: 'Consider the potential of burritos',
|
|
627
|
+
},
|
|
628
|
+
],
|
|
629
|
+
}),
|
|
630
|
+
})
|
|
631
|
+
|
|
632
|
+
function Home() {
|
|
633
|
+
const { user, login } = useAuth()
|
|
634
|
+
const [username, setUsername] = useState('')
|
|
635
|
+
const [password, setPassword] = useState('')
|
|
636
|
+
const [error, setError] = useState('')
|
|
637
|
+
|
|
638
|
+
const handleSubmit = async (e: React.FormEvent) => {
|
|
639
|
+
e.preventDefault()
|
|
640
|
+
setError('')
|
|
641
|
+
|
|
642
|
+
try {
|
|
643
|
+
const success = await login(username, password)
|
|
644
|
+
if (success) {
|
|
645
|
+
setUsername('')
|
|
646
|
+
setPassword('')
|
|
647
|
+
} else {
|
|
648
|
+
setError('Please provide both username and password')
|
|
649
|
+
}
|
|
650
|
+
} catch (err) {
|
|
651
|
+
console.error('Login failed:', err)
|
|
652
|
+
setError('An error occurred during login')
|
|
653
|
+
}
|
|
654
|
+
}
|
|
655
|
+
|
|
656
|
+
return (
|
|
657
|
+
<main>
|
|
658
|
+
{user ? (
|
|
659
|
+
<div className="container">
|
|
660
|
+
<h1>Welcome back, {user.username}!</h1>
|
|
661
|
+
<p>You are now logged in. Feel free to explore:</p>
|
|
662
|
+
<ul>
|
|
663
|
+
<li>Consider the potential of burritos</li>
|
|
664
|
+
<li>View your profile and statistics</li>
|
|
665
|
+
</ul>
|
|
666
|
+
</div>
|
|
667
|
+
) : (
|
|
668
|
+
<div className="container">
|
|
669
|
+
<h1>Welcome to Burrito Consideration App</h1>
|
|
670
|
+
<p>Please sign in to begin your burrito journey</p>
|
|
671
|
+
|
|
672
|
+
<form onSubmit={handleSubmit} className="form">
|
|
673
|
+
<div className="form-group">
|
|
674
|
+
<label htmlFor="username">Username:</label>
|
|
675
|
+
<input
|
|
676
|
+
type="text"
|
|
677
|
+
id="username"
|
|
678
|
+
value={username}
|
|
679
|
+
onChange={(e) => setUsername(e.target.value)}
|
|
680
|
+
placeholder="Enter any username"
|
|
681
|
+
/>
|
|
682
|
+
</div>
|
|
683
|
+
|
|
684
|
+
<div className="form-group">
|
|
685
|
+
<label htmlFor="password">Password:</label>
|
|
686
|
+
<input
|
|
687
|
+
type="password"
|
|
688
|
+
id="password"
|
|
689
|
+
value={password}
|
|
690
|
+
onChange={(e) => setPassword(e.target.value)}
|
|
691
|
+
placeholder="Enter any password"
|
|
692
|
+
/>
|
|
693
|
+
</div>
|
|
694
|
+
|
|
695
|
+
{error && <p className="error">{error}</p>}
|
|
696
|
+
|
|
697
|
+
<button type="submit" className="btn-primary">
|
|
698
|
+
Sign In
|
|
699
|
+
</button>
|
|
700
|
+
</form>
|
|
701
|
+
|
|
702
|
+
<p className="note">
|
|
703
|
+
Note: This is a demo app. Use any username and password to sign in.
|
|
704
|
+
</p>
|
|
705
|
+
</div>
|
|
706
|
+
)}
|
|
707
|
+
</main>
|
|
708
|
+
)
|
|
709
|
+
}
|
|
710
|
+
|
|
711
|
+
```
|
|
712
|
+
|
|
713
|
+
---
|
|
714
|
+
|
|
715
|
+
## src/routes/profile.tsx
|
|
716
|
+
|
|
717
|
+
```tsx
|
|
718
|
+
import { createFileRoute, useNavigate } from '@tanstack/react-router'
|
|
719
|
+
import { useAuth } from '../contexts/AuthContext'
|
|
720
|
+
|
|
721
|
+
export const Route = createFileRoute('/profile')({
|
|
722
|
+
component: ProfilePage,
|
|
723
|
+
head: () => ({
|
|
724
|
+
meta: [
|
|
725
|
+
{
|
|
726
|
+
title: 'Profile - Burrito Consideration App',
|
|
727
|
+
},
|
|
728
|
+
{
|
|
729
|
+
name: 'description',
|
|
730
|
+
content: 'Your burrito consideration profile',
|
|
731
|
+
},
|
|
732
|
+
],
|
|
733
|
+
}),
|
|
734
|
+
})
|
|
735
|
+
|
|
736
|
+
function ProfilePage() {
|
|
737
|
+
const { user } = useAuth()
|
|
738
|
+
const navigate = useNavigate()
|
|
739
|
+
|
|
740
|
+
// Redirect to home if not logged in
|
|
741
|
+
if (!user) {
|
|
742
|
+
navigate({ to: '/' })
|
|
743
|
+
return null
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
return (
|
|
747
|
+
<main>
|
|
748
|
+
<div className="container">
|
|
749
|
+
<h1>User Profile</h1>
|
|
750
|
+
|
|
751
|
+
<div className="stats">
|
|
752
|
+
<h2>Your Information</h2>
|
|
753
|
+
<p>
|
|
754
|
+
<strong>Username:</strong> {user.username}
|
|
755
|
+
</p>
|
|
756
|
+
<p>
|
|
757
|
+
<strong>Burrito Considerations:</strong>{' '}
|
|
758
|
+
{user.burritoConsiderations}
|
|
759
|
+
</p>
|
|
760
|
+
</div>
|
|
761
|
+
|
|
762
|
+
<div style={{ marginTop: '2rem' }}>
|
|
763
|
+
<h3>Your Burrito Journey</h3>
|
|
764
|
+
{user.burritoConsiderations === 0 ? (
|
|
765
|
+
<p>
|
|
766
|
+
You haven't considered any burritos yet. Visit the Burrito
|
|
767
|
+
Consideration page to start!
|
|
768
|
+
</p>
|
|
769
|
+
) : user.burritoConsiderations === 1 ? (
|
|
770
|
+
<p>You've considered the burrito potential once. Keep going!</p>
|
|
771
|
+
) : user.burritoConsiderations < 5 ? (
|
|
772
|
+
<p>You're getting the hang of burrito consideration!</p>
|
|
773
|
+
) : user.burritoConsiderations < 10 ? (
|
|
774
|
+
<p>You're becoming a burrito consideration expert!</p>
|
|
775
|
+
) : (
|
|
776
|
+
<p>You are a true burrito consideration master!</p>
|
|
777
|
+
)}
|
|
778
|
+
</div>
|
|
779
|
+
</div>
|
|
780
|
+
</main>
|
|
781
|
+
)
|
|
782
|
+
}
|
|
783
|
+
|
|
784
|
+
```
|
|
785
|
+
|
|
786
|
+
---
|
|
787
|
+
|
|
788
|
+
## src/routeTree.gen.ts
|
|
789
|
+
|
|
790
|
+
```ts
|
|
791
|
+
/* eslint-disable */
|
|
792
|
+
|
|
793
|
+
// @ts-nocheck
|
|
794
|
+
|
|
795
|
+
// noinspection JSUnusedGlobalSymbols
|
|
796
|
+
|
|
797
|
+
// This file was automatically generated by TanStack Router.
|
|
798
|
+
// You should NOT make any changes in this file as it will be overwritten.
|
|
799
|
+
// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
|
|
800
|
+
|
|
801
|
+
import { Route as rootRouteImport } from './routes/__root'
|
|
802
|
+
import { Route as ProfileRouteImport } from './routes/profile'
|
|
803
|
+
import { Route as BurritoRouteImport } from './routes/burrito'
|
|
804
|
+
import { Route as IndexRouteImport } from './routes/index'
|
|
805
|
+
import { Route as ApiBurritoConsiderRouteImport } from './routes/api/burrito/consider'
|
|
806
|
+
import { Route as ApiAuthLoginRouteImport } from './routes/api/auth/login'
|
|
807
|
+
|
|
808
|
+
const ProfileRoute = ProfileRouteImport.update({
|
|
809
|
+
id: '/profile',
|
|
810
|
+
path: '/profile',
|
|
811
|
+
getParentRoute: () => rootRouteImport,
|
|
812
|
+
} as any)
|
|
813
|
+
const BurritoRoute = BurritoRouteImport.update({
|
|
814
|
+
id: '/burrito',
|
|
815
|
+
path: '/burrito',
|
|
816
|
+
getParentRoute: () => rootRouteImport,
|
|
817
|
+
} as any)
|
|
818
|
+
const IndexRoute = IndexRouteImport.update({
|
|
819
|
+
id: '/',
|
|
820
|
+
path: '/',
|
|
821
|
+
getParentRoute: () => rootRouteImport,
|
|
822
|
+
} as any)
|
|
823
|
+
const ApiBurritoConsiderRoute = ApiBurritoConsiderRouteImport.update({
|
|
824
|
+
id: '/api/burrito/consider',
|
|
825
|
+
path: '/api/burrito/consider',
|
|
826
|
+
getParentRoute: () => rootRouteImport,
|
|
827
|
+
} as any)
|
|
828
|
+
const ApiAuthLoginRoute = ApiAuthLoginRouteImport.update({
|
|
829
|
+
id: '/api/auth/login',
|
|
830
|
+
path: '/api/auth/login',
|
|
831
|
+
getParentRoute: () => rootRouteImport,
|
|
832
|
+
} as any)
|
|
833
|
+
|
|
834
|
+
export interface FileRoutesByFullPath {
|
|
835
|
+
'/': typeof IndexRoute
|
|
836
|
+
'/burrito': typeof BurritoRoute
|
|
837
|
+
'/profile': typeof ProfileRoute
|
|
838
|
+
'/api/auth/login': typeof ApiAuthLoginRoute
|
|
839
|
+
'/api/burrito/consider': typeof ApiBurritoConsiderRoute
|
|
840
|
+
}
|
|
841
|
+
export interface FileRoutesByTo {
|
|
842
|
+
'/': typeof IndexRoute
|
|
843
|
+
'/burrito': typeof BurritoRoute
|
|
844
|
+
'/profile': typeof ProfileRoute
|
|
845
|
+
'/api/auth/login': typeof ApiAuthLoginRoute
|
|
846
|
+
'/api/burrito/consider': typeof ApiBurritoConsiderRoute
|
|
847
|
+
}
|
|
848
|
+
export interface FileRoutesById {
|
|
849
|
+
__root__: typeof rootRouteImport
|
|
850
|
+
'/': typeof IndexRoute
|
|
851
|
+
'/burrito': typeof BurritoRoute
|
|
852
|
+
'/profile': typeof ProfileRoute
|
|
853
|
+
'/api/auth/login': typeof ApiAuthLoginRoute
|
|
854
|
+
'/api/burrito/consider': typeof ApiBurritoConsiderRoute
|
|
855
|
+
}
|
|
856
|
+
export interface FileRouteTypes {
|
|
857
|
+
fileRoutesByFullPath: FileRoutesByFullPath
|
|
858
|
+
fullPaths:
|
|
859
|
+
| '/'
|
|
860
|
+
| '/burrito'
|
|
861
|
+
| '/profile'
|
|
862
|
+
| '/api/auth/login'
|
|
863
|
+
| '/api/burrito/consider'
|
|
864
|
+
fileRoutesByTo: FileRoutesByTo
|
|
865
|
+
to:
|
|
866
|
+
| '/'
|
|
867
|
+
| '/burrito'
|
|
868
|
+
| '/profile'
|
|
869
|
+
| '/api/auth/login'
|
|
870
|
+
| '/api/burrito/consider'
|
|
871
|
+
id:
|
|
872
|
+
| '__root__'
|
|
873
|
+
| '/'
|
|
874
|
+
| '/burrito'
|
|
875
|
+
| '/profile'
|
|
876
|
+
| '/api/auth/login'
|
|
877
|
+
| '/api/burrito/consider'
|
|
878
|
+
fileRoutesById: FileRoutesById
|
|
879
|
+
}
|
|
880
|
+
export interface RootRouteChildren {
|
|
881
|
+
IndexRoute: typeof IndexRoute
|
|
882
|
+
BurritoRoute: typeof BurritoRoute
|
|
883
|
+
ProfileRoute: typeof ProfileRoute
|
|
884
|
+
ApiAuthLoginRoute: typeof ApiAuthLoginRoute
|
|
885
|
+
ApiBurritoConsiderRoute: typeof ApiBurritoConsiderRoute
|
|
886
|
+
}
|
|
887
|
+
|
|
888
|
+
declare module '@tanstack/react-router' {
|
|
889
|
+
interface FileRoutesByPath {
|
|
890
|
+
'/profile': {
|
|
891
|
+
id: '/profile'
|
|
892
|
+
path: '/profile'
|
|
893
|
+
fullPath: '/profile'
|
|
894
|
+
preLoaderRoute: typeof ProfileRouteImport
|
|
895
|
+
parentRoute: typeof rootRouteImport
|
|
896
|
+
}
|
|
897
|
+
'/burrito': {
|
|
898
|
+
id: '/burrito'
|
|
899
|
+
path: '/burrito'
|
|
900
|
+
fullPath: '/burrito'
|
|
901
|
+
preLoaderRoute: typeof BurritoRouteImport
|
|
902
|
+
parentRoute: typeof rootRouteImport
|
|
903
|
+
}
|
|
904
|
+
'/': {
|
|
905
|
+
id: '/'
|
|
906
|
+
path: '/'
|
|
907
|
+
fullPath: '/'
|
|
908
|
+
preLoaderRoute: typeof IndexRouteImport
|
|
909
|
+
parentRoute: typeof rootRouteImport
|
|
910
|
+
}
|
|
911
|
+
'/api/burrito/consider': {
|
|
912
|
+
id: '/api/burrito/consider'
|
|
913
|
+
path: '/api/burrito/consider'
|
|
914
|
+
fullPath: '/api/burrito/consider'
|
|
915
|
+
preLoaderRoute: typeof ApiBurritoConsiderRouteImport
|
|
916
|
+
parentRoute: typeof rootRouteImport
|
|
917
|
+
}
|
|
918
|
+
'/api/auth/login': {
|
|
919
|
+
id: '/api/auth/login'
|
|
920
|
+
path: '/api/auth/login'
|
|
921
|
+
fullPath: '/api/auth/login'
|
|
922
|
+
preLoaderRoute: typeof ApiAuthLoginRouteImport
|
|
923
|
+
parentRoute: typeof rootRouteImport
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
}
|
|
927
|
+
|
|
928
|
+
const rootRouteChildren: RootRouteChildren = {
|
|
929
|
+
IndexRoute: IndexRoute,
|
|
930
|
+
BurritoRoute: BurritoRoute,
|
|
931
|
+
ProfileRoute: ProfileRoute,
|
|
932
|
+
ApiAuthLoginRoute: ApiAuthLoginRoute,
|
|
933
|
+
ApiBurritoConsiderRoute: ApiBurritoConsiderRoute,
|
|
934
|
+
}
|
|
935
|
+
export const routeTree = rootRouteImport
|
|
936
|
+
._addFileChildren(rootRouteChildren)
|
|
937
|
+
._addFileTypes<FileRouteTypes>()
|
|
938
|
+
|
|
939
|
+
import type { getRouter } from './router.tsx'
|
|
940
|
+
import type { createStart } from '@tanstack/react-start'
|
|
941
|
+
declare module '@tanstack/react-start' {
|
|
942
|
+
interface Register {
|
|
943
|
+
ssr: true
|
|
944
|
+
router: Awaited<ReturnType<typeof getRouter>>
|
|
945
|
+
}
|
|
946
|
+
}
|
|
947
|
+
|
|
948
|
+
```
|
|
949
|
+
|
|
950
|
+
---
|
|
951
|
+
|
|
952
|
+
## src/utils/amplitude-server.ts
|
|
953
|
+
|
|
954
|
+
```ts
|
|
955
|
+
import { createInstance } from '@amplitude/analytics-node'
|
|
956
|
+
|
|
957
|
+
type AmplitudeNodeClient = ReturnType<typeof createInstance>
|
|
958
|
+
|
|
959
|
+
let amplitudeClient: AmplitudeNodeClient | null = null
|
|
960
|
+
|
|
961
|
+
export function getAmplitudeClient(): AmplitudeNodeClient {
|
|
962
|
+
if (!amplitudeClient) {
|
|
963
|
+
const apiKey = process.env.VITE_PUBLIC_AMPLITUDE_API_KEY || import.meta.env.VITE_PUBLIC_AMPLITUDE_API_KEY!
|
|
964
|
+
amplitudeClient = createInstance()
|
|
965
|
+
amplitudeClient.init(apiKey)
|
|
966
|
+
}
|
|
967
|
+
return amplitudeClient
|
|
968
|
+
}
|
|
969
|
+
|
|
970
|
+
```
|
|
971
|
+
|
|
972
|
+
---
|
|
973
|
+
|
|
974
|
+
## vite.config.ts
|
|
975
|
+
|
|
976
|
+
```ts
|
|
977
|
+
import { defineConfig } from 'vite'
|
|
978
|
+
import { tanstackStart } from '@tanstack/react-start/plugin/vite'
|
|
979
|
+
import viteReact from '@vitejs/plugin-react'
|
|
980
|
+
import viteTsConfigPaths from 'vite-tsconfig-paths'
|
|
981
|
+
|
|
982
|
+
const config = defineConfig({
|
|
983
|
+
plugins: [
|
|
984
|
+
// this is the plugin that enables path aliases
|
|
985
|
+
viteTsConfigPaths({
|
|
986
|
+
projects: ['./tsconfig.json'],
|
|
987
|
+
}),
|
|
988
|
+
tanstackStart(),
|
|
989
|
+
viteReact(),
|
|
990
|
+
],
|
|
991
|
+
})
|
|
992
|
+
|
|
993
|
+
export default config
|
|
994
|
+
|
|
995
|
+
```
|
|
996
|
+
|
|
997
|
+
---
|
|
998
|
+
|