@amplitude/wizard 1.0.0-beta.2 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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,777 @@
|
|
|
1
|
+
# Amplitude React with TanStack Router (file-based) Example Project
|
|
2
|
+
|
|
3
|
+
Repository: https://github.com/amplitude/context-hub
|
|
4
|
+
Path: basics/react-tanstack-router-file-based
|
|
5
|
+
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## README.md
|
|
9
|
+
|
|
10
|
+
# Amplitude TanStack Router Example (File-Based Routing)
|
|
11
|
+
|
|
12
|
+
This is a React and [TanStack Router](https://tanstack.com/router) example demonstrating Amplitude integration with product analytics and event tracking. This example uses **file-based routing** where routes are auto-generated from the file system.
|
|
13
|
+
|
|
14
|
+
### Amplitude SDKs
|
|
15
|
+
|
|
16
|
+
The client uses 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` once in `main.tsx`. [Initialize the Unified SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#initialize-the-unified-sdk) documents that call as initializing every product bundled with Unified npm; see [configuration](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#configuration). 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 the [CDN unified script](https://amplitude.com/docs/sdks/analytics/browser/browser-unified-sdk#unified-script-cdn), not Unified **npm**.
|
|
17
|
+
|
|
18
|
+
When you add a backend or API, send events with [`@amplitude/analytics-node`](https://www.npmjs.com/package/@amplitude/analytics-node).
|
|
19
|
+
|
|
20
|
+
## Features
|
|
21
|
+
|
|
22
|
+
- **Product Analytics**: Track user events and behaviors
|
|
23
|
+
- **User Authentication**: Demo login system with Amplitude user identification
|
|
24
|
+
- **Client-side Tracking**: Examples of client-side tracking methods
|
|
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 (main.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 (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
|
+
### Event tracking (routes/burrito.tsx)
|
|
78
|
+
|
|
79
|
+
```typescript
|
|
80
|
+
amplitude.track('Burrito Considered', {
|
|
81
|
+
total_considerations: user.burritoConsiderations + 1,
|
|
82
|
+
username: user.username,
|
|
83
|
+
});
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Learn More
|
|
87
|
+
|
|
88
|
+
- [Amplitude Documentation](https://amplitude.com/docs)
|
|
89
|
+
- [TanStack Router Documentation](https://tanstack.com/router/latest)
|
|
90
|
+
- [Amplitude Browser SDK](https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2)
|
|
91
|
+
|
|
92
|
+
---
|
|
93
|
+
|
|
94
|
+
## .env.example
|
|
95
|
+
|
|
96
|
+
```example
|
|
97
|
+
VITE_PUBLIC_AMPLITUDE_API_KEY=
|
|
98
|
+
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## .prettierignore
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
package-lock.json
|
|
107
|
+
pnpm-lock.yaml
|
|
108
|
+
yarn.lock
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## index.html
|
|
114
|
+
|
|
115
|
+
```html
|
|
116
|
+
<!DOCTYPE html>
|
|
117
|
+
<html lang="en">
|
|
118
|
+
<head>
|
|
119
|
+
<meta charset="UTF-8" />
|
|
120
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
121
|
+
<link rel="icon" href="/favicon.ico" />
|
|
122
|
+
<meta name="theme-color" content="#000000" />
|
|
123
|
+
<meta
|
|
124
|
+
name="description"
|
|
125
|
+
content="Web site created using create-tsrouter-app"
|
|
126
|
+
/>
|
|
127
|
+
<link rel="apple-touch-icon" href="/logo192.png" />
|
|
128
|
+
<link rel="manifest" href="/manifest.json" />
|
|
129
|
+
<title>Create TanStack App - react-tanstack</title>
|
|
130
|
+
</head>
|
|
131
|
+
<body>
|
|
132
|
+
<div id="app"></div>
|
|
133
|
+
<script type="module" src="/src/main.tsx"></script>
|
|
134
|
+
</body>
|
|
135
|
+
</html>
|
|
136
|
+
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## prettier.config.js
|
|
142
|
+
|
|
143
|
+
```js
|
|
144
|
+
// @ts-check
|
|
145
|
+
|
|
146
|
+
/** @type {import('prettier').Config} */
|
|
147
|
+
const config = {
|
|
148
|
+
semi: false,
|
|
149
|
+
singleQuote: true,
|
|
150
|
+
trailingComma: "all",
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
export default config;
|
|
154
|
+
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## public/robots.txt
|
|
160
|
+
|
|
161
|
+
```txt
|
|
162
|
+
# https://www.robotstxt.org/robotstxt.html
|
|
163
|
+
User-agent: *
|
|
164
|
+
Disallow:
|
|
165
|
+
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
---
|
|
169
|
+
|
|
170
|
+
## src/components/Header.tsx
|
|
171
|
+
|
|
172
|
+
```tsx
|
|
173
|
+
import { Link } from '@tanstack/react-router'
|
|
174
|
+
import { useAuth } from '../contexts/AuthContext'
|
|
175
|
+
|
|
176
|
+
export default function Header() {
|
|
177
|
+
const { user, logout } = useAuth()
|
|
178
|
+
|
|
179
|
+
return (
|
|
180
|
+
<header className="header">
|
|
181
|
+
<div className="header-container">
|
|
182
|
+
<nav>
|
|
183
|
+
<Link to="/">Home</Link>
|
|
184
|
+
{user && (
|
|
185
|
+
<>
|
|
186
|
+
<Link to="/burrito">Burrito Consideration</Link>
|
|
187
|
+
<Link to="/profile">Profile</Link>
|
|
188
|
+
</>
|
|
189
|
+
)}
|
|
190
|
+
</nav>
|
|
191
|
+
<div className="user-section">
|
|
192
|
+
{user ? (
|
|
193
|
+
<>
|
|
194
|
+
<span>Welcome, {user.username}!</span>
|
|
195
|
+
<button onClick={logout} className="btn-logout">
|
|
196
|
+
Logout
|
|
197
|
+
</button>
|
|
198
|
+
</>
|
|
199
|
+
) : (
|
|
200
|
+
<span>Not logged in</span>
|
|
201
|
+
)}
|
|
202
|
+
</div>
|
|
203
|
+
</div>
|
|
204
|
+
</header>
|
|
205
|
+
)
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
---
|
|
211
|
+
|
|
212
|
+
## src/contexts/AuthContext.tsx
|
|
213
|
+
|
|
214
|
+
```tsx
|
|
215
|
+
import * as amplitude from '@amplitude/unified';
|
|
216
|
+
import { Identify } from '@amplitude/unified';
|
|
217
|
+
import { createContext, useContext, useState } from 'react';
|
|
218
|
+
import type { ReactNode } from 'react';
|
|
219
|
+
|
|
220
|
+
interface User {
|
|
221
|
+
username: string;
|
|
222
|
+
burritoConsiderations: number;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
interface AuthContextType {
|
|
226
|
+
user: User | null;
|
|
227
|
+
login: (username: string, password: string) => Promise<boolean>;
|
|
228
|
+
logout: () => void;
|
|
229
|
+
incrementBurritoConsiderations: () => void;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
const AuthContext = createContext<AuthContextType | undefined>(undefined);
|
|
233
|
+
|
|
234
|
+
const users: Map<string, User> = new Map();
|
|
235
|
+
|
|
236
|
+
export function AuthProvider({ children }: { children: ReactNode }) {
|
|
237
|
+
// Use lazy initializer to read from localStorage only once on mount
|
|
238
|
+
const [user, setUser] = useState<User | null>(() => {
|
|
239
|
+
if (typeof window === 'undefined') return null;
|
|
240
|
+
|
|
241
|
+
const storedUsername = localStorage.getItem('currentUser');
|
|
242
|
+
if (storedUsername) {
|
|
243
|
+
const existingUser = users.get(storedUsername);
|
|
244
|
+
if (existingUser) {
|
|
245
|
+
return existingUser;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
return null;
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
const login = (username: string, password: string): Promise<boolean> => {
|
|
252
|
+
if (!username || !password) {
|
|
253
|
+
return Promise.resolve(false);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
// Get or create user in local map
|
|
257
|
+
let localUser = users.get(username);
|
|
258
|
+
const isNewUser = !localUser;
|
|
259
|
+
|
|
260
|
+
if (!localUser) {
|
|
261
|
+
localUser = { username, burritoConsiderations: 0 };
|
|
262
|
+
users.set(username, localUser);
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
setUser(localUser);
|
|
266
|
+
localStorage.setItem('currentUser', username);
|
|
267
|
+
|
|
268
|
+
// Identify user in Amplitude using username as user ID
|
|
269
|
+
amplitude.setUserId(username);
|
|
270
|
+
const identifyObj = new Identify();
|
|
271
|
+
identifyObj.set('username', username);
|
|
272
|
+
amplitude.identify(identifyObj);
|
|
273
|
+
|
|
274
|
+
// Capture login event
|
|
275
|
+
amplitude.track('User Logged In', {
|
|
276
|
+
username,
|
|
277
|
+
isNewUser,
|
|
278
|
+
});
|
|
279
|
+
|
|
280
|
+
return Promise.resolve(true);
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
const logout = () => {
|
|
284
|
+
// Capture logout event before resetting
|
|
285
|
+
amplitude.track('User Logged Out');
|
|
286
|
+
amplitude.reset();
|
|
287
|
+
|
|
288
|
+
setUser(null);
|
|
289
|
+
localStorage.removeItem('currentUser');
|
|
290
|
+
};
|
|
291
|
+
|
|
292
|
+
const incrementBurritoConsiderations = () => {
|
|
293
|
+
if (user) {
|
|
294
|
+
user.burritoConsiderations++;
|
|
295
|
+
users.set(user.username, user);
|
|
296
|
+
setUser({ ...user });
|
|
297
|
+
}
|
|
298
|
+
};
|
|
299
|
+
|
|
300
|
+
return (
|
|
301
|
+
<AuthContext.Provider value={{ user, login, logout, incrementBurritoConsiderations }}>
|
|
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/main.tsx
|
|
320
|
+
|
|
321
|
+
```tsx
|
|
322
|
+
import { StrictMode } from 'react'
|
|
323
|
+
import ReactDOM from 'react-dom/client'
|
|
324
|
+
import { RouterProvider, createRouter } from '@tanstack/react-router'
|
|
325
|
+
import * as amplitude from '@amplitude/unified'
|
|
326
|
+
|
|
327
|
+
// Import the generated route tree
|
|
328
|
+
import { routeTree } from './routeTree.gen.ts'
|
|
329
|
+
|
|
330
|
+
import './styles.css'
|
|
331
|
+
import reportWebVitals from './reportWebVitals.ts'
|
|
332
|
+
|
|
333
|
+
// Initialize Amplitude
|
|
334
|
+
void amplitude.initAll(import.meta.env.VITE_PUBLIC_AMPLITUDE_API_KEY)
|
|
335
|
+
|
|
336
|
+
// Create a new router instance
|
|
337
|
+
const router = createRouter({
|
|
338
|
+
routeTree,
|
|
339
|
+
context: {},
|
|
340
|
+
defaultPreload: 'intent',
|
|
341
|
+
scrollRestoration: true,
|
|
342
|
+
defaultStructuralSharing: true,
|
|
343
|
+
defaultPreloadStaleTime: 0,
|
|
344
|
+
})
|
|
345
|
+
|
|
346
|
+
// Register the router instance for type safety
|
|
347
|
+
declare module '@tanstack/react-router' {
|
|
348
|
+
interface Register {
|
|
349
|
+
router: typeof router
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
// Render the app
|
|
354
|
+
const rootElement = document.getElementById('app')
|
|
355
|
+
if (rootElement && !rootElement.innerHTML) {
|
|
356
|
+
const root = ReactDOM.createRoot(rootElement)
|
|
357
|
+
root.render(
|
|
358
|
+
<StrictMode>
|
|
359
|
+
<RouterProvider router={router} />
|
|
360
|
+
</StrictMode>,
|
|
361
|
+
)
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
// If you want to start measuring performance in your app, pass a function
|
|
365
|
+
// to log results (for example: reportWebVitals(console.log))
|
|
366
|
+
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
|
|
367
|
+
reportWebVitals()
|
|
368
|
+
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
## src/reportWebVitals.ts
|
|
374
|
+
|
|
375
|
+
```ts
|
|
376
|
+
const reportWebVitals = (onPerfEntry?: () => void) => {
|
|
377
|
+
if (onPerfEntry && onPerfEntry instanceof Function) {
|
|
378
|
+
import('web-vitals').then(({ onCLS, onINP, onFCP, onLCP, onTTFB }) => {
|
|
379
|
+
onCLS(onPerfEntry)
|
|
380
|
+
onINP(onPerfEntry)
|
|
381
|
+
onFCP(onPerfEntry)
|
|
382
|
+
onLCP(onPerfEntry)
|
|
383
|
+
onTTFB(onPerfEntry)
|
|
384
|
+
})
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
export default reportWebVitals
|
|
389
|
+
|
|
390
|
+
```
|
|
391
|
+
|
|
392
|
+
---
|
|
393
|
+
|
|
394
|
+
## src/routes/__root.tsx
|
|
395
|
+
|
|
396
|
+
```tsx
|
|
397
|
+
import { Outlet, createRootRoute } from '@tanstack/react-router'
|
|
398
|
+
import { TanStackRouterDevtoolsPanel } from '@tanstack/react-router-devtools'
|
|
399
|
+
import { TanStackDevtools } from '@tanstack/react-devtools'
|
|
400
|
+
|
|
401
|
+
import Header from '../components/Header'
|
|
402
|
+
import { AuthProvider } from '../contexts/AuthContext'
|
|
403
|
+
|
|
404
|
+
export const Route = createRootRoute({
|
|
405
|
+
component: () => (
|
|
406
|
+
<AuthProvider>
|
|
407
|
+
<Header />
|
|
408
|
+
<main>
|
|
409
|
+
<Outlet />
|
|
410
|
+
</main>
|
|
411
|
+
<TanStackDevtools
|
|
412
|
+
config={{
|
|
413
|
+
position: 'bottom-right',
|
|
414
|
+
}}
|
|
415
|
+
plugins={[
|
|
416
|
+
{
|
|
417
|
+
name: 'Tanstack Router',
|
|
418
|
+
render: <TanStackRouterDevtoolsPanel />,
|
|
419
|
+
},
|
|
420
|
+
]}
|
|
421
|
+
/>
|
|
422
|
+
</AuthProvider>
|
|
423
|
+
),
|
|
424
|
+
})
|
|
425
|
+
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
---
|
|
429
|
+
|
|
430
|
+
## src/routes/burrito.tsx
|
|
431
|
+
|
|
432
|
+
```tsx
|
|
433
|
+
import { useState } from 'react'
|
|
434
|
+
import { createFileRoute, useNavigate } from '@tanstack/react-router'
|
|
435
|
+
import * as amplitude from '@amplitude/unified'
|
|
436
|
+
import { useAuth } from '../contexts/AuthContext'
|
|
437
|
+
|
|
438
|
+
export const Route = createFileRoute('/burrito')({
|
|
439
|
+
component: BurritoPage,
|
|
440
|
+
})
|
|
441
|
+
|
|
442
|
+
function BurritoPage() {
|
|
443
|
+
const { user, incrementBurritoConsiderations } = useAuth()
|
|
444
|
+
const navigate = useNavigate()
|
|
445
|
+
const [hasConsidered, setHasConsidered] = useState(false)
|
|
446
|
+
|
|
447
|
+
// Redirect to home if not logged in
|
|
448
|
+
if (!user) {
|
|
449
|
+
navigate({ to: '/' })
|
|
450
|
+
return null
|
|
451
|
+
}
|
|
452
|
+
|
|
453
|
+
const handleConsideration = () => {
|
|
454
|
+
incrementBurritoConsiderations()
|
|
455
|
+
setHasConsidered(true)
|
|
456
|
+
setTimeout(() => setHasConsidered(false), 2000)
|
|
457
|
+
|
|
458
|
+
// Capture burrito consideration event
|
|
459
|
+
amplitude.track('Burrito Considered', {
|
|
460
|
+
total_considerations: user.burritoConsiderations + 1,
|
|
461
|
+
username: user.username,
|
|
462
|
+
})
|
|
463
|
+
}
|
|
464
|
+
|
|
465
|
+
return (
|
|
466
|
+
<div className="container">
|
|
467
|
+
<h1>Burrito consideration zone</h1>
|
|
468
|
+
<p>Take a moment to truly consider the potential of burritos.</p>
|
|
469
|
+
|
|
470
|
+
<div style={{ textAlign: 'center' }}>
|
|
471
|
+
<button onClick={handleConsideration} className="btn-burrito">
|
|
472
|
+
I have considered the burrito potential
|
|
473
|
+
</button>
|
|
474
|
+
|
|
475
|
+
{hasConsidered && (
|
|
476
|
+
<p className="success">
|
|
477
|
+
Thank you for your consideration! Count: {user.burritoConsiderations}
|
|
478
|
+
</p>
|
|
479
|
+
)}
|
|
480
|
+
</div>
|
|
481
|
+
|
|
482
|
+
<div className="stats">
|
|
483
|
+
<h3>Consideration stats</h3>
|
|
484
|
+
<p>Total considerations: {user.burritoConsiderations}</p>
|
|
485
|
+
</div>
|
|
486
|
+
</div>
|
|
487
|
+
)
|
|
488
|
+
}
|
|
489
|
+
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
---
|
|
493
|
+
|
|
494
|
+
## src/routes/index.tsx
|
|
495
|
+
|
|
496
|
+
```tsx
|
|
497
|
+
import { useState } from 'react'
|
|
498
|
+
import { createFileRoute } from '@tanstack/react-router'
|
|
499
|
+
import { useAuth } from '../contexts/AuthContext'
|
|
500
|
+
|
|
501
|
+
export const Route = createFileRoute('/')({
|
|
502
|
+
component: Home,
|
|
503
|
+
})
|
|
504
|
+
|
|
505
|
+
function Home() {
|
|
506
|
+
const { user, login } = useAuth()
|
|
507
|
+
const [username, setUsername] = useState('')
|
|
508
|
+
const [password, setPassword] = useState('')
|
|
509
|
+
const [error, setError] = useState('')
|
|
510
|
+
|
|
511
|
+
const handleSubmit = async (e: React.FormEvent) => {
|
|
512
|
+
e.preventDefault()
|
|
513
|
+
setError('')
|
|
514
|
+
|
|
515
|
+
try {
|
|
516
|
+
const success = await login(username, password)
|
|
517
|
+
if (success) {
|
|
518
|
+
setUsername('')
|
|
519
|
+
setPassword('')
|
|
520
|
+
} else {
|
|
521
|
+
setError('Please provide both username and password')
|
|
522
|
+
}
|
|
523
|
+
} catch (err) {
|
|
524
|
+
console.error('Login failed:', err)
|
|
525
|
+
setError('An error occurred during login')
|
|
526
|
+
}
|
|
527
|
+
}
|
|
528
|
+
|
|
529
|
+
if (user) {
|
|
530
|
+
return (
|
|
531
|
+
<div className="container">
|
|
532
|
+
<h1>Welcome back, {user.username}!</h1>
|
|
533
|
+
<p>You are now logged in. Feel free to explore:</p>
|
|
534
|
+
<ul>
|
|
535
|
+
<li>Consider the potential of burritos</li>
|
|
536
|
+
<li>View your profile and statistics</li>
|
|
537
|
+
</ul>
|
|
538
|
+
</div>
|
|
539
|
+
)
|
|
540
|
+
}
|
|
541
|
+
|
|
542
|
+
return (
|
|
543
|
+
<div className="container">
|
|
544
|
+
<h1>Welcome to Burrito Consideration App</h1>
|
|
545
|
+
<p>Please sign in to begin your burrito journey</p>
|
|
546
|
+
|
|
547
|
+
<form onSubmit={handleSubmit} className="form">
|
|
548
|
+
<div className="form-group">
|
|
549
|
+
<label htmlFor="username">Username:</label>
|
|
550
|
+
<input
|
|
551
|
+
type="text"
|
|
552
|
+
id="username"
|
|
553
|
+
value={username}
|
|
554
|
+
onChange={(e) => setUsername(e.target.value)}
|
|
555
|
+
placeholder="Enter any username"
|
|
556
|
+
/>
|
|
557
|
+
</div>
|
|
558
|
+
|
|
559
|
+
<div className="form-group">
|
|
560
|
+
<label htmlFor="password">Password:</label>
|
|
561
|
+
<input
|
|
562
|
+
type="password"
|
|
563
|
+
id="password"
|
|
564
|
+
value={password}
|
|
565
|
+
onChange={(e) => setPassword(e.target.value)}
|
|
566
|
+
placeholder="Enter any password"
|
|
567
|
+
/>
|
|
568
|
+
</div>
|
|
569
|
+
|
|
570
|
+
{error && <p className="error">{error}</p>}
|
|
571
|
+
|
|
572
|
+
<button type="submit" className="btn-primary">
|
|
573
|
+
Sign In
|
|
574
|
+
</button>
|
|
575
|
+
</form>
|
|
576
|
+
|
|
577
|
+
<p className="note">
|
|
578
|
+
Note: This is a demo app. Use any username and password to sign in.
|
|
579
|
+
</p>
|
|
580
|
+
</div>
|
|
581
|
+
)
|
|
582
|
+
}
|
|
583
|
+
|
|
584
|
+
```
|
|
585
|
+
|
|
586
|
+
---
|
|
587
|
+
|
|
588
|
+
## src/routes/profile.tsx
|
|
589
|
+
|
|
590
|
+
```tsx
|
|
591
|
+
import { createFileRoute, useNavigate } from '@tanstack/react-router'
|
|
592
|
+
import { useAuth } from '../contexts/AuthContext'
|
|
593
|
+
|
|
594
|
+
export const Route = createFileRoute('/profile')({
|
|
595
|
+
component: ProfilePage,
|
|
596
|
+
})
|
|
597
|
+
|
|
598
|
+
function ProfilePage() {
|
|
599
|
+
const { user } = useAuth()
|
|
600
|
+
const navigate = useNavigate()
|
|
601
|
+
|
|
602
|
+
// Redirect to home if not logged in
|
|
603
|
+
if (!user) {
|
|
604
|
+
navigate({ to: '/' })
|
|
605
|
+
return null
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
return (
|
|
609
|
+
<div className="container">
|
|
610
|
+
<h1>User Profile</h1>
|
|
611
|
+
|
|
612
|
+
<div className="stats">
|
|
613
|
+
<h2>Your Information</h2>
|
|
614
|
+
<p>
|
|
615
|
+
<strong>Username:</strong> {user.username}
|
|
616
|
+
</p>
|
|
617
|
+
<p>
|
|
618
|
+
<strong>Burrito Considerations:</strong> {user.burritoConsiderations}
|
|
619
|
+
</p>
|
|
620
|
+
</div>
|
|
621
|
+
|
|
622
|
+
<div style={{ marginTop: '2rem' }}>
|
|
623
|
+
<h3>Your Burrito Journey</h3>
|
|
624
|
+
{user.burritoConsiderations === 0 ? (
|
|
625
|
+
<p>You haven't considered any burritos yet. Visit the Burrito Consideration page to start!</p>
|
|
626
|
+
) : user.burritoConsiderations === 1 ? (
|
|
627
|
+
<p>You've considered the burrito potential once. Keep going!</p>
|
|
628
|
+
) : user.burritoConsiderations < 5 ? (
|
|
629
|
+
<p>You're getting the hang of burrito consideration!</p>
|
|
630
|
+
) : user.burritoConsiderations < 10 ? (
|
|
631
|
+
<p>You're becoming a burrito consideration expert!</p>
|
|
632
|
+
) : (
|
|
633
|
+
<p>You are a true burrito consideration master!</p>
|
|
634
|
+
)}
|
|
635
|
+
</div>
|
|
636
|
+
</div>
|
|
637
|
+
)
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
```
|
|
641
|
+
|
|
642
|
+
---
|
|
643
|
+
|
|
644
|
+
## src/routeTree.gen.ts
|
|
645
|
+
|
|
646
|
+
```ts
|
|
647
|
+
/* eslint-disable */
|
|
648
|
+
|
|
649
|
+
// @ts-nocheck
|
|
650
|
+
|
|
651
|
+
// noinspection JSUnusedGlobalSymbols
|
|
652
|
+
|
|
653
|
+
// This file was automatically generated by TanStack Router.
|
|
654
|
+
// You should NOT make any changes in this file as it will be overwritten.
|
|
655
|
+
// Additionally, you should also exclude this file from your linter and/or formatter to prevent it from being checked or modified.
|
|
656
|
+
|
|
657
|
+
import { Route as rootRouteImport } from './routes/__root'
|
|
658
|
+
import { Route as ProfileRouteImport } from './routes/profile'
|
|
659
|
+
import { Route as BurritoRouteImport } from './routes/burrito'
|
|
660
|
+
import { Route as IndexRouteImport } from './routes/index'
|
|
661
|
+
|
|
662
|
+
const ProfileRoute = ProfileRouteImport.update({
|
|
663
|
+
id: '/profile',
|
|
664
|
+
path: '/profile',
|
|
665
|
+
getParentRoute: () => rootRouteImport,
|
|
666
|
+
} as any)
|
|
667
|
+
const BurritoRoute = BurritoRouteImport.update({
|
|
668
|
+
id: '/burrito',
|
|
669
|
+
path: '/burrito',
|
|
670
|
+
getParentRoute: () => rootRouteImport,
|
|
671
|
+
} as any)
|
|
672
|
+
const IndexRoute = IndexRouteImport.update({
|
|
673
|
+
id: '/',
|
|
674
|
+
path: '/',
|
|
675
|
+
getParentRoute: () => rootRouteImport,
|
|
676
|
+
} as any)
|
|
677
|
+
|
|
678
|
+
export interface FileRoutesByFullPath {
|
|
679
|
+
'/': typeof IndexRoute
|
|
680
|
+
'/burrito': typeof BurritoRoute
|
|
681
|
+
'/profile': typeof ProfileRoute
|
|
682
|
+
}
|
|
683
|
+
export interface FileRoutesByTo {
|
|
684
|
+
'/': typeof IndexRoute
|
|
685
|
+
'/burrito': typeof BurritoRoute
|
|
686
|
+
'/profile': typeof ProfileRoute
|
|
687
|
+
}
|
|
688
|
+
export interface FileRoutesById {
|
|
689
|
+
__root__: typeof rootRouteImport
|
|
690
|
+
'/': typeof IndexRoute
|
|
691
|
+
'/burrito': typeof BurritoRoute
|
|
692
|
+
'/profile': typeof ProfileRoute
|
|
693
|
+
}
|
|
694
|
+
export interface FileRouteTypes {
|
|
695
|
+
fileRoutesByFullPath: FileRoutesByFullPath
|
|
696
|
+
fullPaths: '/' | '/burrito' | '/profile'
|
|
697
|
+
fileRoutesByTo: FileRoutesByTo
|
|
698
|
+
to: '/' | '/burrito' | '/profile'
|
|
699
|
+
id: '__root__' | '/' | '/burrito' | '/profile'
|
|
700
|
+
fileRoutesById: FileRoutesById
|
|
701
|
+
}
|
|
702
|
+
export interface RootRouteChildren {
|
|
703
|
+
IndexRoute: typeof IndexRoute
|
|
704
|
+
BurritoRoute: typeof BurritoRoute
|
|
705
|
+
ProfileRoute: typeof ProfileRoute
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
declare module '@tanstack/react-router' {
|
|
709
|
+
interface FileRoutesByPath {
|
|
710
|
+
'/profile': {
|
|
711
|
+
id: '/profile'
|
|
712
|
+
path: '/profile'
|
|
713
|
+
fullPath: '/profile'
|
|
714
|
+
preLoaderRoute: typeof ProfileRouteImport
|
|
715
|
+
parentRoute: typeof rootRouteImport
|
|
716
|
+
}
|
|
717
|
+
'/burrito': {
|
|
718
|
+
id: '/burrito'
|
|
719
|
+
path: '/burrito'
|
|
720
|
+
fullPath: '/burrito'
|
|
721
|
+
preLoaderRoute: typeof BurritoRouteImport
|
|
722
|
+
parentRoute: typeof rootRouteImport
|
|
723
|
+
}
|
|
724
|
+
'/': {
|
|
725
|
+
id: '/'
|
|
726
|
+
path: '/'
|
|
727
|
+
fullPath: '/'
|
|
728
|
+
preLoaderRoute: typeof IndexRouteImport
|
|
729
|
+
parentRoute: typeof rootRouteImport
|
|
730
|
+
}
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
const rootRouteChildren: RootRouteChildren = {
|
|
735
|
+
IndexRoute: IndexRoute,
|
|
736
|
+
BurritoRoute: BurritoRoute,
|
|
737
|
+
ProfileRoute: ProfileRoute,
|
|
738
|
+
}
|
|
739
|
+
export const routeTree = rootRouteImport
|
|
740
|
+
._addFileChildren(rootRouteChildren)
|
|
741
|
+
._addFileTypes<FileRouteTypes>()
|
|
742
|
+
|
|
743
|
+
```
|
|
744
|
+
|
|
745
|
+
---
|
|
746
|
+
|
|
747
|
+
## vite.config.ts
|
|
748
|
+
|
|
749
|
+
```ts
|
|
750
|
+
import { URL, fileURLToPath } from 'node:url'
|
|
751
|
+
|
|
752
|
+
import { tanstackRouter } from '@tanstack/router-plugin/vite'
|
|
753
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
754
|
+
import { defineConfig } from 'vite'
|
|
755
|
+
import viteReact from '@vitejs/plugin-react'
|
|
756
|
+
|
|
757
|
+
// https://vitejs.dev/config/
|
|
758
|
+
export default defineConfig({
|
|
759
|
+
plugins: [
|
|
760
|
+
tanstackRouter({
|
|
761
|
+
target: 'react',
|
|
762
|
+
autoCodeSplitting: true,
|
|
763
|
+
}),
|
|
764
|
+
viteReact(),
|
|
765
|
+
tailwindcss(),
|
|
766
|
+
],
|
|
767
|
+
resolve: {
|
|
768
|
+
alias: {
|
|
769
|
+
'@': fileURLToPath(new URL('./src', import.meta.url)),
|
|
770
|
+
},
|
|
771
|
+
},
|
|
772
|
+
})
|
|
773
|
+
|
|
774
|
+
```
|
|
775
|
+
|
|
776
|
+
---
|
|
777
|
+
|