@bigcommerce/catalyst 1.0.0-alpha.5 → 1.0.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/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/lib/auth-errors.ts","../src/cli/lib/logger.ts","../src/cli/lib/telemetry.ts","../package.json","../src/cli/lib/user-config.ts","../src/cli/program.ts","../src/cli/commands/auth.ts","../src/cli/lib/login.ts","../src/cli/lib/auth.ts","../src/cli/lib/project.ts","../src/cli/lib/project-config.ts","../src/cli/lib/shared-options.ts","../src/cli/commands/build.ts","../src/cli/lib/get-module-cli-path.ts","../src/cli/lib/project-state.ts","../src/cli/lib/wrangler-config.ts","../src/cli/commands/channel.ts","../src/cli/lib/channels.ts","../src/cli/lib/commerce-hosting.ts","../src/cli/lib/sort-package-json.ts","../src/cli/lib/channel-site-flow.ts","../src/cli/lib/resolve-credentials.ts","../src/cli/commands/create.ts","../src/cli/lib/build-workspace-packages.ts","../src/cli/lib/clone-catalyst.ts","../src/cli/lib/checkout-ref.ts","../src/cli/lib/is-exec-exception.ts","../src/cli/lib/has-github-ssh.ts","../src/cli/lib/reset-branch-to-ref.ts","../src/cli/lib/install-dependencies.ts","../src/cli/lib/localization.ts","../src/cli/lib/setup-core-project.ts","../src/cli/lib/write-env.ts","../src/cli/commands/deploy.ts","../src/cli/lib/deployment-errors.ts","../src/cli/lib/env-config.ts","../src/cli/commands/env.ts","../src/cli/commands/logs.ts","../src/cli/commands/project.ts","../src/cli/commands/start.ts","../src/cli/commands/telemetry.ts","../src/cli/commands/version.ts","../src/cli/hooks/telemetry.ts","../src/cli/index.ts"],"sourcesContent":["// Thrown when an authenticated API call comes back 401 Unauthorized — i.e. the\n// access token was sent but rejected. This covers an expired/revoked token as\n// well as a token that was never valid (e.g. a typo'd `--access-token` flag or\n// a stale `CATALYST_ACCESS_TOKEN` env var). It does NOT cover the \"no\n// credentials at all\" case — that's caught earlier by `resolveCredentials`\n// (and `auth whoami`'s own guard) before any request is made.\n//\n// The CLI can't refresh the token silently (the device-code flow returns no\n// refresh token), so the only recovery is to re-authenticate. Callers should\n// let this propagate to the top-level handler in `index.ts`, which prints the\n// message without the generic \"share your Correlation ID with support\"\n// bug-report framing.\nexport class UnauthorizedError extends Error {\n constructor() {\n super(\n 'Your access token is invalid or has expired.\\n' +\n 'Run `catalyst auth login` to re-authenticate.',\n );\n this.name = 'UnauthorizedError';\n }\n}\n\n// Call immediately after an authenticated `fetch`, before any other status\n// checks. Only 401 means \"invalid/expired token\" — 403 is overloaded elsewhere\n// to mean \"API not enabled\" (scope/feature flag), so it is intentionally not\n// treated as an auth failure here.\nexport function assertAuthorized(response: Response): void {\n if (response.status === 401) {\n throw new UnauthorizedError();\n }\n}\n","import { createConsola } from 'consola';\n\nexport const consola = createConsola({\n level: process.env.CONSOLA_LEVEL ? parseInt(process.env.CONSOLA_LEVEL, 10) : 3,\n});\n","import { Analytics } from '@segment/analytics-node';\nimport Conf from 'conf';\nimport { randomBytes, randomUUID } from 'node:crypto';\n\nimport PACKAGE_INFO from '../../../package.json';\n\nimport { getUserConfig, UserConfigSchema } from './user-config';\n\nconst TELEMETRY_KEY_ENABLED = 'telemetry.enabled';\nconst TELEMETRY_KEY_ID = `telemetry.anonymousId`;\n\nexport class Telemetry {\n readonly correlationId: string;\n readonly analytics: Analytics;\n readonly startTime: number;\n commandName = 'unknown';\n\n private userConfig: Conf<UserConfigSchema>;\n private CATALYST_TELEMETRY_DISABLED: string | undefined;\n\n private readonly projectName = 'catalyst-cli';\n private readonly projectVersion = PACKAGE_INFO.version;\n\n constructor() {\n this.CATALYST_TELEMETRY_DISABLED = process.env.CATALYST_TELEMETRY_DISABLED;\n\n this.userConfig = getUserConfig();\n\n this.correlationId = randomUUID();\n this.startTime = Date.now();\n this.analytics = new Analytics({\n writeKey: process.env.CLI_SEGMENT_WRITE_KEY ?? 'not-a-valid-segment-write-key',\n });\n }\n\n durationMs(): number {\n return Date.now() - this.startTime;\n }\n\n async track(eventName: string, payload: Record<string, unknown>) {\n if (!this.isEnabled()) {\n return Promise.resolve(undefined);\n }\n\n this.analytics.track({\n event: eventName,\n anonymousId: this.getAnonymousId(),\n properties: {\n ...payload,\n correlationId: this.correlationId,\n nodeVersion: process.version,\n platform: process.platform,\n arch: process.arch,\n cliVersion: PACKAGE_INFO.version,\n },\n context: {\n app: {\n name: this.projectName,\n version: this.projectVersion,\n },\n },\n });\n }\n\n async identify(storeHash?: string) {\n if (!this.isEnabled()) {\n return Promise.resolve(undefined);\n }\n\n if (!storeHash) {\n return Promise.resolve(undefined);\n }\n\n this.analytics.identify({\n userId: storeHash,\n anonymousId: this.getAnonymousId(),\n context: {\n app: {\n name: this.projectName,\n version: this.projectVersion,\n },\n },\n });\n }\n\n setEnabled = (_enabled: boolean) => {\n const enabled = Boolean(_enabled);\n\n this.userConfig.set('telemetry.enabled', enabled);\n };\n\n isEnabled() {\n return (\n !this.CATALYST_TELEMETRY_DISABLED &&\n this.userConfig.get<typeof TELEMETRY_KEY_ENABLED, boolean>(TELEMETRY_KEY_ENABLED, true)\n );\n }\n\n private getAnonymousId(): string {\n const val = this.userConfig.get<typeof TELEMETRY_KEY_ID, string>(TELEMETRY_KEY_ID);\n\n if (val) {\n return val;\n }\n\n const generated = randomBytes(32).toString('hex');\n\n this.userConfig.set(TELEMETRY_KEY_ID, generated);\n\n return generated;\n }\n}\n\nlet telemetryInstance: Telemetry | undefined;\n\n// Singleton so the pre-hook, post-hook, error handler, and command bodies all\n// share one correlationId. resetTelemetry() is for test isolation.\nexport function getTelemetry(): Telemetry {\n telemetryInstance ??= new Telemetry();\n\n return telemetryInstance;\n}\n\nexport function resetTelemetry(): void {\n telemetryInstance = undefined;\n}\n","{\n \"name\": \"@bigcommerce/catalyst\",\n \"version\": \"1.0.0-alpha.5\",\n \"type\": \"module\",\n \"bin\": {\n \"catalyst\": \"dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"templates\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint . --max-warnings 0\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"build\": \"tsup\"\n },\n \"engines\": {\n \"node\": \"^20.0.0 || ^22.0.0 || ^24.0.0\"\n },\n \"dependencies\": {\n \"@commander-js/extra-typings\": \"^14.0.0\",\n \"@inquirer/prompts\": \"^7.5.3\",\n \"@segment/analytics-node\": \"^2.2.1\",\n \"adm-zip\": \"^0.5.16\",\n \"commander\": \"^14.0.0\",\n \"conf\": \"^13.1.0\",\n \"consola\": \"^3.4.2\",\n \"cross-spawn\": \"^7.0.6\",\n \"dotenv\": \"^16.5.0\",\n \"execa\": \"^9.6.0\",\n \"fs-extra\": \"^11.3.0\",\n \"lodash.kebabcase\": \"^4.1.1\",\n \"nypm\": \"^0.5.4\",\n \"open\": \"^10.1.0\",\n \"std-env\": \"^3.9.0\",\n \"yocto-spinner\": \"^1.0.0\",\n \"zod\": \"^4.0.5\"\n },\n \"devDependencies\": {\n \"@bigcommerce/eslint-config\": \"^2.11.0\",\n \"@bigcommerce/eslint-config-catalyst\": \"workspace:^\",\n \"@types/adm-zip\": \"^0.5.7\",\n \"@types/cross-spawn\": \"^6.0.6\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/lodash.kebabcase\": \"^4.1.9\",\n \"@types/node\": \"^22.15.30\",\n \"@vitest/coverage-v8\": \"^3.2.4\",\n \"@vitest/ui\": \"^3.2.4\",\n \"eslint\": \"^8.57.1\",\n \"msw\": \"^2.9.0\",\n \"prettier\": \"^3.6.2\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n },\n \"peerDependencies\": {\n \"@opennextjs/cloudflare\": \"1.17.3\"\n }\n}\n","import Conf from 'conf';\n\nexport interface UserConfigSchema {\n telemetry: {\n enabled: boolean;\n anonymousId: string;\n };\n}\n\nlet userConfigInstance: Conf<UserConfigSchema> | undefined;\n\n// User-scoped config (per-machine, not per-project). Lives in the OS config dir\n// — keeping telemetry out of the user's working directory so commands like\n// `catalyst create` don't drop a stray `.bigcommerce/` next to where they're run.\nexport function getUserConfig(): Conf<UserConfigSchema> {\n userConfigInstance ??= new Conf<UserConfigSchema>({\n projectName: 'catalyst-cli',\n projectSuffix: '',\n configName: 'config',\n schema: {\n telemetry: {\n type: 'object',\n properties: {\n enabled: { type: 'boolean' },\n anonymousId: { type: 'string' },\n },\n },\n },\n });\n\n return userConfigInstance;\n}\n\nexport function resetUserConfig(): void {\n userConfigInstance = undefined;\n}\n","import { Option } from '@commander-js/extra-typings';\nimport { Command } from 'commander';\nimport { colorize } from 'consola/utils';\nimport { config } from 'dotenv';\nimport { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport PACKAGE_INFO from '../../package.json';\n\nimport { auth } from './commands/auth';\nimport { build } from './commands/build';\nimport { channel } from './commands/channel';\nimport { create } from './commands/create';\nimport { deploy } from './commands/deploy';\nimport { env } from './commands/env';\nimport { logs } from './commands/logs';\nimport { project } from './commands/project';\nimport { start } from './commands/start';\nimport { telemetry } from './commands/telemetry';\nimport { version } from './commands/version';\nimport { telemetryPostHook, telemetryPreHook } from './hooks/telemetry';\nimport { consola } from './lib/logger';\n\n// Auto-load .env.local from cwd if present, matching Next.js convention.\n// `--env-path` (loaded later via argParser) overrides anything we load here.\nconst defaultEnvPath = resolve(process.cwd(), '.env.local');\n\nif (existsSync(defaultEnvPath)) {\n config({ path: defaultEnvPath });\n}\n\n// CATALYST_STORE_HASH falls back to BIGCOMMERCE_STORE_HASH so freshly-scaffolded\n// projects work without duplicating the same value under two names. Aliasing\n// here means every command's `.env('CATALYST_STORE_HASH')` binding picks it up\n// without per-command changes.\nif (!process.env.CATALYST_STORE_HASH && process.env.BIGCOMMERCE_STORE_HASH) {\n process.env.CATALYST_STORE_HASH = process.env.BIGCOMMERCE_STORE_HASH;\n}\n\nexport const program = new Command();\n\nconsola.log(colorize('cyanBright', `◢ ${PACKAGE_INFO.name} v${PACKAGE_INFO.version}\\n`));\n\nprogram\n .name(PACKAGE_INFO.name)\n .version(PACKAGE_INFO.version)\n .summary('CLI tool for Catalyst development')\n .description(\n 'CLI tool for Catalyst development.\\n\\nConfiguration priority: flags > env file (--env-path) > process.env > .env.local (auto-loaded from cwd) > .bigcommerce/project.json.\\n\\nCATALYST_STORE_HASH falls back to BIGCOMMERCE_STORE_HASH if unset.\\n\\nRun `catalyst <command> --help` for details on a specific command.',\n )\n .configureHelp({ showGlobalOptions: true })\n .addOption(\n new Option(\n '--env-path <path>',\n 'Path to environment file to load (relative to current working directory)',\n // We are using argParser, because commander loads in environment variables before executing hooks.\n ).argParser((value) => {\n if (value) {\n const envFilePath = resolve(process.cwd(), value);\n const result = config({\n path: envFilePath,\n override: true,\n });\n\n if (result.error) {\n const errCode =\n 'code' in result.error && typeof result.error.code === 'string'\n ? result.error.code\n : undefined;\n const message =\n errCode === 'ENOENT'\n ? `Env file not found: ${envFilePath}`\n : `Failed to load --env-path ${value}: ${result.error.message}`;\n\n throw new Error(message);\n }\n\n consola.log(colorize('cyanBright', `Loaded environment variables from ${envFilePath}\\n`));\n }\n\n return value;\n }),\n )\n .addCommand(version)\n .addCommand(create)\n .addCommand(start)\n .addCommand(build)\n .addCommand(deploy)\n .addCommand(logs)\n .addCommand(project)\n .addCommand(env)\n .addCommand(channel)\n .addCommand(auth)\n .addCommand(telemetry)\n .hook('preAction', telemetryPreHook)\n .hook('postAction', telemetryPostHook);\n","import { Command, Option } from 'commander';\nimport { z } from 'zod';\n\nimport { assertAuthorized, UnauthorizedError } from '../lib/auth-errors';\nimport { consola } from '../lib/logger';\nimport { LoginAbortedError, login as runInteractiveLogin } from '../lib/login';\nimport { fetchProjects } from '../lib/project';\nimport { getProjectConfig } from '../lib/project-config';\nimport { loginUrlOption } from '../lib/shared-options';\n\nconst StoreProfileSchema = z.object({\n data: z.object({\n store_name: z.string(),\n }),\n});\n\nasync function fetchStoreProfile(storeHash: string, accessToken: string, apiHost: string) {\n const response = await fetch(`https://${apiHost}/stores/${storeHash}/v3/settings/store/profile`, {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n Accept: 'application/json',\n },\n });\n\n assertAuthorized(response);\n\n if (!response.ok) {\n throw new Error(`${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const result = StoreProfileSchema.safeParse(res);\n\n if (!result.success) {\n throw new Error('Unexpected response from store profile API');\n }\n\n return result.data.data;\n}\n\nconst whoami = new Command('whoami')\n .configureHelp({ showGlobalOptions: true })\n .description('Verify stored credentials and display store/project info.')\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst auth whoami\n\n Logged in to My Store (abc123), connected to project my-project (43eba682-0c48-11f1-9bd5-827a48b0ce1e)`,\n )\n .addOption(\n new Option(\n '--store-hash <hash>',\n 'BigCommerce store hash. Can be found in the URL of your store Control Panel.',\n ).env('CATALYST_STORE_HASH'),\n )\n .addOption(\n new Option(\n '--access-token <token>',\n 'BigCommerce access token. Can be found after creating a store-level API account.',\n ).env('CATALYST_ACCESS_TOKEN'),\n )\n .addOption(\n new Option('--api-host <host>', 'BigCommerce API host. The default is api.bigcommerce.com.')\n .env('BIGCOMMERCE_API_HOST')\n .default('api.bigcommerce.com')\n .hideHelp(),\n )\n .action(async (options) => {\n try {\n const config = getProjectConfig();\n\n const storeHash = options.storeHash ?? config.get('storeHash');\n const accessToken = options.accessToken ?? config.get('accessToken');\n\n if (!storeHash || !accessToken) {\n consola.info('Not logged in: no credentials found.');\n consola.info(\n 'Run `catalyst auth login`, or provide --store-hash and --access-token flags (or set CATALYST_STORE_HASH and CATALYST_ACCESS_TOKEN environment variables).',\n );\n process.exit(1);\n\n return;\n }\n\n const store = await fetchStoreProfile(storeHash, accessToken, options.apiHost);\n\n const projectUuid = config.get('projectUuid');\n\n if (projectUuid) {\n const projects = await fetchProjects(storeHash, accessToken, options.apiHost);\n const linkedProject = projects.find((p) => p.uuid === projectUuid);\n\n if (linkedProject) {\n consola.info(\n `Logged in to ${store.store_name} (${storeHash}), connected to project ${linkedProject.name} (${projectUuid})`,\n );\n } else {\n consola.info(\n `Logged in to ${store.store_name} (${storeHash}), project ${projectUuid} not found`,\n );\n }\n } else {\n consola.info(`Logged in to ${store.store_name} (${storeHash})`);\n }\n\n process.exit(0);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (error instanceof UnauthorizedError) {\n consola.error(\n 'Not logged in: your access token is invalid or has expired. Run `catalyst auth login`.',\n );\n } else if (message.includes('401') || message.includes('403')) {\n consola.error(`Not logged in: invalid credentials (${message})`);\n } else {\n consola.error(`Failed to verify credentials: ${message}`);\n }\n\n process.exit(1);\n }\n });\n\nconst login = new Command('login')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Authenticate via browser using the OAuth device code flow. Falls back to an interactive store hash + access token prompt if the browser flow is unavailable. If already logged in, displays current credentials and suggests running `catalyst auth logout` to re-authenticate.',\n )\n .addHelpText(\n 'after',\n `\nExamples:\n # Login interactively (browser, with manual fallback)\n $ catalyst auth login\n\n # Login with existing credentials (skips interactive flow)\n $ catalyst auth login --store-hash <STORE_HASH> --access-token <ACCESS_TOKEN>`,\n )\n .addOption(\n new Option(\n '--store-hash <hash>',\n 'BigCommerce store hash. Can be found in the URL of your store Control Panel.',\n ).env('CATALYST_STORE_HASH'),\n )\n .addOption(\n new Option(\n '--access-token <token>',\n 'BigCommerce access token. Can be found after creating a store-level API account.',\n ).env('CATALYST_ACCESS_TOKEN'),\n )\n .addOption(\n new Option('--api-host <host>', 'BigCommerce API host. The default is api.bigcommerce.com.')\n .env('BIGCOMMERCE_API_HOST')\n .default('api.bigcommerce.com')\n .hideHelp(),\n )\n .addOption(loginUrlOption())\n .action(async (options) => {\n try {\n const config = getProjectConfig();\n\n const storeHash = options.storeHash ?? config.get('storeHash');\n const accessToken = options.accessToken ?? config.get('accessToken');\n\n if (storeHash && accessToken) {\n consola.info(`Already logged in to store ${storeHash}.`);\n consola.info('Run `catalyst auth logout` first to re-authenticate.');\n process.exit(0);\n\n return;\n }\n\n const credentials = await runInteractiveLogin(options.loginUrl, options.apiHost);\n\n config.set('storeHash', credentials.storeHash);\n config.set('accessToken', credentials.accessToken);\n\n consola.success(`Logged in to store ${credentials.storeHash}.`);\n process.exit(0);\n } catch (error) {\n if (error instanceof LoginAbortedError) {\n consola.info(\n 'Login aborted. Re-run `catalyst auth login` when you have your credentials ready.',\n );\n process.exit(0);\n\n return;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n\n consola.error(`Login failed: ${message}`);\n process.exit(1);\n }\n });\n\nconst logout = new Command('logout')\n .configureHelp({ showGlobalOptions: true })\n .description('Remove stored credentials for the current project.')\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst auth logout`,\n )\n .action(() => {\n try {\n const config = getProjectConfig();\n\n const storeHash = config.get('storeHash');\n const accessToken = config.get('accessToken');\n\n if (!storeHash && !accessToken) {\n consola.info('Not logged in: no credentials found.');\n process.exit(0);\n\n return;\n }\n\n config.delete('storeHash');\n config.delete('accessToken');\n\n consola.success(`Logged out from store ${storeHash ?? 'unknown'}.`);\n process.exit(0);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n consola.error(`Logout failed: ${message}`);\n process.exit(1);\n }\n });\n\nexport const auth = new Command('auth')\n .configureHelp({ showGlobalOptions: true })\n .description('Manage authentication for the BigCommerce CLI.')\n .addCommand(whoami)\n .addCommand(login)\n .addCommand(logout);\n","import { password } from '@inquirer/prompts';\nimport { colorize } from 'consola/utils';\nimport open from 'open';\nimport yoctoSpinner from 'yocto-spinner';\nimport { z } from 'zod';\n\nimport { DEVICE_OAUTH_SCOPES, requestDeviceCode, waitForDeviceToken } from './auth';\nimport { consola } from './logger';\n\nexport interface LoginResult {\n storeHash: string;\n accessToken: string;\n}\n\n// Thrown when the user declines the manual-login fallback after the browser\n// (device-code) flow has failed. Callers should treat this as a clean exit,\n// not an error — the user explicitly chose to abort.\nexport class LoginAbortedError extends Error {\n constructor() {\n super('Login aborted by user.');\n this.name = 'LoginAbortedError';\n }\n}\n\nconst StoreProfileSchema = z.object({\n data: z.object({\n store_name: z.string(),\n }),\n});\n\nasync function fetchStoreProfile(storeHash: string, accessToken: string, apiHost: string) {\n const response = await fetch(`https://${apiHost}/stores/${storeHash}/v3/settings/store/profile`, {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const result = StoreProfileSchema.safeParse(res);\n\n if (!result.success) {\n throw new Error('Unexpected response from store profile API');\n }\n\n return result.data.data;\n}\n\nasync function deviceCodeLogin(loginUrl: string): Promise<LoginResult> {\n const deviceCode = await requestDeviceCode(loginUrl);\n\n consola.info(\n `${colorize('yellow', 'Your one-time code:')} ${colorize('bold', deviceCode.user_code)}`,\n );\n\n try {\n await open(deviceCode.verification_uri);\n consola.info(`Opened ${deviceCode.verification_uri} in your browser.`);\n } catch {\n consola.info(`Open ${deviceCode.verification_uri} in your browser and enter the code above.`);\n }\n\n const spinner = yoctoSpinner().start('Waiting for authentication...');\n\n const credentials = await waitForDeviceToken(\n loginUrl,\n deviceCode.device_code,\n deviceCode.interval,\n );\n\n spinner.success('Authentication complete.');\n\n return {\n storeHash: credentials.store_hash,\n accessToken: credentials.access_token,\n };\n}\n\nasync function manualLogin(apiHost: string): Promise<LoginResult> {\n consola.info(\n 'Create a store-level API account from your BigCommerce Control Panel:\\n' +\n ' Settings → API → Store-level API accounts → Create API account\\n' +\n `Grant these OAuth scopes: ${DEVICE_OAUTH_SCOPES}`,\n );\n\n const storeHashInput = await consola.prompt('Store hash:', { type: 'text' });\n const storeHash = String(storeHashInput).trim();\n\n if (!storeHash) {\n throw new Error('Store hash is required.');\n }\n\n const accessTokenInput = await password({ message: 'Access token:', mask: true });\n const accessToken = accessTokenInput.trim();\n\n if (!accessToken) {\n throw new Error('Access token is required.');\n }\n\n const spinner = yoctoSpinner().start('Validating credentials...');\n\n try {\n const profile = await fetchStoreProfile(storeHash, accessToken, apiHost);\n\n spinner.success(`Validated credentials for ${profile.store_name} (${storeHash}).`);\n } catch (error) {\n spinner.error('Failed to validate credentials.');\n\n const message = error instanceof Error ? error.message : String(error);\n\n throw new Error(\n `Could not validate credentials (${message}). Double-check your store hash and access token, then try again.`,\n );\n }\n\n return { storeHash, accessToken };\n}\n\n// Interactive login orchestrator. Used by `catalyst create`, `catalyst auth\n// login`, and `catalyst project create` to gather credentials when none are\n// supplied via flags/env/config.\n//\n// Happy path: opens the browser device-code flow. When that fails (e.g. the\n// device-code endpoint returns 404 because the OAuth client isn't yet\n// provisioned for the user's environment), we ask the user if they'd like to\n// fall back to pasting a store-level API account's credentials instead, then\n// validate them via the store profile API before returning.\nexport async function login(loginUrl: string, apiHost: string): Promise<LoginResult> {\n try {\n return await deviceCodeLogin(loginUrl);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n consola.warn(`Browser login didn't work (${message}).`);\n\n const shouldFallback = await consola.prompt(\n 'Try logging in manually with a store hash and access token instead?',\n { type: 'confirm', initial: true },\n );\n\n if (!shouldFallback) {\n throw new LoginAbortedError();\n }\n\n return manualLogin(apiHost);\n }\n}\n","import { z } from 'zod';\n\nexport const DEVICE_OAUTH_CLIENT_ID = 'b8063bu6hhml4e0lqh22yut63atsbyv';\nexport const DEVICE_OAUTH_SCOPES = [\n 'store_v2_information',\n 'store_infrastructure_deployments_manage',\n 'store_infrastructure_logs_read_only',\n 'store_infrastructure_projects_manage',\n 'store_channel_settings',\n].join(' ');\nexport const DEFAULT_LOGIN_URL = 'https://login.bigcommerce.com';\n\nexport const DeviceCodeResponseSchema = z.object({\n device_code: z.string(),\n user_code: z.string(),\n verification_uri: z.string(),\n expires_in: z.number(),\n interval: z.number(),\n});\n\nexport const DeviceCodeSuccessSchema = z.object({\n access_token: z.string(),\n store_hash: z.string(),\n context: z.string(),\n api_uri: z.string(),\n});\n\nexport async function requestDeviceCode(loginUrl: string) {\n const response = await fetch(`${loginUrl}/device/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n client_id: DEVICE_OAUTH_CLIENT_ID,\n scopes: DEVICE_OAUTH_SCOPES,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to request device code: ${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n\n return DeviceCodeResponseSchema.parse(res);\n}\n\nexport async function pollDeviceToken(loginUrl: string, deviceCode: string) {\n const response = await fetch(`${loginUrl}/device/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n device_code: deviceCode,\n client_id: DEVICE_OAUTH_CLIENT_ID,\n }),\n });\n\n if (response.status !== 200) {\n return null;\n }\n\n const res: unknown = await response.json();\n\n return DeviceCodeSuccessSchema.parse(res);\n}\n\nexport async function waitForDeviceToken(\n loginUrl: string,\n deviceCode: string,\n interval: number,\n): Promise<z.infer<typeof DeviceCodeSuccessSchema>> {\n const credentials = await pollDeviceToken(loginUrl, deviceCode);\n\n if (credentials) {\n return credentials;\n }\n\n await new Promise((resolve) => {\n setTimeout(resolve, interval * 1000);\n });\n\n return waitForDeviceToken(loginUrl, deviceCode, interval);\n}\n","import { z } from 'zod';\n\nimport { assertAuthorized } from './auth-errors';\nimport { getTelemetry } from './telemetry';\n\nexport class InfrastructureProjectValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InfrastructureProjectValidationError';\n }\n}\n\nconst fetchProjectsSchema = z.object({\n data: z.array(\n z.object({\n uuid: z.string(),\n name: z.string(),\n deployment_hostnames: z.array(z.string()),\n }),\n ),\n});\n\nexport interface ProjectListItem {\n uuid: string;\n name: string;\n deployment_hostnames: string[];\n}\n\nfunction projectsUrl(storeHash: string, apiHost: string) {\n return `https://${apiHost}/stores/${storeHash}/v3/infrastructure/projects`;\n}\n\nfunction authHeaders(accessToken: string) {\n return {\n 'X-Auth-Token': accessToken,\n 'X-Correlation-Id': getTelemetry().correlationId,\n };\n}\n\nexport async function hasProjectsAccess(\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<boolean> {\n const response = await fetch(projectsUrl(storeHash, apiHost), {\n method: 'GET',\n headers: authHeaders(accessToken),\n });\n\n assertAuthorized(response);\n\n if (response.status === 200) return true;\n if (response.status === 403) return false;\n\n throw new Error(\n `GET /v3/infrastructure/projects failed: ${response.status} ${response.statusText}`,\n );\n}\n\nexport async function fetchProjects(\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<ProjectListItem[]> {\n const response = await fetch(projectsUrl(storeHash, apiHost), {\n method: 'GET',\n headers: authHeaders(accessToken),\n });\n\n assertAuthorized(response);\n\n if (response.status === 403) {\n throw new Error(\n 'Infrastructure Projects API not enabled. If you are part of the alpha, contact support@bigcommerce.com to enable it.',\n );\n }\n\n if (!response.ok) {\n throw new Error(`Failed to fetch projects: ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n\n const { data } = fetchProjectsSchema.parse(res);\n\n return data;\n}\n\nconst createProjectSchema = z.object({\n data: z.object({\n uuid: z.string(),\n name: z.string(),\n date_created: z.coerce.date(),\n date_modified: z.coerce.date(),\n }),\n});\n\nexport interface CreateProjectResult {\n uuid: string;\n name: string;\n date_created: Date;\n date_modified: Date;\n}\n\nconst validationErrorBodySchema = z.object({\n title: z.string().optional(),\n detail: z.string().optional(),\n errors: z.record(z.string(), z.string()).optional(),\n});\n\nfunction extractValidationMessage(body: unknown): string | null {\n const parsed = validationErrorBodySchema.safeParse(body);\n\n if (!parsed.success) return null;\n\n const { title, detail, errors } = parsed.data;\n\n if (errors && Object.keys(errors).length > 0) {\n return Object.values(errors).join('; ');\n }\n\n return detail ?? title ?? null;\n}\n\nexport async function createProject(\n name: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<CreateProjectResult> {\n const response = await fetch(projectsUrl(storeHash, apiHost), {\n method: 'POST',\n headers: {\n ...authHeaders(accessToken),\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ name }),\n });\n\n assertAuthorized(response);\n\n if (response.status === 400 || response.status === 422) {\n const body: unknown = await response.json().catch(() => null);\n const fallback =\n response.status === 422\n ? \"The project name you entered doesn't meet the requirements. It must be 3–32 characters long and use only letters, numbers, hyphens (-), underscores (_), and periods (.)\"\n : response.statusText;\n const message = extractValidationMessage(body) ?? fallback;\n\n throw new InfrastructureProjectValidationError(message);\n }\n\n if (response.status === 403) {\n throw new Error(\n 'Infrastructure Projects API not enabled. If you are part of the alpha, contact support@bigcommerce.com to enable it.',\n );\n }\n\n // TODO: TRAC-592 - remove this check once the API returns proper 400/422 with validation messages for duplicate names instead of 502\n if (response.status === 502) {\n throw new Error('Failed to create project, is the name already in use?');\n }\n\n if (!response.ok) {\n throw new Error(`Failed to create project: ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n\n const { data } = createProjectSchema.parse(res);\n\n return data;\n}\n\nexport async function deleteProject(\n projectUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<void> {\n const response = await fetch(`${projectsUrl(storeHash, apiHost)}/${projectUuid}`, {\n method: 'DELETE',\n headers: authHeaders(accessToken),\n });\n\n assertAuthorized(response);\n\n if (response.status === 403) {\n throw new Error(\n 'Infrastructure Projects API not enabled. If you are part of the alpha, contact support@bigcommerce.com to enable it.',\n );\n }\n\n if (response.status === 404) {\n throw new Error(`Project ${projectUuid} not found.`);\n }\n\n if (!response.ok) {\n throw new Error(`Failed to delete project: ${response.statusText}`);\n }\n}\n","import Conf from 'conf';\nimport { join } from 'path';\n\nexport interface ProjectConfigSchema {\n projectUuid: string;\n // Reserved for future use\n framework: 'catalyst';\n storeHash?: string;\n accessToken?: string;\n // Persistent deployment environment variables (KEY -> VALUE). Every entry is\n // sent to the deployment as a `secret` by `catalyst deploy`. Managed via the\n // `catalyst env` commands. Lives here (gitignored .bigcommerce/project.json)\n // so users don't have to re-pass `--secret` on every deploy.\n env?: Record<string, string>;\n}\n\nexport function getProjectConfig() {\n return new Conf<ProjectConfigSchema>({\n cwd: join(process.cwd(), '.bigcommerce'),\n projectSuffix: '',\n configName: 'project',\n schema: {\n projectUuid: { type: 'string', format: 'uuid' },\n framework: {\n type: 'string',\n enum: ['catalyst'],\n default: 'catalyst',\n },\n storeHash: { type: 'string' },\n accessToken: { type: 'string' },\n env: {\n type: 'object',\n additionalProperties: { type: 'string' },\n default: {},\n },\n },\n });\n}\n","import { Option } from 'commander';\n\nimport { DEFAULT_LOGIN_URL } from './auth';\nimport { getProjectConfig } from './project-config';\n\nexport const storeHashOption = () =>\n new Option(\n '--store-hash <hash>',\n 'BigCommerce store hash. Can be found in the URL of your store Control Panel. Read from .bigcommerce/project.json or .env when not provided.',\n ).env('CATALYST_STORE_HASH');\n\nexport const accessTokenOption = () =>\n new Option(\n '--access-token <token>',\n 'BigCommerce access token. Can be found after creating a store-level API account. Read from .bigcommerce/project.json or .env when not provided.',\n ).env('CATALYST_ACCESS_TOKEN');\n\nexport const apiHostOption = () =>\n new Option('--api-host <host>', 'BigCommerce API host. The default is api.bigcommerce.com.')\n .env('BIGCOMMERCE_API_HOST')\n .default('api.bigcommerce.com')\n .hideHelp();\n\nexport const loginUrlOption = () =>\n new Option('--login-url <url>', 'BigCommerce login URL.')\n .env('BIGCOMMERCE_LOGIN_URL')\n .default(DEFAULT_LOGIN_URL)\n .hideHelp();\n\nexport const projectUuidOption = () =>\n new Option(\n '--project-uuid <uuid>',\n 'BigCommerce infrastructure project UUID. Read from .bigcommerce/project.json or .env when not provided.',\n ).env('CATALYST_PROJECT_UUID');\n\nexport const resolveProjectUuid = (options: { projectUuid?: string }) => {\n const config = getProjectConfig();\n const projectUuid = options.projectUuid ?? config.get('projectUuid');\n\n if (!projectUuid) {\n throw new Error(\n 'Project UUID is required. Please run either `catalyst project link` or `catalyst project create` or this command again with --project-uuid <uuid>.',\n );\n }\n\n return projectUuid;\n};\n","import { Command, Option } from 'commander';\nimport { execa } from 'execa';\nimport { copyFile, cp, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getModuleCliPath } from '../lib/get-module-cli-path';\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\nimport { getProjectState } from '../lib/project-state';\nimport { getWranglerConfig } from '../lib/wrangler-config';\n\nconst WRANGLER_VERSION = '4.90.0';\n\nexport async function buildCatalystProject(projectUuid: string): Promise<void> {\n const coreDir = process.cwd();\n const openNextOutDir = join(coreDir, '.open-next');\n const bigcommerceDistDir = join(coreDir, '.bigcommerce', 'dist');\n\n const wranglerConfig = getWranglerConfig(projectUuid);\n\n // Wrangler's --outdir writes alongside existing files instead of replacing\n // the directory. Stale artifacts (e.g. wasm modules named by an older\n // Wrangler version) end up in the bundle and break the Cloudflare upload.\n await rm(bigcommerceDistDir, { recursive: true, force: true });\n\n consola.start('Copying templates...');\n\n await copyFile(\n join(getModuleCliPath(), 'templates', 'open-next.config.ts'),\n join(coreDir, '.bigcommerce', 'open-next.config.ts'),\n );\n await writeFile(\n join(coreDir, '.bigcommerce', 'wrangler.jsonc'),\n JSON.stringify(wranglerConfig, null, 2),\n );\n\n consola.success('Templates copied');\n\n consola.start('Building project...');\n\n await execa(\n 'pnpm',\n [\n 'exec',\n 'opennextjs-cloudflare',\n 'build',\n '--skipWranglerConfigCheck',\n '--openNextConfigPath',\n join(coreDir, '.bigcommerce', 'open-next.config.ts'),\n ],\n {\n stdout: ['pipe', 'inherit'],\n cwd: coreDir,\n },\n );\n\n await execa(\n 'pnpm',\n [\n 'dlx',\n `wrangler@${WRANGLER_VERSION}`,\n 'deploy',\n '--config',\n join(coreDir, '.bigcommerce', 'wrangler.jsonc'),\n '--keep-vars',\n '--outdir',\n bigcommerceDistDir,\n '--dry-run',\n ],\n {\n stdout: ['pipe', 'inherit'],\n cwd: coreDir,\n },\n );\n\n consola.success('Project built');\n\n await cp(join(openNextOutDir, 'assets'), join(bigcommerceDistDir, 'assets'), {\n recursive: true,\n force: true,\n });\n}\n\nexport const build = new Command('build')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Build your Catalyst project using the OpenNext/Cloudflare build pipeline. Also runs a Wrangler dry-run to generate deployment artifacts.',\n )\n .addHelpText(\n 'after',\n `\nExamples:\n $ catalyst build\n\n # Include project UUID\n $ catalyst build --project-uuid <UUID>`,\n )\n .addOption(\n new Option(\n '--project-uuid <uuid>',\n 'Project UUID to be included in the deployment configuration.',\n ).env('CATALYST_PROJECT_UUID'),\n )\n .action(async (options) => {\n // Project must be transformed (middleware swapped in, OpenNext dep installed)\n // before the OpenNext build pipeline can run. If it isn't, fall through to\n // `next build` so this command works for self-hosted Catalyst projects too.\n const state = getProjectState();\n\n if (!state.isTransformed) {\n consola.info('Project is not set up for Commerce Hosting — running `next build`.');\n consola.info('To deploy to Commerce Hosting, run `catalyst deploy`.');\n\n await execa('pnpm', ['exec', 'next', 'build'], {\n stdio: 'inherit',\n cwd: process.cwd(),\n });\n\n return;\n }\n\n const config = getProjectConfig();\n const projectUuid = options.projectUuid ?? config.get('projectUuid');\n\n if (!projectUuid) {\n throw new Error(\n 'Project UUID is required. Please run `catalyst project create` or `catalyst project link` or this command again with --project-uuid <uuid>.',\n );\n }\n\n await buildCatalystProject(projectUuid);\n });\n","/* eslint-disable no-underscore-dangle */\n\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getModuleCliPath() {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n return join(__dirname, '..');\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { z } from 'zod';\n\nconst projectJsonSchema = z.looseObject({\n projectUuid: z.string().optional(),\n});\n\nconst packageJsonSchema = z.looseObject({\n dependencies: z.record(z.string(), z.string()).optional(),\n});\n\nexport interface ProjectState {\n projectUuid: string | undefined;\n hasMiddleware: boolean;\n hasProxy: boolean;\n hasOpenNextDep: boolean;\n\n // Derived signals — `isLinked` reflects intent (UUID registered via\n // `catalyst project create` or commerce-hosting setup); `isTransformed`\n // reflects on-disk readiness (middleware.ts swapped in, OpenNext dep\n // installed). A deploy needs both, but `catalyst build` only cares about\n // `isTransformed` so it can dispatch to OpenNext vs `next build`.\n isLinked: boolean;\n isTransformed: boolean;\n isFullySetUp: boolean;\n}\n\nconst safeReadJson = (path: string): unknown => {\n try {\n return JSON.parse(readFileSync(path, 'utf-8'));\n } catch {\n return null;\n }\n};\n\n// Read-only inspection of a Catalyst project at `cwd` (typically `core/`).\n// Avoids `getProjectConfig()` deliberately — that would instantiate `Conf`\n// and create `.bigcommerce/` as a side effect.\nexport function getProjectState(cwd: string = process.cwd()): ProjectState {\n const projectJson = projectJsonSchema.safeParse(\n safeReadJson(join(cwd, '.bigcommerce', 'project.json')),\n );\n const projectUuid = projectJson.success ? projectJson.data.projectUuid : undefined;\n\n const hasMiddleware = existsSync(join(cwd, 'middleware.ts'));\n const hasProxy = existsSync(join(cwd, 'proxy.ts'));\n\n const pkgJson = packageJsonSchema.safeParse(safeReadJson(join(cwd, 'package.json')));\n const hasOpenNextDep = pkgJson.success\n ? Boolean(pkgJson.data.dependencies?.['@opennextjs/cloudflare'])\n : false;\n\n const isLinked = Boolean(projectUuid);\n const isTransformed = hasMiddleware && !hasProxy && hasOpenNextDep;\n const isFullySetUp = isLinked && isTransformed;\n\n return {\n projectUuid,\n hasMiddleware,\n hasProxy,\n hasOpenNextDep,\n isLinked,\n isTransformed,\n isFullySetUp,\n };\n}\n","export function getWranglerConfig(projectUuid: string) {\n return {\n $schema: 'node_modules/wrangler/config-schema.json',\n main: '../.open-next/worker.js',\n name: `project-${projectUuid}`,\n compatibility_date: '2025-09-15',\n compatibility_flags: ['nodejs_compat', 'global_fetch_strictly_public'],\n observability: {\n enabled: true,\n head_sampling_rate: 0.05,\n logs: {\n enabled: true,\n head_sampling_rate: 1,\n invocation_logs: false,\n },\n },\n assets: {\n directory: '../.open-next/assets',\n binding: 'ASSETS',\n },\n services: [\n {\n binding: 'WORKER_SELF_REFERENCE',\n service: `project-${projectUuid}`,\n },\n ],\n r2_buckets: [\n {\n binding: 'NEXT_INC_CACHE_R2_BUCKET',\n bucket_name: `project-${projectUuid}`,\n },\n ],\n durable_objects: {\n bindings: [\n {\n name: 'NEXT_CACHE_DO_QUEUE',\n class_name: 'DOQueueHandler',\n },\n {\n name: 'NEXT_TAG_CACHE_DO_SHARDED',\n class_name: 'DOShardedTagCache',\n },\n {\n name: 'NEXT_CACHE_DO_PURGE',\n class_name: 'BucketCachePurge',\n },\n ],\n },\n migrations: [\n {\n tag: 'v1',\n new_sqlite_classes: ['DOQueueHandler', 'DOShardedTagCache', 'BucketCachePurge'],\n },\n ],\n };\n}\n","import { Command, Option } from 'commander';\n\nimport { runChannelSiteUrlFlow } from '../lib/channel-site-flow';\nimport { NoLinkedProjectError } from '../lib/commerce-hosting';\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\nimport { resolveCredentials } from '../lib/resolve-credentials';\nimport {\n accessTokenOption,\n apiHostOption,\n projectUuidOption,\n storeHashOption,\n} from '../lib/shared-options';\nimport { getTelemetry } from '../lib/telemetry';\n\nconst update = new Command('update')\n .configureHelp({ showGlobalOptions: true })\n .description(\n \"Update a BigCommerce channel's site URL to point at one of your project's deployment hostnames.\",\n )\n .addHelpText(\n 'after',\n `\nExamples:\n # Pick a channel and hostname interactively\n $ catalyst channel update\n\n # Skip both prompts\n $ catalyst channel update --channel-id 123 --hostname my-storefront.example.com`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .addOption(\n new Option(\n '--channel-id <id>',\n 'Skip the channel prompt and target this channel directly.',\n ).argParser((value: string) => Number(value)),\n )\n .addOption(\n new Option(\n '--hostname <hostname>',\n \"Skip the hostname prompt and use this hostname directly. Must be one of the project's deployment_hostnames.\",\n ),\n )\n .action(async (options) => {\n const config = getProjectConfig();\n const { storeHash, accessToken } = resolveCredentials(options, config);\n\n await getTelemetry().identify(storeHash);\n\n try {\n await runChannelSiteUrlFlow({\n storeHash,\n accessToken,\n apiHost: options.apiHost,\n projectUuid: options.projectUuid ?? config.get('projectUuid'),\n channelId: options.channelId,\n hostname: options.hostname,\n });\n } catch (error) {\n if (error instanceof NoLinkedProjectError) {\n consola.info(\n \"When you're ready to create a project, run `catalyst project create` or re-run `catalyst channel update`.\",\n );\n process.exit(0);\n\n // Unreachable in production; prevents continuation when process.exit is mocked in tests.\n return;\n }\n\n throw error;\n }\n\n process.exit(0);\n });\n\nexport const channel = new Command('channel')\n .configureHelp({ showGlobalOptions: true })\n .description('Manage BigCommerce channels.')\n .addCommand(update);\n","import { z } from 'zod';\n\nimport { assertAuthorized } from './auth-errors';\nimport { getTelemetry } from './telemetry';\n\n// `origin` is the CLI-API gateway (configured via `--cli-api-origin`, default\n// `https://cxm-prd.bigcommerceapp.com`). Distinct from `apiHost` used for the\n// BC store API (api.bigcommerce.com).\nconst cliApiUrl = (origin: string, storeHash: string, path: string) =>\n `${origin}/stores/${storeHash}/cli-api/v3${path}`;\n\nconst channelsUrl = (storeHash: string, apiHost: string, query: Record<string, string> = {}) => {\n const params = new URLSearchParams(query).toString();\n\n return `https://${apiHost}/stores/${storeHash}/v3/channels${params ? `?${params}` : ''}`;\n};\n\nconst authHeaders = (accessToken: string) => ({\n 'X-Auth-Token': accessToken,\n 'X-Correlation-Id': getTelemetry().correlationId,\n Accept: 'application/json',\n});\n\n// envVars values are coerced to strings: the BC API returns mixed primitives\n// (e.g. BIGCOMMERCE_CHANNEL_ID is a number) but they all end up in .env.local as text.\nconst envVarsSchema = z.record(z.string(), z.coerce.string());\n\nconst channelSchema = z.object({\n id: z.number(),\n name: z.string(),\n platform: z.string(),\n});\n\nexport type Channel = z.infer<typeof channelSchema>;\n\nconst channelsResponseSchema = z.object({\n data: z.array(channelSchema),\n});\n\nconst initResponseSchema = z.object({\n data: z.object({\n storefront_api_token: z.string(),\n envVars: envVarsSchema,\n }),\n});\n\nconst createChannelResponseSchema = z.object({\n data: z.object({\n id: z.number(),\n storefront_api_token: z.string(),\n envVars: envVarsSchema,\n }),\n});\n\nconst eligibilityResponseSchema = z.object({\n data: z.object({\n eligible: z.boolean(),\n message: z.string(),\n }),\n});\n\nconst channelSiteSchema = z.object({\n data: z.object({\n id: z.number(),\n url: z.string(),\n channel_id: z.number(),\n }),\n});\n\nexport interface ChannelInit {\n storefrontToken: string;\n envVars: Record<string, string>;\n}\n\nexport async function getChannelInit(\n channelId: number | string,\n storeHash: string,\n accessToken: string,\n origin: string,\n): Promise<ChannelInit> {\n const response = await fetch(cliApiUrl(origin, storeHash, `/channels/${channelId}/init`), {\n method: 'GET',\n headers: authHeaders(accessToken),\n });\n\n if (!response.ok) {\n throw new Error(\n `GET /channels/${channelId}/init failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const { data } = initResponseSchema.parse(await response.json());\n\n return { storefrontToken: data.storefront_api_token, envVars: data.envVars };\n}\n\nexport interface ChannelEligibility {\n eligible: boolean;\n message: string;\n}\n\nexport async function checkChannelEligibility(\n storeHash: string,\n accessToken: string,\n origin: string,\n): Promise<ChannelEligibility> {\n const response = await fetch(cliApiUrl(origin, storeHash, '/channels/catalyst/eligibility'), {\n method: 'GET',\n headers: authHeaders(accessToken),\n });\n\n if (!response.ok) {\n throw new Error(\n `GET /channels/catalyst/eligibility failed: ${response.status} ${response.statusText}`,\n );\n }\n\n return eligibilityResponseSchema.parse(await response.json()).data;\n}\n\nexport interface CreatedChannel {\n channelId: number;\n storefrontToken: string;\n envVars: Record<string, string>;\n}\n\nexport async function createChannel(\n name: string,\n storefrontLocale: string,\n additionalLocales: string[],\n installSampleData: boolean,\n storeHash: string,\n accessToken: string,\n origin: string,\n): Promise<CreatedChannel> {\n const response = await fetch(cliApiUrl(origin, storeHash, '/channels/catalyst'), {\n method: 'POST',\n headers: { ...authHeaders(accessToken), 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name,\n initialData: { type: installSampleData ? 'sample' : 'none' },\n deployStorefront: true,\n devOrigin: 'http://localhost:3000',\n storefrontLanguage: storefrontLocale,\n additionalLocales,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`POST /channels/catalyst failed: ${response.status} ${response.statusText}`);\n }\n\n const { data } = createChannelResponseSchema.parse(await response.json());\n\n return {\n channelId: data.id,\n storefrontToken: data.storefront_api_token,\n envVars: data.envVars,\n };\n}\n\nexport async function fetchAvailableChannels(\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<Channel[]> {\n const response = await fetch(\n channelsUrl(storeHash, apiHost, { available: 'true', type: 'storefront' }),\n {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n 'X-Correlation-Id': getTelemetry().correlationId,\n Accept: 'application/json',\n },\n },\n );\n\n assertAuthorized(response);\n\n if (!response.ok) {\n throw new Error(`GET /v3/channels failed: ${response.status} ${response.statusText}`);\n }\n\n return channelsResponseSchema.parse(await response.json()).data;\n}\n\nexport interface ChannelSite {\n id: number;\n url: string;\n channelId: number;\n}\n\nexport async function updateChannelSiteUrl(\n channelId: number,\n siteUrl: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<ChannelSite> {\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/channels/${channelId}/site`,\n {\n method: 'PUT',\n headers: {\n 'X-Auth-Token': accessToken,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-Correlation-Id': getTelemetry().correlationId,\n },\n body: JSON.stringify({ url: siteUrl }),\n },\n );\n\n if (response.status === 401 || response.status === 403) {\n throw new Error(\n `Failed to update channel site (${response.status}). Re-run \\`catalyst auth login\\` to refresh your access token with the store_channel_settings scope.`,\n );\n }\n\n if (!response.ok) {\n throw new Error(`Failed to update channel site: ${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const { data } = channelSiteSchema.parse(res);\n\n return { id: data.id, url: data.url, channelId: data.channel_id };\n}\n","import { input, select, Separator } from '@inquirer/prompts';\nimport { colorize } from 'consola/utils';\nimport {\n existsSync,\n lstatSync,\n mkdirSync,\n readFileSync,\n symlinkSync,\n unlinkSync,\n writeFileSync,\n} from 'fs';\nimport { dirname, join } from 'path';\nimport { z } from 'zod';\n\nimport { consola } from './logger';\nimport {\n createProject,\n fetchProjects,\n InfrastructureProjectValidationError,\n type ProjectListItem,\n} from './project';\nimport { sortPackageJsonFields } from './sort-package-json';\n\nconst OPENNEXT_CLOUDFLARE_VERSION = '1.17.3';\n\nconst corePackageJsonSchema = z.looseObject({\n dependencies: z.record(z.string(), z.string()).optional(),\n});\n\nconst writeJson = (path: string, value: unknown) => {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst symlinkRootEnvToCore = (projectDir: string) => {\n const coreEnvPath = join(projectDir, 'core', '.env.local');\n\n if (lstatSync(coreEnvPath, { throwIfNoEntry: false })) return;\n\n try {\n symlinkSync('../.env.local', coreEnvPath);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'unknown error';\n\n consola.warn(\n `Could not create symlink at core/.env.local: ${message}\\n` +\n 'On Windows, enable Developer Mode or run as administrator to allow symlinks.\\n' +\n 'You will need to keep .env.local and core/.env.local in sync manually.',\n );\n }\n};\n\nconst convertProxyToMiddleware = (projectDir: string) => {\n const proxyPath = join(projectDir, 'core', 'proxy.ts');\n const middlewarePath = join(projectDir, 'core', 'middleware.ts');\n\n if (!existsSync(proxyPath)) return;\n\n const contents = readFileSync(proxyPath, 'utf-8')\n .replace('export const proxy', 'export const middleware')\n .replace('export const config = {', \"export const config = {\\n runtime: 'experimental-edge',\");\n\n writeFileSync(middlewarePath, contents);\n unlinkSync(proxyPath);\n};\n\n// The default `core/instrumentation.ts` registers `@vercel/otel`, whose node\n// build OpenNext bundles into the worker chunk; workerd then throws on cold\n// start with \"Failed to prepare server\". A Vercel-deploying user may have\n// customized the hook though, so we prompt before removing it (and only drop\n// `@vercel/otel` if the user agrees — their customization probably imports it).\n// In non-TTY contexts (CI deploys, scripts), skip the cleanup with a warning so\n// no customization is silently wiped. Exported because callers run this on\n// already-transformed projects too, where `setupCommerceHosting` would\n// short-circuit.\nexport const cleanupCloudflareIncompatibilities = async (projectDir: string) => {\n const instrumentationPath = join(projectDir, 'core', 'instrumentation.ts');\n\n if (!existsSync(instrumentationPath)) return;\n\n if (!process.stdin.isTTY) {\n consola.warn(\n 'core/instrumentation.ts is present and may be incompatible with the Cloudflare Workers ' +\n 'bundle (the default @vercel/otel scaffolding throws at cold start under workerd). ' +\n 'Skipping automatic cleanup in non-interactive mode — re-run interactively to remove it, ' +\n 'or delete/gate it manually.',\n );\n\n return;\n }\n\n const shouldRemove = await consola.prompt(\n 'Catalyst found core/instrumentation.ts, which is incompatible with the Cloudflare Workers ' +\n 'bundle when it uses @vercel/otel (causes \"Failed to prepare server\" at cold start). ' +\n 'Remove it and drop @vercel/otel from core/package.json?',\n { type: 'confirm', initial: true },\n );\n\n consola.log('');\n\n if (!shouldRemove) {\n consola.info(\n 'Leaving core/instrumentation.ts in place. The Cloudflare worker will continue to log ' +\n '\"Failed to prepare server\" at cold start until this is resolved manually.',\n );\n\n return;\n }\n\n unlinkSync(instrumentationPath);\n consola.info('Removed core/instrumentation.ts (incompatible with Cloudflare Workers).');\n\n const corePackageJsonPath = join(projectDir, 'core', 'package.json');\n\n if (existsSync(corePackageJsonPath)) {\n const pkg = corePackageJsonSchema.parse(JSON.parse(readFileSync(corePackageJsonPath, 'utf-8')));\n\n if (pkg.dependencies && '@vercel/otel' in pkg.dependencies) {\n const { '@vercel/otel': _removedVercelOtel, ...preservedDeps } = pkg.dependencies;\n\n pkg.dependencies = preservedDeps;\n writeJson(corePackageJsonPath, sortPackageJsonFields(pkg));\n consola.info('Dropped @vercel/otel from core/package.json.');\n }\n }\n};\n\nexport const setupCommerceHosting = async ({\n projectDir,\n projectUuid,\n storeHash,\n accessToken,\n}: {\n projectDir: string;\n projectUuid: string;\n storeHash?: string;\n accessToken?: string;\n}) => {\n await cleanupCloudflareIncompatibilities(projectDir);\n\n const corePackageJsonPath = join(projectDir, 'core', 'package.json');\n const pkg = corePackageJsonSchema.parse(JSON.parse(readFileSync(corePackageJsonPath, 'utf-8')));\n\n pkg.dependencies = {\n ...pkg.dependencies,\n '@opennextjs/cloudflare': OPENNEXT_CLOUDFLARE_VERSION,\n };\n\n writeJson(corePackageJsonPath, sortPackageJsonFields(pkg));\n\n const projectJson: Record<string, string> = {\n projectUuid,\n framework: 'catalyst',\n };\n\n if (storeHash) projectJson.storeHash = storeHash;\n if (accessToken) projectJson.accessToken = accessToken;\n\n writeJson(join(projectDir, 'core', '.bigcommerce', 'project.json'), projectJson);\n\n symlinkRootEnvToCore(projectDir);\n convertProxyToMiddleware(projectDir);\n};\n\ninterface CommerceHostingApiContext {\n storeHash: string;\n accessToken: string;\n apiHost: string;\n}\n\n// Thrown by `selectOrCreateInfrastructureProject` when the user declines the\n// \"Would you like to create one?\" prompt that surfaces when no projects exist.\n// Callers translate this into a context-appropriate error (e.g. \"Cannot deploy\n// without being linked to a project\").\nexport class NoLinkedProjectError extends Error {\n constructor() {\n super('No infrastructure project linked: user declined to create one.');\n this.name = 'NoLinkedProjectError';\n }\n}\n\nasync function promptForNewProjectName(api: CommerceHostingApiContext): Promise<ProjectListItem> {\n const newProjectName = await consola.prompt('Enter a name for the new project:', {\n type: 'text',\n });\n\n const data = await createProject(\n String(newProjectName),\n api.storeHash,\n api.accessToken,\n api.apiHost,\n );\n\n consola.success(`Project \"${data.name}\" created successfully.`);\n\n // Newly created — provisioning is async, hostnames not registered yet.\n return { uuid: data.uuid, name: data.name, deployment_hostnames: [] };\n}\n\n// Generic \"select an existing project, or create a new one\" prompt — used by\n// `catalyst project link` and by `catalyst deploy` when its linked project is\n// missing. Distinct from `promptForCommerceHostingProject` which has\n// default-name + auto-create semantics tailored to `catalyst create`.\n//\n// Pass `linkedProjectUuid` to decorate the matching project's label with\n// `[linked]` so the user can see which one is the current selection.\nexport async function selectOrCreateInfrastructureProject(\n api: CommerceHostingApiContext,\n linkedProjectUuid?: string,\n): Promise<ProjectListItem> {\n consola.start('Fetching projects...');\n\n const existingProjects = await fetchProjects(api.storeHash, api.accessToken, api.apiHost);\n\n consola.success('Projects fetched.');\n\n // No existing projects on the store — skip the select prompt and offer\n // creation directly. Declining means we have nothing to link to.\n if (existingProjects.length === 0) {\n const shouldCreate = await consola.prompt(\n 'There are not any hosting projects that you can link to yet. Would you like to create one?',\n { type: 'confirm', initial: true },\n );\n\n if (!shouldCreate) {\n throw new NoLinkedProjectError();\n }\n\n return promptForNewProjectName(api);\n }\n\n const promptOptions = [\n ...existingProjects.map((p) => ({\n label: p.uuid === linkedProjectUuid ? `${p.name} ${colorize('green', '[linked]')}` : p.name,\n value: p.uuid,\n hint: p.uuid,\n })),\n {\n label: 'Create a new project',\n value: 'create',\n hint: 'Create a new hosting project for this Catalyst storefront.',\n },\n ];\n\n const selected = await consola.prompt(\n 'Select a project or create a new project (Press <enter> to select).',\n { type: 'select', options: promptOptions, cancel: 'reject' },\n );\n\n if (selected === 'create') {\n return promptForNewProjectName(api);\n }\n\n const matched = existingProjects.find((p) => p.uuid === selected);\n\n if (!matched) {\n throw new Error(`Selected project ${String(selected)} not found in fetched list.`);\n }\n\n return matched;\n}\n\nexport async function promptForCommerceHostingProject(\n api: CommerceHostingApiContext,\n defaultName: string,\n autoUseDefaultName?: boolean,\n useExistingOnCollision?: boolean,\n): Promise<ProjectListItem> {\n const existingProjects = await fetchProjects(api.storeHash, api.accessToken, api.apiHost);\n const takenNames = existingProjects.map((project) => project.name);\n\n if (autoUseDefaultName) {\n return autoCreateCommerceHostingProject(\n api,\n defaultName,\n existingProjects,\n useExistingOnCollision,\n );\n }\n\n const conflict = existingProjects.find(\n (project) => project.name.toLowerCase() === defaultName.toLowerCase(),\n );\n\n if (!conflict) {\n return autoCreateCommerceHostingProject(\n api,\n defaultName,\n existingProjects,\n useExistingOnCollision,\n );\n }\n\n type Action = 'use-named' | 'select-from-list' | 'create';\n\n const hasOtherProjects = existingProjects.length > 1;\n\n const choices: Array<{ name: string; value: Action }> = [\n { name: `Use \"${conflict.name}\"`, value: 'use-named' },\n ];\n\n if (hasOtherProjects) {\n choices.push({ name: 'Select from my projects', value: 'select-from-list' });\n }\n\n choices.push({ name: 'Create a new project', value: 'create' });\n\n const action = await select<Action>({\n message: hasOtherProjects\n ? `It looks like you already have an existing Commerce Hosting project named \"${conflict.name}\". Would you like to use it, select from your projects, or create a new one?`\n : `It looks like you already have an existing Commerce Hosting project named \"${conflict.name}\". Would you like to use it, or create a new one?`,\n choices,\n });\n\n if (action === 'use-named') {\n consola.success(`Using existing Commerce Hosting project \"${conflict.name}\"`);\n\n return conflict;\n }\n\n if (action === 'create') {\n return promptAndCreateCommerceHostingProject(api, takenNames, defaultName);\n }\n\n const selected = await select<ProjectListItem | 'create-new'>({\n message: 'Which Commerce Hosting project would you like to use?',\n choices: [\n ...existingProjects.map((project) => ({\n name: project.name,\n value: project,\n description: project.uuid,\n })),\n new Separator(),\n { name: 'Create a new project', value: 'create-new' as const },\n ],\n });\n\n if (selected === 'create-new') {\n return promptAndCreateCommerceHostingProject(api, takenNames, defaultName);\n }\n\n consola.success(`Using existing Commerce Hosting project \"${selected.name}\"`);\n\n return selected;\n}\n\nexport async function promptAndCreateCommerceHostingProject(\n api: CommerceHostingApiContext,\n takenNames: readonly string[],\n defaultName?: string,\n): Promise<ProjectListItem> {\n const projectName = await input({\n message: 'What would you like to name your Commerce Hosting project?',\n default: defaultName,\n validate: (value) => {\n const trimmed = value.trim();\n\n if (!trimmed) return 'Project name is required';\n\n const conflict = takenNames.find((taken) => taken.toLowerCase() === trimmed.toLowerCase());\n\n if (conflict) {\n return `A Commerce Hosting project named \"${conflict}\" already exists`;\n }\n\n return true;\n },\n theme: {\n style: {\n help: () =>\n colorize(\n 'dim',\n '(The project that hosts your storefront on Commerce — often matches your folder name.)',\n ),\n },\n },\n });\n\n try {\n const created = await createProject(\n projectName.trim(),\n api.storeHash,\n api.accessToken,\n api.apiHost,\n );\n\n consola.success(`Commerce Hosting project \"${created.name}\" created successfully`);\n\n return { uuid: created.uuid, name: created.name, deployment_hostnames: [] };\n } catch (error) {\n if (error instanceof InfrastructureProjectValidationError) {\n consola.error(error.message);\n\n return promptAndCreateCommerceHostingProject(api, takenNames, defaultName);\n }\n\n throw error;\n }\n}\n\nasync function resolveCollisionChoice(\n existingName: string,\n useExistingOnCollision: boolean | undefined,\n): Promise<boolean> {\n if (useExistingOnCollision === true) return true;\n\n if (!process.stdin.isTTY) return false;\n\n return select<boolean>({\n message: `A Commerce Hosting project named \"${existingName}\" already exists. Use the existing project?`,\n choices: [\n { name: 'Yes', value: true },\n { name: 'No', value: false },\n ],\n });\n}\n\nasync function autoCreateCommerceHostingProject(\n api: CommerceHostingApiContext,\n name: string,\n existingProjects: readonly ProjectListItem[],\n useExistingOnCollision?: boolean,\n): Promise<ProjectListItem> {\n const existing = existingProjects.find(\n (project) => project.name.toLowerCase() === name.toLowerCase(),\n );\n\n if (existing) {\n const shouldUseExisting = await resolveCollisionChoice(existing.name, useExistingOnCollision);\n\n if (shouldUseExisting) {\n consola.success(`Using existing Commerce Hosting project \"${existing.name}\"`);\n\n return existing;\n }\n\n consola.error(\n 'Not reusing the existing project. Re-run with a different --project-name, or pass --use-existing to reuse it.',\n );\n process.exit(1);\n }\n\n try {\n const created = await createProject(name, api.storeHash, api.accessToken, api.apiHost);\n\n consola.success(`Commerce Hosting project \"${created.name}\" created successfully`);\n\n return { uuid: created.uuid, name: created.name, deployment_hostnames: [] };\n } catch (error) {\n if (error instanceof InfrastructureProjectValidationError) {\n consola.error(\n `Failed to create Commerce Hosting project \"${name}\": ${error.message}\\nRe-run with a different --project-name.`,\n );\n process.exit(1);\n }\n\n throw error;\n }\n}\n\n// Orchestrates prompt + file mutations. Callable from `catalyst create --hosting commerce`\n// (eager) and `catalyst deploy` (lazy). Idempotent — safe to re-run.\nexport async function runCommerceHostingSetup({\n api,\n projectDir,\n defaultProjectName,\n autoUseProjectName,\n useExistingOnCollision,\n}: {\n api: CommerceHostingApiContext;\n projectDir: string;\n defaultProjectName: string;\n autoUseProjectName?: boolean;\n useExistingOnCollision?: boolean;\n}): Promise<ProjectListItem> {\n const project = await promptForCommerceHostingProject(\n api,\n defaultProjectName,\n autoUseProjectName,\n useExistingOnCollision,\n );\n\n await setupCommerceHosting({\n projectDir,\n projectUuid: project.uuid,\n storeHash: api.storeHash,\n accessToken: api.accessToken,\n });\n\n return project;\n}\n","// Canonical order for top-level fields in core/package.json. Anything not in\n// this list is appended afterwards in its original position relative to other\n// unknown keys, so we don't drop or reshuffle uncommon fields like `keywords`.\nconst FIELD_ORDER = [\n 'name',\n 'description',\n 'version',\n 'private',\n 'engines',\n 'scripts',\n 'dependencies',\n 'devDependencies',\n] as const;\n\nexport function sortPackageJsonFields<T extends Record<string, unknown>>(pkg: T): T {\n const ordered: Record<string, unknown> = {};\n\n FIELD_ORDER.forEach((field) => {\n if (field in pkg) {\n ordered[field] = pkg[field];\n }\n });\n\n Object.keys(pkg).forEach((key) => {\n if (!(key in ordered)) {\n ordered[key] = pkg[key];\n }\n });\n\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return ordered as T;\n}\n","import { type Channel, fetchAvailableChannels, updateChannelSiteUrl } from './channels';\nimport { selectOrCreateInfrastructureProject } from './commerce-hosting';\nimport { consola } from './logger';\nimport { fetchProjects, type ProjectListItem } from './project';\n\nexport interface ChannelSiteFlowOptions {\n storeHash: string;\n accessToken: string;\n apiHost: string;\n // Linked project UUID (from --project-uuid or .bigcommerce/project.json). When\n // present and resolvable, skips the project picker; otherwise falls back to\n // `selectOrCreateInfrastructureProject`, which may throw NoLinkedProjectError\n // (caller decides how to surface it).\n projectUuid?: string;\n // Non-interactive overrides. When supplied, the corresponding prompt is\n // skipped.\n channelId?: number;\n hostname?: string;\n // When set, this hostname is pre-selected in the hostname prompt. Used by\n // `catalyst deploy --update-site-url` to default to the freshly-deployed\n // hostname.\n preferHostname?: string;\n}\n\nasync function resolveProject(options: ChannelSiteFlowOptions): Promise<ProjectListItem> {\n const api = {\n storeHash: options.storeHash,\n accessToken: options.accessToken,\n apiHost: options.apiHost,\n };\n\n if (options.projectUuid) {\n const projects = await fetchProjects(api.storeHash, api.accessToken, api.apiHost);\n const matched = projects.find((p) => p.uuid === options.projectUuid);\n\n if (matched) return matched;\n\n consola.warn(\n `Project ${options.projectUuid} not found on this store. Pick another to continue.`,\n );\n }\n\n return selectOrCreateInfrastructureProject(api, options.projectUuid);\n}\n\nasync function resolveChannel(\n options: ChannelSiteFlowOptions,\n): Promise<{ id: number; name?: string }> {\n if (options.channelId !== undefined) {\n return { id: options.channelId };\n }\n\n consola.start('Fetching channels...');\n\n const channels = await fetchAvailableChannels(\n options.storeHash,\n options.accessToken,\n options.apiHost,\n );\n\n consola.success('Channels fetched.');\n\n // Only Catalyst-platform channels can meaningfully be pointed at a Catalyst\n // deployment hostname; other storefront platforms (Stencil, etc.) are\n // filtered out so the picker stays focused.\n const catalystChannels = channels.filter((c: Channel) => c.platform === 'catalyst');\n\n if (catalystChannels.length === 0) {\n throw new Error(\n 'No Catalyst channels found on this store. Create one with `catalyst create` and try again.',\n );\n }\n\n const selectedId = await consola.prompt('Select the channel to update.', {\n type: 'select',\n options: catalystChannels.map((c: Channel) => ({\n label: c.name,\n value: String(c.id),\n hint: `id: ${c.id}`,\n })),\n cancel: 'reject',\n });\n\n const id = Number(selectedId);\n const matched = catalystChannels.find((c) => c.id === id);\n\n return { id, name: matched?.name };\n}\n\nasync function resolveHostname(\n project: ProjectListItem,\n options: ChannelSiteFlowOptions,\n): Promise<string> {\n if (options.hostname) {\n return options.hostname;\n }\n\n if (project.deployment_hostnames.length === 0) {\n throw new Error(\n `Project \"${project.name}\" has no deployment hostnames yet. Run \\`catalyst deploy\\` first to create one.`,\n );\n }\n\n // When the caller knows which hostname they want surfaced first (e.g. the\n // freshly-deployed one from `catalyst deploy --update-site-url`), order it to\n // the top of the list so it's the default selection.\n const ordered = options.preferHostname\n ? [\n ...project.deployment_hostnames.filter((h) => h === options.preferHostname),\n ...project.deployment_hostnames.filter((h) => h !== options.preferHostname),\n ]\n : project.deployment_hostnames;\n\n const selected = await consola.prompt('Select the hostname to point the channel at.', {\n type: 'select',\n options: ordered.map((h) => ({ label: h, value: h })),\n cancel: 'reject',\n });\n\n return String(selected);\n}\n\nexport async function runChannelSiteUrlFlow(options: ChannelSiteFlowOptions): Promise<void> {\n const project = await resolveProject(options);\n const channel = await resolveChannel(options);\n const hostname = await resolveHostname(project, options);\n const siteUrl = hostname.startsWith('https://') ? hostname : `https://${hostname}`;\n\n await updateChannelSiteUrl(\n channel.id,\n siteUrl,\n options.storeHash,\n options.accessToken,\n options.apiHost,\n );\n\n const channelLabel = channel.name ? `\"${channel.name}\" (${channel.id})` : String(channel.id);\n\n consola.success(`Updated channel ${channelLabel} site URL to ${siteUrl}.`);\n}\n","import Conf from 'conf';\n\nimport { consola } from './logger';\nimport { ProjectConfigSchema } from './project-config';\n\nexport function resolveCredentials(\n options: { storeHash?: string; accessToken?: string },\n config: Conf<ProjectConfigSchema>,\n): { storeHash: string; accessToken: string } {\n const storeHash = options.storeHash ?? config.get('storeHash');\n const accessToken = options.accessToken ?? config.get('accessToken');\n\n if (!storeHash || !accessToken) {\n consola.error('Missing credentials.');\n consola.info(\n 'Run `catalyst auth login`, or provide --store-hash and --access-token flags (or set CATALYST_STORE_HASH and CATALYST_ACCESS_TOKEN environment variables).',\n );\n process.exit(1);\n\n // Unreachable in production; prevents continuation when process.exit is mocked in tests.\n throw new Error('Missing credentials');\n }\n\n return { storeHash, accessToken };\n}\n","import { Command, InvalidArgumentError, Option } from '@commander-js/extra-typings';\nimport { input, select } from '@inquirer/prompts';\nimport { execSync } from 'child_process';\nimport { colorize } from 'consola/utils';\nimport { pathExistsSync } from 'fs-extra/esm';\nimport kebabCase from 'lodash.kebabcase';\nimport { join } from 'path';\n\nimport { DEFAULT_LOGIN_URL } from '../lib/auth';\nimport { buildWorkspacePackages } from '../lib/build-workspace-packages';\nimport {\n checkChannelEligibility,\n createChannel,\n fetchAvailableChannels,\n getChannelInit,\n} from '../lib/channels';\nimport { cloneCatalyst } from '../lib/clone-catalyst';\nimport { promptForCommerceHostingProject, setupCommerceHosting } from '../lib/commerce-hosting';\nimport { installDependencies } from '../lib/install-dependencies';\nimport { getAvailableLocales } from '../lib/localization';\nimport { consola } from '../lib/logger';\nimport { login, LoginAbortedError } from '../lib/login';\nimport { hasProjectsAccess, type ProjectListItem } from '../lib/project';\nimport { setupCoreProject } from '../lib/setup-core-project';\nimport { accessTokenOption, storeHashOption } from '../lib/shared-options';\nimport { getTelemetry } from '../lib/telemetry';\nimport { writeEnv } from '../lib/write-env';\n\nfunction getPlatformCheckCommand(command: string): string {\n const isWindows = process.platform === 'win32';\n\n return isWindows ? `where.exe ${command}` : `which ${command}`;\n}\n\nfunction parseChannelId(value: string): number {\n const parsed = parseInt(value, 10);\n\n if (Number.isNaN(parsed)) {\n throw new InvalidArgumentError(`\"${value}\" is not a valid channel ID (expected a number).`);\n }\n\n return parsed;\n}\n\n// Variadic argParser: called once per `--env KEY=VALUE`, accumulating into a\n// merged record. Splits on the first `=` so values containing `=` are preserved.\nfunction parseEnvFlag(\n value: string,\n previous: Record<string, string> = {},\n): Record<string, string> {\n const eqIdx = value.indexOf('=');\n\n if (eqIdx <= 0) {\n throw new InvalidArgumentError(`Expected KEY=VALUE, got \"${value}\".`);\n }\n\n const key = value.substring(0, eqIdx);\n const val = value.substring(eqIdx + 1);\n\n if (!val) {\n throw new InvalidArgumentError(`Expected KEY=VALUE with non-empty value, got \"${value}\".`);\n }\n\n return { ...previous, [key]: val };\n}\n\nasync function handleChannelCreation(\n storeHash: string,\n accessToken: string,\n apiHost: string,\n cliApiOrigin: string,\n) {\n const newChannelName = await input({\n message: 'What would you like to name your new channel?',\n });\n\n const availableLocales = await getAvailableLocales(storeHash, accessToken, apiHost);\n\n const storefrontLocale = await select({\n message: 'Which default language would you like to set for your channel?',\n default: 'en',\n choices: availableLocales,\n theme: {\n style: {\n help: () => colorize('dim', '(Select locale from the list or start typing the name)'),\n },\n },\n });\n\n const shouldAddAdditionalLocales = await select({\n message: 'Would you like to add additional languages?',\n choices: [\n { name: 'Yes', value: true },\n { name: 'No', value: false },\n ],\n });\n\n let additionalLocales: string[] = [];\n\n if (shouldAddAdditionalLocales) {\n const localeOptions = availableLocales\n .filter(({ value }) => value !== storefrontLocale)\n .map(({ name, value }) => ({ label: name, value, hint: value }));\n\n // consola's multiselect returns the value strings at runtime, but its typed\n // return is loose (the whole option array). Recursion + cast avoids the\n // no-await-in-loop / no-constant-condition lint hits and re-prompts on overflow.\n const pickLocales = async (): Promise<string[]> => {\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n const selected = (await consola.prompt(\n 'Which additional languages would you like to add to your channel?',\n { type: 'multiselect', options: localeOptions, cancel: 'reject' },\n )) as unknown as string[];\n\n if (selected.length > 4) {\n consola.warn('You can only select up to 4 additional languages. Please try again.');\n\n return pickLocales();\n }\n\n return selected;\n };\n\n additionalLocales = await pickLocales();\n }\n\n const shouldInstallSampleData = await select({\n message: 'Would you like to install sample data?',\n choices: [\n { name: 'Yes', value: true },\n { name: 'No', value: false },\n ],\n });\n\n return createChannel(\n newChannelName,\n storefrontLocale,\n additionalLocales,\n shouldInstallSampleData,\n storeHash,\n accessToken,\n cliApiOrigin,\n );\n}\n\nasync function handleChannelSelection(storeHash: string, accessToken: string, apiHost: string) {\n const channelSortOrder = ['catalyst', 'next', 'bigcommerce'];\n const channels = await fetchAvailableChannels(storeHash, accessToken, apiHost);\n\n const existingChannel = await select({\n message: 'Which channel would you like to use?',\n choices: channels\n .sort((a, b) => {\n const aIndex = channelSortOrder.indexOf(a.platform);\n const bIndex = channelSortOrder.indexOf(b.platform);\n\n if (aIndex === -1 && bIndex === -1) {\n return 0;\n }\n\n if (aIndex === -1) return 1;\n if (bIndex === -1) return -1;\n\n return aIndex - bIndex;\n })\n .map((ch) => ({\n name: ch.name,\n value: ch,\n description: `Channel Platform: ${\n ch.platform === 'bigcommerce'\n ? 'Stencil'\n : ch.platform.charAt(0).toUpperCase() + ch.platform.slice(1)\n }`,\n })),\n });\n\n return existingChannel.id;\n}\n\nasync function setupProject(options: {\n projectName?: string;\n projectDir: string;\n}): Promise<{ projectName: string; projectDir: string }> {\n let { projectName, projectDir } = options;\n\n if (!pathExistsSync(projectDir)) {\n consola.error(`--project-dir ${projectDir} is not a valid path`);\n process.exit(1);\n }\n\n if (projectName) {\n projectName = kebabCase(projectName);\n projectDir = join(options.projectDir, projectName);\n\n if (pathExistsSync(projectDir)) {\n consola.error(`${projectDir} already exists`);\n process.exit(1);\n }\n }\n\n if (!projectName) {\n const validateProjectName = (i: string) => {\n const formatted = kebabCase(i);\n\n if (!formatted) return 'Project name is required';\n\n const targetDir = join(options.projectDir, formatted);\n\n if (pathExistsSync(targetDir)) return `Destination '${targetDir}' already exists`;\n\n projectName = formatted;\n projectDir = targetDir;\n\n return true;\n };\n\n await input({\n message: 'What do you want to name your project directory?',\n default: 'my-catalyst-app',\n validate: validateProjectName,\n });\n }\n\n if (!projectName) throw new Error('Something went wrong, projectName is not defined');\n if (!projectDir) throw new Error('Something went wrong, projectDir is not defined');\n\n return { projectName, projectDir };\n}\n\nfunction checkRequiredTools() {\n try {\n execSync(getPlatformCheckCommand('git'), { stdio: 'ignore' });\n } catch {\n consola.error('git is required to create a Catalyst project');\n process.exit(1);\n }\n\n try {\n execSync(getPlatformCheckCommand('pnpm'), { stdio: 'ignore' });\n } catch {\n consola.error(\n 'pnpm is required to create a Catalyst project. Enable it by running `corepack enable pnpm`.',\n );\n process.exit(1);\n }\n}\n\nexport const create = new Command('create')\n .configureHelp({ showGlobalOptions: true })\n .description('Scaffold and connect a Catalyst storefront to your BigCommerce store.')\n .addHelpText(\n 'after',\n `\nExamples:\n # Interactive scaffold (default — self-hosted, no hosting prompt)\n $ catalyst create\n\n # Non-interactive: skip the project-name prompt\n $ catalyst create --project-name my-store\n\n # Eagerly set up Commerce Hosting at create time\n $ catalyst create --project-name my-store --hosting commerce`,\n )\n .option('--project-name <name>', 'Name of your Catalyst project')\n .option('--project-dir <dir>', 'Directory in which to create your project', process.cwd())\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .option('--channel-id <id>', 'BigCommerce channel ID', parseChannelId)\n .option('--storefront-token <token>', 'BigCommerce storefront token')\n .option(\n '--gh-ref <ref>',\n 'Clone a specific ref from the source repository',\n '@bigcommerce/catalyst-core@latest',\n )\n .option('--reset-main', 'Reset the main branch to the gh-ref')\n .option('--repository <repository>', 'GitHub repository to clone from', 'bigcommerce/catalyst')\n .option(\n '--env <vars...>',\n 'Arbitrary environment variables to set in .env.local. Format: KEY=VALUE (repeatable).',\n parseEnvFlag,\n )\n .addOption(\n new Option(\n '--hosting <mode>',\n 'Hosting mode: \"self-hosted\" (default) or \"commerce\" to set up Commerce Hosting at create time. When omitted, scaffolding is hosting-agnostic; run `catalyst deploy` later to opt in.',\n ).choices(['self-hosted', 'commerce'] as const),\n )\n .option(\n '--use-existing',\n 'Only used with --hosting commerce and --project-name. When the named project already exists on the store, reuse it instead of prompting. Has no effect without --hosting commerce.',\n )\n .addOption(\n new Option('--bigcommerce-hostname <hostname>', 'BigCommerce hostname')\n .default('bigcommerce.com')\n .hideHelp(),\n )\n .addOption(\n new Option('--login-url <url>', 'BigCommerce login URL.')\n .env('BIGCOMMERCE_LOGIN_URL')\n .default(DEFAULT_LOGIN_URL)\n .hideHelp(),\n )\n .addOption(\n new Option('--cli-api-origin <origin>', 'Catalyst CLI API origin')\n .default('https://cxm-prd.bigcommerceapp.com')\n .hideHelp(),\n )\n // eslint-disable-next-line complexity\n .action(async (options) => {\n const { ghRef, repository } = options;\n\n if (options.useExisting && options.hosting !== 'commerce') {\n consola.warn('--use-existing has no effect without --hosting commerce. Ignoring.');\n }\n\n checkRequiredTools();\n\n const { projectName, projectDir } = await setupProject({\n projectName: options.projectName,\n projectDir: options.projectDir,\n });\n\n let storeHash = options.storeHash;\n let accessToken = options.accessToken;\n let channelId = options.channelId;\n let storefrontToken = options.storefrontToken;\n\n let envVars: Record<string, string> = {};\n\n // Always require store creds. `--channel-id` + `--storefront-token` aren't\n // enough on their own — the storefront also needs BIGCOMMERCE_STORE_HASH at\n // runtime, and downstream catalyst commands (deploy, project, ...) need an\n // access token. Device login covers the missing pieces; the user picks the\n // store during the OAuth flow regardless of any partial flags they passed.\n if (!storeHash || !accessToken) {\n const apiHost = `api.${options.bigcommerceHostname}`;\n\n try {\n const credentials = await login(options.loginUrl, apiHost);\n\n storeHash = credentials.storeHash;\n accessToken = credentials.accessToken;\n } catch (error) {\n if (error instanceof LoginAbortedError) {\n consola.info(\n 'Login aborted. Re-run `catalyst create` when you have your credentials ready.',\n );\n process.exit(0);\n\n return;\n }\n\n throw error;\n }\n }\n\n const useCommerceHosting = options.hosting === 'commerce';\n\n await getTelemetry().identify(storeHash);\n\n // Seed env vars from local state when all three were flag-provided. Channel\n // resolution below overwrites this wholesale via `envVars = { ...initData.envVars }`,\n // which is fine — that path means the user wanted us to fetch fresh values.\n if (storeHash && channelId && storefrontToken) {\n envVars.BIGCOMMERCE_STORE_HASH = storeHash;\n envVars.BIGCOMMERCE_CHANNEL_ID = channelId.toString();\n envVars.BIGCOMMERCE_STOREFRONT_TOKEN = storefrontToken;\n }\n\n // Resolve channel only when we have creds and are missing channel info.\n if (storeHash && accessToken && (!channelId || !storefrontToken)) {\n const apiHost = `api.${options.bigcommerceHostname}`;\n const cliApiOrigin = options.cliApiOrigin;\n\n if (channelId && !storefrontToken) {\n const initData = await getChannelInit(channelId, storeHash, accessToken, cliApiOrigin);\n\n envVars = { ...initData.envVars };\n storefrontToken = initData.storefrontToken;\n } else if (!channelId) {\n const eligibility = await checkChannelEligibility(storeHash, accessToken, cliApiOrigin);\n\n if (!eligibility.eligible) {\n consola.warn(eligibility.message);\n }\n\n let shouldCreateChannel;\n\n if (eligibility.eligible) {\n shouldCreateChannel = await select({\n message: 'Would you like to create a new channel?',\n choices: [\n { name: 'Yes', value: true },\n { name: 'No', value: false },\n ],\n });\n }\n\n if (shouldCreateChannel) {\n const channelData = await handleChannelCreation(\n storeHash,\n accessToken,\n apiHost,\n cliApiOrigin,\n );\n\n channelId = channelData.channelId;\n storefrontToken = channelData.storefrontToken;\n envVars = { ...channelData.envVars };\n\n consola.success('Channel created successfully.');\n consola.warn(\n 'A preview storefront has been deployed in your BigCommerce control panel. This preview may look different from your local environment as it may be running different code. Additionally, it may take a few minutes for the channel storefront to be accessible.',\n );\n }\n\n if (!shouldCreateChannel) {\n channelId = await handleChannelSelection(storeHash, accessToken, apiHost);\n\n const initData = await getChannelInit(channelId, storeHash, accessToken, cliApiOrigin);\n\n envVars = { ...initData.envVars };\n storefrontToken = initData.storefrontToken;\n }\n }\n }\n\n if (options.env) {\n Object.assign(envVars, options.env);\n }\n\n if (options.storeHash) envVars.BIGCOMMERCE_STORE_HASH = options.storeHash;\n if (options.channelId) envVars.BIGCOMMERCE_CHANNEL_ID = options.channelId.toString();\n if (options.storefrontToken) envVars.BIGCOMMERCE_STOREFRONT_TOKEN = options.storefrontToken;\n\n if (useCommerceHosting && accessToken) {\n envVars.BIGCOMMERCE_ACCESS_TOKEN = accessToken;\n }\n\n // Pre-populate CATALYST_ACCESS_TOKEN so subsequent catalyst CLI commands\n // (`catalyst deploy`, `catalyst project ...`, etc.) work without re-auth.\n // CATALYST_STORE_HASH isn't written — the CLI falls back to BIGCOMMERCE_STORE_HASH\n // (already in envVars from the channel init response) at startup.\n if (accessToken) envVars.CATALYST_ACCESS_TOKEN = accessToken;\n\n // Resolve the Commerce Hosting project before cloning so credential checks\n // and prompts happen up-front. We defer the file mutations\n // (`setupCommerceHosting`) until after the clone.\n let commerceHostingProject: ProjectListItem | undefined;\n\n if (useCommerceHosting && storeHash && accessToken) {\n const apiHost = `api.${options.bigcommerceHostname}`;\n const hasAccess = await hasProjectsAccess(storeHash, accessToken, apiHost);\n\n if (!hasAccess) {\n consola.error(\n 'This store does not have access to the Infrastructure Projects API. Contact support@bigcommerce.com to enable it.',\n );\n process.exit(1);\n }\n\n commerceHostingProject = await promptForCommerceHostingProject(\n { storeHash, accessToken, apiHost },\n projectName,\n !!options.projectName,\n options.useExisting,\n );\n }\n\n consola.info(`Creating '${projectName}' at '${projectDir}'`);\n\n // Anything that mutates `projectDir` runs inside this block. If a step\n // fails, the directory is likely partially populated — surface that to the\n // user so they can clean up before retrying. We don't auto-delete because\n // they may want to inspect the partial state first.\n try {\n cloneCatalyst({ repository, projectName, projectDir, ghRef, resetMain: options.resetMain });\n setupCoreProject(projectDir);\n\n if (useCommerceHosting && commerceHostingProject && storeHash && accessToken) {\n await setupCommerceHosting({\n projectDir,\n projectUuid: commerceHostingProject.uuid,\n storeHash,\n accessToken,\n });\n }\n\n // Write env before install/build — keeps env vars available to any future\n // workspace build script that might read them, and matters today for\n // postinstall scripts that may resolve env-driven config.\n writeEnv(projectDir, envVars);\n\n await installDependencies(projectDir);\n buildWorkspacePackages(projectDir);\n } catch (error) {\n if (pathExistsSync(projectDir)) {\n consola.warn(\n `Setup failed before completion. '${projectDir}' may be in a partial state — review and delete it before re-running 'catalyst create'.`,\n );\n }\n\n throw error;\n }\n\n consola.success(`Created '${projectName}' at '${projectDir}'`);\n consola.info('Next steps:');\n consola.info(colorize('yellow', ` cd ${projectName}/core && pnpm run dev`));\n\n if (useCommerceHosting) {\n consola.info(\n colorize(\n 'yellow',\n ` Run 'cd ${projectName}/core && pnpm run deploy' when ready to deploy to Commerce Hosting.`,\n ),\n );\n }\n });\n","import { execSync } from 'child_process';\nimport { existsSync } from 'fs';\nimport { join } from 'path';\nimport yoctoSpinner from 'yocto-spinner';\n\nconst WORKSPACE_PACKAGES = ['packages/catalyst', 'packages/client'] as const;\n\n// Catalyst monorepo layouts ship pre-built workspace packages, but a fresh\n// clone needs them rebuilt before `core` can resolve them. Skip silently when\n// the layout doesn't match (e.g. flat repo, custom fork) so this stays a no-op\n// for non-monorepo scaffolds.\nexport const buildWorkspacePackages = (projectDir: string) => {\n const hasCore = existsSync(join(projectDir, 'core'));\n const hasAllWorkspacePackages = WORKSPACE_PACKAGES.every((pkg) =>\n existsSync(join(projectDir, pkg)),\n );\n\n if (!hasCore || !hasAllWorkspacePackages) return;\n\n WORKSPACE_PACKAGES.forEach((pkg) => {\n const spinner = yoctoSpinner().start(`Building ${pkg}...`);\n\n try {\n execSync('pnpm build', { cwd: join(projectDir, pkg), stdio: 'ignore' });\n spinner.success(`Built ${pkg}.`);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'unknown error';\n\n spinner.error(`Failed to build ${pkg}: ${message}`);\n throw error;\n }\n });\n};\n","import { execSync } from 'child_process';\n\nimport { checkoutRef } from './checkout-ref';\nimport { hasGitHubSSH } from './has-github-ssh';\nimport { consola } from './logger';\nimport { resetBranchToRef } from './reset-branch-to-ref';\n\nexport const cloneCatalyst = ({\n repository,\n projectName,\n projectDir,\n ghRef,\n resetMain = false,\n}: {\n repository: string;\n projectName: string;\n projectDir: string;\n ghRef?: string;\n resetMain?: boolean;\n}) => {\n const useSSH = hasGitHubSSH();\n\n consola.info(`Cloning ${repository} using ${useSSH ? 'SSH' : 'HTTPS'}...`);\n\n const cloneCommand = `git clone ${\n useSSH ? `git@github.com:${repository}` : `https://github.com/${repository}`\n }.git${projectName ? ` ${projectName}` : ''}`;\n\n execSync(cloneCommand, { stdio: 'inherit' });\n\n execSync('git remote rename origin upstream', { cwd: projectDir, stdio: 'inherit' });\n\n if (ghRef) {\n if (resetMain) {\n execSync('git checkout -b main', { cwd: projectDir, stdio: 'inherit' });\n\n resetBranchToRef(projectDir, ghRef);\n\n consola.success(`Reset main to ${ghRef} successfully.`);\n\n return;\n }\n\n checkoutRef(projectDir, ghRef);\n }\n};\n","import { sync as spawnSync } from 'cross-spawn';\n\nimport { isExecException } from './is-exec-exception';\nimport { consola } from './logger';\n\nexport function checkoutRef(repoDir: string, ref: string): void {\n try {\n const spawn = spawnSync('git', ['checkout', ref, '--'], {\n cwd: repoDir,\n encoding: 'utf8',\n shell: false,\n });\n\n const stderr = spawn.stderr.trim();\n\n if (spawn.status !== 0 && stderr) {\n throw new Error(stderr);\n }\n\n consola.success(`Checked out ref ${ref} successfully.`);\n } catch (error: unknown) {\n if (isExecException(error)) {\n const stderr = error.stderr ? error.stderr.toString() : '';\n\n if (\n stderr.includes(`fatal: reference is not a tree: ${ref}`) ||\n stderr.includes(`fatal: ambiguous argument '${ref}'`) ||\n stderr.includes(`unknown revision or path not in the working tree`)\n ) {\n consola.error(`Ref '${ref}' not found in the repository.`);\n } else {\n consola.error(`Error checking out ref '${ref}':`, stderr.trim());\n }\n } else if (error instanceof Error) {\n consola.error(`Error checking out ref '${ref}':`, error.message);\n } else {\n consola.error(`Unknown error occurred while checking out ref '${ref}'.`);\n }\n\n consola.warn(`Falling back to the default branch.`);\n }\n}\n","import { ExecException } from 'node:child_process';\n\nexport function isExecException(error: unknown): error is ExecException {\n return typeof error === 'object' && error !== null && 'stdout' in error && 'stderr' in error;\n}\n","import { execSync } from 'child_process';\n\nimport { isExecException } from './is-exec-exception';\n\nexport function hasGitHubSSH(): boolean {\n try {\n const output = execSync('ssh -T git@github.com', {\n encoding: 'utf8',\n stdio: 'pipe',\n }).toString();\n\n return output.includes('successfully authenticated');\n } catch (error: unknown) {\n if (isExecException(error)) {\n const stdout = error.stdout ? error.stdout.toString() : '';\n const stderr = error.stderr ? error.stderr.toString() : '';\n const combinedOutput = stdout + stderr;\n\n if (combinedOutput.includes('successfully authenticated')) {\n return true;\n }\n }\n\n return false;\n }\n}\n","import { sync as spawnSync } from 'cross-spawn';\n\nexport function resetBranchToRef(projectDir: string, ghRef: string) {\n const spawn = spawnSync('git', ['reset', '--hard', ghRef, '--'], {\n cwd: projectDir,\n encoding: 'utf8',\n shell: false,\n });\n\n const stderr = spawn.stderr.trim();\n\n if (spawn.status !== 0 && stderr) {\n throw new Error(stderr);\n }\n}\n","import { installDependencies as installDeps } from 'nypm';\nimport yoctoSpinner from 'yocto-spinner';\n\nexport const installDependencies = async (projectDir: string) => {\n const spinner = yoctoSpinner().start('Installing dependencies. This could take a minute...');\n\n try {\n await installDeps({ cwd: projectDir, silent: true, packageManager: 'pnpm' });\n spinner.success('Dependencies installed successfully.');\n } catch (error) {\n const message = error instanceof Error ? error.message : 'unknown error';\n\n spinner.error(`Failed to install dependencies: ${message}`);\n throw error;\n }\n};\n","import { z } from 'zod';\n\nimport { assertAuthorized } from './auth-errors';\nimport { getTelemetry } from './telemetry';\n\nconst allowedLocales = [\n 'en',\n 'da',\n 'es-AR',\n 'es-CL',\n 'es-CO',\n 'es-MX',\n 'es-PE',\n 'es-419',\n 'es',\n 'it',\n 'nl',\n 'pl',\n 'pt',\n 'de',\n 'fr',\n 'ja',\n 'no',\n 'pt-BR',\n 'sv',\n];\n\nconst AvailableLocalesSuccessSchema = z.object({\n data: z.array(\n z.object({\n id: z.string(),\n name: z.string(),\n fallback: z.string().nullable(),\n is_supported: z.boolean(),\n }),\n ),\n});\n\nexport const getAvailableLocales = async (\n storeHash: string,\n accessToken: string,\n apiHost: string,\n) => {\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/settings/store/available-locales`,\n {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n 'X-Correlation-Id': getTelemetry().correlationId,\n Accept: 'application/json',\n },\n },\n );\n\n assertAuthorized(response);\n\n if (!response.ok) {\n throw new Error(\n `GET /v3/settings/store/available-locales failed: ${response.status} ${response.statusText}`,\n );\n }\n\n return AvailableLocalesSuccessSchema.parse(await response.json())\n .data.filter(({ id }) => allowedLocales.includes(id))\n .map(({ name, id }) => ({ name: `${name} (${id})`, value: id }));\n};\n","import { mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { z } from 'zod';\n\nimport PACKAGE_INFO from '../../../package.json';\n\nimport { sortPackageJsonFields } from './sort-package-json';\n\nconst corePackageJsonSchema = z.looseObject({\n scripts: z.record(z.string(), z.string()).optional(),\n dependencies: z.record(z.string(), z.string()).optional(),\n});\n\nconst writeJson = (path: string, value: unknown) => {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(value, null, 2)}\\n`);\n};\n\n// Wires Catalyst CLI scripts and the `@bigcommerce/catalyst` dep into a freshly\n// cloned `core/`. Always runs at create time, regardless of hosting choice —\n// `catalyst build` / `catalyst start` / `catalyst deploy` dispatch on project\n// state, so these scripts work for self-hosted projects too without rewrite.\nexport const setupCoreProject = (projectDir: string) => {\n const corePackageJsonPath = join(projectDir, 'core', 'package.json');\n const pkg = corePackageJsonSchema.parse(JSON.parse(readFileSync(corePackageJsonPath, 'utf-8')));\n\n pkg.scripts = {\n ...pkg.scripts,\n build: 'npm run generate && catalyst build',\n start: 'catalyst start',\n deploy: 'npm run generate && catalyst deploy',\n };\n\n pkg.dependencies = {\n ...pkg.dependencies,\n '@bigcommerce/catalyst': PACKAGE_INFO.version,\n };\n\n writeJson(corePackageJsonPath, sortPackageJsonFields(pkg));\n};\n","import { outputFileSync } from 'fs-extra/esm';\nimport { join } from 'path';\n\n// Writes core/.env.local — Next.js (and all the catalyst CLI commands) read env vars\n// from there, since `core/` is the package they run inside.\nexport const writeEnv = (projectDir: string, envVars: Record<string, string>) => {\n outputFileSync(\n join(projectDir, 'core', '.env.local'),\n `${Object.entries(envVars)\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n')}\\n`,\n );\n};\n","import AdmZip from 'adm-zip';\nimport { Command, Option } from 'commander';\nimport { colorize } from 'consola/utils';\nimport { access, readdir, readFile } from 'node:fs/promises';\nimport { dirname, join } from 'node:path';\nimport yoctoSpinner from 'yocto-spinner';\nimport { z } from 'zod';\n\nimport { assertAuthorized } from '../lib/auth-errors';\nimport { runChannelSiteUrlFlow } from '../lib/channel-site-flow';\nimport {\n cleanupCloudflareIncompatibilities,\n NoLinkedProjectError,\n selectOrCreateInfrastructureProject,\n setupCommerceHosting,\n} from '../lib/commerce-hosting';\nimport { getDeploymentErrorMessage } from '../lib/deployment-errors';\nimport {\n getStoredEnv,\n mergeDeploymentSecrets,\n parseEnvAssignment,\n toDeploymentSecrets,\n} from '../lib/env-config';\nimport { installDependencies } from '../lib/install-dependencies';\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\nimport { getProjectState } from '../lib/project-state';\nimport { resolveCredentials } from '../lib/resolve-credentials';\nimport {\n accessTokenOption,\n apiHostOption,\n projectUuidOption,\n storeHashOption,\n} from '../lib/shared-options';\nimport { getTelemetry } from '../lib/telemetry';\n\nimport { buildCatalystProject } from './build';\n\nconst stepsEnum = z.enum([\n 'initializing',\n 'downloading',\n 'unzipping',\n 'processing',\n 'deploying',\n 'finalizing',\n 'complete',\n]);\n\nconst STEPS: Record<z.infer<typeof stepsEnum>, string> = {\n initializing: 'Initializing...',\n downloading: 'Downloading...',\n unzipping: 'Unzipping...',\n processing: 'Processing...',\n deploying: 'Deploying...',\n finalizing: 'Finalizing...',\n complete: 'Complete',\n};\n\nconst UploadSignatureSchema = z.object({\n data: z.object({\n upload_url: z.url(),\n upload_uuid: z.string(),\n }),\n});\n\nconst CreateDeploymentSchema = z.object({\n data: z.object({\n deployment_uuid: z.uuid(),\n }),\n});\n\nconst ProjectSchema = z.object({\n data: z.array(\n z.object({\n uuid: z.uuid(),\n name: z.string(),\n }),\n ),\n});\n\nconst DeploymentStatusSchema = z.object({\n deployment_uuid: z.uuid(),\n deployment_status: z.enum(['queued', 'in_progress', 'failed', 'completed']),\n event: z\n .object({\n step: stepsEnum,\n progress: z.number(),\n })\n .nullable(),\n deployment_hostnames: z.array(z.string()).optional(),\n error: z\n .object({\n code: z.number(),\n })\n .optional(),\n});\n\nexport const generateBundleZip = async () => {\n consola.info('Generating bundle...');\n\n const bigcommerceDir = join(process.cwd(), '.bigcommerce');\n const distDir = join(process.cwd(), '.bigcommerce', 'dist');\n\n // Check if .bigcommerce/dist exists\n try {\n await access(distDir);\n } catch {\n throw new Error(`Dist directory not found: ${distDir}`);\n }\n\n // Check if .bigcommerce/dist is not empty\n const buildDirContents = await readdir(distDir);\n\n if (buildDirContents.length === 0) {\n throw new Error(`Dist directory is empty: ${distDir}`);\n }\n\n const outputZip = join(bigcommerceDir, 'bundle.zip');\n\n // Use AdmZip to create the zip\n const zip = new AdmZip();\n\n zip.addLocalFolder(distDir, 'output');\n zip.writeZip(outputZip);\n\n consola.success(`Bundle created at: ${outputZip}`);\n};\n\nexport const generateUploadSignature = async (\n storeHash: string,\n accessToken: string,\n apiHost: string,\n) => {\n consola.info('Generating upload signature...');\n\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/deployments/uploads`,\n {\n method: 'POST',\n headers: {\n 'X-Auth-Token': accessToken,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-Correlation-Id': getTelemetry().correlationId,\n },\n body: JSON.stringify({}),\n },\n );\n\n assertAuthorized(response);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch upload signature: ${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const { data } = UploadSignatureSchema.parse(res);\n\n consola.success('Upload signature generated.');\n\n return data;\n};\n\nexport const uploadBundleZip = async (uploadUrl: string) => {\n consola.info('Uploading bundle...');\n\n const zipPath = join(process.cwd(), '.bigcommerce', 'bundle.zip');\n\n // Read the zip file as a buffer\n const fileBuffer = await readFile(zipPath);\n\n const response = await fetch(uploadUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/zip',\n },\n body: fileBuffer,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to upload bundle: ${response.status} ${response.statusText}`);\n }\n\n consola.success('Bundle uploaded successfully.');\n\n return true;\n};\n\nexport const parseEnvironmentVariables = (secretOption?: string[]) => {\n return secretOption?.map((envVar) => {\n const { key, value } = parseEnvAssignment(envVar);\n\n return {\n type: 'secret' as const,\n key,\n value,\n };\n });\n};\n\nexport const createDeployment = async (\n projectUuid: string,\n uploadUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n environmentVariables?: Array<{ type: 'secret' | 'plain_text'; key: string; value: string }>,\n) => {\n consola.info('Creating deployment...');\n\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/deployments`,\n {\n method: 'POST',\n headers: {\n 'X-Auth-Token': accessToken,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-Correlation-Id': getTelemetry().correlationId,\n },\n body: JSON.stringify({\n project_uuid: projectUuid,\n upload_uuid: uploadUuid,\n environment_variables: environmentVariables,\n }),\n },\n );\n\n assertAuthorized(response);\n\n if (!response.ok) {\n throw new Error(`Failed to create deployment: ${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const { data } = CreateDeploymentSchema.parse(res);\n\n consola.success('Deployment started...');\n\n return data;\n};\n\nexport const getDeploymentStatus = async (\n deploymentUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<string | undefined> => {\n consola.info('Fetching deployment status...');\n\n const spinner = yoctoSpinner().start('Fetching...');\n\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/deployments/${deploymentUuid}/events`,\n {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n Accept: 'text/event-stream',\n Connection: 'keep-alive',\n 'X-Correlation-Id': getTelemetry().correlationId,\n },\n },\n );\n\n assertAuthorized(response);\n\n if (!response.ok) {\n throw new Error(`Failed to open event stream: ${response.status} ${response.statusText}`);\n }\n\n const reader = response.body?.getReader();\n\n if (!reader) {\n throw new Error('Failed to read event stream.');\n }\n\n const decoder = new TextDecoder();\n let done = false;\n let deploymentHostname: string | undefined;\n\n while (!done) {\n // eslint-disable-next-line no-await-in-loop\n const { value, done: streamDone } = await reader.read();\n let json: unknown;\n\n if (value) {\n const chunk = decoder.decode(value, { stream: true }).trim();\n const split = chunk\n .split('\\n\\n')\n .map((s) => s.replace('data:', '').trim())\n .filter(Boolean);\n\n // eslint-disable-next-line no-loop-func\n split.forEach((event) => {\n try {\n json = JSON.parse(event);\n } catch (error) {\n consola.warn(`Failed to parse event, dropping from stream. Event: ${event}`, error);\n\n return;\n }\n\n const data = DeploymentStatusSchema.parse(json);\n\n if (data.error) {\n throw new Error(\n `Deployment failed (error code ${data.error.code}): ${getDeploymentErrorMessage(data.error.code)}`,\n );\n }\n\n if (data.event && STEPS[data.event.step] !== spinner.text) {\n spinner.text = STEPS[data.event.step];\n }\n\n if (data.deployment_hostnames && data.deployment_hostnames.length > 0) {\n deploymentHostname = data.deployment_hostnames[0];\n }\n });\n }\n\n done = streamDone;\n }\n\n spinner.success('Deployment completed successfully.');\n\n if (deploymentHostname) {\n consola.success(\n `View your deployment at: ${colorize('blue', `https://${deploymentHostname}`)}`,\n );\n }\n\n return deploymentHostname;\n};\n\nexport const fetchProject = async (\n projectUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n) => {\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/projects`,\n {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-Correlation-Id': getTelemetry().correlationId,\n },\n },\n );\n\n assertAuthorized(response);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch projects: ${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const { data } = ProjectSchema.parse(res);\n\n return data.find((project) => project.uuid === projectUuid);\n};\n\nexport const deploy = new Command('deploy')\n .configureHelp({ showGlobalOptions: true })\n .description('Deploy your application to Cloudflare.')\n .addHelpText(\n 'after',\n `\nEnvironment variables saved with \\`catalyst env add\\` are sent automatically on every deploy.\nUse \\`--secret\\` to set or override a variable for a single run.\n\nExample:\n $ catalyst deploy --secret BIGCOMMERCE_STORE_HASH=<YOUR_STORE_HASH> --secret BIGCOMMERCE_STOREFRONT_TOKEN=<YOUR_STOREFRONT_TOKEN>`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .option(\n '--update-site-url',\n \"After a successful deploy, prompt to update a channel's site URL to the new hostname.\",\n )\n .addOption(\n new Option(\n '--secret <value>',\n 'Secret to set for this deployment (repeatable). Overrides a stored value for the same key. Format: --secret KEY=VALUE',\n ).argParser((value: string, previous: string[] = []) => {\n return previous.concat([value]);\n }),\n )\n .option('--dry-run', 'Run the command to generate the bundle without uploading or deploying.')\n .option(\n '--prebuilt',\n 'Skip the build step. Requires .bigcommerce/dist/ to already contain build output.',\n )\n .action(async (options) => {\n const config = getProjectConfig();\n const { storeHash, accessToken } = resolveCredentials(options, config);\n const telemetry = getTelemetry();\n\n await telemetry.identify(storeHash);\n\n // Resolve a *valid* projectUuid before doing any expensive build/upload\n // work. If the linked UUID no longer exists on the server (e.g. project\n // deleted out from under us), prompt the user to pick a new one rather\n // than failing mid-deploy.\n const linkedProjectUuid = options.projectUuid ?? config.get('projectUuid');\n let projectUuid: string;\n\n const promptForProject = async (): Promise<{ uuid: string; name: string }> => {\n try {\n return await selectOrCreateInfrastructureProject({\n storeHash,\n accessToken,\n apiHost: options.apiHost,\n });\n } catch (error) {\n if (error instanceof NoLinkedProjectError) {\n consola.info(\n \"When you're ready to create a project, run `catalyst project create` or re-run `catalyst deploy`.\",\n );\n process.exit(0);\n }\n\n throw error;\n }\n };\n\n if (linkedProjectUuid) {\n const existing = await fetchProject(\n linkedProjectUuid,\n storeHash,\n accessToken,\n options.apiHost,\n );\n\n if (existing) {\n projectUuid = linkedProjectUuid;\n } else {\n consola.warn(\n `The linked project (${linkedProjectUuid}) no longer exists on this store. It may have been deleted.`,\n );\n\n const selected = await promptForProject();\n\n projectUuid = selected.uuid;\n config.set('projectUuid', projectUuid);\n consola.success(`Linked project \"${selected.name}\".`);\n }\n } else {\n consola.info('No project is currently linked.');\n\n const selected = await promptForProject();\n\n projectUuid = selected.uuid;\n config.set('projectUuid', projectUuid);\n consola.success(`Linked project \"${selected.name}\".`);\n }\n\n // The OpenNext build pipeline requires the project to be transformed\n // (proxy.ts → middleware.ts, @opennextjs/cloudflare installed). Run setup\n // here so first-run `catalyst deploy` works on a fresh self-hosted scaffold\n // without forcing the user to re-run after a separate setup step.\n if (!getProjectState().isTransformed) {\n const shouldSetup = await consola.prompt(\n 'Your project is not yet set up for Commerce Hosting deployments. Would you like to run the Commerce Hosting setup now?',\n { type: 'confirm', initial: true },\n );\n\n if (!shouldSetup) {\n consola.info(\"When you're ready to deploy, re-run `catalyst deploy` to complete setup.\");\n process.exit(0);\n }\n\n const projectDir = dirname(process.cwd());\n\n await setupCommerceHosting({ projectDir, projectUuid, storeHash, accessToken });\n consola.success('Commerce Hosting setup complete.');\n\n await installDependencies(projectDir);\n } else {\n // Existing Commerce Hosting users may carry artifacts incompatible with\n // the Cloudflare worker bundle from earlier Catalyst versions\n // (`core/instrumentation.ts`, `@vercel/otel`). Sweep them on every deploy\n // so the fix lands without forcing a re-link.\n await cleanupCloudflareIncompatibilities(dirname(process.cwd()));\n }\n\n if (options.prebuilt) {\n const distDir = join(process.cwd(), '.bigcommerce', 'dist');\n\n try {\n await access(distDir);\n } catch {\n throw new Error(\n 'No build output found at .bigcommerce/dist/. Run `catalyst build` first or remove `--prebuilt` to build automatically.',\n );\n }\n\n const contents = await readdir(distDir);\n\n if (contents.length === 0) {\n throw new Error(\n 'No build output found at .bigcommerce/dist/. Run `catalyst build` first or remove `--prebuilt` to build automatically.',\n );\n }\n\n consola.info('Using existing build output (--prebuilt).');\n } else {\n await buildCatalystProject(projectUuid);\n }\n\n await generateBundleZip();\n\n if (options.dryRun) {\n consola.info('Dry run enabled — skipping upload and deployment steps.');\n consola.info('Next steps (skipped):');\n consola.info('- Generate upload signature');\n consola.info('- Upload bundle.zip');\n consola.info('- Create deployment');\n\n process.exit(0);\n }\n\n const uploadSignature = await generateUploadSignature(storeHash, accessToken, options.apiHost);\n\n await uploadBundleZip(uploadSignature.upload_url);\n\n // Merge persisted env vars (`catalyst env add`) with any inline `--secret`\n // flags. Inline flags win on conflict, letting users override a stored\n // value for a single run. Send `undefined` when there's nothing to set so\n // we preserve the prior payload shape.\n const flagSecrets = parseEnvironmentVariables(options.secret) ?? [];\n const persistedSecrets = toDeploymentSecrets(getStoredEnv(config));\n const mergedSecrets = mergeDeploymentSecrets(persistedSecrets, flagSecrets);\n const environmentVariables = mergedSecrets.length > 0 ? mergedSecrets : undefined;\n\n const { deployment_uuid: deploymentUuid } = await createDeployment(\n projectUuid,\n uploadSignature.upload_uuid,\n storeHash,\n accessToken,\n options.apiHost,\n environmentVariables,\n );\n\n const deploymentHostname = await getDeploymentStatus(\n deploymentUuid,\n storeHash,\n accessToken,\n options.apiHost,\n );\n\n if (!options.updateSiteUrl) {\n return;\n }\n\n try {\n await runChannelSiteUrlFlow({\n storeHash,\n accessToken,\n apiHost: options.apiHost,\n projectUuid,\n preferHostname: deploymentHostname,\n });\n } catch (error) {\n // Soft-fail: the deploy already succeeded and the bundle is live. A\n // non-zero exit here would be misleading.\n consola.warn(\n `Failed to update channel site URL: ${error instanceof Error ? error.message : String(error)}`,\n );\n consola.info(\n 'Update it manually in the control panel, or re-run `catalyst auth login` if the token is missing the store_channel_settings scope.',\n );\n }\n });\n","const ERROR_MESSAGES: Record<number, string> = {\n 10: 'Something went wrong on our end. Please try again. If the issue persists, contact support.',\n 20: \"We couldn't retrieve your bundle. This is usually a temporary issue — please try deploying again. If the problem continues, contact support.\",\n 30: 'Your bundle could not be extracted. This may mean your build output is too large (max 64 MB compressed / 512 MB uncompressed) or the archive is corrupted. Try reducing your build size or rebuilding your project and deploying again.',\n 40: `There's a problem with your build output. This could be caused by:\n- A worker.js file larger than 40 MB\n- An individual asset file larger than 25 MB\n- More than 1,000 total files in the bundle`,\n 50: 'Deployment failed. This is usually a temporary issue — please try again. If the problem persists, contact support.',\n 60: \"Your code was deployed, but we couldn't determine your deployment URL. Please try deploying again. If the issue persists, contact support.\",\n};\n\nexport function getDeploymentErrorMessage(code: number): string {\n return (\n ERROR_MESSAGES[code] ??\n `Deployment failed with an unexpected error (code: ${code}). Please try again. If the issue persists, contact support.`\n );\n}\n","import type Conf from 'conf';\n\nimport { ProjectConfigSchema } from './project-config';\n\n// A single deployment environment variable as the infrastructure API expects\n// it. We only persist/send `secret` vars today (see ProjectConfigSchema.env).\nexport interface DeploymentSecret {\n type: 'secret';\n key: string;\n value: string;\n}\n\n// Matches POSIX-ish env var names: leading letter/underscore, then\n// letters/digits/underscores. Keeps the stored config (and the deployment\n// payload) free of keys that wouldn't be valid env vars at runtime.\nconst ENV_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n// Parse a single `KEY=VALUE` assignment. Splits on the *first* `=` only, so\n// values containing `=` (e.g. base64 or tokens) survive intact. Validates the\n// key shape and rejects empty values.\nexport const parseEnvAssignment = (input: string): { key: string; value: string } => {\n const separatorIndex = input.indexOf('=');\n\n if (separatorIndex === -1) {\n throw new Error(`Invalid env var format: ${input}. Expected format: KEY=VALUE`);\n }\n\n const key = input.slice(0, separatorIndex).trim();\n const value = input.slice(separatorIndex + 1).trim();\n\n if (!key || !value) {\n throw new Error(`Invalid env var format: ${input}. Expected format: KEY=VALUE`);\n }\n\n if (!ENV_KEY_PATTERN.test(key)) {\n throw new Error(\n `Invalid env var name: ${key}. Names must start with a letter or underscore and contain only letters, numbers, and underscores.`,\n );\n }\n\n return { key, value };\n};\n\n// Read the persisted env var map (KEY -> VALUE), defaulting to empty.\nexport const getStoredEnv = (config: Conf<ProjectConfigSchema>): Record<string, string> => {\n return config.get('env') ?? {};\n};\n\n// Convert a persisted env var map into the deployment `secret` payload shape.\nexport const toDeploymentSecrets = (envVars: Record<string, string>): DeploymentSecret[] => {\n return Object.entries(envVars).map(([key, value]) => ({ type: 'secret', key, value }));\n};\n\n// Merge persisted secrets with inline `--secret` flag secrets, keyed by name.\n// Inline flags win on conflict so users can override a stored value per-run.\nexport const mergeDeploymentSecrets = (\n persisted: DeploymentSecret[],\n flagSecrets: DeploymentSecret[],\n): DeploymentSecret[] => {\n const byKey = new Map<string, DeploymentSecret>();\n\n persisted.forEach((secret) => byKey.set(secret.key, secret));\n flagSecrets.forEach((secret) => byKey.set(secret.key, secret));\n\n return Array.from(byKey.values());\n};\n","import { Command } from 'commander';\n\nimport { getStoredEnv, parseEnvAssignment } from '../lib/env-config';\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\n\n// Values are secrets, so we never print them back. A fixed-width mask avoids\n// leaking the length of the stored value.\nconst MASK = '••••••';\n\nconst add = new Command('add')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Add or update one or more deployment environment variables. Stored in .bigcommerce/project.json and sent as secrets on every `catalyst deploy`.',\n )\n .argument('<vars...>', 'One or more environment variables in KEY=VALUE format.')\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst env add BIGCOMMERCE_STORE_HASH=abc123 BIGCOMMERCE_STOREFRONT_TOKEN=ey...`,\n )\n .action((vars: string[]) => {\n const config = getProjectConfig();\n const stored = { ...getStoredEnv(config) };\n\n // Parse everything before writing so a single invalid entry doesn't leave a\n // partial update behind.\n const parsed = vars.map((entry) => parseEnvAssignment(entry));\n\n parsed.forEach(({ key, value }) => {\n stored[key] = value;\n });\n\n config.set('env', stored);\n\n const keys = parsed.map(({ key }) => key);\n\n consola.success(\n `Saved ${keys.length} environment variable${keys.length === 1 ? '' : 's'} to .bigcommerce/project.json:`,\n );\n keys.forEach((key) => consola.log(` ${key}=${MASK}`));\n\n process.exit(0);\n });\n\nconst remove = new Command('remove')\n .configureHelp({ showGlobalOptions: true })\n .description('Remove one or more stored deployment environment variables.')\n .argument('<keys...>', 'One or more environment variable names to remove.')\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst env remove BIGCOMMERCE_STORE_HASH BIGCOMMERCE_STOREFRONT_TOKEN`,\n )\n .action((keys: string[]) => {\n const config = getProjectConfig();\n const stored = getStoredEnv(config);\n const toRemove = new Set<string>();\n\n keys.forEach((key) => {\n if (key in stored) {\n toRemove.add(key);\n } else {\n consola.warn(`No stored environment variable named \"${key}\". Skipping.`);\n }\n });\n\n const next = Object.fromEntries(Object.entries(stored).filter(([key]) => !toRemove.has(key)));\n\n config.set('env', next);\n\n const removed = Array.from(toRemove);\n\n if (removed.length > 0) {\n consola.success(\n `Removed ${removed.length} environment variable${removed.length === 1 ? '' : 's'}: ${removed.join(', ')}.`,\n );\n }\n\n process.exit(0);\n });\n\nconst list = new Command('list')\n .configureHelp({ showGlobalOptions: true })\n .description('List stored deployment environment variables (values are masked).')\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst env list`,\n )\n .action(() => {\n const config = getProjectConfig();\n const stored = getStoredEnv(config);\n const keys = Object.keys(stored).sort();\n\n if (keys.length === 0) {\n consola.info('No environment variables stored. Add one with `catalyst env add KEY=VALUE`.');\n process.exit(0);\n\n return;\n }\n\n keys.forEach((key) => consola.log(`${key}=${MASK}`));\n\n process.exit(0);\n });\n\nexport const env = new Command('env')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Manage persistent deployment environment variables. These are sent as secrets on every `catalyst deploy`, so you no longer need to pass `--secret` each time.',\n )\n .addCommand(add)\n .addCommand(remove)\n .addCommand(list);\n","import { Command, Option } from 'commander';\nimport { colorize } from 'consola/utils';\nimport { z } from 'zod';\n\nimport { UnauthorizedError } from '../lib/auth-errors';\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\nimport { resolveCredentials } from '../lib/resolve-credentials';\nimport {\n accessTokenOption,\n apiHostOption,\n projectUuidOption,\n resolveProjectUuid,\n storeHashOption,\n} from '../lib/shared-options';\nimport { Telemetry } from '../lib/telemetry';\n\ntype LogFormat = 'json' | 'pretty' | 'default' | 'short' | 'request';\n\nconst telemetry = new Telemetry();\n\nconst DEFAULT_CONNECTION_TTL_MS = 1 * 60 * 1000; // 1 minute\nconst MAX_RETRIES = 5;\n\nconst isFatalStatusCode = (status: number) => status >= 400 && status < 500;\n\nconst LEVEL_COLORS: Record<string, Parameters<typeof colorize>[0]> = {\n INFO: 'green',\n WARN: 'yellow',\n ERROR: 'red',\n DEBUG: 'gray',\n};\n\nconst LogEventSchema = z\n .object({\n uuid: z.string(),\n project_uuid: z.string(),\n request: z.object({\n method: z.string(),\n url: z.string(),\n status_code: z.number(),\n }),\n logs: z.array(\n z.object({\n timestamp: z.string(),\n level: z.string(),\n messages: z.array(z.unknown()),\n }),\n ),\n exceptions: z.array(z.unknown()),\n timestamp: z.string(),\n })\n .loose();\n\nclass StreamError extends Error {\n fatal: boolean;\n\n constructor(message: string, fatal: boolean) {\n super(message);\n this.fatal = fatal;\n }\n}\n\nconst formatMessages = (messages: unknown[]) =>\n messages.map((m) => (typeof m === 'string' ? m : JSON.stringify(m))).join(' ');\n\nconst formatLogEvent = (\n event: z.infer<typeof LogEventSchema>,\n format: 'default' | 'short' | 'request',\n) => {\n const { request, logs: logEntries, exceptions } = event;\n\n logEntries.forEach((entry) => {\n const msg = formatMessages(entry.messages);\n const level = entry.level.toUpperCase();\n const coloredLevel = colorize(LEVEL_COLORS[level] ?? 'white', level);\n\n switch (format) {\n case 'short':\n consola.log(msg);\n break;\n\n case 'request':\n consola.log(\n `[${entry.timestamp}] [${coloredLevel}] ${request.method} ${request.url}` +\n ` (${request.status_code}) ${msg}`,\n );\n break;\n\n default:\n consola.log(`[${entry.timestamp}] [${coloredLevel}] ${msg}`);\n break;\n }\n });\n\n exceptions.forEach((exception) => {\n consola.error(`[${event.timestamp}] EXCEPTION`, exception);\n });\n};\n\nexport const parseSSEEvent = (raw: string): string | null => {\n const joined = raw\n .split('\\n')\n .flatMap((line) => (line.startsWith('data:') ? [line.slice(5).trim()] : []))\n .join('\\n');\n\n return joined.length > 0 ? joined : null;\n};\n\nconst processLogEvent = (event: string, format: LogFormat) => {\n if (format === 'json') {\n process.stdout.write(`${event}\\n`);\n\n return;\n }\n\n try {\n const parsed: unknown = JSON.parse(event);\n const logEvent = LogEventSchema.parse(parsed);\n\n if (format === 'pretty') {\n consola.log(JSON.stringify(logEvent, null, 2));\n } else {\n formatLogEvent(logEvent, format);\n }\n } catch {\n consola.warn(`Failed to parse log event: ${event}`);\n }\n};\n\ntype TimeoutRaceResult<T> = { kind: 'value'; value: T } | { kind: 'timeout' };\n\n// Races a promise against a timer so a hung `reader.read()` doesn't block the\n// read pump. Without this, the connection TTL check never runs when the API\n// proxy half-closes the socket — bytes stop arriving but no FIN/error\n// surfaces, so the read promise stays pending forever.\nconst raceWithTimeout = async <T>(\n promise: Promise<T>,\n timeoutMs: number,\n): Promise<TimeoutRaceResult<T>> => {\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<TimeoutRaceResult<T>>((resolve) => {\n timeoutHandle = setTimeout(() => resolve({ kind: 'timeout' }), timeoutMs);\n });\n\n try {\n return await Promise.race([\n promise.then((value): TimeoutRaceResult<T> => ({ kind: 'value', value })),\n timeoutPromise,\n ]);\n } finally {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n }\n};\n\nconst openLogStream = async (\n projectUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n) => {\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/logs/${projectUuid}/tail`,\n {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n Accept: 'text/event-stream',\n Connection: 'keep-alive',\n },\n },\n );\n\n // An invalid/expired token won't recover by reconnecting — surface the\n // re-auth guidance and stop the loop (fatal) rather than burning retries.\n if (response.status === 401) {\n throw new StreamError(new UnauthorizedError().message, true);\n }\n\n if (!response.ok) {\n throw new StreamError(\n `Failed to open log stream: ${response.status} ${response.statusText}`,\n isFatalStatusCode(response.status),\n );\n }\n\n const reader = response.body?.getReader();\n\n if (!reader) {\n throw new StreamError('Failed to read log stream.', true);\n }\n\n return reader;\n};\n\n// Reasons the read pump stops on its own (vs. throwing). The outer reconnect\n// loop maps each to a user-facing message — or silence — and opens a fresh\n// stream.\ntype Rotation = 'ttl' | 'idle-timeout' | 'stream-done';\n\nconst pumpUntilRotation = async (\n reader: ReadableStreamDefaultReader<Uint8Array>,\n format: LogFormat,\n connectionTtlMs: number,\n): Promise<Rotation> => {\n const decoder = new TextDecoder();\n const connectTime = Date.now();\n let buffer = '';\n let receivedData = false;\n\n // eslint-disable-next-line no-constant-condition, @typescript-eslint/no-unnecessary-condition\n while (true) {\n const remainingTtlMs = connectionTtlMs - (Date.now() - connectTime);\n\n if (remainingTtlMs <= 0) {\n void reader.cancel();\n\n return 'ttl';\n }\n\n // eslint-disable-next-line no-await-in-loop\n const readResult = await raceWithTimeout(reader.read(), remainingTtlMs);\n\n if (readResult.kind === 'timeout') {\n void reader.cancel();\n\n // No data for the whole window: proxy likely half-closed the socket.\n // If data flowed earlier, treat it as a normal TTL boundary instead.\n return receivedData ? 'ttl' : 'idle-timeout';\n }\n\n const { value, done: streamDone } = readResult.value;\n\n if (value) {\n receivedData = true;\n buffer += decoder.decode(value, { stream: true });\n\n const parts = buffer.split('\\n\\n');\n\n // Last element is either empty (complete event) or a partial chunk to carry over\n buffer = parts.pop() ?? '';\n\n parts\n .map((raw) => parseSSEEvent(raw))\n .filter((event): event is string => event !== null)\n .forEach((event) => processLogEvent(event, format));\n }\n\n if (streamDone) {\n void reader.cancel();\n\n return 'stream-done';\n }\n }\n};\n\nexport const tailLogs = async (\n projectUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n format: LogFormat,\n connectionTtlMs = DEFAULT_CONNECTION_TTL_MS,\n) => {\n consola.info('Tailing logs...');\n\n let retries = 0;\n\n // eslint-disable-next-line no-constant-condition, @typescript-eslint/no-unnecessary-condition\n while (true) {\n try {\n // eslint-disable-next-line no-await-in-loop\n const reader = await openLogStream(projectUuid, storeHash, accessToken, apiHost);\n\n retries = 0;\n\n // eslint-disable-next-line no-await-in-loop\n const rotation = await pumpUntilRotation(reader, format, connectionTtlMs);\n\n if (rotation === 'idle-timeout') {\n consola.warn('Log stream idle, reconnecting...');\n }\n // 'ttl' and 'stream-done' are healthy rotations — reconnect silently.\n } catch (error) {\n if (error instanceof StreamError && error.fatal) {\n throw error;\n }\n\n const isServerDisconnect = error instanceof TypeError && error.message === 'terminated';\n\n if (isServerDisconnect) {\n consola.warn('Log stream closed by server, reconnecting...');\n } else {\n retries += 1;\n\n if (retries >= MAX_RETRIES) {\n throw new Error(`Failed to connect to log stream after ${MAX_RETRIES} retries.`);\n }\n\n consola.warn(\n `Log stream disconnected, reconnecting (attempt ${retries}/${MAX_RETRIES})...`,\n error,\n );\n }\n }\n }\n};\n\nconst tail = new Command('tail')\n .configureHelp({ showGlobalOptions: true })\n .description('Tail live logs from your deployed application.')\n .addHelpText(\n 'after',\n `\nExamples:\n $ catalyst logs tail\n\n # Tail logs with request format\n $ catalyst logs tail --format request\n\n # Tail logs as raw JSON (useful for piping to other tools)\n $ catalyst logs tail --format json`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .addOption(\n new Option('--format <format>', 'Output format for log events.')\n .choices(['json', 'pretty', 'default', 'short', 'request'])\n .default('default'),\n )\n .action(async (options) => {\n try {\n const config = getProjectConfig();\n const { storeHash, accessToken } = resolveCredentials(options, config);\n\n await telemetry.identify(storeHash);\n\n const projectUuid = resolveProjectUuid(options);\n\n await tailLogs(projectUuid, storeHash, accessToken, options.apiHost, options.format);\n } catch (error) {\n consola.error(error);\n process.exit(1);\n }\n });\n\nconst query = new Command('query')\n .configureHelp({ showGlobalOptions: true })\n .description('Query historical logs from your deployed application.')\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst logs query`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .action((options) => {\n const config = getProjectConfig();\n\n resolveCredentials(options, config);\n\n consola.error('The query command is not yet implemented.');\n process.exit(1);\n });\n\nexport const logs = new Command('logs')\n .configureHelp({ showGlobalOptions: true })\n .description('View logs from your deployed application.')\n .addCommand(tail, { isDefault: true })\n .addCommand(query);\n","import { Command } from 'commander';\nimport { colorize } from 'consola/utils';\nimport { dirname } from 'node:path';\n\nimport {\n cleanupCloudflareIncompatibilities,\n NoLinkedProjectError,\n selectOrCreateInfrastructureProject,\n setupCommerceHosting,\n} from '../lib/commerce-hosting';\nimport { installDependencies } from '../lib/install-dependencies';\nimport { consola } from '../lib/logger';\nimport { LoginAbortedError, login as runInteractiveLogin } from '../lib/login';\nimport { createProject, deleteProject, fetchProjects } from '../lib/project';\nimport { getProjectConfig } from '../lib/project-config';\nimport { getProjectState } from '../lib/project-state';\nimport { resolveCredentials } from '../lib/resolve-credentials';\nimport {\n accessTokenOption,\n apiHostOption,\n loginUrlOption,\n projectUuidOption,\n storeHashOption,\n} from '../lib/shared-options';\nimport { getTelemetry } from '../lib/telemetry';\n\n// `catalyst project link` runs from inside `core/`, so the project root (which\n// `setupCommerceHosting` and `installDependencies` expect) is one level up.\nasync function offerCommerceHostingSetup(\n projectUuid: string,\n credentials?: { storeHash: string; accessToken: string },\n) {\n const projectDir = dirname(process.cwd());\n\n // Already-transformed projects skip the setup prompt below — but they may\n // still carry artifacts incompatible with the Cloudflare worker bundle\n // (e.g. `core/instrumentation.ts`, `@vercel/otel`). Run cleanup so existing\n // Commerce Hosting users pick up these fixes on re-link without prompting.\n if (getProjectState().isTransformed) {\n await cleanupCloudflareIncompatibilities(projectDir);\n\n return;\n }\n\n const shouldSetup = await consola.prompt(\n 'Your project has been linked, but is not fully set up for Commerce Hosting deployments yet. Would you like to run the setup now?',\n { type: 'confirm', initial: true },\n );\n\n if (!shouldSetup) return;\n\n await setupCommerceHosting({\n projectDir,\n projectUuid,\n storeHash: credentials?.storeHash,\n accessToken: credentials?.accessToken,\n });\n\n consola.success('Commerce Hosting setup complete.');\n\n await installDependencies(projectDir);\n}\n\nconst list = new Command('list')\n .configureHelp({ showGlobalOptions: true })\n .description('List BigCommerce infrastructure projects for your store.')\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst project list`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .action(async (options) => {\n const config = getProjectConfig();\n const { storeHash, accessToken } = resolveCredentials(options, config);\n\n await getTelemetry().identify(storeHash);\n\n consola.start('Fetching projects...');\n\n const projects = await fetchProjects(storeHash, accessToken, options.apiHost);\n\n consola.success('Projects fetched.');\n\n if (projects.length === 0) {\n consola.info('No projects found.');\n process.exit(0);\n\n return;\n }\n\n const linkedProjectUuid = config.get('projectUuid');\n\n projects.forEach((p) => {\n const marker = p.uuid === linkedProjectUuid ? ` ${colorize('green', '[linked]')}` : '';\n\n consola.log(`${p.name} (${p.uuid})${marker}`);\n\n if (p.deployment_hostnames.length === 0) {\n consola.log(' (not deployed)');\n } else {\n p.deployment_hostnames.forEach((hostname) => {\n consola.log(` ${colorize('blue', `https://${hostname}`)}`);\n });\n }\n\n consola.log('');\n });\n\n process.exit(0);\n });\n\nconst create = new Command('create')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Create a new BigCommerce infrastructure project and link it to your local Catalyst project. Walks you through logging in if you are not authenticated yet.',\n )\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst project create`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(loginUrlOption())\n .action(async (options) => {\n const config = getProjectConfig();\n\n let storeHash = options.storeHash ?? config.get('storeHash');\n let accessToken = options.accessToken ?? config.get('accessToken');\n\n if (!storeHash || !accessToken) {\n consola.info(\n \"You're not logged in yet. Let's get you authenticated before creating a project.\",\n );\n\n try {\n const credentials = await runInteractiveLogin(options.loginUrl, options.apiHost);\n\n storeHash = credentials.storeHash;\n accessToken = credentials.accessToken;\n\n config.set('storeHash', storeHash);\n config.set('accessToken', accessToken);\n\n consola.success(`Logged in to store ${storeHash}.`);\n } catch (error) {\n if (error instanceof LoginAbortedError) {\n consola.info(\n 'Login aborted. Re-run `catalyst project create` when you have your credentials ready.',\n );\n process.exit(0);\n\n return;\n }\n\n throw error;\n }\n }\n\n await getTelemetry().identify(storeHash);\n\n const newProjectName = await consola.prompt('Enter a name for the new project:', {\n type: 'text',\n });\n\n const data = await createProject(newProjectName, storeHash, accessToken, options.apiHost);\n\n consola.success(`Project \"${data.name}\" created successfully.`);\n\n consola.start('Writing project UUID to .bigcommerce/project.json...');\n config.set('projectUuid', data.uuid);\n config.set('storeHash', storeHash);\n config.set('accessToken', accessToken);\n consola.success('Project UUID written to .bigcommerce/project.json.');\n\n process.exit(0);\n });\n\nexport const link = new Command('link')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Link your local Catalyst project to a BigCommerce infrastructure project. You can provide a project UUID directly, or fetch and select from available projects using your store credentials.',\n )\n .addHelpText(\n 'after',\n `\nExamples:\n # Link interactively (prompts to select or create)\n $ catalyst project link\n\n # Link using a project UUID directly\n $ catalyst project link --project-uuid <UUID>`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .action(async (options) => {\n const config = getProjectConfig();\n\n const writeProjectConfig = (\n uuid: string,\n credentials?: { storeHash: string; accessToken: string },\n ) => {\n consola.start('Writing project UUID to .bigcommerce/project.json...');\n config.set('projectUuid', uuid);\n\n if (credentials) {\n config.set('storeHash', credentials.storeHash);\n config.set('accessToken', credentials.accessToken);\n }\n\n consola.success('Project UUID written to .bigcommerce/project.json.');\n };\n\n if (options.projectUuid) {\n writeProjectConfig(options.projectUuid);\n await offerCommerceHostingSetup(options.projectUuid);\n\n process.exit(0);\n\n return;\n }\n\n const { storeHash, accessToken } = resolveCredentials(options, config);\n\n await getTelemetry().identify(storeHash);\n\n let selected;\n\n try {\n selected = await selectOrCreateInfrastructureProject(\n { storeHash, accessToken, apiHost: options.apiHost },\n config.get('projectUuid'),\n );\n } catch (error) {\n if (error instanceof NoLinkedProjectError) {\n consola.info(\n \"When you're ready to create a project, run `catalyst project create` or re-run `catalyst project link`.\",\n );\n process.exit(0);\n\n // Unreachable in production; prevents continuation when process.exit is mocked in tests.\n throw error;\n }\n\n throw error;\n }\n\n writeProjectConfig(selected.uuid, { storeHash, accessToken });\n await offerCommerceHostingSetup(selected.uuid, { storeHash, accessToken });\n\n process.exit(0);\n });\n\nconst del = new Command('delete')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Permanently delete a BigCommerce infrastructure project. This action is irreversible.',\n )\n .addHelpText(\n 'after',\n `\nExamples:\n # Select a project to delete interactively\n $ catalyst project delete\n\n # Delete a specific project (still prompts for confirmation)\n $ catalyst project delete --project-uuid <UUID>\n\n # Skip the confirmation prompt\n $ catalyst project delete --project-uuid <UUID> --force`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .option('--force', 'Skip the confirmation prompt before deleting.')\n .action(async (options) => {\n const config = getProjectConfig();\n const { storeHash, accessToken } = resolveCredentials(options, config);\n\n await getTelemetry().identify(storeHash);\n\n let targetUuid: string | undefined = options.projectUuid;\n let targetName: string | undefined;\n\n if (!targetUuid) {\n consola.start('Fetching projects...');\n\n const projects = await fetchProjects(storeHash, accessToken, options.apiHost);\n\n consola.success('Projects fetched.');\n\n if (projects.length === 0) {\n consola.info('No projects found.');\n process.exit(0);\n\n return;\n }\n\n const linkedProjectUuid = config.get('projectUuid');\n\n const selected = await consola.prompt(\n 'Select a project to delete (Press <enter> to select).',\n {\n type: 'select',\n options: [\n ...projects.map((p) => ({\n label:\n p.uuid === linkedProjectUuid\n ? `${p.name} ${colorize('green', '[linked]')}`\n : p.name,\n value: p.uuid,\n hint: p.uuid,\n })),\n { label: 'Cancel', value: 'cancel', hint: 'Exit without deleting any project.' },\n ],\n cancel: 'reject',\n },\n );\n\n if (selected === 'cancel') {\n consola.info('Aborted. No project was deleted.');\n process.exit(0);\n\n return;\n }\n\n const matched = projects.find((p) => p.uuid === selected);\n\n if (!matched) {\n throw new Error(`Selected project ${String(selected)} not found in fetched list.`);\n }\n\n targetUuid = matched.uuid;\n targetName = matched.name;\n }\n\n if (!options.force) {\n const label = targetName ? `\"${targetName}\" (${targetUuid})` : targetUuid;\n\n const confirmed = await consola.prompt(\n `Are you sure you want to delete project ${label}? This action is irreversible and will permanently destroy the project and all of its data.`,\n { type: 'confirm', initial: false },\n );\n\n if (!confirmed) {\n consola.info('Aborted. No project was deleted.');\n process.exit(0);\n\n return;\n }\n }\n\n consola.start(`Deleting project ${targetUuid}...`);\n\n await deleteProject(targetUuid, storeHash, accessToken, options.apiHost);\n\n consola.success(`Project ${targetUuid} deleted.`);\n\n if (config.get('projectUuid') === targetUuid) {\n config.delete('projectUuid');\n consola.info('Removed project UUID from .bigcommerce/project.json.');\n }\n\n process.exit(0);\n });\n\nexport const project = new Command('project')\n .configureHelp({ showGlobalOptions: true })\n .description('Manage your BigCommerce infrastructure project.')\n .addCommand(create)\n .addCommand(list)\n .addCommand(link)\n .addCommand(del);\n","import { Command } from 'commander';\nimport { execa } from 'execa';\nimport { existsSync, lstatSync, symlinkSync } from 'node:fs';\nimport { join, relative } from 'node:path';\n\nimport { consola } from '../lib/logger';\nimport { getProjectState } from '../lib/project-state';\n\nexport const start = new Command('start')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Start a local preview of your Catalyst storefront using the OpenNext Cloudflare adapter.',\n )\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst start`,\n )\n .action(async () => {\n // Project must be transformed before the OpenNext preview can run. If it\n // isn't, fall through to `next start` so this command works for self-hosted\n // Catalyst projects too.\n const state = getProjectState();\n\n if (!state.isTransformed) {\n consola.info('Project is not set up for Commerce Hosting — running `next start`.');\n\n await execa('pnpm', ['exec', 'next', 'start'], {\n stdio: 'inherit',\n cwd: process.cwd(),\n });\n\n return;\n }\n\n const envLocal = join(process.cwd(), '.env.local');\n const devVars = join(process.cwd(), '.bigcommerce', '.dev.vars');\n\n if (existsSync(envLocal)) {\n if (!existsSync(devVars)) {\n const target = relative(join(process.cwd(), '.bigcommerce'), envLocal);\n\n symlinkSync(target, devVars);\n consola.success('Symlinked .bigcommerce/.dev.vars → .env.local');\n } else if (!lstatSync(devVars).isSymbolicLink()) {\n consola.warn(\n '.bigcommerce/.dev.vars already exists and is not a symlink. ' +\n 'Wrangler will use it instead of .env.local.',\n );\n }\n } else {\n consola.warn(\n 'No .env.local file found. The preview server may fail without environment variables.\\n' +\n 'Create a .env.local file in your project root with the required variables.',\n );\n }\n\n await execa(\n 'pnpm',\n [\n 'exec',\n 'opennextjs-cloudflare',\n 'preview',\n '--config',\n join('.bigcommerce', 'wrangler.jsonc'),\n ],\n {\n stdio: 'inherit',\n cwd: process.cwd(),\n },\n );\n });\n","import { Argument, Command, Option } from 'commander';\nimport { colorize } from 'consola/utils';\n\nimport { consola } from '../lib/logger';\nimport { getTelemetry } from '../lib/telemetry';\n\nconst telemetryService = getTelemetry();\nlet isEnabled = telemetryService.isEnabled();\n\nexport const telemetry = new Command('telemetry')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'View or change CLI telemetry collection status. Enabling telemetry helps BigCommerce support diagnose and troubleshoot errors you encounter when using the CLI.',\n )\n .addHelpText(\n 'after',\n `\nExamples:\n # Show telemetry status\n $ catalyst telemetry\n\n # Enable telemetry collection\n $ catalyst telemetry enable\n\n # Disable telemetry collection\n $ catalyst telemetry --disable`,\n )\n .addArgument(new Argument('[arg]').choices(['disable', 'enable', 'status']))\n .addOption(new Option('--enable', `Enables CLI telemetry collection.`).conflicts('disable'))\n .option('--disable', `Disables CLI telemetry collection.`)\n .action((arg, options) => {\n if (options.enable || arg === 'enable') {\n telemetryService.setEnabled(true);\n isEnabled = true;\n\n consola.success('Success!\\n');\n } else if (options.disable || arg === 'disable') {\n telemetryService.setEnabled(false);\n\n if (isEnabled) {\n consola.success('Your preference has been saved.');\n } else {\n consola.info(`Catalyst CLI telemetry collection is already disabled.`);\n }\n\n isEnabled = false;\n } else {\n consola.info('Catalyst CLI Telemetry\\n');\n }\n\n consola.info(\n `Status: ${colorize('bold', isEnabled ? colorize('green', 'Enabled') : colorize('red', 'Disabled'))}`,\n );\n\n if (!isEnabled) {\n consola.info(\n `You have opted-out of Catalyst CLI telemetry. No data will be collected from your machine.`,\n );\n }\n });\n","import { Command } from 'commander';\n\nimport PACKAGE_INFO from '../../../package.json';\nimport { consola } from '../lib/logger';\n\nexport const version = new Command('version')\n .configureHelp({ showGlobalOptions: true })\n .description('Display detailed version information.')\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst version`,\n )\n .action(() => {\n consola.log('Version Information:');\n consola.log(`CLI Version: ${PACKAGE_INFO.version}`);\n consola.log(`Node Version: ${process.version}`);\n consola.log(`Platform: ${process.platform} (${process.arch})`);\n });\n","import { Command, type CommandUnknownOpts } from '@commander-js/extra-typings';\n\nimport { getTelemetry } from '../lib/telemetry';\n\nconst allowlistArguments = ['--keep-temp-dir', '--api-host', '--project-uuid'];\n\nfunction parseArguments(args: string[]) {\n return args.reduce<Record<string, string>>((result, arg, index, array) => {\n if (arg.includes('=')) {\n const [key, value] = arg.split('=');\n\n if (allowlistArguments.includes(key)) {\n return {\n ...result,\n [key]: value,\n };\n }\n }\n\n if (allowlistArguments.includes(arg)) {\n const nextValue =\n array[index + 1] && !array[index + 1].startsWith('--') ? array[index + 1] : null;\n\n if (nextValue && !nextValue.includes('--')) {\n return {\n ...result,\n [arg]: nextValue,\n };\n }\n }\n\n return result;\n }, {});\n}\n\nfunction getCommandPath(cmd: CommandUnknownOpts): string {\n const parts: string[] = [];\n let current: CommandUnknownOpts | null = cmd;\n\n while (current.parent) {\n parts.unshift(current.name());\n current = current.parent;\n }\n\n return parts.join(' ');\n}\n\nexport const telemetryPreHook = async (thisCommand: Command, actionCommand: CommandUnknownOpts) => {\n const telemetry = getTelemetry();\n const commandName = getCommandPath(actionCommand);\n\n telemetry.commandName = commandName;\n\n // Return the await to get a proper stack trace.\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n return await telemetry.track(commandName, {\n ...parseArguments(thisCommand.args),\n });\n};\n\nexport const telemetryPostHook = async () => {\n const telemetry = getTelemetry();\n\n await telemetry.track('command_completed', { durationMs: telemetry.durationMs() });\n await telemetry.analytics.closeAndFlush();\n};\n","#!/usr/bin/env node\nimport { UnauthorizedError } from './lib/auth-errors';\nimport { consola } from './lib/logger';\nimport { getTelemetry } from './lib/telemetry';\nimport { program } from './program';\n\nconst handleFatalError = async (error: unknown) => {\n const telemetry = getTelemetry();\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n try {\n await telemetry.track('error', {\n commandName: telemetry.commandName,\n errorMessage,\n errorStack,\n durationMs: telemetry.durationMs(),\n });\n await telemetry.analytics.closeAndFlush();\n } catch {\n // Don't mask the original error\n }\n\n // An invalid/expired token is user-actionable, not a bug to report — print the\n // re-auth guidance without the \"share your Correlation ID with support\" noise.\n if (error instanceof UnauthorizedError) {\n consola.error(errorMessage);\n process.exit(1);\n }\n\n consola.error(errorMessage);\n\n if (telemetry.isEnabled()) {\n consola.info(\n `Correlation ID: ${telemetry.correlationId}\\nShare this Correlation ID with BigCommerce support.`,\n );\n } else {\n consola.info(\n 'Enable telemetry (`catalyst telemetry enable`) for improved troubleshooting with BigCommerce support.',\n );\n }\n\n process.exit(1);\n};\n\nprocess.on('uncaughtException', (error) => {\n void handleFatalError(error);\n});\n\nprocess.on('unhandledRejection', (reason) => {\n void handleFatalError(reason);\n});\n\nvoid (async () => {\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n await handleFatalError(error);\n }\n})();\n"],"mappings":"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","names":["Option","Command","colorize","existsSync","Option","z","z","resolve","z","z","z","Conf","config","StoreProfileSchema","z","fetchStoreProfile","Option","config","login","Command","Option","join","join","join","z","join","Command","Option","config","Command","Option","z","query","authHeaders","z","colorize","existsSync","readFileSync","dirname","join","z","z","dirname","join","existsSync","readFileSync","colorize","project","project","channel","config","Command","Option","config","Command","Option","input","select","execSync","colorize","join","existsSync","join","yoctoSpinner","execSync","execSync","execSync","spawnSync","execSync","yoctoSpinner","z","z","mkdirSync","readFileSync","writeFileSync","dirname","join","z","corePackageJsonSchema","z","writeJson","mkdirSync","dirname","writeFileSync","join","readFileSync","join","input","select","colorize","join","execSync","Command","Option","Command","Option","colorize","dirname","join","yoctoSpinner","z","input","config","z","join","yoctoSpinner","colorize","project","Command","Option","config","telemetry","dirname","Command","Command","config","Command","Option","colorize","z","z","colorize","resolve","Command","Option","config","Command","colorize","dirname","dirname","list","Command","config","colorize","create","Command","execa","existsSync","lstatSync","symlinkSync","join","Command","execa","join","existsSync","symlinkSync","lstatSync","Command","Option","colorize","telemetry","Command","Option","colorize","Command","Command","telemetry","existsSync","Command","colorize","Option","telemetry","telemetry"]}
1
+ {"version":3,"sources":["../src/cli/lib/auth-errors.ts","../src/cli/lib/logger.ts","../src/cli/lib/telemetry.ts","../package.json","../src/cli/lib/user-config.ts","../src/cli/program.ts","../src/cli/commands/auth.ts","../src/cli/lib/login.ts","../src/cli/lib/auth.ts","../src/cli/lib/project.ts","../src/cli/lib/project-config.ts","../src/cli/lib/shared-options.ts","../src/cli/commands/build.ts","../src/cli/lib/get-module-cli-path.ts","../src/cli/lib/project-state.ts","../src/cli/lib/wrangler-config.ts","../src/cli/commands/channel.ts","../src/cli/lib/channel-site-flow.ts","../src/cli/lib/channels.ts","../src/cli/lib/commerce-hosting.ts","../src/cli/lib/sort-package-json.ts","../src/cli/lib/env-config.ts","../src/cli/lib/resolve-credentials.ts","../src/cli/commands/create.ts","../src/cli/lib/detect-package-manager.ts","../src/cli/lib/extract-catalyst.ts","../src/cli/lib/init-git-repo.ts","../src/cli/lib/install-dependencies.ts","../src/cli/lib/localization.ts","../src/cli/lib/rewrite-core-package.ts","../src/cli/lib/setup-core-project.ts","../src/cli/lib/write-env.ts","../src/cli/commands/deploy.ts","../src/cli/lib/deployment-errors.ts","../src/cli/commands/domains.ts","../src/cli/lib/domains.ts","../src/cli/lib/observability.ts","../src/cli/commands/env.ts","../src/cli/commands/logs.ts","../src/cli/commands/project.ts","../src/cli/commands/start.ts","../src/cli/commands/telemetry.ts","../src/cli/commands/upgrade.ts","../src/cli/commands/version.ts","../src/cli/hooks/telemetry.ts","../src/cli/index.ts"],"sourcesContent":["// Thrown when an authenticated API call comes back 401 Unauthorized — i.e. the\n// access token was sent but rejected. This covers an expired/revoked token as\n// well as a token that was never valid (e.g. a typo'd `--access-token` flag or\n// a stale `CATALYST_ACCESS_TOKEN` env var). It does NOT cover the \"no\n// credentials at all\" case — that's caught earlier by `resolveCredentials`\n// (and `auth whoami`'s own guard) before any request is made.\n//\n// The CLI can't refresh the token silently (the device-code flow returns no\n// refresh token), so the only recovery is to re-authenticate. Callers should\n// let this propagate to the top-level handler in `index.ts`, which prints the\n// message without the generic \"share your Correlation ID with support\"\n// bug-report framing.\nexport class UnauthorizedError extends Error {\n constructor() {\n super(\n 'Your access token is invalid or has expired.\\n' +\n 'Run `catalyst auth login` to re-authenticate.',\n );\n this.name = 'UnauthorizedError';\n }\n}\n\n// Call immediately after an authenticated `fetch`, before any other status\n// checks. Only 401 means \"invalid/expired token\" — 403 is overloaded elsewhere\n// to mean \"API not enabled\" (scope/feature flag), so it is intentionally not\n// treated as an auth failure here.\nexport function assertAuthorized(response: Response): void {\n if (response.status === 401) {\n throw new UnauthorizedError();\n }\n}\n","import { createConsola } from 'consola';\n\nexport const consola = createConsola({\n level: process.env.CONSOLA_LEVEL ? parseInt(process.env.CONSOLA_LEVEL, 10) : 3,\n});\n","import { Analytics } from '@segment/analytics-node';\nimport Conf from 'conf';\nimport { randomBytes, randomUUID } from 'node:crypto';\n\nimport PACKAGE_INFO from '../../../package.json';\n\nimport { getUserConfig, UserConfigSchema } from './user-config';\n\nconst TELEMETRY_KEY_ENABLED = 'telemetry.enabled';\nconst TELEMETRY_KEY_ID = `telemetry.anonymousId`;\n\nexport class Telemetry {\n readonly correlationId: string;\n readonly analytics: Analytics;\n readonly startTime: number;\n commandName = 'unknown';\n\n private userConfig: Conf<UserConfigSchema>;\n private CATALYST_TELEMETRY_DISABLED: string | undefined;\n\n private readonly projectName = 'catalyst-cli';\n private readonly projectVersion = PACKAGE_INFO.version;\n\n constructor() {\n this.CATALYST_TELEMETRY_DISABLED = process.env.CATALYST_TELEMETRY_DISABLED;\n\n this.userConfig = getUserConfig();\n\n this.correlationId = randomUUID();\n this.startTime = Date.now();\n this.analytics = new Analytics({\n writeKey: process.env.CLI_SEGMENT_WRITE_KEY ?? 'not-a-valid-segment-write-key',\n });\n }\n\n durationMs(): number {\n return Date.now() - this.startTime;\n }\n\n async track(eventName: string, payload: Record<string, unknown>) {\n if (!this.isEnabled()) {\n return Promise.resolve(undefined);\n }\n\n this.analytics.track({\n event: eventName,\n anonymousId: this.getAnonymousId(),\n properties: {\n ...payload,\n correlationId: this.correlationId,\n nodeVersion: process.version,\n platform: process.platform,\n arch: process.arch,\n cliVersion: PACKAGE_INFO.version,\n },\n context: {\n app: {\n name: this.projectName,\n version: this.projectVersion,\n },\n },\n });\n }\n\n async identify(storeHash?: string) {\n if (!this.isEnabled()) {\n return Promise.resolve(undefined);\n }\n\n if (!storeHash) {\n return Promise.resolve(undefined);\n }\n\n this.analytics.identify({\n userId: storeHash,\n anonymousId: this.getAnonymousId(),\n context: {\n app: {\n name: this.projectName,\n version: this.projectVersion,\n },\n },\n });\n }\n\n setEnabled = (_enabled: boolean) => {\n const enabled = Boolean(_enabled);\n\n this.userConfig.set('telemetry.enabled', enabled);\n };\n\n isEnabled() {\n return (\n !this.CATALYST_TELEMETRY_DISABLED &&\n this.userConfig.get<typeof TELEMETRY_KEY_ENABLED, boolean>(TELEMETRY_KEY_ENABLED, true)\n );\n }\n\n private getAnonymousId(): string {\n const val = this.userConfig.get<typeof TELEMETRY_KEY_ID, string>(TELEMETRY_KEY_ID);\n\n if (val) {\n return val;\n }\n\n const generated = randomBytes(32).toString('hex');\n\n this.userConfig.set(TELEMETRY_KEY_ID, generated);\n\n return generated;\n }\n}\n\nlet telemetryInstance: Telemetry | undefined;\n\n// Singleton so the pre-hook, post-hook, error handler, and command bodies all\n// share one correlationId. resetTelemetry() is for test isolation.\nexport function getTelemetry(): Telemetry {\n telemetryInstance ??= new Telemetry();\n\n return telemetryInstance;\n}\n\nexport function resetTelemetry(): void {\n telemetryInstance = undefined;\n}\n","{\n \"name\": \"@bigcommerce/catalyst\",\n \"version\": \"1.0.0\",\n \"type\": \"module\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/bigcommerce/catalyst\",\n \"directory\": \"packages/catalyst\"\n },\n \"bin\": {\n \"catalyst\": \"dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"templates\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint . --max-warnings 0\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"build\": \"tsup\"\n },\n \"engines\": {\n \"node\": \"^20.0.0 || ^22.0.0 || ^24.0.0\"\n },\n \"dependencies\": {\n \"@commander-js/extra-typings\": \"^14.0.0\",\n \"@inquirer/prompts\": \"^7.5.3\",\n \"@segment/analytics-node\": \"^2.2.1\",\n \"adm-zip\": \"^0.5.16\",\n \"commander\": \"^14.0.0\",\n \"conf\": \"^13.1.0\",\n \"consola\": \"^3.4.2\",\n \"cross-spawn\": \"^7.0.6\",\n \"dotenv\": \"^16.5.0\",\n \"execa\": \"^9.6.0\",\n \"fs-extra\": \"^11.3.0\",\n \"lodash.kebabcase\": \"^4.1.1\",\n \"nypm\": \"^0.5.4\",\n \"open\": \"^10.1.0\",\n \"std-env\": \"^3.9.0\",\n \"tar\": \"^7.5.7\",\n \"yocto-spinner\": \"^1.0.0\",\n \"zod\": \"^4.0.5\"\n },\n \"devDependencies\": {\n \"@bigcommerce/eslint-config\": \"^2.11.0\",\n \"@bigcommerce/eslint-config-catalyst\": \"workspace:^\",\n \"@types/adm-zip\": \"^0.5.7\",\n \"@types/cross-spawn\": \"^6.0.6\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/lodash.kebabcase\": \"^4.1.9\",\n \"@types/node\": \"^22.15.30\",\n \"@vitest/coverage-v8\": \"^3.2.4\",\n \"@vitest/ui\": \"^3.2.4\",\n \"eslint\": \"^8.57.1\",\n \"msw\": \"^2.9.0\",\n \"prettier\": \"^3.6.2\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n },\n \"peerDependencies\": {\n \"@opennextjs/cloudflare\": \"1.17.3\"\n }\n}\n","import Conf from 'conf';\n\nexport interface UserConfigSchema {\n telemetry: {\n enabled: boolean;\n anonymousId: string;\n };\n}\n\nlet userConfigInstance: Conf<UserConfigSchema> | undefined;\n\n// User-scoped config (per-machine, not per-project). Lives in the OS config dir\n// — keeping telemetry out of the user's working directory so commands like\n// `catalyst create` don't drop a stray `.bigcommerce/` next to where they're run.\nexport function getUserConfig(): Conf<UserConfigSchema> {\n userConfigInstance ??= new Conf<UserConfigSchema>({\n projectName: 'catalyst-cli',\n projectSuffix: '',\n configName: 'config',\n schema: {\n telemetry: {\n type: 'object',\n properties: {\n enabled: { type: 'boolean' },\n anonymousId: { type: 'string' },\n },\n },\n },\n });\n\n return userConfigInstance;\n}\n\nexport function resetUserConfig(): void {\n userConfigInstance = undefined;\n}\n","import { Option } from '@commander-js/extra-typings';\nimport { Command } from 'commander';\nimport { colorize } from 'consola/utils';\nimport { config } from 'dotenv';\nimport { existsSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport PACKAGE_INFO from '../../package.json';\n\nimport { auth } from './commands/auth';\nimport { build } from './commands/build';\nimport { channel } from './commands/channel';\nimport { create } from './commands/create';\nimport { deploy } from './commands/deploy';\nimport { domains } from './commands/domains';\nimport { env } from './commands/env';\nimport { logs } from './commands/logs';\nimport { project } from './commands/project';\nimport { start } from './commands/start';\nimport { telemetry } from './commands/telemetry';\nimport { upgrade } from './commands/upgrade';\nimport { version } from './commands/version';\nimport { telemetryPostHook, telemetryPreHook } from './hooks/telemetry';\nimport { consola } from './lib/logger';\n\n// Auto-load .env.local from cwd if present, matching Next.js convention.\n// `--env-path` (loaded later via argParser) overrides anything we load here.\nconst defaultEnvPath = resolve(process.cwd(), '.env.local');\n\nif (existsSync(defaultEnvPath)) {\n config({ path: defaultEnvPath });\n}\n\n// CATALYST_STORE_HASH falls back to BIGCOMMERCE_STORE_HASH so freshly-scaffolded\n// projects work without duplicating the same value under two names. Aliasing\n// here means every command's `.env('CATALYST_STORE_HASH')` binding picks it up\n// without per-command changes.\nif (!process.env.CATALYST_STORE_HASH && process.env.BIGCOMMERCE_STORE_HASH) {\n process.env.CATALYST_STORE_HASH = process.env.BIGCOMMERCE_STORE_HASH;\n}\n\nexport const program = new Command();\n\nconsola.log(colorize('cyanBright', `◢ ${PACKAGE_INFO.name} v${PACKAGE_INFO.version}\\n`));\n\nprogram\n .name(PACKAGE_INFO.name)\n .version(PACKAGE_INFO.version)\n .summary('CLI tool for Catalyst development')\n .description(\n 'CLI tool for Catalyst development.\\n\\nConfiguration priority: flags > env file (--env-path) > process.env > .env.local (auto-loaded from cwd) > .bigcommerce/project.json.\\n\\nCATALYST_STORE_HASH falls back to BIGCOMMERCE_STORE_HASH if unset.\\n\\nRun `catalyst <command> --help` for details on a specific command.',\n )\n .configureHelp({ showGlobalOptions: true })\n .addOption(\n new Option(\n '--env-path <path>',\n 'Path to environment file to load (relative to current working directory)',\n // We are using argParser, because commander loads in environment variables before executing hooks.\n ).argParser((value) => {\n if (value) {\n const envFilePath = resolve(process.cwd(), value);\n const result = config({\n path: envFilePath,\n override: true,\n });\n\n if (result.error) {\n const errCode =\n 'code' in result.error && typeof result.error.code === 'string'\n ? result.error.code\n : undefined;\n const message =\n errCode === 'ENOENT'\n ? `Env file not found: ${envFilePath}`\n : `Failed to load --env-path ${value}: ${result.error.message}`;\n\n throw new Error(message);\n }\n\n consola.log(colorize('cyanBright', `Loaded environment variables from ${envFilePath}\\n`));\n }\n\n return value;\n }),\n )\n .addCommand(version)\n .addCommand(create)\n .addCommand(start)\n .addCommand(build)\n .addCommand(deploy)\n .addCommand(domains)\n .addCommand(logs)\n .addCommand(project)\n .addCommand(env)\n .addCommand(channel)\n .addCommand(auth)\n .addCommand(upgrade)\n .addCommand(telemetry)\n .hook('preAction', telemetryPreHook)\n .hook('postAction', telemetryPostHook);\n","import { Command, Option } from 'commander';\nimport { z } from 'zod';\n\nimport { assertAuthorized, UnauthorizedError } from '../lib/auth-errors';\nimport { consola } from '../lib/logger';\nimport { LoginAbortedError, login as runInteractiveLogin } from '../lib/login';\nimport { fetchProjects } from '../lib/project';\nimport { getProjectConfig } from '../lib/project-config';\nimport { loginUrlOption } from '../lib/shared-options';\n\nconst StoreProfileSchema = z.object({\n data: z.object({\n store_name: z.string(),\n }),\n});\n\nasync function fetchStoreProfile(storeHash: string, accessToken: string, apiHost: string) {\n const response = await fetch(`https://${apiHost}/stores/${storeHash}/v3/settings/store/profile`, {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n Accept: 'application/json',\n },\n });\n\n assertAuthorized(response);\n\n if (!response.ok) {\n throw new Error(`${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const result = StoreProfileSchema.safeParse(res);\n\n if (!result.success) {\n throw new Error('Unexpected response from store profile API');\n }\n\n return result.data.data;\n}\n\nconst whoami = new Command('whoami')\n .configureHelp({ showGlobalOptions: true })\n .description('Verify stored credentials and display store/project info.')\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst auth whoami\n\n Logged in to My Store (abc123), connected to project my-project (43eba682-0c48-11f1-9bd5-827a48b0ce1e)`,\n )\n .addOption(\n new Option(\n '--store-hash <hash>',\n 'BigCommerce store hash. Can be found in the URL of your store Control Panel.',\n ).env('CATALYST_STORE_HASH'),\n )\n .addOption(\n new Option(\n '--access-token <token>',\n 'BigCommerce access token. Can be found after creating a store-level API account.',\n ).env('CATALYST_ACCESS_TOKEN'),\n )\n .addOption(\n new Option('--api-host <host>', 'BigCommerce API host. The default is api.bigcommerce.com.')\n .env('BIGCOMMERCE_API_HOST')\n .default('api.bigcommerce.com')\n .hideHelp(),\n )\n .action(async (options) => {\n try {\n const config = getProjectConfig();\n\n const storeHash = options.storeHash ?? config.get('storeHash');\n const accessToken = options.accessToken ?? config.get('accessToken');\n\n if (!storeHash || !accessToken) {\n consola.info('Not logged in: no credentials found.');\n consola.info(\n 'Run `catalyst auth login`, or provide --store-hash and --access-token flags (or set CATALYST_STORE_HASH and CATALYST_ACCESS_TOKEN environment variables).',\n );\n process.exit(1);\n\n return;\n }\n\n const store = await fetchStoreProfile(storeHash, accessToken, options.apiHost);\n\n const projectUuid = config.get('projectUuid');\n\n if (projectUuid) {\n const projects = await fetchProjects(storeHash, accessToken, options.apiHost);\n const linkedProject = projects.find((p) => p.uuid === projectUuid);\n\n if (linkedProject) {\n consola.info(\n `Logged in to ${store.store_name} (${storeHash}), connected to project ${linkedProject.name} (${projectUuid})`,\n );\n } else {\n consola.info(\n `Logged in to ${store.store_name} (${storeHash}), project ${projectUuid} not found`,\n );\n }\n } else {\n consola.info(`Logged in to ${store.store_name} (${storeHash})`);\n }\n\n process.exit(0);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n if (error instanceof UnauthorizedError) {\n consola.error(\n 'Not logged in: your access token is invalid or has expired. Run `catalyst auth login`.',\n );\n } else if (message.includes('401') || message.includes('403')) {\n consola.error(`Not logged in: invalid credentials (${message})`);\n } else {\n consola.error(`Failed to verify credentials: ${message}`);\n }\n\n process.exit(1);\n }\n });\n\nconst login = new Command('login')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Authenticate via browser using the OAuth device code flow. Falls back to an interactive store hash + access token prompt if the browser flow is unavailable. If already logged in, displays current credentials and suggests running `catalyst auth logout` to re-authenticate.',\n )\n .addHelpText(\n 'after',\n `\nExamples:\n # Login interactively (browser, with manual fallback)\n $ catalyst auth login\n\n # Login with existing credentials (skips interactive flow)\n $ catalyst auth login --store-hash <STORE_HASH> --access-token <ACCESS_TOKEN>`,\n )\n .addOption(\n new Option(\n '--store-hash <hash>',\n 'BigCommerce store hash. Can be found in the URL of your store Control Panel.',\n ).env('CATALYST_STORE_HASH'),\n )\n .addOption(\n new Option(\n '--access-token <token>',\n 'BigCommerce access token. Can be found after creating a store-level API account.',\n ).env('CATALYST_ACCESS_TOKEN'),\n )\n .addOption(\n new Option('--api-host <host>', 'BigCommerce API host. The default is api.bigcommerce.com.')\n .env('BIGCOMMERCE_API_HOST')\n .default('api.bigcommerce.com')\n .hideHelp(),\n )\n .addOption(loginUrlOption())\n .action(async (options) => {\n try {\n const config = getProjectConfig();\n\n const storeHash = options.storeHash ?? config.get('storeHash');\n const accessToken = options.accessToken ?? config.get('accessToken');\n\n if (storeHash && accessToken) {\n consola.info(`Already logged in to store ${storeHash}.`);\n consola.info('Run `catalyst auth logout` first to re-authenticate.');\n process.exit(0);\n\n return;\n }\n\n const credentials = await runInteractiveLogin(options.loginUrl, options.apiHost);\n\n config.set('storeHash', credentials.storeHash);\n config.set('accessToken', credentials.accessToken);\n\n consola.success(`Logged in to store ${credentials.storeHash}.`);\n process.exit(0);\n } catch (error) {\n if (error instanceof LoginAbortedError) {\n consola.info(\n 'Login aborted. Re-run `catalyst auth login` when you have your credentials ready.',\n );\n process.exit(0);\n\n return;\n }\n\n const message = error instanceof Error ? error.message : String(error);\n\n consola.error(`Login failed: ${message}`);\n process.exit(1);\n }\n });\n\nconst logout = new Command('logout')\n .configureHelp({ showGlobalOptions: true })\n .description('Remove stored credentials for the current project.')\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst auth logout`,\n )\n .action(() => {\n try {\n const config = getProjectConfig();\n\n const storeHash = config.get('storeHash');\n const accessToken = config.get('accessToken');\n\n if (!storeHash && !accessToken) {\n consola.info('Not logged in: no credentials found.');\n process.exit(0);\n\n return;\n }\n\n config.delete('storeHash');\n config.delete('accessToken');\n\n consola.success(`Logged out from store ${storeHash ?? 'unknown'}.`);\n process.exit(0);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n consola.error(`Logout failed: ${message}`);\n process.exit(1);\n }\n });\n\nexport const auth = new Command('auth')\n .configureHelp({ showGlobalOptions: true })\n .description('Manage authentication for the BigCommerce CLI.')\n .addCommand(whoami)\n .addCommand(login)\n .addCommand(logout);\n","import { confirm, input, password } from '@inquirer/prompts';\nimport { colorize } from 'consola/utils';\nimport open from 'open';\nimport yoctoSpinner from 'yocto-spinner';\nimport { z } from 'zod';\n\nimport { DEVICE_OAUTH_SCOPES, requestDeviceCode, waitForDeviceToken } from './auth';\nimport { consola } from './logger';\n\nexport interface LoginResult {\n storeHash: string;\n accessToken: string;\n}\n\n// Thrown when the user declines the manual-login fallback after the browser\n// (device-code) flow has failed. Callers should treat this as a clean exit,\n// not an error — the user explicitly chose to abort.\nexport class LoginAbortedError extends Error {\n constructor() {\n super('Login aborted by user.');\n this.name = 'LoginAbortedError';\n }\n}\n\nconst StoreProfileSchema = z.object({\n data: z.object({\n store_name: z.string(),\n }),\n});\n\nasync function fetchStoreProfile(storeHash: string, accessToken: string, apiHost: string) {\n const response = await fetch(`https://${apiHost}/stores/${storeHash}/v3/settings/store/profile`, {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n Accept: 'application/json',\n },\n });\n\n if (!response.ok) {\n throw new Error(`${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const result = StoreProfileSchema.safeParse(res);\n\n if (!result.success) {\n throw new Error('Unexpected response from store profile API');\n }\n\n return result.data.data;\n}\n\nasync function deviceCodeLogin(loginUrl: string): Promise<LoginResult> {\n const deviceCode = await requestDeviceCode(loginUrl);\n\n consola.info(\n `${colorize('yellow', 'Your one-time code:')} ${colorize('bold', deviceCode.user_code)}`,\n );\n\n try {\n await open(deviceCode.verification_uri);\n consola.info(`Opened ${deviceCode.verification_uri} in your browser.`);\n } catch {\n consola.info(`Open ${deviceCode.verification_uri} in your browser and enter the code above.`);\n }\n\n const spinner = yoctoSpinner().start('Waiting for authentication...');\n\n const credentials = await waitForDeviceToken(\n loginUrl,\n deviceCode.device_code,\n deviceCode.interval,\n );\n\n spinner.success('Authentication complete.');\n\n return {\n storeHash: credentials.store_hash,\n accessToken: credentials.access_token,\n };\n}\n\nasync function manualLogin(apiHost: string): Promise<LoginResult> {\n consola.info(\n 'Create a store-level API account from your BigCommerce Control Panel:\\n' +\n ' Settings → API → Store-level API accounts → Create API account\\n' +\n `Grant these OAuth scopes: ${DEVICE_OAUTH_SCOPES}`,\n );\n\n const storeHashInput = await input({ message: 'Store hash:' });\n const storeHash = storeHashInput.trim();\n\n if (!storeHash) {\n throw new Error('Store hash is required.');\n }\n\n const accessTokenInput = await password({ message: 'Access token:', mask: true });\n const accessToken = accessTokenInput.trim();\n\n if (!accessToken) {\n throw new Error('Access token is required.');\n }\n\n const spinner = yoctoSpinner().start('Validating credentials...');\n\n try {\n const profile = await fetchStoreProfile(storeHash, accessToken, apiHost);\n\n spinner.success(`Validated credentials for ${profile.store_name} (${storeHash}).`);\n } catch (error) {\n spinner.error('Failed to validate credentials.');\n\n const message = error instanceof Error ? error.message : String(error);\n\n throw new Error(\n `Could not validate credentials (${message}). Double-check your store hash and access token, then try again.`,\n );\n }\n\n return { storeHash, accessToken };\n}\n\n// Interactive login orchestrator. Used by `catalyst create`, `catalyst auth\n// login`, and `catalyst project create` to gather credentials when none are\n// supplied via flags/env/config.\n//\n// Happy path: opens the browser device-code flow. When that fails (e.g. the\n// device-code endpoint returns 404 because the OAuth client isn't yet\n// provisioned for the user's environment), we ask the user if they'd like to\n// fall back to pasting a store-level API account's credentials instead, then\n// validate them via the store profile API before returning.\nexport async function login(loginUrl: string, apiHost: string): Promise<LoginResult> {\n try {\n return await deviceCodeLogin(loginUrl);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n\n consola.warn(`Browser login didn't work (${message}).`);\n\n const shouldFallback = await confirm({\n message: 'Try logging in manually with a store hash and access token instead?',\n default: true,\n });\n\n if (!shouldFallback) {\n throw new LoginAbortedError();\n }\n\n return manualLogin(apiHost);\n }\n}\n","import { z } from 'zod';\n\nexport const DEVICE_OAUTH_CLIENT_ID = 'b8063bu6hhml4e0lqh22yut63atsbyv';\nexport const DEVICE_OAUTH_SCOPES = [\n 'store_v2_information',\n 'store_infrastructure_deployments_manage',\n 'store_infrastructure_logs_read_only',\n 'store_infrastructure_projects_manage',\n 'store_channel_settings',\n].join(' ');\nexport const DEFAULT_LOGIN_URL = 'https://login.bigcommerce.com';\n\nexport const DeviceCodeResponseSchema = z.object({\n device_code: z.string(),\n user_code: z.string(),\n verification_uri: z.string(),\n expires_in: z.number(),\n interval: z.number(),\n});\n\nexport const DeviceCodeSuccessSchema = z.object({\n access_token: z.string(),\n store_hash: z.string(),\n context: z.string(),\n api_uri: z.string(),\n});\n\nexport async function requestDeviceCode(loginUrl: string) {\n const response = await fetch(`${loginUrl}/device/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n client_id: DEVICE_OAUTH_CLIENT_ID,\n scopes: DEVICE_OAUTH_SCOPES,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Failed to request device code: ${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n\n return DeviceCodeResponseSchema.parse(res);\n}\n\nexport async function pollDeviceToken(loginUrl: string, deviceCode: string) {\n const response = await fetch(`${loginUrl}/device/token`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n device_code: deviceCode,\n client_id: DEVICE_OAUTH_CLIENT_ID,\n }),\n });\n\n if (response.status !== 200) {\n return null;\n }\n\n const res: unknown = await response.json();\n\n return DeviceCodeSuccessSchema.parse(res);\n}\n\nexport async function waitForDeviceToken(\n loginUrl: string,\n deviceCode: string,\n interval: number,\n): Promise<z.infer<typeof DeviceCodeSuccessSchema>> {\n const credentials = await pollDeviceToken(loginUrl, deviceCode);\n\n if (credentials) {\n return credentials;\n }\n\n await new Promise((resolve) => {\n setTimeout(resolve, interval * 1000);\n });\n\n return waitForDeviceToken(loginUrl, deviceCode, interval);\n}\n","import { z } from 'zod';\n\nimport { assertAuthorized } from './auth-errors';\nimport { getTelemetry } from './telemetry';\n\nexport class InfrastructureProjectValidationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InfrastructureProjectValidationError';\n }\n}\n\nconst fetchProjectsSchema = z.object({\n data: z.array(\n z.object({\n uuid: z.string(),\n name: z.string(),\n deployment_hostnames: z.array(z.string()),\n }),\n ),\n});\n\nexport interface ProjectListItem {\n uuid: string;\n name: string;\n deployment_hostnames: string[];\n}\n\nfunction projectsUrl(storeHash: string, apiHost: string) {\n return `https://${apiHost}/stores/${storeHash}/v3/infrastructure/projects`;\n}\n\nfunction authHeaders(accessToken: string) {\n return {\n 'X-Auth-Token': accessToken,\n 'X-Correlation-Id': getTelemetry().correlationId,\n };\n}\n\nexport async function hasProjectsAccess(\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<boolean> {\n const response = await fetch(projectsUrl(storeHash, apiHost), {\n method: 'GET',\n headers: authHeaders(accessToken),\n });\n\n assertAuthorized(response);\n\n if (response.status === 200) return true;\n if (response.status === 403) return false;\n\n throw new Error(\n `GET /v3/infrastructure/projects failed: ${response.status} ${response.statusText}`,\n );\n}\n\nexport async function fetchProjects(\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<ProjectListItem[]> {\n const response = await fetch(projectsUrl(storeHash, apiHost), {\n method: 'GET',\n headers: authHeaders(accessToken),\n });\n\n assertAuthorized(response);\n\n if (response.status === 403) {\n throw new Error(\n 'Infrastructure Projects API not enabled. If you are part of the beta, contact support@bigcommerce.com to enable it.',\n );\n }\n\n if (!response.ok) {\n throw new Error(`Failed to fetch projects: ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n\n const { data } = fetchProjectsSchema.parse(res);\n\n return data;\n}\n\nconst createProjectSchema = z.object({\n data: z.object({\n uuid: z.string(),\n name: z.string(),\n date_created: z.coerce.date(),\n date_modified: z.coerce.date(),\n }),\n});\n\nexport interface CreateProjectResult {\n uuid: string;\n name: string;\n date_created: Date;\n date_modified: Date;\n}\n\nconst validationErrorBodySchema = z.object({\n title: z.string().optional(),\n detail: z.string().optional(),\n errors: z.record(z.string(), z.string()).optional(),\n});\n\nfunction extractValidationMessage(body: unknown): string | null {\n const parsed = validationErrorBodySchema.safeParse(body);\n\n if (!parsed.success) return null;\n\n const { title, detail, errors } = parsed.data;\n\n if (errors && Object.keys(errors).length > 0) {\n return Object.values(errors).join('; ');\n }\n\n return detail ?? title ?? null;\n}\n\nexport async function createProject(\n name: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<CreateProjectResult> {\n const response = await fetch(projectsUrl(storeHash, apiHost), {\n method: 'POST',\n headers: {\n ...authHeaders(accessToken),\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ name }),\n });\n\n assertAuthorized(response);\n\n if (response.status === 400 || response.status === 422) {\n const body: unknown = await response.json().catch(() => null);\n const fallback =\n response.status === 422\n ? \"The project name you entered doesn't meet the requirements. It must be 3–32 characters long and use only letters, numbers, hyphens (-), underscores (_), and periods (.)\"\n : response.statusText;\n const message = extractValidationMessage(body) ?? fallback;\n\n throw new InfrastructureProjectValidationError(message);\n }\n\n if (response.status === 403) {\n throw new Error(\n 'Infrastructure Projects API not enabled. If you are part of the beta, contact support@bigcommerce.com to enable it.',\n );\n }\n\n // TODO: TRAC-592 - remove this check once the API returns proper 400/422 with validation messages for duplicate names instead of 502\n if (response.status === 502) {\n throw new Error('Failed to create project, is the name already in use?');\n }\n\n if (!response.ok) {\n throw new Error(`Failed to create project: ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n\n const { data } = createProjectSchema.parse(res);\n\n return data;\n}\n\nexport async function deleteProject(\n projectUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<void> {\n const response = await fetch(`${projectsUrl(storeHash, apiHost)}/${projectUuid}`, {\n method: 'DELETE',\n headers: authHeaders(accessToken),\n });\n\n assertAuthorized(response);\n\n if (response.status === 403) {\n throw new Error(\n 'Infrastructure Projects API not enabled. If you are part of the beta, contact support@bigcommerce.com to enable it.',\n );\n }\n\n if (response.status === 404) {\n throw new Error(`Project ${projectUuid} not found.`);\n }\n\n if (!response.ok) {\n throw new Error(`Failed to delete project: ${response.statusText}`);\n }\n}\n","import Conf from 'conf';\nimport { join } from 'path';\n\nexport interface ProjectConfigSchema {\n projectUuid: string;\n // Reserved for future use\n framework: 'catalyst';\n storeHash?: string;\n accessToken?: string;\n // Persistent deployment environment variables (KEY -> VALUE). Every entry is\n // sent to the deployment as a `secret` by `catalyst deploy`. Managed via the\n // `catalyst env` commands. Lives here (gitignored .bigcommerce/project.json)\n // so users don't have to re-pass `--secret` on every deploy.\n env?: Record<string, string>;\n}\n\nexport function getProjectConfig() {\n return new Conf<ProjectConfigSchema>({\n cwd: join(process.cwd(), '.bigcommerce'),\n projectSuffix: '',\n configName: 'project',\n schema: {\n projectUuid: { type: 'string', format: 'uuid' },\n framework: {\n type: 'string',\n enum: ['catalyst'],\n default: 'catalyst',\n },\n storeHash: { type: 'string' },\n accessToken: { type: 'string' },\n env: {\n type: 'object',\n additionalProperties: { type: 'string' },\n default: {},\n },\n },\n });\n}\n","import { Option } from 'commander';\n\nimport { DEFAULT_LOGIN_URL } from './auth';\nimport { getProjectConfig } from './project-config';\n\nexport const storeHashOption = () =>\n new Option(\n '--store-hash <hash>',\n 'BigCommerce store hash. Can be found in the URL of your store Control Panel. Read from .bigcommerce/project.json or .env when not provided.',\n ).env('CATALYST_STORE_HASH');\n\nexport const accessTokenOption = () =>\n new Option(\n '--access-token <token>',\n 'BigCommerce access token. Can be found after creating a store-level API account. Read from .bigcommerce/project.json or .env when not provided.',\n ).env('CATALYST_ACCESS_TOKEN');\n\nexport const apiHostOption = () =>\n new Option('--api-host <host>', 'BigCommerce API host. The default is api.bigcommerce.com.')\n .env('BIGCOMMERCE_API_HOST')\n .default('api.bigcommerce.com')\n .hideHelp();\n\nexport const loginUrlOption = () =>\n new Option('--login-url <url>', 'BigCommerce login URL.')\n .env('BIGCOMMERCE_LOGIN_URL')\n .default(DEFAULT_LOGIN_URL)\n .hideHelp();\n\nexport const projectUuidOption = () =>\n new Option(\n '--project-uuid <uuid>',\n 'BigCommerce infrastructure project UUID. Read from .bigcommerce/project.json or .env when not provided.',\n ).env('CATALYST_PROJECT_UUID');\n\nexport const resolveProjectUuid = (options: { projectUuid?: string }) => {\n const config = getProjectConfig();\n const projectUuid = options.projectUuid ?? config.get('projectUuid');\n\n if (!projectUuid) {\n throw new Error(\n 'Project UUID is required. Please run either `catalyst project link` or `catalyst project create` or this command again with --project-uuid <uuid>.',\n );\n }\n\n return projectUuid;\n};\n","import { Command, Option } from 'commander';\nimport { execa } from 'execa';\nimport { copyFile, cp, rm, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getModuleCliPath } from '../lib/get-module-cli-path';\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\nimport { getProjectState } from '../lib/project-state';\nimport { getWranglerConfig } from '../lib/wrangler-config';\n\nconst WRANGLER_VERSION = '4.90.0';\n\nexport async function buildCatalystProject(projectUuid: string): Promise<void> {\n const coreDir = process.cwd();\n const openNextOutDir = join(coreDir, '.open-next');\n const bigcommerceDistDir = join(coreDir, '.bigcommerce', 'dist');\n\n const wranglerConfig = getWranglerConfig(projectUuid);\n\n // Wrangler's --outdir writes alongside existing files instead of replacing\n // the directory. Stale artifacts (e.g. wasm modules named by an older\n // Wrangler version) end up in the bundle and break the Cloudflare upload.\n await rm(bigcommerceDistDir, { recursive: true, force: true });\n\n consola.start('Copying templates...');\n\n await copyFile(\n join(getModuleCliPath(), 'templates', 'open-next.config.ts'),\n join(coreDir, '.bigcommerce', 'open-next.config.ts'),\n );\n await writeFile(\n join(coreDir, '.bigcommerce', 'wrangler.jsonc'),\n JSON.stringify(wranglerConfig, null, 2),\n );\n\n consola.success('Templates copied');\n\n consola.start('Building project...');\n\n await execa(\n 'pnpm',\n [\n 'exec',\n 'opennextjs-cloudflare',\n 'build',\n '--skipWranglerConfigCheck',\n '--openNextConfigPath',\n join(coreDir, '.bigcommerce', 'open-next.config.ts'),\n ],\n {\n stdout: ['pipe', 'inherit'],\n cwd: coreDir,\n },\n );\n\n await execa(\n 'pnpm',\n [\n 'dlx',\n `wrangler@${WRANGLER_VERSION}`,\n 'deploy',\n '--config',\n join(coreDir, '.bigcommerce', 'wrangler.jsonc'),\n '--keep-vars',\n '--outdir',\n bigcommerceDistDir,\n '--dry-run',\n ],\n {\n stdout: ['pipe', 'inherit'],\n cwd: coreDir,\n },\n );\n\n consola.success('Project built');\n\n await cp(join(openNextOutDir, 'assets'), join(bigcommerceDistDir, 'assets'), {\n recursive: true,\n force: true,\n });\n}\n\nexport const build = new Command('build')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Build your Catalyst project using the OpenNext/Cloudflare build pipeline. Also runs a Wrangler dry-run to generate deployment artifacts.',\n )\n .addHelpText(\n 'after',\n `\nExamples:\n $ catalyst build\n\n # Include project UUID\n $ catalyst build --project-uuid <UUID>`,\n )\n .addOption(\n new Option(\n '--project-uuid <uuid>',\n 'Project UUID to be included in the deployment configuration.',\n ).env('CATALYST_PROJECT_UUID'),\n )\n .action(async (options) => {\n // Project must be transformed (middleware swapped in, OpenNext dep installed)\n // before the OpenNext build pipeline can run. If it isn't, fall through to\n // `next build` so this command works for self-hosted Catalyst projects too.\n const state = getProjectState();\n\n if (!state.isTransformed) {\n consola.info('Project is not set up for Commerce Hosting — running `next build`.');\n consola.info('To deploy to Commerce Hosting, run `catalyst deploy`.');\n\n await execa('pnpm', ['exec', 'next', 'build'], {\n stdio: 'inherit',\n cwd: process.cwd(),\n });\n\n return;\n }\n\n const config = getProjectConfig();\n const projectUuid = options.projectUuid ?? config.get('projectUuid');\n\n if (!projectUuid) {\n throw new Error(\n 'Project UUID is required. Please run `catalyst project create` or `catalyst project link` or this command again with --project-uuid <uuid>.',\n );\n }\n\n await buildCatalystProject(projectUuid);\n });\n","/* eslint-disable no-underscore-dangle */\n\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getModuleCliPath() {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n return join(__dirname, '..');\n}\n","import { existsSync, readFileSync } from 'node:fs';\nimport { join } from 'node:path';\nimport { z } from 'zod';\n\nconst projectJsonSchema = z.looseObject({\n projectUuid: z.string().optional(),\n});\n\nconst packageJsonSchema = z.looseObject({\n dependencies: z.record(z.string(), z.string()).optional(),\n});\n\nexport interface ProjectState {\n projectUuid: string | undefined;\n hasMiddleware: boolean;\n hasProxy: boolean;\n hasOpenNextDep: boolean;\n\n // Derived signals — `isLinked` reflects intent (UUID registered via\n // `catalyst project create` or commerce-hosting setup); `isTransformed`\n // reflects on-disk readiness (middleware.ts swapped in, OpenNext dep\n // installed). A deploy needs both, but `catalyst build` only cares about\n // `isTransformed` so it can dispatch to OpenNext vs `next build`.\n isLinked: boolean;\n isTransformed: boolean;\n isFullySetUp: boolean;\n}\n\nconst safeReadJson = (path: string): unknown => {\n try {\n return JSON.parse(readFileSync(path, 'utf-8'));\n } catch {\n return null;\n }\n};\n\n// Read-only inspection of a Catalyst project at `cwd` (typically `core/`).\n// Avoids `getProjectConfig()` deliberately — that would instantiate `Conf`\n// and create `.bigcommerce/` as a side effect.\nexport function getProjectState(cwd: string = process.cwd()): ProjectState {\n const projectJson = projectJsonSchema.safeParse(\n safeReadJson(join(cwd, '.bigcommerce', 'project.json')),\n );\n const projectUuid = projectJson.success ? projectJson.data.projectUuid : undefined;\n\n const hasMiddleware = existsSync(join(cwd, 'middleware.ts'));\n const hasProxy = existsSync(join(cwd, 'proxy.ts'));\n\n const pkgJson = packageJsonSchema.safeParse(safeReadJson(join(cwd, 'package.json')));\n const hasOpenNextDep = pkgJson.success\n ? Boolean(pkgJson.data.dependencies?.['@opennextjs/cloudflare'])\n : false;\n\n const isLinked = Boolean(projectUuid);\n const isTransformed = hasMiddleware && !hasProxy && hasOpenNextDep;\n const isFullySetUp = isLinked && isTransformed;\n\n return {\n projectUuid,\n hasMiddleware,\n hasProxy,\n hasOpenNextDep,\n isLinked,\n isTransformed,\n isFullySetUp,\n };\n}\n","// The compatibility date, compatibility flags, Durable Object classes, and\n// migration tag below are mirrored in Ignition, which builds its own Worker\n// metadata at deploy time (pkg/cloudflare/upload/metadata.go and\n// pkg/cloudflare/upload/migrations/migrations.go). Keep both sides in sync\n// when changing any of them.\nexport function getCompatibilityDate(now = new Date()): string {\n const date = new Date(now);\n\n // One month behind the current date: recent enough to track Cloudflare\n // runtime behavior (per Cloudflare guidance), buffered enough to avoid\n // brand-new compatibility-date-gated changes. Ignition applies the same\n // offset at deploy time, so the bundle is never built against newer\n // semantics than it runs under.\n date.setUTCMonth(date.getUTCMonth() - 1);\n\n return date.toISOString().slice(0, 10);\n}\n\nexport function getWranglerConfig(projectUuid: string) {\n return {\n $schema: 'node_modules/wrangler/config-schema.json',\n main: '../.open-next/worker.js',\n name: `project-${projectUuid}`,\n compatibility_date: getCompatibilityDate(),\n compatibility_flags: ['nodejs_compat', 'global_fetch_strictly_public'],\n observability: {\n enabled: true,\n head_sampling_rate: 0.05,\n logs: {\n enabled: true,\n head_sampling_rate: 1,\n invocation_logs: false,\n },\n },\n assets: {\n directory: '../.open-next/assets',\n binding: 'ASSETS',\n },\n services: [\n {\n binding: 'WORKER_SELF_REFERENCE',\n service: `project-${projectUuid}`,\n },\n ],\n r2_buckets: [\n {\n binding: 'NEXT_INC_CACHE_R2_BUCKET',\n bucket_name: `project-${projectUuid}`,\n },\n ],\n durable_objects: {\n bindings: [\n {\n name: 'NEXT_CACHE_DO_QUEUE',\n class_name: 'DOQueueHandler',\n },\n {\n name: 'NEXT_TAG_CACHE_DO_SHARDED',\n class_name: 'DOShardedTagCache',\n },\n {\n name: 'NEXT_CACHE_DO_PURGE',\n class_name: 'BucketCachePurge',\n },\n ],\n },\n migrations: [\n {\n tag: 'v1',\n new_sqlite_classes: ['DOQueueHandler', 'DOShardedTagCache', 'BucketCachePurge'],\n },\n ],\n };\n}\n","import { select } from '@inquirer/prompts';\nimport { Command, InvalidArgumentError, Option } from 'commander';\nimport type Conf from 'conf';\nimport { colorize } from 'consola/utils';\nimport { outputFileSync } from 'fs-extra/esm';\nimport { join } from 'node:path';\n\nimport { runChannelSiteUrlFlow } from '../lib/channel-site-flow';\nimport {\n channelPlatformLabel,\n fetchAvailableChannels,\n getChannelInit,\n sortChannelsByPlatform,\n} from '../lib/channels';\nimport { NoLinkedProjectError } from '../lib/commerce-hosting';\nimport { parseEnvAssignment } from '../lib/env-config';\nimport { consola } from '../lib/logger';\nimport { LoginAbortedError, login as runInteractiveLogin } from '../lib/login';\nimport { getProjectConfig, type ProjectConfigSchema } from '../lib/project-config';\nimport { resolveCredentials } from '../lib/resolve-credentials';\nimport {\n accessTokenOption,\n apiHostOption,\n loginUrlOption,\n projectUuidOption,\n storeHashOption,\n} from '../lib/shared-options';\nimport { getTelemetry } from '../lib/telemetry';\n\nconst parseChannelId = (value: string): number => {\n const parsed = Number.parseInt(value, 10);\n\n if (Number.isNaN(parsed)) {\n throw new InvalidArgumentError(`\"${value}\" is not a valid channel ID (expected a number).`);\n }\n\n return parsed;\n};\n\n// Resolve credentials from flags/env → persisted project config → interactive\n// login (persisting on success). Returns null when the user aborts login.\n// `channel link` is an onboarding command — a fresh clone has neither\n// .env.local nor .bigcommerce/project.json — so it logs the user in like\n// `catalyst project create`, rather than erroring like the operational commands.\nasync function resolveCredentialsWithLogin(\n options: { storeHash?: string; accessToken?: string; loginUrl: string; apiHost: string },\n config: Conf<ProjectConfigSchema>,\n): Promise<{ storeHash: string; accessToken: string } | null> {\n const storeHash = options.storeHash ?? config.get('storeHash');\n const accessToken = options.accessToken ?? config.get('accessToken');\n\n if (storeHash && accessToken) {\n return { storeHash, accessToken };\n }\n\n try {\n const credentials = await runInteractiveLogin(options.loginUrl, options.apiHost);\n\n config.set('storeHash', credentials.storeHash);\n config.set('accessToken', credentials.accessToken);\n\n return credentials;\n } catch (error) {\n if (error instanceof LoginAbortedError) {\n return null;\n }\n\n throw error;\n }\n}\n\nconst update = new Command('update')\n .configureHelp({ showGlobalOptions: true })\n .description(\n \"Update a BigCommerce channel's site URL to point at one of your project's deployment hostnames.\",\n )\n .addHelpText(\n 'after',\n `\nExamples:\n # Pick a channel and hostname interactively\n $ catalyst channel update\n\n # Skip both prompts\n $ catalyst channel update --channel-id 123 --hostname my-storefront.example.com`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .addOption(\n new Option(\n '--channel-id <id>',\n 'Skip the channel prompt and target this channel directly.',\n ).argParser((value: string) => Number(value)),\n )\n .addOption(\n new Option(\n '--hostname <hostname>',\n \"Skip the hostname prompt and use this hostname directly. Must be one of the project's deployment_hostnames.\",\n ),\n )\n .action(async (options) => {\n const config = getProjectConfig();\n const { storeHash, accessToken } = resolveCredentials(options, config);\n\n await getTelemetry().identify(storeHash);\n\n try {\n await runChannelSiteUrlFlow({\n storeHash,\n accessToken,\n apiHost: options.apiHost,\n projectUuid: options.projectUuid ?? config.get('projectUuid'),\n channelId: options.channelId,\n hostname: options.hostname,\n });\n } catch (error) {\n if (error instanceof NoLinkedProjectError) {\n consola.info(\n \"When you're ready to create a project, run `catalyst project create` or re-run `catalyst channel update`.\",\n );\n process.exit(0);\n\n // Unreachable in production; prevents continuation when process.exit is mocked in tests.\n return;\n }\n\n throw error;\n }\n\n process.exit(0);\n });\n\nconst link = new Command('link')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Link this Catalyst project to a BigCommerce channel and write its credentials to .env.local.',\n )\n .addHelpText(\n 'after',\n `\nExamples:\n # Pick a channel interactively (logs you in if needed)\n $ catalyst channel link\n\n # Non-interactive\n $ catalyst channel link --store-hash <hash> --access-token <token> --channel-id 123\n\n # Append extra environment variables to .env.local\n $ catalyst channel link --channel-id 123 --env MY_FLAG=1`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(loginUrlOption())\n .addOption(\n new Option('--channel-id <id>', 'Link this channel directly, skipping the picker.').argParser(\n parseChannelId,\n ),\n )\n .option(\n '--env <vars...>',\n 'Arbitrary environment variables to set in .env.local. Format: KEY=VALUE (repeatable).',\n )\n .addOption(\n new Option('--cli-api-origin <origin>', 'Catalyst CLI API origin')\n .default('https://cxm-prd.bigcommerceapp.com')\n .hideHelp(),\n )\n .action(async (options) => {\n const config = getProjectConfig();\n\n const credentials = await resolveCredentialsWithLogin(options, config);\n\n if (!credentials) {\n consola.info(\n 'Login aborted. Re-run `catalyst channel link` when you have your credentials ready.',\n );\n process.exit(0);\n\n return;\n }\n\n const { storeHash, accessToken } = credentials;\n\n await getTelemetry().identify(storeHash);\n\n let channelId = options.channelId;\n let channelName: string | undefined;\n\n if (channelId === undefined) {\n const channels = await fetchAvailableChannels(storeHash, accessToken, options.apiHost);\n\n if (channels.length === 0) {\n consola.info(\n 'No storefront channels found on this store. Create one with `catalyst create` and try again.',\n );\n process.exit(0);\n\n return;\n }\n\n channelId = await select({\n message: 'Which channel would you like to link?',\n choices: sortChannelsByPlatform(channels).map((c) => ({\n name: c.name,\n value: c.id,\n description: channelPlatformLabel(c.platform),\n })),\n });\n\n channelName = channels.find((c) => c.id === channelId)?.name;\n }\n\n const initData = await getChannelInit(channelId, storeHash, accessToken, options.cliApiOrigin);\n\n const envVars: Record<string, string> = { ...initData.envVars };\n\n // Inline `--env KEY=VALUE` overrides win over the channel-provided values.\n if (options.env) {\n options.env.forEach((entry) => {\n const { key, value } = parseEnvAssignment(entry);\n\n envVars[key] = value;\n });\n }\n\n // Writes .env.local in the current working directory — `channel link`\n // runs from inside `core/`, the same place `dev`/`build`/`deploy` run.\n outputFileSync(\n join(process.cwd(), '.env.local'),\n `${Object.entries(envVars)\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n')}\\n`,\n );\n\n const label = channelName ? `\"${channelName}\" (${channelId})` : `${channelId}`;\n\n consola.success(\n `Linked to channel ${label} and wrote ${colorize('cyanBright', '.env.local')}.`,\n );\n consola.log(`Next steps:\\n\\n ${colorize('yellow', 'pnpm run dev')}`);\n\n process.exit(0);\n });\n\nexport const channel = new Command('channel')\n .configureHelp({ showGlobalOptions: true })\n .description('Manage BigCommerce channels.')\n .addCommand(link)\n .addCommand(update);\n","import { select } from '@inquirer/prompts';\n\nimport { type Channel, fetchAvailableChannels, updateChannelSiteUrl } from './channels';\nimport { selectOrCreateInfrastructureProject } from './commerce-hosting';\nimport { consola } from './logger';\nimport { fetchProjects, type ProjectListItem } from './project';\n\nexport interface ChannelSiteFlowOptions {\n storeHash: string;\n accessToken: string;\n apiHost: string;\n // Linked project UUID (from --project-uuid or .bigcommerce/project.json). When\n // present and resolvable, skips the project picker; otherwise falls back to\n // `selectOrCreateInfrastructureProject`, which may throw NoLinkedProjectError\n // (caller decides how to surface it).\n projectUuid?: string;\n // Non-interactive overrides. When supplied, the corresponding prompt is\n // skipped.\n channelId?: number;\n hostname?: string;\n // When set, this hostname is pre-selected in the hostname prompt. Used by\n // `catalyst deploy --update-site-url` to default to the freshly-deployed\n // hostname.\n preferHostname?: string;\n}\n\nasync function resolveProject(options: ChannelSiteFlowOptions): Promise<ProjectListItem> {\n const api = {\n storeHash: options.storeHash,\n accessToken: options.accessToken,\n apiHost: options.apiHost,\n };\n\n if (options.projectUuid) {\n const projects = await fetchProjects(api.storeHash, api.accessToken, api.apiHost);\n const matched = projects.find((p) => p.uuid === options.projectUuid);\n\n if (matched) return matched;\n\n consola.warn(\n `Project ${options.projectUuid} not found on this store. Pick another to continue.`,\n );\n }\n\n return selectOrCreateInfrastructureProject(api, options.projectUuid);\n}\n\nasync function resolveChannel(\n options: ChannelSiteFlowOptions,\n): Promise<{ id: number; name?: string }> {\n if (options.channelId !== undefined) {\n return { id: options.channelId };\n }\n\n consola.start('Fetching channels...');\n\n const channels = await fetchAvailableChannels(\n options.storeHash,\n options.accessToken,\n options.apiHost,\n );\n\n consola.success('Channels fetched.');\n\n // Only Catalyst-platform channels can meaningfully be pointed at a Catalyst\n // deployment hostname; other storefront platforms (Stencil, etc.) are\n // filtered out so the picker stays focused.\n const catalystChannels = channels.filter((c: Channel) => c.platform === 'catalyst');\n\n if (catalystChannels.length === 0) {\n throw new Error(\n 'No Catalyst channels found on this store. Create one with `catalyst create` and try again.',\n );\n }\n\n const id = await select({\n message: 'Select the channel to update.',\n choices: catalystChannels.map((c: Channel) => ({\n name: c.name,\n value: c.id,\n description: `id: ${c.id}`,\n })),\n });\n\n const matched = catalystChannels.find((c) => c.id === id);\n\n return { id, name: matched?.name };\n}\n\nasync function resolveHostname(\n project: ProjectListItem,\n options: ChannelSiteFlowOptions,\n): Promise<string> {\n if (options.hostname) {\n return options.hostname;\n }\n\n if (project.deployment_hostnames.length === 0) {\n throw new Error(\n `Project \"${project.name}\" has no deployment hostnames yet. Run \\`catalyst deploy\\` first to create one.`,\n );\n }\n\n // When the caller knows which hostname they want surfaced first (e.g. the\n // freshly-deployed one from `catalyst deploy --update-site-url`), order it to\n // the top of the list so it's the default selection.\n const ordered = options.preferHostname\n ? [\n ...project.deployment_hostnames.filter((h) => h === options.preferHostname),\n ...project.deployment_hostnames.filter((h) => h !== options.preferHostname),\n ]\n : project.deployment_hostnames;\n\n const selected = await select({\n message: 'Select the hostname to point the channel at.',\n choices: ordered.map((h) => ({ name: h, value: h })),\n });\n\n return selected;\n}\n\nexport async function runChannelSiteUrlFlow(options: ChannelSiteFlowOptions): Promise<void> {\n const project = await resolveProject(options);\n const channel = await resolveChannel(options);\n const hostname = await resolveHostname(project, options);\n const siteUrl = hostname.startsWith('https://') ? hostname : `https://${hostname}`;\n\n await updateChannelSiteUrl(\n channel.id,\n siteUrl,\n options.storeHash,\n options.accessToken,\n options.apiHost,\n );\n\n const channelLabel = channel.name ? `\"${channel.name}\" (${channel.id})` : String(channel.id);\n\n consola.success(`Updated channel ${channelLabel} site URL to ${siteUrl}.`);\n}\n","import { z } from 'zod';\n\nimport { assertAuthorized } from './auth-errors';\nimport { getTelemetry } from './telemetry';\n\n// `origin` is the CLI-API gateway (configured via `--cli-api-origin`, default\n// `https://cxm-prd.bigcommerceapp.com`). Distinct from `apiHost` used for the\n// BC store API (api.bigcommerce.com).\nconst cliApiUrl = (origin: string, storeHash: string, path: string) =>\n `${origin}/stores/${storeHash}/cli-api/v3${path}`;\n\nconst channelsUrl = (storeHash: string, apiHost: string, query: Record<string, string> = {}) => {\n const params = new URLSearchParams(query).toString();\n\n return `https://${apiHost}/stores/${storeHash}/v3/channels${params ? `?${params}` : ''}`;\n};\n\nconst authHeaders = (accessToken: string) => ({\n 'X-Auth-Token': accessToken,\n 'X-Correlation-Id': getTelemetry().correlationId,\n Accept: 'application/json',\n});\n\n// envVars values are coerced to strings: the BC API returns mixed primitives\n// (e.g. BIGCOMMERCE_CHANNEL_ID is a number) but they all end up in .env.local as text.\nconst envVarsSchema = z.record(z.string(), z.coerce.string());\n\nconst channelSchema = z.object({\n id: z.number(),\n name: z.string(),\n platform: z.string(),\n});\n\nexport type Channel = z.infer<typeof channelSchema>;\n\nconst channelsResponseSchema = z.object({\n data: z.array(channelSchema),\n});\n\n// Channels are surfaced Catalyst-first, then Next, then Stencil\n// (`bigcommerce`), then anything else — the order the `create` and\n// `channel link` pickers both present. Returns a sorted copy.\nconst CHANNEL_PLATFORM_ORDER = ['catalyst', 'next', 'bigcommerce'];\n\nexport function sortChannelsByPlatform(channels: Channel[]): Channel[] {\n return [...channels].sort((a, b) => {\n const aIndex = CHANNEL_PLATFORM_ORDER.indexOf(a.platform);\n const bIndex = CHANNEL_PLATFORM_ORDER.indexOf(b.platform);\n\n if (aIndex === -1 && bIndex === -1) return 0;\n if (aIndex === -1) return 1;\n if (bIndex === -1) return -1;\n\n return aIndex - bIndex;\n });\n}\n\n// Human-friendly platform name for channel pickers. `bigcommerce` is the\n// Stencil storefront platform; everything else is title-cased.\nexport function channelPlatformLabel(platform: string): string {\n return platform === 'bigcommerce'\n ? 'Stencil'\n : platform.charAt(0).toUpperCase() + platform.slice(1);\n}\n\nconst initResponseSchema = z.object({\n data: z.object({\n storefront_api_token: z.string(),\n envVars: envVarsSchema,\n }),\n});\n\nconst createChannelResponseSchema = z.object({\n data: z.object({\n id: z.number(),\n storefront_api_token: z.string(),\n envVars: envVarsSchema,\n }),\n});\n\nconst eligibilityResponseSchema = z.object({\n data: z.object({\n eligible: z.boolean(),\n message: z.string(),\n }),\n});\n\nconst channelSiteSchema = z.object({\n data: z.object({\n id: z.number(),\n url: z.string(),\n channel_id: z.number(),\n }),\n});\n\nexport interface ChannelInit {\n storefrontToken: string;\n envVars: Record<string, string>;\n}\n\nexport async function getChannelInit(\n channelId: number | string,\n storeHash: string,\n accessToken: string,\n origin: string,\n): Promise<ChannelInit> {\n const response = await fetch(cliApiUrl(origin, storeHash, `/channels/${channelId}/init`), {\n method: 'GET',\n headers: authHeaders(accessToken),\n });\n\n if (!response.ok) {\n throw new Error(\n `GET /channels/${channelId}/init failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const { data } = initResponseSchema.parse(await response.json());\n\n return { storefrontToken: data.storefront_api_token, envVars: data.envVars };\n}\n\nexport interface ChannelEligibility {\n eligible: boolean;\n message: string;\n}\n\nexport async function checkChannelEligibility(\n storeHash: string,\n accessToken: string,\n origin: string,\n): Promise<ChannelEligibility> {\n const response = await fetch(cliApiUrl(origin, storeHash, '/channels/catalyst/eligibility'), {\n method: 'GET',\n headers: authHeaders(accessToken),\n });\n\n if (!response.ok) {\n throw new Error(\n `GET /channels/catalyst/eligibility failed: ${response.status} ${response.statusText}`,\n );\n }\n\n return eligibilityResponseSchema.parse(await response.json()).data;\n}\n\nexport interface CreatedChannel {\n channelId: number;\n storefrontToken: string;\n envVars: Record<string, string>;\n}\n\nexport async function createChannel(\n name: string,\n storefrontLocale: string,\n additionalLocales: string[],\n installSampleData: boolean,\n storeHash: string,\n accessToken: string,\n origin: string,\n): Promise<CreatedChannel> {\n const response = await fetch(cliApiUrl(origin, storeHash, '/channels/catalyst'), {\n method: 'POST',\n headers: { ...authHeaders(accessToken), 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name,\n initialData: { type: installSampleData ? 'sample' : 'none' },\n deployStorefront: true,\n devOrigin: 'http://localhost:3000',\n storefrontLanguage: storefrontLocale,\n additionalLocales,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`POST /channels/catalyst failed: ${response.status} ${response.statusText}`);\n }\n\n const { data } = createChannelResponseSchema.parse(await response.json());\n\n return {\n channelId: data.id,\n storefrontToken: data.storefront_api_token,\n envVars: data.envVars,\n };\n}\n\nexport async function fetchAvailableChannels(\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<Channel[]> {\n const response = await fetch(\n channelsUrl(storeHash, apiHost, { available: 'true', type: 'storefront' }),\n {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n 'X-Correlation-Id': getTelemetry().correlationId,\n Accept: 'application/json',\n },\n },\n );\n\n assertAuthorized(response);\n\n if (!response.ok) {\n throw new Error(`GET /v3/channels failed: ${response.status} ${response.statusText}`);\n }\n\n return channelsResponseSchema.parse(await response.json()).data;\n}\n\nexport interface ChannelSite {\n id: number;\n url: string;\n channelId: number;\n}\n\nexport async function updateChannelSiteUrl(\n channelId: number,\n siteUrl: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<ChannelSite> {\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/channels/${channelId}/site`,\n {\n method: 'PUT',\n headers: {\n 'X-Auth-Token': accessToken,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-Correlation-Id': getTelemetry().correlationId,\n },\n body: JSON.stringify({ url: siteUrl }),\n },\n );\n\n if (response.status === 401 || response.status === 403) {\n throw new Error(\n `Failed to update channel site (${response.status}). Re-run \\`catalyst auth login\\` to refresh your access token with the store_channel_settings scope.`,\n );\n }\n\n if (!response.ok) {\n throw new Error(`Failed to update channel site: ${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const { data } = channelSiteSchema.parse(res);\n\n return { id: data.id, url: data.url, channelId: data.channel_id };\n}\n","import { confirm, input, select, Separator } from '@inquirer/prompts';\nimport { colorize } from 'consola/utils';\nimport { existsSync, mkdirSync, readFileSync, unlinkSync, writeFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { z } from 'zod';\n\nimport { consola } from './logger';\nimport {\n createProject,\n fetchProjects,\n InfrastructureProjectValidationError,\n type ProjectListItem,\n} from './project';\nimport { sortPackageJsonFields } from './sort-package-json';\n\nconst OPENNEXT_CLOUDFLARE_VERSION = '1.17.3';\n\nconst corePackageJsonSchema = z.looseObject({\n dependencies: z.record(z.string(), z.string()).optional(),\n});\n\nconst writeJson = (path: string, value: unknown) => {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(value, null, 2)}\\n`);\n};\n\nconst convertProxyToMiddleware = (projectDir: string) => {\n const proxyPath = join(projectDir, 'proxy.ts');\n const middlewarePath = join(projectDir, 'middleware.ts');\n\n if (!existsSync(proxyPath)) return;\n\n const contents = readFileSync(proxyPath, 'utf-8')\n .replace('export const proxy', 'export const middleware')\n .replace('export const config = {', \"export const config = {\\n runtime: 'experimental-edge',\");\n\n writeFileSync(middlewarePath, contents);\n unlinkSync(proxyPath);\n};\n\n// The default `instrumentation.ts` registers `@vercel/otel`, whose node\n// build OpenNext bundles into the worker chunk; workerd then throws on cold\n// start with \"Failed to prepare server\". A Vercel-deploying user may have\n// customized the hook though, so we prompt before removing it (and only drop\n// `@vercel/otel` if the user agrees — their customization probably imports it).\n// In non-TTY contexts (CI deploys, scripts), skip the cleanup with a warning so\n// no customization is silently wiped. Exported because callers run this on\n// already-transformed projects too, where `setupCommerceHosting` would\n// short-circuit.\nexport const cleanupCloudflareIncompatibilities = async (projectDir: string) => {\n const instrumentationPath = join(projectDir, 'instrumentation.ts');\n\n if (!existsSync(instrumentationPath)) return;\n\n if (!process.stdin.isTTY) {\n consola.warn(\n 'instrumentation.ts is present and may be incompatible with the Cloudflare Workers ' +\n 'bundle (the default @vercel/otel scaffolding throws at cold start under workerd). ' +\n 'Skipping automatic cleanup in non-interactive mode — re-run interactively to remove it, ' +\n 'or delete/gate it manually.',\n );\n\n return;\n }\n\n const shouldRemove = await confirm({\n message:\n 'Catalyst found instrumentation.ts, which is incompatible with the Cloudflare Workers ' +\n 'bundle when it uses @vercel/otel (causes \"Failed to prepare server\" at cold start). ' +\n 'Remove it and drop @vercel/otel from package.json?',\n default: true,\n });\n\n if (!shouldRemove) {\n consola.info(\n 'Leaving instrumentation.ts in place. The Cloudflare worker will continue to log ' +\n '\"Failed to prepare server\" at cold start until this is resolved manually.',\n );\n\n return;\n }\n\n unlinkSync(instrumentationPath);\n consola.info('Removed instrumentation.ts (incompatible with Cloudflare Workers).');\n\n const corePackageJsonPath = join(projectDir, 'package.json');\n\n if (existsSync(corePackageJsonPath)) {\n const pkg = corePackageJsonSchema.parse(JSON.parse(readFileSync(corePackageJsonPath, 'utf-8')));\n\n if (pkg.dependencies && '@vercel/otel' in pkg.dependencies) {\n const { '@vercel/otel': _removedVercelOtel, ...preservedDeps } = pkg.dependencies;\n\n pkg.dependencies = preservedDeps;\n writeJson(corePackageJsonPath, sortPackageJsonFields(pkg));\n consola.info('Dropped @vercel/otel from package.json.');\n }\n }\n};\n\nexport const setupCommerceHosting = async ({\n projectDir,\n projectUuid,\n storeHash,\n accessToken,\n}: {\n projectDir: string;\n projectUuid: string;\n storeHash?: string;\n accessToken?: string;\n}) => {\n await cleanupCloudflareIncompatibilities(projectDir);\n\n const corePackageJsonPath = join(projectDir, 'package.json');\n const pkg = corePackageJsonSchema.parse(JSON.parse(readFileSync(corePackageJsonPath, 'utf-8')));\n\n pkg.dependencies = {\n ...pkg.dependencies,\n '@opennextjs/cloudflare': OPENNEXT_CLOUDFLARE_VERSION,\n };\n\n writeJson(corePackageJsonPath, sortPackageJsonFields(pkg));\n\n const projectJson: Record<string, string> = {\n projectUuid,\n framework: 'catalyst',\n };\n\n if (storeHash) projectJson.storeHash = storeHash;\n if (accessToken) projectJson.accessToken = accessToken;\n\n writeJson(join(projectDir, '.bigcommerce', 'project.json'), projectJson);\n\n convertProxyToMiddleware(projectDir);\n};\n\ninterface CommerceHostingApiContext {\n storeHash: string;\n accessToken: string;\n apiHost: string;\n}\n\n// Thrown by `selectOrCreateInfrastructureProject` when the user declines the\n// \"Would you like to create one?\" prompt that surfaces when no projects exist.\n// Callers translate this into a context-appropriate error (e.g. \"Cannot deploy\n// without being linked to a project\").\nexport class NoLinkedProjectError extends Error {\n constructor() {\n super('No infrastructure project linked: user declined to create one.');\n this.name = 'NoLinkedProjectError';\n }\n}\n\nasync function promptForNewProjectName(api: CommerceHostingApiContext): Promise<ProjectListItem> {\n const newProjectName = await input({ message: 'Enter a name for the new project:' });\n\n const data = await createProject(newProjectName, api.storeHash, api.accessToken, api.apiHost);\n\n consola.success(`Project \"${data.name}\" created successfully.`);\n\n // Newly created — provisioning is async, hostnames not registered yet.\n return { uuid: data.uuid, name: data.name, deployment_hostnames: [] };\n}\n\n// Generic \"select an existing project, or create a new one\" prompt — used by\n// `catalyst project link` and by `catalyst deploy` when its linked project is\n// missing. Distinct from `promptForCommerceHostingProject` which has\n// default-name + auto-create semantics tailored to `catalyst create`.\n//\n// Pass `linkedProjectUuid` to decorate the matching project's label with\n// `[linked]` so the user can see which one is the current selection.\nexport async function selectOrCreateInfrastructureProject(\n api: CommerceHostingApiContext,\n linkedProjectUuid?: string,\n): Promise<ProjectListItem> {\n consola.start('Fetching projects...');\n\n const existingProjects = await fetchProjects(api.storeHash, api.accessToken, api.apiHost);\n\n consola.success('Projects fetched.');\n\n // No existing projects on the store — skip the select prompt and offer\n // creation directly. Declining means we have nothing to link to.\n if (existingProjects.length === 0) {\n const shouldCreate = await confirm({\n message:\n 'There are not any hosting projects that you can link to yet. Would you like to create one?',\n default: true,\n });\n\n if (!shouldCreate) {\n throw new NoLinkedProjectError();\n }\n\n return promptForNewProjectName(api);\n }\n\n const choices = [\n ...existingProjects.map((p) => ({\n name: p.uuid === linkedProjectUuid ? `${p.name} ${colorize('green', '[linked]')}` : p.name,\n value: p.uuid,\n description: p.uuid,\n })),\n {\n name: 'Create a new project',\n value: 'create',\n description: 'Create a new hosting project for this Catalyst storefront.',\n },\n ];\n\n const selected = await select({\n message: 'Select a project or create a new project (Press <enter> to select).',\n choices,\n });\n\n if (selected === 'create') {\n return promptForNewProjectName(api);\n }\n\n const matched = existingProjects.find((p) => p.uuid === selected);\n\n if (!matched) {\n throw new Error(`Selected project ${String(selected)} not found in fetched list.`);\n }\n\n return matched;\n}\n\nexport async function promptForCommerceHostingProject(\n api: CommerceHostingApiContext,\n defaultName: string,\n autoUseDefaultName?: boolean,\n useExistingOnCollision?: boolean,\n): Promise<ProjectListItem> {\n const existingProjects = await fetchProjects(api.storeHash, api.accessToken, api.apiHost);\n const takenNames = existingProjects.map((project) => project.name);\n\n if (autoUseDefaultName) {\n return autoCreateCommerceHostingProject(\n api,\n defaultName,\n existingProjects,\n useExistingOnCollision,\n );\n }\n\n const conflict = existingProjects.find(\n (project) => project.name.toLowerCase() === defaultName.toLowerCase(),\n );\n\n if (!conflict) {\n return autoCreateCommerceHostingProject(\n api,\n defaultName,\n existingProjects,\n useExistingOnCollision,\n );\n }\n\n type Action = 'use-named' | 'select-from-list' | 'create';\n\n const hasOtherProjects = existingProjects.length > 1;\n\n const choices: Array<{ name: string; value: Action }> = [\n { name: `Use \"${conflict.name}\"`, value: 'use-named' },\n ];\n\n if (hasOtherProjects) {\n choices.push({ name: 'Select from my projects', value: 'select-from-list' });\n }\n\n choices.push({ name: 'Create a new project', value: 'create' });\n\n const action = await select<Action>({\n message: hasOtherProjects\n ? `It looks like you already have an existing Commerce Hosting project named \"${conflict.name}\". Would you like to use it, select from your projects, or create a new one?`\n : `It looks like you already have an existing Commerce Hosting project named \"${conflict.name}\". Would you like to use it, or create a new one?`,\n choices,\n });\n\n if (action === 'use-named') {\n consola.success(`Using existing Commerce Hosting project \"${conflict.name}\"`);\n\n return conflict;\n }\n\n if (action === 'create') {\n return promptAndCreateCommerceHostingProject(api, takenNames, defaultName);\n }\n\n const selected = await select<ProjectListItem | 'create-new'>({\n message: 'Which Commerce Hosting project would you like to use?',\n choices: [\n ...existingProjects.map((project) => ({\n name: project.name,\n value: project,\n description: project.uuid,\n })),\n new Separator(),\n { name: 'Create a new project', value: 'create-new' as const },\n ],\n });\n\n if (selected === 'create-new') {\n return promptAndCreateCommerceHostingProject(api, takenNames, defaultName);\n }\n\n consola.success(`Using existing Commerce Hosting project \"${selected.name}\"`);\n\n return selected;\n}\n\nexport async function promptAndCreateCommerceHostingProject(\n api: CommerceHostingApiContext,\n takenNames: readonly string[],\n defaultName?: string,\n): Promise<ProjectListItem> {\n const projectName = await input({\n message: 'What would you like to name your Commerce Hosting project?',\n default: defaultName,\n validate: (value) => {\n const trimmed = value.trim();\n\n if (!trimmed) return 'Project name is required';\n\n const conflict = takenNames.find((taken) => taken.toLowerCase() === trimmed.toLowerCase());\n\n if (conflict) {\n return `A Commerce Hosting project named \"${conflict}\" already exists`;\n }\n\n return true;\n },\n theme: {\n style: {\n help: () =>\n colorize(\n 'dim',\n '(The project that hosts your storefront on Commerce — often matches your folder name.)',\n ),\n },\n },\n });\n\n try {\n const created = await createProject(\n projectName.trim(),\n api.storeHash,\n api.accessToken,\n api.apiHost,\n );\n\n consola.success(`Commerce Hosting project \"${created.name}\" created successfully`);\n\n return { uuid: created.uuid, name: created.name, deployment_hostnames: [] };\n } catch (error) {\n if (error instanceof InfrastructureProjectValidationError) {\n consola.error(error.message);\n\n return promptAndCreateCommerceHostingProject(api, takenNames, defaultName);\n }\n\n throw error;\n }\n}\n\nasync function resolveCollisionChoice(\n existingName: string,\n useExistingOnCollision: boolean | undefined,\n): Promise<boolean> {\n if (useExistingOnCollision === true) return true;\n\n if (!process.stdin.isTTY) return false;\n\n return select<boolean>({\n message: `A Commerce Hosting project named \"${existingName}\" already exists. Use the existing project?`,\n choices: [\n { name: 'Yes', value: true },\n { name: 'No', value: false },\n ],\n });\n}\n\nasync function autoCreateCommerceHostingProject(\n api: CommerceHostingApiContext,\n name: string,\n existingProjects: readonly ProjectListItem[],\n useExistingOnCollision?: boolean,\n): Promise<ProjectListItem> {\n const existing = existingProjects.find(\n (project) => project.name.toLowerCase() === name.toLowerCase(),\n );\n\n if (existing) {\n const shouldUseExisting = await resolveCollisionChoice(existing.name, useExistingOnCollision);\n\n if (shouldUseExisting) {\n consola.success(`Using existing Commerce Hosting project \"${existing.name}\"`);\n\n return existing;\n }\n\n consola.error(\n 'Not reusing the existing project. Re-run with a different --project-name, or pass --use-existing to reuse it.',\n );\n process.exit(1);\n }\n\n try {\n const created = await createProject(name, api.storeHash, api.accessToken, api.apiHost);\n\n consola.success(`Commerce Hosting project \"${created.name}\" created successfully`);\n\n return { uuid: created.uuid, name: created.name, deployment_hostnames: [] };\n } catch (error) {\n if (error instanceof InfrastructureProjectValidationError) {\n consola.error(\n `Failed to create Commerce Hosting project \"${name}\": ${error.message}\\nRe-run with a different --project-name.`,\n );\n process.exit(1);\n }\n\n throw error;\n }\n}\n\n// Orchestrates prompt + file mutations. Callable from `catalyst create --hosting commerce`\n// (eager) and `catalyst deploy` (lazy). Idempotent — safe to re-run.\nexport async function runCommerceHostingSetup({\n api,\n projectDir,\n defaultProjectName,\n autoUseProjectName,\n useExistingOnCollision,\n}: {\n api: CommerceHostingApiContext;\n projectDir: string;\n defaultProjectName: string;\n autoUseProjectName?: boolean;\n useExistingOnCollision?: boolean;\n}): Promise<ProjectListItem> {\n const project = await promptForCommerceHostingProject(\n api,\n defaultProjectName,\n autoUseProjectName,\n useExistingOnCollision,\n );\n\n await setupCommerceHosting({\n projectDir,\n projectUuid: project.uuid,\n storeHash: api.storeHash,\n accessToken: api.accessToken,\n });\n\n return project;\n}\n","// Canonical order for top-level fields in core/package.json. Anything not in\n// this list is appended afterwards in its original position relative to other\n// unknown keys, so we don't drop or reshuffle uncommon fields like `keywords`.\nconst FIELD_ORDER = [\n 'name',\n 'description',\n 'version',\n 'private',\n 'engines',\n 'scripts',\n 'dependencies',\n 'devDependencies',\n] as const;\n\nexport function sortPackageJsonFields<T extends Record<string, unknown>>(pkg: T): T {\n const ordered: Record<string, unknown> = {};\n\n FIELD_ORDER.forEach((field) => {\n if (field in pkg) {\n ordered[field] = pkg[field];\n }\n });\n\n Object.keys(pkg).forEach((key) => {\n if (!(key in ordered)) {\n ordered[key] = pkg[key];\n }\n });\n\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n return ordered as T;\n}\n","import type Conf from 'conf';\n\nimport { ProjectConfigSchema } from './project-config';\n\n// A single deployment environment variable as the infrastructure API expects\n// it. We only persist/send `secret` vars today (see ProjectConfigSchema.env).\nexport interface DeploymentSecret {\n type: 'secret';\n key: string;\n value: string;\n}\n\n// Matches POSIX-ish env var names: leading letter/underscore, then\n// letters/digits/underscores. Keeps the stored config (and the deployment\n// payload) free of keys that wouldn't be valid env vars at runtime.\nconst ENV_KEY_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n// Parse a single `KEY=VALUE` assignment. Splits on the *first* `=` only, so\n// values containing `=` (e.g. base64 or tokens) survive intact. Validates the\n// key shape and rejects empty values.\nexport const parseEnvAssignment = (input: string): { key: string; value: string } => {\n const separatorIndex = input.indexOf('=');\n\n if (separatorIndex === -1) {\n throw new Error(`Invalid env var format: ${input}. Expected format: KEY=VALUE`);\n }\n\n const key = input.slice(0, separatorIndex).trim();\n const value = input.slice(separatorIndex + 1).trim();\n\n if (!key || !value) {\n throw new Error(`Invalid env var format: ${input}. Expected format: KEY=VALUE`);\n }\n\n if (!ENV_KEY_PATTERN.test(key)) {\n throw new Error(\n `Invalid env var name: ${key}. Names must start with a letter or underscore and contain only letters, numbers, and underscores.`,\n );\n }\n\n return { key, value };\n};\n\n// Read the persisted env var map (KEY -> VALUE), defaulting to empty.\nexport const getStoredEnv = (config: Conf<ProjectConfigSchema>): Record<string, string> => {\n return config.get('env') ?? {};\n};\n\n// Convert a persisted env var map into the deployment `secret` payload shape.\nexport const toDeploymentSecrets = (envVars: Record<string, string>): DeploymentSecret[] => {\n return Object.entries(envVars).map(([key, value]) => ({ type: 'secret', key, value }));\n};\n\n// Merge persisted secrets with inline `--secret` flag secrets, keyed by name.\n// Inline flags win on conflict so users can override a stored value per-run.\nexport const mergeDeploymentSecrets = (\n persisted: DeploymentSecret[],\n flagSecrets: DeploymentSecret[],\n): DeploymentSecret[] => {\n const byKey = new Map<string, DeploymentSecret>();\n\n persisted.forEach((secret) => byKey.set(secret.key, secret));\n flagSecrets.forEach((secret) => byKey.set(secret.key, secret));\n\n return Array.from(byKey.values());\n};\n","import Conf from 'conf';\n\nimport { consola } from './logger';\nimport { ProjectConfigSchema } from './project-config';\n\nexport function resolveCredentials(\n options: { storeHash?: string; accessToken?: string },\n config: Conf<ProjectConfigSchema>,\n): { storeHash: string; accessToken: string } {\n const storeHash = options.storeHash ?? config.get('storeHash');\n const accessToken = options.accessToken ?? config.get('accessToken');\n\n if (!storeHash || !accessToken) {\n consola.error('Missing credentials.');\n consola.info(\n 'Run `catalyst auth login`, or provide --store-hash and --access-token flags (or set CATALYST_STORE_HASH and CATALYST_ACCESS_TOKEN environment variables).',\n );\n process.exit(1);\n\n // Unreachable in production; prevents continuation when process.exit is mocked in tests.\n throw new Error('Missing credentials');\n }\n\n return { storeHash, accessToken };\n}\n","import { Command, InvalidArgumentError, Option } from '@commander-js/extra-typings';\nimport { checkbox, input, select } from '@inquirer/prompts';\nimport { execSync } from 'child_process';\nimport { colorize } from 'consola/utils';\nimport { pathExistsSync } from 'fs-extra/esm';\nimport kebabCase from 'lodash.kebabcase';\nimport { join } from 'path';\n\nimport { DEFAULT_LOGIN_URL } from '../lib/auth';\nimport {\n channelPlatformLabel,\n checkChannelEligibility,\n createChannel,\n fetchAvailableChannels,\n getChannelInit,\n sortChannelsByPlatform,\n} from '../lib/channels';\nimport { promptForCommerceHostingProject, setupCommerceHosting } from '../lib/commerce-hosting';\nimport { detectPackageManager } from '../lib/detect-package-manager';\nimport { extractCatalyst } from '../lib/extract-catalyst';\nimport { initGitRepo } from '../lib/init-git-repo';\nimport { installDependencies } from '../lib/install-dependencies';\nimport { getAvailableLocales } from '../lib/localization';\nimport { consola } from '../lib/logger';\nimport { login, LoginAbortedError } from '../lib/login';\nimport { hasProjectsAccess, type ProjectListItem } from '../lib/project';\nimport { rewriteCorePackage } from '../lib/rewrite-core-package';\nimport { setupCoreProject } from '../lib/setup-core-project';\nimport { accessTokenOption, storeHashOption } from '../lib/shared-options';\nimport { getTelemetry } from '../lib/telemetry';\nimport { writeEnv } from '../lib/write-env';\n\nfunction getPlatformCheckCommand(command: string): string {\n const isWindows = process.platform === 'win32';\n\n return isWindows ? `where.exe ${command}` : `which ${command}`;\n}\n\nfunction parseChannelId(value: string): number {\n const parsed = parseInt(value, 10);\n\n if (Number.isNaN(parsed)) {\n throw new InvalidArgumentError(`\"${value}\" is not a valid channel ID (expected a number).`);\n }\n\n return parsed;\n}\n\n// Variadic argParser: called once per `--env KEY=VALUE`, accumulating into a\n// merged record. Splits on the first `=` so values containing `=` are preserved.\nfunction parseEnvFlag(\n value: string,\n previous: Record<string, string> = {},\n): Record<string, string> {\n const eqIdx = value.indexOf('=');\n\n if (eqIdx <= 0) {\n throw new InvalidArgumentError(`Expected KEY=VALUE, got \"${value}\".`);\n }\n\n const key = value.substring(0, eqIdx);\n const val = value.substring(eqIdx + 1);\n\n if (!val) {\n throw new InvalidArgumentError(`Expected KEY=VALUE with non-empty value, got \"${value}\".`);\n }\n\n return { ...previous, [key]: val };\n}\n\nasync function handleChannelCreation(\n storeHash: string,\n accessToken: string,\n apiHost: string,\n cliApiOrigin: string,\n) {\n const newChannelName = await input({\n message: 'What would you like to name your new channel?',\n });\n\n const availableLocales = await getAvailableLocales(storeHash, accessToken, apiHost);\n\n const storefrontLocale = await select({\n message: 'Which default language would you like to set for your channel?',\n default: 'en',\n choices: availableLocales,\n theme: {\n style: {\n help: () => colorize('dim', '(Select locale from the list or start typing the name)'),\n },\n },\n });\n\n const shouldAddAdditionalLocales = await select({\n message: 'Would you like to add additional languages?',\n choices: [\n { name: 'Yes', value: true },\n { name: 'No', value: false },\n ],\n });\n\n let additionalLocales: string[] = [];\n\n if (shouldAddAdditionalLocales) {\n const localeChoices = availableLocales\n .filter(({ value }) => value !== storefrontLocale)\n .map(({ name, value }) => ({ name, value, description: value }));\n\n additionalLocales = await checkbox({\n message: 'Which additional languages would you like to add to your channel?',\n choices: localeChoices,\n validate: (items) => items.length <= 4 || 'You can only select up to 4 additional languages.',\n });\n }\n\n const shouldInstallSampleData = await select({\n message: 'Would you like to install sample data?',\n choices: [\n { name: 'Yes', value: true },\n { name: 'No', value: false },\n ],\n });\n\n return createChannel(\n newChannelName,\n storefrontLocale,\n additionalLocales,\n shouldInstallSampleData,\n storeHash,\n accessToken,\n cliApiOrigin,\n );\n}\n\nasync function handleChannelSelection(storeHash: string, accessToken: string, apiHost: string) {\n const channels = await fetchAvailableChannels(storeHash, accessToken, apiHost);\n\n const existingChannel = await select({\n message: 'Which channel would you like to use?',\n choices: sortChannelsByPlatform(channels).map((ch) => ({\n name: ch.name,\n value: ch,\n description: `Channel Platform: ${channelPlatformLabel(ch.platform)}`,\n })),\n });\n\n return existingChannel.id;\n}\n\nasync function setupProject(options: {\n projectName?: string;\n projectDir: string;\n}): Promise<{ projectName: string; projectDir: string }> {\n let { projectName, projectDir } = options;\n\n if (!pathExistsSync(projectDir)) {\n consola.error(`--project-dir ${projectDir} is not a valid path`);\n process.exit(1);\n }\n\n if (projectName) {\n projectName = kebabCase(projectName);\n projectDir = join(options.projectDir, projectName);\n\n if (pathExistsSync(projectDir)) {\n consola.error(`${projectDir} already exists`);\n process.exit(1);\n }\n }\n\n if (!projectName) {\n const validateProjectName = (i: string) => {\n const formatted = kebabCase(i);\n\n if (!formatted) return 'Project name is required';\n\n const targetDir = join(options.projectDir, formatted);\n\n if (pathExistsSync(targetDir)) return `Destination '${targetDir}' already exists`;\n\n projectName = formatted;\n projectDir = targetDir;\n\n return true;\n };\n\n await input({\n message: 'What do you want to name your project directory?',\n default: 'my-catalyst-app',\n validate: validateProjectName,\n });\n }\n\n if (!projectName) throw new Error('Something went wrong, projectName is not defined');\n if (!projectDir) throw new Error('Something went wrong, projectDir is not defined');\n\n return { projectName, projectDir };\n}\n\nfunction checkRequiredTools() {\n try {\n execSync(getPlatformCheckCommand('git'), { stdio: 'ignore' });\n } catch {\n consola.error('git is required to create a Catalyst project');\n process.exit(1);\n }\n}\n\nexport const create = new Command('create')\n .configureHelp({ showGlobalOptions: true })\n .description('Scaffold and connect a Catalyst storefront to your BigCommerce store.')\n .addHelpText(\n 'after',\n `\nExamples:\n # Interactive scaffold (default — self-hosted, no hosting prompt)\n $ catalyst create\n\n # Non-interactive: skip the project-name prompt\n $ catalyst create --project-name my-store\n\n # Eagerly set up Commerce Hosting at create time\n $ catalyst create --project-name my-store --hosting commerce`,\n )\n .option('--project-name <name>', 'Name of your Catalyst project')\n .option('--project-dir <dir>', 'Directory in which to create your project', process.cwd())\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .option('--channel-id <id>', 'BigCommerce channel ID', parseChannelId)\n .option('--storefront-token <token>', 'BigCommerce storefront token')\n .option(\n '--gh-ref <ref>',\n 'Extract a specific ref (tag, branch, or commit) from the source repository',\n '@bigcommerce/catalyst-core@latest',\n )\n .option('--repository <repository>', 'GitHub repository to extract from', 'bigcommerce/catalyst')\n .option(\n '--env <vars...>',\n 'Arbitrary environment variables to set in .env.local. Format: KEY=VALUE (repeatable).',\n parseEnvFlag,\n )\n .addOption(\n new Option(\n '--hosting <mode>',\n 'Hosting mode: \"self-hosted\" (default) or \"commerce\" to set up Commerce Hosting at create time. When omitted, scaffolding is hosting-agnostic; run `catalyst deploy` later to opt in.',\n ).choices(['self-hosted', 'commerce'] as const),\n )\n .option(\n '--use-existing',\n 'Only used with --hosting commerce and --project-name. When the named project already exists on the store, reuse it instead of prompting. Has no effect without --hosting commerce.',\n )\n .addOption(\n new Option('--bigcommerce-hostname <hostname>', 'BigCommerce hostname')\n .default('bigcommerce.com')\n .hideHelp(),\n )\n .addOption(\n new Option('--login-url <url>', 'BigCommerce login URL.')\n .env('BIGCOMMERCE_LOGIN_URL')\n .default(DEFAULT_LOGIN_URL)\n .hideHelp(),\n )\n .addOption(\n new Option('--cli-api-origin <origin>', 'Catalyst CLI API origin')\n .default('https://cxm-prd.bigcommerceapp.com')\n .hideHelp(),\n )\n // eslint-disable-next-line complexity\n .action(async (options) => {\n const { ghRef, repository } = options;\n\n if (options.useExisting && options.hosting !== 'commerce') {\n consola.warn('--use-existing has no effect without --hosting commerce. Ignoring.');\n }\n\n checkRequiredTools();\n\n const { projectName, projectDir } = await setupProject({\n projectName: options.projectName,\n projectDir: options.projectDir,\n });\n\n let storeHash = options.storeHash;\n let accessToken = options.accessToken;\n let channelId = options.channelId;\n let storefrontToken = options.storefrontToken;\n\n let envVars: Record<string, string> = {};\n\n // Always require store creds. `--channel-id` + `--storefront-token` aren't\n // enough on their own — the storefront also needs BIGCOMMERCE_STORE_HASH at\n // runtime, and downstream catalyst commands (deploy, project, ...) need an\n // access token. Device login covers the missing pieces; the user picks the\n // store during the OAuth flow regardless of any partial flags they passed.\n if (!storeHash || !accessToken) {\n const apiHost = `api.${options.bigcommerceHostname}`;\n\n try {\n const credentials = await login(options.loginUrl, apiHost);\n\n storeHash = credentials.storeHash;\n accessToken = credentials.accessToken;\n } catch (error) {\n if (error instanceof LoginAbortedError) {\n consola.info(\n 'Login aborted. Re-run `catalyst create` when you have your credentials ready.',\n );\n process.exit(0);\n\n return;\n }\n\n throw error;\n }\n }\n\n const useCommerceHosting = options.hosting === 'commerce';\n\n await getTelemetry().identify(storeHash);\n\n // Seed env vars from local state when all three were flag-provided. Channel\n // resolution below overwrites this wholesale via `envVars = { ...initData.envVars }`,\n // which is fine — that path means the user wanted us to fetch fresh values.\n if (storeHash && channelId && storefrontToken) {\n envVars.BIGCOMMERCE_STORE_HASH = storeHash;\n envVars.BIGCOMMERCE_CHANNEL_ID = channelId.toString();\n envVars.BIGCOMMERCE_STOREFRONT_TOKEN = storefrontToken;\n }\n\n // Resolve channel only when we have creds and are missing channel info.\n if (storeHash && accessToken && (!channelId || !storefrontToken)) {\n const apiHost = `api.${options.bigcommerceHostname}`;\n const cliApiOrigin = options.cliApiOrigin;\n\n if (channelId && !storefrontToken) {\n const initData = await getChannelInit(channelId, storeHash, accessToken, cliApiOrigin);\n\n envVars = { ...initData.envVars };\n storefrontToken = initData.storefrontToken;\n } else if (!channelId) {\n const eligibility = await checkChannelEligibility(storeHash, accessToken, cliApiOrigin);\n\n if (!eligibility.eligible) {\n consola.warn(eligibility.message);\n }\n\n let shouldCreateChannel;\n\n if (eligibility.eligible) {\n shouldCreateChannel = await select({\n message: 'Would you like to create a new channel?',\n choices: [\n { name: 'Yes', value: true },\n { name: 'No', value: false },\n ],\n });\n }\n\n if (shouldCreateChannel) {\n const channelData = await handleChannelCreation(\n storeHash,\n accessToken,\n apiHost,\n cliApiOrigin,\n );\n\n channelId = channelData.channelId;\n storefrontToken = channelData.storefrontToken;\n envVars = { ...channelData.envVars };\n\n consola.success('Channel created successfully.');\n consola.warn(\n 'A preview storefront has been deployed in your BigCommerce control panel. This preview may look different from your local environment as it may be running different code. Additionally, it may take a few minutes for the channel storefront to be accessible.',\n );\n }\n\n if (!shouldCreateChannel) {\n channelId = await handleChannelSelection(storeHash, accessToken, apiHost);\n\n const initData = await getChannelInit(channelId, storeHash, accessToken, cliApiOrigin);\n\n envVars = { ...initData.envVars };\n storefrontToken = initData.storefrontToken;\n }\n }\n }\n\n if (options.env) {\n Object.assign(envVars, options.env);\n }\n\n if (options.storeHash) envVars.BIGCOMMERCE_STORE_HASH = options.storeHash;\n if (options.channelId) envVars.BIGCOMMERCE_CHANNEL_ID = options.channelId.toString();\n if (options.storefrontToken) envVars.BIGCOMMERCE_STOREFRONT_TOKEN = options.storefrontToken;\n\n if (useCommerceHosting && accessToken) {\n envVars.BIGCOMMERCE_ACCESS_TOKEN = accessToken;\n }\n\n // Pre-populate CATALYST_ACCESS_TOKEN so subsequent catalyst CLI commands\n // (`catalyst deploy`, `catalyst project ...`, etc.) work without re-auth.\n // CATALYST_STORE_HASH isn't written — the CLI falls back to BIGCOMMERCE_STORE_HASH\n // (already in envVars from the channel init response) at startup.\n if (accessToken) envVars.CATALYST_ACCESS_TOKEN = accessToken;\n\n // Resolve the Commerce Hosting project before extraction so credential checks\n // and prompts happen up-front. We defer the file mutations\n // (`setupCommerceHosting`) until after extraction.\n let commerceHostingProject: ProjectListItem | undefined;\n\n if (useCommerceHosting && storeHash && accessToken) {\n const apiHost = `api.${options.bigcommerceHostname}`;\n const hasAccess = await hasProjectsAccess(storeHash, accessToken, apiHost);\n\n if (!hasAccess) {\n consola.error(\n 'This store does not have access to the Infrastructure Projects API. Contact support@bigcommerce.com to enable it.',\n );\n process.exit(1);\n }\n\n commerceHostingProject = await promptForCommerceHostingProject(\n { storeHash, accessToken, apiHost },\n projectName,\n !!options.projectName,\n options.useExisting,\n );\n }\n\n consola.info(`Creating '${projectName}' at '${projectDir}'`);\n\n const packageManager = detectPackageManager();\n\n // Anything that mutates `projectDir` runs inside this block. If a step\n // fails, the directory is likely partially populated — surface that to the\n // user so they can clean up before retrying. We don't auto-delete because\n // they may want to inspect the partial state first.\n try {\n await extractCatalyst({ repository, ref: ghRef, projectDir });\n // Turn the extracted core/ into an installable standalone project\n // (resolve workspace deps, drop `private`, record the catalyst version/ref).\n await rewriteCorePackage(projectDir, ghRef);\n setupCoreProject(projectDir);\n\n if (useCommerceHosting && commerceHostingProject && storeHash && accessToken) {\n await setupCommerceHosting({\n projectDir,\n projectUuid: commerceHostingProject.uuid,\n storeHash,\n accessToken,\n });\n }\n\n // Write env before install — matters for postinstall scripts that may\n // resolve env-driven config.\n writeEnv(projectDir, envVars);\n\n await installDependencies(projectDir, packageManager);\n initGitRepo(projectDir);\n } catch (error) {\n if (pathExistsSync(projectDir)) {\n consola.warn(\n `Setup failed before completion. '${projectDir}' may be in a partial state — review and delete it before re-running 'catalyst create'.`,\n );\n }\n\n throw error;\n }\n\n consola.success(`Created '${projectName}' at '${projectDir}'`);\n\n const steps = [`cd ${projectName} && ${packageManager} run dev`];\n\n if (useCommerceHosting) {\n steps.push(\n `Run 'cd ${projectName} && ${packageManager} run deploy' when ready to deploy to Commerce Hosting.`,\n );\n }\n\n consola.log(\n `Next steps:\\n\\n${steps.map((step) => ` ${colorize('yellow', step)}`).join('\\n')}`,\n );\n });\n","export type PackageManager = 'npm' | 'pnpm' | 'yarn' | 'bun';\n\n// Detect the package manager that INVOKED the CLI (via npx / pnpm dlx / yarn dlx\n// / bunx) by parsing the leading token of npm_config_user_agent, which every\n// manager sets when it spawns a child process. This is deliberately not\n// nypm.detectPackageManager(cwd): that keys off a lockfile in the project, which\n// a freshly extracted project does not have yet.\nexport const detectPackageManager = (): PackageManager => {\n const userAgent = process.env.npm_config_user_agent ?? '';\n const name = userAgent.split(' ')[0]?.split('/')[0];\n\n if (name === 'pnpm' || name === 'yarn' || name === 'bun') {\n return name;\n }\n\n // Some bunx versions omit npm_config_user_agent; fall back to the bun runtime marker.\n if (process.versions.bun) {\n return 'bun';\n }\n\n return 'npm';\n};\n","import { mkdirSync } from 'fs';\nimport { Readable } from 'stream';\nimport { pipeline } from 'stream/promises';\nimport type { ReadableStream as NodeReadableStream } from 'stream/web';\nimport { x } from 'tar';\n\nimport { consola } from './logger';\n\nconst SUBDIR = 'core';\nconst MAX_ATTEMPTS = 3;\n\nconst codeloadUrl = (repository: string, ref: string) =>\n `https://codeload.github.com/${repository}/tar.gz/${encodeURIComponent(ref)}`;\n\nconst wait = (ms: number) =>\n new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n\n// Download the repo tarball from GitHub's codeload endpoint and stream-extract\n// ONLY the `core/` subdirectory into `projectDir`, so merchants receive a clean\n// standalone project instead of the whole monorepo. Mirrors create-next-app:\n// fetch -> stream.pipeline -> tar.x({ strip, filter }).\n//\n// The archive's top-level directory is dynamic (e.g.\n// `catalyst--bigcommerce-catalyst-core-1.6.2` for a tag, `catalyst-canary` for a\n// branch), so we never hardcode it — `filter` keeps entries whose first path\n// segment after the top dir is `core/`, and `strip: 2` drops `<top>/core` so the\n// contents land at the project root.\nconst downloadAndExtract = async (repository: string, ref: string, projectDir: string) => {\n const url = codeloadUrl(repository, ref);\n const response = await fetch(url);\n\n if (!response.ok || !response.body) {\n throw new Error(`Failed to download ${url} (HTTP ${response.status})`);\n }\n\n await pipeline(\n // Node's global fetch types `body` as the DOM ReadableStream; it is the same\n // object Readable.fromWeb expects at runtime.\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n Readable.fromWeb(response.body as NodeReadableStream<Uint8Array>),\n x({\n cwd: projectDir,\n strip: 2,\n filter: (path) => path.split('/')[1] === SUBDIR,\n }),\n );\n};\n\n// Retries the download up to MAX_ATTEMPTS with linear backoff, following\n// create-next-app's pattern. Recursive rather than looped to keep each await off\n// the hot loop path (and satisfy lint).\nconst attemptDownload = async (\n repository: string,\n ref: string,\n projectDir: string,\n attempt = 1,\n): Promise<void> => {\n try {\n await downloadAndExtract(repository, ref, projectDir);\n } catch (error) {\n const message = error instanceof Error ? error.message : 'unknown error';\n\n if (attempt >= MAX_ATTEMPTS) {\n throw new Error(`Failed to download Catalyst after ${MAX_ATTEMPTS} attempts: ${message}`);\n }\n\n consola.warn(`Download attempt ${attempt} failed (${message}). Retrying...`);\n await wait(attempt * 1000);\n\n return attemptDownload(repository, ref, projectDir, attempt + 1);\n }\n};\n\nexport const extractCatalyst = async ({\n repository,\n ref,\n projectDir,\n}: {\n repository: string;\n ref: string;\n projectDir: string;\n}) => {\n consola.info(`Downloading ${repository}#${ref}...`);\n\n mkdirSync(projectDir, { recursive: true });\n\n await attemptDownload(repository, ref, projectDir);\n};\n","import { execSync } from 'child_process';\nimport { rmSync } from 'fs';\nimport { join } from 'path';\n\nimport { consola } from './logger';\n\nconst run = (command: string, cwd: string) => execSync(command, { cwd, stdio: 'ignore' });\n\n// Initialize a fresh git repository for the merchant with a single initial\n// commit. We no longer clone, so there is no history or upstream remote to carry\n// over — merchants add their own. Best-effort: a missing git or a pre-existing\n// repo shouldn't fail project creation, so we warn and roll back a partial init.\nexport const initGitRepo = (projectDir: string) => {\n try {\n run('git init', projectDir);\n run('git add -A', projectDir);\n run('git commit -m \"Initial commit from Catalyst\"', projectDir);\n consola.success('Initialized a git repository.');\n } catch {\n rmSync(join(projectDir, '.git'), { recursive: true, force: true });\n consola.warn('Could not initialize a git repository. Skipping.');\n }\n};\n","import { installDependencies as installDeps } from 'nypm';\nimport yoctoSpinner from 'yocto-spinner';\n\nimport type { PackageManager } from './detect-package-manager';\n\nexport const installDependencies = async (\n projectDir: string,\n packageManager: PackageManager = 'pnpm',\n) => {\n const spinner = yoctoSpinner().start(\n `Installing dependencies with ${packageManager}. This could take a minute...`,\n );\n\n try {\n await installDeps({ cwd: projectDir, silent: true, packageManager });\n spinner.success('Dependencies installed successfully.');\n } catch (error) {\n const message = error instanceof Error ? error.message : 'unknown error';\n\n spinner.error(`Failed to install dependencies: ${message}`);\n throw error;\n }\n};\n","import { z } from 'zod';\n\nimport { assertAuthorized } from './auth-errors';\nimport { getTelemetry } from './telemetry';\n\nconst allowedLocales = [\n 'en',\n 'da',\n 'es-AR',\n 'es-CL',\n 'es-CO',\n 'es-MX',\n 'es-PE',\n 'es-419',\n 'es',\n 'it',\n 'nl',\n 'pl',\n 'pt',\n 'de',\n 'fr',\n 'ja',\n 'no',\n 'pt-BR',\n 'sv',\n];\n\nconst AvailableLocalesSuccessSchema = z.object({\n data: z.array(\n z.object({\n id: z.string(),\n name: z.string(),\n fallback: z.string().nullable(),\n is_supported: z.boolean(),\n }),\n ),\n});\n\nexport const getAvailableLocales = async (\n storeHash: string,\n accessToken: string,\n apiHost: string,\n) => {\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/settings/store/available-locales`,\n {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n 'X-Correlation-Id': getTelemetry().correlationId,\n Accept: 'application/json',\n },\n },\n );\n\n assertAuthorized(response);\n\n if (!response.ok) {\n throw new Error(\n `GET /v3/settings/store/available-locales failed: ${response.status} ${response.statusText}`,\n );\n }\n\n return AvailableLocalesSuccessSchema.parse(await response.json())\n .data.filter(({ id }) => allowedLocales.includes(id))\n .map(({ name, id }) => ({ name: `${name} (${id})`, value: id }));\n};\n","import { readFileSync, writeFileSync } from 'fs';\nimport { join } from 'path';\nimport { z } from 'zod';\n\nimport { consola } from './logger';\nimport { sortPackageJsonFields } from './sort-package-json';\n\n// Native-module build allowlist, lifted from the monorepo's root\n// pnpm-workspace.yaml `onlyBuiltDependencies`. A standalone install needs this so\n// pnpm (`pnpm.onlyBuiltDependencies`) and bun (`trustedDependencies`) run the\n// native postinstall builds without prompting. npm/yarn-classic run them anyway.\nconst NATIVE_BUILD_ALLOWLIST = [\n '@parcel/watcher',\n '@swc/core',\n '@vercel/speed-insights',\n 'esbuild',\n 'msw',\n 'protobufjs',\n 'puppeteer',\n 'sharp',\n 'workerd',\n];\n\nconst DEP_FIELDS = [\n 'dependencies',\n 'devDependencies',\n 'optionalDependencies',\n 'peerDependencies',\n] as const;\n\nconst corePackageJsonSchema = z.looseObject({\n version: z.string().optional(),\n private: z.boolean().optional(),\n scripts: z.record(z.string(), z.string()).optional(),\n dependencies: z.record(z.string(), z.string()).optional(),\n devDependencies: z.record(z.string(), z.string()).optional(),\n optionalDependencies: z.record(z.string(), z.string()).optional(),\n peerDependencies: z.record(z.string(), z.string()).optional(),\n pnpm: z.looseObject({}).optional(),\n catalyst: z.looseObject({}).optional(),\n});\n\nconst registryVersionSchema = z.object({ version: z.string() });\n\n// Resolve the published npm version for a workspace dependency. The extracted\n// tag tree still carries `workspace:^` (core is private, so changesets' publish-\n// time rewrite never touches the committed tree) — so we resolve the real\n// version at extraction time from the npm registry. The two workspace deps\n// (`@bigcommerce/catalyst-client`, `@bigcommerce/eslint-config-catalyst`) are\n// published in lockstep with core, so `latest` is the compatible version.\nconst resolvePublishedVersion = async (pkgName: string): Promise<string> => {\n const response = await fetch(`https://registry.npmjs.org/${pkgName}/latest`);\n\n if (!response.ok) {\n throw new Error(\n `Could not resolve a published version for \"${pkgName}\" (HTTP ${response.status}). ` +\n 'The extracted project still references it via the workspace protocol and cannot be installed.',\n );\n }\n\n const { version } = registryVersionSchema.parse(await response.json());\n\n return `^${version}`;\n};\n\n// Transforms an extracted `core/package.json` into an installable, standalone\n// manifest: resolves `workspace:` deps to published versions, drops `private`,\n// bakes the native-build allowlist for pnpm/bun, strips monorepo-only (turbo)\n// scripts, and records the Catalyst version/ref the project was created from.\n// Also writes `.npmrc` so npm tolerates react-headroom's stale react peer range.\nexport const rewriteCorePackage = async (projectDir: string, ref: string) => {\n const packageJsonPath = join(projectDir, 'package.json');\n const pkg = corePackageJsonSchema.parse(JSON.parse(readFileSync(packageJsonPath, 'utf-8')));\n\n // Collect every workspace-protocol dependency across all dep fields, keeping a\n // reference to its owning record so we can rewrite it in place after resolving.\n const workspaceDeps = DEP_FIELDS.flatMap((field) => {\n const deps = pkg[field];\n\n if (!deps) return [];\n\n return Object.entries(deps)\n .filter(([, range]) => range.startsWith('workspace:'))\n .map(([name]) => ({ deps, name }));\n });\n\n await Promise.all(\n workspaceDeps.map(async ({ deps, name }) => {\n const resolved = await resolvePublishedVersion(name);\n\n deps[name] = resolved;\n consola.info(`Resolved ${name} to ${resolved}`);\n }),\n );\n\n // Merchants need an installable project; `private` blocks publish/install ergonomics.\n delete pkg.private;\n\n // Drop any monorepo-only scripts that shell out to turbo.\n if (pkg.scripts) {\n pkg.scripts = Object.fromEntries(\n Object.entries(pkg.scripts).filter(([, command]) => !command.includes('turbo')),\n );\n }\n\n pkg.pnpm = { ...pkg.pnpm, onlyBuiltDependencies: NATIVE_BUILD_ALLOWLIST };\n pkg.trustedDependencies = NATIVE_BUILD_ALLOWLIST;\n\n // Track what this project was scaffolded from (consumed by `catalyst upgrade`\n // and the backend user-agent). `ref` is the exact ref extracted.\n pkg.catalyst = { ...pkg.catalyst, version: pkg.version, ref };\n\n writeFileSync(packageJsonPath, `${JSON.stringify(sortPackageJsonFields(pkg), null, 2)}\\n`);\n\n // react-headroom (unmaintained) declares a react <=18 peer; core ships react 19.\n // pnpm/yarn/bun tolerate it, but npm errors ERESOLVE without this.\n writeFileSync(join(projectDir, '.npmrc'), 'legacy-peer-deps=true\\n');\n};\n","import { mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { z } from 'zod';\n\nimport PACKAGE_INFO from '../../../package.json';\n\nimport { sortPackageJsonFields } from './sort-package-json';\n\nconst corePackageJsonSchema = z.looseObject({\n scripts: z.record(z.string(), z.string()).optional(),\n dependencies: z.record(z.string(), z.string()).optional(),\n});\n\nconst writeJson = (path: string, value: unknown) => {\n mkdirSync(dirname(path), { recursive: true });\n writeFileSync(path, `${JSON.stringify(value, null, 2)}\\n`);\n};\n\n// Wires Catalyst CLI scripts and the `@bigcommerce/catalyst` dep into a freshly\n// extracted project. Always runs at create time, regardless of hosting choice —\n// `catalyst build` / `catalyst start` / `catalyst deploy` dispatch on project\n// state, so these scripts work for self-hosted projects too without rewrite.\nexport const setupCoreProject = (projectDir: string) => {\n const corePackageJsonPath = join(projectDir, 'package.json');\n const pkg = corePackageJsonSchema.parse(JSON.parse(readFileSync(corePackageJsonPath, 'utf-8')));\n\n pkg.scripts = {\n ...pkg.scripts,\n build: 'npm run generate && catalyst build',\n start: 'catalyst start',\n deploy: 'npm run generate && catalyst deploy',\n };\n\n pkg.dependencies = {\n ...pkg.dependencies,\n '@bigcommerce/catalyst': PACKAGE_INFO.version,\n };\n\n writeJson(corePackageJsonPath, sortPackageJsonFields(pkg));\n};\n","import { outputFileSync } from 'fs-extra/esm';\nimport { join } from 'path';\n\n// Writes .env.local at the project root — Next.js (and all the catalyst CLI\n// commands) read env vars from there, since the extracted project is the package\n// they run inside.\nexport const writeEnv = (projectDir: string, envVars: Record<string, string>) => {\n outputFileSync(\n join(projectDir, '.env.local'),\n `${Object.entries(envVars)\n .map(([key, value]) => `${key}=${value}`)\n .join('\\n')}\\n`,\n );\n};\n","import { confirm } from '@inquirer/prompts';\nimport AdmZip from 'adm-zip';\nimport { Command, Option } from 'commander';\nimport { colorize } from 'consola/utils';\nimport { access, readdir, readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport yoctoSpinner from 'yocto-spinner';\nimport { z } from 'zod';\n\nimport { assertAuthorized } from '../lib/auth-errors';\nimport { runChannelSiteUrlFlow } from '../lib/channel-site-flow';\nimport {\n cleanupCloudflareIncompatibilities,\n NoLinkedProjectError,\n selectOrCreateInfrastructureProject,\n setupCommerceHosting,\n} from '../lib/commerce-hosting';\nimport { getDeploymentErrorMessage } from '../lib/deployment-errors';\nimport {\n getStoredEnv,\n mergeDeploymentSecrets,\n parseEnvAssignment,\n toDeploymentSecrets,\n} from '../lib/env-config';\nimport { installDependencies } from '../lib/install-dependencies';\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\nimport { getProjectState } from '../lib/project-state';\nimport { resolveCredentials } from '../lib/resolve-credentials';\nimport {\n accessTokenOption,\n apiHostOption,\n projectUuidOption,\n storeHashOption,\n} from '../lib/shared-options';\nimport { getTelemetry } from '../lib/telemetry';\n\nimport { buildCatalystProject } from './build';\n\nconst stepsEnum = z.enum([\n 'initializing',\n 'downloading',\n 'unzipping',\n 'processing',\n 'deploying',\n 'finalizing',\n 'complete',\n]);\n\nconst STEPS: Record<z.infer<typeof stepsEnum>, string> = {\n initializing: 'Initializing...',\n downloading: 'Downloading...',\n unzipping: 'Unzipping...',\n processing: 'Processing...',\n deploying: 'Deploying...',\n finalizing: 'Finalizing...',\n complete: 'Complete',\n};\n\nconst UploadSignatureSchema = z.object({\n data: z.object({\n upload_url: z.url(),\n upload_uuid: z.string(),\n }),\n});\n\nconst CreateDeploymentSchema = z.object({\n data: z.object({\n deployment_uuid: z.uuid(),\n }),\n});\n\nconst ProjectSchema = z.object({\n data: z.array(\n z.object({\n uuid: z.uuid(),\n name: z.string(),\n }),\n ),\n});\n\nconst DeploymentStatusSchema = z.object({\n deployment_uuid: z.uuid(),\n deployment_status: z.enum(['queued', 'in_progress', 'failed', 'completed']),\n event: z\n .object({\n step: stepsEnum,\n progress: z.number(),\n })\n .nullable(),\n deployment_hostnames: z.array(z.string()).optional(),\n error: z\n .object({\n code: z.number(),\n })\n .optional(),\n});\n\nexport const generateBundleZip = async () => {\n consola.info('Generating bundle...');\n\n const bigcommerceDir = join(process.cwd(), '.bigcommerce');\n const distDir = join(process.cwd(), '.bigcommerce', 'dist');\n\n // Check if .bigcommerce/dist exists\n try {\n await access(distDir);\n } catch {\n throw new Error(`Dist directory not found: ${distDir}`);\n }\n\n // Check if .bigcommerce/dist is not empty\n const buildDirContents = await readdir(distDir);\n\n if (buildDirContents.length === 0) {\n throw new Error(`Dist directory is empty: ${distDir}`);\n }\n\n const outputZip = join(bigcommerceDir, 'bundle.zip');\n\n // Use AdmZip to create the zip\n const zip = new AdmZip();\n\n zip.addLocalFolder(distDir, 'output');\n zip.writeZip(outputZip);\n\n consola.success(`Bundle created at: ${outputZip}`);\n};\n\nexport const generateUploadSignature = async (\n storeHash: string,\n accessToken: string,\n apiHost: string,\n) => {\n consola.info('Generating upload signature...');\n\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/deployments/uploads`,\n {\n method: 'POST',\n headers: {\n 'X-Auth-Token': accessToken,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-Correlation-Id': getTelemetry().correlationId,\n },\n body: JSON.stringify({}),\n },\n );\n\n assertAuthorized(response);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch upload signature: ${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const { data } = UploadSignatureSchema.parse(res);\n\n consola.success('Upload signature generated.');\n\n return data;\n};\n\nexport const uploadBundleZip = async (uploadUrl: string) => {\n consola.info('Uploading bundle...');\n\n const zipPath = join(process.cwd(), '.bigcommerce', 'bundle.zip');\n\n // Read the zip file as a buffer\n const fileBuffer = await readFile(zipPath);\n\n const response = await fetch(uploadUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/zip',\n },\n body: fileBuffer,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to upload bundle: ${response.status} ${response.statusText}`);\n }\n\n consola.success('Bundle uploaded successfully.');\n\n return true;\n};\n\nexport const parseEnvironmentVariables = (secretOption?: string[]) => {\n return secretOption?.map((envVar) => {\n const { key, value } = parseEnvAssignment(envVar);\n\n return {\n type: 'secret' as const,\n key,\n value,\n };\n });\n};\n\nexport const createDeployment = async (\n projectUuid: string,\n uploadUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n environmentVariables?: Array<{ type: 'secret' | 'plain_text'; key: string; value: string }>,\n) => {\n consola.info('Creating deployment...');\n\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/deployments`,\n {\n method: 'POST',\n headers: {\n 'X-Auth-Token': accessToken,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-Correlation-Id': getTelemetry().correlationId,\n },\n body: JSON.stringify({\n project_uuid: projectUuid,\n upload_uuid: uploadUuid,\n environment_variables: environmentVariables,\n }),\n },\n );\n\n assertAuthorized(response);\n\n if (!response.ok) {\n throw new Error(`Failed to create deployment: ${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const { data } = CreateDeploymentSchema.parse(res);\n\n consola.success('Deployment started...');\n\n return data;\n};\n\nexport const getDeploymentStatus = async (\n deploymentUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<string | undefined> => {\n consola.info('Fetching deployment status...');\n\n const spinner = yoctoSpinner().start('Fetching...');\n\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/deployments/${deploymentUuid}/events`,\n {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n Accept: 'text/event-stream',\n Connection: 'keep-alive',\n 'X-Correlation-Id': getTelemetry().correlationId,\n },\n },\n );\n\n assertAuthorized(response);\n\n if (!response.ok) {\n throw new Error(`Failed to open event stream: ${response.status} ${response.statusText}`);\n }\n\n const reader = response.body?.getReader();\n\n if (!reader) {\n throw new Error('Failed to read event stream.');\n }\n\n const decoder = new TextDecoder();\n let done = false;\n let deploymentHostname: string | undefined;\n\n while (!done) {\n // eslint-disable-next-line no-await-in-loop\n const { value, done: streamDone } = await reader.read();\n let json: unknown;\n\n if (value) {\n const chunk = decoder.decode(value, { stream: true }).trim();\n const split = chunk\n .split('\\n\\n')\n .map((s) => s.replace('data:', '').trim())\n .filter(Boolean);\n\n // eslint-disable-next-line no-loop-func\n split.forEach((event) => {\n try {\n json = JSON.parse(event);\n } catch (error) {\n consola.warn(`Failed to parse event, dropping from stream. Event: ${event}`, error);\n\n return;\n }\n\n const data = DeploymentStatusSchema.parse(json);\n\n if (data.error) {\n throw new Error(\n `Deployment failed (error code ${data.error.code}): ${getDeploymentErrorMessage(data.error.code)}`,\n );\n }\n\n if (data.event && STEPS[data.event.step] !== spinner.text) {\n spinner.text = STEPS[data.event.step];\n }\n\n if (data.deployment_hostnames && data.deployment_hostnames.length > 0) {\n deploymentHostname = data.deployment_hostnames[0];\n }\n });\n }\n\n done = streamDone;\n }\n\n spinner.success('Deployment completed successfully.');\n\n if (deploymentHostname) {\n consola.success(\n `View your deployment at: ${colorize('blue', `https://${deploymentHostname}`)}`,\n );\n }\n\n return deploymentHostname;\n};\n\nexport const fetchProject = async (\n projectUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n) => {\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/projects`,\n {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'X-Correlation-Id': getTelemetry().correlationId,\n },\n },\n );\n\n assertAuthorized(response);\n\n if (!response.ok) {\n throw new Error(`Failed to fetch projects: ${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const { data } = ProjectSchema.parse(res);\n\n return data.find((project) => project.uuid === projectUuid);\n};\n\nexport const deploy = new Command('deploy')\n .configureHelp({ showGlobalOptions: true })\n .description('Deploy your application to Cloudflare.')\n .addHelpText(\n 'after',\n `\nEnvironment variables saved with \\`catalyst env add\\` are sent automatically on every deploy.\nUse \\`--secret\\` to set or override a variable for a single run.\n\nExample:\n $ catalyst deploy --secret BIGCOMMERCE_STORE_HASH=<YOUR_STORE_HASH> --secret BIGCOMMERCE_STOREFRONT_TOKEN=<YOUR_STOREFRONT_TOKEN>`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .option(\n '--update-site-url',\n \"After a successful deploy, prompt to update a channel's site URL to the new hostname.\",\n )\n .addOption(\n new Option(\n '--secret <value>',\n 'Secret to set for this deployment (repeatable). Overrides a stored value for the same key. Format: --secret KEY=VALUE',\n ).argParser((value: string, previous: string[] = []) => {\n return previous.concat([value]);\n }),\n )\n .option('--dry-run', 'Run the command to generate the bundle without uploading or deploying.')\n .option(\n '--prebuilt',\n 'Skip the build step. Requires .bigcommerce/dist/ to already contain build output.',\n )\n .action(async (options) => {\n const config = getProjectConfig();\n const { storeHash, accessToken } = resolveCredentials(options, config);\n const telemetry = getTelemetry();\n\n await telemetry.identify(storeHash);\n\n // Resolve a *valid* projectUuid before doing any expensive build/upload\n // work. If the linked UUID no longer exists on the server (e.g. project\n // deleted out from under us), prompt the user to pick a new one rather\n // than failing mid-deploy.\n const linkedProjectUuid = options.projectUuid ?? config.get('projectUuid');\n let projectUuid: string;\n\n const promptForProject = async (): Promise<{ uuid: string; name: string }> => {\n try {\n return await selectOrCreateInfrastructureProject({\n storeHash,\n accessToken,\n apiHost: options.apiHost,\n });\n } catch (error) {\n if (error instanceof NoLinkedProjectError) {\n consola.info(\n \"When you're ready to create a project, run `catalyst project create` or re-run `catalyst deploy`.\",\n );\n process.exit(0);\n }\n\n throw error;\n }\n };\n\n if (linkedProjectUuid) {\n const existing = await fetchProject(\n linkedProjectUuid,\n storeHash,\n accessToken,\n options.apiHost,\n );\n\n if (existing) {\n projectUuid = linkedProjectUuid;\n } else {\n consola.warn(\n `The linked project (${linkedProjectUuid}) no longer exists on this store. It may have been deleted.`,\n );\n\n const selected = await promptForProject();\n\n projectUuid = selected.uuid;\n config.set('projectUuid', projectUuid);\n consola.success(`Linked project \"${selected.name}\".`);\n }\n } else {\n consola.info('No project is currently linked.');\n\n const selected = await promptForProject();\n\n projectUuid = selected.uuid;\n config.set('projectUuid', projectUuid);\n consola.success(`Linked project \"${selected.name}\".`);\n }\n\n // The OpenNext build pipeline requires the project to be transformed\n // (proxy.ts → middleware.ts, @opennextjs/cloudflare installed). Run setup\n // here so first-run `catalyst deploy` works on a fresh self-hosted scaffold\n // without forcing the user to re-run after a separate setup step.\n if (!getProjectState().isTransformed) {\n const shouldSetup = await confirm({\n message:\n 'Your project is not yet set up for Commerce Hosting deployments. Would you like to run the Commerce Hosting setup now?',\n default: true,\n });\n\n if (!shouldSetup) {\n consola.info(\"When you're ready to deploy, re-run `catalyst deploy` to complete setup.\");\n process.exit(0);\n }\n\n const projectDir = process.cwd();\n\n await setupCommerceHosting({ projectDir, projectUuid, storeHash, accessToken });\n consola.success('Commerce Hosting setup complete.');\n\n await installDependencies(projectDir);\n } else {\n // Existing Commerce Hosting users may carry artifacts incompatible with\n // the Cloudflare worker bundle from earlier Catalyst versions\n // (`core/instrumentation.ts`, `@vercel/otel`). Sweep them on every deploy\n // so the fix lands without forcing a re-link.\n await cleanupCloudflareIncompatibilities(process.cwd());\n }\n\n if (options.prebuilt) {\n const distDir = join(process.cwd(), '.bigcommerce', 'dist');\n\n try {\n await access(distDir);\n } catch {\n throw new Error(\n 'No build output found at .bigcommerce/dist/. Run `catalyst build` first or remove `--prebuilt` to build automatically.',\n );\n }\n\n const contents = await readdir(distDir);\n\n if (contents.length === 0) {\n throw new Error(\n 'No build output found at .bigcommerce/dist/. Run `catalyst build` first or remove `--prebuilt` to build automatically.',\n );\n }\n\n consola.info('Using existing build output (--prebuilt).');\n } else {\n await buildCatalystProject(projectUuid);\n }\n\n await generateBundleZip();\n\n if (options.dryRun) {\n consola.info('Dry run enabled — skipping upload and deployment steps.');\n consola.info('Next steps (skipped):');\n consola.info('- Generate upload signature');\n consola.info('- Upload bundle.zip');\n consola.info('- Create deployment');\n\n process.exit(0);\n }\n\n const uploadSignature = await generateUploadSignature(storeHash, accessToken, options.apiHost);\n\n await uploadBundleZip(uploadSignature.upload_url);\n\n // Merge persisted env vars (`catalyst env add`) with any inline `--secret`\n // flags. Inline flags win on conflict, letting users override a stored\n // value for a single run. Send `undefined` when there's nothing to set so\n // we preserve the prior payload shape.\n const flagSecrets = parseEnvironmentVariables(options.secret) ?? [];\n const persistedSecrets = toDeploymentSecrets(getStoredEnv(config));\n const mergedSecrets = mergeDeploymentSecrets(persistedSecrets, flagSecrets);\n const environmentVariables = mergedSecrets.length > 0 ? mergedSecrets : undefined;\n\n const { deployment_uuid: deploymentUuid } = await createDeployment(\n projectUuid,\n uploadSignature.upload_uuid,\n storeHash,\n accessToken,\n options.apiHost,\n environmentVariables,\n );\n\n const deploymentHostname = await getDeploymentStatus(\n deploymentUuid,\n storeHash,\n accessToken,\n options.apiHost,\n );\n\n if (!options.updateSiteUrl) {\n return;\n }\n\n try {\n await runChannelSiteUrlFlow({\n storeHash,\n accessToken,\n apiHost: options.apiHost,\n projectUuid,\n preferHostname: deploymentHostname,\n });\n } catch (error) {\n // Soft-fail: the deploy already succeeded and the bundle is live. A\n // non-zero exit here would be misleading.\n consola.warn(\n `Failed to update channel site URL: ${error instanceof Error ? error.message : String(error)}`,\n );\n consola.info(\n 'Update it manually in the control panel, or re-run `catalyst auth login` if the token is missing the store_channel_settings scope.',\n );\n }\n });\n","const ERROR_MESSAGES: Record<number, string> = {\n 10: 'Something went wrong on our end. Please try again. If the issue persists, contact support.',\n 20: \"We couldn't retrieve your bundle. This is usually a temporary issue — please try deploying again. If the problem continues, contact support.\",\n 30: 'Your bundle could not be extracted. This may mean your build output is too large (max 64 MB compressed / 512 MB uncompressed) or the archive is corrupted. Try reducing your build size or rebuilding your project and deploying again.',\n 40: `There's a problem with your build output. This could be caused by:\n- A worker.js file larger than 40 MB\n- An individual asset file larger than 25 MB\n- More than 1,000 total files in the bundle`,\n 50: 'Deployment failed. This is usually a temporary issue — please try again. If the problem persists, contact support.',\n 60: \"Your code was deployed, but we couldn't determine your deployment URL. Please try deploying again. If the issue persists, contact support.\",\n};\n\nexport function getDeploymentErrorMessage(code: number): string {\n return (\n ERROR_MESSAGES[code] ??\n `Deployment failed with an unexpected error (code: ${code}). Please try again. If the issue persists, contact support.`\n );\n}\n","import { confirm } from '@inquirer/prompts';\nimport { Command, Option } from 'commander';\nimport { colorize } from 'consola/utils';\n\nimport {\n createDomain,\n deleteDomain,\n Domain,\n DomainStatus,\n DomainStatusFilter,\n getDomain,\n listDomains,\n} from '../lib/domains';\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\nimport { resolveCredentials } from '../lib/resolve-credentials';\nimport {\n accessTokenOption,\n apiHostOption,\n projectUuidOption,\n resolveProjectUuid,\n storeHashOption,\n} from '../lib/shared-options';\nimport { getTelemetry } from '../lib/telemetry';\n\nconst WAIT_INTERVAL_MS = 5000;\nconst WAIT_TIMEOUT_MS = 5 * 60 * 1000;\nconst DOMAIN_STATUS_FILTERS: DomainStatusFilter[] = ['pending', 'verified', 'failed'];\n\nconst STATUS_COLORS: Record<DomainStatus, Parameters<typeof colorize>[0]> = {\n pending: 'yellow',\n verified: 'green',\n failed: 'red',\n unknown: 'gray',\n};\n\nconst STATUS_LABELS: Record<DomainStatus, string> = {\n pending: 'pending',\n verified: 'active',\n failed: 'failed',\n unknown: 'unknown',\n};\n\ninterface DomainCommandContext {\n projectUuid: string;\n storeHash: string;\n accessToken: string;\n apiHost: string;\n}\n\ninterface DomainCommandOptions {\n storeHash?: string;\n accessToken?: string;\n apiHost: string;\n projectUuid?: string;\n}\n\ninterface WaitForDomainVerificationOptions extends DomainCommandContext {\n domain: string;\n intervalMs?: number;\n timeoutMs?: number;\n}\n\nconst sleep = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms));\n\nfunction resolveDomainCommandContext(options: DomainCommandOptions): DomainCommandContext {\n const config = getProjectConfig();\n const { storeHash, accessToken } = resolveCredentials(options, config);\n const projectUuid = resolveProjectUuid(options);\n\n return {\n projectUuid,\n storeHash,\n accessToken,\n apiHost: options.apiHost,\n };\n}\n\nexport function formatDomainStatus(status: DomainStatus): string {\n return colorize(STATUS_COLORS[status], STATUS_LABELS[status]);\n}\n\nexport function formatDomain(domain: Domain): string {\n return `${domain.domain} ${formatDomainStatus(domain.verification_status)}`;\n}\n\nexport async function waitForDomainVerification({\n domain,\n projectUuid,\n storeHash,\n accessToken,\n apiHost,\n intervalMs = WAIT_INTERVAL_MS,\n timeoutMs = WAIT_TIMEOUT_MS,\n}: WaitForDomainVerificationOptions): Promise<Domain> {\n const startedAt = Date.now();\n let current = await getDomain(domain, projectUuid, storeHash, accessToken, apiHost);\n\n while (current.verification_status === 'pending' && Date.now() - startedAt < timeoutMs) {\n // eslint-disable-next-line no-await-in-loop\n await sleep(intervalMs);\n // eslint-disable-next-line no-await-in-loop\n current = await getDomain(domain, projectUuid, storeHash, accessToken, apiHost);\n }\n\n return current;\n}\n\nconst add = new Command('add')\n .configureHelp({ showGlobalOptions: true })\n .description('Add a custom domain to the current Native Hosting project.')\n .argument('<domain>', 'Custom domain to add.')\n .addHelpText(\n 'after',\n `\nExamples:\n $ catalyst domains add www.example.com\n\n # Wait until the domain leaves pending verification\n $ catalyst domains add www.example.com --wait`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .option('--wait', 'Poll until domain verification completes or times out.')\n .action(async (domain, options) => {\n const context = resolveDomainCommandContext(options);\n\n await getTelemetry().identify(context.storeHash);\n\n consola.start(`Adding domain ${domain}...`);\n\n let result = await createDomain(\n domain,\n context.projectUuid,\n context.storeHash,\n context.accessToken,\n context.apiHost,\n );\n\n consola.success(`Domain ${result.domain} added.`);\n\n if (options.wait && result.verification_status === 'pending') {\n consola.start(`Waiting for ${result.domain} to verify...`);\n result = await waitForDomainVerification({ domain: result.domain, ...context });\n }\n\n consola.log(formatDomain(result));\n process.exit(0);\n });\n\nconst list = new Command('list')\n .configureHelp({ showGlobalOptions: true })\n .description('List custom domains for the current Native Hosting project.')\n .addHelpText(\n 'after',\n `\nExamples:\n $ catalyst domains list\n\n # Show pending domains only\n $ catalyst domains list --status pending`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .option('--domain <domain>', 'Only show a specific domain.')\n .addOption(\n new Option('--status <status>', 'Filter by verification status.').choices(\n DOMAIN_STATUS_FILTERS,\n ),\n )\n .action(async (options) => {\n const context = resolveDomainCommandContext(options);\n\n await getTelemetry().identify(context.storeHash);\n\n consola.start('Fetching domains...');\n\n const result = await listDomains(\n context.projectUuid,\n context.storeHash,\n context.accessToken,\n context.apiHost,\n {\n domains: options.domain ? [options.domain] : undefined,\n verificationStatus: options.status,\n },\n );\n\n consola.success('Domains fetched.');\n\n if (result.length === 0) {\n consola.info('No custom domains found.');\n process.exit(0);\n\n return;\n }\n\n result.forEach((item) => consola.log(formatDomain(item)));\n process.exit(0);\n });\n\nconst showStatus = new Command('status')\n .configureHelp({ showGlobalOptions: true })\n .description('Show the status of a custom domain on the current Native Hosting project.')\n .argument('<domain>', 'Custom domain to check.')\n .addHelpText(\n 'after',\n `\nExamples:\n $ catalyst domains status www.example.com\n\n # Wait until the domain leaves pending verification\n $ catalyst domains status www.example.com --wait`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .option('--wait', 'Poll until domain verification completes or times out.')\n .action(async (domain, options) => {\n const context = resolveDomainCommandContext(options);\n\n await getTelemetry().identify(context.storeHash);\n\n consola.start(`Fetching status for ${domain}...`);\n\n let result = await getDomain(\n domain,\n context.projectUuid,\n context.storeHash,\n context.accessToken,\n context.apiHost,\n );\n\n consola.success('Domain status fetched.');\n\n if (options.wait && result.verification_status === 'pending') {\n consola.start(`Waiting for ${result.domain} to verify...`);\n result = await waitForDomainVerification({ domain: result.domain, ...context });\n }\n\n consola.log(formatDomain(result));\n process.exit(0);\n });\n\nconst remove = new Command('remove')\n .configureHelp({ showGlobalOptions: true })\n .description('Remove a custom domain from the current Native Hosting project.')\n .argument('<domain>', 'Custom domain to remove.')\n .addHelpText(\n 'after',\n `\nExamples:\n $ catalyst domains remove www.example.com\n\n # Skip confirmation for an active domain\n $ catalyst domains remove www.example.com --force`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .option('--force', 'Skip the confirmation prompt before removing an active domain.')\n .action(async (domain, options) => {\n const context = resolveDomainCommandContext(options);\n\n await getTelemetry().identify(context.storeHash);\n\n consola.start(`Fetching status for ${domain}...`);\n\n const current = await getDomain(\n domain,\n context.projectUuid,\n context.storeHash,\n context.accessToken,\n context.apiHost,\n );\n\n if (current.verification_status === 'verified' && !options.force) {\n const confirmed = await confirm({\n message: `Remove active domain ${current.domain}? Traffic may stop routing to this project.`,\n default: false,\n });\n\n if (!confirmed) {\n consola.info('Aborted. No domain was removed.');\n process.exit(0);\n\n return;\n }\n }\n\n consola.start(`Removing domain ${current.domain}...`);\n\n await deleteDomain(\n current.domain,\n context.projectUuid,\n context.storeHash,\n context.accessToken,\n context.apiHost,\n );\n\n consola.success(`Domain ${current.domain} removed.`);\n process.exit(0);\n });\n\nexport const domains = new Command('domains')\n .configureHelp({ showGlobalOptions: true })\n .description('Manage custom domains for the current Native Hosting project.')\n .addCommand(add)\n .addCommand(list)\n .addCommand(showStatus)\n .addCommand(remove);\n","import { z } from 'zod';\n\nimport { assertAuthorized } from './auth-errors';\nimport { formatV3Error } from './observability';\nimport { getTelemetry } from './telemetry';\n\nexport const domainStatusSchema = z.enum(['pending', 'verified', 'failed', 'unknown']);\n\nexport type DomainStatus = z.infer<typeof domainStatusSchema>;\n\nconst domainSchema = z.object({\n domain: z.string(),\n project_uuid: z.string(),\n verification_status: domainStatusSchema,\n});\n\nconst domainResponseSchema = z.object({\n data: domainSchema,\n});\n\nconst domainListResponseSchema = z.object({\n data: z.array(domainSchema),\n});\n\nexport type Domain = z.infer<typeof domainSchema>;\nexport type DomainStatusFilter = Exclude<DomainStatus, 'unknown'>;\n\ninterface ListDomainsFilters {\n domains?: string[];\n verificationStatus?: DomainStatusFilter;\n}\n\nconst DOMAINS_API_NOT_ENABLED =\n 'Infrastructure Domains API not enabled. If you are part of the beta, contact support@bigcommerce.com to enable it.';\n\nfunction domainsUrl(storeHash: string, projectUuid: string, apiHost: string) {\n return `https://${apiHost}/stores/${storeHash}/v3/infrastructure/projects/${projectUuid}/domains`;\n}\n\nfunction domainUrl(storeHash: string, projectUuid: string, domain: string, apiHost: string) {\n return `${domainsUrl(storeHash, projectUuid, apiHost)}/${encodeURIComponent(domain)}`;\n}\n\nfunction authHeaders(accessToken: string) {\n return {\n Accept: 'application/json',\n 'X-Auth-Token': accessToken,\n 'X-Correlation-Id': getTelemetry().correlationId,\n };\n}\n\nfunction formatResponseStatus(response: Response, message?: string): string {\n return [response.status, response.statusText || message].filter(Boolean).join(' ');\n}\n\nasync function getErrorMessage(response: Response, action: string): Promise<string> {\n const body: unknown = await response.json().catch(() => null);\n const message = formatV3Error(body);\n\n if (response.status >= 500) {\n const status = formatResponseStatus(response, message);\n\n return `${action}: ${status}. This is a server-side response from the Domains API.`;\n }\n\n return message ?? `${action}: ${response.statusText}`;\n}\n\nasync function assertDomainResponse(response: Response, action: string): Promise<void> {\n assertAuthorized(response);\n\n if (response.status === 403) {\n throw new Error(DOMAINS_API_NOT_ENABLED);\n }\n\n if (!response.ok) {\n throw new Error(await getErrorMessage(response, action));\n }\n}\n\nexport async function createDomain(\n domain: string,\n projectUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<Domain> {\n const response = await fetch(domainsUrl(storeHash, projectUuid, apiHost), {\n method: 'POST',\n headers: {\n ...authHeaders(accessToken),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ domain }),\n });\n\n await assertDomainResponse(response, 'Failed to add domain');\n\n const result: unknown = await response.json();\n\n return domainResponseSchema.parse(result).data;\n}\n\nexport async function getDomain(\n domain: string,\n projectUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<Domain> {\n const response = await fetch(domainUrl(storeHash, projectUuid, domain, apiHost), {\n method: 'GET',\n headers: authHeaders(accessToken),\n });\n\n await assertDomainResponse(response, 'Failed to fetch domain');\n\n const result: unknown = await response.json();\n\n return domainResponseSchema.parse(result).data;\n}\n\nexport async function listDomains(\n projectUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n filters: ListDomainsFilters = {},\n): Promise<Domain[]> {\n const search = new URLSearchParams();\n\n if (filters.domains && filters.domains.length > 0) {\n search.set('domain:in', filters.domains.join(','));\n }\n\n if (filters.verificationStatus) {\n search.set('verification_status', filters.verificationStatus);\n }\n\n const query = search.toString();\n const url = `${domainsUrl(storeHash, projectUuid, apiHost)}${query ? `?${query}` : ''}`;\n const response = await fetch(url, {\n method: 'GET',\n headers: authHeaders(accessToken),\n });\n\n await assertDomainResponse(response, 'Failed to fetch domains');\n\n const result: unknown = await response.json();\n\n return domainListResponseSchema.parse(result).data;\n}\n\nexport async function deleteDomain(\n domain: string,\n projectUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<void> {\n const response = await fetch(domainUrl(storeHash, projectUuid, domain, apiHost), {\n method: 'DELETE',\n headers: authHeaders(accessToken),\n });\n\n await assertDomainResponse(response, `Failed to remove domain: ${response.statusText}`);\n}\n","import { colorize } from 'consola/utils';\nimport { z } from 'zod';\n\nimport { assertAuthorized } from './auth-errors';\nimport { getTelemetry } from './telemetry';\n\nexport const LOG_LEVELS = ['debug', 'info', 'warn', 'error'] as const;\nexport type LogLevel = (typeof LOG_LEVELS)[number];\n\nconst SEVEN_DAYS_MS = 7 * 24 * 60 * 60 * 1000;\n\nconst logEntrySchema = z.object({\n timestamp: z.string().nullable().optional(),\n level: z.string().optional(),\n messages: z.array(z.unknown()).optional(),\n is_exception: z.boolean().optional(),\n exception_name: z.string().optional(),\n request: z\n .object({\n method: z.string().optional(),\n url: z.string().optional(),\n status_code: z.number().optional(),\n })\n .nullable()\n .optional(),\n});\n\n// TODO(TRAC-934): any `meta.cursor_pagination` the backend still returns is ignored (zod strips unknown keys)\nconst queryLogsSchema = z.object({\n data: z.array(logEntrySchema),\n});\n\nexport type LogEntry = z.infer<typeof logEntrySchema>;\nexport type QueryLogsResult = z.infer<typeof queryLogsSchema>;\n\nexport interface QueryLogsParams {\n start: string;\n end: string;\n method?: string;\n statusCode?: number;\n urlLike?: string;\n levelMin?: LogLevel;\n limit?: number;\n}\n\nconst v3ErrorSchema = z.object({\n title: z.string().optional(),\n errors: z.record(z.string(), z.string()).optional(),\n});\n\nexport function formatV3Error(body: unknown): string | undefined {\n const parsed = v3ErrorSchema.safeParse(body);\n\n if (!parsed.success) return undefined;\n\n const { title, errors } = parsed.data;\n const fieldErrors =\n errors && Object.keys(errors).length > 0\n ? Object.entries(errors)\n .map(([field, message]) => `${field}: ${message}`)\n .join('; ')\n : undefined;\n\n if (title && fieldErrors) return `${title} (${fieldErrors})`;\n\n return title ?? fieldErrors;\n}\n\n// Accepts either an ISO-8601 timestamp or a Unix epoch (seconds) and returns\n// milliseconds since epoch, or null when the value can't be parsed.\nfunction parseTimeInput(value: string): number | null {\n const trimmed = value.trim();\n\n if (/^\\d+$/.test(trimmed)) {\n return Number(trimmed) * 1000;\n }\n\n const ms = Date.parse(trimmed);\n\n return Number.isNaN(ms) ? null : ms;\n}\n\nconst DURATION_UNIT_MS: Record<string, number> = {\n s: 1000,\n m: 60 * 1000,\n h: 60 * 60 * 1000,\n d: 24 * 60 * 60 * 1000,\n};\n\nfunction parseDuration(value: string): number | null {\n const match = /^(\\d+)([smhd])$/.exec(value.trim());\n\n if (!match) return null;\n\n return Number(match[1]) * DURATION_UNIT_MS[match[2]];\n}\n\nexport function resolveTimeWindow(\n opts: { start?: string; end?: string; since?: string },\n nowMs = Date.now(),\n): {\n start: string;\n end: string;\n} {\n const { since } = opts;\n let { start, end } = opts;\n let startMs: number | null;\n let endMs: number | null;\n\n if (end) {\n endMs = parseTimeInput(end);\n\n if (endMs === null) {\n throw new Error(\n `Invalid --end value \"${end}\". Provide an ISO-8601 timestamp or a Unix epoch (seconds).`,\n );\n }\n } else {\n endMs = nowMs;\n end = new Date(endMs).toISOString();\n }\n\n if (since) {\n const durationMs = parseDuration(since);\n\n if (durationMs === null) {\n throw new Error(\n `Invalid --since value \"${since}\". Provide a duration like 30m, 6h, or 2d (units: s, m, h, d).`,\n );\n }\n\n startMs = endMs - durationMs;\n start = new Date(startMs).toISOString();\n } else if (start) {\n startMs = parseTimeInput(start);\n\n if (startMs === null) {\n throw new Error(\n `Invalid --start value \"${start}\". Provide an ISO-8601 timestamp or a Unix epoch (seconds).`,\n );\n }\n } else {\n throw new Error('Provide a time window with --since <duration> or --start <time>.');\n }\n\n if (startMs > endMs) {\n throw new Error('Invalid time window: --start must be before or equal to --end.');\n }\n\n if (endMs - startMs > SEVEN_DAYS_MS) {\n throw new Error('Invalid time window: the range must not exceed 7 days.');\n }\n\n return { start, end };\n}\n\nconst LEVEL_COLORS: Record<string, Parameters<typeof colorize>[0]> = {\n debug: 'gray',\n info: 'green',\n warn: 'yellow',\n error: 'red',\n};\n\nexport type LogLineFormat = 'default' | 'short' | 'request';\n\nconst UNKNOWN_TIME = 'unknown';\n\nfunction isRedundantExceptionName(name: string, message: string): boolean {\n const parts = name\n .split('<*>')\n .map((part) => part.trim())\n .filter((part) => part.length > 0);\n\n return parts.length > 0 && parts.every((part) => message.includes(part));\n}\n\nconst stringifyMessage = (message: unknown) =>\n typeof message === 'string' ? message : JSON.stringify(message);\n\nexport function formatLogEntry(entry: LogEntry, format: LogLineFormat = 'default'): string {\n const message = (entry.messages ?? [])\n .map(stringifyMessage)\n .join(' ')\n .replace(/\\s+/g, ' ')\n .trim();\n\n if (format === 'short') return message;\n\n const level = entry.level ?? 'unknown';\n const coloredLevel = colorize(LEVEL_COLORS[level.toLowerCase()] ?? 'white', level.toUpperCase());\n\n const exceptionStr =\n entry.is_exception &&\n entry.exception_name &&\n !isRedundantExceptionName(entry.exception_name, message)\n ? ` ${colorize('red', `[${entry.exception_name}]`)}`\n : '';\n\n let requestStr = '';\n\n if (format === 'request' && entry.request) {\n const parts: string[] = [];\n\n if (entry.request.method) parts.push(entry.request.method);\n if (entry.request.url) parts.push(entry.request.url);\n\n // status_code 0 is the backend's \"unknown\" sentinel — omit it.\n const status = entry.request.status_code ? ` (${entry.request.status_code})` : '';\n\n if (parts.length > 0) requestStr = ` ${parts.join(' ')}${status}`;\n }\n\n return `[${entry.timestamp ?? UNKNOWN_TIME}] [${coloredLevel}]${requestStr}${exceptionStr} ${message}`;\n}\n\nexport async function queryLogs(\n projectUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n params: QueryLogsParams,\n): Promise<QueryLogsResult> {\n const search = new URLSearchParams();\n\n search.set('start', params.start);\n search.set('end', params.end);\n\n if (params.method) search.set('method', params.method);\n if (params.statusCode != null) search.set('status_code', String(params.statusCode));\n if (params.urlLike) search.set('url:like', params.urlLike); // colon param\n if (params.levelMin) search.set('level:min', params.levelMin); // colon param\n if (params.limit != null) search.set('limit', String(params.limit));\n\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/logs/${projectUuid}?${search.toString()}`,\n {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n 'X-Correlation-Id': getTelemetry().correlationId,\n Accept: 'application/json',\n },\n },\n );\n\n assertAuthorized(response);\n\n if (response.status === 403) {\n throw new Error(\n 'Infrastructure Logs API not enabled. If you are part of the beta, contact support@bigcommerce.com to enable it.',\n );\n }\n\n if (response.status === 404) {\n throw new Error('Project not found. Check the project UUID.');\n }\n\n // 400 (bad UUID) and 422 (invalid window/filter) both carry the field-keyed\n // v3 error envelope — surface its message rather than the bare status.\n if (response.status === 400 || response.status === 422) {\n const body: unknown = await response.json().catch(() => null);\n\n throw new Error(formatV3Error(body) ?? 'Invalid log query.');\n }\n\n if (!response.ok) {\n throw new Error(`Failed to fetch logs: ${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n\n return queryLogsSchema.parse(res);\n}\n","import { Command } from 'commander';\n\nimport { getStoredEnv, parseEnvAssignment } from '../lib/env-config';\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\n\n// Values are secrets, so we never print them back. A fixed-width mask avoids\n// leaking the length of the stored value.\nconst MASK = '••••••';\n\nconst add = new Command('add')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Add or update one or more deployment environment variables. Stored in .bigcommerce/project.json and sent as secrets on every `catalyst deploy`.',\n )\n .argument('<vars...>', 'One or more environment variables in KEY=VALUE format.')\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst env add BIGCOMMERCE_STORE_HASH=abc123 BIGCOMMERCE_STOREFRONT_TOKEN=ey...`,\n )\n .action((vars: string[]) => {\n const config = getProjectConfig();\n const stored = { ...getStoredEnv(config) };\n\n // Parse everything before writing so a single invalid entry doesn't leave a\n // partial update behind.\n const parsed = vars.map((entry) => parseEnvAssignment(entry));\n\n parsed.forEach(({ key, value }) => {\n stored[key] = value;\n });\n\n config.set('env', stored);\n\n const keys = parsed.map(({ key }) => key);\n\n consola.success(\n `Saved ${keys.length} environment variable${keys.length === 1 ? '' : 's'} to .bigcommerce/project.json:`,\n );\n keys.forEach((key) => consola.log(` ${key}=${MASK}`));\n\n process.exit(0);\n });\n\nconst remove = new Command('remove')\n .configureHelp({ showGlobalOptions: true })\n .description('Remove one or more stored deployment environment variables.')\n .argument('<keys...>', 'One or more environment variable names to remove.')\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst env remove BIGCOMMERCE_STORE_HASH BIGCOMMERCE_STOREFRONT_TOKEN`,\n )\n .action((keys: string[]) => {\n const config = getProjectConfig();\n const stored = getStoredEnv(config);\n const toRemove = new Set<string>();\n\n keys.forEach((key) => {\n if (key in stored) {\n toRemove.add(key);\n } else {\n consola.warn(`No stored environment variable named \"${key}\". Skipping.`);\n }\n });\n\n const next = Object.fromEntries(Object.entries(stored).filter(([key]) => !toRemove.has(key)));\n\n config.set('env', next);\n\n const removed = Array.from(toRemove);\n\n if (removed.length > 0) {\n consola.success(\n `Removed ${removed.length} environment variable${removed.length === 1 ? '' : 's'}: ${removed.join(', ')}.`,\n );\n }\n\n process.exit(0);\n });\n\nconst list = new Command('list')\n .configureHelp({ showGlobalOptions: true })\n .description('List stored deployment environment variables (values are masked).')\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst env list`,\n )\n .action(() => {\n const config = getProjectConfig();\n const stored = getStoredEnv(config);\n const keys = Object.keys(stored).sort();\n\n if (keys.length === 0) {\n consola.info('No environment variables stored. Add one with `catalyst env add KEY=VALUE`.');\n process.exit(0);\n\n return;\n }\n\n keys.forEach((key) => consola.log(`${key}=${MASK}`));\n\n process.exit(0);\n });\n\nexport const env = new Command('env')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Manage persistent deployment environment variables. These are sent as secrets on every `catalyst deploy`, so you no longer need to pass `--secret` each time.',\n )\n .addCommand(add)\n .addCommand(remove)\n .addCommand(list);\n","import { Command, InvalidArgumentError, Option } from 'commander';\nimport { colorize } from 'consola/utils';\nimport { z } from 'zod';\n\nimport { UnauthorizedError } from '../lib/auth-errors';\nimport { consola } from '../lib/logger';\nimport { formatLogEntry, LOG_LEVELS, queryLogs, resolveTimeWindow } from '../lib/observability';\nimport { getProjectConfig } from '../lib/project-config';\nimport { resolveCredentials } from '../lib/resolve-credentials';\nimport {\n accessTokenOption,\n apiHostOption,\n projectUuidOption,\n resolveProjectUuid,\n storeHashOption,\n} from '../lib/shared-options';\nimport { Telemetry } from '../lib/telemetry';\n\ntype LogFormat = 'json' | 'pretty' | 'default' | 'short' | 'request';\n\nconst telemetry = new Telemetry();\n\nconst DEFAULT_CONNECTION_TTL_MS = 1 * 60 * 1000; // 1 minute\nconst MAX_RETRIES = 5;\n\nconst isFatalStatusCode = (status: number) => status >= 400 && status < 500;\n\nconst LEVEL_COLORS: Record<string, Parameters<typeof colorize>[0]> = {\n INFO: 'green',\n WARN: 'yellow',\n ERROR: 'red',\n DEBUG: 'gray',\n};\n\nconst LogEventSchema = z\n .object({\n uuid: z.string(),\n project_uuid: z.string(),\n request: z.object({\n method: z.string(),\n url: z.string(),\n status_code: z.number(),\n }),\n logs: z.array(\n z.object({\n timestamp: z.string(),\n level: z.string(),\n messages: z.array(z.unknown()),\n }),\n ),\n exceptions: z.array(z.unknown()),\n timestamp: z.string(),\n })\n .loose();\n\nclass StreamError extends Error {\n fatal: boolean;\n\n constructor(message: string, fatal: boolean) {\n super(message);\n this.fatal = fatal;\n }\n}\n\nconst formatMessages = (messages: unknown[]) =>\n messages.map((m) => (typeof m === 'string' ? m : JSON.stringify(m))).join(' ');\n\nconst formatLogEvent = (\n event: z.infer<typeof LogEventSchema>,\n format: 'default' | 'short' | 'request',\n) => {\n const { request, logs: logEntries, exceptions } = event;\n\n logEntries.forEach((entry) => {\n const msg = formatMessages(entry.messages);\n const level = entry.level.toUpperCase();\n const coloredLevel = colorize(LEVEL_COLORS[level] ?? 'white', level);\n\n switch (format) {\n case 'short':\n consola.log(msg);\n break;\n\n case 'request':\n consola.log(\n `[${entry.timestamp}] [${coloredLevel}] ${request.method} ${request.url}` +\n ` (${request.status_code}) ${msg}`,\n );\n break;\n\n default:\n consola.log(`[${entry.timestamp}] [${coloredLevel}] ${msg}`);\n break;\n }\n });\n\n exceptions.forEach((exception) => {\n consola.error(`[${event.timestamp}] EXCEPTION`, exception);\n });\n};\n\nexport const parseSSEEvent = (raw: string): string | null => {\n const joined = raw\n .split('\\n')\n .flatMap((line) => (line.startsWith('data:') ? [line.slice(5).trim()] : []))\n .join('\\n');\n\n return joined.length > 0 ? joined : null;\n};\n\nconst processLogEvent = (event: string, format: LogFormat) => {\n if (format === 'json') {\n process.stdout.write(`${event}\\n`);\n\n return;\n }\n\n try {\n const parsed: unknown = JSON.parse(event);\n const logEvent = LogEventSchema.parse(parsed);\n\n if (format === 'pretty') {\n consola.log(JSON.stringify(logEvent, null, 2));\n } else {\n formatLogEvent(logEvent, format);\n }\n } catch {\n consola.warn(`Failed to parse log event: ${event}`);\n }\n};\n\ntype TimeoutRaceResult<T> = { kind: 'value'; value: T } | { kind: 'timeout' };\n\n// Races a promise against a timer so a hung `reader.read()` doesn't block the\n// read pump. Without this, the connection TTL check never runs when the API\n// proxy half-closes the socket — bytes stop arriving but no FIN/error\n// surfaces, so the read promise stays pending forever.\nconst raceWithTimeout = async <T>(\n promise: Promise<T>,\n timeoutMs: number,\n): Promise<TimeoutRaceResult<T>> => {\n let timeoutHandle: ReturnType<typeof setTimeout> | undefined;\n\n const timeoutPromise = new Promise<TimeoutRaceResult<T>>((resolve) => {\n timeoutHandle = setTimeout(() => resolve({ kind: 'timeout' }), timeoutMs);\n });\n\n try {\n return await Promise.race([\n promise.then((value): TimeoutRaceResult<T> => ({ kind: 'value', value })),\n timeoutPromise,\n ]);\n } finally {\n if (timeoutHandle) clearTimeout(timeoutHandle);\n }\n};\n\nconst openLogStream = async (\n projectUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n) => {\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/logs/${projectUuid}/tail`,\n {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n Accept: 'text/event-stream',\n Connection: 'keep-alive',\n },\n },\n );\n\n // An invalid/expired token won't recover by reconnecting — surface the\n // re-auth guidance and stop the loop (fatal) rather than burning retries.\n if (response.status === 401) {\n throw new StreamError(new UnauthorizedError().message, true);\n }\n\n if (!response.ok) {\n throw new StreamError(\n `Failed to open log stream: ${response.status} ${response.statusText}`,\n isFatalStatusCode(response.status),\n );\n }\n\n const reader = response.body?.getReader();\n\n if (!reader) {\n throw new StreamError('Failed to read log stream.', true);\n }\n\n return reader;\n};\n\n// Reasons the read pump stops on its own (vs. throwing). The outer reconnect\n// loop maps each to a user-facing message — or silence — and opens a fresh\n// stream.\ntype Rotation = 'ttl' | 'idle-timeout' | 'stream-done';\n\nconst pumpUntilRotation = async (\n reader: ReadableStreamDefaultReader<Uint8Array>,\n format: LogFormat,\n connectionTtlMs: number,\n): Promise<Rotation> => {\n const decoder = new TextDecoder();\n const connectTime = Date.now();\n let buffer = '';\n let receivedData = false;\n\n // eslint-disable-next-line no-constant-condition, @typescript-eslint/no-unnecessary-condition\n while (true) {\n const remainingTtlMs = connectionTtlMs - (Date.now() - connectTime);\n\n if (remainingTtlMs <= 0) {\n void reader.cancel();\n\n return 'ttl';\n }\n\n // eslint-disable-next-line no-await-in-loop\n const readResult = await raceWithTimeout(reader.read(), remainingTtlMs);\n\n if (readResult.kind === 'timeout') {\n void reader.cancel();\n\n // No data for the whole window: proxy likely half-closed the socket.\n // If data flowed earlier, treat it as a normal TTL boundary instead.\n return receivedData ? 'ttl' : 'idle-timeout';\n }\n\n const { value, done: streamDone } = readResult.value;\n\n if (value) {\n receivedData = true;\n buffer += decoder.decode(value, { stream: true });\n\n const parts = buffer.split('\\n\\n');\n\n // Last element is either empty (complete event) or a partial chunk to carry over\n buffer = parts.pop() ?? '';\n\n parts\n .map((raw) => parseSSEEvent(raw))\n .filter((event): event is string => event !== null)\n .forEach((event) => processLogEvent(event, format));\n }\n\n if (streamDone) {\n void reader.cancel();\n\n return 'stream-done';\n }\n }\n};\n\nexport const tailLogs = async (\n projectUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n format: LogFormat,\n connectionTtlMs = DEFAULT_CONNECTION_TTL_MS,\n) => {\n consola.info('Tailing logs...');\n\n let retries = 0;\n\n // eslint-disable-next-line no-constant-condition, @typescript-eslint/no-unnecessary-condition\n while (true) {\n try {\n // eslint-disable-next-line no-await-in-loop\n const reader = await openLogStream(projectUuid, storeHash, accessToken, apiHost);\n\n retries = 0;\n\n // eslint-disable-next-line no-await-in-loop\n const rotation = await pumpUntilRotation(reader, format, connectionTtlMs);\n\n if (rotation === 'idle-timeout') {\n consola.warn('Log stream idle, reconnecting...');\n }\n // 'ttl' and 'stream-done' are healthy rotations — reconnect silently.\n } catch (error) {\n if (error instanceof StreamError && error.fatal) {\n throw error;\n }\n\n const isServerDisconnect = error instanceof TypeError && error.message === 'terminated';\n\n if (isServerDisconnect) {\n consola.warn('Log stream closed by server, reconnecting...');\n } else {\n retries += 1;\n\n if (retries >= MAX_RETRIES) {\n throw new Error(`Failed to connect to log stream after ${MAX_RETRIES} retries.`);\n }\n\n consola.warn(\n `Log stream disconnected, reconnecting (attempt ${retries}/${MAX_RETRIES})...`,\n error,\n );\n }\n }\n }\n};\n\nconst tail = new Command('tail')\n .configureHelp({ showGlobalOptions: true })\n .description('Tail live logs from your deployed application.')\n .addHelpText(\n 'after',\n `\nExamples:\n $ catalyst logs tail\n\n # Tail logs with request format\n $ catalyst logs tail --format request\n\n # Tail logs as raw JSON (useful for piping to other tools)\n $ catalyst logs tail --format json`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .addOption(\n new Option('--format <format>', 'Output format for log events.')\n .choices(['json', 'pretty', 'default', 'short', 'request'])\n .default('default'),\n )\n .action(async (options) => {\n try {\n const config = getProjectConfig();\n const { storeHash, accessToken } = resolveCredentials(options, config);\n\n await telemetry.identify(storeHash);\n\n const projectUuid = resolveProjectUuid(options);\n\n await tailLogs(projectUuid, storeHash, accessToken, options.apiHost, options.format);\n } catch (error) {\n consola.error(error);\n process.exit(1);\n }\n });\n\n// Validates a numeric flag client-side so typos fail instantly with a clear\n// message instead of sending NaN (or an out-of-range value) to the API.\nconst parseIntInRange = (flag: string, min: number, max: number) => (value: string) => {\n const parsed = Number(value);\n\n if (!Number.isInteger(parsed) || parsed < min || parsed > max) {\n throw new InvalidArgumentError(`${flag} must be an integer between ${min} and ${max}.`);\n }\n\n return parsed;\n};\n\nconst query = new Command('query')\n .configureHelp({ showGlobalOptions: true })\n .description('Query historical logs from your deployed application.')\n .addHelpText(\n 'after',\n `\nSpecify a time window with \\`--since\\` (relative to now) or \\`--start\\`/\\`--end\\`\n(ISO-8601 timestamps or Unix epoch seconds, UTC). The window may not exceed\n7 days. Entries print oldest-first; timestamps are UTC.\n\nExamples:\n # Last hour of logs\n $ catalyst logs query --since 1h\n\n # Everything from today (UTC)\n $ catalyst logs query --start 2026-06-11T00:00:00Z\n\n # Errors only for a specific path\n $ catalyst logs query --since 24h --level-min error --url-like /cart\n\n # Errors with request details (method, URL, status)\n $ catalyst logs query --since 1h --level-min error --format request\n\n # Raw JSON (NDJSON) for piping to other tools\n $ catalyst logs query --since 2d --format json`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .addOption(\n new Option(\n '--since <duration>',\n 'Relative window ending at --end (default: now), e.g. 30m, 6h, 2d (units: s, m, h, d).',\n ).conflicts('start'),\n )\n .option('--start <time>', 'Window start: ISO-8601 timestamp or Unix epoch (seconds).')\n .option(\n '--end <time>',\n 'Window end: ISO-8601 timestamp or Unix epoch (seconds). Defaults to now. The window must not exceed 7 days.',\n )\n .option('--method <method>', 'Filter by request HTTP method (case-insensitive).')\n .addOption(\n new Option('--status-code <code>', 'Filter by response status code (100-599).').argParser(\n parseIntInRange('--status-code', 100, 599),\n ),\n )\n .option('--url-like <substring>', 'Filter by URL substring (case-sensitive).')\n .addOption(\n new Option('--level-min <level>', 'Minimum log level.').choices(Array.from(LOG_LEVELS)),\n )\n .addOption(\n new Option('--limit <n>', 'Maximum number of entries to return (1-500).')\n .argParser(parseIntInRange('--limit', 1, 500))\n .default(100),\n )\n // TODO(TRAC-934): --after (cursor) and --all (follow pagination) were\n // removed until Cloudflare fixes invocations-view pagination\n .addOption(\n new Option('--format <format>', 'Output format for log entries.')\n .choices(['json', 'pretty', 'default', 'short', 'request'])\n .default('default'),\n )\n .action(async (options) => {\n try {\n const config = getProjectConfig();\n const { storeHash, accessToken } = resolveCredentials(options, config);\n\n await telemetry.identify(storeHash);\n\n const projectUuid = resolveProjectUuid(options);\n const { start, end } = resolveTimeWindow(options);\n\n const result = await queryLogs(projectUuid, storeHash, accessToken, options.apiHost, {\n start,\n end,\n method: options.method,\n statusCode: options.statusCode,\n urlLike: options.urlLike,\n levelMin: options.levelMin,\n limit: options.limit,\n });\n\n const entries = result.data;\n const ordered = [...entries].reverse();\n\n if (options.format === 'json') {\n ordered.forEach((entry) => process.stdout.write(`${JSON.stringify(entry)}\\n`));\n\n return;\n }\n\n if (options.format === 'pretty') {\n ordered.forEach((entry) => consola.log(JSON.stringify(entry, null, 2)));\n\n return;\n }\n\n if (entries.length === 0) {\n consola.info('No log entries found for the given window and filters.');\n\n return;\n }\n\n // `json`/`pretty` returned above, leaving the human line formats — capture\n // the narrowed value so it survives into the forEach closure.\n const lineFormat = options.format;\n\n ordered.forEach((entry) => consola.log(formatLogEntry(entry, lineFormat)));\n\n consola.info(\n `${entries.length} ${entries.length === 1 ? 'entry' : 'entries'} shown (oldest first, times in UTC).`,\n );\n\n if (entries.length === options.limit) {\n consola.info(\n `Limit of ${options.limit} reached; older entries may exist. ` +\n 'Narrow the time window or raise --limit (max 500) to see more.',\n );\n }\n } catch (error) {\n consola.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nexport const logs = new Command('logs')\n .configureHelp({ showGlobalOptions: true })\n .description('View logs from your deployed application.')\n .addCommand(tail, { isDefault: true })\n .addCommand(query);\n","import { confirm, input, select } from '@inquirer/prompts';\nimport { Command } from 'commander';\nimport { colorize } from 'consola/utils';\n\nimport {\n cleanupCloudflareIncompatibilities,\n NoLinkedProjectError,\n selectOrCreateInfrastructureProject,\n setupCommerceHosting,\n} from '../lib/commerce-hosting';\nimport { installDependencies } from '../lib/install-dependencies';\nimport { consola } from '../lib/logger';\nimport { LoginAbortedError, login as runInteractiveLogin } from '../lib/login';\nimport { createProject, deleteProject, fetchProjects } from '../lib/project';\nimport { getProjectConfig } from '../lib/project-config';\nimport { getProjectState } from '../lib/project-state';\nimport { resolveCredentials } from '../lib/resolve-credentials';\nimport {\n accessTokenOption,\n apiHostOption,\n loginUrlOption,\n projectUuidOption,\n storeHashOption,\n} from '../lib/shared-options';\nimport { getTelemetry } from '../lib/telemetry';\n\n// `catalyst project link` runs from the project root, which is what\n// `setupCommerceHosting` and `installDependencies` expect.\nasync function offerCommerceHostingSetup(\n projectUuid: string,\n credentials?: { storeHash: string; accessToken: string },\n) {\n const projectDir = process.cwd();\n\n // Already-transformed projects skip the setup prompt below — but they may\n // still carry artifacts incompatible with the Cloudflare worker bundle\n // (e.g. `core/instrumentation.ts`, `@vercel/otel`). Run cleanup so existing\n // Commerce Hosting users pick up these fixes on re-link without prompting.\n if (getProjectState().isTransformed) {\n await cleanupCloudflareIncompatibilities(projectDir);\n\n return;\n }\n\n const shouldSetup = await confirm({\n message:\n 'Your project has been linked, but is not fully set up for Commerce Hosting deployments yet. Would you like to run the setup now?',\n default: true,\n });\n\n if (!shouldSetup) return;\n\n await setupCommerceHosting({\n projectDir,\n projectUuid,\n storeHash: credentials?.storeHash,\n accessToken: credentials?.accessToken,\n });\n\n consola.success('Commerce Hosting setup complete.');\n\n await installDependencies(projectDir);\n}\n\nconst list = new Command('list')\n .configureHelp({ showGlobalOptions: true })\n .description('List BigCommerce infrastructure projects for your store.')\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst project list`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .action(async (options) => {\n const config = getProjectConfig();\n const { storeHash, accessToken } = resolveCredentials(options, config);\n\n await getTelemetry().identify(storeHash);\n\n consola.start('Fetching projects...');\n\n const projects = await fetchProjects(storeHash, accessToken, options.apiHost);\n\n consola.success('Projects fetched.');\n\n if (projects.length === 0) {\n consola.info('No projects found.');\n process.exit(0);\n\n return;\n }\n\n const linkedProjectUuid = config.get('projectUuid');\n\n const projectList = projects.map((p) => {\n const marker = p.uuid === linkedProjectUuid ? ` ${colorize('green', '[linked]')}` : '';\n const hostnames =\n p.deployment_hostnames.length === 0\n ? [' (not deployed)']\n : p.deployment_hostnames.map(\n (hostname) => ` ${colorize('blue', `https://${hostname}`)}`,\n );\n\n return [`${p.name} (${p.uuid})${marker}`, ...hostnames].join('\\n');\n });\n\n // Single log call so projects are blank-line separated without each blank\n // picking up a reporter timestamp.\n consola.log(projectList.join('\\n\\n'));\n\n process.exit(0);\n });\n\nconst create = new Command('create')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Create a new BigCommerce infrastructure project and link it to your local Catalyst project. Walks you through logging in if you are not authenticated yet.',\n )\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst project create`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(loginUrlOption())\n .action(async (options) => {\n const config = getProjectConfig();\n\n let storeHash = options.storeHash ?? config.get('storeHash');\n let accessToken = options.accessToken ?? config.get('accessToken');\n\n if (!storeHash || !accessToken) {\n consola.info(\n \"You're not logged in yet. Let's get you authenticated before creating a project.\",\n );\n\n try {\n const credentials = await runInteractiveLogin(options.loginUrl, options.apiHost);\n\n storeHash = credentials.storeHash;\n accessToken = credentials.accessToken;\n\n config.set('storeHash', storeHash);\n config.set('accessToken', accessToken);\n\n consola.success(`Logged in to store ${storeHash}.`);\n } catch (error) {\n if (error instanceof LoginAbortedError) {\n consola.info(\n 'Login aborted. Re-run `catalyst project create` when you have your credentials ready.',\n );\n process.exit(0);\n\n return;\n }\n\n throw error;\n }\n }\n\n await getTelemetry().identify(storeHash);\n\n const newProjectName = await input({ message: 'Enter a name for the new project:' });\n\n const data = await createProject(newProjectName, storeHash, accessToken, options.apiHost);\n\n consola.success(`Project \"${data.name}\" created successfully.`);\n\n consola.start('Writing project UUID to .bigcommerce/project.json...');\n config.set('projectUuid', data.uuid);\n config.set('storeHash', storeHash);\n config.set('accessToken', accessToken);\n consola.success('Project UUID written to .bigcommerce/project.json.');\n\n process.exit(0);\n });\n\nexport const link = new Command('link')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Link your local Catalyst project to a BigCommerce infrastructure project. You can provide a project UUID directly, or fetch and select from available projects using your store credentials.',\n )\n .addHelpText(\n 'after',\n `\nExamples:\n # Link interactively (prompts to select or create)\n $ catalyst project link\n\n # Link using a project UUID directly\n $ catalyst project link --project-uuid <UUID>`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .action(async (options) => {\n const config = getProjectConfig();\n\n const writeProjectConfig = (\n uuid: string,\n credentials?: { storeHash: string; accessToken: string },\n ) => {\n consola.start('Writing project UUID to .bigcommerce/project.json...');\n config.set('projectUuid', uuid);\n\n if (credentials) {\n config.set('storeHash', credentials.storeHash);\n config.set('accessToken', credentials.accessToken);\n }\n\n consola.success('Project UUID written to .bigcommerce/project.json.');\n };\n\n if (options.projectUuid) {\n writeProjectConfig(options.projectUuid);\n await offerCommerceHostingSetup(options.projectUuid);\n\n process.exit(0);\n\n return;\n }\n\n const { storeHash, accessToken } = resolveCredentials(options, config);\n\n await getTelemetry().identify(storeHash);\n\n let selected;\n\n try {\n selected = await selectOrCreateInfrastructureProject(\n { storeHash, accessToken, apiHost: options.apiHost },\n config.get('projectUuid'),\n );\n } catch (error) {\n if (error instanceof NoLinkedProjectError) {\n consola.info(\n \"When you're ready to create a project, run `catalyst project create` or re-run `catalyst project link`.\",\n );\n process.exit(0);\n\n // Unreachable in production; prevents continuation when process.exit is mocked in tests.\n throw error;\n }\n\n throw error;\n }\n\n writeProjectConfig(selected.uuid, { storeHash, accessToken });\n await offerCommerceHostingSetup(selected.uuid, { storeHash, accessToken });\n\n process.exit(0);\n });\n\nconst del = new Command('delete')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Permanently delete a BigCommerce infrastructure project. This action is irreversible.',\n )\n .addHelpText(\n 'after',\n `\nExamples:\n # Select a project to delete interactively\n $ catalyst project delete\n\n # Delete a specific project (still prompts for confirmation)\n $ catalyst project delete --project-uuid <UUID>\n\n # Skip the confirmation prompt\n $ catalyst project delete --project-uuid <UUID> --force`,\n )\n .addOption(storeHashOption())\n .addOption(accessTokenOption())\n .addOption(apiHostOption())\n .addOption(projectUuidOption())\n .option('--force', 'Skip the confirmation prompt before deleting.')\n .action(async (options) => {\n const config = getProjectConfig();\n const { storeHash, accessToken } = resolveCredentials(options, config);\n\n await getTelemetry().identify(storeHash);\n\n let targetUuid: string | undefined = options.projectUuid;\n let targetName: string | undefined;\n\n if (!targetUuid) {\n consola.start('Fetching projects...');\n\n const projects = await fetchProjects(storeHash, accessToken, options.apiHost);\n\n consola.success('Projects fetched.');\n\n if (projects.length === 0) {\n consola.info('No projects found.');\n process.exit(0);\n\n return;\n }\n\n const linkedProjectUuid = config.get('projectUuid');\n\n const selected = await select({\n message: 'Select a project to delete (Press <enter> to select).',\n choices: [\n ...projects.map((p) => ({\n name:\n p.uuid === linkedProjectUuid ? `${p.name} ${colorize('green', '[linked]')}` : p.name,\n value: p.uuid,\n description: p.uuid,\n })),\n { name: 'Cancel', value: 'cancel', description: 'Exit without deleting any project.' },\n ],\n });\n\n if (selected === 'cancel') {\n consola.info('Aborted. No project was deleted.');\n process.exit(0);\n\n return;\n }\n\n const matched = projects.find((p) => p.uuid === selected);\n\n if (!matched) {\n throw new Error(`Selected project ${String(selected)} not found in fetched list.`);\n }\n\n targetUuid = matched.uuid;\n targetName = matched.name;\n }\n\n if (!options.force) {\n const label = targetName ? `\"${targetName}\" (${targetUuid})` : targetUuid;\n\n const confirmed = await confirm({\n message: `Are you sure you want to delete project ${label}? This action is irreversible and will permanently destroy the project and all of its data.`,\n default: false,\n });\n\n if (!confirmed) {\n consola.info('Aborted. No project was deleted.');\n process.exit(0);\n\n return;\n }\n }\n\n consola.start(`Deleting project ${targetUuid}...`);\n\n await deleteProject(targetUuid, storeHash, accessToken, options.apiHost);\n\n consola.success(`Project ${targetUuid} deleted.`);\n\n if (config.get('projectUuid') === targetUuid) {\n config.delete('projectUuid');\n consola.info('Removed project UUID from .bigcommerce/project.json.');\n }\n\n process.exit(0);\n });\n\nexport const project = new Command('project')\n .configureHelp({ showGlobalOptions: true })\n .description('Manage your BigCommerce infrastructure project.')\n .addCommand(create)\n .addCommand(list)\n .addCommand(link)\n .addCommand(del);\n","import { Command } from 'commander';\nimport { execa } from 'execa';\nimport { existsSync, lstatSync, symlinkSync } from 'node:fs';\nimport { join, relative } from 'node:path';\n\nimport { consola } from '../lib/logger';\nimport { getProjectState } from '../lib/project-state';\n\nexport const start = new Command('start')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'Start a local preview of your Catalyst storefront using the OpenNext Cloudflare adapter.',\n )\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst start`,\n )\n .action(async () => {\n // Project must be transformed before the OpenNext preview can run. If it\n // isn't, fall through to `next start` so this command works for self-hosted\n // Catalyst projects too.\n const state = getProjectState();\n\n if (!state.isTransformed) {\n consola.info('Project is not set up for Commerce Hosting — running `next start`.');\n\n await execa('pnpm', ['exec', 'next', 'start'], {\n stdio: 'inherit',\n cwd: process.cwd(),\n });\n\n return;\n }\n\n const envLocal = join(process.cwd(), '.env.local');\n const devVars = join(process.cwd(), '.bigcommerce', '.dev.vars');\n\n if (existsSync(envLocal)) {\n if (!existsSync(devVars)) {\n const target = relative(join(process.cwd(), '.bigcommerce'), envLocal);\n\n symlinkSync(target, devVars);\n consola.success('Symlinked .bigcommerce/.dev.vars → .env.local');\n } else if (!lstatSync(devVars).isSymbolicLink()) {\n consola.warn(\n '.bigcommerce/.dev.vars already exists and is not a symlink. ' +\n 'Wrangler will use it instead of .env.local.',\n );\n }\n } else {\n consola.warn(\n 'No .env.local file found. The preview server may fail without environment variables.\\n' +\n 'Create a .env.local file in your project root with the required variables.',\n );\n }\n\n await execa(\n 'pnpm',\n [\n 'exec',\n 'opennextjs-cloudflare',\n 'preview',\n '--config',\n join('.bigcommerce', 'wrangler.jsonc'),\n ],\n {\n stdio: 'inherit',\n cwd: process.cwd(),\n },\n );\n });\n","import { Argument, Command, Option } from 'commander';\nimport { colorize } from 'consola/utils';\n\nimport { consola } from '../lib/logger';\nimport { getTelemetry } from '../lib/telemetry';\n\nconst telemetryService = getTelemetry();\nlet isEnabled = telemetryService.isEnabled();\n\nexport const telemetry = new Command('telemetry')\n .configureHelp({ showGlobalOptions: true })\n .description(\n 'View or change CLI telemetry collection status. Enabling telemetry helps BigCommerce support diagnose and troubleshoot errors you encounter when using the CLI.',\n )\n .addHelpText(\n 'after',\n `\nExamples:\n # Show telemetry status\n $ catalyst telemetry\n\n # Enable telemetry collection\n $ catalyst telemetry enable\n\n # Disable telemetry collection\n $ catalyst telemetry --disable`,\n )\n .addArgument(new Argument('[arg]').choices(['disable', 'enable', 'status']))\n .addOption(new Option('--enable', `Enables CLI telemetry collection.`).conflicts('disable'))\n .option('--disable', `Disables CLI telemetry collection.`)\n .action((arg, options) => {\n if (options.enable || arg === 'enable') {\n telemetryService.setEnabled(true);\n isEnabled = true;\n\n consola.success('Success!\\n');\n } else if (options.disable || arg === 'disable') {\n telemetryService.setEnabled(false);\n\n if (isEnabled) {\n consola.success('Your preference has been saved.');\n } else {\n consola.info(`Catalyst CLI telemetry collection is already disabled.`);\n }\n\n isEnabled = false;\n } else {\n consola.info('Catalyst CLI Telemetry\\n');\n }\n\n consola.info(\n `Status: ${colorize('bold', isEnabled ? colorize('green', 'Enabled') : colorize('red', 'Disabled'))}`,\n );\n\n if (!isEnabled) {\n consola.info(\n `You have opted-out of Catalyst CLI telemetry. No data will be collected from your machine.`,\n );\n }\n });\n","import { Command, Option } from '@commander-js/extra-typings';\nimport { confirm } from '@inquirer/prompts';\nimport { execa } from 'execa';\nimport {\n access,\n copyFile,\n cp,\n mkdir,\n mkdtemp,\n readdir,\n readFile,\n rename,\n rm,\n writeFile,\n} from 'node:fs/promises';\nimport { homedir, tmpdir } from 'node:os';\nimport { dirname, join, relative } from 'node:path';\nimport yoctoSpinner from 'yocto-spinner';\nimport { z } from 'zod';\n\nimport { consola } from '../lib/logger';\nimport { getTelemetry } from '../lib/telemetry';\n\nconst CorePackageJson = z.object({\n name: z.string().optional(),\n version: z.string(),\n catalyst: z.object({ version: z.string(), ref: z.string() }).optional(),\n});\n\n// Catalyst versions are git tags on the upstream monorepo (e.g.\n// \"@bigcommerce/catalyst-core@1.7.0\"), NOT npm packages. GitHub serves a\n// tarball for any tag via the repos/<owner>/<repo>/tarball/<ref> endpoint.\nconst DEFAULT_REPOSITORY = 'bigcommerce/catalyst';\n\n// Moving tags that don't pin a concrete version. When the target is one of\n// these we resolve the real version from the downloaded core/package.json so\n// catalyst.ref records a stable pin rather than the alias.\nconst MOVING_TAGS = new Set(['latest', 'canary', 'alpha']);\n\n// Known Catalyst package families, used to reconstruct a base ref from a\n// project's package.json `name` when `catalyst.ref` is missing.\nconst KNOWN_FAMILIES = new Set([\n '@bigcommerce/catalyst-core',\n '@bigcommerce/catalyst-makeswift',\n '@bigcommerce/catalyst-b2b-makeswift',\n '@bigcommerce/catalyst-b2b',\n]);\n\nconst CACHE_DIR = join(homedir(), '.cache', 'catalyst-cli', 'cores');\n\n// ── small fs helpers ──────────────────────────────────────────────────────────\nconst pathExists = (p: string) =>\n access(p)\n .then(() => true)\n .catch(() => false);\n\nasync function listFiles(dir: string, prefix = ''): Promise<string[]> {\n const entries = await readdir(dir, { withFileTypes: true }).catch(() => []);\n\n const nested = await Promise.all(\n entries.map((entry) => {\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name;\n\n return entry.isDirectory() ? listFiles(join(dir, entry.name), rel) : Promise.resolve([rel]);\n }),\n );\n\n return nested.flat();\n}\n\nasync function filesEqual(a: string, b: string): Promise<boolean> {\n const [ba, bb] = await Promise.all([\n readFile(a).catch(() => null),\n readFile(b).catch(() => null),\n ]);\n\n return ba !== null && bb !== null && ba.equals(bb);\n}\n\n// Returns the fraction of files in baseDir that exist and are identical in\n// destDir. Used to validate an inferred base: a correct base scores ~0.7-0.8+\n// (the files the merchant hasn't touched); a wrong base scores much lower.\nexport async function computeBaseSimilarity(baseDir: string, destDir: string): Promise<number> {\n const baseFiles = await listFiles(baseDir);\n\n if (baseFiles.length === 0) return 0;\n\n const matches = await Promise.all(\n baseFiles.map((rel) => filesEqual(join(baseDir, rel), join(destDir, rel))),\n );\n\n return matches.filter(Boolean).length / baseFiles.length;\n}\n\nasync function isBinary(p: string): Promise<boolean> {\n const buf = await readFile(p).catch(() => null);\n\n if (!buf) return false;\n\n // Same heuristic git uses: a NUL byte near the start means binary.\n return buf.subarray(0, 8000).includes(0);\n}\n\nasync function copyInto(src: string, dest: string): Promise<void> {\n await mkdir(dirname(dest), { recursive: true });\n await copyFile(src, dest);\n}\n\n// ── ref parsing ─────────────────────────────────────────────────────────────\n// Splits \"@bigcommerce/catalyst-core@1.7.0\" → { packageName, version }.\n// The last \"@\" separates the version (scoped names start with \"@\").\nexport function parseRef(ref: string): { packageName: string; version: string } {\n const lastAt = ref.lastIndexOf('@');\n\n if (lastAt <= 0) throw new Error(`Cannot parse ref \"${ref}\" — expected <package>@<version>.`);\n\n return { packageName: ref.slice(0, lastAt), version: ref.slice(lastAt + 1) };\n}\n\nasync function readResolvedVersion(coreDir: string): Promise<string> {\n const raw = await readFile(join(coreDir, 'package.json'), 'utf-8');\n const pkg = CorePackageJson.parse(JSON.parse(raw));\n\n // catalyst.version is the source of truth; older tags lack it and fall back to version.\n return pkg.catalyst?.version ?? pkg.version;\n}\n\n// ── per-file 3-way merge engine ───────────────────────────────────────────────\ntype MergeOutcome = 'applied' | 'added' | 'deleted' | 'conflicted';\n\n// Runs git merge-file (standalone, no object store) writing the merged result\n// (with <<<ours/===/theirs>>> markers on conflict) to `oursPath`.\nasync function mergeFile(oursPath: string, basePath: string, theirsPath: string): Promise<boolean> {\n const merged = await execa(\n 'git',\n [\n 'merge-file',\n '-p',\n '-L',\n 'ours',\n '-L',\n 'base',\n '-L',\n 'theirs',\n oursPath,\n basePath,\n theirsPath,\n ],\n { reject: false, stripFinalNewline: false },\n );\n\n // git merge-file exits 0 (clean) or N>0 (N conflict hunks) — both are normal.\n // A fatal error (e.g. unreadable file) produces stderr output; guard against\n // overwriting the user's file with empty/partial stdout in that case.\n if (merged.stderr) throw new Error(`git merge-file failed: ${merged.stderr}`);\n\n await writeFile(oursPath, merged.stdout);\n\n return (merged.exitCode ?? 0) > 0; // >0 = conflict hunks\n}\n\nasync function mergeModified(\n rel: string,\n baseDir: string,\n theirsDir: string,\n catalystRoot: string,\n): Promise<MergeOutcome | null> {\n const basePath = join(baseDir, rel);\n const theirsPath = join(theirsDir, rel);\n const oursPath = join(catalystRoot, rel);\n\n // Upstream didn't actually change this file — nothing to do.\n if (await filesEqual(basePath, theirsPath)) return null;\n\n // Merchant deleted a file upstream modifies → restore theirs, flag for review.\n if (!(await pathExists(oursPath))) {\n await copyInto(theirsPath, oursPath);\n\n return 'conflicted';\n }\n\n if ((await isBinary(basePath)) || (await isBinary(theirsPath)) || (await isBinary(oursPath))) {\n if (await filesEqual(oursPath, basePath)) {\n await copyInto(theirsPath, oursPath);\n\n return 'applied';\n }\n\n return 'conflicted'; // binary both-changed — can't 3-way; leave ours\n }\n\n return (await mergeFile(oursPath, basePath, theirsPath)) ? 'conflicted' : 'applied';\n}\n\nasync function mergeAdded(\n rel: string,\n theirsDir: string,\n catalystRoot: string,\n emptyFile: string,\n): Promise<MergeOutcome> {\n const theirsPath = join(theirsDir, rel);\n const oursPath = join(catalystRoot, rel);\n\n if (!(await pathExists(oursPath))) {\n await copyInto(theirsPath, oursPath);\n\n return 'added';\n }\n\n if (await filesEqual(oursPath, theirsPath)) return 'applied'; // merchant already has it\n\n if ((await isBinary(oursPath)) || (await isBinary(theirsPath))) return 'conflicted';\n\n // Both added a different version — merge against an empty ancestor.\n const hadConflict = await mergeFile(oursPath, emptyFile, theirsPath);\n\n return hadConflict ? 'conflicted' : 'applied';\n}\n\nasync function mergeDeleted(\n rel: string,\n baseDir: string,\n catalystRoot: string,\n): Promise<MergeOutcome | null> {\n const basePath = join(baseDir, rel);\n const oursPath = join(catalystRoot, rel);\n\n if (!(await pathExists(oursPath))) return null; // already gone\n\n // Merchant kept upstream's version → safe to delete. Otherwise it's a\n // delete/modify conflict: keep ours and flag.\n if (await filesEqual(oursPath, basePath)) {\n await rm(oursPath, { force: true });\n\n return 'deleted';\n }\n\n return 'conflicted';\n}\n\nexport interface MergeResult {\n applied: string[];\n added: string[];\n deleted: string[];\n conflicted: string[];\n}\n\n// Per-file engine: walk the changed-file set and merge each file with\n// `git merge-file`. Needs no git object store, so it works on shallow / no-history\n// merchant repos. Trade-off: no rename detection (a rename = delete + add).\nexport async function mergeCorePerFile(\n baseDir: string,\n theirsDir: string,\n catalystRoot: string,\n emptyFile: string,\n): Promise<MergeResult> {\n const baseFiles = new Set(await listFiles(baseDir));\n const theirsFiles = new Set(await listFiles(theirsDir));\n const result: MergeResult = { applied: [], added: [], deleted: [], conflicted: [] };\n\n const decide = async (rel: string): Promise<void> => {\n const inBase = baseFiles.has(rel);\n const inTheirs = theirsFiles.has(rel);\n\n let outcome: MergeOutcome | null;\n\n if (inBase && inTheirs) {\n outcome = await mergeModified(rel, baseDir, theirsDir, catalystRoot);\n } else if (inTheirs) {\n outcome = await mergeAdded(rel, theirsDir, catalystRoot, emptyFile);\n } else {\n outcome = await mergeDeleted(rel, baseDir, catalystRoot);\n }\n\n if (outcome) result[outcome].push(rel);\n };\n\n await Promise.all([...new Set([...baseFiles, ...theirsFiles])].map(decide));\n\n return result;\n}\n\n// ── merge strategy selection ───────────────────────────────────────────────────\nexport type MergeStrategy = 'auto' | 'tree' | 'per-file';\n\n// `git merge-tree --write-tree` (the whole-tree engine) landed in git 2.38.\nexport async function gitSupportsMergeTree(): Promise<boolean> {\n try {\n const { stdout } = await execa('git', ['--version']);\n const match = /(\\d+)\\.(\\d+)/.exec(stdout);\n\n if (!match) return false;\n\n const [major, minor] = [Number(match[1]), Number(match[2])];\n\n return major > 2 || (major === 2 && minor >= 38);\n } catch {\n return false;\n }\n}\n\n// 'auto' resolves to the whole-tree engine when git supports it, else per-file.\nexport async function resolveStrategy(strategy: MergeStrategy): Promise<'tree' | 'per-file'> {\n if (strategy !== 'auto') return strategy;\n\n if (await gitSupportsMergeTree()) return 'tree';\n\n consola.warn('git < 2.38 — using the per-file merge engine (no `git merge-tree`).');\n\n return 'per-file';\n}\n\n// ── whole-tree 3-way merge engine (git merge-tree, 2.38+) ──────────────────────\n// Builds base/ours/theirs as commits in a throwaway object store, runs a real\n// recursive merge (rename detection, modify/delete, mode changes, binary — all\n// native to git), then materialises the merged tree into the catalyst root.\n// Conflicts come back as in-blob <<<ours/===/theirs>>> markers; like per-file it\n// never aborts. Branch names `ours`/`theirs` make the markers match the per-file\n// engine's labels.\nexport async function mergeCoreTree(\n baseDir: string,\n theirsDir: string,\n catalystRoot: string,\n): Promise<MergeResult> {\n const scratch = await mkdtemp(join(tmpdir(), 'catalyst-merge-'));\n\n try {\n await execa('git', ['init', '-q', scratch]);\n // Disable line-ending conversion so checkout-index writes LF on all platforms.\n await execa('git', ['config', 'core.autocrlf', 'false'], {\n env: { ...process.env, GIT_DIR: join(scratch, '.git') },\n });\n\n const env = {\n ...process.env,\n GIT_DIR: join(scratch, '.git'),\n GIT_AUTHOR_NAME: 'catalyst',\n GIT_AUTHOR_EMAIL: 'catalyst@bigcommerce.com',\n GIT_COMMITTER_NAME: 'catalyst',\n GIT_COMMITTER_EMAIL: 'catalyst@bigcommerce.com',\n };\n\n // Snapshot a directory as a tree object (own index per side; .gitignore is\n // honoured, so build artifacts like node_modules never enter the tree).\n const writeTree = async (workTree: string, tag: string): Promise<string> => {\n const sideEnv = {\n ...env,\n GIT_WORK_TREE: workTree,\n GIT_INDEX_FILE: join(scratch, `index.${tag}`),\n };\n\n await execa('git', ['add', '-A'], { env: sideEnv });\n\n return (await execa('git', ['write-tree'], { env: sideEnv })).stdout.trim();\n };\n\n const commitTree = (tree: string, parent?: string) =>\n execa('git', ['commit-tree', tree, '-m', 'x', ...(parent ? ['-p', parent] : [])], {\n env,\n }).then((r) => r.stdout.trim());\n\n // Run sequentially to avoid concurrent writes to the shared object store\n // on Windows, where simultaneous git processes cause EPERM on object files.\n const baseTree = await writeTree(baseDir, 'base');\n const oursTree = await writeTree(catalystRoot, 'ours');\n const theirsTree = await writeTree(theirsDir, 'theirs');\n\n const baseCommit = await commitTree(baseTree);\n const [oursCommit, theirsCommit] = await Promise.all([\n commitTree(oursTree, baseCommit),\n commitTree(theirsTree, baseCommit),\n ]);\n\n await Promise.all([\n execa('git', ['branch', 'ours', oursCommit], { env }),\n execa('git', ['branch', 'theirs', theirsCommit], { env }),\n ]);\n\n // -z --name-only output: <merged-tree-oid> NUL, then conflicted paths each\n // NUL-terminated, then an empty field marks the end of the conflicted set\n // (everything after is informational messages we don't need).\n const merge = await execa(\n 'git',\n [\n 'merge-tree',\n '--write-tree',\n '-z',\n '--name-only',\n `--merge-base=${baseCommit}`,\n 'ours',\n 'theirs',\n ],\n { env, reject: false },\n );\n\n if ((merge.exitCode ?? 0) > 1)\n throw new Error(merge.stderr || merge.stdout.slice(0, 500) || 'git merge-tree failed');\n\n // -z --name-only emits <merged-tree-oid>, then conflicted paths, then an\n // empty field; everything after that is informational and ignored.\n const fields = merge.stdout.split('\\0');\n const mergedTree = fields[0];\n const afterOid = fields.slice(1);\n const emptyAt = afterOid.indexOf('');\n const conflicted = afterOid.slice(0, emptyAt === -1 ? afterOid.length : emptyAt);\n const conflictedSet = new Set(conflicted);\n\n // Materialise the merged tree into the catalyst root (conflict markers are\n // already baked into the conflicted blobs).\n const outEnv = {\n ...env,\n GIT_WORK_TREE: catalystRoot,\n GIT_INDEX_FILE: join(scratch, 'index.out'),\n };\n\n await execa('git', ['read-tree', mergedTree], { env: outEnv });\n await execa('git', ['checkout-index', '-a', '-f'], { env: outEnv });\n\n // Classify ours → merged. -z --name-status emits [status, path, status, …].\n const diff = await execa(\n 'git',\n ['diff', '-z', '--no-renames', '--name-status', oursTree, mergedTree],\n { env },\n );\n\n const tokens = diff.stdout.split('\\0');\n const changes: Array<{ status: string; path: string }> = [];\n\n for (let i = 0; i + 1 < tokens.length; i += 2) {\n const status = tokens[i];\n const path = tokens[i + 1];\n\n if (status && path && !conflictedSet.has(path)) {\n changes.push({ status, path });\n }\n }\n\n // checkout-index only writes; it won't remove paths the merge dropped.\n const deleted = changes.filter((change) => change.status === 'D').map((change) => change.path);\n\n await Promise.all(deleted.map((path) => rm(join(catalystRoot, path), { force: true })));\n\n return {\n applied: changes\n .filter((change) => change.status !== 'A' && change.status !== 'D')\n .map((change) => change.path),\n added: changes.filter((change) => change.status === 'A').map((change) => change.path),\n deleted,\n conflicted,\n };\n } finally {\n await rm(scratch, { recursive: true, force: true, maxRetries: 10, retryDelay: 500 });\n }\n}\n\n// ── index staging ──────────────────────────────────────────────────────────────\n// After the merge, stage everything that merged cleanly (so the merchant only\n// reviews what needs attention) and register conflicted files as real unmerged\n// index entries: stage 1 = base, 2 = ours (the committed pre-upgrade blob),\n// 3 = theirs. `git status` then reports them as conflicts (UU / AA / DU), which\n// lights up editors' merge UIs. No MERGE_HEAD — the target tag isn't an ancestor,\n// so resolving is a normal `git add` + commit, not a merge commit.\nexport async function applyIndexState(\n gitRoot: string,\n relDir: string,\n baseDir: string,\n theirsDir: string,\n result: MergeResult,\n stampedPkg: boolean,\n): Promise<void> {\n const toRepoPath = (rel: string) => (relDir === '.' ? rel : `${relDir}/${rel}`);\n const pkgRel = 'package.json';\n\n // If the stamp resolved package.json (stripped its conflict markers and wrote\n // clean JSON), treat it as a clean file rather than a conflict — it should be\n // staged normally so it shows up in `git diff --cached`, not registered as UU.\n const stillConflicted = result.conflicted.filter((rel) => !(stampedPkg && rel === pkgRel));\n const conflictedRepoPaths = new Set(stillConflicted.map(toRepoPath));\n\n // 1. Pre-stage the clean changes (+ the resolved package.json when stamped).\n const clean = [...result.applied, ...result.added, ...result.deleted].map(toRepoPath);\n\n if (stampedPkg) clean.push(toRepoPath(pkgRel));\n\n const toStage = [...new Set(clean)].filter((path) => !conflictedRepoPaths.has(path));\n\n if (toStage.length) {\n await execa('git', ['add', '-A', '--', ...toStage], { cwd: gitRoot });\n }\n\n if (stillConflicted.length === 0) return;\n\n // 2. Conflicts → unmerged index entries. ours = the committed blob (the\n // clean-tree precondition guarantees the worktree matched HEAD before the\n // merge); base/theirs blobs get written into the repo's object store.\n const OID = /^[0-9a-f]{40,64}$/;\n // Detect SHA-256 repos (git 2.29+). SHA-1 uses a 40-zero null OID; SHA-256 uses 64.\n const gitFormat = (\n await execa('git', ['rev-parse', '--show-object-format'], { cwd: gitRoot, reject: false })\n ).stdout.trim();\n const NULL_OID = gitFormat === 'sha256' ? '0'.repeat(64) : '0'.repeat(40);\n\n // Write a file's content as a blob; null if the file is absent or the OID\n // comes back malformed (guards against shell wrappers polluting stdout).\n const hashBlob = async (file: string): Promise<string | null> => {\n if (!(await pathExists(file))) return null;\n\n const oid = (\n await execa('git', ['hash-object', '-w', '--', file], { cwd: gitRoot })\n ).stdout.trim();\n\n return OID.test(oid) ? oid : null;\n };\n\n // ours mode + blob via `ls-tree`. Unlike `rev-parse HEAD:<path>`, ls-tree\n // never echoes a missing path back as if it were an object name.\n const headEntry = async (repoPath: string): Promise<{ mode: string; oid: string } | null> => {\n const { stdout } = await execa('git', ['ls-tree', 'HEAD', '--', repoPath], {\n cwd: gitRoot,\n reject: false,\n });\n const match = /^(\\d{6}) blob ([0-9a-f]+)\\t/.exec(stdout);\n\n return match ? { mode: match[1], oid: match[2] } : null;\n };\n\n const records = await Promise.all(\n stillConflicted.map(async (rel) => {\n const repoPath = toRepoPath(rel);\n const [base, ours, theirs] = await Promise.all([\n hashBlob(join(baseDir, rel)),\n headEntry(repoPath),\n hashBlob(join(theirsDir, rel)),\n ]);\n\n return [\n `0 ${NULL_OID}\\t${repoPath}`,\n ...(base ? [`100644 ${base} 1\\t${repoPath}`] : []),\n ...(ours ? [`${ours.mode} ${ours.oid} 2\\t${repoPath}`] : []),\n ...(theirs ? [`100644 ${theirs} 3\\t${repoPath}`] : []),\n ].join('\\n');\n }),\n );\n\n await execa('git', ['update-index', '--index-info'], {\n cwd: gitRoot,\n input: `${records.join('\\n')}\\n`,\n });\n}\n\n// ── project (destination) layout resolution ───────────────────────────────────\n// The command is merchant-facing and must support two repo shapes:\n// * flat (future) — core/ contents at the repo root (package.json at root)\n// * nested (deprecated monorepo clone) — core/package.json under <root>/core\n// We locate the package.json carrying the `catalyst` field; if none has it yet\n// we fall back to the most likely Catalyst package.json so the auto-detect path\n// can still run.\ninterface Project {\n gitRoot: string;\n catalystRoot: string;\n relDir: string; // \".\" (flat) or \"core\" (nested), relative to gitRoot\n pkgPath: string;\n rawContent: string;\n pkg: z.infer<typeof CorePackageJson>;\n}\n\nexport async function resolveProject(cwd: string): Promise<Project | null> {\n let gitRoot: string;\n\n try {\n gitRoot = (await execa('git', ['rev-parse', '--show-toplevel'], { cwd })).stdout.trim();\n } catch {\n return null;\n }\n\n // Probe order favours the nested core/ first (a monorepo clone also has a\n // root package.json we don't want), then flat, then the cwd variants.\n const candidateDirs = [...new Set([join(gitRoot, 'core'), gitRoot, join(cwd, 'core'), cwd])];\n\n const parsed = (\n await Promise.all(\n candidateDirs.map(async (dir) => {\n const pkgPath = join(dir, 'package.json');\n const raw = await readFile(pkgPath, 'utf-8').catch(() => null);\n\n if (!raw) return null;\n\n let pkgJson: unknown;\n\n try {\n pkgJson = JSON.parse(raw);\n } catch {\n return null;\n }\n\n const result = CorePackageJson.safeParse(pkgJson);\n\n return result.success ? { dir, pkgPath, raw, pkg: result.data } : null;\n }),\n )\n ).filter((entry) => entry !== null);\n\n if (parsed.length === 0) return null;\n\n // Prefer the package.json that already declares `catalyst`; otherwise fall\n // back to one that looks like a Catalyst project (known family name).\n const chosen =\n parsed.find((p) => p.pkg.catalyst?.ref) ??\n parsed.find((p) => p.pkg.name !== undefined && KNOWN_FAMILIES.has(p.pkg.name)) ??\n parsed[0];\n\n return {\n gitRoot,\n catalystRoot: chosen.dir,\n relDir: relative(gitRoot, chosen.dir) || '.',\n pkgPath: chosen.pkgPath,\n rawContent: chosen.raw,\n pkg: chosen.pkg,\n };\n}\n\n// ── tarball download (source side stays the monorepo) ─────────────────────────\nexport async function downloadCore(\n repository: string,\n ref: string,\n destDir: string,\n token?: string,\n): Promise<void> {\n // Never cache moving tags (latest/canary/alpha) — they'd go stale silently.\n const cacheable = !MOVING_TAGS.has(parseRef(ref).version);\n // Use a separator before the ref so that repository strings differing only\n // by characters that sanitize to '_' (e.g. '/' vs '_') produce distinct keys.\n const cacheKey = `${repository.replace(/[^a-zA-Z0-9._-]/g, '_')}__${ref.replace(/[^a-zA-Z0-9._-]/g, '_')}`;\n const cachePath = join(CACHE_DIR, cacheKey);\n\n // Guard against a partially-written cache entry: two concurrent downloadCore\n // calls for the same ref can race — the first creates cachePath mid-copy, and\n // the second sees it as present but gets an incomplete directory. Validate with\n // a package.json sentinel (every extracted core/ tree must have one).\n if (\n cacheable &&\n (await pathExists(cachePath)) &&\n (await pathExists(join(cachePath, 'package.json')))\n ) {\n await cp(cachePath, destDir, { recursive: true });\n\n return;\n }\n\n // encodeURIComponent turns \"@bigcommerce/catalyst-core@1.7.0\" into\n // \"%40bigcommerce%2Fcatalyst-core%401.7.0\", which the API accepts.\n const url = `https://api.github.com/repos/${repository}/tarball/${encodeURIComponent(ref)}`;\n const headers: Record<string, string> = {\n 'User-Agent': 'catalyst-cli',\n Accept: 'application/vnd.github+json',\n };\n\n if (token) headers.Authorization = `Bearer ${token}`;\n\n const res = await fetch(url, { headers });\n\n if (!res.ok) {\n let hint = '';\n\n if (res.status === 404) hint = ` — tag \"${ref}\" not found in ${repository}`;\n if (res.status === 403) hint = ' — GitHub rate limit hit; set GITHUB_TOKEN to raise it';\n\n throw new Error(`GitHub returned ${res.status} for ${ref}${hint}`);\n }\n\n const tarballPath = `${destDir}.tgz`;\n const rawDir = `${destDir}.raw`;\n\n await writeFile(tarballPath, Buffer.from(await res.arrayBuffer()));\n await mkdir(rawDir, { recursive: true });\n // --strip-components=1 drops the \"bigcommerce-catalyst-<sha>/\" top dir.\n await execa('tar', ['-xzf', tarballPath, '-C', rawDir, '--strip-components=1']);\n\n // Source is expected to be the monorepo (core/ inside); fall back to the\n // extracted root for a hypothetical flat-source tag (insurance, not a target).\n const coreDir = join(rawDir, 'core');\n const sourceDir = (await pathExists(coreDir)) ? coreDir : rawDir;\n\n await rename(sourceDir, destDir);\n await rm(tarballPath, { force: true });\n await rm(rawDir, { recursive: true, force: true });\n\n if (cacheable) {\n await mkdir(CACHE_DIR, { recursive: true });\n await cp(destDir, cachePath, { recursive: true }).catch(() => {\n /* best-effort cache; ignore failures */\n });\n }\n}\n\n// ── base-ref resolution / auto-detect ─────────────────────────────────────────\n// Returns the base ref to diff from, auto-detecting when catalyst.ref is absent.\nexport async function resolveBaseRef(\n project: Project,\n fromOption: string | undefined,\n assumeYes: boolean,\n): Promise<string | null> {\n if (project.pkg.catalyst?.ref) return project.pkg.catalyst.ref;\n if (fromOption) return fromOption;\n\n // Older projects mirror the Catalyst version in `version`; the package `name`\n // tells us the family. Propose the inferred ref and let the merchant confirm.\n const family =\n project.pkg.name && KNOWN_FAMILIES.has(project.pkg.name)\n ? project.pkg.name\n : '@bigcommerce/catalyst-core';\n const guess = `${family}@${project.pkg.version}`;\n\n consola.warn(`No \\`catalyst.ref\\` found in package.json. Inferred base: ${guess}`);\n\n if (assumeYes) return guess;\n\n const ok = await confirm({ message: `Upgrade from ${guess}?`, default: true }).catch(() => false);\n\n if (!ok) {\n consola.info('Re-run with `--from <ref>` to set the base version explicitly.');\n\n return null;\n }\n\n return guess;\n}\n\n// ── summary output ────────────────────────────────────────────────────────────\nfunction printSummary(result: MergeResult, relDir: string, stampedPkg: boolean): void {\n // package.json is excluded from the conflict list when the stamp resolved it.\n const unresolved = result.conflicted.filter((f) => !(stampedPkg && f === 'package.json'));\n\n const parts = [\n `${result.applied.length} updated`,\n `${result.added.length} added`,\n `${result.deleted.length} removed`,\n ];\n\n if (unresolved.length) parts.push(`${unresolved.length} with conflicts`);\n\n consola.log(`\\n${parts.join(', ')}`);\n\n if (unresolved.length) {\n const files = unresolved.map((f) => ` ${f}`).join('\\n');\n\n consola.warn(\n `\\nStaged the clean changes. ${unresolved.length} file(s) need conflict resolution (the <<<ours/===/theirs>>> markers):\\n${files}\\n\\nResolve them, then: git add ${relDir} && git commit`,\n );\n } else {\n consola.success('Staged all changes — review with `git diff --cached`, then commit.');\n }\n}\n\nexport const upgrade = new Command('upgrade')\n .configureHelp({ showGlobalOptions: true })\n .aliases([\n 'up',\n // These are hidden aliases\n 'upgrayedd',\n 'ugrad',\n ])\n .description('Upgrade your Catalyst project to a newer version by applying a 3-way merge.')\n .argument('[version]', 'Target version to upgrade to (default: latest)')\n .addOption(\n new Option(\n '--ref <ref>',\n 'Full git tag to upgrade to, e.g. an integration family like @bigcommerce/catalyst-makeswift@1.7.0. Overrides [version].',\n ),\n )\n .addOption(new Option('--from <ref>', 'Base ref to upgrade from (when catalyst.ref is missing)'))\n .option('--dry-run', 'Generate and display the diff without applying it')\n .option('--yes', 'Skip confirmation prompts (e.g. inferred base ref)')\n .addOption(\n new Option(\n '--strategy <strategy>',\n 'Merge engine: tree (git merge-tree, full fidelity), per-file (git merge-file, no-history fallback), or auto (tree when git >= 2.38, else per-file)',\n )\n .choices(['auto', 'tree', 'per-file'] as const)\n .default('auto' as const)\n .hideHelp(),\n )\n .addOption(\n new Option('--repository <owner/repo>', 'GitHub repository to pull versions from').default(\n DEFAULT_REPOSITORY,\n ),\n )\n .addHelpText(\n 'after',\n `\nExamples:\n # Upgrade to the latest Catalyst version\n $ catalyst upgrade\n\n # Upgrade to a specific version\n $ catalyst upgrade 1.8.0\n\n # Preview what would change without applying\n $ catalyst upgrade --dry-run\n\n # Upgrade to an integration family (makeswift, b2b-makeswift, ...)\n $ catalyst upgrade --ref @bigcommerce/catalyst-makeswift@1.7.0\n\nConflicts are written as standard <<<ours/===/theirs>>> markers — the upgrade\nnever aborts. Versions are git tags on the repository (not npm). Set GITHUB_TOKEN\nto raise the GitHub API rate limit.`,\n )\n // eslint-disable-next-line complexity\n .action(async (version, options) => {\n // ── 1. Resolve the merchant project (flat or nested layout) ───────────\n const project = await resolveProject(process.cwd());\n\n if (!project) {\n consola.error(\n 'Run `catalyst upgrade` from inside a Catalyst git repository (flat core/ repo or a project containing core/).',\n );\n process.exit(1);\n }\n\n const { gitRoot, catalystRoot, relDir, pkgPath } = project;\n\n // ── 2. Resolve base + target refs ─────────────────────────────────────\n const baseRef = await resolveBaseRef(project, options.from, options.yes ?? false);\n\n if (!baseRef) process.exit(1);\n\n let basePackage: string;\n let upstreamRef: string;\n let upstreamTagVersion: string;\n\n try {\n ({ packageName: basePackage } = parseRef(baseRef));\n upstreamRef = options.ref ?? `${basePackage}@${version ?? 'latest'}`;\n ({ version: upstreamTagVersion } = parseRef(upstreamRef));\n } catch {\n consola.error(\n `Invalid ref format — expected <package>@<version> (e.g. @bigcommerce/catalyst-core@1.7.0). Got: \"${baseRef}\"`,\n );\n process.exit(1);\n }\n\n if (upstreamRef === baseRef) {\n consola.success('Already up to date.');\n\n return;\n }\n\n // ── 3. Require a clean working tree at the catalyst root (preview exempt) ─\n // The merge writes in place, so pre-existing uncommitted edits would be\n // indistinguishable from the upgrade. Committing/stashing first gives the\n // merchant a clean point to diff and roll back from.\n if (!options.dryRun) {\n const statusArgs = relDir === '.' ? [] : ['--', relDir];\n const status = await execa('git', ['status', '--porcelain', ...statusArgs], {\n cwd: gitRoot,\n reject: false,\n });\n\n if (status.stdout.trim()) {\n const where = relDir === '.' ? 'The repo' : `${relDir}/`;\n\n consola.error(\n `${where} has uncommitted changes. Commit or stash them before upgrading, so the upgrade is isolated and reversible:\\n git add ${relDir} && git commit -m \"snapshot before upgrade\"\\n # or: git stash`,\n );\n process.exit(1);\n }\n }\n\n // ── 3b. Backfill catalyst.ref when it was inferred ────────────────────\n // If catalyst.ref was absent and the user confirmed an inferred base (not\n // an explicit --from), write the field and stage it so it travels with the\n // upgrade commit. Runs after the clean-tree check so we only add to an\n // already-clean index. --from is excluded: the user already knows the base\n // and shouldn't get an extra staged change they didn't ask for.\n if (!project.pkg.catalyst?.ref && !options.from && !options.dryRun) {\n const { version: baseVersion } = parseRef(baseRef);\n const rawPkg = await readFile(pkgPath, 'utf-8');\n const parsedPkg = z.record(z.string(), z.unknown()).parse(JSON.parse(rawPkg));\n\n parsedPkg.catalyst = { version: baseVersion, ref: baseRef };\n await writeFile(pkgPath, `${JSON.stringify(parsedPkg, null, 2)}\\n`);\n await execa('git', ['add', '--', pkgPath], { cwd: gitRoot });\n consola.success(`Added catalyst.ref → ${baseRef}`);\n }\n\n const token = process.env.GITHUB_TOKEN;\n const tmpDir = await mkdtemp(join(tmpdir(), 'catalyst-upgrade-'));\n\n try {\n const baseDir = join(tmpDir, 'base');\n const theirsDir = join(tmpDir, 'theirs');\n const emptyFile = join(tmpDir, '.empty');\n\n await writeFile(emptyFile, '');\n\n const downloadSpinner = yoctoSpinner().start(`Downloading ${baseRef} and ${upstreamRef}...`);\n\n try {\n await Promise.all([\n downloadCore(options.repository, baseRef, baseDir, token),\n downloadCore(options.repository, upstreamRef, theirsDir, token),\n ]);\n downloadSpinner.success('Downloaded both versions.');\n } catch (err) {\n downloadSpinner.error('Download failed');\n throw err;\n }\n\n // When the base was auto-inferred (no catalyst.ref, no --from), validate\n // the guess by checking how many base files are unmodified in the project.\n // A correct base scores ~70-80%+; a wrong guess (e.g. merchant manually\n // bumped their version field without actually upgrading) scores much lower.\n if (!project.pkg.catalyst?.ref && !options.from) {\n const similarity = await computeBaseSimilarity(baseDir, catalystRoot);\n const pct = Math.round(similarity * 100);\n\n if (similarity < 0.5) {\n consola.warn(\n `Low confidence in inferred base ${baseRef} (${pct}% of base files match your project). If the merge result looks off, re-run with \\`--from <correct-version>\\` to set the base explicitly.`,\n );\n }\n }\n\n // For moving tags (latest/canary/alpha) we don't know the real version\n // until the tarball lands, so read it from the downloaded package.json.\n // For concrete tags the version is already in the tag itself.\n const resolvedVersion = MOVING_TAGS.has(upstreamTagVersion)\n ? await readResolvedVersion(theirsDir)\n : upstreamTagVersion;\n const newRef = MOVING_TAGS.has(upstreamTagVersion)\n ? `${basePackage}@${resolvedVersion}`\n : upstreamRef;\n\n // ── 4. Dry run: show the unified diff and stop ──────────────────────\n if (options.dryRun) {\n const diffSpinner = yoctoSpinner().start('Generating diff...');\n const diff = await execa(\n 'git',\n ['diff', '--no-index', '--binary', '--diff-algorithm=histogram', 'base', 'theirs'],\n { cwd: tmpDir, reject: false, stripFinalNewline: false },\n );\n\n if ((diff.exitCode ?? 0) > 1) {\n diffSpinner.error('Failed to generate diff');\n throw new Error(diff.stderr);\n }\n\n if (!diff.stdout.trim()) {\n diffSpinner.success('No differences between versions — already up to date.');\n\n return;\n }\n\n const fileCount = (diff.stdout.match(/^diff --git /gm) ?? []).length;\n\n diffSpinner.success(`Diff ready — ${fileCount} file(s) affected.`);\n consola.log('\\nDiff preview (--dry-run, not applied):\\n');\n consola.log(diff.stdout);\n\n return;\n }\n\n // ── 5. Apply via 3-way merge (whole-tree by default, per-file fallback) ─\n const strategy = await resolveStrategy(options.strategy);\n const mergeSpinner = yoctoSpinner().start(`Merging changes (${strategy})...`);\n const result =\n strategy === 'tree'\n ? await mergeCoreTree(baseDir, theirsDir, catalystRoot)\n : await mergeCorePerFile(baseDir, theirsDir, catalystRoot, emptyFile);\n const total =\n result.applied.length +\n result.added.length +\n result.deleted.length +\n result.conflicted.length;\n\n if (total === 0) {\n mergeSpinner.success('No differences between versions — already up to date.');\n\n return;\n }\n\n if (result.conflicted.length) {\n mergeSpinner.warning('Merged with conflicts — resolve the markers, then commit.');\n } else {\n mergeSpinner.success('Merged cleanly.');\n }\n\n // ── 6. Stamp catalyst.ref (skip if package.json itself conflicted) ──\n const patchedRaw = await readFile(pkgPath, 'utf-8');\n\n let stampedPkg = false;\n\n try {\n const patchedPkg = z.record(z.string(), z.unknown()).parse(JSON.parse(patchedRaw));\n\n patchedPkg.catalyst = { version: resolvedVersion, ref: newRef };\n await writeFile(pkgPath, `${JSON.stringify(patchedPkg, null, 2)}\\n`);\n stampedPkg = true;\n consola.success(`catalyst.ref updated → ${newRef}`);\n } catch {\n // package.json has conflict markers (scripts, deps, etc.). The catalyst\n // field was added cleanly by ours and should sit outside the conflict\n // blocks — so replace just that field in-place, leaving all other conflict\n // markers intact for the merchant to resolve normally.\n const catalystReplacement = JSON.stringify(\n { version: resolvedVersion, ref: newRef },\n null,\n 2,\n )\n .split('\\n')\n .map((line, i) => (i === 0 ? line : ` ${line}`))\n .join('\\n');\n\n // Use a function replacer to prevent $-interpolation in the replacement string\n // (e.g. $& or $1 in a ref/version value would silently corrupt the output).\n const updated = patchedRaw.replace(\n /\"catalyst\":\\s*\\{[^}]*\\}/,\n () => `\"catalyst\": ${catalystReplacement}`,\n );\n\n if (updated !== patchedRaw) {\n await writeFile(pkgPath, updated);\n // stampedPkg stays false — the file still has conflict markers in other\n // sections, so it must stay as a UU unmerged entry so the editor shows\n // the merge UI. Only the catalyst field was resolved in place.\n consola.success(`catalyst.ref updated → ${newRef}`);\n consola.info(\n 'package.json still has conflicts in other sections — resolve them, then: git add package.json',\n );\n } else {\n consola.warn(\n `package.json has conflicts — after resolving, add:\\n \"catalyst\": { \"version\": \"${resolvedVersion}\", \"ref\": \"${newRef}\" }`,\n );\n }\n }\n\n // ── 7. Stage the clean changes; mark conflicts as real unmerged entries ─\n // Staging is a convenience; the merge already landed on disk, so never let\n // a git quirk here fail the whole upgrade.\n try {\n await applyIndexState(gitRoot, relDir, baseDir, theirsDir, result, stampedPkg);\n } catch (err) {\n consola.warn(\n `Couldn't auto-stage the changes (${err instanceof Error ? err.message : String(err)}). Your files are merged on disk — run \\`git add ${relDir}\\` yourself.`,\n );\n }\n\n const gitVersion = await execa('git', ['--version'])\n .then((r) => r.stdout.trim())\n .catch(() => 'unknown');\n\n await getTelemetry().track('upgrade', {\n strategy,\n gitVersion,\n dryRun: Boolean(options.dryRun),\n applied: result.applied.length,\n added: result.added.length,\n deleted: result.deleted.length,\n conflicts: result.conflicted.length,\n hasConflicts: result.conflicted.length > 0,\n });\n\n printSummary(result, relDir, stampedPkg);\n } finally {\n await rm(tmpDir, { recursive: true, force: true, maxRetries: 10, retryDelay: 500 });\n }\n });\n","import { Command } from 'commander';\n\nimport PACKAGE_INFO from '../../../package.json';\nimport { consola } from '../lib/logger';\n\nexport const version = new Command('version')\n .configureHelp({ showGlobalOptions: true })\n .description('Display detailed version information.')\n .addHelpText(\n 'after',\n `\nExample:\n $ catalyst version`,\n )\n .action(() => {\n consola.log('Version Information:');\n consola.log(`CLI Version: ${PACKAGE_INFO.version}`);\n consola.log(`Node Version: ${process.version}`);\n consola.log(`Platform: ${process.platform} (${process.arch})`);\n });\n","import { Command, type CommandUnknownOpts } from '@commander-js/extra-typings';\n\nimport { getTelemetry } from '../lib/telemetry';\n\nconst allowlistArguments = ['--keep-temp-dir', '--api-host', '--project-uuid'];\n\nfunction parseArguments(args: string[]) {\n return args.reduce<Record<string, string>>((result, arg, index, array) => {\n if (arg.includes('=')) {\n const [key, value] = arg.split('=');\n\n if (allowlistArguments.includes(key)) {\n return {\n ...result,\n [key]: value,\n };\n }\n }\n\n if (allowlistArguments.includes(arg)) {\n const nextValue =\n array[index + 1] && !array[index + 1].startsWith('--') ? array[index + 1] : null;\n\n if (nextValue && !nextValue.includes('--')) {\n return {\n ...result,\n [arg]: nextValue,\n };\n }\n }\n\n return result;\n }, {});\n}\n\nfunction getCommandPath(cmd: CommandUnknownOpts): string {\n const parts: string[] = [];\n let current: CommandUnknownOpts | null = cmd;\n\n while (current.parent) {\n parts.unshift(current.name());\n current = current.parent;\n }\n\n return parts.join(' ');\n}\n\nexport const telemetryPreHook = async (thisCommand: Command, actionCommand: CommandUnknownOpts) => {\n const telemetry = getTelemetry();\n const commandName = getCommandPath(actionCommand);\n\n telemetry.commandName = commandName;\n\n // Return the await to get a proper stack trace.\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n return await telemetry.track(commandName, {\n ...parseArguments(thisCommand.args),\n });\n};\n\nexport const telemetryPostHook = async () => {\n const telemetry = getTelemetry();\n\n await telemetry.track('command_completed', { durationMs: telemetry.durationMs() });\n await telemetry.analytics.closeAndFlush();\n};\n","#!/usr/bin/env node\nimport { UnauthorizedError } from './lib/auth-errors';\nimport { consola } from './lib/logger';\nimport { getTelemetry } from './lib/telemetry';\nimport { program } from './program';\n\nconst handleFatalError = async (error: unknown) => {\n const telemetry = getTelemetry();\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n const errorStack = error instanceof Error ? error.stack : undefined;\n\n try {\n await telemetry.track('error', {\n commandName: telemetry.commandName,\n errorMessage,\n errorStack,\n durationMs: telemetry.durationMs(),\n });\n await telemetry.analytics.closeAndFlush();\n } catch {\n // Don't mask the original error\n }\n\n // An invalid/expired token is user-actionable, not a bug to report — print the\n // re-auth guidance without the \"share your Correlation ID with support\" noise.\n if (error instanceof UnauthorizedError) {\n consola.error(errorMessage);\n process.exit(1);\n }\n\n consola.error(errorMessage);\n\n if (telemetry.isEnabled()) {\n consola.info(\n `Correlation ID: ${telemetry.correlationId}\\nShare this Correlation ID with BigCommerce support.`,\n );\n } else {\n consola.info(\n 'Enable telemetry (`catalyst telemetry enable`) for improved troubleshooting with BigCommerce support.',\n );\n }\n\n process.exit(1);\n};\n\nprocess.on('uncaughtException', (error) => {\n void handleFatalError(error);\n});\n\nprocess.on('unhandledRejection', (reason) => {\n void handleFatalError(reason);\n});\n\nvoid (async () => {\n try {\n await program.parseAsync(process.argv);\n } catch (error) {\n await handleFatalError(error);\n }\n})();\n"],"mappings":"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","names":["Option","Command","colorize","existsSync","Option","z","z","resolve","z","z","z","Conf","config","StoreProfileSchema","z","fetchStoreProfile","Option","config","login","Command","Option","join","join","join","z","join","Command","Option","config","select","Command","Option","colorize","join","select","z","query","authHeaders","z","confirm","input","colorize","existsSync","readFileSync","dirname","join","z","z","dirname","join","existsSync","readFileSync","confirm","input","colorize","project","select","project","channel","input","config","config","config","Command","Option","select","join","colorize","Command","InvalidArgumentError","Option","input","select","execSync","colorize","join","mkdirSync","resolve","mkdirSync","join","join","yoctoSpinner","z","z","readFileSync","writeFileSync","join","z","corePackageJsonSchema","z","version","join","readFileSync","writeFileSync","mkdirSync","readFileSync","writeFileSync","dirname","join","z","corePackageJsonSchema","z","writeJson","mkdirSync","dirname","writeFileSync","join","readFileSync","outputFileSync","join","parseChannelId","InvalidArgumentError","input","select","colorize","join","execSync","Command","Option","confirm","Command","Option","colorize","join","yoctoSpinner","z","z","join","yoctoSpinner","colorize","project","Command","Option","config","telemetry","confirm","confirm","Command","Option","colorize","z","colorize","z","z","start","colorize","z","authHeaders","query","resolve","config","colorize","Command","Option","confirm","Command","add","Command","config","remove","list","Command","InvalidArgumentError","Option","colorize","z","LEVEL_COLORS","z","colorize","resolve","Command","Option","config","InvalidArgumentError","start","confirm","input","select","Command","colorize","confirm","list","Command","config","colorize","create","input","link","select","Command","execa","existsSync","join","Command","execa","join","existsSync","Command","Option","colorize","telemetry","Command","Option","colorize","Command","Option","confirm","execa","access","copyFile","cp","readdir","readFile","rm","writeFile","dirname","join","relative","yoctoSpinner","z","z","join","access","readdir","readFile","dirname","copyFile","execa","writeFile","rm","env","resolveProject","relative","cp","project","confirm","Command","Option","version","yoctoSpinner","Command","Command","telemetry","existsSync","Command","colorize","Option","telemetry","telemetry"]}