@amplitude/wizard 1.0.0-beta.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/LICENSE +47 -0
- package/README.md +119 -0
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +763 -0
- package/dist/package.json +144 -0
- package/dist/src/frameworks/android/android-wizard-agent.d.ts +6 -0
- package/dist/src/frameworks/android/android-wizard-agent.js +72 -0
- package/dist/src/frameworks/android/utils.d.ts +11 -0
- package/dist/src/frameworks/android/utils.js +32 -0
- package/dist/src/frameworks/django/django-wizard-agent.d.ts +8 -0
- package/dist/src/frameworks/django/django-wizard-agent.js +171 -0
- package/dist/src/frameworks/django/utils.d.ts +31 -0
- package/dist/src/frameworks/django/utils.js +305 -0
- package/dist/src/frameworks/fastapi/fastapi-wizard-agent.d.ts +11 -0
- package/dist/src/frameworks/fastapi/fastapi-wizard-agent.js +189 -0
- package/dist/src/frameworks/fastapi/utils.d.ts +26 -0
- package/dist/src/frameworks/fastapi/utils.js +257 -0
- package/dist/src/frameworks/flask/flask-wizard-agent.d.ts +8 -0
- package/dist/src/frameworks/flask/flask-wizard-agent.js +177 -0
- package/dist/src/frameworks/flask/utils.d.ts +28 -0
- package/dist/src/frameworks/flask/utils.js +343 -0
- package/dist/src/frameworks/flutter/flutter-wizard-agent.d.ts +4 -0
- package/dist/src/frameworks/flutter/flutter-wizard-agent.js +57 -0
- package/dist/src/frameworks/flutter/utils.d.ts +7 -0
- package/dist/src/frameworks/flutter/utils.js +64 -0
- package/dist/src/frameworks/generic/generic-wizard-agent.d.ts +2 -0
- package/dist/src/frameworks/generic/generic-wizard-agent.js +176 -0
- package/dist/src/frameworks/go/go-wizard-agent.d.ts +4 -0
- package/dist/src/frameworks/go/go-wizard-agent.js +57 -0
- package/dist/src/frameworks/go/utils.d.ts +5 -0
- package/dist/src/frameworks/go/utils.js +44 -0
- package/dist/src/frameworks/java/java-wizard-agent.d.ts +7 -0
- package/dist/src/frameworks/java/java-wizard-agent.js +73 -0
- package/dist/src/frameworks/java/utils.d.ts +15 -0
- package/dist/src/frameworks/java/utils.js +64 -0
- package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.d.ts +4 -0
- package/dist/src/frameworks/javascript-node/javascript-node-wizard-agent.js +57 -0
- package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.d.ts +3 -0
- package/dist/src/frameworks/javascript-web/javascript-web-wizard-agent.js +151 -0
- package/dist/src/frameworks/javascript-web/utils.d.ts +28 -0
- package/dist/src/frameworks/javascript-web/utils.js +153 -0
- package/dist/src/frameworks/nextjs/nextjs-wizard-agent.d.ts +7 -0
- package/dist/src/frameworks/nextjs/nextjs-wizard-agent.js +98 -0
- package/dist/src/frameworks/nextjs/utils.d.ts +12 -0
- package/dist/src/frameworks/nextjs/utils.js +51 -0
- package/dist/src/frameworks/python/python-wizard-agent.d.ts +7 -0
- package/dist/src/frameworks/python/python-wizard-agent.js +193 -0
- package/dist/src/frameworks/python/utils.d.ts +28 -0
- package/dist/src/frameworks/python/utils.js +146 -0
- package/dist/src/frameworks/react-native/react-native-wizard-agent.d.ts +6 -0
- package/dist/src/frameworks/react-native/react-native-wizard-agent.js +84 -0
- package/dist/src/frameworks/react-native/utils.d.ts +21 -0
- package/dist/src/frameworks/react-native/utils.js +82 -0
- package/dist/src/frameworks/react-router/react-router-wizard-agent.d.ts +7 -0
- package/dist/src/frameworks/react-router/react-router-wizard-agent.js +98 -0
- package/dist/src/frameworks/react-router/utils.d.ts +13 -0
- package/dist/src/frameworks/react-router/utils.js +160 -0
- package/dist/src/frameworks/swift/swift-wizard-agent.d.ts +7 -0
- package/dist/src/frameworks/swift/swift-wizard-agent.js +72 -0
- package/dist/src/frameworks/swift/utils.d.ts +12 -0
- package/dist/src/frameworks/swift/utils.js +82 -0
- package/dist/src/frameworks/unity/unity-wizard-agent.d.ts +6 -0
- package/dist/src/frameworks/unity/unity-wizard-agent.js +79 -0
- package/dist/src/frameworks/unity/utils.d.ts +12 -0
- package/dist/src/frameworks/unity/utils.js +66 -0
- package/dist/src/frameworks/unreal/unreal-wizard-agent.d.ts +6 -0
- package/dist/src/frameworks/unreal/unreal-wizard-agent.js +77 -0
- package/dist/src/frameworks/unreal/utils.d.ts +10 -0
- package/dist/src/frameworks/unreal/utils.js +29 -0
- package/dist/src/frameworks/vue/vue-wizard-agent.d.ts +4 -0
- package/dist/src/frameworks/vue/vue-wizard-agent.js +64 -0
- package/dist/src/lib/agent-hooks.d.ts +26 -0
- package/dist/src/lib/agent-hooks.js +118 -0
- package/dist/src/lib/agent-interface.d.ts +175 -0
- package/dist/src/lib/agent-interface.js +1217 -0
- package/dist/src/lib/agent-runner.d.ts +9 -0
- package/dist/src/lib/agent-runner.js +415 -0
- package/dist/src/lib/ampli-config.d.ts +105 -0
- package/dist/src/lib/ampli-config.js +178 -0
- package/dist/src/lib/api.d.ts +107 -0
- package/dist/src/lib/api.js +442 -0
- package/dist/src/lib/commandments.d.ts +1 -0
- package/dist/src/lib/commandments.js +24 -0
- package/dist/src/lib/console-query.d.ts +27 -0
- package/dist/src/lib/console-query.js +121 -0
- package/dist/src/lib/constants.d.ts +124 -0
- package/dist/src/lib/constants.js +170 -0
- package/dist/src/lib/detect-amplitude.d.ts +31 -0
- package/dist/src/lib/detect-amplitude.js +407 -0
- package/dist/src/lib/framework-config.d.ts +188 -0
- package/dist/src/lib/framework-config.js +21 -0
- package/dist/src/lib/health-checks/endpoints.d.ts +3 -0
- package/dist/src/lib/health-checks/endpoints.js +45 -0
- package/dist/src/lib/health-checks/index.d.ts +4 -0
- package/dist/src/lib/health-checks/index.js +22 -0
- package/dist/src/lib/health-checks/readiness.d.ts +24 -0
- package/dist/src/lib/health-checks/readiness.js +118 -0
- package/dist/src/lib/health-checks/statuspage.d.ts +9 -0
- package/dist/src/lib/health-checks/statuspage.js +104 -0
- package/dist/src/lib/health-checks/types.d.ts +31 -0
- package/dist/src/lib/health-checks/types.js +9 -0
- package/dist/src/lib/helper-functions.d.ts +1 -0
- package/dist/src/lib/helper-functions.js +5 -0
- package/dist/src/lib/middleware/benchmark.d.ts +54 -0
- package/dist/src/lib/middleware/benchmark.js +48 -0
- package/dist/src/lib/middleware/benchmarks/cache-tracker.d.ts +44 -0
- package/dist/src/lib/middleware/benchmarks/cache-tracker.js +80 -0
- package/dist/src/lib/middleware/benchmarks/compaction-tracker.d.ts +29 -0
- package/dist/src/lib/middleware/benchmarks/compaction-tracker.js +59 -0
- package/dist/src/lib/middleware/benchmarks/context-size-tracker.d.ts +26 -0
- package/dist/src/lib/middleware/benchmarks/context-size-tracker.js +55 -0
- package/dist/src/lib/middleware/benchmarks/cost-tracker.d.ts +16 -0
- package/dist/src/lib/middleware/benchmarks/cost-tracker.js +75 -0
- package/dist/src/lib/middleware/benchmarks/duration-tracker.d.ts +20 -0
- package/dist/src/lib/middleware/benchmarks/duration-tracker.js +39 -0
- package/dist/src/lib/middleware/benchmarks/index.d.ts +9 -0
- package/dist/src/lib/middleware/benchmarks/index.js +67 -0
- package/dist/src/lib/middleware/benchmarks/json-writer.d.ts +15 -0
- package/dist/src/lib/middleware/benchmarks/json-writer.js +144 -0
- package/dist/src/lib/middleware/benchmarks/summary.d.ts +9 -0
- package/dist/src/lib/middleware/benchmarks/summary.js +105 -0
- package/dist/src/lib/middleware/benchmarks/token-tracker.d.ts +40 -0
- package/dist/src/lib/middleware/benchmarks/token-tracker.js +76 -0
- package/dist/src/lib/middleware/benchmarks/turn-counter.d.ts +34 -0
- package/dist/src/lib/middleware/benchmarks/turn-counter.js +58 -0
- package/dist/src/lib/middleware/config.d.ts +24 -0
- package/dist/src/lib/middleware/config.js +96 -0
- package/dist/src/lib/middleware/index.d.ts +11 -0
- package/dist/src/lib/middleware/index.js +17 -0
- package/dist/src/lib/middleware/phase-detector.d.ts +8 -0
- package/dist/src/lib/middleware/phase-detector.js +63 -0
- package/dist/src/lib/middleware/pipeline.d.ts +29 -0
- package/dist/src/lib/middleware/pipeline.js +81 -0
- package/dist/src/lib/middleware/schemas.d.ts +27 -0
- package/dist/src/lib/middleware/schemas.js +84 -0
- package/dist/src/lib/middleware/types.d.ts +94 -0
- package/dist/src/lib/middleware/types.js +8 -0
- package/dist/src/lib/package-manager-detection.d.ts +42 -0
- package/dist/src/lib/package-manager-detection.js +292 -0
- package/dist/src/lib/registry.d.ts +3 -0
- package/dist/src/lib/registry.js +42 -0
- package/dist/src/lib/safe-tools.d.ts +2 -0
- package/dist/src/lib/safe-tools.js +214 -0
- package/dist/src/lib/wizard-session.d.ts +220 -0
- package/dist/src/lib/wizard-session.js +127 -0
- package/dist/src/lib/wizard-tools.d.ts +82 -0
- package/dist/src/lib/wizard-tools.js +499 -0
- package/dist/src/run.d.ts +19 -0
- package/dist/src/run.js +151 -0
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.d.ts +30 -0
- package/dist/src/steps/add-mcp-server-to-clients/MCPClient.js +141 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.d.ts +29 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude-code.js +180 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.d.ts +20 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/claude.js +63 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.d.ts +28 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/codex.js +77 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.d.ts +24 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/cursor.js +60 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.d.ts +27 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/visual-studio-code.js +101 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/zed.d.ts +26 -0
- package/dist/src/steps/add-mcp-server-to-clients/clients/zed.js +102 -0
- package/dist/src/steps/add-mcp-server-to-clients/defaults.d.ts +44 -0
- package/dist/src/steps/add-mcp-server-to-clients/defaults.js +123 -0
- package/dist/src/steps/add-mcp-server-to-clients/index.d.ts +19 -0
- package/dist/src/steps/add-mcp-server-to-clients/index.js +110 -0
- package/dist/src/steps/add-or-update-environment-variables.d.ts +10 -0
- package/dist/src/steps/add-or-update-environment-variables.js +188 -0
- package/dist/src/steps/index.d.ts +4 -0
- package/dist/src/steps/index.js +20 -0
- package/dist/src/steps/run-prettier.d.ts +5 -0
- package/dist/src/steps/run-prettier.js +90 -0
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.d.ts +11 -0
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js +11 -0
- package/dist/src/steps/upload-environment-variables/index.d.ts +6 -0
- package/dist/src/steps/upload-environment-variables/index.js +37 -0
- package/dist/src/steps/upload-environment-variables/providers/vercel.d.ts +15 -0
- package/dist/src/steps/upload-environment-variables/providers/vercel.js +145 -0
- package/dist/src/telemetry.d.ts +2 -0
- package/dist/src/telemetry.js +12 -0
- package/dist/src/ui/index.d.ts +8 -0
- package/dist/src/ui/index.js +16 -0
- package/dist/src/ui/logging-ui.d.ts +56 -0
- package/dist/src/ui/logging-ui.js +157 -0
- package/dist/src/ui/tui/App.d.ts +6 -0
- package/dist/src/ui/tui/App.js +34 -0
- package/dist/src/ui/tui/components/AmplitudeLogo.d.ts +5 -0
- package/dist/src/ui/tui/components/AmplitudeLogo.js +81 -0
- package/dist/src/ui/tui/components/AmplitudeTextLogo.d.ts +3 -0
- package/dist/src/ui/tui/components/AmplitudeTextLogo.js +31 -0
- package/dist/src/ui/tui/components/ConsoleView.d.ts +23 -0
- package/dist/src/ui/tui/components/ConsoleView.js +220 -0
- package/dist/src/ui/tui/components/TitleBar.d.ts +6 -0
- package/dist/src/ui/tui/components/TitleBar.js +16 -0
- package/dist/src/ui/tui/console-commands.d.ts +16 -0
- package/dist/src/ui/tui/console-commands.js +31 -0
- package/dist/src/ui/tui/context/CommandModeContext.d.ts +2 -0
- package/dist/src/ui/tui/context/CommandModeContext.js +3 -0
- package/dist/src/ui/tui/flows.d.ts +48 -0
- package/dist/src/ui/tui/flows.js +154 -0
- package/dist/src/ui/tui/hooks/useScreenInput.d.ts +13 -0
- package/dist/src/ui/tui/hooks/useScreenInput.js +18 -0
- package/dist/src/ui/tui/hooks/useStdoutDimensions.d.ts +9 -0
- package/dist/src/ui/tui/hooks/useStdoutDimensions.js +29 -0
- package/dist/src/ui/tui/ink-ui.d.ts +62 -0
- package/dist/src/ui/tui/ink-ui.js +142 -0
- package/dist/src/ui/tui/primitives/CardLayout.d.ts +12 -0
- package/dist/src/ui/tui/primitives/CardLayout.js +9 -0
- package/dist/src/ui/tui/primitives/ConfirmationInput.d.ts +13 -0
- package/dist/src/ui/tui/primitives/ConfirmationInput.js +35 -0
- package/dist/src/ui/tui/primitives/DissolveTransition.d.ts +21 -0
- package/dist/src/ui/tui/primitives/DissolveTransition.js +143 -0
- package/dist/src/ui/tui/primitives/EventPlanViewer.d.ts +9 -0
- package/dist/src/ui/tui/primitives/EventPlanViewer.js +9 -0
- package/dist/src/ui/tui/primitives/KagiSmallWebViewer.d.ts +7 -0
- package/dist/src/ui/tui/primitives/KagiSmallWebViewer.js +101 -0
- package/dist/src/ui/tui/primitives/LoadingBox.d.ts +8 -0
- package/dist/src/ui/tui/primitives/LoadingBox.js +9 -0
- package/dist/src/ui/tui/primitives/LogViewer.d.ts +11 -0
- package/dist/src/ui/tui/primitives/LogViewer.js +55 -0
- package/dist/src/ui/tui/primitives/PickerMenu.d.ts +20 -0
- package/dist/src/ui/tui/primitives/PickerMenu.js +212 -0
- package/dist/src/ui/tui/primitives/ProgressList.d.ts +15 -0
- package/dist/src/ui/tui/primitives/ProgressList.js +29 -0
- package/dist/src/ui/tui/primitives/PromptLabel.d.ts +11 -0
- package/dist/src/ui/tui/primitives/PromptLabel.js +12 -0
- package/dist/src/ui/tui/primitives/ReportViewer.d.ts +12 -0
- package/dist/src/ui/tui/primitives/ReportViewer.js +99 -0
- package/dist/src/ui/tui/primitives/ScreenErrorBoundary.d.ts +26 -0
- package/dist/src/ui/tui/primitives/ScreenErrorBoundary.js +29 -0
- package/dist/src/ui/tui/primitives/SlashCommandInput.d.ts +21 -0
- package/dist/src/ui/tui/primitives/SlashCommandInput.js +85 -0
- package/dist/src/ui/tui/primitives/SnakeGame.d.ts +1 -0
- package/dist/src/ui/tui/primitives/SnakeGame.js +1 -0
- package/dist/src/ui/tui/primitives/SplitView.d.ts +11 -0
- package/dist/src/ui/tui/primitives/SplitView.js +8 -0
- package/dist/src/ui/tui/primitives/TabContainer.d.ts +18 -0
- package/dist/src/ui/tui/primitives/TabContainer.js +30 -0
- package/dist/src/ui/tui/primitives/index.d.ts +23 -0
- package/dist/src/ui/tui/primitives/index.js +19 -0
- package/dist/src/ui/tui/router.d.ts +61 -0
- package/dist/src/ui/tui/router.js +104 -0
- package/dist/src/ui/tui/screen-registry.d.ts +19 -0
- package/dist/src/ui/tui/screen-registry.js +56 -0
- package/dist/src/ui/tui/screens/ActivationOptionsScreen.d.ts +12 -0
- package/dist/src/ui/tui/screens/ActivationOptionsScreen.js +57 -0
- package/dist/src/ui/tui/screens/AuthScreen.d.ts +18 -0
- package/dist/src/ui/tui/screens/AuthScreen.js +107 -0
- package/dist/src/ui/tui/screens/ChecklistScreen.d.ts +22 -0
- package/dist/src/ui/tui/screens/ChecklistScreen.js +122 -0
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.d.ts +24 -0
- package/dist/src/ui/tui/screens/DataIngestionCheckScreen.js +113 -0
- package/dist/src/ui/tui/screens/DataSetupScreen.d.ts +17 -0
- package/dist/src/ui/tui/screens/DataSetupScreen.js +73 -0
- package/dist/src/ui/tui/screens/IntroScreen.d.ts +16 -0
- package/dist/src/ui/tui/screens/IntroScreen.js +86 -0
- package/dist/src/ui/tui/screens/LoginScreen.d.ts +15 -0
- package/dist/src/ui/tui/screens/LoginScreen.js +65 -0
- package/dist/src/ui/tui/screens/LogoutScreen.d.ts +12 -0
- package/dist/src/ui/tui/screens/LogoutScreen.js +28 -0
- package/dist/src/ui/tui/screens/McpScreen.d.ts +26 -0
- package/dist/src/ui/tui/screens/McpScreen.js +148 -0
- package/dist/src/ui/tui/screens/OutageScreen.d.ts +10 -0
- package/dist/src/ui/tui/screens/OutageScreen.js +17 -0
- package/dist/src/ui/tui/screens/OutroScreen.d.ts +11 -0
- package/dist/src/ui/tui/screens/OutroScreen.js +69 -0
- package/dist/src/ui/tui/screens/RegionSelectScreen.d.ts +17 -0
- package/dist/src/ui/tui/screens/RegionSelectScreen.js +40 -0
- package/dist/src/ui/tui/screens/RunScreen.d.ts +16 -0
- package/dist/src/ui/tui/screens/RunScreen.js +212 -0
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.d.ts +10 -0
- package/dist/src/ui/tui/screens/SettingsOverrideScreen.js +23 -0
- package/dist/src/ui/tui/screens/SetupScreen.d.ts +13 -0
- package/dist/src/ui/tui/screens/SetupScreen.js +73 -0
- package/dist/src/ui/tui/screens/SlackScreen.d.ts +25 -0
- package/dist/src/ui/tui/screens/SlackScreen.js +97 -0
- package/dist/src/ui/tui/services/mcp-installer.d.ts +25 -0
- package/dist/src/ui/tui/services/mcp-installer.js +82 -0
- package/dist/src/ui/tui/start-tui.d.ts +10 -0
- package/dist/src/ui/tui/start-tui.js +50 -0
- package/dist/src/ui/tui/store.d.ts +231 -0
- package/dist/src/ui/tui/store.js +568 -0
- package/dist/src/ui/tui/styles.d.ts +31 -0
- package/dist/src/ui/tui/styles.js +33 -0
- package/dist/src/ui/wizard-ui.d.ts +110 -0
- package/dist/src/ui/wizard-ui.js +18 -0
- package/dist/src/utils/ampli-settings.d.ts +37 -0
- package/dist/src/utils/ampli-settings.js +182 -0
- package/dist/src/utils/analytics.d.ts +35 -0
- package/dist/src/utils/analytics.js +133 -0
- package/dist/src/utils/anthropic-status.d.ts +17 -0
- package/dist/src/utils/anthropic-status.js +51 -0
- package/dist/src/utils/api-key-store.d.ts +35 -0
- package/dist/src/utils/api-key-store.js +176 -0
- package/dist/src/utils/bash.d.ts +2 -0
- package/dist/src/utils/bash.js +53 -0
- package/dist/src/utils/custom-headers.d.ts +9 -0
- package/dist/src/utils/custom-headers.js +23 -0
- package/dist/src/utils/debug.d.ts +23 -0
- package/dist/src/utils/debug.js +86 -0
- package/dist/src/utils/environment.d.ts +4 -0
- package/dist/src/utils/environment.js +76 -0
- package/dist/src/utils/file-utils.d.ts +2 -0
- package/dist/src/utils/file-utils.js +16 -0
- package/dist/src/utils/get-api-key.d.ts +17 -0
- package/dist/src/utils/get-api-key.js +50 -0
- package/dist/src/utils/logging.d.ts +9 -0
- package/dist/src/utils/logging.js +48 -0
- package/dist/src/utils/oauth.d.ts +53 -0
- package/dist/src/utils/oauth.js +354 -0
- package/dist/src/utils/package-json.d.ts +25 -0
- package/dist/src/utils/package-json.js +26 -0
- package/dist/src/utils/package-manager.d.ts +21 -0
- package/dist/src/utils/package-manager.js +208 -0
- package/dist/src/utils/semver.d.ts +21 -0
- package/dist/src/utils/semver.js +61 -0
- package/dist/src/utils/setup-utils.d.ts +82 -0
- package/dist/src/utils/setup-utils.js +467 -0
- package/dist/src/utils/shell-completions.d.ts +10 -0
- package/dist/src/utils/shell-completions.js +199 -0
- package/dist/src/utils/string.d.ts +1 -0
- package/dist/src/utils/string.js +8 -0
- package/dist/src/utils/types.d.ts +72 -0
- package/dist/src/utils/types.js +2 -0
- package/dist/src/utils/urls.d.ts +14 -0
- package/dist/src/utils/urls.js +69 -0
- package/dist/src/utils/vendor/is-unicorn-supported.d.ts +1 -0
- package/dist/src/utils/vendor/is-unicorn-supported.js +23 -0
- package/dist/src/utils/wizard-abort.d.ts +13 -0
- package/dist/src/utils/wizard-abort.js +56 -0
- package/man/amplitude-wizard.1 +170 -0
- package/package.json +144 -0
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NEXTJS_AGENT_CONFIG = void 0;
|
|
4
|
+
const package_manager_detection_1 = require("../../lib/package-manager-detection");
|
|
5
|
+
const constants_1 = require("../../lib/constants");
|
|
6
|
+
const package_json_1 = require("../../utils/package-json");
|
|
7
|
+
const setup_utils_1 = require("../../utils/setup-utils");
|
|
8
|
+
const ui_1 = require("../../ui");
|
|
9
|
+
const utils_1 = require("./utils");
|
|
10
|
+
exports.NEXTJS_AGENT_CONFIG = {
|
|
11
|
+
metadata: {
|
|
12
|
+
name: 'Next.js',
|
|
13
|
+
integration: constants_1.Integration.nextjs,
|
|
14
|
+
docsUrl: 'https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2',
|
|
15
|
+
unsupportedVersionDocsUrl: 'https://amplitude.com/docs/sdks/analytics/browser/browser-sdk-2',
|
|
16
|
+
gatherContext: async (options) => {
|
|
17
|
+
const router = await (0, utils_1.getNextJsRouter)(options);
|
|
18
|
+
if (router) {
|
|
19
|
+
const emoji = router === utils_1.NextJsRouter.APP_ROUTER ? '\u{1F4F1}' : '\u{1F4C3}';
|
|
20
|
+
(0, ui_1.getUI)().setDetectedFramework(`Next.js ${(0, utils_1.getNextJsRouterName)(router)} ${emoji}`);
|
|
21
|
+
return { router };
|
|
22
|
+
}
|
|
23
|
+
return {};
|
|
24
|
+
},
|
|
25
|
+
setup: {
|
|
26
|
+
questions: [
|
|
27
|
+
{
|
|
28
|
+
key: 'router',
|
|
29
|
+
message: 'Which Next.js router are you using?',
|
|
30
|
+
options: [
|
|
31
|
+
{ label: 'App Router', value: utils_1.NextJsRouter.APP_ROUTER },
|
|
32
|
+
{ label: 'Pages Router', value: utils_1.NextJsRouter.PAGES_ROUTER },
|
|
33
|
+
],
|
|
34
|
+
detect: async (opts) => {
|
|
35
|
+
const result = await (0, utils_1.getNextJsRouter)(opts);
|
|
36
|
+
return result;
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
detection: {
|
|
43
|
+
packageName: 'next',
|
|
44
|
+
packageDisplayName: 'Next.js',
|
|
45
|
+
getVersion: (packageJson) => (0, package_json_1.getPackageVersion)('next', packageJson),
|
|
46
|
+
getVersionBucket: utils_1.getNextJsVersionBucket,
|
|
47
|
+
minimumVersion: '15.3.0',
|
|
48
|
+
getInstalledVersion: async (options) => {
|
|
49
|
+
const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
|
|
50
|
+
return packageJson ? (0, package_json_1.getPackageVersion)('next', packageJson) : undefined;
|
|
51
|
+
},
|
|
52
|
+
detect: async (options) => {
|
|
53
|
+
const packageJson = await (0, setup_utils_1.tryGetPackageJson)(options);
|
|
54
|
+
return packageJson ? (0, package_json_1.hasPackageInstalled)('next', packageJson) : false;
|
|
55
|
+
},
|
|
56
|
+
detectPackageManager: package_manager_detection_1.detectNodePackageManagers,
|
|
57
|
+
},
|
|
58
|
+
environment: {
|
|
59
|
+
uploadToHosting: true,
|
|
60
|
+
getEnvVars: (apiKey, _host) => ({
|
|
61
|
+
NEXT_PUBLIC_AMPLITUDE_API_KEY: apiKey,
|
|
62
|
+
}),
|
|
63
|
+
},
|
|
64
|
+
analytics: {
|
|
65
|
+
getTags: (context) => ({
|
|
66
|
+
router: context.router === utils_1.NextJsRouter.APP_ROUTER ? 'app' : 'pages',
|
|
67
|
+
}),
|
|
68
|
+
},
|
|
69
|
+
prompts: {
|
|
70
|
+
projectTypeDetection: 'This is a JavaScript/TypeScript project. Look for package.json and lockfiles (package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb) to confirm.',
|
|
71
|
+
getAdditionalContextLines: (context) => {
|
|
72
|
+
const routerType = context.router === utils_1.NextJsRouter.APP_ROUTER ? 'app' : 'pages';
|
|
73
|
+
return [
|
|
74
|
+
`Router: ${routerType}`,
|
|
75
|
+
`Preferred Amplitude SDK: @amplitude/unified (prefer over @amplitude/analytics-browser for new browser integrations)`,
|
|
76
|
+
];
|
|
77
|
+
},
|
|
78
|
+
},
|
|
79
|
+
ui: {
|
|
80
|
+
successMessage: 'Amplitude integration complete',
|
|
81
|
+
estimatedDurationMinutes: 8,
|
|
82
|
+
getOutroChanges: (context) => {
|
|
83
|
+
const router = context.router ?? utils_1.NextJsRouter.APP_ROUTER;
|
|
84
|
+
const routerName = (0, utils_1.getNextJsRouterName)(router);
|
|
85
|
+
return [
|
|
86
|
+
`Analyzed your Next.js project structure (${routerName})`,
|
|
87
|
+
`Created and configured Amplitude initializers`,
|
|
88
|
+
`Integrated Amplitude into your application`,
|
|
89
|
+
];
|
|
90
|
+
},
|
|
91
|
+
getOutroNextSteps: () => {
|
|
92
|
+
return [
|
|
93
|
+
'Start your development server to see Amplitude in action',
|
|
94
|
+
'Visit your Amplitude dashboard to see incoming events',
|
|
95
|
+
];
|
|
96
|
+
},
|
|
97
|
+
},
|
|
98
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { WizardOptions } from '../../utils/types';
|
|
2
|
+
export declare const getNextJsVersionBucket: (version: string | undefined) => string;
|
|
3
|
+
export declare enum NextJsRouter {
|
|
4
|
+
APP_ROUTER = "app-router",
|
|
5
|
+
PAGES_ROUTER = "pages-router"
|
|
6
|
+
}
|
|
7
|
+
export declare const IGNORE_PATTERNS: string[];
|
|
8
|
+
/**
|
|
9
|
+
* Detect Next.js router type. Pure — returns null if ambiguous.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getNextJsRouter({ installDir, }: Pick<WizardOptions, 'installDir'>): Promise<NextJsRouter | null>;
|
|
12
|
+
export declare const getNextJsRouterName: (router: NextJsRouter) => "app router" | "pages router";
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getNextJsRouterName = exports.IGNORE_PATTERNS = exports.NextJsRouter = exports.getNextJsVersionBucket = void 0;
|
|
7
|
+
exports.getNextJsRouter = getNextJsRouter;
|
|
8
|
+
const fast_glob_1 = __importDefault(require("fast-glob"));
|
|
9
|
+
const semver_1 = require("../../utils/semver");
|
|
10
|
+
exports.getNextJsVersionBucket = (0, semver_1.createVersionBucket)();
|
|
11
|
+
var NextJsRouter;
|
|
12
|
+
(function (NextJsRouter) {
|
|
13
|
+
NextJsRouter["APP_ROUTER"] = "app-router";
|
|
14
|
+
NextJsRouter["PAGES_ROUTER"] = "pages-router";
|
|
15
|
+
})(NextJsRouter || (exports.NextJsRouter = NextJsRouter = {}));
|
|
16
|
+
exports.IGNORE_PATTERNS = [
|
|
17
|
+
'**/node_modules/**',
|
|
18
|
+
'**/dist/**',
|
|
19
|
+
'**/build/**',
|
|
20
|
+
'**/public/**',
|
|
21
|
+
'**/.next/**',
|
|
22
|
+
];
|
|
23
|
+
/**
|
|
24
|
+
* Detect Next.js router type. Pure — returns null if ambiguous.
|
|
25
|
+
*/
|
|
26
|
+
async function getNextJsRouter({ installDir, }) {
|
|
27
|
+
const pagesMatches = await (0, fast_glob_1.default)('**/pages/_app.@(ts|tsx|js|jsx)', {
|
|
28
|
+
dot: true,
|
|
29
|
+
cwd: installDir,
|
|
30
|
+
ignore: exports.IGNORE_PATTERNS,
|
|
31
|
+
});
|
|
32
|
+
const hasPagesDir = pagesMatches.length > 0;
|
|
33
|
+
const appMatches = await (0, fast_glob_1.default)('**/app/**/layout.@(ts|tsx|js|jsx)', {
|
|
34
|
+
dot: true,
|
|
35
|
+
cwd: installDir,
|
|
36
|
+
ignore: exports.IGNORE_PATTERNS,
|
|
37
|
+
});
|
|
38
|
+
const hasAppDir = appMatches.length > 0;
|
|
39
|
+
if (hasPagesDir && !hasAppDir) {
|
|
40
|
+
return NextJsRouter.PAGES_ROUTER;
|
|
41
|
+
}
|
|
42
|
+
if (hasAppDir && !hasPagesDir) {
|
|
43
|
+
return NextJsRouter.APP_ROUTER;
|
|
44
|
+
}
|
|
45
|
+
// Ambiguous (both or neither) — return null, SetupScreen handles it
|
|
46
|
+
return null;
|
|
47
|
+
}
|
|
48
|
+
const getNextJsRouterName = (router) => {
|
|
49
|
+
return router === NextJsRouter.APP_ROUTER ? 'app router' : 'pages router';
|
|
50
|
+
};
|
|
51
|
+
exports.getNextJsRouterName = getNextJsRouterName;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { FrameworkConfig } from '../../lib/framework-config';
|
|
2
|
+
import { PythonPackageManager } from './utils';
|
|
3
|
+
type PythonContext = {
|
|
4
|
+
packageManager?: PythonPackageManager;
|
|
5
|
+
};
|
|
6
|
+
export declare const PYTHON_AGENT_CONFIG: FrameworkConfig<PythonContext>;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.PYTHON_AGENT_CONFIG = void 0;
|
|
40
|
+
const framework_config_1 = require("../../lib/framework-config");
|
|
41
|
+
const package_manager_detection_1 = require("../../lib/package-manager-detection");
|
|
42
|
+
const constants_1 = require("../../lib/constants");
|
|
43
|
+
const fast_glob_1 = __importDefault(require("fast-glob"));
|
|
44
|
+
const fs = __importStar(require("node:fs"));
|
|
45
|
+
const path = __importStar(require("node:path"));
|
|
46
|
+
const utils_1 = require("./utils");
|
|
47
|
+
exports.PYTHON_AGENT_CONFIG = {
|
|
48
|
+
metadata: {
|
|
49
|
+
name: 'Python Language',
|
|
50
|
+
integration: constants_1.Integration.python,
|
|
51
|
+
beta: true,
|
|
52
|
+
docsUrl: 'https://amplitude.com/docs/sdks/analytics/python',
|
|
53
|
+
gatherContext: async (options) => {
|
|
54
|
+
const packageManager = await (0, utils_1.detectPackageManager)(options);
|
|
55
|
+
return { packageManager };
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
detection: {
|
|
59
|
+
packageName: 'python',
|
|
60
|
+
packageDisplayName: 'Python',
|
|
61
|
+
usesPackageJson: false,
|
|
62
|
+
getVersion: () => undefined,
|
|
63
|
+
getVersionBucket: utils_1.getPythonVersionBucket,
|
|
64
|
+
minimumVersion: '3.8.0',
|
|
65
|
+
getInstalledVersion: (options) => Promise.resolve((0, utils_1.getPythonVersion)(options)),
|
|
66
|
+
detect: async (options) => {
|
|
67
|
+
const { installDir } = options;
|
|
68
|
+
// Look for Python package management files
|
|
69
|
+
const pythonConfigFiles = await (0, fast_glob_1.default)([
|
|
70
|
+
'**/requirements*.txt',
|
|
71
|
+
'**/pyproject.toml',
|
|
72
|
+
'**/setup.py',
|
|
73
|
+
'**/Pipfile',
|
|
74
|
+
], {
|
|
75
|
+
cwd: installDir,
|
|
76
|
+
ignore: ['**/venv/**', '**/.venv/**', '**/env/**', '**/.env/**'],
|
|
77
|
+
});
|
|
78
|
+
if (pythonConfigFiles.length === 0) {
|
|
79
|
+
return false;
|
|
80
|
+
}
|
|
81
|
+
// Make sure this isn't Django or Flask (those should be detected first)
|
|
82
|
+
// Check for Django
|
|
83
|
+
const managePyMatches = await (0, fast_glob_1.default)('**/manage.py', {
|
|
84
|
+
cwd: installDir,
|
|
85
|
+
ignore: ['**/venv/**', '**/.venv/**', '**/env/**', '**/.env/**'],
|
|
86
|
+
});
|
|
87
|
+
for (const match of managePyMatches) {
|
|
88
|
+
try {
|
|
89
|
+
const content = fs.readFileSync(path.join(installDir, match), 'utf-8');
|
|
90
|
+
if (content.includes('django') ||
|
|
91
|
+
content.includes('DJANGO_SETTINGS_MODULE')) {
|
|
92
|
+
return false; // Django detected, use django agent instead
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Check for Flask
|
|
100
|
+
for (const configFile of pythonConfigFiles) {
|
|
101
|
+
try {
|
|
102
|
+
const content = fs.readFileSync(path.join(installDir, configFile), 'utf-8');
|
|
103
|
+
if (/^flask([<>=~!]|$|\s)/im.test(content) ||
|
|
104
|
+
/["']flask["']/i.test(content)) {
|
|
105
|
+
return false; // Flask detected, use flask agent instead
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const pyFiles = await (0, fast_glob_1.default)(['**/app.py', '**/wsgi.py', '**/application.py', '**/__init__.py'], {
|
|
113
|
+
cwd: installDir,
|
|
114
|
+
ignore: [
|
|
115
|
+
'**/venv/**',
|
|
116
|
+
'**/.venv/**',
|
|
117
|
+
'**/env/**',
|
|
118
|
+
'**/.env/**',
|
|
119
|
+
'**/__pycache__/**',
|
|
120
|
+
],
|
|
121
|
+
});
|
|
122
|
+
for (const pyFile of pyFiles) {
|
|
123
|
+
try {
|
|
124
|
+
const content = fs.readFileSync(path.join(installDir, pyFile), 'utf-8');
|
|
125
|
+
if (content.includes('from flask import') ||
|
|
126
|
+
content.includes('import flask') ||
|
|
127
|
+
/Flask\s*\(/.test(content)) {
|
|
128
|
+
return false; // Flask detected, use flask agent instead
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
continue;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
// If we have Python config files but it's not Django or Flask, it's a generic Python project
|
|
136
|
+
return true;
|
|
137
|
+
},
|
|
138
|
+
detectPackageManager: package_manager_detection_1.detectPythonPackageManagers,
|
|
139
|
+
},
|
|
140
|
+
environment: {
|
|
141
|
+
uploadToHosting: false,
|
|
142
|
+
getEnvVars: (apiKey, _host) => ({
|
|
143
|
+
AMPLITUDE_API_KEY: apiKey,
|
|
144
|
+
}),
|
|
145
|
+
},
|
|
146
|
+
analytics: {
|
|
147
|
+
getTags: (context) => {
|
|
148
|
+
const packageManagerName = context.packageManager
|
|
149
|
+
? (0, utils_1.getPackageManagerName)(context.packageManager)
|
|
150
|
+
: 'unknown';
|
|
151
|
+
return {
|
|
152
|
+
packageManager: packageManagerName,
|
|
153
|
+
};
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
prompts: {
|
|
157
|
+
packageInstallation: framework_config_1.PYTHON_PACKAGE_INSTALLATION,
|
|
158
|
+
projectTypeDetection: 'This is a generic Python project. Look for requirements.txt, pyproject.toml, setup.py, or Pipfile to confirm.',
|
|
159
|
+
getAdditionalContextLines: (context) => {
|
|
160
|
+
const packageManagerName = context.packageManager
|
|
161
|
+
? (0, utils_1.getPackageManagerName)(context.packageManager)
|
|
162
|
+
: 'unknown';
|
|
163
|
+
return [
|
|
164
|
+
`Package manager: ${packageManagerName}`,
|
|
165
|
+
`Framework docs ID: python (use amplitude://docs/frameworks/python for documentation)`,
|
|
166
|
+
`Project type: Generic Python application (CLI, script, worker, data pipeline, etc.)`,
|
|
167
|
+
];
|
|
168
|
+
},
|
|
169
|
+
},
|
|
170
|
+
ui: {
|
|
171
|
+
successMessage: 'Amplitude integration complete',
|
|
172
|
+
estimatedDurationMinutes: 5,
|
|
173
|
+
getOutroChanges: (context) => {
|
|
174
|
+
const packageManagerName = context.packageManager
|
|
175
|
+
? (0, utils_1.getPackageManagerName)(context.packageManager)
|
|
176
|
+
: 'package manager';
|
|
177
|
+
return [
|
|
178
|
+
`Analyzed your Python project structure`,
|
|
179
|
+
`Installed the Amplitude Python package using ${packageManagerName}`,
|
|
180
|
+
`Created Amplitude initialization using instance-based API (Amplitude class)`,
|
|
181
|
+
`Configured exception autocapture and graceful shutdown`,
|
|
182
|
+
`Added example code for events, feature flags, and error capture (without PII)`,
|
|
183
|
+
];
|
|
184
|
+
},
|
|
185
|
+
getOutroNextSteps: () => [
|
|
186
|
+
'Use the Amplitude client for all tracking calls',
|
|
187
|
+
'Call amplitude_client.shutdown() on application exit (use atexit.register)',
|
|
188
|
+
'NEVER send PII in event properties (no emails, names, or user content)',
|
|
189
|
+
'Use amplitude_client.track() for events and amplitude_client.identify() for users',
|
|
190
|
+
'Visit your Amplitude dashboard to see incoming events',
|
|
191
|
+
],
|
|
192
|
+
},
|
|
193
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { WizardOptions } from '../../utils/types';
|
|
2
|
+
export declare enum PythonPackageManager {
|
|
3
|
+
UV = "uv",
|
|
4
|
+
POETRY = "poetry",
|
|
5
|
+
PDM = "pdm",
|
|
6
|
+
HATCH = "hatch",
|
|
7
|
+
RYE = "rye",
|
|
8
|
+
PIPENV = "pipenv",
|
|
9
|
+
CONDA = "conda",
|
|
10
|
+
PIP = "pip",
|
|
11
|
+
UNKNOWN = "unknown"
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Get the installed Python version
|
|
15
|
+
*/
|
|
16
|
+
export declare function getPythonVersion(options: WizardOptions): string | undefined;
|
|
17
|
+
/**
|
|
18
|
+
* Bucket Python version for analytics (e.g., "3.11.x" -> "3.11")
|
|
19
|
+
*/
|
|
20
|
+
export declare function getPythonVersionBucket(version: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Detect which package manager the project uses
|
|
23
|
+
*/
|
|
24
|
+
export declare function detectPackageManager(options: WizardOptions): Promise<PythonPackageManager>;
|
|
25
|
+
/**
|
|
26
|
+
* Get package manager display name
|
|
27
|
+
*/
|
|
28
|
+
export declare function getPackageManagerName(packageManager: PythonPackageManager): string;
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PythonPackageManager = void 0;
|
|
4
|
+
exports.getPythonVersion = getPythonVersion;
|
|
5
|
+
exports.getPythonVersionBucket = getPythonVersionBucket;
|
|
6
|
+
exports.detectPackageManager = detectPackageManager;
|
|
7
|
+
exports.getPackageManagerName = getPackageManagerName;
|
|
8
|
+
const node_child_process_1 = require("node:child_process");
|
|
9
|
+
var PythonPackageManager;
|
|
10
|
+
(function (PythonPackageManager) {
|
|
11
|
+
PythonPackageManager["UV"] = "uv";
|
|
12
|
+
PythonPackageManager["POETRY"] = "poetry";
|
|
13
|
+
PythonPackageManager["PDM"] = "pdm";
|
|
14
|
+
PythonPackageManager["HATCH"] = "hatch";
|
|
15
|
+
PythonPackageManager["RYE"] = "rye";
|
|
16
|
+
PythonPackageManager["PIPENV"] = "pipenv";
|
|
17
|
+
PythonPackageManager["CONDA"] = "conda";
|
|
18
|
+
PythonPackageManager["PIP"] = "pip";
|
|
19
|
+
PythonPackageManager["UNKNOWN"] = "unknown";
|
|
20
|
+
})(PythonPackageManager || (exports.PythonPackageManager = PythonPackageManager = {}));
|
|
21
|
+
/**
|
|
22
|
+
* Get the installed Python version
|
|
23
|
+
*/
|
|
24
|
+
function getPythonVersion(options) {
|
|
25
|
+
try {
|
|
26
|
+
const version = (0, node_child_process_1.execSync)('python --version || python3 --version', {
|
|
27
|
+
cwd: options.installDir,
|
|
28
|
+
encoding: 'utf-8',
|
|
29
|
+
})
|
|
30
|
+
.trim()
|
|
31
|
+
.replace('Python ', '');
|
|
32
|
+
return version;
|
|
33
|
+
}
|
|
34
|
+
catch {
|
|
35
|
+
return undefined;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Bucket Python version for analytics (e.g., "3.11.x" -> "3.11")
|
|
40
|
+
*/
|
|
41
|
+
function getPythonVersionBucket(version) {
|
|
42
|
+
const match = version.match(/^(\d+\.\d+)/);
|
|
43
|
+
return match ? match[1] : version;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Detect which package manager the project uses
|
|
47
|
+
*/
|
|
48
|
+
async function detectPackageManager(options) {
|
|
49
|
+
const { installDir } = options;
|
|
50
|
+
const fs = await import('node:fs');
|
|
51
|
+
const path = await import('node:path');
|
|
52
|
+
// Check for uv (uv.lock)
|
|
53
|
+
if (fs.existsSync(path.join(installDir, 'uv.lock'))) {
|
|
54
|
+
return PythonPackageManager.UV;
|
|
55
|
+
}
|
|
56
|
+
// Check pyproject.toml for various tools
|
|
57
|
+
if (fs.existsSync(path.join(installDir, 'pyproject.toml'))) {
|
|
58
|
+
try {
|
|
59
|
+
const content = fs.readFileSync(path.join(installDir, 'pyproject.toml'), 'utf-8');
|
|
60
|
+
// Check for Poetry
|
|
61
|
+
if (content.includes('[tool.poetry]')) {
|
|
62
|
+
return PythonPackageManager.POETRY;
|
|
63
|
+
}
|
|
64
|
+
// Check for PDM
|
|
65
|
+
if (content.includes('[tool.pdm]')) {
|
|
66
|
+
return PythonPackageManager.PDM;
|
|
67
|
+
}
|
|
68
|
+
// Check for Hatch
|
|
69
|
+
if (content.includes('[tool.hatch]')) {
|
|
70
|
+
return PythonPackageManager.HATCH;
|
|
71
|
+
}
|
|
72
|
+
// Check for Rye
|
|
73
|
+
if (content.includes('[tool.rye]')) {
|
|
74
|
+
return PythonPackageManager.RYE;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Continue checking
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
// Check for Poetry lock file
|
|
82
|
+
if (fs.existsSync(path.join(installDir, 'poetry.lock'))) {
|
|
83
|
+
return PythonPackageManager.POETRY;
|
|
84
|
+
}
|
|
85
|
+
// Check for PDM lock file
|
|
86
|
+
if (fs.existsSync(path.join(installDir, 'pdm.lock'))) {
|
|
87
|
+
return PythonPackageManager.PDM;
|
|
88
|
+
}
|
|
89
|
+
// Check for Pipenv (Pipfile or Pipfile.lock)
|
|
90
|
+
if (fs.existsSync(path.join(installDir, 'Pipfile')) ||
|
|
91
|
+
fs.existsSync(path.join(installDir, 'Pipfile.lock'))) {
|
|
92
|
+
return PythonPackageManager.PIPENV;
|
|
93
|
+
}
|
|
94
|
+
// Check for Conda (environment.yml or environment.yaml)
|
|
95
|
+
if (fs.existsSync(path.join(installDir, 'environment.yml')) ||
|
|
96
|
+
fs.existsSync(path.join(installDir, 'environment.yaml'))) {
|
|
97
|
+
return PythonPackageManager.CONDA;
|
|
98
|
+
}
|
|
99
|
+
// Check for pip (requirements.txt, setup.py, setup.cfg, or pyproject.toml)
|
|
100
|
+
if (fs.existsSync(path.join(installDir, 'requirements.txt')) ||
|
|
101
|
+
fs.existsSync(path.join(installDir, 'setup.py')) ||
|
|
102
|
+
fs.existsSync(path.join(installDir, 'setup.cfg')) ||
|
|
103
|
+
fs.existsSync(path.join(installDir, 'pyproject.toml'))) {
|
|
104
|
+
return PythonPackageManager.PIP;
|
|
105
|
+
}
|
|
106
|
+
// Check for requirements directory
|
|
107
|
+
try {
|
|
108
|
+
const requirementsDir = path.join(installDir, 'requirements');
|
|
109
|
+
if (fs.existsSync(requirementsDir) &&
|
|
110
|
+
fs.statSync(requirementsDir).isDirectory()) {
|
|
111
|
+
const files = fs.readdirSync(requirementsDir);
|
|
112
|
+
if (files.some((f) => f.endsWith('.txt'))) {
|
|
113
|
+
return PythonPackageManager.PIP;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
catch {
|
|
118
|
+
// Continue
|
|
119
|
+
}
|
|
120
|
+
return PythonPackageManager.UNKNOWN;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Get package manager display name
|
|
124
|
+
*/
|
|
125
|
+
function getPackageManagerName(packageManager) {
|
|
126
|
+
switch (packageManager) {
|
|
127
|
+
case PythonPackageManager.UV:
|
|
128
|
+
return 'uv';
|
|
129
|
+
case PythonPackageManager.POETRY:
|
|
130
|
+
return 'Poetry';
|
|
131
|
+
case PythonPackageManager.PDM:
|
|
132
|
+
return 'PDM';
|
|
133
|
+
case PythonPackageManager.HATCH:
|
|
134
|
+
return 'Hatch';
|
|
135
|
+
case PythonPackageManager.RYE:
|
|
136
|
+
return 'Rye';
|
|
137
|
+
case PythonPackageManager.PIPENV:
|
|
138
|
+
return 'Pipenv';
|
|
139
|
+
case PythonPackageManager.CONDA:
|
|
140
|
+
return 'Conda';
|
|
141
|
+
case PythonPackageManager.PIP:
|
|
142
|
+
return 'pip';
|
|
143
|
+
case PythonPackageManager.UNKNOWN:
|
|
144
|
+
return 'unknown';
|
|
145
|
+
}
|
|
146
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.REACT_NATIVE_AGENT_CONFIG = void 0;
|
|
4
|
+
const package_manager_detection_1 = require("../../lib/package-manager-detection");
|
|
5
|
+
const constants_1 = require("../../lib/constants");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
exports.REACT_NATIVE_AGENT_CONFIG = {
|
|
8
|
+
metadata: {
|
|
9
|
+
name: 'React Native',
|
|
10
|
+
integration: constants_1.Integration.reactNative,
|
|
11
|
+
beta: true,
|
|
12
|
+
docsUrl: 'https://amplitude.com/docs/sdks/analytics/react-native/react-native-sdk',
|
|
13
|
+
gatherContext: async (options) => {
|
|
14
|
+
const isExpo = await (0, utils_1.detectExpo)(options);
|
|
15
|
+
return { isExpo };
|
|
16
|
+
},
|
|
17
|
+
},
|
|
18
|
+
detection: {
|
|
19
|
+
packageName: 'react-native',
|
|
20
|
+
packageDisplayName: 'React Native',
|
|
21
|
+
usesPackageJson: true,
|
|
22
|
+
getVersion: () => undefined,
|
|
23
|
+
detect: utils_1.detectReactNativeProject,
|
|
24
|
+
detectPackageManager: package_manager_detection_1.detectNodePackageManagers,
|
|
25
|
+
},
|
|
26
|
+
environment: {
|
|
27
|
+
uploadToHosting: false,
|
|
28
|
+
// Expo uses EXPO_PUBLIC_ prefix; bare RN uses plain env vars via react-native-config.
|
|
29
|
+
// The agent handles the correct naming based on context — we write a neutral key
|
|
30
|
+
// here as a placeholder and the agent will rename as appropriate.
|
|
31
|
+
getEnvVars: (apiKey, host) => ({
|
|
32
|
+
AMPLITUDE_API_KEY: apiKey,
|
|
33
|
+
AMPLITUDE_SERVER_URL: host,
|
|
34
|
+
}),
|
|
35
|
+
},
|
|
36
|
+
analytics: {
|
|
37
|
+
getTags: (context) => ({
|
|
38
|
+
isExpo: context.isExpo ? 'true' : 'false',
|
|
39
|
+
}),
|
|
40
|
+
},
|
|
41
|
+
prompts: {
|
|
42
|
+
projectTypeDetection: 'This is a JavaScript/TypeScript project. Look for package.json with a `react-native` dependency to confirm.',
|
|
43
|
+
packageInstallation: 'Use the detect_package_manager tool. For Expo projects use `expo install`; for bare React Native use npm/yarn/pnpm. Always install both @amplitude/analytics-react-native AND @react-native-async-storage/async-storage. For bare React Native, also run `cd ios && pod install` after installing.',
|
|
44
|
+
getAdditionalContextLines: (context) => {
|
|
45
|
+
const envVarName = context.isExpo
|
|
46
|
+
? 'EXPO_PUBLIC_AMPLITUDE_API_KEY'
|
|
47
|
+
: 'AMPLITUDE_API_KEY';
|
|
48
|
+
const installCmd = context.isExpo
|
|
49
|
+
? 'expo install @amplitude/analytics-react-native @react-native-async-storage/async-storage'
|
|
50
|
+
: 'npm install @amplitude/analytics-react-native @react-native-async-storage/async-storage';
|
|
51
|
+
return [
|
|
52
|
+
`Project type: ${context.isExpo ? 'Expo' : 'Bare React Native'}`,
|
|
53
|
+
`Framework docs ID: react-native (use amplitude://docs/frameworks/react-native for documentation)`,
|
|
54
|
+
`SDK: @amplitude/analytics-react-native — do NOT use @amplitude/unified (not supported for React Native)`,
|
|
55
|
+
`Install command: ${installCmd}`,
|
|
56
|
+
`Environment variable name: ${envVarName}`,
|
|
57
|
+
`Initialization: import { init } from '@amplitude/analytics-react-native'; init(process.env.${envVarName});`,
|
|
58
|
+
context.isExpo
|
|
59
|
+
? `Expo env vars require the EXPO_PUBLIC_ prefix to be available in client-side code`
|
|
60
|
+
: `For bare RN, use react-native-config or inline the key via a constants file — never commit API keys to source`,
|
|
61
|
+
];
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
ui: {
|
|
65
|
+
successMessage: 'Amplitude integration complete',
|
|
66
|
+
estimatedDurationMinutes: 8,
|
|
67
|
+
getOutroChanges: (context) => {
|
|
68
|
+
const variant = context.isExpo ? 'Expo' : 'Bare React Native';
|
|
69
|
+
return [
|
|
70
|
+
`Analyzed your ${variant} project structure`,
|
|
71
|
+
`Installed @amplitude/analytics-react-native and async-storage peer dependency`,
|
|
72
|
+
`Configured Amplitude initialization`,
|
|
73
|
+
];
|
|
74
|
+
},
|
|
75
|
+
getOutroNextSteps: (context) => [
|
|
76
|
+
context.isExpo
|
|
77
|
+
? 'Run `expo start` to launch the app and verify events'
|
|
78
|
+
: 'Run `npx react-native run-ios` or `run-android` to verify events',
|
|
79
|
+
'Visit your Amplitude dashboard to see incoming events',
|
|
80
|
+
"Use track('Event Name', { prop: value }) for custom events",
|
|
81
|
+
'Use setUserId("user@example.com") to associate events with users',
|
|
82
|
+
],
|
|
83
|
+
},
|
|
84
|
+
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { WizardOptions } from '../../utils/types';
|
|
2
|
+
/**
|
|
3
|
+
* Returns true when the directory contains a React Native project.
|
|
4
|
+
*
|
|
5
|
+
* Primary signal: package.json with `react-native` in dependencies or
|
|
6
|
+
* devDependencies. This is the definitive indicator that distinguishes
|
|
7
|
+
* React Native from:
|
|
8
|
+
* - Plain web apps (Next.js, Vite, CRA) — no `react-native` dep
|
|
9
|
+
* - Pure Android native projects — no package.json at all
|
|
10
|
+
* - Flutter — uses pubspec.yaml, detected earlier in the pipeline
|
|
11
|
+
*
|
|
12
|
+
* Note: The `javascript-web` detector already excludes `react-native`
|
|
13
|
+
* via FRAMEWORK_PACKAGES, and this detector runs before `android` in
|
|
14
|
+
* the registry so AndroidManifest.xml overlap is not a concern.
|
|
15
|
+
*/
|
|
16
|
+
export declare function detectReactNativeProject(options: Pick<WizardOptions, 'installDir'>): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Returns true if the React Native project uses Expo.
|
|
19
|
+
* Checks for `expo` package or an app.json with a top-level "expo" key.
|
|
20
|
+
*/
|
|
21
|
+
export declare function detectExpo(options: Pick<WizardOptions, 'installDir'>): Promise<boolean>;
|