workos 0.17.1 → 0.19.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +11 -149
- package/dist/bin.js +155 -23
- package/dist/bin.js.map +1 -1
- package/dist/cli.config.d.ts +0 -2
- package/dist/cli.config.js +3 -3
- package/dist/cli.config.js.map +1 -1
- package/dist/commands/api/index.js +18 -10
- package/dist/commands/api/index.js.map +1 -1
- package/dist/commands/api/interactive.js +11 -11
- package/dist/commands/api/interactive.js.map +1 -1
- package/dist/commands/claim.js +28 -16
- package/dist/commands/claim.js.map +1 -1
- package/dist/commands/connection.js +3 -3
- package/dist/commands/connection.js.map +1 -1
- package/dist/commands/debug.d.ts +11 -0
- package/dist/commands/debug.js +30 -14
- package/dist/commands/debug.js.map +1 -1
- package/dist/commands/dev.d.ts +7 -8
- package/dist/commands/dev.js +14 -14
- package/dist/commands/dev.js.map +1 -1
- package/dist/commands/directory.js +3 -3
- package/dist/commands/directory.js.map +1 -1
- package/dist/commands/doctor.js +2 -2
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/emulate.d.ts +1 -0
- package/dist/commands/emulate.js +3 -2
- package/dist/commands/emulate.js.map +1 -1
- package/dist/commands/env.d.ts +10 -0
- package/dist/commands/env.js +94 -18
- package/dist/commands/env.js.map +1 -1
- package/dist/commands/install.js +9 -10
- package/dist/commands/install.js.map +1 -1
- package/dist/commands/login.d.ts +25 -15
- package/dist/commands/login.js +126 -71
- package/dist/commands/login.js.map +1 -1
- package/dist/commands/logout.js +4 -4
- package/dist/commands/logout.js.map +1 -1
- package/dist/commands/mcp.d.ts +14 -0
- package/dist/commands/mcp.js +99 -0
- package/dist/commands/mcp.js.map +1 -0
- package/dist/commands/migrations.js +2 -1
- package/dist/commands/migrations.js.map +1 -1
- package/dist/commands/seed.js +5 -4
- package/dist/commands/seed.js.map +1 -1
- package/dist/commands/setup.d.ts +50 -0
- package/dist/commands/setup.js +237 -0
- package/dist/commands/setup.js.map +1 -0
- package/dist/commands/vault-run.js +3 -2
- package/dist/commands/vault-run.js.map +1 -1
- package/dist/commands/verify-login.d.ts +25 -0
- package/dist/commands/verify-login.js +158 -0
- package/dist/commands/verify-login.js.map +1 -0
- package/dist/doctor/checks/ai-analysis.js +2 -1
- package/dist/doctor/checks/ai-analysis.js.map +1 -1
- package/dist/doctor/checks/mcp.d.ts +15 -0
- package/dist/doctor/checks/mcp.js +34 -0
- package/dist/doctor/checks/mcp.js.map +1 -0
- package/dist/doctor/index.js +7 -1
- package/dist/doctor/index.js.map +1 -1
- package/dist/doctor/issues.js +18 -1
- package/dist/doctor/issues.js.map +1 -1
- package/dist/doctor/output.js +18 -3
- package/dist/doctor/output.js.map +1 -1
- package/dist/doctor/types.d.ts +17 -0
- package/dist/doctor/types.js.map +1 -1
- package/dist/integrations/dotnet/index.js +1 -1
- package/dist/integrations/dotnet/index.js.map +1 -1
- package/dist/integrations/elixir/index.js +1 -1
- package/dist/integrations/elixir/index.js.map +1 -1
- package/dist/integrations/go/index.js +1 -1
- package/dist/integrations/go/index.js.map +1 -1
- package/dist/integrations/nextjs/index.js +8 -5
- package/dist/integrations/nextjs/index.js.map +1 -1
- package/dist/integrations/nextjs/utils.d.ts +1 -1
- package/dist/integrations/nextjs/utils.js +21 -6
- package/dist/integrations/nextjs/utils.js.map +1 -1
- package/dist/integrations/react-router/index.js +5 -5
- package/dist/integrations/react-router/index.js.map +1 -1
- package/dist/integrations/react-router/utils.js +28 -12
- package/dist/integrations/react-router/utils.js.map +1 -1
- package/dist/integrations/ruby/index.js +1 -1
- package/dist/integrations/ruby/index.js.map +1 -1
- package/dist/lib/adapters/cli-adapter.d.ts +33 -4
- package/dist/lib/adapters/cli-adapter.js +251 -135
- package/dist/lib/adapters/cli-adapter.js.map +1 -1
- package/dist/lib/adapters/dashboard-adapter.js +3 -3
- package/dist/lib/adapters/dashboard-adapter.js.map +1 -1
- package/dist/lib/adapters/headless-adapter.d.ts +7 -0
- package/dist/lib/adapters/headless-adapter.js +42 -5
- package/dist/lib/adapters/headless-adapter.js.map +1 -1
- package/dist/lib/agent-interface.js +19 -5
- package/dist/lib/agent-interface.js.map +1 -1
- package/dist/lib/agent-runner.js +1 -1
- package/dist/lib/agent-runner.js.map +1 -1
- package/dist/lib/ai-content.js +2 -1
- package/dist/lib/ai-content.js.map +1 -1
- package/dist/lib/api-key.js +2 -1
- package/dist/lib/api-key.js.map +1 -1
- package/dist/lib/completion-data.d.ts +33 -0
- package/dist/lib/completion-data.js +33 -0
- package/dist/lib/completion-data.js.map +1 -0
- package/dist/lib/config-store.d.ts +13 -0
- package/dist/lib/config-store.js +24 -0
- package/dist/lib/config-store.js.map +1 -1
- package/dist/lib/config.d.ts +1 -1
- package/dist/lib/config.js +1 -1
- package/dist/lib/config.js.map +1 -1
- package/dist/lib/constants.d.ts +17 -0
- package/dist/lib/constants.js +17 -0
- package/dist/lib/constants.js.map +1 -1
- package/dist/lib/events.d.ts +34 -1
- package/dist/lib/events.js.map +1 -1
- package/dist/lib/framework-config.d.ts +6 -0
- package/dist/lib/framework-config.js.map +1 -1
- package/dist/lib/installer-core.d.ts +34 -21
- package/dist/lib/installer-core.js +24 -5
- package/dist/lib/installer-core.js.map +1 -1
- package/dist/lib/installer-core.types.d.ts +3 -1
- package/dist/lib/installer-core.types.js.map +1 -1
- package/dist/lib/mcp-clients.d.ts +45 -0
- package/dist/lib/mcp-clients.js +297 -0
- package/dist/lib/mcp-clients.js.map +1 -0
- package/dist/lib/port-detection.js +19 -13
- package/dist/lib/port-detection.js.map +1 -1
- package/dist/lib/preferences.d.ts +42 -0
- package/dist/lib/preferences.js +34 -5
- package/dist/lib/preferences.js.map +1 -1
- package/dist/lib/run-with-core.js +42 -4
- package/dist/lib/run-with-core.js.map +1 -1
- package/dist/lib/settings.d.ts +5 -14
- package/dist/lib/settings.js +5 -16
- package/dist/lib/settings.js.map +1 -1
- package/dist/lib/startup-notice-gate.d.ts +21 -0
- package/dist/lib/startup-notice-gate.js +29 -0
- package/dist/lib/startup-notice-gate.js.map +1 -0
- package/dist/lib/telemetry-notice.d.ts +5 -5
- package/dist/lib/telemetry-notice.js +10 -8
- package/dist/lib/telemetry-notice.js.map +1 -1
- package/dist/lib/unclaimed-env-provision.js +15 -12
- package/dist/lib/unclaimed-env-provision.js.map +1 -1
- package/dist/lib/unclaimed-warning.js +7 -3
- package/dist/lib/unclaimed-warning.js.map +1 -1
- package/dist/lib/validation/security-checks.js +2 -1
- package/dist/lib/validation/security-checks.js.map +1 -1
- package/dist/lib/validation/validator.js +30 -3
- package/dist/lib/validation/validator.js.map +1 -1
- package/dist/lib/workos-management.js +26 -19
- package/dist/lib/workos-management.js.map +1 -1
- package/dist/run.d.ts +1 -0
- package/dist/run.js +5 -1
- package/dist/run.js.map +1 -1
- package/dist/steps/add-or-update-environment-variables.js +10 -10
- package/dist/steps/add-or-update-environment-variables.js.map +1 -1
- package/dist/steps/run-prettier.js +3 -3
- package/dist/steps/run-prettier.js.map +1 -1
- package/dist/steps/upload-environment-variables/index.js +15 -3
- package/dist/steps/upload-environment-variables/index.js.map +1 -1
- package/dist/steps/upload-environment-variables/providers/vercel.js +2 -2
- package/dist/steps/upload-environment-variables/providers/vercel.js.map +1 -1
- package/dist/utils/analytics.d.ts +1 -0
- package/dist/utils/analytics.js +5 -1
- package/dist/utils/analytics.js.map +1 -1
- package/dist/utils/box.d.ts +6 -30
- package/dist/utils/box.js +8 -95
- package/dist/utils/box.js.map +1 -1
- package/dist/utils/cli-symbols.d.ts +14 -2
- package/dist/utils/cli-symbols.js +12 -0
- package/dist/utils/cli-symbols.js.map +1 -1
- package/dist/utils/debug.js +3 -3
- package/dist/utils/debug.js.map +1 -1
- package/dist/utils/environment.js +1 -1
- package/dist/utils/environment.js.map +1 -1
- package/dist/utils/help-json.js +153 -4
- package/dist/utils/help-json.js.map +1 -1
- package/dist/utils/interaction-mode.d.ts +1 -1
- package/dist/utils/interaction-mode.js +0 -3
- package/dist/utils/interaction-mode.js.map +1 -1
- package/dist/utils/output.d.ts +5 -3
- package/dist/utils/output.js +5 -5
- package/dist/utils/output.js.map +1 -1
- package/dist/utils/package-manager.js +1 -1
- package/dist/utils/package-manager.js.map +1 -1
- package/dist/utils/recovery-hints.d.ts +5 -0
- package/dist/utils/recovery-hints.js +12 -0
- package/dist/utils/recovery-hints.js.map +1 -1
- package/dist/utils/summary-box.d.ts +8 -1
- package/dist/utils/summary-box.js +67 -4
- package/dist/utils/summary-box.js.map +1 -1
- package/dist/utils/telemetry-types.d.ts +1 -1
- package/dist/utils/telemetry-types.js.map +1 -1
- package/dist/utils/types.d.ts +10 -0
- package/dist/utils/types.js.map +1 -1
- package/dist/utils/{clack-utils.d.ts → ui-utils.d.ts} +1 -1
- package/dist/utils/{clack-utils.js → ui-utils.js} +64 -37
- package/dist/utils/ui-utils.js.map +1 -0
- package/dist/utils/ui.d.ts +148 -0
- package/dist/utils/ui.js +368 -0
- package/dist/utils/ui.js.map +1 -0
- package/dist/utils/urls.d.ts +9 -3
- package/dist/utils/urls.js +10 -4
- package/dist/utils/urls.js.map +1 -1
- package/package.json +13 -20
- package/dist/check-coverage.ts +0 -237
- package/dist/emulate/core/id.d.ts +0 -48
- package/dist/emulate/core/id.js +0 -73
- package/dist/emulate/core/id.js.map +0 -1
- package/dist/emulate/core/index.d.ts +0 -8
- package/dist/emulate/core/index.js +0 -8
- package/dist/emulate/core/index.js.map +0 -1
- package/dist/emulate/core/jwt.d.ts +0 -28
- package/dist/emulate/core/jwt.js +0 -78
- package/dist/emulate/core/jwt.js.map +0 -1
- package/dist/emulate/core/middleware/auth.d.ts +0 -15
- package/dist/emulate/core/middleware/auth.js +0 -17
- package/dist/emulate/core/middleware/auth.js.map +0 -1
- package/dist/emulate/core/middleware/error-handler.d.ts +0 -22
- package/dist/emulate/core/middleware/error-handler.js +0 -72
- package/dist/emulate/core/middleware/error-handler.js.map +0 -1
- package/dist/emulate/core/pagination.d.ts +0 -27
- package/dist/emulate/core/pagination.js +0 -43
- package/dist/emulate/core/pagination.js.map +0 -1
- package/dist/emulate/core/plugin.d.ts +0 -15
- package/dist/emulate/core/plugin.js +0 -2
- package/dist/emulate/core/plugin.js.map +0 -1
- package/dist/emulate/core/server.d.ts +0 -17
- package/dist/emulate/core/server.js +0 -90
- package/dist/emulate/core/server.js.map +0 -1
- package/dist/emulate/core/store.d.ts +0 -44
- package/dist/emulate/core/store.js +0 -169
- package/dist/emulate/core/store.js.map +0 -1
- package/dist/emulate/index.d.ts +0 -25
- package/dist/emulate/index.js +0 -47
- package/dist/emulate/index.js.map +0 -1
- package/dist/emulate/workos/constants.d.ts +0 -56
- package/dist/emulate/workos/constants.js +0 -56
- package/dist/emulate/workos/constants.js.map +0 -1
- package/dist/emulate/workos/entities.d.ts +0 -360
- package/dist/emulate/workos/entities.js +0 -2
- package/dist/emulate/workos/entities.js.map +0 -1
- package/dist/emulate/workos/event-bus.d.ts +0 -17
- package/dist/emulate/workos/event-bus.js +0 -70
- package/dist/emulate/workos/event-bus.js.map +0 -1
- package/dist/emulate/workos/helpers.d.ts +0 -72
- package/dist/emulate/workos/helpers.js +0 -211
- package/dist/emulate/workos/helpers.js.map +0 -1
- package/dist/emulate/workos/index.d.ts +0 -93
- package/dist/emulate/workos/index.js +0 -326
- package/dist/emulate/workos/index.js.map +0 -1
- package/dist/emulate/workos/role-helpers.d.ts +0 -21
- package/dist/emulate/workos/role-helpers.js +0 -130
- package/dist/emulate/workos/role-helpers.js.map +0 -1
- package/dist/emulate/workos/routes/api-keys.d.ts +0 -2
- package/dist/emulate/workos/routes/api-keys.js +0 -32
- package/dist/emulate/workos/routes/api-keys.js.map +0 -1
- package/dist/emulate/workos/routes/audit-logs.d.ts +0 -2
- package/dist/emulate/workos/routes/audit-logs.js +0 -104
- package/dist/emulate/workos/routes/audit-logs.js.map +0 -1
- package/dist/emulate/workos/routes/auth-challenges.d.ts +0 -2
- package/dist/emulate/workos/routes/auth-challenges.js +0 -51
- package/dist/emulate/workos/routes/auth-challenges.js.map +0 -1
- package/dist/emulate/workos/routes/auth-factors.d.ts +0 -2
- package/dist/emulate/workos/routes/auth-factors.js +0 -51
- package/dist/emulate/workos/routes/auth-factors.js.map +0 -1
- package/dist/emulate/workos/routes/auth.d.ts +0 -2
- package/dist/emulate/workos/routes/auth.js +0 -350
- package/dist/emulate/workos/routes/auth.js.map +0 -1
- package/dist/emulate/workos/routes/authorization-checks.d.ts +0 -10
- package/dist/emulate/workos/routes/authorization-checks.js +0 -123
- package/dist/emulate/workos/routes/authorization-checks.js.map +0 -1
- package/dist/emulate/workos/routes/authorization-org-roles.d.ts +0 -2
- package/dist/emulate/workos/routes/authorization-org-roles.js +0 -64
- package/dist/emulate/workos/routes/authorization-org-roles.js.map +0 -1
- package/dist/emulate/workos/routes/authorization-permissions.d.ts +0 -2
- package/dist/emulate/workos/routes/authorization-permissions.js +0 -67
- package/dist/emulate/workos/routes/authorization-permissions.js.map +0 -1
- package/dist/emulate/workos/routes/authorization-resources.d.ts +0 -2
- package/dist/emulate/workos/routes/authorization-resources.js +0 -117
- package/dist/emulate/workos/routes/authorization-resources.js.map +0 -1
- package/dist/emulate/workos/routes/authorization-roles.d.ts +0 -2
- package/dist/emulate/workos/routes/authorization-roles.js +0 -13
- package/dist/emulate/workos/routes/authorization-roles.js.map +0 -1
- package/dist/emulate/workos/routes/config.d.ts +0 -2
- package/dist/emulate/workos/routes/config.js +0 -57
- package/dist/emulate/workos/routes/config.js.map +0 -1
- package/dist/emulate/workos/routes/connect.d.ts +0 -2
- package/dist/emulate/workos/routes/connect.js +0 -65
- package/dist/emulate/workos/routes/connect.js.map +0 -1
- package/dist/emulate/workos/routes/connections.d.ts +0 -2
- package/dist/emulate/workos/routes/connections.js +0 -73
- package/dist/emulate/workos/routes/connections.js.map +0 -1
- package/dist/emulate/workos/routes/data-integrations.d.ts +0 -2
- package/dist/emulate/workos/routes/data-integrations.js +0 -55
- package/dist/emulate/workos/routes/data-integrations.js.map +0 -1
- package/dist/emulate/workos/routes/directories.d.ts +0 -2
- package/dist/emulate/workos/routes/directories.js +0 -90
- package/dist/emulate/workos/routes/directories.js.map +0 -1
- package/dist/emulate/workos/routes/email-verification.d.ts +0 -2
- package/dist/emulate/workos/routes/email-verification.js +0 -49
- package/dist/emulate/workos/routes/email-verification.js.map +0 -1
- package/dist/emulate/workos/routes/events.d.ts +0 -2
- package/dist/emulate/workos/routes/events.js +0 -18
- package/dist/emulate/workos/routes/events.js.map +0 -1
- package/dist/emulate/workos/routes/feature-flags.d.ts +0 -2
- package/dist/emulate/workos/routes/feature-flags.js +0 -103
- package/dist/emulate/workos/routes/feature-flags.js.map +0 -1
- package/dist/emulate/workos/routes/invitations.d.ts +0 -2
- package/dist/emulate/workos/routes/invitations.js +0 -122
- package/dist/emulate/workos/routes/invitations.js.map +0 -1
- package/dist/emulate/workos/routes/legacy-mfa.d.ts +0 -2
- package/dist/emulate/workos/routes/legacy-mfa.js +0 -75
- package/dist/emulate/workos/routes/legacy-mfa.js.map +0 -1
- package/dist/emulate/workos/routes/magic-auth.d.ts +0 -2
- package/dist/emulate/workos/routes/magic-auth.js +0 -32
- package/dist/emulate/workos/routes/magic-auth.js.map +0 -1
- package/dist/emulate/workos/routes/memberships.d.ts +0 -2
- package/dist/emulate/workos/routes/memberships.js +0 -114
- package/dist/emulate/workos/routes/memberships.js.map +0 -1
- package/dist/emulate/workos/routes/organization-domains.d.ts +0 -2
- package/dist/emulate/workos/routes/organization-domains.js +0 -58
- package/dist/emulate/workos/routes/organization-domains.js.map +0 -1
- package/dist/emulate/workos/routes/organizations.d.ts +0 -2
- package/dist/emulate/workos/routes/organizations.js +0 -131
- package/dist/emulate/workos/routes/organizations.js.map +0 -1
- package/dist/emulate/workos/routes/password-reset.d.ts +0 -2
- package/dist/emulate/workos/routes/password-reset.js +0 -61
- package/dist/emulate/workos/routes/password-reset.js.map +0 -1
- package/dist/emulate/workos/routes/pipes.d.ts +0 -2
- package/dist/emulate/workos/routes/pipes.js +0 -82
- package/dist/emulate/workos/routes/pipes.js.map +0 -1
- package/dist/emulate/workos/routes/portal.d.ts +0 -2
- package/dist/emulate/workos/routes/portal.js +0 -18
- package/dist/emulate/workos/routes/portal.js.map +0 -1
- package/dist/emulate/workos/routes/radar.d.ts +0 -2
- package/dist/emulate/workos/routes/radar.js +0 -41
- package/dist/emulate/workos/routes/radar.js.map +0 -1
- package/dist/emulate/workos/routes/sessions.d.ts +0 -2
- package/dist/emulate/workos/routes/sessions.js +0 -51
- package/dist/emulate/workos/routes/sessions.js.map +0 -1
- package/dist/emulate/workos/routes/sso.d.ts +0 -2
- package/dist/emulate/workos/routes/sso.js +0 -161
- package/dist/emulate/workos/routes/sso.js.map +0 -1
- package/dist/emulate/workos/routes/user-features.d.ts +0 -2
- package/dist/emulate/workos/routes/user-features.js +0 -50
- package/dist/emulate/workos/routes/user-features.js.map +0 -1
- package/dist/emulate/workos/routes/users.d.ts +0 -2
- package/dist/emulate/workos/routes/users.js +0 -129
- package/dist/emulate/workos/routes/users.js.map +0 -1
- package/dist/emulate/workos/routes/webhook-endpoints.d.ts +0 -2
- package/dist/emulate/workos/routes/webhook-endpoints.js +0 -67
- package/dist/emulate/workos/routes/webhook-endpoints.js.map +0 -1
- package/dist/emulate/workos/routes/widgets.d.ts +0 -2
- package/dist/emulate/workos/routes/widgets.js +0 -27
- package/dist/emulate/workos/routes/widgets.js.map +0 -1
- package/dist/emulate/workos/store.d.ts +0 -48
- package/dist/emulate/workos/store.js +0 -102
- package/dist/emulate/workos/store.js.map +0 -1
- package/dist/emulate/workos/webhook-signer.d.ts +0 -1
- package/dist/emulate/workos/webhook-signer.js +0 -8
- package/dist/emulate/workos/webhook-signer.js.map +0 -1
- package/dist/gen-routes-lib.spec.ts +0 -659
- package/dist/gen-routes-lib.ts +0 -647
- package/dist/gen-routes.ts +0 -96
- package/dist/utils/clack-utils.js.map +0 -1
- package/dist/utils/clack.d.ts +0 -5
- package/dist/utils/clack.js +0 -34
- package/dist/utils/clack.js.map +0 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { INSTALLER_INTERACTION_EVENT_NAME } from './constants.js';
|
|
2
2
|
import { analytics } from '../utils/analytics.js';
|
|
3
|
-
import
|
|
3
|
+
import ui from '../utils/ui.js';
|
|
4
4
|
import { getCallbackPath } from './port-detection.js';
|
|
5
5
|
const WORKOS_API_BASE = 'https://api.workos.com';
|
|
6
6
|
async function workosRequest(method, endpoint, apiKey, body) {
|
|
@@ -86,10 +86,7 @@ export async function autoConfigureWorkOSEnvironment(apiKey, integration, port,
|
|
|
86
86
|
const callbackPath = getCallbackPath(integration);
|
|
87
87
|
const callbackUrl = options.redirectUri || `${baseUrl}${callbackPath}`;
|
|
88
88
|
const homepageUrlValue = options.homepageUrl || baseUrl;
|
|
89
|
-
|
|
90
|
-
clack.log.info(` Redirect URI: ${callbackUrl}`);
|
|
91
|
-
clack.log.info(` CORS origin: ${baseUrl}`);
|
|
92
|
-
clack.log.info(` Homepage URL: ${homepageUrlValue}`);
|
|
89
|
+
ui.log.step('Configuring WorkOS dashboard settings...');
|
|
93
90
|
try {
|
|
94
91
|
const [redirectUri, corsOrigin, homepageUrl] = await Promise.all([
|
|
95
92
|
createRedirectUri(apiKey, callbackUrl),
|
|
@@ -104,33 +101,43 @@ export async function autoConfigureWorkOSEnvironment(apiKey, integration, port,
|
|
|
104
101
|
redirectUri: redirectUri.alreadyExists ? 'existed' : 'created',
|
|
105
102
|
corsOrigin: corsOrigin.alreadyExists ? 'existed' : 'created',
|
|
106
103
|
});
|
|
107
|
-
//
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
104
|
+
// Aligned key/value feedback: value in accent, a dim status for "already
|
|
105
|
+
// existed" vs. a green status for a fresh create/update.
|
|
106
|
+
ui.log.success('WorkOS dashboard configured');
|
|
107
|
+
ui.rows([
|
|
108
|
+
{
|
|
109
|
+
key: 'Redirect URI',
|
|
110
|
+
value: callbackUrl,
|
|
111
|
+
status: redirectUri.alreadyExists ? 'already set' : 'created',
|
|
112
|
+
statusKind: redirectUri.alreadyExists ? 'muted' : 'ok',
|
|
113
|
+
},
|
|
114
|
+
{
|
|
115
|
+
key: 'CORS origin',
|
|
116
|
+
value: baseUrl,
|
|
117
|
+
status: corsOrigin.alreadyExists ? 'already set' : 'created',
|
|
118
|
+
statusKind: corsOrigin.alreadyExists ? 'muted' : 'ok',
|
|
119
|
+
},
|
|
120
|
+
{ key: 'Homepage URL', value: homepageUrlValue, status: 'updated', statusKind: 'ok' },
|
|
121
|
+
]);
|
|
115
122
|
return results;
|
|
116
123
|
}
|
|
117
124
|
catch (error) {
|
|
118
125
|
const message = error instanceof Error ? error.message : 'Unknown error';
|
|
119
126
|
// Provide specific guidance for common errors
|
|
120
127
|
if (message.includes('401') || message.includes('Invalid API key')) {
|
|
121
|
-
|
|
128
|
+
ui.log.warn('Could not configure WorkOS dashboard: Invalid API key');
|
|
122
129
|
}
|
|
123
130
|
else if (message.includes('403') || message.includes('permission')) {
|
|
124
|
-
|
|
131
|
+
ui.log.warn('Could not configure WorkOS dashboard: API key lacks permission');
|
|
125
132
|
}
|
|
126
133
|
else if (message.includes('422') || message.includes('Validation')) {
|
|
127
|
-
|
|
128
|
-
|
|
134
|
+
ui.log.warn(`Could not configure WorkOS dashboard: Validation error`);
|
|
135
|
+
ui.log.info(` Error: ${message}`);
|
|
129
136
|
}
|
|
130
137
|
else {
|
|
131
|
-
|
|
138
|
+
ui.log.warn(`Could not configure WorkOS dashboard: ${message}`);
|
|
132
139
|
}
|
|
133
|
-
|
|
140
|
+
ui.log.info('You can configure these settings manually in the WorkOS dashboard.');
|
|
134
141
|
analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {
|
|
135
142
|
action: 'workos environment auto-config failed',
|
|
136
143
|
integration,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workos-management.js","sourceRoot":"","sources":["../../src/lib/workos-management.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Integration } from './constants.js';\nimport { INSTALLER_INTERACTION_EVENT_NAME } from './constants.js';\nimport { analytics } from '../utils/analytics.js';\nimport clack from '../utils/clack.js';\nimport { getCallbackPath } from './port-detection.js';\n\nconst WORKOS_API_BASE = 'https://api.workos.com';\n\nexport interface AutoConfigResult {\n redirectUri: { success: boolean; alreadyExists: boolean };\n corsOrigin: { success: boolean; alreadyExists: boolean };\n homepageUrl: { success: boolean };\n}\n\ninterface FetchError {\n status: number;\n message: string;\n data?: unknown;\n}\n\nasync function workosRequest(\n method: 'POST' | 'PUT',\n endpoint: string,\n apiKey: string,\n body: Record<string, string>,\n): Promise<Response> {\n return fetch(`${WORKOS_API_BASE}${endpoint}`, {\n method,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n}\n\nasync function parseFetchError(response: Response): Promise<FetchError> {\n let data: unknown;\n try {\n data = await response.json();\n } catch {\n // Response wasn't JSON\n }\n return {\n status: response.status,\n message: typeof data === 'object' && data && 'message' in data ? String((data as { message: string }).message) : '',\n data,\n };\n}\n\n/**\n * Create a redirect URI in WorkOS.\n * Returns success on 201 or 409 (already exists).\n */\nasync function createRedirectUri(apiKey: string, uri: string): Promise<{ success: boolean; alreadyExists: boolean }> {\n const response = await workosRequest('POST', '/user_management/redirect_uris', apiKey, { uri });\n\n if (response.ok) {\n return { success: true, alreadyExists: false };\n }\n\n const error = await parseFetchError(response);\n // WorkOS returns 422 (not 409) when URI already exists\n if (error.status === 409 || (error.status === 422 && error.message.includes('already exists'))) {\n return { success: true, alreadyExists: true };\n }\n\n throw new Error(error.message || `HTTP ${error.status}`);\n}\n\n/**\n * Create a CORS origin in WorkOS.\n * Returns success on 201 or 409 (already exists).\n */\nasync function createCorsOrigin(apiKey: string, origin: string): Promise<{ success: boolean; alreadyExists: boolean }> {\n const response = await workosRequest('POST', '/user_management/cors_origins', apiKey, { origin });\n\n if (response.ok) {\n return { success: true, alreadyExists: false };\n }\n\n const error = await parseFetchError(response);\n // WorkOS returns 422 (not 409) when origin already exists\n if (error.status === 409 || (error.status === 422 && error.message.includes('already exists'))) {\n return { success: true, alreadyExists: true };\n }\n\n throw new Error(error.message || `HTTP ${error.status}`);\n}\n\n/**\n * Set the app homepage URL in WorkOS.\n */\nasync function setHomepageUrl(apiKey: string, url: string): Promise<{ success: boolean }> {\n const response = await workosRequest('PUT', '/user_management/app_homepage_url', apiKey, { url });\n\n if (!response.ok) {\n const error = await parseFetchError(response);\n throw new Error(error.message || `HTTP ${error.status}`);\n }\n\n return { success: true };\n}\n\nexport interface AutoConfigOptions {\n /** Custom homepage URL (defaults to http://localhost:{port}) */\n homepageUrl?: string;\n /** Custom redirect URI (defaults to framework convention) */\n redirectUri?: string;\n}\n\n/**\n * Auto-configure WorkOS dashboard settings for local development.\n * Sets redirect URI, CORS origin, and homepage URL via the WorkOS API.\n *\n * @param apiKey - WorkOS API key (sk_xxx)\n * @param integration - Framework integration type\n * @param port - Detected or default dev server port\n * @param options - Optional overrides for homepage URL and redirect URI\n *\n * Non-blocking: failures are logged but don't stop the wizard.\n */\nexport async function autoConfigureWorkOSEnvironment(\n apiKey: string,\n integration: Integration,\n port: number,\n options: AutoConfigOptions = {},\n): Promise<AutoConfigResult | null> {\n const baseUrl = `http://localhost:${port}`;\n const callbackPath = getCallbackPath(integration);\n const callbackUrl = options.redirectUri || `${baseUrl}${callbackPath}`;\n const homepageUrlValue = options.homepageUrl || baseUrl;\n\n clack.log.step('Configuring WorkOS dashboard settings via API...');\n clack.log.info(` Redirect URI: ${callbackUrl}`);\n clack.log.info(` CORS origin: ${baseUrl}`);\n clack.log.info(` Homepage URL: ${homepageUrlValue}`);\n\n try {\n const [redirectUri, corsOrigin, homepageUrl] = await Promise.all([\n createRedirectUri(apiKey, callbackUrl),\n createCorsOrigin(apiKey, baseUrl),\n setHomepageUrl(apiKey, homepageUrlValue),\n ]);\n\n const results: AutoConfigResult = { redirectUri, corsOrigin, homepageUrl };\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'workos environment auto-configured',\n integration,\n port,\n redirectUri: redirectUri.alreadyExists ? 'existed' : 'created',\n corsOrigin: corsOrigin.alreadyExists ? 'existed' : 'created',\n });\n\n // Build user feedback\n const messages: string[] = [];\n messages.push(\n redirectUri.alreadyExists\n ? `Redirect URI: ${callbackUrl} (already existed)`\n : `Redirect URI: ${callbackUrl} (created)`,\n );\n messages.push(\n corsOrigin.alreadyExists ? `CORS origin: ${baseUrl} (already existed)` : `CORS origin: ${baseUrl} (created)`,\n );\n messages.push(`Homepage URL: ${homepageUrlValue} (updated)`);\n\n clack.log.success('WorkOS dashboard configured:\\n ' + messages.join('\\n '));\n\n return results;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n // Provide specific guidance for common errors\n if (message.includes('401') || message.includes('Invalid API key')) {\n clack.log.warn('Could not configure WorkOS dashboard: Invalid API key');\n } else if (message.includes('403') || message.includes('permission')) {\n clack.log.warn('Could not configure WorkOS dashboard: API key lacks permission');\n } else if (message.includes('422') || message.includes('Validation')) {\n clack.log.warn(`Could not configure WorkOS dashboard: Validation error`);\n clack.log.info(` Error: ${message}`);\n } else {\n clack.log.warn(`Could not configure WorkOS dashboard: ${message}`);\n }\n\n clack.log.info('You can configure these settings manually in the WorkOS dashboard.');\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'workos environment auto-config failed',\n integration,\n error: message,\n });\n\n return null;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"workos-management.js","sourceRoot":"","sources":["../../src/lib/workos-management.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Integration } from './constants.js';\nimport { INSTALLER_INTERACTION_EVENT_NAME } from './constants.js';\nimport { analytics } from '../utils/analytics.js';\nimport ui from '../utils/ui.js';\nimport { getCallbackPath } from './port-detection.js';\n\nconst WORKOS_API_BASE = 'https://api.workos.com';\n\nexport interface AutoConfigResult {\n redirectUri: { success: boolean; alreadyExists: boolean };\n corsOrigin: { success: boolean; alreadyExists: boolean };\n homepageUrl: { success: boolean };\n}\n\ninterface FetchError {\n status: number;\n message: string;\n data?: unknown;\n}\n\nasync function workosRequest(\n method: 'POST' | 'PUT',\n endpoint: string,\n apiKey: string,\n body: Record<string, string>,\n): Promise<Response> {\n return fetch(`${WORKOS_API_BASE}${endpoint}`, {\n method,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(body),\n });\n}\n\nasync function parseFetchError(response: Response): Promise<FetchError> {\n let data: unknown;\n try {\n data = await response.json();\n } catch {\n // Response wasn't JSON\n }\n return {\n status: response.status,\n message: typeof data === 'object' && data && 'message' in data ? String((data as { message: string }).message) : '',\n data,\n };\n}\n\n/**\n * Create a redirect URI in WorkOS.\n * Returns success on 201 or 409 (already exists).\n */\nasync function createRedirectUri(apiKey: string, uri: string): Promise<{ success: boolean; alreadyExists: boolean }> {\n const response = await workosRequest('POST', '/user_management/redirect_uris', apiKey, { uri });\n\n if (response.ok) {\n return { success: true, alreadyExists: false };\n }\n\n const error = await parseFetchError(response);\n // WorkOS returns 422 (not 409) when URI already exists\n if (error.status === 409 || (error.status === 422 && error.message.includes('already exists'))) {\n return { success: true, alreadyExists: true };\n }\n\n throw new Error(error.message || `HTTP ${error.status}`);\n}\n\n/**\n * Create a CORS origin in WorkOS.\n * Returns success on 201 or 409 (already exists).\n */\nasync function createCorsOrigin(apiKey: string, origin: string): Promise<{ success: boolean; alreadyExists: boolean }> {\n const response = await workosRequest('POST', '/user_management/cors_origins', apiKey, { origin });\n\n if (response.ok) {\n return { success: true, alreadyExists: false };\n }\n\n const error = await parseFetchError(response);\n // WorkOS returns 422 (not 409) when origin already exists\n if (error.status === 409 || (error.status === 422 && error.message.includes('already exists'))) {\n return { success: true, alreadyExists: true };\n }\n\n throw new Error(error.message || `HTTP ${error.status}`);\n}\n\n/**\n * Set the app homepage URL in WorkOS.\n */\nasync function setHomepageUrl(apiKey: string, url: string): Promise<{ success: boolean }> {\n const response = await workosRequest('PUT', '/user_management/app_homepage_url', apiKey, { url });\n\n if (!response.ok) {\n const error = await parseFetchError(response);\n throw new Error(error.message || `HTTP ${error.status}`);\n }\n\n return { success: true };\n}\n\nexport interface AutoConfigOptions {\n /** Custom homepage URL (defaults to http://localhost:{port}) */\n homepageUrl?: string;\n /** Custom redirect URI (defaults to framework convention) */\n redirectUri?: string;\n}\n\n/**\n * Auto-configure WorkOS dashboard settings for local development.\n * Sets redirect URI, CORS origin, and homepage URL via the WorkOS API.\n *\n * @param apiKey - WorkOS API key (sk_xxx)\n * @param integration - Framework integration type\n * @param port - Detected or default dev server port\n * @param options - Optional overrides for homepage URL and redirect URI\n *\n * Non-blocking: failures are logged but don't stop the wizard.\n */\nexport async function autoConfigureWorkOSEnvironment(\n apiKey: string,\n integration: Integration,\n port: number,\n options: AutoConfigOptions = {},\n): Promise<AutoConfigResult | null> {\n const baseUrl = `http://localhost:${port}`;\n const callbackPath = getCallbackPath(integration);\n const callbackUrl = options.redirectUri || `${baseUrl}${callbackPath}`;\n const homepageUrlValue = options.homepageUrl || baseUrl;\n\n ui.log.step('Configuring WorkOS dashboard settings...');\n\n try {\n const [redirectUri, corsOrigin, homepageUrl] = await Promise.all([\n createRedirectUri(apiKey, callbackUrl),\n createCorsOrigin(apiKey, baseUrl),\n setHomepageUrl(apiKey, homepageUrlValue),\n ]);\n\n const results: AutoConfigResult = { redirectUri, corsOrigin, homepageUrl };\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'workos environment auto-configured',\n integration,\n port,\n redirectUri: redirectUri.alreadyExists ? 'existed' : 'created',\n corsOrigin: corsOrigin.alreadyExists ? 'existed' : 'created',\n });\n\n // Aligned key/value feedback: value in accent, a dim status for \"already\n // existed\" vs. a green status for a fresh create/update.\n ui.log.success('WorkOS dashboard configured');\n ui.rows([\n {\n key: 'Redirect URI',\n value: callbackUrl,\n status: redirectUri.alreadyExists ? 'already set' : 'created',\n statusKind: redirectUri.alreadyExists ? 'muted' : 'ok',\n },\n {\n key: 'CORS origin',\n value: baseUrl,\n status: corsOrigin.alreadyExists ? 'already set' : 'created',\n statusKind: corsOrigin.alreadyExists ? 'muted' : 'ok',\n },\n { key: 'Homepage URL', value: homepageUrlValue, status: 'updated', statusKind: 'ok' },\n ]);\n\n return results;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n\n // Provide specific guidance for common errors\n if (message.includes('401') || message.includes('Invalid API key')) {\n ui.log.warn('Could not configure WorkOS dashboard: Invalid API key');\n } else if (message.includes('403') || message.includes('permission')) {\n ui.log.warn('Could not configure WorkOS dashboard: API key lacks permission');\n } else if (message.includes('422') || message.includes('Validation')) {\n ui.log.warn(`Could not configure WorkOS dashboard: Validation error`);\n ui.log.info(` Error: ${message}`);\n } else {\n ui.log.warn(`Could not configure WorkOS dashboard: ${message}`);\n }\n\n ui.log.info('You can configure these settings manually in the WorkOS dashboard.');\n\n analytics.capture(INSTALLER_INTERACTION_EVENT_NAME, {\n action: 'workos environment auto-config failed',\n integration,\n error: message,\n });\n\n return null;\n }\n}\n"]}
|
package/dist/run.d.ts
CHANGED
package/dist/run.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { readEnvironment } from './utils/environment.js';
|
|
2
2
|
import { runWithCore } from './lib/run-with-core.js';
|
|
3
3
|
import { createInstallerEventEmitter } from './lib/events.js';
|
|
4
|
+
import { isCiMode } from './utils/interaction-mode.js';
|
|
4
5
|
import path from 'path';
|
|
5
6
|
import { EventEmitter } from 'events';
|
|
6
7
|
EventEmitter.defaultMaxListeners = 50;
|
|
@@ -24,7 +25,9 @@ function buildOptions(argv) {
|
|
|
24
25
|
forceInstall: merged.forceInstall ?? false,
|
|
25
26
|
installDir,
|
|
26
27
|
local: merged.local ?? false,
|
|
27
|
-
ci
|
|
28
|
+
// Bridge WORKOS_MODE=ci to the downstream `options.ci` paths (git checks,
|
|
29
|
+
// package-manager select) so it fully behaves like the hidden --ci flag.
|
|
30
|
+
ci: (merged.ci ?? false) || isCiMode(),
|
|
28
31
|
skipAuth: merged.skipAuth ?? false,
|
|
29
32
|
apiKey: merged.apiKey,
|
|
30
33
|
clientId: merged.clientId,
|
|
@@ -40,6 +43,7 @@ function buildOptions(argv) {
|
|
|
40
43
|
direct: merged.direct ?? false,
|
|
41
44
|
scaffold: merged.scaffold ?? false,
|
|
42
45
|
pm: merged.pm,
|
|
46
|
+
router: merged.router,
|
|
43
47
|
emitter: createInstallerEventEmitter(), // Will be replaced in runWithCore
|
|
44
48
|
};
|
|
45
49
|
}
|
package/dist/run.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,YAAY,CAAC,mBAAmB,GAAG,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../src/run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,2BAA2B,EAAE,MAAM,iBAAiB,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AACvD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,YAAY,CAAC,mBAAmB,GAAG,EAAE,CAAC;AA+BtC;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAmB;IACpD,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,SAAS,YAAY,CAAC,IAAmB;IACvC,MAAM,OAAO,GAAG,eAAe,EAAE,CAAC;IAClC,MAAM,MAAM,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,OAAO,EAAE,CAAC;IAEvC,MAAM,UAAU,GAAG,iBAAiB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAExD,OAAO;QACL,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;QAC5B,YAAY,EAAE,MAAM,CAAC,YAAY,IAAI,KAAK;QAC1C,UAAU;QACV,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,KAAK;QAC5B,0EAA0E;QAC1E,yEAAyE;QACzE,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,IAAI,KAAK,CAAC,IAAI,QAAQ,EAAE;QACtC,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;QAClC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;QACpC,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,KAAK;QAChC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK;QAC1D,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK;QACpD,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,KAAK;QACpD,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;QAClC,UAAU,EAAE,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,QAAQ,KAAK,KAAK;QAC1D,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,KAAK;QAC9B,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,KAAK;QAClC,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,2BAA2B,EAAE,EAAE,kCAAkC;KAC3E,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CAAC,GAAY;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,OAAO,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,CAAC,CAAC;AACpE,CAAC","sourcesContent":["import { readEnvironment } from './utils/environment.js';\nimport { runWithCore } from './lib/run-with-core.js';\nimport type { InstallerOptions } from './utils/types.js';\nimport { createInstallerEventEmitter } from './lib/events.js';\nimport { isCiMode } from './utils/interaction-mode.js';\nimport path from 'path';\nimport { EventEmitter } from 'events';\n\nEventEmitter.defaultMaxListeners = 50;\n\nexport type InstallerArgs = {\n debug?: boolean;\n forceInstall?: boolean;\n installDir?: string;\n default?: boolean;\n local?: boolean;\n ci?: boolean;\n skipAuth?: boolean;\n apiKey?: string;\n clientId?: string;\n homepageUrl?: string;\n redirectUri?: string;\n dashboard?: boolean;\n inspect?: boolean;\n noValidate?: boolean;\n validate?: boolean;\n noCommit?: boolean;\n commit?: boolean;\n noBranch?: boolean;\n branch?: boolean;\n createPr?: boolean;\n noGitCheck?: boolean;\n gitCheck?: boolean;\n direct?: boolean;\n scaffold?: boolean;\n pm?: string;\n router?: 'app' | 'pages';\n};\n\n/**\n * Main entry point for the wizard CLI.\n * Builds options from args and delegates to the core.\n */\nexport async function runInstaller(argv: InstallerArgs): Promise<void> {\n const options = buildOptions(argv);\n await runWithCore(options);\n}\n\n/**\n * Build InstallerOptions from CLI args and environment.\n */\nfunction buildOptions(argv: InstallerArgs): InstallerOptions {\n const envArgs = readEnvironment();\n const merged = { ...argv, ...envArgs };\n\n const installDir = resolveInstallDir(merged.installDir);\n\n return {\n debug: merged.debug ?? false,\n forceInstall: merged.forceInstall ?? false,\n installDir,\n local: merged.local ?? false,\n // Bridge WORKOS_MODE=ci to the downstream `options.ci` paths (git checks,\n // package-manager select) so it fully behaves like the hidden --ci flag.\n ci: (merged.ci ?? false) || isCiMode(),\n skipAuth: merged.skipAuth ?? false,\n apiKey: merged.apiKey,\n clientId: merged.clientId,\n homepageUrl: merged.homepageUrl,\n redirectUri: merged.redirectUri,\n dashboard: merged.dashboard ?? false,\n inspect: merged.inspect ?? false,\n noValidate: merged.noValidate ?? merged.validate === false,\n noCommit: merged.noCommit ?? merged.commit === false,\n noBranch: merged.noBranch ?? merged.branch === false,\n createPr: merged.createPr ?? false,\n noGitCheck: merged.noGitCheck ?? merged.gitCheck === false,\n direct: merged.direct ?? false,\n scaffold: merged.scaffold ?? false,\n pm: merged.pm,\n router: merged.router,\n emitter: createInstallerEventEmitter(), // Will be replaced in runWithCore\n };\n}\n\n/**\n * Resolve install directory to absolute path.\n */\nfunction resolveInstallDir(dir?: string): string {\n if (!dir) return process.cwd();\n return path.isAbsolute(dir) ? dir : path.join(process.cwd(), dir);\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import chalk from 'chalk';
|
|
2
2
|
import { traceStep } from '../telemetry.js';
|
|
3
3
|
import { analytics } from '../utils/analytics.js';
|
|
4
|
-
import
|
|
4
|
+
import ui from '../utils/ui.js';
|
|
5
5
|
import * as fs from 'fs';
|
|
6
6
|
import path from 'path';
|
|
7
7
|
function getDotGitignore(options) {
|
|
@@ -42,15 +42,15 @@ export async function addOrUpdateEnvironmentVariablesStep({ installDir, variable
|
|
|
42
42
|
encoding: 'utf8',
|
|
43
43
|
flag: 'w',
|
|
44
44
|
});
|
|
45
|
-
|
|
45
|
+
ui.log.success(`Updated environment variables in ${chalk.bold.cyan(relativeEnvFilePath)}`);
|
|
46
46
|
}
|
|
47
47
|
else {
|
|
48
|
-
|
|
48
|
+
ui.log.success(`${chalk.bold.cyan(relativeEnvFilePath)} already has the necessary environment variables.`);
|
|
49
49
|
}
|
|
50
50
|
addedEnvVariables = true;
|
|
51
51
|
}
|
|
52
52
|
catch (error) {
|
|
53
|
-
|
|
53
|
+
ui.log.warning(`Failed to update environment variables in ${chalk.bold.cyan(relativeEnvFilePath)}. Please update them manually.`);
|
|
54
54
|
analytics.capture('installer interaction', {
|
|
55
55
|
action: 'failed to update environment variables',
|
|
56
56
|
integration,
|
|
@@ -69,11 +69,11 @@ export async function addOrUpdateEnvironmentVariablesStep({ installDir, variable
|
|
|
69
69
|
encoding: 'utf8',
|
|
70
70
|
flag: 'w',
|
|
71
71
|
});
|
|
72
|
-
|
|
72
|
+
ui.log.success(`Created ${chalk.bold.cyan(relativeEnvFilePath)} with environment variables.`);
|
|
73
73
|
addedEnvVariables = true;
|
|
74
74
|
}
|
|
75
75
|
catch (error) {
|
|
76
|
-
|
|
76
|
+
ui.log.warning(`Failed to create ${chalk.bold.cyan(relativeEnvFilePath)} with environment variables. Please add them manually.`);
|
|
77
77
|
analytics.capture('installer interaction', {
|
|
78
78
|
action: 'failed to create environment variables',
|
|
79
79
|
integration,
|
|
@@ -99,11 +99,11 @@ export async function addOrUpdateEnvironmentVariablesStep({ installDir, variable
|
|
|
99
99
|
encoding: 'utf8',
|
|
100
100
|
flag: 'w',
|
|
101
101
|
});
|
|
102
|
-
|
|
102
|
+
ui.log.success(`Updated ${chalk.bold.cyan('.gitignore')} to include ${chalk.bold.cyan(envFileName)}.`);
|
|
103
103
|
addedGitignore = true;
|
|
104
104
|
}
|
|
105
105
|
catch (error) {
|
|
106
|
-
|
|
106
|
+
ui.log.warning(`Failed to update ${chalk.bold.cyan('.gitignore')} to include ${chalk.bold.cyan(envFileName)}.`);
|
|
107
107
|
analytics.capture('installer interaction', {
|
|
108
108
|
action: 'failed to update gitignore',
|
|
109
109
|
integration,
|
|
@@ -124,11 +124,11 @@ export async function addOrUpdateEnvironmentVariablesStep({ installDir, variable
|
|
|
124
124
|
encoding: 'utf8',
|
|
125
125
|
flag: 'w',
|
|
126
126
|
});
|
|
127
|
-
|
|
127
|
+
ui.log.success(`Created ${chalk.bold.cyan('.gitignore')} with environment files.`);
|
|
128
128
|
addedGitignore = true;
|
|
129
129
|
}
|
|
130
130
|
catch (error) {
|
|
131
|
-
|
|
131
|
+
ui.log.warning(`Failed to create ${chalk.bold.cyan('.gitignore')} with environment files.`);
|
|
132
132
|
analytics.capture('installer interaction', {
|
|
133
133
|
action: 'failed to create gitignore',
|
|
134
134
|
integration,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"add-or-update-environment-variables.js","sourceRoot":"","sources":["../../src/steps/add-or-update-environment-variables.ts"],"names":[],"mappings":"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","sourcesContent":["import chalk from 'chalk';\nimport type { Integration } from '../lib/constants.js';\nimport { traceStep } from '../telemetry.js';\nimport { analytics } from '../utils/analytics.js';\nimport clack from '../utils/clack.js';\nimport * as fs from 'fs';\nimport path from 'path';\n\nfunction getDotGitignore(options: { installDir: string }): string {\n return path.join(options.installDir, '.gitignore');\n}\n\nexport async function addOrUpdateEnvironmentVariablesStep({\n installDir,\n variables,\n integration,\n}: {\n installDir: string;\n variables: Record<string, string>;\n integration: Integration;\n}): Promise<{\n relativeEnvFilePath: string;\n addedEnvVariables: boolean;\n addedGitignore: boolean;\n}> {\n return traceStep('add-or-update-environment-variables', async () => {\n const envVarContent = Object.entries(variables)\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n');\n\n const dotEnvLocalFilePath = path.join(installDir, '.env.local');\n const dotEnvFilePath = path.join(installDir, '.env');\n const targetEnvFilePath = fs.existsSync(dotEnvLocalFilePath) ? dotEnvLocalFilePath : dotEnvFilePath;\n\n const dotEnvFileExists = fs.existsSync(targetEnvFilePath);\n\n const relativeEnvFilePath = path.relative(installDir, targetEnvFilePath);\n\n let addedGitignore = false;\n let addedEnvVariables = false;\n\n if (dotEnvFileExists) {\n try {\n let dotEnvFileContent = fs.readFileSync(targetEnvFilePath, 'utf8');\n let updated = false;\n\n for (const [key, value] of Object.entries(variables)) {\n const regex = new RegExp(`^${key}=.*$`, 'm');\n\n if (dotEnvFileContent.match(regex)) {\n dotEnvFileContent = dotEnvFileContent.replace(regex, `${key}=${value}`);\n updated = true;\n } else {\n if (!dotEnvFileContent.endsWith('\\n')) {\n dotEnvFileContent += '\\n';\n }\n dotEnvFileContent += `${key}=${value}\\n`;\n updated = true;\n }\n }\n\n if (updated) {\n await fs.promises.writeFile(targetEnvFilePath, dotEnvFileContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(`Updated environment variables in ${chalk.bold.cyan(relativeEnvFilePath)}`);\n } else {\n clack.log.success(`${chalk.bold.cyan(relativeEnvFilePath)} already has the necessary environment variables.`);\n }\n\n addedEnvVariables = true;\n } catch (error) {\n clack.log.warning(\n `Failed to update environment variables in ${chalk.bold.cyan(\n relativeEnvFilePath,\n )}. Please update them manually.`,\n );\n\n analytics.capture('installer interaction', {\n action: 'failed to update environment variables',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n } else {\n try {\n await fs.promises.writeFile(targetEnvFilePath, envVarContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(`Created ${chalk.bold.cyan(relativeEnvFilePath)} with environment variables.`);\n\n addedEnvVariables = true;\n } catch (error) {\n clack.log.warning(\n `Failed to create ${chalk.bold.cyan(\n relativeEnvFilePath,\n )} with environment variables. Please add them manually.`,\n );\n\n analytics.capture('installer interaction', {\n action: 'failed to create environment variables',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n }\n\n const gitignorePath = getDotGitignore({ installDir });\n\n const envFileName = path.basename(targetEnvFilePath);\n\n const envFiles = [envFileName];\n\n if (gitignorePath) {\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');\n const missingEnvFiles = envFiles.filter((file) => !gitignoreContent.includes(file));\n\n if (missingEnvFiles.length > 0) {\n try {\n const newGitignoreContent = `${gitignoreContent}\\n${missingEnvFiles.join('\\n')}`;\n await fs.promises.writeFile(gitignorePath, newGitignoreContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(`Updated ${chalk.bold.cyan('.gitignore')} to include ${chalk.bold.cyan(envFileName)}.`);\n addedGitignore = true;\n } catch (error) {\n clack.log.warning(\n `Failed to update ${chalk.bold.cyan('.gitignore')} to include ${chalk.bold.cyan(envFileName)}.`,\n );\n\n analytics.capture('installer interaction', {\n action: 'failed to update gitignore',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n }\n } else {\n try {\n const newGitignoreContent = `${envFiles.join('\\n')}\\n`;\n await fs.promises.writeFile(path.join(installDir, '.gitignore'), newGitignoreContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n clack.log.success(`Created ${chalk.bold.cyan('.gitignore')} with environment files.`);\n addedGitignore = true;\n } catch (error) {\n clack.log.warning(`Failed to create ${chalk.bold.cyan('.gitignore')} with environment files.`);\n\n analytics.capture('installer interaction', {\n action: 'failed to create gitignore',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n }\n\n analytics.capture('installer interaction', {\n action: 'added environment variables',\n integration,\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"add-or-update-environment-variables.js","sourceRoot":"","sources":["../../src/steps/add-or-update-environment-variables.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,SAAS,eAAe,CAAC,OAA+B;IACtD,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AACrD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mCAAmC,CAAC,EACxD,UAAU,EACV,SAAS,EACT,WAAW,GAKZ;IAKC,OAAO,SAAS,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACjE,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC;aAC5C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC;aACxC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEd,MAAM,mBAAmB,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAChE,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;QACrD,MAAM,iBAAiB,GAAG,EAAE,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,cAAc,CAAC;QAEpG,MAAM,gBAAgB,GAAG,EAAE,CAAC,UAAU,CAAC,iBAAiB,CAAC,CAAC;QAE1D,MAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,iBAAiB,CAAC,CAAC;QAEzE,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,iBAAiB,GAAG,KAAK,CAAC;QAE9B,IAAI,gBAAgB,EAAE,CAAC;YACrB,IAAI,CAAC;gBACH,IAAI,iBAAiB,GAAG,EAAE,CAAC,YAAY,CAAC,iBAAiB,EAAE,MAAM,CAAC,CAAC;gBACnE,IAAI,OAAO,GAAG,KAAK,CAAC;gBAEpB,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;oBACrD,MAAM,KAAK,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,MAAM,EAAE,GAAG,CAAC,CAAC;oBAE7C,IAAI,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;wBACnC,iBAAiB,GAAG,iBAAiB,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,GAAG,IAAI,KAAK,EAAE,CAAC,CAAC;wBACxE,OAAO,GAAG,IAAI,CAAC;oBACjB,CAAC;yBAAM,CAAC;wBACN,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;4BACtC,iBAAiB,IAAI,IAAI,CAAC;wBAC5B,CAAC;wBACD,iBAAiB,IAAI,GAAG,GAAG,IAAI,KAAK,IAAI,CAAC;wBACzC,OAAO,GAAG,IAAI,CAAC;oBACjB,CAAC;gBACH,CAAC;gBAED,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,iBAAiB,EAAE,iBAAiB,EAAE;wBAChE,QAAQ,EAAE,MAAM;wBAChB,IAAI,EAAE,GAAG;qBACV,CAAC,CAAC;oBACH,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,oCAAoC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,EAAE,CAAC,CAAC;gBAC7F,CAAC;qBAAM,CAAC;oBACN,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,mDAAmD,CAAC,CAAC;gBAC7G,CAAC;gBAED,iBAAiB,GAAG,IAAI,CAAC;YAC3B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,EAAE,CAAC,GAAG,CAAC,OAAO,CACZ,6CAA6C,KAAK,CAAC,IAAI,CAAC,IAAI,CAC1D,mBAAmB,CACpB,gCAAgC,CAClC,CAAC;gBAEF,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;oBACzC,MAAM,EAAE,wCAAwC;oBAChD,WAAW;oBACX,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;iBAChE,CAAC,CAAC;gBAEH,OAAO;oBACL,mBAAmB;oBACnB,iBAAiB;oBACjB,cAAc;iBACf,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,iBAAiB,EAAE,aAAa,EAAE;oBAC5D,QAAQ,EAAE,MAAM;oBAChB,IAAI,EAAE,GAAG;iBACV,CAAC,CAAC;gBACH,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,8BAA8B,CAAC,CAAC;gBAE9F,iBAAiB,GAAG,IAAI,CAAC;YAC3B,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,EAAE,CAAC,GAAG,CAAC,OAAO,CACZ,oBAAoB,KAAK,CAAC,IAAI,CAAC,IAAI,CACjC,mBAAmB,CACpB,wDAAwD,CAC1D,CAAC;gBAEF,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;oBACzC,MAAM,EAAE,wCAAwC;oBAChD,WAAW;oBACX,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;iBAChE,CAAC,CAAC;gBAEH,OAAO;oBACL,mBAAmB;oBACnB,iBAAiB;oBACjB,cAAc;iBACf,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,aAAa,GAAG,eAAe,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;QAEtD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC;QAErD,MAAM,QAAQ,GAAG,CAAC,WAAW,CAAC,CAAC;QAE/B,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,gBAAgB,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;YAChE,MAAM,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YAEpF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC/B,IAAI,CAAC;oBACH,MAAM,mBAAmB,GAAG,GAAG,gBAAgB,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;oBACjF,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,mBAAmB,EAAE;wBAC9D,QAAQ,EAAE,MAAM;wBAChB,IAAI,EAAE,GAAG;qBACV,CAAC,CAAC;oBACH,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;oBACvG,cAAc,GAAG,IAAI,CAAC;gBACxB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBACf,EAAE,CAAC,GAAG,CAAC,OAAO,CACZ,oBAAoB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,eAAe,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAChG,CAAC;oBAEF,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;wBACzC,MAAM,EAAE,4BAA4B;wBACpC,WAAW;wBACX,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;qBAChE,CAAC,CAAC;oBAEH,OAAO;wBACL,mBAAmB;wBACnB,iBAAiB;wBACjB,cAAc;qBACf,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,mBAAmB,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBACvD,MAAM,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,EAAE,mBAAmB,EAAE;oBACpF,QAAQ,EAAE,MAAM;oBAChB,IAAI,EAAE,GAAG;iBACV,CAAC,CAAC;gBACH,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,0BAA0B,CAAC,CAAC;gBACnF,cAAc,GAAG,IAAI,CAAC;YACxB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,oBAAoB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,0BAA0B,CAAC,CAAC;gBAE5F,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;oBACzC,MAAM,EAAE,4BAA4B;oBACpC,WAAW;oBACX,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;iBAChE,CAAC,CAAC;gBAEH,OAAO;oBACL,mBAAmB;oBACnB,iBAAiB;oBACjB,cAAc;iBACf,CAAC;YACJ,CAAC;QACH,CAAC;QAED,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;YACzC,MAAM,EAAE,6BAA6B;YACrC,WAAW;SACZ,CAAC,CAAC;QAEH,OAAO;YACL,mBAAmB;YACnB,iBAAiB;YACjB,cAAc;SACf,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import chalk from 'chalk';\nimport type { Integration } from '../lib/constants.js';\nimport { traceStep } from '../telemetry.js';\nimport { analytics } from '../utils/analytics.js';\nimport ui from '../utils/ui.js';\nimport * as fs from 'fs';\nimport path from 'path';\n\nfunction getDotGitignore(options: { installDir: string }): string {\n return path.join(options.installDir, '.gitignore');\n}\n\nexport async function addOrUpdateEnvironmentVariablesStep({\n installDir,\n variables,\n integration,\n}: {\n installDir: string;\n variables: Record<string, string>;\n integration: Integration;\n}): Promise<{\n relativeEnvFilePath: string;\n addedEnvVariables: boolean;\n addedGitignore: boolean;\n}> {\n return traceStep('add-or-update-environment-variables', async () => {\n const envVarContent = Object.entries(variables)\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n');\n\n const dotEnvLocalFilePath = path.join(installDir, '.env.local');\n const dotEnvFilePath = path.join(installDir, '.env');\n const targetEnvFilePath = fs.existsSync(dotEnvLocalFilePath) ? dotEnvLocalFilePath : dotEnvFilePath;\n\n const dotEnvFileExists = fs.existsSync(targetEnvFilePath);\n\n const relativeEnvFilePath = path.relative(installDir, targetEnvFilePath);\n\n let addedGitignore = false;\n let addedEnvVariables = false;\n\n if (dotEnvFileExists) {\n try {\n let dotEnvFileContent = fs.readFileSync(targetEnvFilePath, 'utf8');\n let updated = false;\n\n for (const [key, value] of Object.entries(variables)) {\n const regex = new RegExp(`^${key}=.*$`, 'm');\n\n if (dotEnvFileContent.match(regex)) {\n dotEnvFileContent = dotEnvFileContent.replace(regex, `${key}=${value}`);\n updated = true;\n } else {\n if (!dotEnvFileContent.endsWith('\\n')) {\n dotEnvFileContent += '\\n';\n }\n dotEnvFileContent += `${key}=${value}\\n`;\n updated = true;\n }\n }\n\n if (updated) {\n await fs.promises.writeFile(targetEnvFilePath, dotEnvFileContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n ui.log.success(`Updated environment variables in ${chalk.bold.cyan(relativeEnvFilePath)}`);\n } else {\n ui.log.success(`${chalk.bold.cyan(relativeEnvFilePath)} already has the necessary environment variables.`);\n }\n\n addedEnvVariables = true;\n } catch (error) {\n ui.log.warning(\n `Failed to update environment variables in ${chalk.bold.cyan(\n relativeEnvFilePath,\n )}. Please update them manually.`,\n );\n\n analytics.capture('installer interaction', {\n action: 'failed to update environment variables',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n } else {\n try {\n await fs.promises.writeFile(targetEnvFilePath, envVarContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n ui.log.success(`Created ${chalk.bold.cyan(relativeEnvFilePath)} with environment variables.`);\n\n addedEnvVariables = true;\n } catch (error) {\n ui.log.warning(\n `Failed to create ${chalk.bold.cyan(\n relativeEnvFilePath,\n )} with environment variables. Please add them manually.`,\n );\n\n analytics.capture('installer interaction', {\n action: 'failed to create environment variables',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n }\n\n const gitignorePath = getDotGitignore({ installDir });\n\n const envFileName = path.basename(targetEnvFilePath);\n\n const envFiles = [envFileName];\n\n if (gitignorePath) {\n const gitignoreContent = fs.readFileSync(gitignorePath, 'utf8');\n const missingEnvFiles = envFiles.filter((file) => !gitignoreContent.includes(file));\n\n if (missingEnvFiles.length > 0) {\n try {\n const newGitignoreContent = `${gitignoreContent}\\n${missingEnvFiles.join('\\n')}`;\n await fs.promises.writeFile(gitignorePath, newGitignoreContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n ui.log.success(`Updated ${chalk.bold.cyan('.gitignore')} to include ${chalk.bold.cyan(envFileName)}.`);\n addedGitignore = true;\n } catch (error) {\n ui.log.warning(\n `Failed to update ${chalk.bold.cyan('.gitignore')} to include ${chalk.bold.cyan(envFileName)}.`,\n );\n\n analytics.capture('installer interaction', {\n action: 'failed to update gitignore',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n }\n } else {\n try {\n const newGitignoreContent = `${envFiles.join('\\n')}\\n`;\n await fs.promises.writeFile(path.join(installDir, '.gitignore'), newGitignoreContent, {\n encoding: 'utf8',\n flag: 'w',\n });\n ui.log.success(`Created ${chalk.bold.cyan('.gitignore')} with environment files.`);\n addedGitignore = true;\n } catch (error) {\n ui.log.warning(`Failed to create ${chalk.bold.cyan('.gitignore')} with environment files.`);\n\n analytics.capture('installer interaction', {\n action: 'failed to create gitignore',\n integration,\n error: error instanceof Error ? error.message : 'Unknown error',\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n }\n }\n\n analytics.capture('installer interaction', {\n action: 'added environment variables',\n integration,\n });\n\n return {\n relativeEnvFilePath,\n addedEnvVariables,\n addedGitignore,\n };\n });\n}\n"]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { traceStep } from '../telemetry.js';
|
|
2
2
|
import { analytics } from '../utils/analytics.js';
|
|
3
|
-
import
|
|
4
|
-
import { getPackageDotJson, getUncommittedOrUntrackedFiles, isInGitRepo } from '../utils/
|
|
3
|
+
import ui from '../utils/ui.js';
|
|
4
|
+
import { getPackageDotJson, getUncommittedOrUntrackedFiles, isInGitRepo } from '../utils/ui-utils.js';
|
|
5
5
|
import { hasPackageInstalled } from '../utils/package-json.js';
|
|
6
6
|
import { spawn } from 'node:child_process';
|
|
7
7
|
import { SPAWN_OPTS } from '../utils/platform.js';
|
|
@@ -24,7 +24,7 @@ export async function runPrettierStep({ installDir, integration, }) {
|
|
|
24
24
|
if (!prettierInstalled) {
|
|
25
25
|
return;
|
|
26
26
|
}
|
|
27
|
-
const prettierSpinner =
|
|
27
|
+
const prettierSpinner = ui.spinner();
|
|
28
28
|
prettierSpinner.start('Running Prettier on your files.');
|
|
29
29
|
try {
|
|
30
30
|
await new Promise((resolve, reject) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-prettier.js","sourceRoot":"","sources":["../../src/steps/run-prettier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,
|
|
1
|
+
{"version":3,"file":"run-prettier.js","sourceRoot":"","sources":["../../src/steps/run-prettier.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAClD,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAChC,OAAO,EAAE,iBAAiB,EAAE,8BAA8B,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACtG,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,EACpC,UAAU,EACV,WAAW,GAGZ;IACC,OAAO,SAAS,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;QAC1C,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;YACnB,qFAAqF;YACrF,wFAAwF;YACxF,OAAO;QACT,CAAC;QAED,MAAM,uBAAuB,GAAG,8BAA8B,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE;YAChF,OAAO,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;QAClE,CAAC,CAAC,CAAC;QAEH,IAAI,CAAC,uBAAuB,CAAC,MAAM,EAAE,CAAC;YACpC,OAAO;QACT,CAAC;QAED,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC;QAC5D,MAAM,iBAAiB,GAAG,mBAAmB,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAEvE,SAAS,CAAC,MAAM,CAAC,oBAAoB,EAAE,iBAAiB,CAAC,CAAC;QAE1D,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO;QACT,CAAC;QAED,MAAM,eAAe,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC;QACrC,eAAe,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;QAEzD,IAAI,CAAC;YACH,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,kBAAkB,EAAE,SAAS,EAAE,GAAG,uBAAuB,CAAC,EAAE;oBACjG,KAAK,EAAE,QAAQ;oBACf,GAAG,UAAU;iBACd,CAAC,CAAC;gBACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACpG,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,eAAe,CAAC,IAAI,CAAC,sEAAsE,CAAC,CAAC;YAC7F,OAAO;QACT,CAAC;QAED,eAAe,CAAC,IAAI,CAAC,oCAAoC,CAAC,CAAC;QAE3D,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;YACzC,MAAM,EAAE,cAAc;YACtB,WAAW;SACZ,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import type { Integration } from '../lib/constants.js';\nimport { traceStep } from '../telemetry.js';\nimport { analytics } from '../utils/analytics.js';\nimport ui from '../utils/ui.js';\nimport { getPackageDotJson, getUncommittedOrUntrackedFiles, isInGitRepo } from '../utils/ui-utils.js';\nimport { hasPackageInstalled } from '../utils/package-json.js';\nimport type { InstallerOptions } from '../utils/types.js';\nimport { spawn } from 'node:child_process';\nimport { SPAWN_OPTS } from '../utils/platform.js';\n\nexport async function runPrettierStep({\n installDir,\n integration,\n}: Pick<InstallerOptions, 'installDir'> & {\n integration: Integration;\n}): Promise<void> {\n return traceStep('run-prettier', async () => {\n if (!isInGitRepo()) {\n // We only run formatting on changed files. If we're not in a git repo, we can't find\n // changed files. So let's early-return without showing any formatting-related messages.\n return;\n }\n\n const changedOrUntrackedFiles = getUncommittedOrUntrackedFiles().map((filename) => {\n return filename.startsWith('- ') ? filename.slice(2) : filename;\n });\n\n if (!changedOrUntrackedFiles.length) {\n return;\n }\n\n const packageJson = await getPackageDotJson({ installDir });\n const prettierInstalled = hasPackageInstalled('prettier', packageJson);\n\n analytics.setTag('prettier-installed', prettierInstalled);\n\n if (!prettierInstalled) {\n return;\n }\n\n const prettierSpinner = ui.spinner();\n prettierSpinner.start('Running Prettier on your files.');\n\n try {\n await new Promise<void>((resolve, reject) => {\n const proc = spawn('npx', ['prettier', '--ignore-unknown', '--write', ...changedOrUntrackedFiles], {\n stdio: 'ignore',\n ...SPAWN_OPTS,\n });\n proc.on('close', (code) => (code === 0 ? resolve() : reject(new Error(`prettier exited ${code}`))));\n proc.on('error', reject);\n });\n } catch {\n prettierSpinner.stop('Prettier failed to run. You may want to format the changes manually.');\n return;\n }\n\n prettierSpinner.stop('Prettier has formatted your files.');\n\n analytics.capture('installer interaction', {\n action: 'ran prettier',\n integration,\n });\n });\n}\n"]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { traceStep } from '../../telemetry.js';
|
|
2
2
|
import { analytics } from '../../utils/analytics.js';
|
|
3
|
-
import
|
|
4
|
-
import { abortIfCancelled } from '../../utils/
|
|
3
|
+
import ui from '../../utils/ui.js';
|
|
4
|
+
import { abortIfCancelled } from '../../utils/ui-utils.js';
|
|
5
|
+
import { isPromptAllowed } from '../../utils/interaction-mode.js';
|
|
5
6
|
import { VercelEnvironmentProvider } from './providers/vercel.js';
|
|
6
7
|
export const uploadEnvironmentVariablesStep = async (envVars, { integration, options, }) => {
|
|
7
8
|
const providers = [new VercelEnvironmentProvider(options)];
|
|
@@ -20,7 +21,18 @@ export const uploadEnvironmentVariablesStep = async (envVars, { integration, opt
|
|
|
20
21
|
});
|
|
21
22
|
return [];
|
|
22
23
|
}
|
|
23
|
-
|
|
24
|
+
// Non-interactive mode: default to skipping the upload rather than prompting
|
|
25
|
+
// (or failing fast via the abortIfCancelled guard below).
|
|
26
|
+
if (!isPromptAllowed()) {
|
|
27
|
+
analytics.capture('installer interaction', {
|
|
28
|
+
action: 'not uploading environment variables',
|
|
29
|
+
reason: 'non-interactive mode',
|
|
30
|
+
provider: provider.name,
|
|
31
|
+
integration,
|
|
32
|
+
});
|
|
33
|
+
return [];
|
|
34
|
+
}
|
|
35
|
+
const upload = await abortIfCancelled(ui.select({
|
|
24
36
|
message: `It looks like you are using ${provider.name}. Would you like to upload the environment variables?`,
|
|
25
37
|
options: [
|
|
26
38
|
{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/steps/upload-environment-variables/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/steps/upload-environment-variables/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AACrD,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAGlE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAElE,MAAM,CAAC,MAAM,8BAA8B,GAAG,KAAK,EACjD,OAA+B,EAC/B,EACE,WAAW,EACX,OAAO,GAIR,EACkB,EAAE;IACrB,MAAM,SAAS,GAA0B,CAAC,IAAI,yBAAyB,CAAC,OAAO,CAAC,CAAC,CAAC;IAElF,IAAI,QAAQ,GAA+B,IAAI,CAAC;IAEhD,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;QAC1B,IAAI,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;YACrB,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;YACzC,MAAM,EAAE,qCAAqC;YAC7C,MAAM,EAAE,+BAA+B;YACvC,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,6EAA6E;IAC7E,0DAA0D;IAC1D,IAAI,CAAC,eAAe,EAAE,EAAE,CAAC;QACvB,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;YACzC,MAAM,EAAE,qCAAqC;YAC7C,MAAM,EAAE,sBAAsB;YAC9B,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAY,MAAM,gBAAgB,CAC5C,EAAE,CAAC,MAAM,CAAC;QACR,OAAO,EAAE,+BAA+B,QAAQ,CAAC,IAAI,uDAAuD;QAC5G,OAAO,EAAE;YACP;gBACE,KAAK,EAAE,IAAI;gBACX,KAAK,EAAE,KAAK;gBACZ,IAAI,EAAE,uCAAuC,QAAQ,CAAC,IAAI,EAAE;aAC7D;YACD;gBACE,KAAK,EAAE,KAAK;gBACZ,KAAK,EAAE,IAAI;gBACX,IAAI,EAAE,2CAA2C,QAAQ,CAAC,IAAI,0BAA0B;aACzF;SACF;KACF,CAAC,EACF,WAAW,CACZ,CAAC;IAEF,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;YACzC,MAAM,EAAE,qCAAqC;YAC7C,MAAM,EAAE,yBAAyB;YACjC,QAAQ,EAAE,QAAQ,CAAC,IAAI;YACvB,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QAC5E,OAAO,MAAM,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,SAAS,CAAC,OAAO,CAAC,uBAAuB,EAAE;QACzC,MAAM,EAAE,gCAAgC;QACxC,QAAQ,EAAE,QAAQ,CAAC,IAAI;QACvB,WAAW;KACZ,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5D,CAAC,CAAC","sourcesContent":["import type { Integration } from '../../lib/constants.js';\nimport { traceStep } from '../../telemetry.js';\nimport { analytics } from '../../utils/analytics.js';\nimport ui from '../../utils/ui.js';\nimport { abortIfCancelled } from '../../utils/ui-utils.js';\nimport { isPromptAllowed } from '../../utils/interaction-mode.js';\nimport type { InstallerOptions } from '../../utils/types.js';\nimport { EnvironmentProvider } from './EnvironmentProvider.js';\nimport { VercelEnvironmentProvider } from './providers/vercel.js';\n\nexport const uploadEnvironmentVariablesStep = async (\n envVars: Record<string, string>,\n {\n integration,\n options,\n }: {\n integration: Integration;\n options: InstallerOptions;\n },\n): Promise<string[]> => {\n const providers: EnvironmentProvider[] = [new VercelEnvironmentProvider(options)];\n\n let provider: EnvironmentProvider | null = null;\n\n for (const p of providers) {\n if (await p.detect()) {\n provider = p;\n break;\n }\n }\n\n if (!provider) {\n analytics.capture('installer interaction', {\n action: 'not uploading environment variables',\n reason: 'no environment provider found',\n integration,\n });\n return [];\n }\n\n // Non-interactive mode: default to skipping the upload rather than prompting\n // (or failing fast via the abortIfCancelled guard below).\n if (!isPromptAllowed()) {\n analytics.capture('installer interaction', {\n action: 'not uploading environment variables',\n reason: 'non-interactive mode',\n provider: provider.name,\n integration,\n });\n return [];\n }\n\n const upload: boolean = await abortIfCancelled(\n ui.select({\n message: `It looks like you are using ${provider.name}. Would you like to upload the environment variables?`,\n options: [\n {\n value: true,\n label: 'Yes',\n hint: `Upload the environment variables to ${provider.name}`,\n },\n {\n value: false,\n label: 'No',\n hint: `Skip uploading environment variables to ${provider.name} - you can do this later`,\n },\n ],\n }),\n integration,\n );\n\n if (!upload) {\n analytics.capture('installer interaction', {\n action: 'not uploading environment variables',\n reason: 'user declined to upload',\n provider: provider.name,\n integration,\n });\n return [];\n }\n\n const results = await traceStep('uploading environment variables', async () => {\n return await provider.uploadEnvVars(envVars);\n });\n\n analytics.capture('installer interaction', {\n action: 'uploaded environment variables',\n provider: provider.name,\n integration,\n });\n\n return Object.keys(results).filter((key) => results[key]);\n};\n"]}
|
|
@@ -2,7 +2,7 @@ import { execSync, spawn, spawnSync } from 'child_process';
|
|
|
2
2
|
import { EnvironmentProvider } from '../EnvironmentProvider.js';
|
|
3
3
|
import * as fs from 'fs';
|
|
4
4
|
import * as path from 'path';
|
|
5
|
-
import
|
|
5
|
+
import ui from '../../../utils/ui.js';
|
|
6
6
|
import chalk from 'chalk';
|
|
7
7
|
import { analytics } from '../../../utils/analytics.js';
|
|
8
8
|
import { SPAWN_OPTS } from '../../../utils/platform.js';
|
|
@@ -87,7 +87,7 @@ export class VercelEnvironmentProvider extends EnvironmentProvider {
|
|
|
87
87
|
async uploadEnvVars(vars) {
|
|
88
88
|
const results = {};
|
|
89
89
|
for (const [key, value] of Object.entries(vars)) {
|
|
90
|
-
const spinner =
|
|
90
|
+
const spinner = ui.spinner();
|
|
91
91
|
spinner.start(`Uploading ${chalk.cyan(key)} to ${this.name}...`);
|
|
92
92
|
await Promise.all(this.environments.map((environment) => this.uploadEnvironmentVariable(key, value, environment)))
|
|
93
93
|
.then(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vercel.js","sourceRoot":"","sources":["../../../../src/steps/upload-environment-variables/providers/vercel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAChE,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,
|
|
1
|
+
{"version":3,"file":"vercel.js","sourceRoot":"","sources":["../../../../src/steps/upload-environment-variables/providers/vercel.ts"],"names":[],"mappings":"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","sourcesContent":["import { execSync, spawn, spawnSync } from 'child_process';\nimport { EnvironmentProvider } from '../EnvironmentProvider.js';\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport type { InstallerOptions } from '../../../utils/types.js';\nimport ui from '../../../utils/ui.js';\nimport chalk from 'chalk';\nimport { analytics } from '../../../utils/analytics.js';\nimport { SPAWN_OPTS } from '../../../utils/platform.js';\n\nexport class VercelEnvironmentProvider extends EnvironmentProvider {\n name = 'Vercel';\n environments = ['production', 'preview', 'development'];\n\n constructor(options: InstallerOptions) {\n super(options);\n }\n\n // eslint-disable-next-line @typescript-eslint/require-await\n async detect(): Promise<boolean> {\n const vercelDetected = this.hasVercelCli() && this.isProjectLinked() && this.isAuthenticated();\n\n analytics.setTag('vercel-detected', vercelDetected);\n\n return vercelDetected;\n }\n\n hasDotVercelDir(): boolean {\n const dotVercelDir = path.join(this.options.installDir, '.vercel');\n return fs.existsSync(dotVercelDir);\n }\n\n hasVercelCli(): boolean {\n try {\n execSync('vercel --version', { stdio: 'ignore' });\n analytics.setTag('vercel-cli-installed', true);\n return true;\n } catch {\n analytics.setTag('vercel-cli-installed', false);\n return false;\n }\n }\n\n isProjectLinked(): boolean {\n const isProjectLinked = fs.existsSync(path.join(this.options.installDir, '.vercel', 'project.json'));\n\n analytics.setTag('vercel-project-linked', isProjectLinked);\n\n return isProjectLinked;\n }\n\n isAuthenticated(): boolean {\n const result = spawnSync('vercel', ['whoami'], {\n encoding: 'utf-8',\n stdio: ['pipe', 'pipe', 'pipe'],\n env: {\n ...process.env,\n FORCE_COLOR: '0',\n CI: '1',\n },\n ...SPAWN_OPTS,\n });\n\n const output = (String(result.stdout) + String(result.stderr)).toLowerCase();\n\n if (output.includes('log in to vercel') || output.includes('vercel login') || result.status !== 0) {\n analytics.setTag('vercel-authenticated', false);\n return false;\n }\n\n analytics.setTag('vercel-authenticated', true);\n\n return true;\n }\n\n async uploadEnvironmentVariable(key: string, value: string, environment: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const proc = spawn('vercel', ['env', 'add', key, environment], {\n stdio: ['pipe', 'pipe', 'pipe'],\n ...SPAWN_OPTS,\n });\n\n let stderr = '';\n proc.stderr.on('data', (data) => {\n stderr += data.toString();\n });\n\n proc.stdin.write(value);\n proc.stdin.end();\n\n proc.on('close', (code) => {\n if (\n stderr.includes('already exists') ||\n stderr.includes('already been added') ||\n stderr.includes('vercel env rm')\n ) {\n reject(\n new Error(\n `❌ Environment variable ${chalk.cyan(key)} already exists in ${this.name}. Please upload it manually.`,\n ),\n );\n } else if (code === 0) {\n resolve();\n } else {\n reject(\n new Error(\n `❌ Failed to upload environment variable ${chalk.cyan(key)} to ${this.name}. Please upload it manually.`,\n ),\n );\n }\n });\n });\n }\n\n async uploadEnvVars(vars: Record<string, string>): Promise<Record<string, boolean>> {\n const results: Record<string, boolean> = {};\n\n for (const [key, value] of Object.entries(vars)) {\n const spinner = ui.spinner();\n\n spinner.start(`Uploading ${chalk.cyan(key)} to ${this.name}...`);\n await Promise.all(this.environments.map((environment) => this.uploadEnvironmentVariable(key, value, environment)))\n .then(() => {\n spinner.stop(`✅ Uploaded ${chalk.cyan(key)} to ${this.name}`);\n results[key] = true;\n })\n .catch((err) => {\n spinner.stop(\n err instanceof Error\n ? err.message\n : `❌ Failed to upload environment variables to ${this.name}. Please upload it manually.`,\n );\n results[key] = false;\n });\n }\n\n return results;\n }\n}\n"]}
|
package/dist/utils/analytics.js
CHANGED
|
@@ -4,7 +4,8 @@ import { v4 as uuidv4 } from 'uuid';
|
|
|
4
4
|
import { debug } from './debug.js';
|
|
5
5
|
import { telemetryClient } from './telemetry-client.js';
|
|
6
6
|
import { isTelemetryEnabled } from '../lib/preferences.js';
|
|
7
|
-
import {
|
|
7
|
+
import { getVersion } from '../lib/settings.js';
|
|
8
|
+
import { getTelemetryUrl } from './urls.js';
|
|
8
9
|
import { getCredentials, isTokenExpired } from '../lib/credentials.js';
|
|
9
10
|
import { getActiveEnvironment, isUnclaimedEnvironment } from '../lib/config-store.js';
|
|
10
11
|
import { getDeviceId } from '../lib/device-id.js';
|
|
@@ -254,6 +255,9 @@ export class Analytics {
|
|
|
254
255
|
sessionId: this.sessionId,
|
|
255
256
|
timestamp: new Date().toISOString(),
|
|
256
257
|
attributes: {
|
|
258
|
+
// Extras first: standard fields below win on key collision, so callers
|
|
259
|
+
// can never override command.name, error fields, or the fingerprint.
|
|
260
|
+
...options?.extraAttributes,
|
|
257
261
|
'command.name': name,
|
|
258
262
|
'command.duration_ms': durationMs,
|
|
259
263
|
'command.success': success,
|