workos 0.12.0 → 0.12.2
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/dist/cli.config.d.ts +32 -0
- package/dist/cli.config.js +32 -0
- package/dist/cli.config.js.map +1 -1
- package/dist/integrations/dotnet/index.js +13 -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/kotlin/index.js +25 -0
- package/dist/integrations/kotlin/index.js.map +1 -1
- package/dist/integrations/python/index.js +1 -0
- package/dist/integrations/python/index.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.js +24 -1
- package/dist/lib/adapters/cli-adapter.js.map +1 -1
- package/dist/lib/adapters/headless-adapter.js +23 -1
- package/dist/lib/adapters/headless-adapter.js.map +1 -1
- package/dist/lib/agent-interface.d.ts +3 -1
- package/dist/lib/agent-interface.js +49 -0
- package/dist/lib/agent-interface.js.map +1 -1
- package/dist/lib/agent-runner.js +3 -1
- package/dist/lib/agent-runner.js.map +1 -1
- package/dist/lib/env-writer.d.ts +10 -0
- package/dist/lib/env-writer.js +36 -6
- package/dist/lib/env-writer.js.map +1 -1
- package/dist/lib/framework-config.d.ts +11 -1
- package/dist/lib/framework-config.js.map +1 -1
- package/dist/lib/port-detection.js +124 -0
- package/dist/lib/port-detection.js.map +1 -1
- package/dist/lib/registry.d.ts +1 -2
- package/dist/lib/registry.js.map +1 -1
- package/dist/lib/run-with-core.d.ts +5 -0
- package/dist/lib/run-with-core.js +26 -3
- package/dist/lib/run-with-core.js.map +1 -1
- package/dist/lib/unclaimed-env-provision.js +2 -2
- package/dist/lib/unclaimed-env-provision.js.map +1 -1
- package/package.json +1 -1
- package/dist/lib/language-detection.d.ts +0 -20
- package/dist/lib/language-detection.js +0 -96
- package/dist/lib/language-detection.js.map +0 -1
|
@@ -8,6 +8,14 @@ const INTEGRATION_TO_SETTINGS_KEY = {
|
|
|
8
8
|
'tanstack-start': 'tanstackStart',
|
|
9
9
|
'react-router': 'reactRouter',
|
|
10
10
|
'vanilla-js': 'vanillaJs',
|
|
11
|
+
python: 'python',
|
|
12
|
+
ruby: 'ruby',
|
|
13
|
+
php: 'php',
|
|
14
|
+
'php-laravel': 'phpLaravel',
|
|
15
|
+
go: 'go',
|
|
16
|
+
dotnet: 'dotnet',
|
|
17
|
+
elixir: 'elixir',
|
|
18
|
+
kotlin: 'kotlin',
|
|
11
19
|
};
|
|
12
20
|
const DEFAULT_PORT = 3000;
|
|
13
21
|
const DEFAULT_CALLBACK_PATH = '/auth/callback';
|
|
@@ -79,6 +87,110 @@ function parseTanStackPort(installDir) {
|
|
|
79
87
|
}
|
|
80
88
|
return null;
|
|
81
89
|
}
|
|
90
|
+
/**
|
|
91
|
+
* Parse port from .NET Properties/launchSettings.json.
|
|
92
|
+
* VS/Rider scaffold: profiles[*].applicationUrl = "http://localhost:5000;https://localhost:5001"
|
|
93
|
+
*/
|
|
94
|
+
function parseDotnetPort(installDir) {
|
|
95
|
+
try {
|
|
96
|
+
const configPath = join(installDir, 'Properties', 'launchSettings.json');
|
|
97
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
98
|
+
const parsed = JSON.parse(content);
|
|
99
|
+
for (const profile of Object.values(parsed.profiles ?? {})) {
|
|
100
|
+
const match = profile.applicationUrl?.match(/http:\/\/[^:/]+:(\d+)/);
|
|
101
|
+
if (match)
|
|
102
|
+
return parseInt(match[1], 10);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// File doesn't exist or can't parse
|
|
107
|
+
}
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Parse port from Phoenix config/dev.exs or config/runtime.exs.
|
|
112
|
+
* Looks for `port: NNNN` — typically inside `http: [...]` but a bare regex is fine.
|
|
113
|
+
*/
|
|
114
|
+
function parseElixirPort(installDir) {
|
|
115
|
+
for (const relPath of ['config/dev.exs', 'config/runtime.exs']) {
|
|
116
|
+
try {
|
|
117
|
+
const content = fs.readFileSync(join(installDir, relPath), 'utf-8');
|
|
118
|
+
const match = content.match(/port:\s*(\d+)/);
|
|
119
|
+
if (match)
|
|
120
|
+
return parseInt(match[1], 10);
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
// skip
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return null;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Parse port from Spring Boot application.properties or application.yml.
|
|
130
|
+
* Both the default `src/main/resources/` location and a top-level file are checked.
|
|
131
|
+
*/
|
|
132
|
+
function parseKotlinPort(installDir) {
|
|
133
|
+
const propsPaths = [
|
|
134
|
+
join(installDir, 'src', 'main', 'resources', 'application.properties'),
|
|
135
|
+
join(installDir, 'application.properties'),
|
|
136
|
+
];
|
|
137
|
+
for (const propsPath of propsPaths) {
|
|
138
|
+
try {
|
|
139
|
+
const content = fs.readFileSync(propsPath, 'utf-8');
|
|
140
|
+
const match = content.match(/^server\.port\s*=\s*(\d+)/m);
|
|
141
|
+
if (match)
|
|
142
|
+
return parseInt(match[1], 10);
|
|
143
|
+
}
|
|
144
|
+
catch {
|
|
145
|
+
// skip
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
const ymlPaths = [
|
|
149
|
+
join(installDir, 'src', 'main', 'resources', 'application.yml'),
|
|
150
|
+
join(installDir, 'src', 'main', 'resources', 'application.yaml'),
|
|
151
|
+
join(installDir, 'application.yml'),
|
|
152
|
+
join(installDir, 'application.yaml'),
|
|
153
|
+
];
|
|
154
|
+
for (const ymlPath of ymlPaths) {
|
|
155
|
+
try {
|
|
156
|
+
const content = fs.readFileSync(ymlPath, 'utf-8');
|
|
157
|
+
// `server:\n port: 8080` — shallow YAML parse via regex
|
|
158
|
+
const match = content.match(/server\s*:\s*\n[^\S\n]+port\s*:\s*(\d+)/);
|
|
159
|
+
if (match)
|
|
160
|
+
return parseInt(match[1], 10);
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
// skip
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Parse port from Rails config/puma.rb.
|
|
170
|
+
* Common forms:
|
|
171
|
+
* port ENV.fetch("PORT") { 3000 }
|
|
172
|
+
* port ENV.fetch("PORT", 3000)
|
|
173
|
+
* port 3000
|
|
174
|
+
*/
|
|
175
|
+
function parseRubyPort(installDir) {
|
|
176
|
+
try {
|
|
177
|
+
const configPath = join(installDir, 'config', 'puma.rb');
|
|
178
|
+
const content = fs.readFileSync(configPath, 'utf-8');
|
|
179
|
+
const blockFetch = content.match(/port\s+ENV\.fetch\([^)]*\)\s*\{\s*(\d+)\s*\}/);
|
|
180
|
+
if (blockFetch)
|
|
181
|
+
return parseInt(blockFetch[1], 10);
|
|
182
|
+
const argFetch = content.match(/port\s+ENV\.fetch\([^,]+,\s*(\d+)\)/);
|
|
183
|
+
if (argFetch)
|
|
184
|
+
return parseInt(argFetch[1], 10);
|
|
185
|
+
const literal = content.match(/^\s*port\s+(\d+)/m);
|
|
186
|
+
if (literal)
|
|
187
|
+
return parseInt(literal[1], 10);
|
|
188
|
+
}
|
|
189
|
+
catch {
|
|
190
|
+
// skip
|
|
191
|
+
}
|
|
192
|
+
return null;
|
|
193
|
+
}
|
|
82
194
|
/**
|
|
83
195
|
* Detect the dev server port for a framework.
|
|
84
196
|
* Checks config files first, falls back to framework default.
|
|
@@ -108,6 +220,18 @@ export function detectPort(integration, installDir) {
|
|
|
108
220
|
}
|
|
109
221
|
break;
|
|
110
222
|
}
|
|
223
|
+
case 'dotnet':
|
|
224
|
+
detectedPort = parseDotnetPort(installDir);
|
|
225
|
+
break;
|
|
226
|
+
case 'elixir':
|
|
227
|
+
detectedPort = parseElixirPort(installDir);
|
|
228
|
+
break;
|
|
229
|
+
case 'kotlin':
|
|
230
|
+
detectedPort = parseKotlinPort(installDir);
|
|
231
|
+
break;
|
|
232
|
+
case 'ruby':
|
|
233
|
+
detectedPort = parseRubyPort(installDir);
|
|
234
|
+
break;
|
|
111
235
|
}
|
|
112
236
|
return detectedPort ?? getDefaultPort(integration);
|
|
113
237
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"port-detection.js","sourceRoot":"","sources":["../../src/lib/port-detection.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport { join } from 'node:path';\nimport type { Integration } from './constants.js';\nimport { getConfig } from './settings.js';\n\nconst settings = getConfig();\n\nconst INTEGRATION_TO_SETTINGS_KEY: Record<Integration, string> = {\n nextjs: 'nextjs',\n react: 'react',\n 'tanstack-start': 'tanstackStart',\n 'react-router': 'reactRouter',\n 'vanilla-js': 'vanillaJs',\n};\n\nconst DEFAULT_PORT = 3000;\nconst DEFAULT_CALLBACK_PATH = '/auth/callback';\n\nfunction getDefaultPort(integration: Integration): number {\n const settingsKey = INTEGRATION_TO_SETTINGS_KEY[integration];\n return settings.frameworks[settingsKey]?.port ?? DEFAULT_PORT;\n}\n\nexport function getCallbackPath(integration: Integration): string {\n const settingsKey = INTEGRATION_TO_SETTINGS_KEY[integration];\n return settings.frameworks[settingsKey]?.callbackPath ?? DEFAULT_CALLBACK_PATH;\n}\n\n/**\n * Parse port from Vite config file.\n * Looks for server.port in vite.config.{ts,js,mjs}\n */\nfunction parseViteConfigPort(configPath: string): number | null {\n try {\n const content = fs.readFileSync(configPath, 'utf-8');\n // Match: port: 3000 or port: \"3000\" or port: '3000'\n const portMatch = content.match(/port\\s*:\\s*['\"]?(\\d+)['\"]?/);\n if (portMatch) {\n return parseInt(portMatch[1], 10);\n }\n } catch {\n // File doesn't exist or can't be read\n }\n return null;\n}\n\n/**\n * Parse port from Next.js package.json scripts.\n * Next.js uses: \"dev\": \"next dev -p 4000\" or --port 4000\n */\nfunction parseNextConfigPort(installDir: string): number | null {\n try {\n const packageJsonPath = join(installDir, 'package.json');\n const content = fs.readFileSync(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(content);\n\n const devScript = packageJson.scripts?.dev || '';\n // Match: -p 4000, --port 4000, --port=4000\n const portMatch = devScript.match(/-p\\s+(\\d+)|--port[=\\s]+(\\d+)/);\n if (portMatch) {\n return parseInt(portMatch[1] || portMatch[2], 10);\n }\n } catch {\n // Can't read package.json\n }\n return null;\n}\n\n/**\n * Parse port from TanStack Start app.config.ts.\n * Uses Vinxi: server: { port: N }\n */\nfunction parseTanStackPort(installDir: string): number | null {\n const configPaths = [join(installDir, 'app.config.ts'), join(installDir, 'app.config.js')];\n\n for (const configPath of configPaths) {\n try {\n const content = fs.readFileSync(configPath, 'utf-8');\n // Match server config with port\n const portMatch = content.match(/server\\s*:\\s*\\{[^}]*port\\s*:\\s*(\\d+)/);\n if (portMatch) {\n return parseInt(portMatch[1], 10);\n }\n } catch {\n // Config file doesn't exist\n }\n }\n return null;\n}\n\n/**\n * Detect the dev server port for a framework.\n * Checks config files first, falls back to framework default.\n */\nexport function detectPort(integration: Integration, installDir: string): number {\n let detectedPort: number | null = null;\n\n switch (integration) {\n case 'nextjs':\n detectedPort = parseNextConfigPort(installDir);\n break;\n\n case 'tanstack-start':\n detectedPort = parseTanStackPort(installDir);\n break;\n\n case 'react':\n case 'react-router':\n case 'vanilla-js': {\n // Vite-based frameworks\n const viteConfigs = [\n join(installDir, 'vite.config.ts'),\n join(installDir, 'vite.config.js'),\n join(installDir, 'vite.config.mjs'),\n ];\n for (const configPath of viteConfigs) {\n detectedPort = parseViteConfigPort(configPath);\n if (detectedPort) break;\n }\n break;\n }\n }\n\n return detectedPort ?? getDefaultPort(integration);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"port-detection.js","sourceRoot":"","sources":["../../src/lib/port-detection.ts"],"names":[],"mappings":"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","sourcesContent":["import * as fs from 'node:fs';\nimport { join } from 'node:path';\nimport type { Integration } from './constants.js';\nimport { getConfig } from './settings.js';\n\nconst settings = getConfig();\n\nconst INTEGRATION_TO_SETTINGS_KEY: Record<string, string> = {\n nextjs: 'nextjs',\n react: 'react',\n 'tanstack-start': 'tanstackStart',\n 'react-router': 'reactRouter',\n 'vanilla-js': 'vanillaJs',\n python: 'python',\n ruby: 'ruby',\n php: 'php',\n 'php-laravel': 'phpLaravel',\n go: 'go',\n dotnet: 'dotnet',\n elixir: 'elixir',\n kotlin: 'kotlin',\n};\n\nconst DEFAULT_PORT = 3000;\nconst DEFAULT_CALLBACK_PATH = '/auth/callback';\n\nfunction getDefaultPort(integration: Integration): number {\n const settingsKey = INTEGRATION_TO_SETTINGS_KEY[integration];\n return settings.frameworks[settingsKey]?.port ?? DEFAULT_PORT;\n}\n\nexport function getCallbackPath(integration: Integration): string {\n const settingsKey = INTEGRATION_TO_SETTINGS_KEY[integration];\n return settings.frameworks[settingsKey]?.callbackPath ?? DEFAULT_CALLBACK_PATH;\n}\n\n/**\n * Parse port from Vite config file.\n * Looks for server.port in vite.config.{ts,js,mjs}\n */\nfunction parseViteConfigPort(configPath: string): number | null {\n try {\n const content = fs.readFileSync(configPath, 'utf-8');\n // Match: port: 3000 or port: \"3000\" or port: '3000'\n const portMatch = content.match(/port\\s*:\\s*['\"]?(\\d+)['\"]?/);\n if (portMatch) {\n return parseInt(portMatch[1], 10);\n }\n } catch {\n // File doesn't exist or can't be read\n }\n return null;\n}\n\n/**\n * Parse port from Next.js package.json scripts.\n * Next.js uses: \"dev\": \"next dev -p 4000\" or --port 4000\n */\nfunction parseNextConfigPort(installDir: string): number | null {\n try {\n const packageJsonPath = join(installDir, 'package.json');\n const content = fs.readFileSync(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(content);\n\n const devScript = packageJson.scripts?.dev || '';\n // Match: -p 4000, --port 4000, --port=4000\n const portMatch = devScript.match(/-p\\s+(\\d+)|--port[=\\s]+(\\d+)/);\n if (portMatch) {\n return parseInt(portMatch[1] || portMatch[2], 10);\n }\n } catch {\n // Can't read package.json\n }\n return null;\n}\n\n/**\n * Parse port from TanStack Start app.config.ts.\n * Uses Vinxi: server: { port: N }\n */\nfunction parseTanStackPort(installDir: string): number | null {\n const configPaths = [join(installDir, 'app.config.ts'), join(installDir, 'app.config.js')];\n\n for (const configPath of configPaths) {\n try {\n const content = fs.readFileSync(configPath, 'utf-8');\n // Match server config with port\n const portMatch = content.match(/server\\s*:\\s*\\{[^}]*port\\s*:\\s*(\\d+)/);\n if (portMatch) {\n return parseInt(portMatch[1], 10);\n }\n } catch {\n // Config file doesn't exist\n }\n }\n return null;\n}\n\n/**\n * Parse port from .NET Properties/launchSettings.json.\n * VS/Rider scaffold: profiles[*].applicationUrl = \"http://localhost:5000;https://localhost:5001\"\n */\nfunction parseDotnetPort(installDir: string): number | null {\n try {\n const configPath = join(installDir, 'Properties', 'launchSettings.json');\n const content = fs.readFileSync(configPath, 'utf-8');\n const parsed = JSON.parse(content) as { profiles?: Record<string, { applicationUrl?: string }> };\n for (const profile of Object.values(parsed.profiles ?? {})) {\n const match = profile.applicationUrl?.match(/http:\\/\\/[^:/]+:(\\d+)/);\n if (match) return parseInt(match[1], 10);\n }\n } catch {\n // File doesn't exist or can't parse\n }\n return null;\n}\n\n/**\n * Parse port from Phoenix config/dev.exs or config/runtime.exs.\n * Looks for `port: NNNN` — typically inside `http: [...]` but a bare regex is fine.\n */\nfunction parseElixirPort(installDir: string): number | null {\n for (const relPath of ['config/dev.exs', 'config/runtime.exs']) {\n try {\n const content = fs.readFileSync(join(installDir, relPath), 'utf-8');\n const match = content.match(/port:\\s*(\\d+)/);\n if (match) return parseInt(match[1], 10);\n } catch {\n // skip\n }\n }\n return null;\n}\n\n/**\n * Parse port from Spring Boot application.properties or application.yml.\n * Both the default `src/main/resources/` location and a top-level file are checked.\n */\nfunction parseKotlinPort(installDir: string): number | null {\n const propsPaths = [\n join(installDir, 'src', 'main', 'resources', 'application.properties'),\n join(installDir, 'application.properties'),\n ];\n for (const propsPath of propsPaths) {\n try {\n const content = fs.readFileSync(propsPath, 'utf-8');\n const match = content.match(/^server\\.port\\s*=\\s*(\\d+)/m);\n if (match) return parseInt(match[1], 10);\n } catch {\n // skip\n }\n }\n\n const ymlPaths = [\n join(installDir, 'src', 'main', 'resources', 'application.yml'),\n join(installDir, 'src', 'main', 'resources', 'application.yaml'),\n join(installDir, 'application.yml'),\n join(installDir, 'application.yaml'),\n ];\n for (const ymlPath of ymlPaths) {\n try {\n const content = fs.readFileSync(ymlPath, 'utf-8');\n // `server:\\n port: 8080` — shallow YAML parse via regex\n const match = content.match(/server\\s*:\\s*\\n[^\\S\\n]+port\\s*:\\s*(\\d+)/);\n if (match) return parseInt(match[1], 10);\n } catch {\n // skip\n }\n }\n return null;\n}\n\n/**\n * Parse port from Rails config/puma.rb.\n * Common forms:\n * port ENV.fetch(\"PORT\") { 3000 }\n * port ENV.fetch(\"PORT\", 3000)\n * port 3000\n */\nfunction parseRubyPort(installDir: string): number | null {\n try {\n const configPath = join(installDir, 'config', 'puma.rb');\n const content = fs.readFileSync(configPath, 'utf-8');\n const blockFetch = content.match(/port\\s+ENV\\.fetch\\([^)]*\\)\\s*\\{\\s*(\\d+)\\s*\\}/);\n if (blockFetch) return parseInt(blockFetch[1], 10);\n const argFetch = content.match(/port\\s+ENV\\.fetch\\([^,]+,\\s*(\\d+)\\)/);\n if (argFetch) return parseInt(argFetch[1], 10);\n const literal = content.match(/^\\s*port\\s+(\\d+)/m);\n if (literal) return parseInt(literal[1], 10);\n } catch {\n // skip\n }\n return null;\n}\n\n/**\n * Detect the dev server port for a framework.\n * Checks config files first, falls back to framework default.\n */\nexport function detectPort(integration: Integration, installDir: string): number {\n let detectedPort: number | null = null;\n\n switch (integration) {\n case 'nextjs':\n detectedPort = parseNextConfigPort(installDir);\n break;\n\n case 'tanstack-start':\n detectedPort = parseTanStackPort(installDir);\n break;\n\n case 'react':\n case 'react-router':\n case 'vanilla-js': {\n // Vite-based frameworks\n const viteConfigs = [\n join(installDir, 'vite.config.ts'),\n join(installDir, 'vite.config.js'),\n join(installDir, 'vite.config.mjs'),\n ];\n for (const configPath of viteConfigs) {\n detectedPort = parseViteConfigPort(configPath);\n if (detectedPort) break;\n }\n break;\n }\n\n case 'dotnet':\n detectedPort = parseDotnetPort(installDir);\n break;\n\n case 'elixir':\n detectedPort = parseElixirPort(installDir);\n break;\n\n case 'kotlin':\n detectedPort = parseKotlinPort(installDir);\n break;\n\n case 'ruby':\n detectedPort = parseRubyPort(installDir);\n break;\n }\n\n return detectedPort ?? getDefaultPort(integration);\n}\n"]}
|
package/dist/lib/registry.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type { FrameworkConfig } from './framework-config.js';
|
|
2
|
-
import type { Language } from './language-detection.js';
|
|
1
|
+
import type { FrameworkConfig, Language } from './framework-config.js';
|
|
3
2
|
import type { InstallerOptions } from '../utils/types.js';
|
|
4
3
|
/**
|
|
5
4
|
* Standard exports from an integration module.
|
package/dist/lib/registry.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/lib/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/lib/registry.ts"],"names":[],"mappings":"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","sourcesContent":["import { readdirSync, existsSync } from 'node:fs';\nimport { join, dirname } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { FrameworkConfig, Language } from './framework-config.js';\nimport type { InstallerOptions } from '../utils/types.js';\n\n/**\n * Standard exports from an integration module.\n * Each `src/integrations/{name}/index.ts` must export these.\n */\nexport interface IntegrationModule {\n config: FrameworkConfig;\n run: (options: InstallerOptions) => Promise<string>;\n}\n\n/**\n * Registry that provides lookup, detection, and enumeration of integrations.\n */\nexport interface IntegrationRegistry {\n /** All registered integrations */\n all(): FrameworkConfig[];\n\n /** Get config by integration name */\n get(name: string): IntegrationModule | undefined;\n\n /** Get integrations for a specific language, ordered by priority */\n forLanguage(language: Language): FrameworkConfig[];\n\n /** Get integration names for CLI choices */\n choices(): Array<{ name: string; value: string }>;\n\n /** Detection order: all integrations sorted by priority (higher = checked first) */\n detectionOrder(): FrameworkConfig[];\n}\n\n/**\n * Build the integration registry by discovering all integration modules.\n * Scans `src/integrations/` (or `dist/integrations/` at runtime) for directories\n * with an index.js/index.ts file and dynamically imports them.\n */\nexport async function buildRegistry(): Promise<IntegrationRegistry> {\n const modules = new Map<string, IntegrationModule>();\n\n // Resolve the integrations directory relative to this file\n // In dev: src/lib/registry.ts -> src/integrations/\n // In dist: dist/lib/registry.js -> dist/integrations/\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n const integrationsDir = join(__dirname, '..', 'integrations');\n\n if (!existsSync(integrationsDir)) {\n throw new Error(`No integrations directory found at ${integrationsDir}. Is the build corrupt?`);\n }\n\n const entries = readdirSync(integrationsDir, { withFileTypes: true });\n const dirs = entries.filter((e) => e.isDirectory()).map((e) => e.name);\n\n if (dirs.length === 0) {\n throw new Error('No integrations found. Is the build corrupt?');\n }\n\n for (const dir of dirs) {\n // Skip directories starting with _ (convention for internal files like _manifest.ts)\n if (dir.startsWith('_')) continue;\n\n const indexPath = join(integrationsDir, dir, 'index.js');\n const indexTsPath = join(integrationsDir, dir, 'index.ts');\n\n if (!existsSync(indexPath) && !existsSync(indexTsPath)) {\n // Skip directories without an index file (not an integration)\n continue;\n }\n\n try {\n const mod = (await import(join(integrationsDir, dir, 'index.js'))) as IntegrationModule;\n\n if (!mod.config || !mod.run) {\n console.warn(`Integration ${dir} missing 'config' or 'run' export, skipping`);\n continue;\n }\n\n const name = mod.config.metadata.integration;\n\n if (modules.has(name)) {\n throw new Error(`Duplicate integration name: '${name}' (found in both existing and '${dir}/')`);\n }\n\n modules.set(name, mod);\n } catch (err) {\n if (err instanceof Error && err.message.startsWith('Duplicate integration name')) {\n throw err; // Re-throw duplicate name errors\n }\n console.warn(`Failed to load integration from ${dir}/: ${err}`);\n }\n }\n\n // Build sorted config array (by priority, descending)\n const sortedConfigs = Array.from(modules.values())\n .map((m) => m.config)\n .sort((a, b) => b.metadata.priority - a.metadata.priority);\n\n return {\n all() {\n return sortedConfigs;\n },\n\n get(name: string) {\n return modules.get(name);\n },\n\n forLanguage(language: Language) {\n return sortedConfigs.filter((c) => c.metadata.language === language);\n },\n\n choices() {\n return sortedConfigs.map((c) => ({\n name: c.metadata.name,\n value: c.metadata.integration,\n }));\n },\n\n detectionOrder() {\n return sortedConfigs;\n },\n };\n}\n\n// Singleton cache\nlet _registry: IntegrationRegistry | null = null;\n\n/**\n * Get the integration registry (builds once, caches thereafter).\n */\nexport async function getRegistry(): Promise<IntegrationRegistry> {\n if (!_registry) {\n _registry = await buildRegistry();\n }\n return _registry;\n}\n\n/**\n * Reset the registry cache. Used in tests.\n */\nexport function resetRegistry(): void {\n _registry = null;\n}\n"]}
|
|
@@ -1,2 +1,7 @@
|
|
|
1
1
|
import type { InstallerOptions } from '../utils/types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Detect if a single integration matches the project.
|
|
4
|
+
* Uses package.json detection for JS integrations, manifest files for others.
|
|
5
|
+
*/
|
|
6
|
+
export declare function detectSingleIntegration(integration: string, options: Pick<InstallerOptions, 'installDir'>): Promise<boolean>;
|
|
2
7
|
export declare function runWithCore(options: InstallerOptions): Promise<void>;
|
|
@@ -10,7 +10,7 @@ import { isNonInteractiveEnvironment } from '../utils/environment.js';
|
|
|
10
10
|
import { parseEnvFile } from '../utils/env-parser.js';
|
|
11
11
|
import { enableDebugLogs, initLogFile, logInfo, logError } from '../utils/debug.js';
|
|
12
12
|
import { getAccessToken, getCredentials, saveCredentials, getStagingCredentials, saveStagingCredentials, } from './credentials.js';
|
|
13
|
-
import { getConfig, saveConfig, getActiveEnvironment } from './config-store.js';
|
|
13
|
+
import { getConfig, saveConfig, getActiveEnvironment, isUnclaimedEnvironment } from './config-store.js';
|
|
14
14
|
import { checkForEnvFiles, discoverCredentials } from './credential-discovery.js';
|
|
15
15
|
import { requestDeviceCode, pollForToken } from './device-auth.js';
|
|
16
16
|
import { fetchStagingCredentials as fetchStagingCredentialsApi } from './staging-api.js';
|
|
@@ -68,7 +68,7 @@ async function detectIntegrationFn(options) {
|
|
|
68
68
|
* Detect if a single integration matches the project.
|
|
69
69
|
* Uses package.json detection for JS integrations, manifest files for others.
|
|
70
70
|
*/
|
|
71
|
-
async function detectSingleIntegration(integration, options) {
|
|
71
|
+
export async function detectSingleIntegration(integration, options) {
|
|
72
72
|
const { getPackageDotJson } = await import('../utils/clack-utils.js');
|
|
73
73
|
const { hasPackageInstalled } = await import('../utils/package-json.js');
|
|
74
74
|
const { existsSync } = await import('node:fs');
|
|
@@ -80,6 +80,12 @@ async function detectSingleIntegration(integration, options) {
|
|
|
80
80
|
const config = mod.config;
|
|
81
81
|
// For JS integrations, check package.json
|
|
82
82
|
if (config.metadata.language === 'javascript') {
|
|
83
|
+
// Without a package.json, no JS integration can match. Skip silently so
|
|
84
|
+
// non-JS integrations (Python/Django, Ruby, Go, ...) still get a chance —
|
|
85
|
+
// getPackageDotJson would otherwise call process.exit(1).
|
|
86
|
+
if (!existsSync(join(options.installDir, 'package.json'))) {
|
|
87
|
+
return false;
|
|
88
|
+
}
|
|
83
89
|
const packageJson = await getPackageDotJson(options);
|
|
84
90
|
switch (integration) {
|
|
85
91
|
case 'nextjs':
|
|
@@ -113,7 +119,12 @@ async function detectSingleIntegration(integration, options) {
|
|
|
113
119
|
return hasPackageInstalled(config.detection.packageName, packageJson);
|
|
114
120
|
}
|
|
115
121
|
}
|
|
116
|
-
// For non-JS integrations,
|
|
122
|
+
// For non-JS integrations, prefer a custom detect() if provided
|
|
123
|
+
// (e.g., Django matches manage.py | pyproject.toml | requirements.txt),
|
|
124
|
+
// otherwise fall back to manifest file existence.
|
|
125
|
+
if (config.metadata.detect) {
|
|
126
|
+
return await config.metadata.detect(options);
|
|
127
|
+
}
|
|
117
128
|
if (config.metadata.manifestFile) {
|
|
118
129
|
return existsSync(join(options.installDir, config.metadata.manifestFile));
|
|
119
130
|
}
|
|
@@ -211,6 +222,14 @@ export async function runWithCore(options) {
|
|
|
211
222
|
if (!integration || !credentials) {
|
|
212
223
|
throw new Error('Missing integration or credentials');
|
|
213
224
|
}
|
|
225
|
+
// Non-JS integrations own their env file writing (e.g. Python writes
|
|
226
|
+
// .env inside its own run()). Skip here so we don't leak a .env.local
|
|
227
|
+
// with JS-flavored vars (WORKOS_COOKIE_PASSWORD, wrong redirect port).
|
|
228
|
+
const registry = await getRegistry();
|
|
229
|
+
const mod = registry.get(integration);
|
|
230
|
+
if (mod?.config.metadata.language !== 'javascript') {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
214
233
|
const port = detectPort(integration, installerOptions.installDir);
|
|
215
234
|
const callbackPath = getCallbackPath(integration);
|
|
216
235
|
const redirectUri = installerOptions.redirectUri || `http://localhost:${port}${callbackPath}`;
|
|
@@ -262,6 +281,10 @@ export async function runWithCore(options) {
|
|
|
262
281
|
return discoverCredentials(input.installDir);
|
|
263
282
|
}),
|
|
264
283
|
checkStoredAuth: fromPromise(async () => {
|
|
284
|
+
const activeEnv = getActiveEnvironment();
|
|
285
|
+
if (activeEnv?.apiKey && isUnclaimedEnvironment(activeEnv)) {
|
|
286
|
+
return true;
|
|
287
|
+
}
|
|
265
288
|
const token = getAccessToken();
|
|
266
289
|
return token !== null;
|
|
267
290
|
}),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-with-core.js","sourceRoot":"","sources":["../../src/lib/run-with-core.ts"],"names":[],"mappings":"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","sourcesContent":["import { createActor, fromPromise } from 'xstate';\nimport open from 'opn';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { installerMachine } from './installer-core.js';\nimport { createInstallerEventEmitter } from './events.js';\nimport { CLIAdapter } from './adapters/cli-adapter.js';\nimport { DashboardAdapter } from './adapters/dashboard-adapter.js';\nimport type { InstallerAdapter } from './adapters/types.js';\nimport type { InstallerOptions } from '../utils/types.js';\nimport { isNonInteractiveEnvironment } from '../utils/environment.js';\nimport type {\n InstallerMachineContext,\n DetectionOutput,\n GitCheckOutput,\n AgentOutput,\n BranchCheckOutput,\n} from './installer-core.types.js';\nimport type { Integration } from './constants.js';\nimport { parseEnvFile } from '../utils/env-parser.js';\nimport { enableDebugLogs, initLogFile, logInfo, logError } from '../utils/debug.js';\n\nimport {\n getAccessToken,\n getCredentials,\n saveCredentials,\n getStagingCredentials,\n saveStagingCredentials,\n} from './credentials.js';\nimport { getConfig, saveConfig, getActiveEnvironment } from './config-store.js';\nimport { checkForEnvFiles, discoverCredentials } from './credential-discovery.js';\nimport { requestDeviceCode, pollForToken } from './device-auth.js';\nimport { fetchStagingCredentials as fetchStagingCredentialsApi } from './staging-api.js';\nimport { getCliAuthClientId, getAuthkitDomain } from './settings.js';\nimport { analytics } from '../utils/analytics.js';\nimport { getVersion } from './settings.js';\nimport { getLlmGatewayUrlFromHost } from '../utils/urls.js';\nimport { isInGitRepo, getUncommittedOrUntrackedFiles } from '../utils/clack-utils.js';\nimport {\n getCurrentBranch,\n isProtectedBranch,\n createBranch as createGitBranch,\n branchExists,\n} from '../utils/git-utils.js';\nimport { detectChanges, stageAndCommit, pushBranch as pushGitBranch, createPullRequest } from './post-install.js';\nimport {\n generateCommitMessage as generateCommitMessageAi,\n generatePrDescription as generatePrDescriptionAi,\n} from './ai-content.js';\nimport { autoConfigureWorkOSEnvironment } from './workos-management.js';\nimport { detectPort, getCallbackPath } from './port-detection.js';\nimport { writeEnvLocal } from './env-writer.js';\nimport { getRegistry } from './registry.js';\n\nasync function runIntegrationInstallerFn(integration: Integration, options: InstallerOptions): Promise<string> {\n const registry = await getRegistry();\n const mod = registry.get(integration);\n if (!mod) {\n throw new Error(`Unknown integration: ${integration}`);\n }\n return mod.run(options);\n}\n\nfunction readExistingCredentials(installDir: string): { apiKey?: string; clientId?: string } {\n const envPath = join(installDir, '.env.local');\n if (!existsSync(envPath)) {\n return {};\n }\n\n try {\n const content = readFileSync(envPath, 'utf-8');\n const envVars = parseEnvFile(content);\n return {\n apiKey: envVars.WORKOS_API_KEY || undefined,\n clientId: envVars.WORKOS_CLIENT_ID || undefined,\n };\n } catch {\n return {};\n }\n}\n\nasync function detectIntegrationFn(options: Pick<InstallerOptions, 'installDir'>): Promise<Integration | undefined> {\n const registry = await getRegistry();\n const configs = registry.detectionOrder();\n\n for (const config of configs) {\n // Use the detect function from INTEGRATION_CONFIG in config.ts for JS integrations,\n // or fall back to checking if the framework package is installed\n const detected = await detectSingleIntegration(config.metadata.integration, options);\n if (detected) {\n return config.metadata.integration;\n }\n }\n return undefined;\n}\n\n/**\n * Detect if a single integration matches the project.\n * Uses package.json detection for JS integrations, manifest files for others.\n */\nasync function detectSingleIntegration(\n integration: string,\n options: Pick<InstallerOptions, 'installDir'>,\n): Promise<boolean> {\n const { getPackageDotJson } = await import('../utils/clack-utils.js');\n const { hasPackageInstalled } = await import('../utils/package-json.js');\n const { existsSync } = await import('node:fs');\n const { join } = await import('node:path');\n\n const registry = await getRegistry();\n const mod = registry.get(integration);\n if (!mod) return false;\n\n const config = mod.config;\n\n // For JS integrations, check package.json\n if (config.metadata.language === 'javascript') {\n const packageJson = await getPackageDotJson(options);\n\n switch (integration) {\n case 'nextjs':\n return hasPackageInstalled('next', packageJson);\n case 'tanstack-start':\n return hasPackageInstalled('@tanstack/react-start', packageJson);\n case 'react-router':\n return hasPackageInstalled('react-router', packageJson);\n case 'react': {\n const hasReact = hasPackageInstalled('react', packageJson);\n const hasNext = hasPackageInstalled('next', packageJson);\n const hasReactRouter = hasPackageInstalled('react-router', packageJson);\n const hasTanstack = hasPackageInstalled('@tanstack/react-start', packageJson);\n const hasSvelteKit = hasPackageInstalled('@sveltejs/kit', packageJson);\n return hasReact && !hasNext && !hasReactRouter && !hasTanstack && !hasSvelteKit;\n }\n case 'sveltekit':\n return hasPackageInstalled('@sveltejs/kit', packageJson);\n case 'node': {\n const hasExpress = hasPackageInstalled('express', packageJson);\n const hasFrontend =\n hasPackageInstalled('next', packageJson) ||\n hasPackageInstalled('@sveltejs/kit', packageJson) ||\n hasPackageInstalled('react', packageJson) ||\n hasPackageInstalled('@tanstack/react-start', packageJson);\n return hasExpress && !hasFrontend;\n }\n case 'vanilla-js':\n return true; // Fallback\n default:\n // Unknown JS integration — try package name detection\n return hasPackageInstalled(config.detection.packageName, packageJson);\n }\n }\n\n // For non-JS integrations, check manifest files\n if (config.metadata.manifestFile) {\n return existsSync(join(options.installDir, config.metadata.manifestFile));\n }\n\n return false;\n}\n\nexport async function runWithCore(options: InstallerOptions): Promise<void> {\n // Initialize debug/logging early so we capture all failures\n initLogFile();\n if (options.debug) {\n enableDebugLogs();\n }\n logInfo('Wizard starting with options:', {\n debug: options.debug,\n dashboard: options.dashboard,\n local: options.local,\n ci: options.ci,\n skipAuth: options.skipAuth,\n installDir: options.installDir,\n });\n\n // Configure telemetry endpoint (same URL as LLM gateway)\n const gatewayUrl = getLlmGatewayUrlFromHost();\n analytics.setGatewayUrl(gatewayUrl);\n\n const existingCreds = readExistingCredentials(options.installDir);\n const augmentedOptions: InstallerOptions = {\n ...options,\n apiKey: options.apiKey || existingCreds.apiKey,\n clientId: options.clientId || existingCreds.clientId,\n };\n\n const emitter = createInstallerEventEmitter();\n let actor: ReturnType<typeof createActor<typeof installerMachine>> | null = null;\n\n const sendEvent = (event: { type: string; [key: string]: unknown }) => {\n if (actor) {\n actor.send(event as Parameters<typeof actor.send>[0]);\n }\n };\n\n let adapter: InstallerAdapter;\n if (isNonInteractiveEnvironment()) {\n const { HeadlessAdapter } = await import('./adapters/headless-adapter.js');\n adapter = new HeadlessAdapter({\n emitter,\n sendEvent,\n debug: augmentedOptions.debug,\n options: {\n apiKey: augmentedOptions.apiKey,\n clientId: augmentedOptions.clientId,\n noBranch: augmentedOptions.noBranch,\n noCommit: augmentedOptions.noCommit,\n createPr: augmentedOptions.createPr,\n noGitCheck: augmentedOptions.noGitCheck,\n },\n });\n } else if (options.dashboard) {\n adapter = new DashboardAdapter({ emitter, sendEvent, debug: augmentedOptions.debug });\n } else {\n adapter = new CLIAdapter({ emitter, sendEvent, debug: augmentedOptions.debug });\n }\n\n const machineWithActors = installerMachine.provide({\n actors: {\n checkAuthentication: fromPromise(async () => {\n // Check for active environment with credentials (covers unclaimed environments)\n const activeEnv = getActiveEnvironment();\n if (activeEnv?.clientId && activeEnv?.apiKey) {\n return true;\n }\n\n const token = getAccessToken();\n if (!token) {\n // This should rarely happen since bin.ts handles auth first\n // But keep as safety net for programmatic usage\n throw new Error('Not authenticated. Run `workos auth login` first.');\n }\n\n // Set telemetry from existing credentials\n const creds = getCredentials();\n if (creds) {\n analytics.setAccessToken(creds.accessToken);\n analytics.setDistinctId(creds.userId);\n }\n return true;\n }),\n\n detectIntegration: fromPromise<DetectionOutput, { options: InstallerOptions }>(async ({ input }) => {\n const integration = await detectIntegrationFn({ installDir: input.options.installDir });\n return { integration };\n }),\n\n checkGitStatus: fromPromise<GitCheckOutput, { installDir: string }>(async () => {\n if (!isInGitRepo()) {\n return { isClean: true, files: [] };\n }\n const files = getUncommittedOrUntrackedFiles();\n return { isClean: files.length === 0, files };\n }),\n\n configureEnvironment: fromPromise<void, { context: InstallerMachineContext }>(async ({ input }) => {\n const { context } = input;\n const { options: installerOptions, integration, credentials } = context;\n\n if (!integration || !credentials) {\n throw new Error('Missing integration or credentials');\n }\n\n const port = detectPort(integration, installerOptions.installDir);\n const callbackPath = getCallbackPath(integration);\n const redirectUri = installerOptions.redirectUri || `http://localhost:${port}${callbackPath}`;\n\n const requiresApiKey = ['nextjs', 'tanstack-start', 'react-router'].includes(integration);\n if (credentials.apiKey && requiresApiKey) {\n await autoConfigureWorkOSEnvironment(credentials.apiKey, integration, port, {\n homepageUrl: installerOptions.homepageUrl,\n redirectUri: installerOptions.redirectUri,\n });\n }\n\n const redirectUriKey = integration === 'nextjs' ? 'NEXT_PUBLIC_WORKOS_REDIRECT_URI' : 'WORKOS_REDIRECT_URI';\n\n writeEnvLocal(installerOptions.installDir, {\n ...(credentials.apiKey ? { WORKOS_API_KEY: credentials.apiKey } : {}),\n WORKOS_CLIENT_ID: credentials.clientId,\n [redirectUriKey]: redirectUri,\n });\n }),\n\n runAgent: fromPromise<AgentOutput, { context: InstallerMachineContext }>(async ({ input }) => {\n const { context } = input;\n const { options: installerOptions, integration, credentials } = context;\n\n if (!integration) {\n return { success: false, error: new Error('No integration specified') };\n }\n\n try {\n const agentOptions: InstallerOptions = {\n ...installerOptions,\n apiKey: credentials?.apiKey,\n clientId: credentials?.clientId,\n emitter: context.emitter,\n };\n const summary = await runIntegrationInstallerFn(integration, agentOptions);\n return {\n success: true,\n summary: summary || `Successfully installed WorkOS AuthKit for ${integration}!`,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }),\n\n // Credential discovery actors\n detectEnvFiles: fromPromise(async ({ input }) => {\n return checkForEnvFiles(input.installDir);\n }),\n\n scanEnvFiles: fromPromise(async ({ input }) => {\n return discoverCredentials(input.installDir);\n }),\n\n checkStoredAuth: fromPromise(async () => {\n const token = getAccessToken();\n return token !== null;\n }),\n\n runDeviceAuth: fromPromise(async ({ input }) => {\n const clientId = getCliAuthClientId();\n const authkitDomain = getAuthkitDomain();\n\n const deviceAuth = await requestDeviceCode({\n clientId,\n authkitDomain,\n });\n\n // Emit device started event with verification info\n input.emitter.emit('device:started', {\n verificationUri: deviceAuth.verification_uri,\n verificationUriComplete: deviceAuth.verification_uri_complete,\n userCode: deviceAuth.user_code,\n });\n\n // Open browser\n try {\n const { default: openFn } = await import('opn');\n await openFn(deviceAuth.verification_uri_complete);\n } catch {\n // User can open manually\n }\n\n const result = await pollForToken(deviceAuth.device_code, {\n clientId,\n authkitDomain,\n interval: deviceAuth.interval,\n onPoll: () => input.emitter.emit('device:polling', {}),\n });\n\n // Save the auth token\n saveCredentials({\n accessToken: result.accessToken,\n expiresAt: result.expiresAt,\n userId: result.userId,\n email: result.email,\n });\n\n return { result, deviceAuth };\n }),\n\n fetchStagingCredentials: fromPromise(async () => {\n const activeEnv = getActiveEnvironment();\n if (activeEnv?.clientId && activeEnv?.apiKey) {\n return { clientId: activeEnv.clientId, apiKey: activeEnv.apiKey };\n }\n\n const cached = getStagingCredentials();\n if (cached) return cached;\n\n const token = getAccessToken();\n if (!token) throw new Error('No access token available');\n\n const staging = await fetchStagingCredentialsApi(token);\n saveStagingCredentials(staging);\n\n try {\n const config = getConfig() ?? { environments: {} };\n if (!config.environments['default']) {\n config.environments['default'] = {\n name: 'default',\n type: staging.apiKey.startsWith('sk_test_') ? 'sandbox' : 'production',\n apiKey: staging.apiKey,\n clientId: staging.clientId,\n };\n if (!config.activeEnvironment) {\n config.activeEnvironment = 'default';\n }\n saveConfig(config);\n }\n } catch {\n // Don't block install if config-store write fails\n }\n\n return staging;\n }),\n\n // Branch check actors\n checkBranch: fromPromise<BranchCheckOutput, void>(async () => {\n const branch = getCurrentBranch();\n if (!branch) {\n return { branch: null, isProtected: false };\n }\n return {\n branch,\n isProtected: isProtectedBranch(branch),\n };\n }),\n\n createBranch: fromPromise<{ branch: string }, { name: string; fallbackName: string }>(async ({ input }) => {\n const { name, fallbackName } = input;\n const targetBranch = branchExists(name) ? fallbackName : name;\n createGitBranch(targetBranch);\n return { branch: targetBranch };\n }),\n\n // Post-install actors\n detectChanges: fromPromise<{ hasChanges: boolean; files: string[] }, void>(async () => {\n return detectChanges();\n }),\n\n generateCommitMessage: fromPromise<string, { integration: string; files: string[]; direct?: boolean }>(\n async ({ input }) => {\n return generateCommitMessageAi(input.integration, input.files, { direct: input.direct });\n },\n ),\n\n commitChanges: fromPromise<void, { message: string; cwd: string }>(async ({ input }) => {\n stageAndCommit(input.message, input.cwd);\n }),\n\n generatePrDescription: fromPromise<\n string,\n { integration: string; files: string[]; commitMessage: string; direct?: boolean }\n >(async ({ input }) => {\n return generatePrDescriptionAi(input.integration, input.files, input.commitMessage, { direct: input.direct });\n }),\n\n pushBranch: fromPromise<void, { cwd: string }>(async ({ input }) => {\n pushGitBranch(input.cwd);\n }),\n\n createPr: fromPromise<string, { title: string; body: string; cwd: string }>(async ({ input }) => {\n return createPullRequest(input.title, input.body, input.cwd);\n }),\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let inspector: { inspect: any } | undefined;\n if (augmentedOptions.inspect) {\n const originalLog = console.log;\n let inspectUrl: string | undefined;\n\n console.log = (...args: unknown[]) => {\n const msg = args.join(' ');\n if (typeof msg === 'string' && msg.startsWith('https://stately.ai/inspect/')) {\n inspectUrl = msg;\n console.log = originalLog;\n console.log(`Opening XState inspector: ${inspectUrl}`);\n void open(inspectUrl);\n } else {\n originalLog.apply(console, args);\n }\n };\n\n // Dynamic import - @statelyai/inspect is a devDependency\n const { createSkyInspector } = await import('@statelyai/inspect');\n inspector = createSkyInspector();\n setTimeout(() => {\n console.log = originalLog;\n }, 5000).unref();\n }\n\n actor = createActor(machineWithActors, {\n input: { emitter, options: augmentedOptions },\n inspect: inspector?.inspect,\n });\n\n await adapter.start();\n\n // Start telemetry session\n const mode = isNonInteractiveEnvironment() ? 'headless' : augmentedOptions.dashboard ? 'tui' : 'cli';\n analytics.sessionStart(mode, getVersion());\n\n let installerStatus: 'success' | 'error' | 'cancelled' = 'success';\n\n // Handle ctrl+c by sending CANCEL to state machine for graceful shutdown\n const handleSigint = () => {\n installerStatus = 'cancelled';\n actor?.send({ type: 'CANCEL' });\n };\n process.on('SIGINT', handleSigint);\n\n try {\n await new Promise<void>((resolve, reject) => {\n actor!.subscribe({\n complete: () => {\n const snapshot = actor!.getSnapshot();\n if (snapshot.value === 'error') {\n const err = snapshot.context.error;\n installerStatus = 'error';\n reject(err ?? new Error('Wizard failed'));\n } else if (snapshot.value === 'cancelled') {\n installerStatus = 'cancelled';\n resolve();\n } else {\n resolve();\n }\n },\n error: (err) => {\n installerStatus = 'error';\n reject(err);\n },\n });\n\n actor!.start();\n actor!.send({ type: 'START' });\n });\n } catch (error) {\n installerStatus = 'error';\n logError('Wizard failed with error:', error instanceof Error ? error.stack || error.message : String(error));\n throw error;\n } finally {\n process.off('SIGINT', handleSigint);\n await analytics.shutdown(installerStatus);\n await adapter.stop();\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"run-with-core.js","sourceRoot":"","sources":["../../src/lib/run-with-core.ts"],"names":[],"mappings":"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","sourcesContent":["import { createActor, fromPromise } from 'xstate';\nimport open from 'opn';\nimport { existsSync, readFileSync } from 'fs';\nimport { join } from 'path';\nimport { installerMachine } from './installer-core.js';\nimport { createInstallerEventEmitter } from './events.js';\nimport { CLIAdapter } from './adapters/cli-adapter.js';\nimport { DashboardAdapter } from './adapters/dashboard-adapter.js';\nimport type { InstallerAdapter } from './adapters/types.js';\nimport type { InstallerOptions } from '../utils/types.js';\nimport { isNonInteractiveEnvironment } from '../utils/environment.js';\nimport type {\n InstallerMachineContext,\n DetectionOutput,\n GitCheckOutput,\n AgentOutput,\n BranchCheckOutput,\n} from './installer-core.types.js';\nimport type { Integration } from './constants.js';\nimport { parseEnvFile } from '../utils/env-parser.js';\nimport { enableDebugLogs, initLogFile, logInfo, logError } from '../utils/debug.js';\n\nimport {\n getAccessToken,\n getCredentials,\n saveCredentials,\n getStagingCredentials,\n saveStagingCredentials,\n} from './credentials.js';\nimport { getConfig, saveConfig, getActiveEnvironment, isUnclaimedEnvironment } from './config-store.js';\nimport { checkForEnvFiles, discoverCredentials } from './credential-discovery.js';\nimport { requestDeviceCode, pollForToken } from './device-auth.js';\nimport { fetchStagingCredentials as fetchStagingCredentialsApi } from './staging-api.js';\nimport { getCliAuthClientId, getAuthkitDomain } from './settings.js';\nimport { analytics } from '../utils/analytics.js';\nimport { getVersion } from './settings.js';\nimport { getLlmGatewayUrlFromHost } from '../utils/urls.js';\nimport { isInGitRepo, getUncommittedOrUntrackedFiles } from '../utils/clack-utils.js';\nimport {\n getCurrentBranch,\n isProtectedBranch,\n createBranch as createGitBranch,\n branchExists,\n} from '../utils/git-utils.js';\nimport { detectChanges, stageAndCommit, pushBranch as pushGitBranch, createPullRequest } from './post-install.js';\nimport {\n generateCommitMessage as generateCommitMessageAi,\n generatePrDescription as generatePrDescriptionAi,\n} from './ai-content.js';\nimport { autoConfigureWorkOSEnvironment } from './workos-management.js';\nimport { detectPort, getCallbackPath } from './port-detection.js';\nimport { writeEnvLocal } from './env-writer.js';\nimport { getRegistry } from './registry.js';\n\nasync function runIntegrationInstallerFn(integration: Integration, options: InstallerOptions): Promise<string> {\n const registry = await getRegistry();\n const mod = registry.get(integration);\n if (!mod) {\n throw new Error(`Unknown integration: ${integration}`);\n }\n return mod.run(options);\n}\n\nfunction readExistingCredentials(installDir: string): { apiKey?: string; clientId?: string } {\n const envPath = join(installDir, '.env.local');\n if (!existsSync(envPath)) {\n return {};\n }\n\n try {\n const content = readFileSync(envPath, 'utf-8');\n const envVars = parseEnvFile(content);\n return {\n apiKey: envVars.WORKOS_API_KEY || undefined,\n clientId: envVars.WORKOS_CLIENT_ID || undefined,\n };\n } catch {\n return {};\n }\n}\n\nasync function detectIntegrationFn(options: Pick<InstallerOptions, 'installDir'>): Promise<Integration | undefined> {\n const registry = await getRegistry();\n const configs = registry.detectionOrder();\n\n for (const config of configs) {\n // Use the detect function from INTEGRATION_CONFIG in config.ts for JS integrations,\n // or fall back to checking if the framework package is installed\n const detected = await detectSingleIntegration(config.metadata.integration, options);\n if (detected) {\n return config.metadata.integration;\n }\n }\n return undefined;\n}\n\n/**\n * Detect if a single integration matches the project.\n * Uses package.json detection for JS integrations, manifest files for others.\n */\nexport async function detectSingleIntegration(\n integration: string,\n options: Pick<InstallerOptions, 'installDir'>,\n): Promise<boolean> {\n const { getPackageDotJson } = await import('../utils/clack-utils.js');\n const { hasPackageInstalled } = await import('../utils/package-json.js');\n const { existsSync } = await import('node:fs');\n const { join } = await import('node:path');\n\n const registry = await getRegistry();\n const mod = registry.get(integration);\n if (!mod) return false;\n\n const config = mod.config;\n\n // For JS integrations, check package.json\n if (config.metadata.language === 'javascript') {\n // Without a package.json, no JS integration can match. Skip silently so\n // non-JS integrations (Python/Django, Ruby, Go, ...) still get a chance —\n // getPackageDotJson would otherwise call process.exit(1).\n if (!existsSync(join(options.installDir, 'package.json'))) {\n return false;\n }\n const packageJson = await getPackageDotJson(options);\n\n switch (integration) {\n case 'nextjs':\n return hasPackageInstalled('next', packageJson);\n case 'tanstack-start':\n return hasPackageInstalled('@tanstack/react-start', packageJson);\n case 'react-router':\n return hasPackageInstalled('react-router', packageJson);\n case 'react': {\n const hasReact = hasPackageInstalled('react', packageJson);\n const hasNext = hasPackageInstalled('next', packageJson);\n const hasReactRouter = hasPackageInstalled('react-router', packageJson);\n const hasTanstack = hasPackageInstalled('@tanstack/react-start', packageJson);\n const hasSvelteKit = hasPackageInstalled('@sveltejs/kit', packageJson);\n return hasReact && !hasNext && !hasReactRouter && !hasTanstack && !hasSvelteKit;\n }\n case 'sveltekit':\n return hasPackageInstalled('@sveltejs/kit', packageJson);\n case 'node': {\n const hasExpress = hasPackageInstalled('express', packageJson);\n const hasFrontend =\n hasPackageInstalled('next', packageJson) ||\n hasPackageInstalled('@sveltejs/kit', packageJson) ||\n hasPackageInstalled('react', packageJson) ||\n hasPackageInstalled('@tanstack/react-start', packageJson);\n return hasExpress && !hasFrontend;\n }\n case 'vanilla-js':\n return true; // Fallback\n default:\n // Unknown JS integration — try package name detection\n return hasPackageInstalled(config.detection.packageName, packageJson);\n }\n }\n\n // For non-JS integrations, prefer a custom detect() if provided\n // (e.g., Django matches manage.py | pyproject.toml | requirements.txt),\n // otherwise fall back to manifest file existence.\n if (config.metadata.detect) {\n return await config.metadata.detect(options);\n }\n if (config.metadata.manifestFile) {\n return existsSync(join(options.installDir, config.metadata.manifestFile));\n }\n\n return false;\n}\n\nexport async function runWithCore(options: InstallerOptions): Promise<void> {\n // Initialize debug/logging early so we capture all failures\n initLogFile();\n if (options.debug) {\n enableDebugLogs();\n }\n logInfo('Wizard starting with options:', {\n debug: options.debug,\n dashboard: options.dashboard,\n local: options.local,\n ci: options.ci,\n skipAuth: options.skipAuth,\n installDir: options.installDir,\n });\n\n // Configure telemetry endpoint (same URL as LLM gateway)\n const gatewayUrl = getLlmGatewayUrlFromHost();\n analytics.setGatewayUrl(gatewayUrl);\n\n const existingCreds = readExistingCredentials(options.installDir);\n const augmentedOptions: InstallerOptions = {\n ...options,\n apiKey: options.apiKey || existingCreds.apiKey,\n clientId: options.clientId || existingCreds.clientId,\n };\n\n const emitter = createInstallerEventEmitter();\n let actor: ReturnType<typeof createActor<typeof installerMachine>> | null = null;\n\n const sendEvent = (event: { type: string; [key: string]: unknown }) => {\n if (actor) {\n actor.send(event as Parameters<typeof actor.send>[0]);\n }\n };\n\n let adapter: InstallerAdapter;\n if (isNonInteractiveEnvironment()) {\n const { HeadlessAdapter } = await import('./adapters/headless-adapter.js');\n adapter = new HeadlessAdapter({\n emitter,\n sendEvent,\n debug: augmentedOptions.debug,\n options: {\n apiKey: augmentedOptions.apiKey,\n clientId: augmentedOptions.clientId,\n noBranch: augmentedOptions.noBranch,\n noCommit: augmentedOptions.noCommit,\n createPr: augmentedOptions.createPr,\n noGitCheck: augmentedOptions.noGitCheck,\n },\n });\n } else if (options.dashboard) {\n adapter = new DashboardAdapter({ emitter, sendEvent, debug: augmentedOptions.debug });\n } else {\n adapter = new CLIAdapter({ emitter, sendEvent, debug: augmentedOptions.debug });\n }\n\n const machineWithActors = installerMachine.provide({\n actors: {\n checkAuthentication: fromPromise(async () => {\n // Check for active environment with credentials (covers unclaimed environments)\n const activeEnv = getActiveEnvironment();\n if (activeEnv?.clientId && activeEnv?.apiKey) {\n return true;\n }\n\n const token = getAccessToken();\n if (!token) {\n // This should rarely happen since bin.ts handles auth first\n // But keep as safety net for programmatic usage\n throw new Error('Not authenticated. Run `workos auth login` first.');\n }\n\n // Set telemetry from existing credentials\n const creds = getCredentials();\n if (creds) {\n analytics.setAccessToken(creds.accessToken);\n analytics.setDistinctId(creds.userId);\n }\n return true;\n }),\n\n detectIntegration: fromPromise<DetectionOutput, { options: InstallerOptions }>(async ({ input }) => {\n const integration = await detectIntegrationFn({ installDir: input.options.installDir });\n return { integration };\n }),\n\n checkGitStatus: fromPromise<GitCheckOutput, { installDir: string }>(async () => {\n if (!isInGitRepo()) {\n return { isClean: true, files: [] };\n }\n const files = getUncommittedOrUntrackedFiles();\n return { isClean: files.length === 0, files };\n }),\n\n configureEnvironment: fromPromise<void, { context: InstallerMachineContext }>(async ({ input }) => {\n const { context } = input;\n const { options: installerOptions, integration, credentials } = context;\n\n if (!integration || !credentials) {\n throw new Error('Missing integration or credentials');\n }\n\n // Non-JS integrations own their env file writing (e.g. Python writes\n // .env inside its own run()). Skip here so we don't leak a .env.local\n // with JS-flavored vars (WORKOS_COOKIE_PASSWORD, wrong redirect port).\n const registry = await getRegistry();\n const mod = registry.get(integration);\n if (mod?.config.metadata.language !== 'javascript') {\n return;\n }\n\n const port = detectPort(integration, installerOptions.installDir);\n const callbackPath = getCallbackPath(integration);\n const redirectUri = installerOptions.redirectUri || `http://localhost:${port}${callbackPath}`;\n\n const requiresApiKey = ['nextjs', 'tanstack-start', 'react-router'].includes(integration);\n if (credentials.apiKey && requiresApiKey) {\n await autoConfigureWorkOSEnvironment(credentials.apiKey, integration, port, {\n homepageUrl: installerOptions.homepageUrl,\n redirectUri: installerOptions.redirectUri,\n });\n }\n\n const redirectUriKey = integration === 'nextjs' ? 'NEXT_PUBLIC_WORKOS_REDIRECT_URI' : 'WORKOS_REDIRECT_URI';\n\n writeEnvLocal(installerOptions.installDir, {\n ...(credentials.apiKey ? { WORKOS_API_KEY: credentials.apiKey } : {}),\n WORKOS_CLIENT_ID: credentials.clientId,\n [redirectUriKey]: redirectUri,\n });\n }),\n\n runAgent: fromPromise<AgentOutput, { context: InstallerMachineContext }>(async ({ input }) => {\n const { context } = input;\n const { options: installerOptions, integration, credentials } = context;\n\n if (!integration) {\n return { success: false, error: new Error('No integration specified') };\n }\n\n try {\n const agentOptions: InstallerOptions = {\n ...installerOptions,\n apiKey: credentials?.apiKey,\n clientId: credentials?.clientId,\n emitter: context.emitter,\n };\n const summary = await runIntegrationInstallerFn(integration, agentOptions);\n return {\n success: true,\n summary: summary || `Successfully installed WorkOS AuthKit for ${integration}!`,\n };\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error : new Error(String(error)),\n };\n }\n }),\n\n // Credential discovery actors\n detectEnvFiles: fromPromise(async ({ input }) => {\n return checkForEnvFiles(input.installDir);\n }),\n\n scanEnvFiles: fromPromise(async ({ input }) => {\n return discoverCredentials(input.installDir);\n }),\n\n checkStoredAuth: fromPromise(async () => {\n const activeEnv = getActiveEnvironment();\n if (activeEnv?.apiKey && isUnclaimedEnvironment(activeEnv)) {\n return true;\n }\n\n const token = getAccessToken();\n return token !== null;\n }),\n\n runDeviceAuth: fromPromise(async ({ input }) => {\n const clientId = getCliAuthClientId();\n const authkitDomain = getAuthkitDomain();\n\n const deviceAuth = await requestDeviceCode({\n clientId,\n authkitDomain,\n });\n\n // Emit device started event with verification info\n input.emitter.emit('device:started', {\n verificationUri: deviceAuth.verification_uri,\n verificationUriComplete: deviceAuth.verification_uri_complete,\n userCode: deviceAuth.user_code,\n });\n\n // Open browser\n try {\n const { default: openFn } = await import('opn');\n await openFn(deviceAuth.verification_uri_complete);\n } catch {\n // User can open manually\n }\n\n const result = await pollForToken(deviceAuth.device_code, {\n clientId,\n authkitDomain,\n interval: deviceAuth.interval,\n onPoll: () => input.emitter.emit('device:polling', {}),\n });\n\n // Save the auth token\n saveCredentials({\n accessToken: result.accessToken,\n expiresAt: result.expiresAt,\n userId: result.userId,\n email: result.email,\n });\n\n return { result, deviceAuth };\n }),\n\n fetchStagingCredentials: fromPromise(async () => {\n const activeEnv = getActiveEnvironment();\n if (activeEnv?.clientId && activeEnv?.apiKey) {\n return { clientId: activeEnv.clientId, apiKey: activeEnv.apiKey };\n }\n\n const cached = getStagingCredentials();\n if (cached) return cached;\n\n const token = getAccessToken();\n if (!token) throw new Error('No access token available');\n\n const staging = await fetchStagingCredentialsApi(token);\n saveStagingCredentials(staging);\n\n try {\n const config = getConfig() ?? { environments: {} };\n if (!config.environments['default']) {\n config.environments['default'] = {\n name: 'default',\n type: staging.apiKey.startsWith('sk_test_') ? 'sandbox' : 'production',\n apiKey: staging.apiKey,\n clientId: staging.clientId,\n };\n if (!config.activeEnvironment) {\n config.activeEnvironment = 'default';\n }\n saveConfig(config);\n }\n } catch {\n // Don't block install if config-store write fails\n }\n\n return staging;\n }),\n\n // Branch check actors\n checkBranch: fromPromise<BranchCheckOutput, void>(async () => {\n const branch = getCurrentBranch();\n if (!branch) {\n return { branch: null, isProtected: false };\n }\n return {\n branch,\n isProtected: isProtectedBranch(branch),\n };\n }),\n\n createBranch: fromPromise<{ branch: string }, { name: string; fallbackName: string }>(async ({ input }) => {\n const { name, fallbackName } = input;\n const targetBranch = branchExists(name) ? fallbackName : name;\n createGitBranch(targetBranch);\n return { branch: targetBranch };\n }),\n\n // Post-install actors\n detectChanges: fromPromise<{ hasChanges: boolean; files: string[] }, void>(async () => {\n return detectChanges();\n }),\n\n generateCommitMessage: fromPromise<string, { integration: string; files: string[]; direct?: boolean }>(\n async ({ input }) => {\n return generateCommitMessageAi(input.integration, input.files, { direct: input.direct });\n },\n ),\n\n commitChanges: fromPromise<void, { message: string; cwd: string }>(async ({ input }) => {\n stageAndCommit(input.message, input.cwd);\n }),\n\n generatePrDescription: fromPromise<\n string,\n { integration: string; files: string[]; commitMessage: string; direct?: boolean }\n >(async ({ input }) => {\n return generatePrDescriptionAi(input.integration, input.files, input.commitMessage, { direct: input.direct });\n }),\n\n pushBranch: fromPromise<void, { cwd: string }>(async ({ input }) => {\n pushGitBranch(input.cwd);\n }),\n\n createPr: fromPromise<string, { title: string; body: string; cwd: string }>(async ({ input }) => {\n return createPullRequest(input.title, input.body, input.cwd);\n }),\n },\n });\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let inspector: { inspect: any } | undefined;\n if (augmentedOptions.inspect) {\n const originalLog = console.log;\n let inspectUrl: string | undefined;\n\n console.log = (...args: unknown[]) => {\n const msg = args.join(' ');\n if (typeof msg === 'string' && msg.startsWith('https://stately.ai/inspect/')) {\n inspectUrl = msg;\n console.log = originalLog;\n console.log(`Opening XState inspector: ${inspectUrl}`);\n void open(inspectUrl);\n } else {\n originalLog.apply(console, args);\n }\n };\n\n // Dynamic import - @statelyai/inspect is a devDependency\n const { createSkyInspector } = await import('@statelyai/inspect');\n inspector = createSkyInspector();\n setTimeout(() => {\n console.log = originalLog;\n }, 5000).unref();\n }\n\n actor = createActor(machineWithActors, {\n input: { emitter, options: augmentedOptions },\n inspect: inspector?.inspect,\n });\n\n await adapter.start();\n\n // Start telemetry session\n const mode = isNonInteractiveEnvironment() ? 'headless' : augmentedOptions.dashboard ? 'tui' : 'cli';\n analytics.sessionStart(mode, getVersion());\n\n let installerStatus: 'success' | 'error' | 'cancelled' = 'success';\n\n // Handle ctrl+c by sending CANCEL to state machine for graceful shutdown\n const handleSigint = () => {\n installerStatus = 'cancelled';\n actor?.send({ type: 'CANCEL' });\n };\n process.on('SIGINT', handleSigint);\n\n try {\n await new Promise<void>((resolve, reject) => {\n actor!.subscribe({\n complete: () => {\n const snapshot = actor!.getSnapshot();\n if (snapshot.value === 'error') {\n const err = snapshot.context.error;\n installerStatus = 'error';\n reject(err ?? new Error('Wizard failed'));\n } else if (snapshot.value === 'cancelled') {\n installerStatus = 'cancelled';\n resolve();\n } else {\n resolve();\n }\n },\n error: (err) => {\n installerStatus = 'error';\n reject(err);\n },\n });\n\n actor!.start();\n actor!.send({ type: 'START' });\n });\n } catch (error) {\n installerStatus = 'error';\n logError('Wizard failed with error:', error instanceof Error ? error.stack || error.message : String(error));\n throw error;\n } finally {\n process.off('SIGINT', handleSigint);\n await analytics.shutdown(installerStatus);\n await adapter.stop();\n }\n}\n"]}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
import chalk from 'chalk';
|
|
9
9
|
import { provisionUnclaimedEnvironment, UnclaimedEnvApiError } from './unclaimed-env-api.js';
|
|
10
10
|
import { getConfig, saveConfig, getActiveEnvironment } from './config-store.js';
|
|
11
|
-
import {
|
|
11
|
+
import { writeCredentialsEnv } from './env-writer.js';
|
|
12
12
|
import { logInfo, logError } from '../utils/debug.js';
|
|
13
13
|
import { renderStderrBox } from '../utils/box.js';
|
|
14
14
|
import clack from '../utils/clack.js';
|
|
@@ -35,7 +35,7 @@ export async function tryProvisionUnclaimedEnv(options) {
|
|
|
35
35
|
const key = options.redirectUriKey ?? 'WORKOS_REDIRECT_URI';
|
|
36
36
|
envVars[key] = options.redirectUri;
|
|
37
37
|
}
|
|
38
|
-
|
|
38
|
+
writeCredentialsEnv(options.installDir, envVars);
|
|
39
39
|
// Save to config store (after .env.local succeeds)
|
|
40
40
|
const config = getConfig() ?? { environments: {} };
|
|
41
41
|
config.environments['unclaimed'] = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"unclaimed-env-provision.js","sourceRoot":"","sources":["../../src/lib/unclaimed-env-provision.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,6BAA6B,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAEhF,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"unclaimed-env-provision.js","sourceRoot":"","sources":["../../src/lib/unclaimed-env-provision.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Unclaimed environment provisioning helper.\n *\n * Calls the unclaimed env API, saves credentials to config store as type 'unclaimed',\n * and returns whether provisioning succeeded. Non-fatal — wraps everything in\n * try/catch so install flow can fall back to login.\n */\n\nimport chalk from 'chalk';\nimport { provisionUnclaimedEnvironment, UnclaimedEnvApiError } from './unclaimed-env-api.js';\nimport { getConfig, saveConfig, getActiveEnvironment } from './config-store.js';\nimport type { CliConfig } from './config-store.js';\nimport { writeCredentialsEnv } from './env-writer.js';\nimport { logInfo, logError } from '../utils/debug.js';\nimport { renderStderrBox } from '../utils/box.js';\nimport clack from '../utils/clack.js';\n\nexport interface UnclaimedEnvProvisionOptions {\n installDir: string;\n /** Redirect URI key name varies by framework */\n redirectUriKey?: string;\n /** Redirect URI value */\n redirectUri?: string;\n}\n\n/**\n * Try to provision an unclaimed environment. Non-fatal — returns true on success,\n * false on any failure.\n *\n * On success:\n * - Saves environment to config store as type 'unclaimed'\n * - Sets it as active environment\n * - Writes credentials (including cookie password and claim token) to .env.local\n */\nexport async function tryProvisionUnclaimedEnv(options: UnclaimedEnvProvisionOptions): Promise<boolean> {\n try {\n logInfo('[unclaimed-env-provision] Attempting unclaimed environment provisioning');\n\n const result = await provisionUnclaimedEnvironment();\n\n // Write .env.local first — if this fails, config stays clean (no orphan entries)\n const envVars: Record<string, string> = {\n WORKOS_API_KEY: result.apiKey,\n WORKOS_CLIENT_ID: result.clientId,\n WORKOS_CLAIM_TOKEN: result.claimToken,\n };\n\n if (options.redirectUri) {\n const key = options.redirectUriKey ?? 'WORKOS_REDIRECT_URI';\n envVars[key] = options.redirectUri;\n }\n\n writeCredentialsEnv(options.installDir, envVars);\n\n // Save to config store (after .env.local succeeds)\n const config: CliConfig = getConfig() ?? { environments: {} };\n config.environments['unclaimed'] = {\n name: 'unclaimed',\n type: 'unclaimed',\n apiKey: result.apiKey,\n clientId: result.clientId,\n claimToken: result.claimToken,\n };\n config.activeEnvironment = 'unclaimed';\n saveConfig(config);\n\n // Verify config persisted — critical for `workos env claim` in a later process\n const readBack = getActiveEnvironment();\n if (!readBack || readBack.type !== 'unclaimed') {\n logError('[unclaimed-env-provision] Config read-back failed after save — claim token may not persist');\n clack.log.warn('Environment provisioned but config storage may be unreliable. Falling back to login...');\n return false;\n }\n\n logInfo('[unclaimed-env-provision] Unclaimed environment provisioned and saved');\n const inner = ` ✓ ${chalk.green('Environment provisioned')} — Run ${chalk.cyan('workos env claim')} to keep it. `;\n renderStderrBox(inner, chalk.green);\n\n return true;\n } catch (error) {\n const message = error instanceof Error ? error.message : 'Unknown error';\n logError('[unclaimed-env-provision] Failed:', message);\n\n if (error instanceof UnclaimedEnvApiError) {\n if (error.statusCode === 429) {\n clack.log.warn('WorkOS is busy, falling back to login...');\n }\n } else {\n // Non-API errors (filesystem, keyring) are unexpected — surface to user\n clack.log.warn(`Could not set up environment: ${message}. Falling back to login...`);\n }\n\n return false;\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Supported programming languages for framework detection.
|
|
3
|
-
*/
|
|
4
|
-
export type Language = 'javascript' | 'python' | 'ruby' | 'php' | 'go' | 'kotlin' | 'dotnet' | 'elixir';
|
|
5
|
-
export interface LanguageSignal {
|
|
6
|
-
language: Language;
|
|
7
|
-
confidence: number;
|
|
8
|
-
manifestFile: string;
|
|
9
|
-
}
|
|
10
|
-
export interface LanguageDetectionResult {
|
|
11
|
-
primary: Language;
|
|
12
|
-
signals: LanguageSignal[];
|
|
13
|
-
ambiguous: boolean;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* Detect the primary programming language of a project.
|
|
17
|
-
* Runs all detectors and returns the highest-priority match.
|
|
18
|
-
* Sets `ambiguous: true` if multiple non-JS languages are detected.
|
|
19
|
-
*/
|
|
20
|
-
export declare function detectLanguage(cwd: string): LanguageDetectionResult | undefined;
|