@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,354 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Amplitude OAuth2/PKCE flow — adapted from Amplitude wizard's oauth.ts but
|
|
4
|
+
* hitting Amplitude's auth endpoints (same as the ampli CLI).
|
|
5
|
+
*
|
|
6
|
+
* Key difference from Amplitude: checks ~/.ampli.json for an existing ampli CLI
|
|
7
|
+
* session first, so users who ran `ampli login` can skip re-authenticating.
|
|
8
|
+
*/
|
|
9
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
12
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
13
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
14
|
+
}
|
|
15
|
+
Object.defineProperty(o, k2, desc);
|
|
16
|
+
}) : (function(o, m, k, k2) {
|
|
17
|
+
if (k2 === undefined) k2 = k;
|
|
18
|
+
o[k2] = m[k];
|
|
19
|
+
}));
|
|
20
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
21
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
22
|
+
}) : function(o, v) {
|
|
23
|
+
o["default"] = v;
|
|
24
|
+
});
|
|
25
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
26
|
+
var ownKeys = function(o) {
|
|
27
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
28
|
+
var ar = [];
|
|
29
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
30
|
+
return ar;
|
|
31
|
+
};
|
|
32
|
+
return ownKeys(o);
|
|
33
|
+
};
|
|
34
|
+
return function (mod) {
|
|
35
|
+
if (mod && mod.__esModule) return mod;
|
|
36
|
+
var result = {};
|
|
37
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
38
|
+
__setModuleDefault(result, mod);
|
|
39
|
+
return result;
|
|
40
|
+
};
|
|
41
|
+
})();
|
|
42
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
43
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
44
|
+
};
|
|
45
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
46
|
+
exports.performAmplitudeAuth = performAmplitudeAuth;
|
|
47
|
+
exports.refreshAccessToken = refreshAccessToken;
|
|
48
|
+
exports.performOAuthFlow = performOAuthFlow;
|
|
49
|
+
const crypto = __importStar(require("node:crypto"));
|
|
50
|
+
const http = __importStar(require("node:http"));
|
|
51
|
+
const axios_1 = __importDefault(require("axios"));
|
|
52
|
+
const chalk_1 = __importDefault(require("chalk"));
|
|
53
|
+
const opn_1 = __importDefault(require("opn"));
|
|
54
|
+
const zod_1 = require("zod");
|
|
55
|
+
const index_js_1 = require("../ui/index.js");
|
|
56
|
+
const debug_js_1 = require("./debug.js");
|
|
57
|
+
const constants_js_1 = require("../lib/constants.js");
|
|
58
|
+
const setup_utils_js_1 = require("./setup-utils.js");
|
|
59
|
+
const analytics_js_1 = require("./analytics.js");
|
|
60
|
+
const ampli_settings_js_1 = require("./ampli-settings.js");
|
|
61
|
+
// SVG assets inlined from ../javascript
|
|
62
|
+
const AMPLITUDE_WORDMARK_SVG = `<svg width="154" height="32" viewBox="0 0 154 32" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M44.5719 5.76886L37.6178 23.2015H40.7052L42.0785 19.7126H49.446L50.7956 23.2015H53.9556L47.0134 5.76886H44.5719ZM43.1497 16.9289L45.763 10.2548L48.3526 16.9289H43.1497Z" fill="#1E61F0"/><path d="M69.76 10.7778C68.9245 10.7778 68.1556 10.9704 67.4504 11.3555C66.7452 11.7407 66.2222 12.2622 65.8815 12.917C65.16 11.4904 63.9037 10.7778 62.1126 10.7778C61.3911 10.7778 60.6963 10.9333 60.0282 11.2459C59.36 11.5585 58.8193 12.0593 58.4059 12.7467V11.0326H55.6459V23.2015H58.4059V16.3807C58.4059 15.4089 58.6711 14.6755 59.2015 14.1807C59.7319 13.6859 60.3704 13.4385 61.1156 13.4385C61.9422 13.4385 62.5941 13.6993 63.0726 14.2222C63.5511 14.7452 63.7896 15.4637 63.7896 16.3793V23.2H66.5733V16.3793C66.5733 15.4074 66.8371 14.6741 67.363 14.1793C67.8904 13.6844 68.5304 13.437 69.2845 13.437C70.1022 13.437 70.7467 13.6978 71.2178 14.2207C71.6874 14.7437 71.923 15.4622 71.923 16.3778V23.1985H74.7437V15.7585C74.7437 14.243 74.2845 13.0326 73.3645 12.1289C72.4445 11.2296 71.243 10.7778 69.76 10.7778Z" fill="#1E61F0"/><path d="M87.4741 11.6281C86.5867 11.0607 85.6119 10.7778 84.5496 10.7778C83.5778 10.7778 82.7215 10.9881 81.9852 11.4104C81.2474 11.8326 80.6548 12.4355 80.2104 13.2222V11.0341H77.4504V27.4578H80.2104V21.0148C80.6563 21.7926 81.2474 22.3926 81.9852 22.8133C82.723 23.2355 83.5778 23.4459 84.5496 23.4459C86.163 23.4459 87.5319 22.8311 88.6593 21.6044C89.7852 20.3763 90.3482 18.883 90.3482 17.1244C90.3482 15.9733 90.0904 14.9126 89.5763 13.9393C89.0622 12.9659 88.3615 12.1955 87.4741 11.6281ZM86.5556 19.7304C85.843 20.4474 84.9719 20.8059 83.9422 20.8059C82.8726 20.8059 81.9822 20.4533 81.2741 19.7481C80.5645 19.043 80.2104 18.1674 80.2104 17.1215C80.2104 16.0593 80.5645 15.1763 81.2741 14.4711C81.9837 13.7659 82.8726 13.4133 83.9422 13.4133C84.9719 13.4133 85.843 13.7718 86.5556 14.4889C87.2696 15.2059 87.6252 16.083 87.6252 17.1215C87.6267 18.1452 87.2696 19.0133 86.5556 19.7304Z" fill="#1E61F0"/><path d="M95.2978 5.76886H92.5378V23.2015H95.2978V5.76886Z" fill="#1E61F0"/><path d="M100.738 11.0326H97.9778V23.2015H100.738V11.0326Z" fill="#1E61F0"/><path d="M99.3763 5.37927C98.8904 5.37927 98.4726 5.55409 98.1245 5.90224C97.7763 6.25038 97.6015 6.66372 97.6015 7.14224C97.6015 7.63705 97.7748 8.05779 98.1245 8.40742C98.4726 8.75557 98.8904 8.93038 99.3763 8.93038C99.8622 8.93038 100.283 8.75557 100.636 8.40742C100.988 8.05927 101.164 7.63705 101.164 7.14224C101.164 6.66372 100.988 6.25038 100.636 5.90224C100.281 5.55409 99.8622 5.37927 99.3763 5.37927Z" fill="#1E61F0"/><path d="M107.594 7.76294H104.81V11.0326H102.501V13.6711H104.81V18.6192C104.81 20.1348 105.215 21.3022 106.027 22.12C106.837 22.9392 107.927 23.3481 109.296 23.3481C109.864 23.3481 110.363 23.2992 110.791 23.2015V20.637C110.541 20.7022 110.24 20.7348 109.892 20.7348C109.178 20.7348 108.618 20.5585 108.209 20.2059C107.8 19.8533 107.594 19.3081 107.594 18.5703V13.6711H110.791V11.0326H107.594V7.76294Z" fill="#1E61F0"/><path d="M121.44 17.6222C121.44 18.5778 121.167 19.3437 120.619 19.92C120.073 20.4948 119.35 20.7837 118.449 20.7837C117.557 20.7837 116.84 20.4963 116.296 19.92C115.753 19.3452 115.481 18.5793 115.481 17.6222V11.0326H112.721V17.9496C112.721 19.6593 113.172 21.003 114.071 21.9793C114.97 22.9556 116.206 23.4444 117.779 23.4444C118.582 23.4444 119.295 23.2578 119.919 22.8844C120.542 22.5126 121.049 21.9778 121.439 21.28V23.2015H124.222V11.0326H121.439V17.6222H121.44Z" fill="#1E61F0"/><path d="M136.486 13.1718C136.04 12.4015 135.453 11.8103 134.723 11.397C133.994 10.9837 133.147 10.7777 132.182 10.7777C131.12 10.7777 130.144 11.0577 129.253 11.6163C128.361 12.1748 127.656 12.9407 127.138 13.914C126.619 14.8874 126.36 15.9481 126.36 17.0992C126.36 18.2503 126.619 19.314 127.138 20.2903C127.656 21.2666 128.361 22.037 129.253 22.6C130.145 23.1629 131.121 23.4444 132.182 23.4444C133.147 23.4444 133.994 23.24 134.723 22.8296C135.452 22.4207 136.04 21.8311 136.486 21.0607V23.2H139.283V5.76886H136.486V13.1718ZM135.424 19.7437C134.714 20.4533 133.833 20.8074 132.779 20.8074C131.75 20.8074 130.879 20.4489 130.166 19.7318C129.452 19.0148 129.096 18.1377 129.096 17.0992C129.096 16.0785 129.453 15.2089 130.166 14.4918C130.879 13.7748 131.75 13.4163 132.779 13.4163C133.833 13.4163 134.714 13.7689 135.424 14.474C136.133 15.1792 136.487 16.0548 136.487 17.1007C136.486 18.1526 136.132 19.034 135.424 19.7437Z" fill="#1E61F0"/><path d="M153.591 16.8563C153.591 15.6978 153.323 14.6504 152.788 13.7141C152.253 12.7778 151.533 12.0548 150.63 11.5437C149.726 11.0326 148.73 10.7778 147.644 10.7778C146.493 10.7778 145.439 11.0533 144.477 11.6044C143.517 12.1555 142.759 12.9111 142.203 13.8711C141.647 14.8311 141.37 15.8918 141.37 17.0504C141.37 18.2415 141.647 19.3274 142.203 20.3081C142.759 21.2889 143.519 22.0563 144.483 22.6118C145.447 23.1674 146.517 23.4444 147.693 23.4444C149.193 23.4444 150.468 23.0548 151.523 22.277C152.576 21.4993 153.216 20.4696 153.444 19.1896H150.661C150.539 19.7081 150.209 20.1304 149.67 20.4533C149.13 20.7778 148.489 20.9393 147.742 20.9393C146.778 20.9393 145.988 20.68 145.372 20.1615C144.756 19.643 144.359 18.9304 144.181 18.0222H153.517C153.567 17.8044 153.591 17.4148 153.591 16.8563ZM144.255 15.6518C144.458 14.9052 144.841 14.3259 145.41 13.9126C145.978 13.4993 146.67 13.2918 147.489 13.2918C148.316 13.2918 149.006 13.5096 149.561 13.9422C150.117 14.3763 150.455 14.9452 150.576 15.6504H144.255V15.6518Z" fill="#1E61F0"/><path d="M14.1037 7.20294C14.0134 7.08739 13.9171 7.02368 13.8015 7.02368C13.7185 7.02961 13.6415 7.05627 13.5704 7.10072C12.7156 7.76887 11.5526 10.6029 10.5956 14.3422L11.4445 14.3481C13.1156 14.3674 14.843 14.3866 16.5467 14.4118C16.0963 12.7022 15.6726 11.237 15.2815 10.0489C14.7082 8.32146 14.323 7.54368 14.1037 7.20294Z" fill="#1E61F0"/><path d="M16 0C7.16444 0 0 7.16444 0 16C0 24.8356 7.16444 32 16 32C24.8356 32 32 24.8356 32 16C32 7.16444 24.8356 0 16 0ZM27.8104 15.8074C27.7659 15.9867 27.6563 16.1615 27.5022 16.2889C27.483 16.3022 27.4637 16.3141 27.4444 16.3274L27.4252 16.3407L27.3867 16.3659L27.3541 16.3852C27.2326 16.4489 27.0963 16.4815 26.9556 16.4815H19.3733C19.4311 16.7319 19.5022 17.0207 19.5719 17.3304C19.9896 19.123 21.0889 23.8904 22.2637 23.8904H22.2889H22.3022H22.3274C23.24 23.8904 23.7096 22.5674 24.7378 19.6681L24.7511 19.6356C24.9185 19.1733 25.1052 18.6459 25.3037 18.0874L25.3556 17.9467C25.4326 17.76 25.6444 17.6637 25.8311 17.7407C25.9659 17.7926 26.0622 17.9274 26.0622 18.0756C26.0622 18.1141 26.0563 18.1467 26.0489 18.1778L26.0044 18.3185C25.8948 18.6652 25.7867 19.1348 25.6504 19.6815C25.04 22.2133 24.1141 26.037 21.7496 26.037H21.7304C20.2015 26.0237 19.2889 23.5822 18.8963 22.5348C18.1644 20.5807 17.6119 18.5052 17.0785 16.4889H10.1141L8.66815 21.1215L8.64889 21.1022C8.43111 21.443 7.97482 21.5452 7.63407 21.3274C7.42222 21.1926 7.29333 20.9615 7.29333 20.7111V20.6859L7.3837 20.1585C7.58222 18.9704 7.82667 17.7289 8.0963 16.483H5.14074L5.12741 16.4696C4.52296 16.3793 4.10518 15.8148 4.19555 15.2104C4.26667 14.7407 4.62667 14.3689 5.08889 14.2844C5.20444 14.2711 5.32 14.2652 5.43556 14.2711H5.5763C6.50815 14.2844 7.49778 14.3037 8.58963 14.3156C10.1259 8.06963 11.9052 4.89481 13.8844 4.88889C16.0044 4.88889 17.5793 9.71407 18.8385 14.437L18.8444 14.4563C21.4281 14.5081 24.1911 14.5852 26.8696 14.7778L26.9852 14.7911C27.0296 14.7911 27.0681 14.797 27.1141 14.8044H27.1274L27.1407 14.8104H27.1467C27.6044 14.9007 27.9067 15.3511 27.8104 15.8074Z" fill="#1E61F0"/></svg>`;
|
|
63
|
+
const OAUTH_CALLBACK_STYLES = `
|
|
64
|
+
<style>
|
|
65
|
+
*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
|
|
66
|
+
body {
|
|
67
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Inter', 'Segoe UI', sans-serif;
|
|
68
|
+
background: #f5f6fa;
|
|
69
|
+
min-height: 100vh;
|
|
70
|
+
display: flex;
|
|
71
|
+
align-items: center;
|
|
72
|
+
justify-content: center;
|
|
73
|
+
color: #1a1a2e;
|
|
74
|
+
}
|
|
75
|
+
.card {
|
|
76
|
+
background: #fff;
|
|
77
|
+
border-radius: 12px;
|
|
78
|
+
box-shadow: 0 2px 16px rgba(0,0,0,0.08);
|
|
79
|
+
padding: 48px 40px;
|
|
80
|
+
max-width: 420px;
|
|
81
|
+
width: 100%;
|
|
82
|
+
text-align: center;
|
|
83
|
+
}
|
|
84
|
+
.logo { display: flex; justify-content: center; margin-bottom: 32px; }
|
|
85
|
+
.check-icon {
|
|
86
|
+
width: 56px;
|
|
87
|
+
height: 56px;
|
|
88
|
+
border-radius: 50%;
|
|
89
|
+
background: linear-gradient(135deg, #1D4AFF 0%, #1640d6 100%);
|
|
90
|
+
display: flex;
|
|
91
|
+
align-items: center;
|
|
92
|
+
justify-content: center;
|
|
93
|
+
margin: 0 auto 20px;
|
|
94
|
+
color: #fff;
|
|
95
|
+
box-shadow: 0 8px 24px rgba(29,74,255,0.25);
|
|
96
|
+
}
|
|
97
|
+
.icon {
|
|
98
|
+
width: 56px;
|
|
99
|
+
height: 56px;
|
|
100
|
+
border-radius: 50%;
|
|
101
|
+
display: flex;
|
|
102
|
+
align-items: center;
|
|
103
|
+
justify-content: center;
|
|
104
|
+
margin: 0 auto 20px;
|
|
105
|
+
font-size: 26px;
|
|
106
|
+
}
|
|
107
|
+
.icon-error { background: #fdecea; }
|
|
108
|
+
h1 { font-size: 20px; font-weight: 600; color: #1a1a2e; margin-bottom: 10px; }
|
|
109
|
+
p { font-size: 15px; color: #6b7280; line-height: 1.5; }
|
|
110
|
+
.divider {
|
|
111
|
+
border: none;
|
|
112
|
+
border-top: 1px solid #e5e7eb;
|
|
113
|
+
margin: 32px 0 24px;
|
|
114
|
+
}
|
|
115
|
+
.promo { text-align: left; }
|
|
116
|
+
.promo-hint {
|
|
117
|
+
font-size: 13px;
|
|
118
|
+
color: #6b7280;
|
|
119
|
+
line-height: 1.5;
|
|
120
|
+
margin-top: 12px;
|
|
121
|
+
}
|
|
122
|
+
.promo-link {
|
|
123
|
+
font-size: 13px;
|
|
124
|
+
color: #1D4AFF;
|
|
125
|
+
text-decoration: none;
|
|
126
|
+
font-weight: 500;
|
|
127
|
+
}
|
|
128
|
+
.promo-link:hover { text-decoration: underline; }
|
|
129
|
+
</style>
|
|
130
|
+
`;
|
|
131
|
+
const OAuthTokenResponseSchema = zod_1.z.object({
|
|
132
|
+
access_token: zod_1.z.string(),
|
|
133
|
+
id_token: zod_1.z.string(),
|
|
134
|
+
refresh_token: zod_1.z.string(),
|
|
135
|
+
token_type: zod_1.z.string(),
|
|
136
|
+
expires_in: zod_1.z.number(),
|
|
137
|
+
});
|
|
138
|
+
function generateCodeVerifier() {
|
|
139
|
+
return crypto.randomBytes(32).toString('base64url');
|
|
140
|
+
}
|
|
141
|
+
function generateCodeChallenge(verifier) {
|
|
142
|
+
return crypto.createHash('sha256').update(verifier).digest('base64url');
|
|
143
|
+
}
|
|
144
|
+
function generateState() {
|
|
145
|
+
return crypto.randomBytes(16).toString('hex');
|
|
146
|
+
}
|
|
147
|
+
async function startCallbackServer() {
|
|
148
|
+
return new Promise((resolve, reject) => {
|
|
149
|
+
let callbackResolve;
|
|
150
|
+
let callbackReject;
|
|
151
|
+
const waitForCallback = (expectedState) => new Promise((res, rej) => {
|
|
152
|
+
callbackResolve = res;
|
|
153
|
+
callbackReject = rej;
|
|
154
|
+
void expectedState; // validated below in handleRequest
|
|
155
|
+
});
|
|
156
|
+
const server = http.createServer((req, res) => {
|
|
157
|
+
if (!req.url) {
|
|
158
|
+
res.writeHead(400);
|
|
159
|
+
res.end();
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
const url = new URL(req.url, `http://localhost:${constants_js_1.OAUTH_PORT}`);
|
|
163
|
+
const code = url.searchParams.get('code');
|
|
164
|
+
const error = url.searchParams.get('error');
|
|
165
|
+
if (error) {
|
|
166
|
+
const cancelled = error === 'access_denied';
|
|
167
|
+
res.writeHead(cancelled ? 200 : 400, {
|
|
168
|
+
'Content-Type': 'text/html; charset=utf-8',
|
|
169
|
+
});
|
|
170
|
+
res.end(`<html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Amplitude</title>${OAUTH_CALLBACK_STYLES}</head><body><div class="card"><div class="logo">${AMPLITUDE_WORDMARK_SVG}</div><div class="icon icon-error">✕</div><h1>${cancelled ? 'Sign-in cancelled' : 'Sign-in failed'}</h1><p>${cancelled
|
|
171
|
+
? 'You cancelled the sign-in.'
|
|
172
|
+
: 'Something went wrong during sign-in.'} You can close this tab and return to your terminal.</p></div><script>window.close();</script></body></html>`);
|
|
173
|
+
callbackReject(new Error(`OAuth error: ${error}`));
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
if (code) {
|
|
177
|
+
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
178
|
+
res.end(`<html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Amplitude</title>${OAUTH_CALLBACK_STYLES}</head><body><div class="card"><div class="logo">${AMPLITUDE_WORDMARK_SVG}</div><div class="check-icon"><svg width="32" height="32" viewBox="0 0 20 20" fill="currentColor" xmlns="http://www.w3.org/2000/svg"><path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zm3.857-9.809a.75.75 0 00-1.214-.882l-3.483 4.79-1.88-1.88a.75.75 0 10-1.06 1.061l2.5 2.5a.75.75 0 001.137-.089l4-5.5z" clip-rule="evenodd"/></svg></div><h1>You're signed in</h1><p>You may now close this window and return to the CLI.</p><hr class="divider"><div class="promo"><p class="promo-hint">If you want to check out Amplitude outside of the CLI, <a class="promo-link" href="https://app.amplitude.com" target="_blank" rel="noopener">open Amplitude here →</a></p></div></div><script>window.close();</script></body></html>`);
|
|
179
|
+
callbackResolve(code);
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
res.writeHead(400, { 'Content-Type': 'text/html; charset=utf-8' });
|
|
183
|
+
res.end(`<html><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Amplitude</title>${OAUTH_CALLBACK_STYLES}</head><body><div class="card"><div class="logo">${AMPLITUDE_WORDMARK_SVG}</div><div class="icon icon-error">✕</div><h1>Invalid request</h1><p>This sign-in link is invalid or has expired. Please try again from your terminal.</p></div></body></html>`);
|
|
184
|
+
}
|
|
185
|
+
});
|
|
186
|
+
server.listen(constants_js_1.OAUTH_PORT, () => resolve({ server, waitForCallback }));
|
|
187
|
+
server.on('error', reject);
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
async function exchangeCodeForToken(code, codeVerifier, zone) {
|
|
191
|
+
const { oAuthHost, oAuthClientId } = constants_js_1.AMPLITUDE_ZONE_SETTINGS[zone];
|
|
192
|
+
const response = await axios_1.default.post(`${oAuthHost}/oauth2/token`, new URLSearchParams({
|
|
193
|
+
grant_type: 'authorization_code',
|
|
194
|
+
code,
|
|
195
|
+
redirect_uri: `http://localhost:${constants_js_1.OAUTH_PORT}/callback`,
|
|
196
|
+
client_id: oAuthClientId,
|
|
197
|
+
code_verifier: codeVerifier,
|
|
198
|
+
}).toString(), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
|
|
199
|
+
return OAuthTokenResponseSchema.parse(response.data);
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Performs the Amplitude OAuth2/PKCE flow.
|
|
203
|
+
*
|
|
204
|
+
* 1. Checks ~/.ampli.json for a valid existing session (shared with ampli CLI),
|
|
205
|
+
* unless forceFresh is true (used for new projects with no local ampli.json).
|
|
206
|
+
* 2. If none, opens the browser to auth.amplitude.com and awaits callback.
|
|
207
|
+
* 3. Stores the resulting tokens back to ~/.ampli.json.
|
|
208
|
+
*/
|
|
209
|
+
async function performAmplitudeAuth(options) {
|
|
210
|
+
const zone = options.zone ?? constants_js_1.DEFAULT_AMPLITUDE_ZONE;
|
|
211
|
+
// ── 1. Try existing ampli CLI session ────────────────────────────
|
|
212
|
+
// Skip when forceFresh — used for new projects where we don't know
|
|
213
|
+
// which org applies, so the user must explicitly authenticate.
|
|
214
|
+
(0, debug_js_1.logToFile)('[oauth] performAmplitudeAuth called', {
|
|
215
|
+
zone,
|
|
216
|
+
forceFresh: options.forceFresh,
|
|
217
|
+
});
|
|
218
|
+
if (!options.forceFresh) {
|
|
219
|
+
const existing = (0, ampli_settings_js_1.getStoredToken)(undefined, zone);
|
|
220
|
+
(0, debug_js_1.logToFile)('[oauth] getStoredToken result', existing
|
|
221
|
+
? {
|
|
222
|
+
idToken: existing.idToken?.slice(0, 20) + '…',
|
|
223
|
+
hasAccess: !!existing.accessToken,
|
|
224
|
+
hasRefresh: !!existing.refreshToken,
|
|
225
|
+
}
|
|
226
|
+
: null);
|
|
227
|
+
if (existing) {
|
|
228
|
+
(0, index_js_1.getUI)().log.info(chalk_1.default.dim('Using existing Amplitude session from ~/.ampli.json'));
|
|
229
|
+
return {
|
|
230
|
+
idToken: existing.idToken,
|
|
231
|
+
accessToken: existing.accessToken,
|
|
232
|
+
refreshToken: existing.refreshToken,
|
|
233
|
+
zone,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
// ── 2. Fresh OAuth flow ──────────────────────────────────────────
|
|
238
|
+
const codeVerifier = generateCodeVerifier();
|
|
239
|
+
const codeChallenge = generateCodeChallenge(codeVerifier);
|
|
240
|
+
const state = generateState();
|
|
241
|
+
const { oAuthHost, oAuthClientId } = constants_js_1.AMPLITUDE_ZONE_SETTINGS[zone];
|
|
242
|
+
const authUrl = new URL(`${oAuthHost}/oauth2/auth`);
|
|
243
|
+
authUrl.searchParams.set('client_id', oAuthClientId);
|
|
244
|
+
authUrl.searchParams.set('redirect_uri', `http://localhost:${constants_js_1.OAUTH_PORT}/callback`);
|
|
245
|
+
authUrl.searchParams.set('response_type', 'code');
|
|
246
|
+
authUrl.searchParams.set('code_challenge', codeChallenge);
|
|
247
|
+
authUrl.searchParams.set('code_challenge_method', 'S256');
|
|
248
|
+
authUrl.searchParams.set('scope', 'openid offline');
|
|
249
|
+
authUrl.searchParams.set('state', state);
|
|
250
|
+
const { server, waitForCallback } = await startCallbackServer();
|
|
251
|
+
(0, index_js_1.getUI)().setLoginUrl(authUrl.toString());
|
|
252
|
+
if (process.env.NODE_ENV !== 'test') {
|
|
253
|
+
(0, opn_1.default)(authUrl.toString(), { wait: false }).catch(() => {
|
|
254
|
+
// No browser — user will copy-paste the URL shown by the TUI
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
const spinner = (0, index_js_1.getUI)().spinner();
|
|
258
|
+
spinner.start('Waiting for Amplitude authorization...');
|
|
259
|
+
try {
|
|
260
|
+
const code = await Promise.race([
|
|
261
|
+
waitForCallback(state),
|
|
262
|
+
new Promise((_, reject) => setTimeout(() => reject(new Error('Authorization timed out')), 120_000)),
|
|
263
|
+
]);
|
|
264
|
+
(0, debug_js_1.logToFile)('[oauth] auth code received, exchanging for token');
|
|
265
|
+
const tokenResponse = await exchangeCodeForToken(code, codeVerifier, zone);
|
|
266
|
+
(0, debug_js_1.logToFile)('[oauth] token exchange response', {
|
|
267
|
+
token_type: tokenResponse.token_type,
|
|
268
|
+
expires_in: tokenResponse.expires_in,
|
|
269
|
+
has_access_token: !!tokenResponse.access_token,
|
|
270
|
+
has_id_token: !!tokenResponse.id_token,
|
|
271
|
+
has_refresh_token: !!tokenResponse.refresh_token,
|
|
272
|
+
access_token_prefix: tokenResponse.access_token?.slice(0, 20) + '…',
|
|
273
|
+
id_token_prefix: tokenResponse.id_token?.slice(0, 20) + '…',
|
|
274
|
+
});
|
|
275
|
+
server.close();
|
|
276
|
+
(0, index_js_1.getUI)().setLoginUrl(null);
|
|
277
|
+
spinner.stop('Authorization complete!');
|
|
278
|
+
const result = {
|
|
279
|
+
idToken: tokenResponse.id_token,
|
|
280
|
+
accessToken: tokenResponse.access_token,
|
|
281
|
+
refreshToken: tokenResponse.refresh_token,
|
|
282
|
+
zone,
|
|
283
|
+
};
|
|
284
|
+
// ── 3. Persist to ~/.ampli.json (shared with ampli CLI) ──────────
|
|
285
|
+
// User details (name/email) are filled in after fetchAmplitudeUser()
|
|
286
|
+
const expiresAt = new Date(Date.now() + tokenResponse.expires_in * 1000).toISOString();
|
|
287
|
+
const pendingUser = {
|
|
288
|
+
id: 'pending',
|
|
289
|
+
firstName: '',
|
|
290
|
+
lastName: '',
|
|
291
|
+
email: '',
|
|
292
|
+
zone,
|
|
293
|
+
};
|
|
294
|
+
(0, ampli_settings_js_1.storeToken)(pendingUser, {
|
|
295
|
+
accessToken: tokenResponse.access_token,
|
|
296
|
+
idToken: tokenResponse.id_token,
|
|
297
|
+
refreshToken: tokenResponse.refresh_token,
|
|
298
|
+
expiresAt,
|
|
299
|
+
});
|
|
300
|
+
(0, debug_js_1.logToFile)('[oauth] token stored to ~/.ampli.json, returning result', {
|
|
301
|
+
zone,
|
|
302
|
+
expiresAt,
|
|
303
|
+
});
|
|
304
|
+
return result;
|
|
305
|
+
}
|
|
306
|
+
catch (e) {
|
|
307
|
+
spinner.stop('Authorization failed.');
|
|
308
|
+
server.close();
|
|
309
|
+
const error = e instanceof Error ? e : new Error('Unknown error');
|
|
310
|
+
(0, debug_js_1.logToFile)('[oauth] error during auth flow', error);
|
|
311
|
+
if (error.message.includes('timeout')) {
|
|
312
|
+
(0, index_js_1.getUI)().log.error('Authorization timed out. Please try again.');
|
|
313
|
+
}
|
|
314
|
+
else if (error.message.includes('access_denied')) {
|
|
315
|
+
(0, index_js_1.getUI)().log.info(`${chalk_1.default.yellow('Authorization was cancelled.')}\n\nRe-run the wizard to try again.`);
|
|
316
|
+
}
|
|
317
|
+
else {
|
|
318
|
+
(0, index_js_1.getUI)().log.error(`${chalk_1.default.red('Authorization failed:')}\n\n${error.message}\n\n${chalk_1.default.dim(`File an issue:\n${constants_js_1.ISSUES_URL}`)}`);
|
|
319
|
+
}
|
|
320
|
+
analytics_js_1.analytics.captureException(error, { step: 'oauth_flow' });
|
|
321
|
+
await (0, setup_utils_js_1.abort)();
|
|
322
|
+
throw error;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Exchanges a stored refresh token for a new access token.
|
|
327
|
+
* Uses the same /oauth2/token endpoint as the initial auth-code exchange.
|
|
328
|
+
*/
|
|
329
|
+
async function refreshAccessToken(refreshToken, zone = constants_js_1.DEFAULT_AMPLITUDE_ZONE) {
|
|
330
|
+
const { oAuthHost, oAuthClientId } = constants_js_1.AMPLITUDE_ZONE_SETTINGS[zone];
|
|
331
|
+
const response = await axios_1.default.post(`${oAuthHost}/oauth2/token`, new URLSearchParams({
|
|
332
|
+
grant_type: 'refresh_token',
|
|
333
|
+
refresh_token: refreshToken,
|
|
334
|
+
client_id: oAuthClientId,
|
|
335
|
+
}).toString(), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } });
|
|
336
|
+
const parsed = OAuthTokenResponseSchema.parse(response.data);
|
|
337
|
+
return {
|
|
338
|
+
accessToken: parsed.access_token,
|
|
339
|
+
idToken: parsed.id_token,
|
|
340
|
+
refreshToken: parsed.refresh_token,
|
|
341
|
+
expiresAt: new Date(Date.now() + parsed.expires_in * 1000).toISOString(),
|
|
342
|
+
};
|
|
343
|
+
}
|
|
344
|
+
/** @deprecated Use performAmplitudeAuth() directly. */
|
|
345
|
+
async function performOAuthFlow(_config) {
|
|
346
|
+
const result = await performAmplitudeAuth({});
|
|
347
|
+
return {
|
|
348
|
+
access_token: result.accessToken,
|
|
349
|
+
id_token: result.idToken,
|
|
350
|
+
refresh_token: result.refreshToken,
|
|
351
|
+
token_type: 'Bearer',
|
|
352
|
+
expires_in: 3600,
|
|
353
|
+
};
|
|
354
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export type PackageDotJson = {
|
|
2
|
+
version?: string;
|
|
3
|
+
scripts?: Record<string, string | undefined>;
|
|
4
|
+
dependencies?: Record<string, string>;
|
|
5
|
+
devDependencies?: Record<string, string>;
|
|
6
|
+
resolutions?: Record<string, string>;
|
|
7
|
+
overrides?: Record<string, string>;
|
|
8
|
+
pnpm?: {
|
|
9
|
+
overrides?: Record<string, string>;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
type NpmPackage = {
|
|
13
|
+
name: string;
|
|
14
|
+
version: string;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Checks if @param packageJson has any of the @param packageNamesList package names
|
|
18
|
+
* listed as a dependency or devDependency.
|
|
19
|
+
* If so, it returns the first package name that is found, including the
|
|
20
|
+
* version (range) specified in the package.json.
|
|
21
|
+
*/
|
|
22
|
+
export declare function findInstalledPackageFromList(packageNamesList: string[], packageJson: PackageDotJson): NpmPackage | undefined;
|
|
23
|
+
export declare function hasPackageInstalled(packageName: string, packageJson: PackageDotJson): boolean;
|
|
24
|
+
export declare function getPackageVersion(packageName: string, packageJson: PackageDotJson): string | undefined;
|
|
25
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.findInstalledPackageFromList = findInstalledPackageFromList;
|
|
4
|
+
exports.hasPackageInstalled = hasPackageInstalled;
|
|
5
|
+
exports.getPackageVersion = getPackageVersion;
|
|
6
|
+
/**
|
|
7
|
+
* Checks if @param packageJson has any of the @param packageNamesList package names
|
|
8
|
+
* listed as a dependency or devDependency.
|
|
9
|
+
* If so, it returns the first package name that is found, including the
|
|
10
|
+
* version (range) specified in the package.json.
|
|
11
|
+
*/
|
|
12
|
+
function findInstalledPackageFromList(packageNamesList, packageJson) {
|
|
13
|
+
return packageNamesList
|
|
14
|
+
.map((packageName) => ({
|
|
15
|
+
name: packageName,
|
|
16
|
+
version: getPackageVersion(packageName, packageJson),
|
|
17
|
+
}))
|
|
18
|
+
.find((sdkPackage) => !!sdkPackage.version);
|
|
19
|
+
}
|
|
20
|
+
function hasPackageInstalled(packageName, packageJson) {
|
|
21
|
+
return getPackageVersion(packageName, packageJson) !== undefined;
|
|
22
|
+
}
|
|
23
|
+
function getPackageVersion(packageName, packageJson) {
|
|
24
|
+
return (packageJson?.dependencies?.[packageName] ||
|
|
25
|
+
packageJson?.devDependencies?.[packageName]);
|
|
26
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { WizardOptions } from './types';
|
|
2
|
+
export interface PackageManager {
|
|
3
|
+
name: string;
|
|
4
|
+
label: string;
|
|
5
|
+
installCommand: string;
|
|
6
|
+
buildCommand: string;
|
|
7
|
+
runScriptCommand: string;
|
|
8
|
+
flags: string;
|
|
9
|
+
forceInstallFlag: string;
|
|
10
|
+
detect: ({ installDir }: Pick<WizardOptions, 'installDir'>) => boolean;
|
|
11
|
+
addOverride: (pkgName: string, pkgVersion: string, { installDir }: Pick<WizardOptions, 'installDir'>) => Promise<void>;
|
|
12
|
+
}
|
|
13
|
+
export declare const BUN: PackageManager;
|
|
14
|
+
export declare const YARN_V1: PackageManager;
|
|
15
|
+
/** YARN V2/3/4 */
|
|
16
|
+
export declare const YARN_V2: PackageManager;
|
|
17
|
+
export declare const PNPM: PackageManager;
|
|
18
|
+
export declare const NPM: PackageManager;
|
|
19
|
+
export declare const EXPO: PackageManager;
|
|
20
|
+
export declare const packageManagers: PackageManager[];
|
|
21
|
+
export declare function detectAllPackageManagers({ installDir, }: Pick<WizardOptions, 'installDir'>): PackageManager[];
|
|
@@ -0,0 +1,208 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.packageManagers = exports.EXPO = exports.NPM = exports.PNPM = exports.YARN_V2 = exports.YARN_V1 = exports.BUN = void 0;
|
|
37
|
+
exports.detectAllPackageManagers = detectAllPackageManagers;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const telemetry_1 = require("../telemetry");
|
|
41
|
+
const setup_utils_1 = require("./setup-utils");
|
|
42
|
+
const analytics_1 = require("./analytics");
|
|
43
|
+
exports.BUN = {
|
|
44
|
+
name: 'bun',
|
|
45
|
+
label: 'Bun',
|
|
46
|
+
installCommand: 'bun add',
|
|
47
|
+
buildCommand: 'bun run build',
|
|
48
|
+
runScriptCommand: 'bun run',
|
|
49
|
+
flags: '',
|
|
50
|
+
forceInstallFlag: '--force',
|
|
51
|
+
detect: ({ installDir }) => ['bun.lockb', 'bun.lock'].some((lockFile) => fs.existsSync(path.join(installDir, lockFile))),
|
|
52
|
+
addOverride: async (pkgName, pkgVersion, { installDir }) => {
|
|
53
|
+
const packageDotJson = await (0, setup_utils_1.getPackageDotJson)({ installDir });
|
|
54
|
+
const overrides = packageDotJson.overrides || {};
|
|
55
|
+
await (0, setup_utils_1.updatePackageDotJson)({
|
|
56
|
+
...packageDotJson,
|
|
57
|
+
overrides: {
|
|
58
|
+
...overrides,
|
|
59
|
+
[pkgName]: pkgVersion,
|
|
60
|
+
},
|
|
61
|
+
}, { installDir: installDir });
|
|
62
|
+
},
|
|
63
|
+
};
|
|
64
|
+
exports.YARN_V1 = {
|
|
65
|
+
name: 'yarn',
|
|
66
|
+
label: 'Yarn V1',
|
|
67
|
+
installCommand: 'yarn add',
|
|
68
|
+
buildCommand: 'yarn build',
|
|
69
|
+
runScriptCommand: 'yarn',
|
|
70
|
+
flags: '--ignore-workspace-root-check',
|
|
71
|
+
forceInstallFlag: '--force',
|
|
72
|
+
detect: ({ installDir }) => {
|
|
73
|
+
try {
|
|
74
|
+
return fs
|
|
75
|
+
.readFileSync(path.join(installDir, 'yarn.lock'), 'utf-8')
|
|
76
|
+
.slice(0, 500)
|
|
77
|
+
.includes('yarn lockfile v1');
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
addOverride: async (pkgName, pkgVersion, { installDir }) => {
|
|
84
|
+
const packageDotJson = await (0, setup_utils_1.getPackageDotJson)({ installDir });
|
|
85
|
+
const resolutions = packageDotJson.resolutions || {};
|
|
86
|
+
await (0, setup_utils_1.updatePackageDotJson)({
|
|
87
|
+
...packageDotJson,
|
|
88
|
+
resolutions: {
|
|
89
|
+
...resolutions,
|
|
90
|
+
[pkgName]: pkgVersion,
|
|
91
|
+
},
|
|
92
|
+
}, { installDir });
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
/** YARN V2/3/4 */
|
|
96
|
+
exports.YARN_V2 = {
|
|
97
|
+
name: 'yarn',
|
|
98
|
+
label: 'Yarn V2/3/4',
|
|
99
|
+
installCommand: 'yarn add',
|
|
100
|
+
buildCommand: 'yarn build',
|
|
101
|
+
runScriptCommand: 'yarn',
|
|
102
|
+
flags: '',
|
|
103
|
+
forceInstallFlag: '--force',
|
|
104
|
+
detect: ({ installDir }) => {
|
|
105
|
+
try {
|
|
106
|
+
return fs
|
|
107
|
+
.readFileSync(path.join(installDir, 'yarn.lock'), 'utf-8')
|
|
108
|
+
.slice(0, 500)
|
|
109
|
+
.includes('__metadata');
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
addOverride: async (pkgName, pkgVersion, { installDir }) => {
|
|
116
|
+
const packageDotJson = await (0, setup_utils_1.getPackageDotJson)({ installDir });
|
|
117
|
+
const resolutions = packageDotJson.resolutions || {};
|
|
118
|
+
await (0, setup_utils_1.updatePackageDotJson)({
|
|
119
|
+
...packageDotJson,
|
|
120
|
+
resolutions: {
|
|
121
|
+
...resolutions,
|
|
122
|
+
[pkgName]: pkgVersion,
|
|
123
|
+
},
|
|
124
|
+
}, { installDir });
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
exports.PNPM = {
|
|
128
|
+
name: 'pnpm',
|
|
129
|
+
label: 'pnpm',
|
|
130
|
+
installCommand: 'pnpm add',
|
|
131
|
+
buildCommand: 'pnpm build',
|
|
132
|
+
runScriptCommand: 'pnpm',
|
|
133
|
+
flags: '--ignore-workspace-root-check',
|
|
134
|
+
forceInstallFlag: '--force',
|
|
135
|
+
detect: ({ installDir }) => fs.existsSync(path.join(installDir, 'pnpm-lock.yaml')),
|
|
136
|
+
addOverride: async (pkgName, pkgVersion, { installDir }) => {
|
|
137
|
+
const packageDotJson = await (0, setup_utils_1.getPackageDotJson)({ installDir });
|
|
138
|
+
const pnpm = packageDotJson.pnpm || {};
|
|
139
|
+
const overrides = pnpm.overrides || {};
|
|
140
|
+
await (0, setup_utils_1.updatePackageDotJson)({
|
|
141
|
+
...packageDotJson,
|
|
142
|
+
pnpm: {
|
|
143
|
+
...pnpm,
|
|
144
|
+
overrides: {
|
|
145
|
+
...overrides,
|
|
146
|
+
[pkgName]: pkgVersion,
|
|
147
|
+
},
|
|
148
|
+
},
|
|
149
|
+
}, { installDir });
|
|
150
|
+
},
|
|
151
|
+
};
|
|
152
|
+
exports.NPM = {
|
|
153
|
+
name: 'npm',
|
|
154
|
+
label: 'npm',
|
|
155
|
+
installCommand: 'npm add',
|
|
156
|
+
buildCommand: 'npm run build',
|
|
157
|
+
runScriptCommand: 'npm run',
|
|
158
|
+
flags: '',
|
|
159
|
+
forceInstallFlag: '--force',
|
|
160
|
+
detect: ({ installDir }) => fs.existsSync(path.join(installDir, 'package-lock.json')),
|
|
161
|
+
addOverride: async (pkgName, pkgVersion, { installDir }) => {
|
|
162
|
+
const packageDotJson = await (0, setup_utils_1.getPackageDotJson)({ installDir });
|
|
163
|
+
const overrides = packageDotJson.overrides || {};
|
|
164
|
+
await (0, setup_utils_1.updatePackageDotJson)({
|
|
165
|
+
...packageDotJson,
|
|
166
|
+
overrides: {
|
|
167
|
+
...overrides,
|
|
168
|
+
[pkgName]: pkgVersion,
|
|
169
|
+
},
|
|
170
|
+
}, { installDir });
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
exports.EXPO = {
|
|
174
|
+
name: 'expo',
|
|
175
|
+
label: 'Expo',
|
|
176
|
+
installCommand: 'npx expo install',
|
|
177
|
+
buildCommand: 'npx expo build',
|
|
178
|
+
runScriptCommand: 'npx expo run',
|
|
179
|
+
flags: '',
|
|
180
|
+
forceInstallFlag: '--force',
|
|
181
|
+
detect: () => false,
|
|
182
|
+
addOverride: async (pkgName, pkgVersion, { installDir }) => {
|
|
183
|
+
const packageDotJson = await (0, setup_utils_1.getPackageDotJson)({ installDir });
|
|
184
|
+
const overrides = packageDotJson.overrides || {};
|
|
185
|
+
await (0, setup_utils_1.updatePackageDotJson)({
|
|
186
|
+
...packageDotJson,
|
|
187
|
+
overrides: {
|
|
188
|
+
...overrides,
|
|
189
|
+
[pkgName]: pkgVersion,
|
|
190
|
+
},
|
|
191
|
+
}, { installDir });
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
exports.packageManagers = [exports.BUN, exports.YARN_V1, exports.YARN_V2, exports.PNPM, exports.NPM, exports.EXPO];
|
|
195
|
+
function detectAllPackageManagers({ installDir, }) {
|
|
196
|
+
return (0, telemetry_1.traceStep)('detect-package-manager', () => {
|
|
197
|
+
const detectedManagers = [];
|
|
198
|
+
for (const packageManager of exports.packageManagers) {
|
|
199
|
+
if (packageManager.detect({ installDir })) {
|
|
200
|
+
detectedManagers.push(packageManager);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
if (detectedManagers.length === 0) {
|
|
204
|
+
analytics_1.analytics.setTag('package-manager', 'not-detected');
|
|
205
|
+
}
|
|
206
|
+
return detectedManagers;
|
|
207
|
+
});
|
|
208
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export declare function fulfillsVersionRange({ version, acceptableVersions, canBeLatest, }: {
|
|
2
|
+
version: string;
|
|
3
|
+
acceptableVersions: string;
|
|
4
|
+
canBeLatest: boolean;
|
|
5
|
+
}): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Creates a version bucket function for analytics.
|
|
8
|
+
* Converts versions like "1.2.3" to "1.x" for grouping in analytics.
|
|
9
|
+
*
|
|
10
|
+
* @param minMajorVersion - Optional minimum major version threshold.
|
|
11
|
+
* Versions below this will be bucketed as "<{min}.0.0"
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* const getVersionBucket = createVersionBucket(); // no minimum
|
|
15
|
+
* getVersionBucket("1.2.3") // "1.x"
|
|
16
|
+
*
|
|
17
|
+
* const getVersionBucket = createVersionBucket(11);
|
|
18
|
+
* getVersionBucket("15.3.0") // "15.x"
|
|
19
|
+
* getVersionBucket("10.0.0") // "<11.0.0"
|
|
20
|
+
*/
|
|
21
|
+
export declare function createVersionBucket(minMajorVersion?: number): (version: string | undefined) => string;
|