workos 0.0.24 → 0.1.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/.claude-plugin/plugin.json +13 -0
- package/LICENSE +47 -0
- package/README.md +154 -1
- package/dist/bin.d.ts +2 -0
- package/dist/bin.js +163 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli.config.d.ts +52 -0
- package/dist/cli.config.js +70 -0
- package/dist/cli.config.js.map +1 -0
- package/dist/package.json +87 -0
- package/dist/src/commands/install-skill.d.ts +20 -0
- package/dist/src/commands/install-skill.js +130 -0
- package/dist/src/commands/install-skill.js.map +1 -0
- package/dist/src/commands/install.d.ts +22 -0
- package/dist/src/commands/install.js +57 -0
- package/dist/src/commands/install.js.map +1 -0
- package/dist/src/commands/login.d.ts +1 -0
- package/dist/src/commands/login.js +141 -0
- package/dist/src/commands/login.js.map +1 -0
- package/dist/src/commands/logout.d.ts +1 -0
- package/dist/src/commands/logout.js +17 -0
- package/dist/src/commands/logout.js.map +1 -0
- package/dist/src/dashboard/components/AnimatedLogo.d.ts +8 -0
- package/dist/src/dashboard/components/AnimatedLogo.js +16 -0
- package/dist/src/dashboard/components/AnimatedLogo.js.map +1 -0
- package/dist/src/dashboard/components/CompletionView.d.ts +13 -0
- package/dist/src/dashboard/components/CompletionView.js +21 -0
- package/dist/src/dashboard/components/CompletionView.js.map +1 -0
- package/dist/src/dashboard/components/ConfirmPrompt.d.ts +9 -0
- package/dist/src/dashboard/components/ConfirmPrompt.js +25 -0
- package/dist/src/dashboard/components/ConfirmPrompt.js.map +1 -0
- package/dist/src/dashboard/components/CredentialsForm.d.ts +10 -0
- package/dist/src/dashboard/components/CredentialsForm.js +47 -0
- package/dist/src/dashboard/components/CredentialsForm.js.map +1 -0
- package/dist/src/dashboard/components/Dashboard.d.ts +3 -0
- package/dist/src/dashboard/components/Dashboard.js +100 -0
- package/dist/src/dashboard/components/Dashboard.js.map +1 -0
- package/dist/src/dashboard/components/DashboardLayout.d.ts +24 -0
- package/dist/src/dashboard/components/DashboardLayout.js +25 -0
- package/dist/src/dashboard/components/DashboardLayout.js.map +1 -0
- package/dist/src/dashboard/components/DiffPanel.d.ts +9 -0
- package/dist/src/dashboard/components/DiffPanel.js +136 -0
- package/dist/src/dashboard/components/DiffPanel.js.map +1 -0
- package/dist/src/dashboard/components/InlinePrompt.d.ts +8 -0
- package/dist/src/dashboard/components/InlinePrompt.js +19 -0
- package/dist/src/dashboard/components/InlinePrompt.js.map +1 -0
- package/dist/src/dashboard/components/OutputPanel.d.ts +10 -0
- package/dist/src/dashboard/components/OutputPanel.js +100 -0
- package/dist/src/dashboard/components/OutputPanel.js.map +1 -0
- package/dist/src/dashboard/components/Panel.d.ts +12 -0
- package/dist/src/dashboard/components/Panel.js +6 -0
- package/dist/src/dashboard/components/Panel.js.map +1 -0
- package/dist/src/dashboard/components/TextInput.d.ts +13 -0
- package/dist/src/dashboard/components/TextInput.js +57 -0
- package/dist/src/dashboard/components/TextInput.js.map +1 -0
- package/dist/src/dashboard/components/WelcomeArt.d.ts +2 -0
- package/dist/src/dashboard/components/WelcomeArt.js +9 -0
- package/dist/src/dashboard/components/WelcomeArt.js.map +1 -0
- package/dist/src/dashboard/hooks/useAnimation.d.ts +7 -0
- package/dist/src/dashboard/hooks/useAnimation.js +24 -0
- package/dist/src/dashboard/hooks/useAnimation.js.map +1 -0
- package/dist/src/dashboard/hooks/useKeyboard.d.ts +8 -0
- package/dist/src/dashboard/hooks/useKeyboard.js +18 -0
- package/dist/src/dashboard/hooks/useKeyboard.js.map +1 -0
- package/dist/src/dashboard/hooks/useTerminalSize.d.ts +8 -0
- package/dist/src/dashboard/hooks/useTerminalSize.js +23 -0
- package/dist/src/dashboard/hooks/useTerminalSize.js.map +1 -0
- package/dist/src/dashboard/index.d.ts +6 -0
- package/dist/src/dashboard/index.js +36 -0
- package/dist/src/dashboard/index.js.map +1 -0
- package/dist/src/dashboard/lib/diff-utils.d.ts +21 -0
- package/dist/src/dashboard/lib/diff-utils.js +271 -0
- package/dist/src/dashboard/lib/diff-utils.js.map +1 -0
- package/dist/src/dashboard/lib/logo-frames.d.ts +20 -0
- package/dist/src/dashboard/lib/logo-frames.js +109 -0
- package/dist/src/dashboard/lib/logo-frames.js.map +1 -0
- package/dist/src/dashboard/lib/welcome-art.d.ts +1 -0
- package/dist/src/dashboard/lib/welcome-art.js +5 -0
- package/dist/src/dashboard/lib/welcome-art.js.map +1 -0
- package/dist/src/dashboard/types.d.ts +5 -0
- package/dist/src/dashboard/types.js +2 -0
- package/dist/src/dashboard/types.js.map +1 -0
- package/dist/src/lib/__tests__/test-utils.d.ts +40 -0
- package/dist/src/lib/__tests__/test-utils.js +108 -0
- package/dist/src/lib/__tests__/test-utils.js.map +1 -0
- package/dist/src/lib/adapters/cli-adapter.d.ts +56 -0
- package/dist/src/lib/adapters/cli-adapter.js +318 -0
- package/dist/src/lib/adapters/cli-adapter.js.map +1 -0
- package/dist/src/lib/adapters/dashboard-adapter.d.ts +30 -0
- package/dist/src/lib/adapters/dashboard-adapter.js +97 -0
- package/dist/src/lib/adapters/dashboard-adapter.js.map +1 -0
- package/dist/src/lib/adapters/index.d.ts +3 -0
- package/dist/src/lib/adapters/index.js +3 -0
- package/dist/src/lib/adapters/index.js.map +1 -0
- package/dist/src/lib/adapters/types.d.ts +41 -0
- package/dist/src/lib/adapters/types.js +2 -0
- package/dist/src/lib/adapters/types.js.map +1 -0
- package/dist/src/lib/agent-interface.d.ts +75 -0
- package/dist/src/lib/agent-interface.js +563 -0
- package/dist/src/lib/agent-interface.js.map +1 -0
- package/dist/src/lib/agent-runner.d.ts +9 -0
- package/dist/src/lib/agent-runner.js +213 -0
- package/dist/src/lib/agent-runner.js.map +1 -0
- package/dist/src/lib/api.d.ts +25 -0
- package/dist/src/lib/api.js +120 -0
- package/dist/src/lib/api.js.map +1 -0
- package/dist/src/lib/config.d.ts +60 -0
- package/dist/src/lib/config.js +88 -0
- package/dist/src/lib/config.js.map +1 -0
- package/dist/src/lib/constants.d.ts +32 -0
- package/dist/src/lib/constants.js +53 -0
- package/dist/src/lib/constants.js.map +1 -0
- package/dist/src/lib/credentials.d.ts +19 -0
- package/dist/src/lib/credentials.js +55 -0
- package/dist/src/lib/credentials.js.map +1 -0
- package/dist/src/lib/env-writer.d.ts +14 -0
- package/dist/src/lib/env-writer.js +39 -0
- package/dist/src/lib/env-writer.js.map +1 -0
- package/dist/src/lib/events.d.ts +114 -0
- package/dist/src/lib/events.js +19 -0
- package/dist/src/lib/events.js.map +1 -0
- package/dist/src/lib/framework-config.d.ts +108 -0
- package/dist/src/lib/framework-config.js +11 -0
- package/dist/src/lib/framework-config.js.map +1 -0
- package/dist/src/lib/helper-functions.d.ts +1 -0
- package/dist/src/lib/helper-functions.js +2 -0
- package/dist/src/lib/helper-functions.js.map +1 -0
- package/dist/src/lib/port-detection.d.ts +7 -0
- package/dist/src/lib/port-detection.js +112 -0
- package/dist/src/lib/port-detection.js.map +1 -0
- package/dist/src/lib/progress-tracker.d.ts +22 -0
- package/dist/src/lib/progress-tracker.js +47 -0
- package/dist/src/lib/progress-tracker.js.map +1 -0
- package/dist/src/lib/run-with-core.d.ts +2 -0
- package/dist/src/lib/run-with-core.js +266 -0
- package/dist/src/lib/run-with-core.js.map +1 -0
- package/dist/src/lib/safe-tools.d.ts +2 -0
- package/dist/src/lib/safe-tools.js +212 -0
- package/dist/src/lib/safe-tools.js.map +1 -0
- package/dist/src/lib/settings.d.ts +59 -0
- package/dist/src/lib/settings.js +36 -0
- package/dist/src/lib/settings.js.map +1 -0
- package/dist/src/lib/token-refresh.d.ts +12 -0
- package/dist/src/lib/token-refresh.js +26 -0
- package/dist/src/lib/token-refresh.js.map +1 -0
- package/dist/src/lib/validation/build-validator.d.ts +9 -0
- package/dist/src/lib/validation/build-validator.js +118 -0
- package/dist/src/lib/validation/build-validator.js.map +1 -0
- package/dist/src/lib/validation/index.d.ts +3 -0
- package/dist/src/lib/validation/index.js +3 -0
- package/dist/src/lib/validation/index.js.map +1 -0
- package/dist/src/lib/validation/types.d.ts +41 -0
- package/dist/src/lib/validation/types.js +2 -0
- package/dist/src/lib/validation/types.js.map +1 -0
- package/dist/src/lib/validation/validator.d.ts +6 -0
- package/dist/src/lib/validation/validator.js +647 -0
- package/dist/src/lib/validation/validator.js.map +1 -0
- package/dist/src/lib/wizard-core.d.ts +200 -0
- package/dist/src/lib/wizard-core.js +392 -0
- package/dist/src/lib/wizard-core.js.map +1 -0
- package/dist/src/lib/wizard-core.types.d.ts +73 -0
- package/dist/src/lib/wizard-core.types.js +2 -0
- package/dist/src/lib/wizard-core.types.js.map +1 -0
- package/dist/src/lib/workos-management.d.ts +32 -0
- package/dist/src/lib/workos-management.js +142 -0
- package/dist/src/lib/workos-management.js.map +1 -0
- package/dist/src/nextjs/nextjs-wizard-agent.d.ts +6 -0
- package/dist/src/nextjs/nextjs-wizard-agent.js +97 -0
- package/dist/src/nextjs/nextjs-wizard-agent.js.map +1 -0
- package/dist/src/nextjs/utils.d.ts +8 -0
- package/dist/src/nextjs/utils.js +53 -0
- package/dist/src/nextjs/utils.js.map +1 -0
- package/dist/src/react/react-wizard-agent.d.ts +2 -0
- package/dist/src/react/react-wizard-agent.js +47 -0
- package/dist/src/react/react-wizard-agent.js.map +1 -0
- package/dist/src/react-router/react-router-wizard-agent.d.ts +6 -0
- package/dist/src/react-router/react-router-wizard-agent.js +103 -0
- package/dist/src/react-router/react-router-wizard-agent.js.map +1 -0
- package/dist/src/react-router/utils.d.ts +19 -0
- package/dist/src/react-router/utils.js +210 -0
- package/dist/src/react-router/utils.js.map +1 -0
- package/dist/src/run.d.ts +24 -0
- package/dist/src/run.js +48 -0
- package/dist/src/run.js.map +1 -0
- package/dist/src/steps/add-or-update-environment-variables.d.ts +10 -0
- package/dist/src/steps/add-or-update-environment-variables.js +155 -0
- package/dist/src/steps/add-or-update-environment-variables.js.map +1 -0
- package/dist/src/steps/index.d.ts +3 -0
- package/dist/src/steps/index.js +4 -0
- package/dist/src/steps/index.js.map +1 -0
- package/dist/src/steps/run-prettier.d.ts +5 -0
- package/dist/src/steps/run-prettier.js +54 -0
- package/dist/src/steps/run-prettier.js.map +1 -0
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.d.ts +8 -0
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js +7 -0
- package/dist/src/steps/upload-environment-variables/EnvironmentProvider.js.map +1 -0
- package/dist/src/steps/upload-environment-variables/index.d.ts +6 -0
- package/dist/src/steps/upload-environment-variables/index.js +57 -0
- package/dist/src/steps/upload-environment-variables/index.js.map +1 -0
- package/dist/src/steps/upload-environment-variables/providers/vercel.d.ts +14 -0
- package/dist/src/steps/upload-environment-variables/providers/vercel.js +104 -0
- package/dist/src/steps/upload-environment-variables/providers/vercel.js.map +1 -0
- package/dist/src/tanstack-start/tanstack-start-wizard-agent.d.ts +2 -0
- package/dist/src/tanstack-start/tanstack-start-wizard-agent.js +49 -0
- package/dist/src/tanstack-start/tanstack-start-wizard-agent.js.map +1 -0
- package/dist/src/telemetry.d.ts +2 -0
- package/dist/src/telemetry.js +29 -0
- package/dist/src/telemetry.js.map +1 -0
- package/dist/src/utils/analytics.d.ts +24 -0
- package/dist/src/utils/analytics.js +139 -0
- package/dist/src/utils/analytics.js.map +1 -0
- package/dist/src/utils/bash.d.ts +2 -0
- package/dist/src/utils/bash.js +17 -0
- package/dist/src/utils/bash.js.map +1 -0
- package/dist/src/utils/clack-utils.d.ts +93 -0
- package/dist/src/utils/clack-utils.js +397 -0
- package/dist/src/utils/clack-utils.js.map +1 -0
- package/dist/src/utils/clack.d.ts +5 -0
- package/dist/src/utils/clack.js +34 -0
- package/dist/src/utils/clack.js.map +1 -0
- package/dist/src/utils/cli-symbols.d.ts +32 -0
- package/dist/src/utils/cli-symbols.js +46 -0
- package/dist/src/utils/cli-symbols.js.map +1 -0
- package/dist/src/utils/debug.d.ts +7 -0
- package/dist/src/utils/debug.js +88 -0
- package/dist/src/utils/debug.js.map +1 -0
- package/dist/src/utils/env-parser.d.ts +5 -0
- package/dist/src/utils/env-parser.js +18 -0
- package/dist/src/utils/env-parser.js.map +1 -0
- package/dist/src/utils/environment.d.ts +4 -0
- package/dist/src/utils/environment.js +69 -0
- package/dist/src/utils/environment.js.map +1 -0
- package/dist/src/utils/errors.d.ts +3 -0
- package/dist/src/utils/errors.js +7 -0
- package/dist/src/utils/errors.js.map +1 -0
- package/dist/src/utils/logging.d.ts +9 -0
- package/dist/src/utils/logging.js +36 -0
- package/dist/src/utils/logging.js.map +1 -0
- package/dist/src/utils/package-json.d.ts +25 -0
- package/dist/src/utils/package-json.js +21 -0
- package/dist/src/utils/package-json.js.map +1 -0
- package/dist/src/utils/package-manager.d.ts +21 -0
- package/dist/src/utils/package-manager.js +167 -0
- package/dist/src/utils/package-manager.js.map +1 -0
- package/dist/src/utils/redact.d.ts +5 -0
- package/dist/src/utils/redact.js +29 -0
- package/dist/src/utils/redact.js.map +1 -0
- package/dist/src/utils/semver.d.ts +10 -0
- package/dist/src/utils/semver.js +43 -0
- package/dist/src/utils/semver.js.map +1 -0
- package/dist/src/utils/string.d.ts +1 -0
- package/dist/src/utils/string.js +6 -0
- package/dist/src/utils/string.js.map +1 -0
- package/dist/src/utils/telemetry-client.d.ts +15 -0
- package/dist/src/utils/telemetry-client.js +57 -0
- package/dist/src/utils/telemetry-client.js.map +1 -0
- package/dist/src/utils/telemetry-types.d.ts +51 -0
- package/dist/src/utils/telemetry-types.js +6 -0
- package/dist/src/utils/telemetry-types.js.map +1 -0
- package/dist/src/utils/types.d.ts +80 -0
- package/dist/src/utils/types.js +2 -0
- package/dist/src/utils/types.js.map +1 -0
- package/dist/src/utils/urls.d.ts +7 -0
- package/dist/src/utils/urls.js +8 -0
- package/dist/src/utils/urls.js.map +1 -0
- package/dist/src/utils/vendor/is-unicorn-supported.d.ts +1 -0
- package/dist/src/utils/vendor/is-unicorn-supported.js +21 -0
- package/dist/src/utils/vendor/is-unicorn-supported.js.map +1 -0
- package/dist/src/vanilla-js/vanilla-js-wizard-agent.d.ts +2 -0
- package/dist/src/vanilla-js/vanilla-js-wizard-agent.js +47 -0
- package/dist/src/vanilla-js/vanilla-js-wizard-agent.js.map +1 -0
- package/package.json +76 -84
- package/skills/workos-authkit-base/SKILL.md +113 -0
- package/skills/workos-authkit-nextjs/SKILL.md +115 -0
- package/skills/workos-authkit-react/SKILL.md +91 -0
- package/skills/workos-authkit-react-router/SKILL.md +106 -0
- package/skills/workos-authkit-tanstack-start/SKILL.md +104 -0
- package/skills/workos-authkit-vanilla-js/SKILL.md +81 -0
- package/build/apps/index.js +0 -50
- package/build/apps/slack.js +0 -151
- package/build/cli.js +0 -42
- package/build/config.js +0 -34
- package/build/dev.js +0 -5
- package/build/enable-api-access.png +0 -0
- package/build/groups.js +0 -480
- package/build/index.js +0 -3
- package/build/info.js +0 -69
- package/build/login.js +0 -161
- package/build/main.js +0 -214
- package/build/users.js +0 -402
- package/build/util.js +0 -157
- package/coverage/clover.xml +0 -66
- package/coverage/coverage-final.json +0 -4
- package/coverage/lcov-report/base.css +0 -212
- package/coverage/lcov-report/cli.ts.html +0 -329
- package/coverage/lcov-report/config.ts.html +0 -152
- package/coverage/lcov-report/index.html +0 -119
- package/coverage/lcov-report/prettify.css +0 -1
- package/coverage/lcov-report/prettify.js +0 -1
- package/coverage/lcov-report/sort-arrow-sprite.png +0 -0
- package/coverage/lcov-report/sorter.js +0 -158
- package/coverage/lcov-report/util.ts.html +0 -350
- package/coverage/lcov.info +0 -121
- package/package-lock.json +0 -7617
- package/tests/util.test.ts +0 -35
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { traceStep } from '../../telemetry.js';
|
|
2
|
+
import { analytics } from '../../utils/analytics.js';
|
|
3
|
+
import clack from '../../utils/clack.js';
|
|
4
|
+
import { abortIfCancelled } from '../../utils/clack-utils.js';
|
|
5
|
+
import { VercelEnvironmentProvider } from './providers/vercel.js';
|
|
6
|
+
export const uploadEnvironmentVariablesStep = async (envVars, { integration, options, }) => {
|
|
7
|
+
const providers = [new VercelEnvironmentProvider(options)];
|
|
8
|
+
let provider = null;
|
|
9
|
+
for (const p of providers) {
|
|
10
|
+
if (await p.detect()) {
|
|
11
|
+
provider = p;
|
|
12
|
+
break;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
if (!provider) {
|
|
16
|
+
analytics.capture('wizard interaction', {
|
|
17
|
+
action: 'not uploading environment variables',
|
|
18
|
+
reason: 'no environment provider found',
|
|
19
|
+
integration,
|
|
20
|
+
});
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
const upload = await abortIfCancelled(clack.select({
|
|
24
|
+
message: `It looks like you are using ${provider.name}. Would you like to upload the environment variables?`,
|
|
25
|
+
options: [
|
|
26
|
+
{
|
|
27
|
+
value: true,
|
|
28
|
+
label: 'Yes',
|
|
29
|
+
hint: `Upload the environment variables to ${provider.name}`,
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
value: false,
|
|
33
|
+
label: 'No',
|
|
34
|
+
hint: `Skip uploading environment variables to ${provider.name} - you can do this later`,
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
}), integration);
|
|
38
|
+
if (!upload) {
|
|
39
|
+
analytics.capture('wizard interaction', {
|
|
40
|
+
action: 'not uploading environment variables',
|
|
41
|
+
reason: 'user declined to upload',
|
|
42
|
+
provider: provider.name,
|
|
43
|
+
integration,
|
|
44
|
+
});
|
|
45
|
+
return [];
|
|
46
|
+
}
|
|
47
|
+
const results = await traceStep('uploading environment variables', async () => {
|
|
48
|
+
return await provider.uploadEnvVars(envVars);
|
|
49
|
+
});
|
|
50
|
+
analytics.capture('wizard interaction', {
|
|
51
|
+
action: 'uploaded environment variables',
|
|
52
|
+
provider: provider.name,
|
|
53
|
+
integration,
|
|
54
|
+
});
|
|
55
|
+
return Object.keys(results).filter((key) => results[key]);
|
|
56
|
+
};
|
|
57
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +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,KAAK,MAAM,sBAAsB,CAAC;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG9D,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,oBAAoB,EAAE;YACtC,MAAM,EAAE,qCAAqC;YAC7C,MAAM,EAAE,+BAA+B;YACvC,WAAW;SACZ,CAAC,CAAC;QACH,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAY,MAAM,gBAAgB,CAC5C,KAAK,CAAC,MAAM,CAAC;QACX,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,oBAAoB,EAAE;YACtC,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,oBAAoB,EAAE;QACtC,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 clack from '../../utils/clack.js';\nimport { abortIfCancelled } from '../../utils/clack-utils.js';\nimport type { WizardOptions } 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: WizardOptions;\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('wizard interaction', {\n action: 'not uploading environment variables',\n reason: 'no environment provider found',\n integration,\n });\n return [];\n }\n\n const upload: boolean = await abortIfCancelled(\n clack.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('wizard 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('wizard 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"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { EnvironmentProvider } from '../EnvironmentProvider.js';
|
|
2
|
+
import type { WizardOptions } from '../../../utils/types.js';
|
|
3
|
+
export declare class VercelEnvironmentProvider extends EnvironmentProvider {
|
|
4
|
+
name: string;
|
|
5
|
+
environments: string[];
|
|
6
|
+
constructor(options: WizardOptions);
|
|
7
|
+
detect(): Promise<boolean>;
|
|
8
|
+
hasDotVercelDir(): boolean;
|
|
9
|
+
hasVercelCli(): boolean;
|
|
10
|
+
isProjectLinked(): boolean;
|
|
11
|
+
isAuthenticated(): boolean;
|
|
12
|
+
uploadEnvironmentVariable(key: string, value: string, environment: string): Promise<void>;
|
|
13
|
+
uploadEnvVars(vars: Record<string, string>): Promise<Record<string, boolean>>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { execSync, spawn, spawnSync } from 'child_process';
|
|
2
|
+
import { EnvironmentProvider } from '../EnvironmentProvider.js';
|
|
3
|
+
import * as fs from 'fs';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import clack from '../../../utils/clack.js';
|
|
6
|
+
import chalk from 'chalk';
|
|
7
|
+
import { analytics } from '../../../utils/analytics.js';
|
|
8
|
+
export class VercelEnvironmentProvider extends EnvironmentProvider {
|
|
9
|
+
name = 'Vercel';
|
|
10
|
+
environments = ['production', 'preview', 'development'];
|
|
11
|
+
constructor(options) {
|
|
12
|
+
super(options);
|
|
13
|
+
}
|
|
14
|
+
// eslint-disable-next-line @typescript-eslint/require-await
|
|
15
|
+
async detect() {
|
|
16
|
+
const vercelDetected = this.hasVercelCli() && this.isProjectLinked() && this.isAuthenticated();
|
|
17
|
+
analytics.setTag('vercel-detected', vercelDetected);
|
|
18
|
+
return vercelDetected;
|
|
19
|
+
}
|
|
20
|
+
hasDotVercelDir() {
|
|
21
|
+
const dotVercelDir = path.join(this.options.installDir, '.vercel');
|
|
22
|
+
return fs.existsSync(dotVercelDir);
|
|
23
|
+
}
|
|
24
|
+
hasVercelCli() {
|
|
25
|
+
try {
|
|
26
|
+
execSync('vercel --version', { stdio: 'ignore' });
|
|
27
|
+
analytics.setTag('vercel-cli-installed', true);
|
|
28
|
+
return true;
|
|
29
|
+
}
|
|
30
|
+
catch {
|
|
31
|
+
analytics.setTag('vercel-cli-installed', false);
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
isProjectLinked() {
|
|
36
|
+
const isProjectLinked = fs.existsSync(path.join(this.options.installDir, '.vercel', 'project.json'));
|
|
37
|
+
analytics.setTag('vercel-project-linked', isProjectLinked);
|
|
38
|
+
return isProjectLinked;
|
|
39
|
+
}
|
|
40
|
+
isAuthenticated() {
|
|
41
|
+
const result = spawnSync('vercel', ['whoami'], {
|
|
42
|
+
encoding: 'utf-8',
|
|
43
|
+
stdio: ['pipe', 'pipe', 'pipe'], // suppress prompts
|
|
44
|
+
env: {
|
|
45
|
+
...process.env,
|
|
46
|
+
FORCE_COLOR: '0', // avoid ANSI formatting
|
|
47
|
+
CI: '1', // hint to CLI that it's a non-interactive env
|
|
48
|
+
},
|
|
49
|
+
});
|
|
50
|
+
const output = (String(result.stdout) + String(result.stderr)).toLowerCase();
|
|
51
|
+
if (output.includes('log in to vercel') || output.includes('vercel login') || result.status !== 0) {
|
|
52
|
+
analytics.setTag('vercel-authenticated', false);
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
analytics.setTag('vercel-authenticated', true);
|
|
56
|
+
return true;
|
|
57
|
+
}
|
|
58
|
+
async uploadEnvironmentVariable(key, value, environment) {
|
|
59
|
+
await new Promise((resolve, reject) => {
|
|
60
|
+
const proc = spawn('vercel', ['env', 'add', key, environment], {
|
|
61
|
+
stdio: ['pipe', 'pipe', 'pipe'],
|
|
62
|
+
});
|
|
63
|
+
let stderr = '';
|
|
64
|
+
proc.stderr.on('data', (data) => {
|
|
65
|
+
stderr += data.toString();
|
|
66
|
+
});
|
|
67
|
+
proc.stdin.write(value);
|
|
68
|
+
proc.stdin.end();
|
|
69
|
+
proc.on('close', (code) => {
|
|
70
|
+
if (stderr.includes('already exists') ||
|
|
71
|
+
stderr.includes('already been added') ||
|
|
72
|
+
stderr.includes('vercel env rm')) {
|
|
73
|
+
reject(new Error(`❌ Environment variable ${chalk.cyan(key)} already exists in ${this.name}. Please upload it manually.`));
|
|
74
|
+
}
|
|
75
|
+
else if (code === 0) {
|
|
76
|
+
resolve();
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
reject(new Error(`❌ Failed to upload environment variable ${chalk.cyan(key)} to ${this.name}. Please upload it manually.`));
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
async uploadEnvVars(vars) {
|
|
85
|
+
const results = {};
|
|
86
|
+
for (const [key, value] of Object.entries(vars)) {
|
|
87
|
+
const spinner = clack.spinner();
|
|
88
|
+
spinner.start(`Uploading ${chalk.cyan(key)} to ${this.name}...`);
|
|
89
|
+
await Promise.all(this.environments.map((environment) => this.uploadEnvironmentVariable(key, value, environment)))
|
|
90
|
+
.then(() => {
|
|
91
|
+
spinner.stop(`✅ Uploaded ${chalk.cyan(key)} to ${this.name}`);
|
|
92
|
+
results[key] = true;
|
|
93
|
+
})
|
|
94
|
+
.catch((err) => {
|
|
95
|
+
spinner.stop(err instanceof Error
|
|
96
|
+
? err.message
|
|
97
|
+
: `❌ Failed to upload environment variables to ${this.name}. Please upload it manually.`);
|
|
98
|
+
results[key] = false;
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
return results;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=vercel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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 { WizardOptions } from '../../../utils/types.js';\nimport clack from '../../../utils/clack.js';\nimport chalk from 'chalk';\nimport { analytics } from '../../../utils/analytics.js';\n\nexport class VercelEnvironmentProvider extends EnvironmentProvider {\n name = 'Vercel';\n environments = ['production', 'preview', 'development'];\n\n constructor(options: WizardOptions) {\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'], // suppress prompts\n env: {\n ...process.env,\n FORCE_COLOR: '0', // avoid ANSI formatting\n CI: '1', // hint to CLI that it's a non-interactive env\n },\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 });\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 = clack.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"]}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { enableDebugLogs } from '../utils/debug.js';
|
|
2
|
+
import { runAgentWizard } from '../lib/agent-runner.js';
|
|
3
|
+
import { Integration } from '../lib/constants.js';
|
|
4
|
+
import { getPackageVersion } from '../utils/package-json.js';
|
|
5
|
+
const TANSTACK_START_AGENT_CONFIG = {
|
|
6
|
+
metadata: {
|
|
7
|
+
name: 'TanStack Start',
|
|
8
|
+
integration: Integration.tanstackStart,
|
|
9
|
+
docsUrl: 'https://workos.com/docs/user-management/authkit/tanstack-start',
|
|
10
|
+
unsupportedVersionDocsUrl: 'https://workos.com/docs/user-management/authkit/tanstack-start',
|
|
11
|
+
skillName: 'workos-authkit-tanstack-start',
|
|
12
|
+
},
|
|
13
|
+
detection: {
|
|
14
|
+
packageName: '@tanstack/react-start',
|
|
15
|
+
packageDisplayName: 'TanStack Start',
|
|
16
|
+
getVersion: (packageJson) => getPackageVersion('@tanstack/react-start', packageJson),
|
|
17
|
+
},
|
|
18
|
+
environment: {
|
|
19
|
+
uploadToHosting: false,
|
|
20
|
+
requiresApiKey: true, // Server-side framework
|
|
21
|
+
getEnvVars: (apiKey, clientId) => ({
|
|
22
|
+
WORKOS_API_KEY: apiKey,
|
|
23
|
+
WORKOS_CLIENT_ID: clientId,
|
|
24
|
+
}),
|
|
25
|
+
},
|
|
26
|
+
analytics: {
|
|
27
|
+
getTags: () => ({}),
|
|
28
|
+
},
|
|
29
|
+
prompts: {},
|
|
30
|
+
ui: {
|
|
31
|
+
successMessage: 'WorkOS AuthKit integration complete',
|
|
32
|
+
getOutroChanges: () => [
|
|
33
|
+
'Analyzed your TanStack Start project structure',
|
|
34
|
+
'Created and configured WorkOS AuthKit',
|
|
35
|
+
'Integrated authentication into your application',
|
|
36
|
+
],
|
|
37
|
+
getOutroNextSteps: () => [
|
|
38
|
+
'Start your development server to test authentication',
|
|
39
|
+
'Visit the WorkOS Dashboard to manage users and settings',
|
|
40
|
+
],
|
|
41
|
+
},
|
|
42
|
+
};
|
|
43
|
+
export async function runTanstackStartWizardAgent(options) {
|
|
44
|
+
if (options.debug) {
|
|
45
|
+
enableDebugLogs();
|
|
46
|
+
}
|
|
47
|
+
return runAgentWizard(TANSTACK_START_AGENT_CONFIG, options);
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=tanstack-start-wizard-agent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tanstack-start-wizard-agent.js","sourceRoot":"","sources":["../../../src/tanstack-start/tanstack-start-wizard-agent.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE7D,MAAM,2BAA2B,GAAoB;IACnD,QAAQ,EAAE;QACR,IAAI,EAAE,gBAAgB;QACtB,WAAW,EAAE,WAAW,CAAC,aAAa;QACtC,OAAO,EAAE,gEAAgE;QACzE,yBAAyB,EAAE,gEAAgE;QAC3F,SAAS,EAAE,+BAA+B;KAC3C;IAED,SAAS,EAAE;QACT,WAAW,EAAE,uBAAuB;QACpC,kBAAkB,EAAE,gBAAgB;QACpC,UAAU,EAAE,CAAC,WAAgB,EAAE,EAAE,CAAC,iBAAiB,CAAC,uBAAuB,EAAE,WAAW,CAAC;KAC1F;IAED,WAAW,EAAE;QACX,eAAe,EAAE,KAAK;QACtB,cAAc,EAAE,IAAI,EAAE,wBAAwB;QAC9C,UAAU,EAAE,CAAC,MAAc,EAAE,QAAgB,EAAE,EAAE,CAAC,CAAC;YACjD,cAAc,EAAE,MAAM;YACtB,gBAAgB,EAAE,QAAQ;SAC3B,CAAC;KACH;IAED,SAAS,EAAE;QACT,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;KACpB;IAED,OAAO,EAAE,EAAE;IAEX,EAAE,EAAE;QACF,cAAc,EAAE,qCAAqC;QACrD,eAAe,EAAE,GAAG,EAAE,CAAC;YACrB,gDAAgD;YAChD,uCAAuC;YACvC,iDAAiD;SAClD;QACD,iBAAiB,EAAE,GAAG,EAAE,CAAC;YACvB,sDAAsD;YACtD,yDAAyD;SAC1D;KACF;CACF,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAAsB;IACtE,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,eAAe,EAAE,CAAC;IACpB,CAAC;IAED,OAAO,cAAc,CAAC,2BAA2B,EAAE,OAAO,CAAC,CAAC;AAC9D,CAAC","sourcesContent":["/* TanStack Start wizard using Claude Agent SDK */\nimport type { WizardOptions } from '../utils/types.js';\nimport type { FrameworkConfig } from '../lib/framework-config.js';\nimport { enableDebugLogs } from '../utils/debug.js';\nimport { runAgentWizard } from '../lib/agent-runner.js';\nimport { Integration } from '../lib/constants.js';\nimport { getPackageVersion } from '../utils/package-json.js';\n\nconst TANSTACK_START_AGENT_CONFIG: FrameworkConfig = {\n metadata: {\n name: 'TanStack Start',\n integration: Integration.tanstackStart,\n docsUrl: 'https://workos.com/docs/user-management/authkit/tanstack-start',\n unsupportedVersionDocsUrl: 'https://workos.com/docs/user-management/authkit/tanstack-start',\n skillName: 'workos-authkit-tanstack-start',\n },\n\n detection: {\n packageName: '@tanstack/react-start',\n packageDisplayName: 'TanStack Start',\n getVersion: (packageJson: any) => getPackageVersion('@tanstack/react-start', packageJson),\n },\n\n environment: {\n uploadToHosting: false,\n requiresApiKey: true, // Server-side framework\n getEnvVars: (apiKey: string, clientId: string) => ({\n WORKOS_API_KEY: apiKey,\n WORKOS_CLIENT_ID: clientId,\n }),\n },\n\n analytics: {\n getTags: () => ({}),\n },\n\n prompts: {},\n\n ui: {\n successMessage: 'WorkOS AuthKit integration complete',\n getOutroChanges: () => [\n 'Analyzed your TanStack Start project structure',\n 'Created and configured WorkOS AuthKit',\n 'Integrated authentication into your application',\n ],\n getOutroNextSteps: () => [\n 'Start your development server to test authentication',\n 'Visit the WorkOS Dashboard to manage users and settings',\n ],\n },\n};\n\nexport async function runTanstackStartWizardAgent(options: WizardOptions): Promise<string> {\n if (options.debug) {\n enableDebugLogs();\n }\n\n return runAgentWizard(TANSTACK_START_AGENT_CONFIG, options);\n}\n"]}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { analytics } from './utils/analytics.js';
|
|
2
|
+
export function traceStep(step, callback) {
|
|
3
|
+
const startTime = Date.now();
|
|
4
|
+
updateProgress(step);
|
|
5
|
+
try {
|
|
6
|
+
const result = callback();
|
|
7
|
+
if (result instanceof Promise) {
|
|
8
|
+
return result
|
|
9
|
+
.then((value) => {
|
|
10
|
+
analytics.stepCompleted(step, Date.now() - startTime, true);
|
|
11
|
+
return value;
|
|
12
|
+
})
|
|
13
|
+
.catch((error) => {
|
|
14
|
+
analytics.stepCompleted(step, Date.now() - startTime, false, error);
|
|
15
|
+
throw error;
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
analytics.stepCompleted(step, Date.now() - startTime, true);
|
|
19
|
+
return result;
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
analytics.stepCompleted(step, Date.now() - startTime, false, error);
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
export function updateProgress(step) {
|
|
27
|
+
analytics.setTag('progress', step);
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=telemetry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","sourceRoot":"","sources":["../../src/telemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAEjD,MAAM,UAAU,SAAS,CAAI,IAAY,EAAE,QAAiB;IAC1D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAC7B,cAAc,CAAC,IAAI,CAAC,CAAC;IAErB,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;QAE1B,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;YAC9B,OAAO,MAAM;iBACV,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;gBACd,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC;gBAC5D,OAAO,KAAK,CAAC;YACf,CAAC,CAAC;iBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;gBACf,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBACpE,MAAM,KAAK,CAAC;YACd,CAAC,CAAM,CAAC;QACZ,CAAC;QAED,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC;QAC5D,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,SAAS,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,KAAK,EAAE,KAAc,CAAC,CAAC;QAC7E,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC","sourcesContent":["import { analytics } from './utils/analytics.js';\n\nexport function traceStep<T>(step: string, callback: () => T): T {\n const startTime = Date.now();\n updateProgress(step);\n\n try {\n const result = callback();\n\n if (result instanceof Promise) {\n return result\n .then((value) => {\n analytics.stepCompleted(step, Date.now() - startTime, true);\n return value;\n })\n .catch((error) => {\n analytics.stepCompleted(step, Date.now() - startTime, false, error);\n throw error;\n }) as T;\n }\n\n analytics.stepCompleted(step, Date.now() - startTime, true);\n return result;\n } catch (error) {\n analytics.stepCompleted(step, Date.now() - startTime, false, error as Error);\n throw error;\n }\n}\n\nexport function updateProgress(step: string) {\n analytics.setTag('progress', step);\n}\n"]}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
export declare class Analytics {
|
|
2
|
+
private tags;
|
|
3
|
+
private sessionId;
|
|
4
|
+
private sessionStartTime;
|
|
5
|
+
private distinctId?;
|
|
6
|
+
private totalInputTokens;
|
|
7
|
+
private totalOutputTokens;
|
|
8
|
+
private agentIterations;
|
|
9
|
+
constructor();
|
|
10
|
+
setDistinctId(distinctId: string): void;
|
|
11
|
+
setAccessToken(token: string): void;
|
|
12
|
+
setGatewayUrl(url: string): void;
|
|
13
|
+
setTag(key: string, value: string | boolean | number | null | undefined): void;
|
|
14
|
+
capture(eventName: string, properties?: Record<string, unknown>): void;
|
|
15
|
+
captureException(error: Error, properties?: Record<string, unknown>): void;
|
|
16
|
+
getFeatureFlag(_flagKey: string): Promise<string | boolean | undefined>;
|
|
17
|
+
sessionStart(mode: 'cli' | 'tui', version: string): void;
|
|
18
|
+
stepCompleted(name: string, durationMs: number, success: boolean, error?: Error): void;
|
|
19
|
+
toolCalled(toolName: string, durationMs: number, success: boolean): void;
|
|
20
|
+
llmRequest(model: string, inputTokens: number, outputTokens: number): void;
|
|
21
|
+
incrementAgentIterations(): void;
|
|
22
|
+
shutdown(status: 'success' | 'error' | 'cancelled'): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
export declare const analytics: Analytics;
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
2
|
+
import { debug } from './debug.js';
|
|
3
|
+
import { telemetryClient } from './telemetry-client.js';
|
|
4
|
+
import { WORKOS_TELEMETRY_ENABLED } from '../lib/constants.js';
|
|
5
|
+
export class Analytics {
|
|
6
|
+
tags = {};
|
|
7
|
+
sessionId;
|
|
8
|
+
sessionStartTime;
|
|
9
|
+
distinctId;
|
|
10
|
+
// Agent metrics tracking
|
|
11
|
+
totalInputTokens = 0;
|
|
12
|
+
totalOutputTokens = 0;
|
|
13
|
+
agentIterations = 0;
|
|
14
|
+
constructor() {
|
|
15
|
+
this.sessionId = uuidv4();
|
|
16
|
+
this.sessionStartTime = new Date();
|
|
17
|
+
this.tags = { $app_name: 'authkit-wizard' };
|
|
18
|
+
}
|
|
19
|
+
setDistinctId(distinctId) {
|
|
20
|
+
this.distinctId = distinctId;
|
|
21
|
+
}
|
|
22
|
+
setAccessToken(token) {
|
|
23
|
+
telemetryClient.setAccessToken(token);
|
|
24
|
+
}
|
|
25
|
+
setGatewayUrl(url) {
|
|
26
|
+
telemetryClient.setGatewayUrl(url);
|
|
27
|
+
}
|
|
28
|
+
setTag(key, value) {
|
|
29
|
+
this.tags[key] = value;
|
|
30
|
+
}
|
|
31
|
+
capture(eventName, properties) {
|
|
32
|
+
if (!WORKOS_TELEMETRY_ENABLED)
|
|
33
|
+
return;
|
|
34
|
+
debug(`[Analytics] capture: ${eventName}`, properties);
|
|
35
|
+
// Accumulate primitive values as tags for the session.end event
|
|
36
|
+
if (properties) {
|
|
37
|
+
for (const [key, value] of Object.entries(properties)) {
|
|
38
|
+
if (['string', 'number', 'boolean'].includes(typeof value)) {
|
|
39
|
+
this.tags[key] = value;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
captureException(error, properties = {}) {
|
|
45
|
+
if (!WORKOS_TELEMETRY_ENABLED)
|
|
46
|
+
return;
|
|
47
|
+
debug('[Analytics] captureException:', error.message, properties);
|
|
48
|
+
this.tags['error.type'] = error.name;
|
|
49
|
+
this.tags['error.message'] = error.message;
|
|
50
|
+
}
|
|
51
|
+
async getFeatureFlag(_flagKey) {
|
|
52
|
+
// Feature flags not implemented yet
|
|
53
|
+
return undefined;
|
|
54
|
+
}
|
|
55
|
+
sessionStart(mode, version) {
|
|
56
|
+
if (!WORKOS_TELEMETRY_ENABLED)
|
|
57
|
+
return;
|
|
58
|
+
const event = {
|
|
59
|
+
type: 'session.start',
|
|
60
|
+
sessionId: this.sessionId,
|
|
61
|
+
timestamp: this.sessionStartTime.toISOString(),
|
|
62
|
+
attributes: {
|
|
63
|
+
'wizard.version': version,
|
|
64
|
+
'wizard.mode': mode,
|
|
65
|
+
'workos.user_id': this.distinctId,
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
telemetryClient.queueEvent(event);
|
|
69
|
+
}
|
|
70
|
+
stepCompleted(name, durationMs, success, error) {
|
|
71
|
+
if (!WORKOS_TELEMETRY_ENABLED)
|
|
72
|
+
return;
|
|
73
|
+
const event = {
|
|
74
|
+
type: 'step',
|
|
75
|
+
sessionId: this.sessionId,
|
|
76
|
+
timestamp: new Date().toISOString(),
|
|
77
|
+
name,
|
|
78
|
+
durationMs,
|
|
79
|
+
success,
|
|
80
|
+
error: error ? { type: error.name, message: error.message } : undefined,
|
|
81
|
+
};
|
|
82
|
+
telemetryClient.queueEvent(event);
|
|
83
|
+
}
|
|
84
|
+
toolCalled(toolName, durationMs, success) {
|
|
85
|
+
if (!WORKOS_TELEMETRY_ENABLED)
|
|
86
|
+
return;
|
|
87
|
+
const event = {
|
|
88
|
+
type: 'agent.tool',
|
|
89
|
+
sessionId: this.sessionId,
|
|
90
|
+
timestamp: new Date().toISOString(),
|
|
91
|
+
toolName,
|
|
92
|
+
durationMs,
|
|
93
|
+
success,
|
|
94
|
+
};
|
|
95
|
+
telemetryClient.queueEvent(event);
|
|
96
|
+
}
|
|
97
|
+
llmRequest(model, inputTokens, outputTokens) {
|
|
98
|
+
if (!WORKOS_TELEMETRY_ENABLED)
|
|
99
|
+
return;
|
|
100
|
+
this.totalInputTokens += inputTokens;
|
|
101
|
+
this.totalOutputTokens += outputTokens;
|
|
102
|
+
const event = {
|
|
103
|
+
type: 'agent.llm',
|
|
104
|
+
sessionId: this.sessionId,
|
|
105
|
+
timestamp: new Date().toISOString(),
|
|
106
|
+
model,
|
|
107
|
+
inputTokens,
|
|
108
|
+
outputTokens,
|
|
109
|
+
};
|
|
110
|
+
telemetryClient.queueEvent(event);
|
|
111
|
+
}
|
|
112
|
+
incrementAgentIterations() {
|
|
113
|
+
this.agentIterations++;
|
|
114
|
+
}
|
|
115
|
+
async shutdown(status) {
|
|
116
|
+
if (!WORKOS_TELEMETRY_ENABLED)
|
|
117
|
+
return;
|
|
118
|
+
const duration = Date.now() - this.sessionStartTime.getTime();
|
|
119
|
+
// Filter out null/undefined tags
|
|
120
|
+
const extraAttributes = Object.fromEntries(Object.entries(this.tags).filter(([, v]) => v != null));
|
|
121
|
+
const event = {
|
|
122
|
+
type: 'session.end',
|
|
123
|
+
sessionId: this.sessionId,
|
|
124
|
+
timestamp: new Date().toISOString(),
|
|
125
|
+
attributes: {
|
|
126
|
+
'wizard.outcome': status,
|
|
127
|
+
'wizard.duration_ms': duration,
|
|
128
|
+
'wizard.agent.iterations': this.agentIterations,
|
|
129
|
+
'wizard.agent.tokens.input': this.totalInputTokens,
|
|
130
|
+
'wizard.agent.tokens.output': this.totalOutputTokens,
|
|
131
|
+
...extraAttributes,
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
telemetryClient.queueEvent(event);
|
|
135
|
+
await telemetryClient.flush();
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
export const analytics = new Analytics();
|
|
139
|
+
//# sourceMappingURL=analytics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../../src/utils/analytics.ts"],"names":[],"mappings":"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","sourcesContent":["import { v4 as uuidv4 } from 'uuid';\nimport { debug } from './debug.js';\nimport { telemetryClient } from './telemetry-client.js';\nimport type {\n SessionStartEvent,\n SessionEndEvent,\n StepEvent,\n AgentToolEvent,\n AgentLLMEvent,\n} from './telemetry-types.js';\nimport { WORKOS_TELEMETRY_ENABLED } from '../lib/constants.js';\n\nexport class Analytics {\n private tags: Record<string, string | boolean | number | null | undefined> = {};\n private sessionId: string;\n private sessionStartTime: Date;\n private distinctId?: string;\n\n // Agent metrics tracking\n private totalInputTokens = 0;\n private totalOutputTokens = 0;\n private agentIterations = 0;\n\n constructor() {\n this.sessionId = uuidv4();\n this.sessionStartTime = new Date();\n this.tags = { $app_name: 'authkit-wizard' };\n }\n\n setDistinctId(distinctId: string) {\n this.distinctId = distinctId;\n }\n\n setAccessToken(token: string) {\n telemetryClient.setAccessToken(token);\n }\n\n setGatewayUrl(url: string) {\n telemetryClient.setGatewayUrl(url);\n }\n\n setTag(key: string, value: string | boolean | number | null | undefined) {\n this.tags[key] = value;\n }\n\n capture(eventName: string, properties?: Record<string, unknown>) {\n if (!WORKOS_TELEMETRY_ENABLED) return;\n\n debug(`[Analytics] capture: ${eventName}`, properties);\n\n // Accumulate primitive values as tags for the session.end event\n if (properties) {\n for (const [key, value] of Object.entries(properties)) {\n if (['string', 'number', 'boolean'].includes(typeof value)) {\n this.tags[key] = value as string | number | boolean;\n }\n }\n }\n }\n\n captureException(error: Error, properties: Record<string, unknown> = {}) {\n if (!WORKOS_TELEMETRY_ENABLED) return;\n\n debug('[Analytics] captureException:', error.message, properties);\n this.tags['error.type'] = error.name;\n this.tags['error.message'] = error.message;\n }\n\n async getFeatureFlag(_flagKey: string): Promise<string | boolean | undefined> {\n // Feature flags not implemented yet\n return undefined;\n }\n\n sessionStart(mode: 'cli' | 'tui', version: string) {\n if (!WORKOS_TELEMETRY_ENABLED) return;\n\n const event: SessionStartEvent = {\n type: 'session.start',\n sessionId: this.sessionId,\n timestamp: this.sessionStartTime.toISOString(),\n attributes: {\n 'wizard.version': version,\n 'wizard.mode': mode,\n 'workos.user_id': this.distinctId,\n },\n };\n\n telemetryClient.queueEvent(event);\n }\n\n stepCompleted(name: string, durationMs: number, success: boolean, error?: Error) {\n if (!WORKOS_TELEMETRY_ENABLED) return;\n\n const event: StepEvent = {\n type: 'step',\n sessionId: this.sessionId,\n timestamp: new Date().toISOString(),\n name,\n durationMs,\n success,\n error: error ? { type: error.name, message: error.message } : undefined,\n };\n\n telemetryClient.queueEvent(event);\n }\n\n toolCalled(toolName: string, durationMs: number, success: boolean) {\n if (!WORKOS_TELEMETRY_ENABLED) return;\n\n const event: AgentToolEvent = {\n type: 'agent.tool',\n sessionId: this.sessionId,\n timestamp: new Date().toISOString(),\n toolName,\n durationMs,\n success,\n };\n\n telemetryClient.queueEvent(event);\n }\n\n llmRequest(model: string, inputTokens: number, outputTokens: number) {\n if (!WORKOS_TELEMETRY_ENABLED) return;\n\n this.totalInputTokens += inputTokens;\n this.totalOutputTokens += outputTokens;\n\n const event: AgentLLMEvent = {\n type: 'agent.llm',\n sessionId: this.sessionId,\n timestamp: new Date().toISOString(),\n model,\n inputTokens,\n outputTokens,\n };\n\n telemetryClient.queueEvent(event);\n }\n\n incrementAgentIterations() {\n this.agentIterations++;\n }\n\n async shutdown(status: 'success' | 'error' | 'cancelled') {\n if (!WORKOS_TELEMETRY_ENABLED) return;\n\n const duration = Date.now() - this.sessionStartTime.getTime();\n\n // Filter out null/undefined tags\n const extraAttributes = Object.fromEntries(Object.entries(this.tags).filter(([, v]) => v != null)) as Record<\n string,\n string | number | boolean\n >;\n\n const event: SessionEndEvent = {\n type: 'session.end',\n sessionId: this.sessionId,\n timestamp: new Date().toISOString(),\n attributes: {\n 'wizard.outcome': status,\n 'wizard.duration_ms': duration,\n 'wizard.agent.iterations': this.agentIterations,\n 'wizard.agent.tokens.input': this.totalInputTokens,\n 'wizard.agent.tokens.output': this.totalOutputTokens,\n ...extraAttributes,\n },\n };\n\n telemetryClient.queueEvent(event);\n await telemetryClient.flush();\n }\n}\n\nexport const analytics = new Analytics();\n"]}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as child_process from 'child_process';
|
|
2
|
+
export function executeSync(command) {
|
|
3
|
+
const output = child_process.execSync(command);
|
|
4
|
+
return output.toString();
|
|
5
|
+
}
|
|
6
|
+
export function execute(command) {
|
|
7
|
+
return new Promise((resolve, reject) => {
|
|
8
|
+
child_process.exec(command, (error, stdout, _) => {
|
|
9
|
+
if (error) {
|
|
10
|
+
reject(error);
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
resolve(stdout);
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=bash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bash.js","sourceRoot":"","sources":["../../../src/utils/bash.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,aAAa,MAAM,eAAe,CAAC;AAE/C,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC/C,OAAO,MAAM,CAAC,QAAQ,EAAE,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,OAAO,CAAC,OAAe;IACrC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;YAC/C,IAAI,KAAK,EAAE,CAAC;gBACV,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YAED,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["import * as child_process from 'child_process';\n\nexport function executeSync(command: string): string {\n const output = child_process.execSync(command);\n return output.toString();\n}\n\nexport function execute(command: string): Promise<string> {\n return new Promise((resolve, reject) => {\n child_process.exec(command, (error, stdout, _) => {\n if (error) {\n reject(error);\n return;\n }\n\n resolve(stdout);\n });\n });\n}\n"]}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { type PackageDotJson } from './package-json.js';
|
|
2
|
+
import { type PackageManager } from './package-manager.js';
|
|
3
|
+
import type { WizardOptions } from './types.js';
|
|
4
|
+
import { type Integration } from '../lib/constants.js';
|
|
5
|
+
export interface CliSetupConfig {
|
|
6
|
+
filename: string;
|
|
7
|
+
name: string;
|
|
8
|
+
gitignore: boolean;
|
|
9
|
+
likelyAlreadyHasAuthToken(contents: string): boolean;
|
|
10
|
+
tokenContent(authToken: string): string;
|
|
11
|
+
likelyAlreadyHasOrgAndProject(contents: string): boolean;
|
|
12
|
+
orgAndProjContent(org: string, project: string): string;
|
|
13
|
+
likelyAlreadyHasUrl?(contents: string): boolean;
|
|
14
|
+
urlContent?(url: string): string;
|
|
15
|
+
}
|
|
16
|
+
export interface CliSetupConfigContent {
|
|
17
|
+
authToken: string;
|
|
18
|
+
org?: string;
|
|
19
|
+
project?: string;
|
|
20
|
+
url?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function abort(message?: string, status?: number): Promise<never>;
|
|
23
|
+
export declare function abortIfCancelled<T>(input: T | Promise<T>, integration?: Integration): Promise<Exclude<T, symbol>>;
|
|
24
|
+
export declare function printWelcome(options: {
|
|
25
|
+
wizardName: string;
|
|
26
|
+
message?: string;
|
|
27
|
+
}): void;
|
|
28
|
+
export declare function confirmContinueIfNoOrDirtyGitRepo(options: Pick<WizardOptions, 'ci'>): Promise<void>;
|
|
29
|
+
export declare function isInGitRepo(): boolean;
|
|
30
|
+
export declare function getUncommittedOrUntrackedFiles(): string[];
|
|
31
|
+
export declare function askForItemSelection(items: string[], message: string): Promise<{
|
|
32
|
+
value: string;
|
|
33
|
+
index: number;
|
|
34
|
+
}>;
|
|
35
|
+
export declare function confirmContinueIfPackageVersionNotSupported({ packageId, packageName, packageVersion, acceptableVersions, note, }: {
|
|
36
|
+
packageId: string;
|
|
37
|
+
packageName: string;
|
|
38
|
+
packageVersion: string;
|
|
39
|
+
acceptableVersions: string;
|
|
40
|
+
note?: string;
|
|
41
|
+
}): Promise<void>;
|
|
42
|
+
export declare function isReact19Installed({ installDir }: Pick<WizardOptions, 'installDir'>): Promise<boolean>;
|
|
43
|
+
/**
|
|
44
|
+
* Installs or updates a package with the user's package manager.
|
|
45
|
+
*
|
|
46
|
+
* IMPORTANT: This function modifies the `package.json`! Be sure to re-read
|
|
47
|
+
* it if you make additional modifications to it after calling this function!
|
|
48
|
+
*/
|
|
49
|
+
export declare function installPackage({ packageName, alreadyInstalled, askBeforeUpdating, packageNameDisplayLabel, packageManager, forceInstall, integration, installDir, }: {
|
|
50
|
+
/** The string that is passed to the package manager CLI as identifier to install (e.g. `@workos-inc/authkit-nextjs`, or `@workos-inc/authkit-nextjs@^2.0.0`) */
|
|
51
|
+
packageName: string;
|
|
52
|
+
alreadyInstalled: boolean;
|
|
53
|
+
askBeforeUpdating?: boolean;
|
|
54
|
+
/** Overrides what is shown in the installation logs in place of the `packageName` option. Useful if the `packageName` is ugly */
|
|
55
|
+
packageNameDisplayLabel?: string;
|
|
56
|
+
packageManager?: PackageManager;
|
|
57
|
+
/** Add force install flag to command to skip install precondition fails */
|
|
58
|
+
forceInstall?: boolean;
|
|
59
|
+
/** The integration that is being used */
|
|
60
|
+
integration?: string;
|
|
61
|
+
/** The directory to install the package in */
|
|
62
|
+
installDir: string;
|
|
63
|
+
}): Promise<{
|
|
64
|
+
packageManager?: PackageManager;
|
|
65
|
+
}>;
|
|
66
|
+
/**
|
|
67
|
+
* Checks if @param packageId is listed as a dependency in @param packageJson.
|
|
68
|
+
* If not, it will ask users if they want to continue without the package.
|
|
69
|
+
*
|
|
70
|
+
* Use this function to check if e.g. a the framework of the SDK is installed
|
|
71
|
+
*
|
|
72
|
+
* @param packageJson the package.json object
|
|
73
|
+
* @param packageId the npm name of the package
|
|
74
|
+
* @param packageName a human readable name of the package
|
|
75
|
+
*/
|
|
76
|
+
export declare function ensurePackageIsInstalled(packageJson: PackageDotJson, packageId: string, packageName: string, options?: Pick<WizardOptions, 'dashboard'>): Promise<void>;
|
|
77
|
+
export declare function getPackageDotJson({ installDir }: Pick<WizardOptions, 'installDir'>): Promise<PackageDotJson>;
|
|
78
|
+
export declare function updatePackageDotJson(packageDotJson: PackageDotJson, { installDir }: Pick<WizardOptions, 'installDir'>): Promise<void>;
|
|
79
|
+
export declare function getPackageManager(options: Pick<WizardOptions, 'installDir'> & {
|
|
80
|
+
ci?: boolean;
|
|
81
|
+
}): Promise<PackageManager>;
|
|
82
|
+
export declare function isUsingTypeScript({ installDir }: Pick<WizardOptions, 'installDir'>): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Get WorkOS credentials (API Key and Client ID) from user or CLI options
|
|
85
|
+
* @param requireApiKey - Whether API key is needed (false for client-only SDKs like React, Vanilla JS)
|
|
86
|
+
*/
|
|
87
|
+
export declare function getOrAskForWorkOSCredentials(_options: Pick<WizardOptions, 'ci' | 'apiKey' | 'clientId' | 'installDir' | 'dashboard'>, requireApiKey?: boolean): Promise<{
|
|
88
|
+
apiKey: string;
|
|
89
|
+
clientId: string;
|
|
90
|
+
}>;
|
|
91
|
+
/**
|
|
92
|
+
* Fetch project data using a personal API key (for CI mode)
|
|
93
|
+
*/
|