@bigcommerce/create-catalyst 0.19.0 → 0.21.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/index.js +445 -114
- package/dist/index.js.map +1 -1
- package/package.json +19 -13
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../package.json","../src/commands/create.ts","../src/utils/user-agent.ts","../src/utils/https.ts","../src/utils/cli-api.ts","../src/utils/clone-catalyst.ts","../src/utils/checkout-ref.ts","../src/utils/is-exec-exception.ts","../src/utils/has-github-ssh.ts","../src/utils/reset-branch-to-ref.ts","../src/utils/install-dependencies.ts","../src/utils/spinner.ts","../src/utils/login.ts","../src/utils/auth.ts","../src/utils/parse.ts","../src/utils/config.ts","../src/utils/telemetry/telemetry.ts","../src/utils/write-env.ts","../src/commands/init.ts","../src/commands/integration.ts","../src/commands/telemetry.ts","../src/utils/telemetry/index.ts","../src/hooks/telemetry.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { program } from '@commander-js/extra-typings';\nimport chalk from 'chalk';\n\nimport PACKAGE_INFO from '../package.json';\n\nimport { create } from './commands/create';\nimport { init } from './commands/init';\nimport { integration } from './commands/integration';\nimport { telemetry } from './commands/telemetry';\nimport { telemetryPostHook, telemetryPreHook } from './hooks/telemetry';\n\nconsole.log(chalk.cyanBright(`\\n◢ ${PACKAGE_INFO.name} v${PACKAGE_INFO.version}\\n`));\n\nprogram\n .name(PACKAGE_INFO.name)\n .version(PACKAGE_INFO.version)\n .description('A command line tool to create a new Catalyst project.')\n .addCommand(create, { isDefault: true })\n .addCommand(init)\n .addCommand(integration)\n .addCommand(telemetry)\n .hook('preAction', telemetryPreHook)\n .hook('postAction', telemetryPostHook);\n\nprogram.parse(process.argv);\n","{\n \"name\": \"@bigcommerce/create-catalyst\",\n \"version\": \"0.19.0\",\n \"type\": \"module\",\n \"bin\": \"bin/index.cjs\",\n \"files\": [\n \"bin\",\n \"dist\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint . --max-warnings 0\",\n \"test\": \"jest\",\n \"build\": \"tsup\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"dependencies\": {\n \"@commander-js/extra-typings\": \"^12.1.0\",\n \"@iarna/toml\": \"^2.2.5\",\n \"@inquirer/prompts\": \"^7.2.0\",\n \"@segment/analytics-node\": \"^2.2.0\",\n \"chalk\": \"^5.3.0\",\n \"commander\": \"^12.1.0\",\n \"conf\": \"^13.1.0\",\n \"dotenv\": \"^16.4.7\",\n \"fs-extra\": \"^11.2.0\",\n \"giget\": \"^1.2.3\",\n \"lodash.kebabcase\": \"^4.1.1\",\n \"nypm\": \"^0.4.1\",\n \"open\": \"^10.1.0\",\n \"ora\": \"^8.1.1\",\n \"semver\": \"^7.6.3\",\n \"std-env\": \"^3.8.0\",\n \"zod\": \"^3.24.1\",\n \"zod-validation-error\": \"^3.4.0\"\n },\n \"devDependencies\": {\n \"@bigcommerce/eslint-config\": \"^2.10.0\",\n \"@bigcommerce/eslint-config-catalyst\": \"workspace:^\",\n \"@swc/core\": \"^1.10.1\",\n \"@swc/jest\": \"^0.2.37\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/jest\": \"^29.5.14\",\n \"@types/lodash.kebabcase\": \"^4.1.9\",\n \"@types/node\": \"^20.17.10\",\n \"@types/prompts\": \"^2.4.9\",\n \"@types/semver\": \"^7.5.8\",\n \"eslint\": \"^8.57.1\",\n \"jest\": \"^29.7.0\",\n \"msw\": \"^2.6.9\",\n \"prettier\": \"^3.4.2\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.7.2\"\n }\n}\n","import { Command, Option } from '@commander-js/extra-typings';\nimport { input, select } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { pathExistsSync } from 'fs-extra/esm';\nimport kebabCase from 'lodash.kebabcase';\nimport { join } from 'path';\n\nimport { CliApi } from '../utils/cli-api';\nimport { cloneCatalyst } from '../utils/clone-catalyst';\nimport { Https } from '../utils/https';\nimport { installDependencies } from '../utils/install-dependencies';\nimport { login, storeCredentials } from '../utils/login';\nimport { Telemetry } from '../utils/telemetry/telemetry';\nimport { writeEnv } from '../utils/write-env';\n\ninterface Channel {\n id: number;\n name: string;\n platform: string;\n}\n\ninterface ChannelsResponse {\n data: Channel[];\n}\n\ninterface InitResponse {\n data: {\n makeswift_dev_api_key: string;\n storefront_api_token: string;\n envVars: Record<string, string>;\n };\n}\n\ninterface CreateChannelResponse {\n data: {\n id: number;\n storefront_api_token: string;\n envVars: Record<string, string>;\n };\n}\n\ninterface EligibilityResponse {\n data: {\n eligible: boolean;\n message: string;\n };\n}\n\nfunction getPlatformCheckCommand(command: string): string {\n const isWindows = process.platform === 'win32';\n\n return isWindows ? `where.exe ${command}` : `which ${command}`;\n}\n\nconst telemetry = new Telemetry();\n\nasync function handleChannelCreation(cliApi: CliApi) {\n const newChannelName = await input({\n message: 'What would you like to name your new channel?',\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 const response = await cliApi.createChannel(newChannelName, shouldInstallSampleData);\n\n if (!response.ok) {\n console.error(\n chalk.red(`\\nPOST /channels/catalyst failed: ${response.status} ${response.statusText}\\n`),\n );\n process.exit(1);\n }\n\n const channelData: unknown = await response.json();\n\n if (!isCreateChannelResponse(channelData)) {\n console.error(chalk.red('\\nUnexpected response format from create channel endpoint\\n'));\n process.exit(1);\n }\n\n return {\n channelId: channelData.data.id,\n storefrontToken: channelData.data.storefront_api_token,\n envVars: channelData.data.envVars,\n };\n}\n\nasync function handleChannelSelection(bc: Https) {\n const channelSortOrder = ['catalyst', 'next', 'bigcommerce'];\n const channelsResponse = await bc.fetch('/v3/channels?available=true&type=storefront');\n\n if (!channelsResponse.ok) {\n console.error(\n chalk.red(\n `\\nGET /v3/channels failed: ${channelsResponse.status} ${channelsResponse.statusText}\\n`,\n ),\n );\n process.exit(1);\n }\n\n const availableChannels: unknown = await channelsResponse.json();\n\n if (!isChannelsResponse(availableChannels)) {\n console.error(chalk.red('\\nUnexpected response format from channels endpoint\\n'));\n process.exit(1);\n }\n\n const existingChannel = await select({\n message: 'Which channel would you like to use?',\n choices: availableChannels.data\n .sort((a: Channel, b: Channel) => {\n const aIndex = channelSortOrder.indexOf(a.platform);\n const bIndex = channelSortOrder.indexOf(b.platform);\n\n // If both platforms are not in the sort order, maintain their original order\n if (aIndex === -1 && bIndex === -1) {\n return 0;\n }\n\n // If one platform is not in the sort order, it should go to the end\n if (aIndex === -1) return 1;\n if (bIndex === -1) return -1;\n\n // If both platforms are in the sort order, use their relative positions\n return aIndex - bIndex;\n })\n .map((ch: Channel) => ({\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 getChannelInit(cliApi: CliApi, channelId: number) {\n const initResponse = await cliApi.getChannelInit(channelId);\n\n if (!initResponse.ok) {\n console.error(\n chalk.red(\n `\\nGET /channels/${channelId}/init failed: ${initResponse.status} ${initResponse.statusText}\\n`,\n ),\n );\n process.exit(1);\n }\n\n const initData: unknown = await initResponse.json();\n\n if (!isInitResponse(initData)) {\n console.error(chalk.red('\\nUnexpected response format from init endpoint\\n'));\n process.exit(1);\n }\n\n return {\n storefrontToken: initData.data.storefront_api_token,\n envVars: initData.data.envVars,\n };\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 console.error(chalk.red(`Error: --projectDir ${projectDir} is not a valid path\\n`));\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 console.error(chalk.red(`Error: ${projectDir} already exists\\n`));\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 is the name of your project?',\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 console.error(chalk.red('Error: git is required to create a Catalyst project\\n'));\n process.exit(1);\n }\n\n try {\n execSync(getPlatformCheckCommand('pnpm'), { stdio: 'ignore' });\n } catch {\n console.error(chalk.red('Error: pnpm is required to create a Catalyst project\\n'));\n console.error(chalk.yellow('Tip: Enable it by running `corepack enable pnpm`\\n'));\n process.exit(1);\n }\n}\n\nexport const create = new Command('create')\n .description('Command to scaffold and connect a Catalyst storefront to your BigCommerce store')\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 .option('--store-hash <hash>', 'BigCommerce store hash')\n .option('--access-token <token>', 'BigCommerce access token')\n .option('--channel-id <id>', 'BigCommerce channel ID')\n .option('--storefront-token <token>', 'BigCommerce storefront token')\n .option('--gh-ref <ref>', 'Clone a specific ref from the source repository')\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('--env <vars...>', 'Arbitrary environment variables to set in .env.local')\n .addOption(\n new Option('--bigcommerce-hostname <hostname>', 'BigCommerce hostname')\n .default('bigcommerce.com')\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 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;\n let storefrontToken = options.storefrontToken;\n let credentials;\n\n if (options.channelId) {\n channelId = parseInt(options.channelId, 10);\n }\n\n let envVars: Record<string, string> = {};\n\n // Get credentials if needed\n if ((!storeHash || !accessToken) && (!channelId || !storefrontToken)) {\n credentials = await login(`https://login.${options.bigcommerceHostname}`);\n storeHash = credentials.storeHash;\n accessToken = credentials.accessToken;\n }\n\n // If store hash, channel ID, and storefront token are all provided, skip channel selection/creation\n if (storeHash && channelId && storefrontToken) {\n envVars.BIGCOMMERCE_STORE_HASH = storeHash;\n envVars.BIGCOMMERCE_CHANNEL_ID = channelId.toString();\n envVars.BIGCOMMERCE_STOREFRONT_API_TOKEN = storefrontToken;\n } else {\n if (!storeHash || !accessToken) {\n // Create project without credentials\n console.log(`\\nCreating '${projectName}' at '${projectDir}'\\n`);\n cloneCatalyst({ repository, projectName, projectDir, ghRef, resetMain: options.resetMain });\n await installDependencies(projectDir);\n\n // Add any CLI-provided env vars\n if (options.env) {\n const cliEnvVars = options.env.reduce<Record<string, string>>((acc, env) => {\n const [key, value] = env.split('=');\n\n if (key && value) {\n acc[key] = value;\n }\n\n return acc;\n }, {});\n\n Object.assign(envVars, cliEnvVars);\n }\n\n // Write env vars even if we don't have store credentials\n writeEnv(projectDir, envVars);\n\n console.log(\n [\n `\\n${chalk.green('Success!')} Created '${projectName}' at '${projectDir}'\\n`,\n `Next steps:`,\n Object.keys(envVars).length > 0\n ? chalk.yellow(`\\n- cd ${projectName} && pnpm run dev\\n`)\n : [\n chalk.yellow(`\\n- cd ${projectName} && cp .env.example .env.local`),\n chalk.yellow(`\\n- Populate .env.local with your BigCommerce API credentials\\n`),\n ].join(''),\n ].join('\\n'),\n );\n\n process.exit(0);\n }\n\n // At this point we should have a storeHash and can identify the account\n await telemetry.identify(storeHash);\n\n if (!channelId || !storefrontToken) {\n const bc = new Https({\n baseUrl: `https://api.${options.bigcommerceHostname}/stores/${storeHash}`,\n accessToken,\n });\n\n const cliApi = new CliApi({\n origin: options.cliApiOrigin,\n storeHash,\n accessToken,\n });\n\n // If we have channelId but no storefrontToken, just get the init data\n if (channelId && !storefrontToken) {\n const initData = await getChannelInit(cliApi, channelId);\n\n envVars = { ...initData.envVars };\n storefrontToken = initData.storefrontToken;\n } else if (!channelId) {\n const eligibilityResponse = await cliApi.checkEligibility();\n\n if (!eligibilityResponse.ok) {\n console.error(\n chalk.red(\n `\\nGET /channels/catalyst/eligibility failed: ${eligibilityResponse.status} ${eligibilityResponse.statusText}\\n`,\n ),\n );\n process.exit(1);\n }\n\n const eligibilityData: unknown = await eligibilityResponse.json();\n\n if (!isEligibilityResponse(eligibilityData)) {\n console.error(chalk.red('\\nUnexpected response format from eligibility endpoint\\n'));\n process.exit(1);\n }\n\n if (!eligibilityData.data.eligible) {\n console.warn(chalk.yellow(eligibilityData.data.message));\n }\n\n let shouldCreateChannel;\n\n if (eligibilityData.data.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(cliApi);\n\n channelId = channelData.channelId;\n storefrontToken = channelData.storefrontToken;\n envVars = { ...channelData.envVars };\n\n console.log(chalk.green(`Channel created successfully`));\n }\n\n if (!shouldCreateChannel) {\n channelId = await handleChannelSelection(bc);\n\n const initData = await getChannelInit(cliApi, channelId);\n\n envVars = { ...initData.envVars };\n storefrontToken = initData.storefrontToken;\n }\n }\n }\n }\n\n // Add any CLI-provided env vars as overrides\n if (options.env) {\n const cliEnvVars = options.env.reduce<Record<string, string>>((acc, env) => {\n const [key, value] = env.split('=');\n\n if (key && value) {\n acc[key] = value;\n }\n\n return acc;\n }, {});\n\n Object.assign(envVars, cliEnvVars);\n }\n\n // Add store hash, channel ID, and storefront token to envVars if provided\n if (options.storeHash) {\n envVars.BIGCOMMERCE_STORE_HASH = options.storeHash;\n }\n\n if (options.channelId) {\n envVars.BIGCOMMERCE_CHANNEL_ID = options.channelId;\n }\n\n if (options.storefrontToken) {\n envVars.BIGCOMMERCE_STOREFRONT_TOKEN = options.storefrontToken;\n }\n\n if (!channelId) throw new Error('Something went wrong, channelId is not defined');\n if (!storefrontToken) throw new Error('Something went wrong, storefrontToken is not defined');\n\n // Create the project with all necessary configuration\n console.log(`\\nCreating '${projectName}' at '${projectDir}'\\n`);\n cloneCatalyst({ repository, projectName, projectDir, ghRef, resetMain: options.resetMain });\n await installDependencies(projectDir);\n\n // Write env vars\n writeEnv(projectDir, envVars);\n\n // Store credentials after successful project creation\n if (credentials) {\n storeCredentials(projectDir, credentials);\n }\n\n console.log(\n `\\n${chalk.green('Success!')} Created '${projectName}' at '${projectDir}'\\n`,\n '\\nNext steps:\\n',\n chalk.yellow(`\\ncd ${projectName} && pnpm run dev\\n`),\n );\n });\n\nfunction isInitResponse(response: unknown): response is InitResponse {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'data' in response &&\n typeof response.data === 'object' &&\n response.data !== null &&\n 'storefront_api_token' in response.data &&\n 'envVars' in response.data\n );\n}\n\nfunction isEligibilityResponse(response: unknown): response is EligibilityResponse {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'data' in response &&\n typeof response.data === 'object' &&\n response.data !== null &&\n 'eligible' in response.data &&\n 'message' in response.data\n );\n}\n\nfunction isCreateChannelResponse(response: unknown): response is CreateChannelResponse {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'data' in response &&\n typeof response.data === 'object' &&\n response.data !== null &&\n 'id' in response.data &&\n 'storefront_api_token' in response.data &&\n 'envVars' in response.data\n );\n}\n\nfunction isChannelsResponse(response: unknown): response is ChannelsResponse {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'data' in response &&\n Array.isArray(response.data) &&\n response.data.every(\n (item) =>\n typeof item === 'object' &&\n item !== null &&\n 'id' in item &&\n 'name' in item &&\n 'platform' in item,\n )\n );\n}\n","import {\n isDevelopment,\n isLinux,\n isMacOS,\n isProduction,\n isTest,\n isWindows,\n nodeVersion,\n process,\n provider,\n runtime,\n} from 'std-env';\n\nimport packageInfo from '../../package.json';\n\nconst { name, version } = packageInfo;\n\nconst getOS = () => {\n if (isWindows) return 'Windows';\n if (isMacOS) return 'macOS';\n if (isLinux) return 'Linux';\n\n return 'Unknown OS';\n};\n\nconst getEnv = () => {\n if (isDevelopment) return 'Development';\n if (isTest) return 'Test';\n if (isProduction) return 'Production';\n};\n\nconst getPlatform = () => {\n const os = getOS();\n const env = getEnv();\n\n const keysOfInterest = [\n os,\n env,\n runtime,\n provider,\n `Node ${nodeVersion}`,\n process.env.NODE_ENV,\n ].filter(Boolean);\n\n return keysOfInterest.join('; ');\n};\n\nconst detectedPlatform = getPlatform();\n\nexport const getCLIUserAgent = (platform?: string, extensions?: string): string => {\n const userAgentParts = [`${name}/${version}`];\n\n const platformValue = platform ?? detectedPlatform;\n\n userAgentParts.push(`(${platformValue})`);\n\n if (extensions) {\n userAgentParts.push(extensions);\n }\n\n return userAgentParts.join(' ');\n};\n","import { getCLIUserAgent } from './user-agent';\n\ninterface HttpsConfig {\n baseUrl: string;\n accessToken?: string;\n}\n\nexport class Https {\n private baseUrl: string;\n private accessToken?: string;\n private userAgent: string;\n\n constructor({ baseUrl, accessToken }: HttpsConfig) {\n this.baseUrl = baseUrl;\n this.accessToken = accessToken;\n this.userAgent = getCLIUserAgent();\n }\n\n async fetch(path: string, opts: RequestInit = {}) {\n const { headers = {}, ...rest } = opts;\n\n const options = {\n headers: {\n ...headers,\n Accept: 'application/json',\n 'User-Agent': this.userAgent,\n ...(this.accessToken && { 'X-Auth-Token': this.accessToken }),\n },\n ...rest,\n };\n\n return fetch(`${this.baseUrl}${path}`, options);\n }\n}\n","import { Https } from './https';\n\ninterface CliApiConfig {\n origin: string;\n storeHash: string;\n accessToken: string;\n}\n\nexport class CliApi {\n private client: Https;\n\n constructor({ origin, storeHash, accessToken }: CliApiConfig) {\n this.client = new Https({\n baseUrl: `${origin}/stores/${storeHash}/cli-api/v3`,\n accessToken,\n });\n }\n\n async getChannelInit(channelId: number | string) {\n return this.client.fetch(`/channels/${channelId}/init`, {\n method: 'GET',\n });\n }\n\n async checkEligibility() {\n return this.client.fetch('/channels/catalyst/eligibility', {\n method: 'GET',\n });\n }\n\n async createChannel(name: string, installSampleData = false) {\n return this.client.fetch('/channels/catalyst', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name,\n initialData: {\n type: installSampleData ? 'sample' : 'none',\n },\n deployStorefront: true,\n devOrigin: 'http://localhost:3000',\n }),\n });\n }\n}\n","import { execSync } from 'child_process';\n\nimport { checkoutRef } from './checkout-ref';\nimport { hasGitHubSSH } from './has-github-ssh';\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 console.log(`Cloning ${repository} using ${useSSH ? 'SSH' : 'HTTPS'}...\\n`);\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 console.log();\n\n execSync('git remote rename origin upstream', { cwd: projectDir, stdio: 'inherit' });\n console.log();\n\n if (ghRef) {\n if (resetMain) {\n checkoutRef(projectDir, 'main');\n\n resetBranchToRef(projectDir, ghRef);\n\n console.log(`Reset main to ${ghRef} successfully.`);\n console.log();\n\n return;\n }\n\n checkoutRef(projectDir, ghRef);\n\n console.log();\n }\n};\n","import { execSync } from 'node:child_process';\n\nimport { isExecException } from './is-exec-exception';\n\nexport function checkoutRef(repoDir: string, ref: string): void {\n try {\n // Attempt to checkout the specified ref\n execSync(`git checkout ${ref}`, {\n cwd: repoDir,\n stdio: 'inherit',\n encoding: 'utf8',\n });\n console.log(`Checked out ref ${ref} successfully.`);\n } catch (error: unknown) {\n // Handle the error safely according to ESLint rules\n if (isExecException(error)) {\n const stderr = error.stderr ? error.stderr.toString() : '';\n\n // Check if the error message indicates that the ref was not found\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 console.error(`Ref '${ref}' not found in the repository.`);\n } else {\n console.error(`Error checking out ref '${ref}':`, stderr.trim());\n }\n }\n\n if (error instanceof Error) {\n // General error handling\n console.error(`Error checking out ref '${ref}':`, error.message);\n }\n\n // Unknown error type\n console.error(`Unknown error occurred while checking out ref '${ref}'.`);\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 // Attempt to connect to GitHub via SSH and capture the output\n const output = execSync('ssh -T git@github.com', {\n encoding: 'utf8',\n stdio: 'pipe',\n }).toString();\n\n // Check the output for successful authentication\n return output.includes('successfully authenticated');\n } catch (error: unknown) {\n // Use the type guard to check if error is an ExecException\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 // Check if the output indicates successful authentication\n if (combinedOutput.includes('successfully authenticated')) {\n return true;\n }\n }\n\n return false;\n }\n}\n","import { execSync } from 'node:child_process';\n\nexport function resetBranchToRef(projectDir: string, ghRef: string): void {\n execSync(`git reset --hard ${ghRef}`, {\n cwd: projectDir,\n stdio: 'inherit',\n encoding: 'utf8',\n });\n}\n","import chalk from 'chalk';\nimport { installDependencies as installDeps } from 'nypm';\n\nimport { spinner } from './spinner';\n\nconst installAllDeps = async (projectDir: string) => {\n await installDeps({ cwd: projectDir, silent: true, packageManager: 'pnpm' });\n};\n\nexport const installDependencies = async (projectDir: string) =>\n spinner(installAllDeps(projectDir), {\n text: `Installing dependencies. This could take a minute...`,\n successText: `Dependencies installed successfully`,\n failText: (err) => chalk.red(`Failed to install dependencies: ${err.message}`),\n });\n","import { type Ora, oraPromise, type PromiseOptions } from 'ora';\n\nexport const spinner = async <T>(\n action: PromiseLike<T> | ((spinner: Ora) => PromiseLike<T>),\n oraOpts: PromiseOptions<T>,\n) => {\n return oraPromise(action, {\n spinner: 'triangle',\n ...oraOpts,\n }).catch(() => process.exit(1));\n};\n","import chalk from 'chalk';\nimport open from 'open';\nimport { createInterface } from 'readline';\n\nimport { Auth } from './auth';\nimport { Config } from './config';\nimport { spinner } from './spinner';\n\ninterface LoginResult {\n storeHash: string;\n accessToken: string;\n}\n\ninterface DeviceCodeCredentials {\n store_hash: string;\n access_token: string;\n}\n\nasync function pollDeviceCode(\n auth: Auth,\n deviceCode: string,\n interval: number,\n): Promise<DeviceCodeCredentials | null> {\n try {\n const credentials = await auth.checkDeviceCode(deviceCode);\n\n return credentials;\n } catch {\n await new Promise((resolve) => setTimeout(resolve, interval * 1000));\n\n return null;\n }\n}\n\nasync function waitForCredentials(\n auth: Auth,\n deviceCode: string,\n interval: number,\n): Promise<DeviceCodeCredentials> {\n const credentials = await pollDeviceCode(auth, deviceCode, interval);\n\n if (credentials) {\n return credentials;\n }\n\n return waitForCredentials(auth, deviceCode, interval);\n}\n\nasync function waitForKeyPress(prompt: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n // Enable raw mode to get individual keystrokes\n process.stdin.setRawMode(true);\n process.stdin.resume();\n\n return new Promise((resolve) => {\n process.stdin.once('data', (data) => {\n // Restore normal stdin mode\n process.stdin.setRawMode(false);\n process.stdin.pause();\n rl.close();\n\n // Check if escape key was pressed (27 is the ASCII code for escape)\n const shouldProceed = data[0] !== 27;\n\n // Add a newline since we're in raw mode\n process.stdout.write('\\n');\n\n resolve(shouldProceed);\n });\n\n // Display the prompt\n rl.write(prompt);\n });\n}\n\nexport async function login(baseUrl: string): Promise<LoginResult> {\n const auth = new Auth({ baseUrl });\n\n const deviceCode = await auth.getDeviceCode();\n\n console.log(\n chalk.cyan('\\nPlease visit the following URL to authenticate with your BigCommerce store:'),\n );\n console.log(chalk.yellow(`\\n${deviceCode.verification_uri}\\n`));\n console.log(chalk.cyan(`Enter code: `) + chalk.yellow(`${deviceCode.user_code}\\n`));\n\n const shouldOpenUrl = await waitForKeyPress(\n 'Press any key to open the URL in your browser (or ESC to skip)...',\n );\n\n if (shouldOpenUrl) {\n await open(deviceCode.verification_uri);\n }\n\n const credentials = await spinner(\n () => waitForCredentials(auth, deviceCode.device_code, deviceCode.interval),\n { text: 'Waiting for authentication...', successText: 'Authentication successful!' },\n );\n\n return {\n storeHash: credentials.store_hash,\n accessToken: credentials.access_token,\n };\n}\n\nexport function storeCredentials(projectDir: string, credentials: LoginResult): void {\n const config = new Config(projectDir);\n\n config.setAuth(credentials.storeHash, credentials.accessToken);\n}\n","import { z } from 'zod';\n\nimport { Https } from './https';\nimport { parse } from './parse';\n\ninterface AuthConfig {\n baseUrl: string;\n}\n\nexport class Auth {\n private client: Https;\n private readonly DEVICE_OAUTH_CLIENT_ID = 's1q4io7mah2lm1i6uwp9yl1eit80n3b';\n\n constructor({ baseUrl }: AuthConfig) {\n this.client = new Https({ baseUrl });\n }\n\n async getDeviceCode() {\n const response = await this.client.fetch('/device/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n scopes: [\n 'store_channel_settings',\n 'store_sites',\n 'store_storefront_api',\n 'store_v2_content',\n 'store_v2_information',\n 'store_v2_products',\n 'store_cart',\n ].join(' '),\n client_id: this.DEVICE_OAUTH_CLIENT_ID,\n }),\n });\n\n const DeviceCodeSchema = 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\n return parse(await response.json(), DeviceCodeSchema);\n }\n\n async checkDeviceCode(deviceCode: string) {\n const response = await this.client.fetch('/device/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n device_code: deviceCode,\n client_id: this.DEVICE_OAUTH_CLIENT_ID,\n }),\n });\n\n if (response.status !== 200) {\n throw new Error('Device code not yet verified');\n }\n\n const DeviceCodeSuccessSchema = z.object({\n access_token: z.string(),\n store_hash: z.string(),\n context: z.string(),\n api_uri: z.string().url(),\n });\n\n return parse(await response.json(), DeviceCodeSuccessSchema);\n }\n}\n","import * as z from 'zod';\nimport { fromZodError } from 'zod-validation-error';\n\nexport const parse = <T>(data: unknown, schema: z.Schema<T>): T => {\n try {\n return schema.parse(data);\n } catch (error) {\n if (error instanceof z.ZodError) {\n console.error(fromZodError(error).toString());\n }\n\n process.exit(1);\n }\n};\n","import { parse as parseTOML, stringify as stringifyTOML } from '@iarna/toml';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { dirname, join } from 'path';\n\ninterface CatalystConfig {\n auth?: {\n storeHash?: string;\n accessToken?: string;\n };\n}\n\ninterface TomlRecord {\n [key: string]: string | number | boolean | TomlRecord | TomlRecord[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isCatalystConfig(obj: unknown): obj is CatalystConfig {\n if (!isRecord(obj)) {\n return false;\n }\n\n if ('auth' in obj) {\n if (!isRecord(obj.auth)) {\n return false;\n }\n\n const { storeHash, accessToken } = obj.auth;\n\n return (\n (storeHash === undefined || typeof storeHash === 'string') &&\n (accessToken === undefined || typeof accessToken === 'string')\n );\n }\n\n return true;\n}\n\nexport class Config {\n private configPath: string;\n private config: CatalystConfig;\n\n constructor(projectDir: string) {\n this.configPath = join(projectDir, '.catalyst');\n this.config = this.read();\n }\n\n getAuth(): { storeHash?: string; accessToken?: string } {\n return this.config.auth ?? {};\n }\n\n setAuth(storeHash: string, accessToken: string): void {\n this.config.auth = { storeHash, accessToken };\n this.save();\n }\n\n save(): void {\n const configObj: TomlRecord = {};\n\n if (this.config.auth?.storeHash && this.config.auth.accessToken) {\n configObj.auth = {\n storeHash: this.config.auth.storeHash,\n accessToken: this.config.auth.accessToken,\n };\n }\n\n const dir = dirname(this.configPath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const preamble = `# DO NOT commit this file to your repository!\n# This file contains sensitive configuration specific to your local CLI setup.\n# It includes authentication tokens and store-specific information.\n# If using version control, make sure to add .catalyst to your .gitignore file.\n\n`;\n\n writeFileSync(this.configPath, preamble + stringifyTOML(configObj));\n }\n\n private read(): CatalystConfig {\n if (!existsSync(this.configPath)) {\n return {};\n }\n\n try {\n const contents = readFileSync(this.configPath, 'utf-8');\n const parsed = parseTOML(contents);\n\n if (isCatalystConfig(parsed)) {\n return parsed;\n }\n\n console.warn('Invalid config format in .catalyst file, using defaults');\n\n return {};\n } catch {\n console.warn('Failed to parse .catalyst config file, using defaults');\n\n return {};\n }\n }\n}\n","import { Analytics } from '@segment/analytics-node';\nimport Conf from 'conf';\nimport { randomBytes } from 'crypto';\n\nimport PACKAGE_INFO from '../../../package.json';\n\n// This is the key that stores whether or not telemetry is enabled or disabled.\nconst TELEMETRY_KEY_ENABLED = 'telemetry.enabled';\n\n// This is a quasi-persistent identifier used to dedupe recurring events.\nconst TELEMETRY_KEY_ID = `telemetry.anonymousId`;\n\ninterface Config {\n telemetry: {\n enabled: boolean;\n anonymousId: string;\n };\n}\n\nexport class Telemetry {\n readonly sessionId: string;\n readonly analytics: Analytics;\n\n private conf: Conf<Config> | null;\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 try {\n this.conf = new Conf({\n projectName: this.projectName,\n projectVersion: this.projectVersion,\n });\n } catch {\n this.conf = null;\n }\n\n this.sessionId = randomBytes(32).toString('hex');\n this.analytics = new Analytics({\n writeKey: process.env.CLI_SEGMENT_WRITE_KEY ?? 'not-a-valid-segment-write-key',\n });\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 sessionId: this.sessionId,\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.conf?.set(TELEMETRY_KEY_ENABLED, enabled);\n\n return this.conf?.path;\n };\n\n isEnabled(): boolean {\n return (\n !this.CATALYST_TELEMETRY_DISABLED &&\n !!this.conf &&\n this.conf.get<typeof TELEMETRY_KEY_ENABLED, boolean>(TELEMETRY_KEY_ENABLED, true)\n );\n }\n\n private getAnonymousId(): string {\n const val = this.conf?.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.conf?.set(TELEMETRY_KEY_ID, generated);\n\n return generated;\n }\n}\n","import { outputFileSync } from 'fs-extra/esm';\nimport { join } from 'path';\n\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 { Command, Option } from '@commander-js/extra-typings';\nimport { select } from '@inquirer/prompts';\nimport chalk from 'chalk';\n\nimport { CliApi } from '../utils/cli-api';\nimport { Config } from '../utils/config';\nimport { Https } from '../utils/https';\nimport { login, storeCredentials } from '../utils/login';\nimport { Telemetry } from '../utils/telemetry/telemetry';\nimport { writeEnv } from '../utils/write-env';\n\ninterface Channel {\n id: number;\n name: string;\n platform: string;\n}\n\ninterface ChannelsResponse {\n data: Channel[];\n}\n\ninterface InitResponse {\n data: {\n makeswift_dev_api_key: string;\n storefront_api_token: string;\n envVars: Record<string, string>;\n };\n}\n\nfunction isChannelsResponse(response: unknown): response is ChannelsResponse {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'data' in response &&\n Array.isArray(response.data) &&\n response.data.every(\n (item) =>\n typeof item === 'object' &&\n item !== null &&\n 'id' in item &&\n 'name' in item &&\n 'platform' in item,\n )\n );\n}\n\nfunction isInitResponse(response: unknown): response is InitResponse {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'data' in response &&\n typeof response.data === 'object' &&\n response.data !== null &&\n 'storefront_api_token' in response.data &&\n 'envVars' in response.data\n );\n}\n\nconst telemetry = new Telemetry();\n\nexport const init = new Command('init')\n .description('Connect a BigCommerce store with an existing Catalyst project')\n .option('--store-hash <hash>', 'BigCommerce store hash')\n .option('--access-token <token>', 'BigCommerce access token')\n .option('--env <vars...>', 'Arbitrary environment variables to set in .env.local')\n .addOption(\n new Option('--bigcommerce-hostname <hostname>', 'BigCommerce hostname')\n .default('bigcommerce.com')\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 .action(async (options) => {\n const projectDir = process.cwd();\n\n let storeHash = options.storeHash;\n let accessToken = options.accessToken;\n\n // Check for stored credentials\n if (!storeHash || !accessToken) {\n const config = new Config(projectDir);\n const storedAuth = config.getAuth();\n\n storeHash = storeHash ?? storedAuth.storeHash;\n accessToken = accessToken ?? storedAuth.accessToken;\n }\n\n if (!storeHash || !accessToken) {\n const credentials = await login(`https://login.${options.bigcommerceHostname}`);\n\n storeHash = credentials.storeHash;\n accessToken = credentials.accessToken;\n\n // Store credentials after successful authentication\n storeCredentials(projectDir, credentials);\n }\n\n await telemetry.identify(storeHash);\n\n const bc = new Https({\n baseUrl: `https://api.${options.bigcommerceHostname}/stores/${storeHash}`,\n accessToken,\n });\n\n const cliApi = new CliApi({\n origin: options.cliApiOrigin,\n storeHash,\n accessToken,\n });\n\n const channelSortOrder = ['catalyst', 'next', 'bigcommerce'];\n const channelsResponse = await bc.fetch('/v3/channels?available=true&type=storefront');\n\n if (!channelsResponse.ok) {\n console.error(\n chalk.red(\n `\\nGET /v3/channels failed: ${channelsResponse.status} ${channelsResponse.statusText}\\n`,\n ),\n );\n process.exit(1);\n }\n\n const availableChannels: unknown = await channelsResponse.json();\n\n if (!isChannelsResponse(availableChannels)) {\n console.error(chalk.red('\\nUnexpected response format from channels endpoint\\n'));\n process.exit(1);\n }\n\n const existingChannel = await select({\n message: 'Which channel would you like to use?',\n choices: availableChannels.data\n .sort(\n (a: Channel, b: Channel) =>\n channelSortOrder.indexOf(a.platform) - channelSortOrder.indexOf(b.platform),\n )\n .map((ch: Channel) => ({\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 const channelId = existingChannel.id;\n\n // Get channel init data\n const initResponse = await cliApi.getChannelInit(channelId);\n\n if (!initResponse.ok) {\n console.error(\n chalk.red(\n `\\nGET /channels/${channelId}/init failed: ${initResponse.status} ${initResponse.statusText}\\n`,\n ),\n );\n process.exit(1);\n }\n\n const initData: unknown = await initResponse.json();\n\n if (!isInitResponse(initData)) {\n console.error(chalk.red('\\nUnexpected response format from init endpoint\\n'));\n process.exit(1);\n }\n\n const envVars = { ...initData.data.envVars };\n\n // Add any CLI-provided env vars as overrides\n if (options.env) {\n const cliEnvVars = options.env.reduce<Record<string, string>>((acc, env) => {\n const [key, value] = env.split('=');\n\n if (key && value) {\n acc[key] = value;\n }\n\n return acc;\n }, {});\n\n Object.assign(envVars, cliEnvVars);\n }\n\n writeEnv(projectDir, envVars);\n\n console.log(chalk.green(`\\n.env.local file created for channel ${existingChannel.name}!\\n`));\n console.log(chalk.green(`\\nNext steps:\\n`));\n console.log(chalk.yellow(`\\npnpm run dev\\n`));\n });\n","import { Command } from '@commander-js/extra-typings';\nimport { exec as execCb } from 'child_process';\nimport { parse } from 'dotenv';\nimport { outputFileSync, writeJsonSync } from 'fs-extra/esm';\nimport kebabCase from 'lodash.kebabcase';\nimport { coerce, compare } from 'semver';\nimport { promisify } from 'util';\nimport { z } from 'zod';\n\nconst exec = promisify(execCb);\n\nexport const ManifestSchema = z.object({\n name: z.string(),\n dependencies: z.object({ add: z.array(z.string()) }),\n devDependencies: z.object({ add: z.array(z.string()) }),\n environmentVariables: z.array(z.string()),\n});\n\ntype Manifest = z.infer<typeof ManifestSchema>;\n\nexport const integration = new Command('integration')\n .argument('<integration-name>', 'Formatted name of the integration')\n .option('--commit-hash <hash>', 'Override integration source branch with a specific commit hash')\n .action(async (integrationNameRaw, options) => {\n // @todo check for integration name conflicts\n const integrationName = z.string().transform(kebabCase).parse(integrationNameRaw);\n\n const manifest: Manifest = {\n name: integrationName,\n dependencies: { add: [] },\n devDependencies: { add: [] },\n environmentVariables: [],\n };\n\n await exec('git fetch --tags');\n\n const { stdout: headRefStdOut } = await exec('git rev-parse --abbrev-ref HEAD');\n let [sourceRef] = headRefStdOut.split('\\n');\n\n if (options.commitHash) {\n sourceRef = options.commitHash;\n }\n\n const { stdout: catalystTags } = await exec('git tag --list @bigcommerce/catalyst-core@\\\\*');\n const [latestCoreTag] = catalystTags\n .split('\\n')\n .filter(Boolean)\n .sort((a, b) => {\n const versionA = coerce(a.replace('@bigcommerce/catalyst-core@', ''));\n const versionB = coerce(b.replace('@bigcommerce/catalyst-core@', ''));\n\n if (versionA && versionB) {\n return compare(versionA, versionB);\n }\n\n return 0;\n })\n .reverse();\n\n const PackageDependenciesSchema = z.object({\n dependencies: z.object({}).passthrough(),\n devDependencies: z.object({}).passthrough(),\n });\n\n const getPackageDeps = async (ref: string) => {\n const { stdout } = await exec(`git show ${ref}:core/package.json`);\n\n return PackageDependenciesSchema.parse(JSON.parse(stdout));\n };\n\n const integrationJson = await getPackageDeps(sourceRef);\n const latestCoreTagJson = await getPackageDeps(latestCoreTag);\n\n const diffObjectKeys = (a: Record<string, unknown>, b: Record<string, unknown>) => {\n return Object.keys(a).filter((key) => !Object.keys(b).includes(key));\n };\n\n manifest.dependencies.add = diffObjectKeys(\n integrationJson.dependencies,\n latestCoreTagJson.dependencies,\n );\n manifest.devDependencies.add = diffObjectKeys(\n integrationJson.devDependencies,\n latestCoreTagJson.devDependencies,\n );\n\n const { stdout: latestCoreEnv } = await exec(`git show ${latestCoreTag}:core/.env.example`);\n const { stdout: integrationEnv } = await exec(`git show ${sourceRef}:core/.env.example`);\n\n manifest.environmentVariables = diffObjectKeys(parse(integrationEnv), parse(latestCoreEnv));\n\n const { stdout: integrationDiff } = await exec(\n `git diff ${latestCoreTag}...${sourceRef} -- ':(exclude)core/package.json' ':(exclude)pnpm-lock.yaml'`,\n );\n\n outputFileSync(`integrations/${integrationName}/integration.patch`, integrationDiff);\n writeJsonSync(`integrations/${integrationName}/manifest.json`, manifest, {\n spaces: 2,\n });\n\n console.log('Integration created successfully.');\n });\n","import { Argument, Command, Option } from '@commander-js/extra-typings';\n\nimport { catalystTelemetry, CatalystTelemetryOptions } from '../utils/telemetry';\n\nexport const telemetry = new Command('telemetry')\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: string | undefined, options: CatalystTelemetryOptions) =>\n catalystTelemetry(options, arg),\n );\n","import chalk from 'chalk';\n\nimport { Telemetry } from './telemetry';\n\nexport interface CatalystTelemetryOptions {\n enable?: boolean;\n disable?: boolean;\n}\n\nconst telemetry = new Telemetry();\nlet isEnabled = telemetry.isEnabled();\n\nconst catalystTelemetry = (options: CatalystTelemetryOptions, arg: string | undefined) => {\n if (options.enable || arg === 'enable') {\n telemetry.setEnabled(true);\n isEnabled = true;\n\n console.log('Success!');\n } else if (options.disable || arg === 'disable') {\n const path = telemetry.setEnabled(false);\n\n if (isEnabled) {\n console.log(`Your preference has been saved${path ? ` to ${path}` : ''}`);\n } else {\n console.log(`Catalyst CLI telemetry collection is already disabled.`);\n }\n\n isEnabled = false;\n } else {\n console.log('Catalyst CLI Telemetry');\n }\n\n console.log(\n `\\nStatus: ${chalk.bold(isEnabled ? chalk.green('Enabled') : chalk.red('Disabled'))}`,\n );\n\n if (!isEnabled) {\n console.log(\n `\\nYou have opted-out of Catalyst CLI telemetry.\\nNo data will be collected from your machine.`,\n );\n }\n};\n\nexport { catalystTelemetry };\n","import { Command } from '@commander-js/extra-typings';\n\nimport { Telemetry } from '../utils/telemetry/telemetry';\n\nconst telemetry = new Telemetry();\n\nconst allowlistArguments = ['--gh-ref', '--repository', '--project-name'];\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\nexport const telemetryPreHook = async (command: Command) => {\n // @ts-expect-error _name is a private property\n const availableCommands = command.commands.map((cmd) => cmd._name); // eslint-disable-line @typescript-eslint/no-unsafe-return, no-underscore-dangle\n\n const [commandName = 'create', ...args] = command.args;\n\n // When running `npm create @bigcommerce/catalyst`, the command defaults to\n // the `create` command but commander doesn't pass it as part of the arguments.\n // We need to handle this case separately.\n if (!availableCommands.includes(commandName)) {\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('create', {\n ...parseArguments(args),\n });\n }\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(args),\n });\n};\n\nexport const telemetryPostHook = async () => {\n await telemetry.analytics.closeAndFlush();\n};\n"],"mappings":"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","names":["chalk","chalk","execSync","join","process","process","name","execSync","execSync","execSync","execSync","execSync","chalk","z","z","chalk","join","isWindows","chalk","join","execSync","Command","Option","select","chalk","isChannelsResponse","isInitResponse","telemetry","Command","Option","chalk","select","Command","parse","outputFileSync","kebabCase","z","z","Command","kebabCase","parse","outputFileSync","Command","Option","chalk","telemetry","chalk","telemetry","Command","Option","telemetry","chalk","telemetry"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../package.json","../src/commands/create.ts","../src/prompts/multi-select/multi-select.ts","../src/prompts/multi-select/helpers.ts","../src/utils/user-agent.ts","../src/utils/https.ts","../src/utils/cli-api.ts","../src/utils/clone-catalyst.ts","../src/utils/checkout-ref.ts","../src/utils/is-exec-exception.ts","../src/utils/has-github-ssh.ts","../src/utils/reset-branch-to-ref.ts","../src/utils/install-dependencies.ts","../src/utils/spinner.ts","../src/utils/localization.ts","../src/utils/login.ts","../src/utils/auth.ts","../src/utils/parse.ts","../src/utils/config.ts","../src/utils/telemetry/telemetry.ts","../src/utils/write-env.ts","../src/commands/init.ts","../src/commands/integration.ts","../src/commands/telemetry.ts","../src/utils/telemetry/index.ts","../src/hooks/telemetry.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { program } from '@commander-js/extra-typings';\nimport chalk from 'chalk';\n\nimport PACKAGE_INFO from '../package.json';\n\nimport { create } from './commands/create';\nimport { init } from './commands/init';\nimport { integration } from './commands/integration';\nimport { telemetry } from './commands/telemetry';\nimport { telemetryPostHook, telemetryPreHook } from './hooks/telemetry';\n\nconsole.log(chalk.cyanBright(`\\n◢ ${PACKAGE_INFO.name} v${PACKAGE_INFO.version}\\n`));\n\nprogram\n .name(PACKAGE_INFO.name)\n .version(PACKAGE_INFO.version)\n .description('A command line tool to create a new Catalyst project.')\n .addCommand(create, { isDefault: true })\n .addCommand(init)\n .addCommand(integration)\n .addCommand(telemetry)\n .hook('preAction', telemetryPreHook)\n .hook('postAction', telemetryPostHook);\n\nprogram.parse(process.argv);\n","{\n \"name\": \"@bigcommerce/create-catalyst\",\n \"version\": \"0.21.0\",\n \"type\": \"module\",\n \"bin\": \"bin/index.cjs\",\n \"files\": [\n \"bin\",\n \"dist\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint . --max-warnings 0\",\n \"test\": \"jest\",\n \"build\": \"tsup\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"dependencies\": {\n \"@commander-js/extra-typings\": \"^13.1.0\",\n \"@iarna/toml\": \"^2.2.5\",\n \"@inquirer/core\": \"^10.1.6\",\n \"@inquirer/figures\": \"^1.0.10\",\n \"@inquirer/prompts\": \"^7.2.3\",\n \"@inquirer/type\": \"^3.0.4\",\n \"@segment/analytics-node\": \"^2.2.1\",\n \"ansi-escapes\": \"^7.0.0\",\n \"chalk\": \"^5.4.1\",\n \"commander\": \"^13.1.0\",\n \"conf\": \"^13.1.0\",\n \"cross-spawn\": \"^7.0.6\",\n \"dotenv\": \"^16.4.7\",\n \"fs-extra\": \"^11.3.0\",\n \"giget\": \"^1.2.3\",\n \"lodash.kebabcase\": \"^4.1.1\",\n \"nypm\": \"^0.5.0\",\n \"open\": \"^10.1.0\",\n \"ora\": \"^8.1.1\",\n \"semver\": \"^7.6.3\",\n \"std-env\": \"^3.8.0\",\n \"zod\": \"^3.24.1\",\n \"zod-validation-error\": \"^3.4.0\"\n },\n \"devDependencies\": {\n \"@bigcommerce/eslint-config\": \"^2.10.0\",\n \"@bigcommerce/eslint-config-catalyst\": \"workspace:^\",\n \"@swc/core\": \"^1.10.11\",\n \"@swc/jest\": \"^0.2.37\",\n \"@types/cross-spawn\": \"^6.0.6\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/jest\": \"^29.5.14\",\n \"@types/lodash.kebabcase\": \"^4.1.9\",\n \"@types/node\": \"^20.17.16\",\n \"@types/prompts\": \"^2.4.9\",\n \"@types/semver\": \"^7.5.8\",\n \"eslint\": \"^8.57.1\",\n \"jest\": \"^29.7.0\",\n \"msw\": \"^2.7.0\",\n \"prettier\": \"^3.4.2\",\n \"tsup\": \"^8.3.6\",\n \"typescript\": \"^5.7.3\"\n }\n}\n","import { Command, Option } from '@commander-js/extra-typings';\nimport { input, select } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { pathExistsSync } from 'fs-extra/esm';\nimport kebabCase from 'lodash.kebabcase';\nimport { join } from 'path';\n\nimport { multiSelect } from '../prompts/multi-select';\nimport { CliApi } from '../utils/cli-api';\nimport { cloneCatalyst } from '../utils/clone-catalyst';\nimport { Https } from '../utils/https';\nimport { installDependencies } from '../utils/install-dependencies';\nimport { getAvailableLocales } from '../utils/localization';\nimport { login, storeCredentials } from '../utils/login';\nimport { Telemetry } from '../utils/telemetry/telemetry';\nimport { writeEnv } from '../utils/write-env';\n\ninterface Channel {\n id: number;\n name: string;\n platform: string;\n}\n\ninterface ChannelsResponse {\n data: Channel[];\n}\n\ninterface InitResponse {\n data: {\n makeswift_dev_api_key: string;\n storefront_api_token: string;\n envVars: Record<string, string>;\n };\n}\n\ninterface CreateChannelResponse {\n data: {\n id: number;\n storefront_api_token: string;\n envVars: Record<string, string>;\n };\n}\n\ninterface EligibilityResponse {\n data: {\n eligible: boolean;\n message: string;\n };\n}\n\nfunction getPlatformCheckCommand(command: string): string {\n const isWindows = process.platform === 'win32';\n\n return isWindows ? `where.exe ${command}` : `which ${command}`;\n}\n\nconst telemetry = new Telemetry();\n\nasync function handleChannelCreation(bc: Https, cliApi: CliApi) {\n const newChannelName = await input({\n message: 'What would you like to name your new channel?',\n });\n\n let availableLocales = [];\n\n try {\n availableLocales = await getAvailableLocales(bc);\n } catch (error) {\n if (error instanceof Error) {\n console.error(chalk.red(error.message));\n }\n\n process.exit(1);\n }\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: () => chalk.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 additionalLocales = await multiSelect({\n choices: availableLocales.filter(({ value }) => value !== storefrontLocale),\n message: 'Which additional languages would you like to add to your channel?',\n theme: {\n style: {\n help: () => chalk.dim('(Select locale from the list or start typing the name)'),\n },\n },\n validate: (selections) => {\n if (selections.length > 4) {\n return 'You can only select up to 4 additional languages';\n }\n\n return true;\n },\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 const response = await cliApi.createChannel(\n newChannelName,\n storefrontLocale,\n additionalLocales,\n shouldInstallSampleData,\n );\n\n if (!response.ok) {\n console.error(\n chalk.red(`\\nPOST /channels/catalyst failed: ${response.status} ${response.statusText}\\n`),\n );\n process.exit(1);\n }\n\n const channelData: unknown = await response.json();\n\n if (!isCreateChannelResponse(channelData)) {\n console.error(chalk.red('\\nUnexpected response format from create channel endpoint\\n'));\n process.exit(1);\n }\n\n return {\n channelId: channelData.data.id,\n storefrontToken: channelData.data.storefront_api_token,\n envVars: channelData.data.envVars,\n };\n}\n\nasync function handleChannelSelection(bc: Https) {\n const channelSortOrder = ['catalyst', 'next', 'bigcommerce'];\n const channelsResponse = await bc.fetch('/v3/channels?available=true&type=storefront');\n\n if (!channelsResponse.ok) {\n console.error(\n chalk.red(\n `\\nGET /v3/channels failed: ${channelsResponse.status} ${channelsResponse.statusText}\\n`,\n ),\n );\n process.exit(1);\n }\n\n const availableChannels: unknown = await channelsResponse.json();\n\n if (!isChannelsResponse(availableChannels)) {\n console.error(chalk.red('\\nUnexpected response format from channels endpoint\\n'));\n process.exit(1);\n }\n\n const existingChannel = await select({\n message: 'Which channel would you like to use?',\n choices: availableChannels.data\n .sort((a: Channel, b: Channel) => {\n const aIndex = channelSortOrder.indexOf(a.platform);\n const bIndex = channelSortOrder.indexOf(b.platform);\n\n // If both platforms are not in the sort order, maintain their original order\n if (aIndex === -1 && bIndex === -1) {\n return 0;\n }\n\n // If one platform is not in the sort order, it should go to the end\n if (aIndex === -1) return 1;\n if (bIndex === -1) return -1;\n\n // If both platforms are in the sort order, use their relative positions\n return aIndex - bIndex;\n })\n .map((ch: Channel) => ({\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 getChannelInit(cliApi: CliApi, channelId: number) {\n const initResponse = await cliApi.getChannelInit(channelId);\n\n if (!initResponse.ok) {\n console.error(\n chalk.red(\n `\\nGET /channels/${channelId}/init failed: ${initResponse.status} ${initResponse.statusText}\\n`,\n ),\n );\n process.exit(1);\n }\n\n const initData: unknown = await initResponse.json();\n\n if (!isInitResponse(initData)) {\n console.error(chalk.red('\\nUnexpected response format from init endpoint\\n'));\n process.exit(1);\n }\n\n return {\n storefrontToken: initData.data.storefront_api_token,\n envVars: initData.data.envVars,\n };\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 console.error(chalk.red(`Error: --projectDir ${projectDir} is not a valid path\\n`));\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 console.error(chalk.red(`Error: ${projectDir} already exists\\n`));\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 is the name of your project?',\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 console.error(chalk.red('Error: git is required to create a Catalyst project\\n'));\n process.exit(1);\n }\n\n try {\n execSync(getPlatformCheckCommand('pnpm'), { stdio: 'ignore' });\n } catch {\n console.error(chalk.red('Error: pnpm is required to create a Catalyst project\\n'));\n console.error(chalk.yellow('Tip: Enable it by running `corepack enable pnpm`\\n'));\n process.exit(1);\n }\n}\n\nexport const create = new Command('create')\n .description('Command to scaffold and connect a Catalyst storefront to your BigCommerce store')\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 .option('--store-hash <hash>', 'BigCommerce store hash')\n .option('--access-token <token>', 'BigCommerce access token')\n .option('--channel-id <id>', 'BigCommerce channel ID')\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('--env <vars...>', 'Arbitrary environment variables to set in .env.local')\n .addOption(\n new Option('--bigcommerce-hostname <hostname>', 'BigCommerce hostname')\n .default('bigcommerce.com')\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 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;\n let storefrontToken = options.storefrontToken;\n let credentials;\n\n if (options.channelId) {\n channelId = parseInt(options.channelId, 10);\n }\n\n let envVars: Record<string, string> = {};\n\n // Get credentials if needed\n if ((!storeHash || !accessToken) && (!channelId || !storefrontToken)) {\n credentials = await login(`https://login.${options.bigcommerceHostname}`);\n storeHash = credentials.storeHash;\n accessToken = credentials.accessToken;\n }\n\n // If store hash, channel ID, and storefront token are all provided, skip channel selection/creation\n if (storeHash && channelId && storefrontToken) {\n envVars.BIGCOMMERCE_STORE_HASH = storeHash;\n envVars.BIGCOMMERCE_CHANNEL_ID = channelId.toString();\n envVars.BIGCOMMERCE_STOREFRONT_API_TOKEN = storefrontToken;\n } else {\n if (!storeHash || !accessToken) {\n // Create project without credentials\n console.log(`\\nCreating '${projectName}' at '${projectDir}'\\n`);\n cloneCatalyst({ repository, projectName, projectDir, ghRef, resetMain: options.resetMain });\n await installDependencies(projectDir);\n\n // Add any CLI-provided env vars\n if (options.env) {\n const cliEnvVars = options.env.reduce<Record<string, string>>((acc, env) => {\n const [key, value] = env.split('=');\n\n if (key && value) {\n acc[key] = value;\n }\n\n return acc;\n }, {});\n\n Object.assign(envVars, cliEnvVars);\n }\n\n // Write env vars even if we don't have store credentials\n writeEnv(projectDir, envVars);\n\n console.log(\n [\n `\\n${chalk.green('Success!')} Created '${projectName}' at '${projectDir}'\\n`,\n `Next steps:`,\n Object.keys(envVars).length > 0\n ? chalk.yellow(`\\n- cd ${projectName} && pnpm run dev\\n`)\n : [\n chalk.yellow(`\\n- cd ${projectName} && cp .env.example .env.local`),\n chalk.yellow(`\\n- Populate .env.local with your BigCommerce API credentials\\n`),\n ].join(''),\n ].join('\\n'),\n );\n\n process.exit(0);\n }\n\n // At this point we should have a storeHash and can identify the account\n await telemetry.identify(storeHash);\n\n if (!channelId || !storefrontToken) {\n const bc = new Https({\n baseUrl: `https://api.${options.bigcommerceHostname}/stores/${storeHash}`,\n accessToken,\n });\n\n const cliApi = new CliApi({\n origin: options.cliApiOrigin,\n storeHash,\n accessToken,\n });\n\n // If we have channelId but no storefrontToken, just get the init data\n if (channelId && !storefrontToken) {\n const initData = await getChannelInit(cliApi, channelId);\n\n envVars = { ...initData.envVars };\n storefrontToken = initData.storefrontToken;\n } else if (!channelId) {\n const eligibilityResponse = await cliApi.checkEligibility();\n\n if (!eligibilityResponse.ok) {\n console.error(\n chalk.red(\n `\\nGET /channels/catalyst/eligibility failed: ${eligibilityResponse.status} ${eligibilityResponse.statusText}\\n`,\n ),\n );\n process.exit(1);\n }\n\n const eligibilityData: unknown = await eligibilityResponse.json();\n\n if (!isEligibilityResponse(eligibilityData)) {\n console.error(chalk.red('\\nUnexpected response format from eligibility endpoint\\n'));\n process.exit(1);\n }\n\n if (!eligibilityData.data.eligible) {\n console.warn(chalk.yellow(eligibilityData.data.message));\n }\n\n let shouldCreateChannel;\n\n if (eligibilityData.data.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(bc, cliApi);\n\n channelId = channelData.channelId;\n storefrontToken = channelData.storefrontToken;\n envVars = { ...channelData.envVars };\n\n console.log(chalk.green(`Channel created successfully`));\n console.warn(\n chalk.yellow(\n '\\nNote: 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.',\n ),\n );\n }\n\n if (!shouldCreateChannel) {\n channelId = await handleChannelSelection(bc);\n\n const initData = await getChannelInit(cliApi, channelId);\n\n envVars = { ...initData.envVars };\n storefrontToken = initData.storefrontToken;\n }\n }\n }\n }\n\n // Add any CLI-provided env vars as overrides\n if (options.env) {\n const cliEnvVars = options.env.reduce<Record<string, string>>((acc, env) => {\n const [key, value] = env.split('=');\n\n if (key && value) {\n acc[key] = value;\n }\n\n return acc;\n }, {});\n\n Object.assign(envVars, cliEnvVars);\n }\n\n // Add store hash, channel ID, and storefront token to envVars if provided\n if (options.storeHash) {\n envVars.BIGCOMMERCE_STORE_HASH = options.storeHash;\n }\n\n if (options.channelId) {\n envVars.BIGCOMMERCE_CHANNEL_ID = options.channelId;\n }\n\n if (options.storefrontToken) {\n envVars.BIGCOMMERCE_STOREFRONT_TOKEN = options.storefrontToken;\n }\n\n if (!channelId) throw new Error('Something went wrong, channelId is not defined');\n if (!storefrontToken) throw new Error('Something went wrong, storefrontToken is not defined');\n\n // Create the project with all necessary configuration\n console.log(`\\nCreating '${projectName}' at '${projectDir}'\\n`);\n cloneCatalyst({ repository, projectName, projectDir, ghRef, resetMain: options.resetMain });\n await installDependencies(projectDir);\n\n // Write env vars\n writeEnv(projectDir, envVars);\n\n // Store credentials after successful project creation\n if (credentials) {\n storeCredentials(projectDir, credentials);\n }\n\n console.log(\n `\\n${chalk.green('Success!')} Created '${projectName}' at '${projectDir}'\\n`,\n '\\nNext steps:\\n',\n chalk.yellow(`\\ncd ${projectName} && pnpm run dev\\n`),\n );\n });\n\nfunction isInitResponse(response: unknown): response is InitResponse {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'data' in response &&\n typeof response.data === 'object' &&\n response.data !== null &&\n 'storefront_api_token' in response.data &&\n 'envVars' in response.data\n );\n}\n\nfunction isEligibilityResponse(response: unknown): response is EligibilityResponse {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'data' in response &&\n typeof response.data === 'object' &&\n response.data !== null &&\n 'eligible' in response.data &&\n 'message' in response.data\n );\n}\n\nfunction isCreateChannelResponse(response: unknown): response is CreateChannelResponse {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'data' in response &&\n typeof response.data === 'object' &&\n response.data !== null &&\n 'id' in response.data &&\n 'storefront_api_token' in response.data &&\n 'envVars' in response.data\n );\n}\n\nfunction isChannelsResponse(response: unknown): response is ChannelsResponse {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'data' in response &&\n Array.isArray(response.data) &&\n response.data.every(\n (item) =>\n typeof item === 'object' &&\n item !== null &&\n 'id' in item &&\n 'name' in item &&\n 'platform' in item,\n )\n );\n}\n","import {\n createPrompt,\n isBackspaceKey,\n isDownKey,\n isEnterKey,\n isNumberKey,\n isSpaceKey,\n isUpKey,\n makeTheme,\n Separator,\n type Status,\n useEffect,\n useKeypress,\n useMemo,\n usePagination,\n usePrefix,\n useRef,\n useState,\n ValidationError,\n} from '@inquirer/core';\nimport ansiEscapes from 'ansi-escapes';\n\nimport { isChecked, isSelectable, normalizeChoices, selectTheme, toggle } from './helpers';\nimport { Item, MultiSelectConfig, SelectTheme } from './types';\n\nexport const multiSelect = createPrompt(\n <Value>(config: MultiSelectConfig<Value>, done: (value: Value[]) => void) => {\n const theme = makeTheme<SelectTheme>(selectTheme, config.theme);\n const searchTimeoutRef = useRef<ReturnType<typeof setTimeout>>();\n const firstRender = useRef(true);\n const [items, setItems] = useState<ReadonlyArray<Item<Value>>>(\n normalizeChoices(config.choices),\n );\n const [status, setStatus] = useState<Status>('idle');\n const [errorMsg, setError] = useState<string>();\n const prefix = usePrefix({ status, theme });\n const { instructions, loop = true, pageSize = 7, required, validate = () => true } = config;\n\n const bounds = useMemo(() => {\n const first = items.findIndex(isSelectable);\n const last = items.findLastIndex(isSelectable);\n\n if (first === -1) {\n throw new ValidationError(\n '[multi select prompt] No selectable choices. All choices are disabled.',\n );\n }\n\n return { first, last };\n }, [items]);\n\n const [showHelpTip, setShowHelpTip] = useState(true);\n const [active, setActive] = useState(bounds.first);\n\n useEffect(\n () => () => {\n clearTimeout(searchTimeoutRef.current);\n },\n [],\n );\n\n // eslint-disable-next-line complexity\n useKeypress(async (key, rl) => {\n clearTimeout(searchTimeoutRef.current);\n\n if (isEnterKey(key)) {\n const selection = items.filter(isChecked);\n const isValid = await validate([...selection]);\n\n if (required && !items.some(isChecked)) {\n setError('At least one choice must be selected');\n } else if (isValid === true) {\n setStatus('done');\n done(selection.map((choice) => choice.value));\n } else {\n setError(isValid || 'You must select a valid value');\n }\n } else if (isUpKey(key) || isDownKey(key)) {\n rl.clearLine(0);\n\n if (\n loop ||\n (isUpKey(key) && active !== bounds.first) ||\n (isDownKey(key) && active !== bounds.last)\n ) {\n const offset = isUpKey(key) ? -1 : 1;\n let next = active;\n\n do {\n next = (next + offset + items.length) % items.length;\n } while (!isSelectable(items[next]));\n\n setActive(next);\n }\n } else if (isNumberKey(key)) {\n rl.clearLine(0);\n\n const position = Number(key.name) - 1;\n\n if (isSelectable(items[position])) {\n setActive(position);\n }\n } else if (isBackspaceKey(key)) {\n rl.clearLine(0);\n } else if (isSpaceKey(key)) {\n rl.clearLine(0);\n setShowHelpTip(false);\n\n const nextItems = items.map((choice, i) => (i === active ? toggle(choice) : choice));\n const selection = nextItems.filter(isChecked);\n const isValid = await validate([...selection]);\n\n if (isValid === true) {\n setError(undefined);\n setItems(nextItems);\n } else {\n setError(isValid || 'You must select a valid value');\n }\n } else {\n // Default to search\n const searchTerm = rl.line.toLowerCase();\n const matchIndex = items.findIndex((item) =>\n Separator.isSeparator(item) || !isSelectable(item)\n ? false\n : item.name.toLowerCase().startsWith(searchTerm),\n );\n\n if (matchIndex !== -1) {\n setActive(matchIndex);\n }\n\n searchTimeoutRef.current = setTimeout(() => {\n rl.clearLine(0);\n }, 700);\n }\n });\n\n const message = theme.style.message(config.message, status);\n\n let helpTipTop = '';\n let helpTipBottom = '';\n let description: string | undefined;\n\n if (\n theme.helpMode === 'always' ||\n (theme.helpMode === 'auto' && showHelpTip && (instructions === undefined || instructions))\n ) {\n if (typeof instructions === 'string') {\n helpTipTop = instructions;\n } else {\n const keys = [\n `${theme.style.key('space')} to select`,\n `${theme.style.key('enter')} to proceed`,\n ];\n\n helpTipTop = ` (Press ${keys.filter((key) => key !== '').join(', ')})`;\n }\n\n if (\n items.length > pageSize &&\n (theme.helpMode === 'always' ||\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n (theme.helpMode === 'auto' && firstRender.current))\n ) {\n helpTipBottom = `\\n${theme.style.help('(Use arrow keys to reveal more choices)')}`;\n firstRender.current = false;\n }\n }\n\n const page = usePagination({\n items,\n active,\n renderItem({ item, isActive }) {\n if (Separator.isSeparator(item)) {\n return ` ${item.separator}`;\n }\n\n if (item.disabled) {\n return theme.style.disabledChoice(\n `${item.name} ${typeof item.disabled === 'string' ? item.disabled : '(disabled)'}`,\n );\n }\n\n if (isActive) {\n description = item.description;\n }\n\n const checkbox = item.checked ? theme.icon.checked : theme.icon.unchecked;\n const color = isActive ? theme.style.highlight : (x: string) => x;\n const cursor = isActive ? theme.icon.cursor : ` `;\n\n return color(`${cursor}${checkbox} ${item.name}`);\n },\n pageSize,\n loop,\n });\n\n if (status === 'done') {\n return `${prefix} ${message} ${theme.style.answer(theme.style.renderSelectedChoices(items.filter(isChecked), items))}`;\n }\n\n const selectedChoices =\n items.filter(isChecked).length > 0\n ? ` (${theme.style.answer(theme.style.renderSelectedChoices(items.filter(isChecked), items))})`\n : '';\n const choiceDescription = description ? `\\n${theme.style.description(description)}` : ``;\n\n let error = '';\n\n if (errorMsg) {\n error = `\\n${theme.style.error(errorMsg)}`;\n }\n\n return `${prefix} ${message}${selectedChoices}${helpTipTop}\\n${page}${helpTipBottom}${choiceDescription}${error}${ansiEscapes.cursorHide}`;\n },\n);\n\nexport { Separator } from '@inquirer/core';\n","import { Separator } from '@inquirer/core';\nimport figures from '@inquirer/figures';\nimport chalk from 'chalk';\n\nimport { Choice, Item, NormalizedChoice, SelectTheme } from './types';\n\nexport const selectTheme: SelectTheme = {\n helpMode: 'auto',\n icon: {\n checked: chalk.green(figures.circleFilled),\n unchecked: figures.circle,\n cursor: figures.pointer,\n },\n style: {\n description: (text: string) => chalk.cyan(text),\n disabledChoice: (text: string) => chalk.dim(`- ${text}`),\n renderSelectedChoices: (selectedChoices) =>\n selectedChoices.map((choice) => choice.short).join(', '),\n },\n};\n\nexport const isSelectable = <Value>(item: Item<Value>): item is NormalizedChoice<Value> =>\n !Separator.isSeparator(item) && !item.disabled;\n\nexport const isChecked = <Value>(item: Item<Value>): item is NormalizedChoice<Value> =>\n isSelectable(item) && Boolean(item.checked);\n\nexport const toggle = <Value>(item: Item<Value>): Item<Value> =>\n isSelectable(item) ? { ...item, checked: !item.checked } : item;\n\nexport const normalizeChoices = <Value>(\n choices: ReadonlyArray<string | Choice<Value> | Separator>,\n): Array<Item<Value>> =>\n choices.map((choice) => {\n if (Separator.isSeparator(choice)) {\n return choice;\n }\n\n if (typeof choice === 'string') {\n return {\n checked: false,\n disabled: false,\n name: choice,\n short: choice,\n // eslint-disable-next-line @typescript-eslint/consistent-type-assertions\n value: choice as Value,\n };\n }\n\n const name = choice.name ?? String(choice.value);\n\n return {\n checked: choice.checked ?? false,\n description: choice.description,\n disabled: choice.disabled ?? false,\n name,\n short: choice.short ?? name,\n value: choice.value,\n };\n });\n","import {\n isDevelopment,\n isLinux,\n isMacOS,\n isProduction,\n isTest,\n isWindows,\n nodeVersion,\n process,\n provider,\n runtime,\n} from 'std-env';\n\nimport packageInfo from '../../package.json';\n\nconst { name, version } = packageInfo;\n\nconst getOS = () => {\n if (isWindows) return 'Windows';\n if (isMacOS) return 'macOS';\n if (isLinux) return 'Linux';\n\n return 'Unknown OS';\n};\n\nconst getEnv = () => {\n if (isDevelopment) return 'Development';\n if (isTest) return 'Test';\n if (isProduction) return 'Production';\n};\n\nconst getPlatform = () => {\n const os = getOS();\n const env = getEnv();\n\n const keysOfInterest = [\n os,\n env,\n runtime,\n provider,\n `Node ${nodeVersion}`,\n process.env.NODE_ENV,\n ].filter(Boolean);\n\n return keysOfInterest.join('; ');\n};\n\nconst detectedPlatform = getPlatform();\n\nexport const getCLIUserAgent = (platform?: string, extensions?: string): string => {\n const userAgentParts = [`${name}/${version}`];\n\n const platformValue = platform ?? detectedPlatform;\n\n userAgentParts.push(`(${platformValue})`);\n\n if (extensions) {\n userAgentParts.push(extensions);\n }\n\n return userAgentParts.join(' ');\n};\n","import { getCLIUserAgent } from './user-agent';\n\ninterface HttpsConfig {\n baseUrl: string;\n accessToken?: string;\n}\n\nexport class Https {\n private baseUrl: string;\n private accessToken?: string;\n private userAgent: string;\n\n constructor({ baseUrl, accessToken }: HttpsConfig) {\n this.baseUrl = baseUrl;\n this.accessToken = accessToken;\n this.userAgent = getCLIUserAgent();\n }\n\n async fetch(path: string, opts: RequestInit = {}) {\n const { headers = {}, ...rest } = opts;\n\n const options = {\n headers: {\n ...Object.fromEntries(new Headers(headers)),\n Accept: 'application/json',\n 'User-Agent': this.userAgent,\n ...(this.accessToken && { 'X-Auth-Token': this.accessToken }),\n },\n ...rest,\n };\n\n return fetch(`${this.baseUrl}${path}`, options);\n }\n}\n","import { Https } from './https';\n\ninterface CliApiConfig {\n origin: string;\n storeHash: string;\n accessToken: string;\n}\n\nexport class CliApi {\n private client: Https;\n\n constructor({ origin, storeHash, accessToken }: CliApiConfig) {\n this.client = new Https({\n baseUrl: `${origin}/stores/${storeHash}/cli-api/v3`,\n accessToken,\n });\n }\n\n async getChannelInit(channelId: number | string) {\n return this.client.fetch(`/channels/${channelId}/init`, {\n method: 'GET',\n });\n }\n\n async checkEligibility() {\n return this.client.fetch('/channels/catalyst/eligibility', {\n method: 'GET',\n });\n }\n\n async createChannel(\n name: string,\n storefrontLocale: string,\n additionalLocales: string[],\n installSampleData = false,\n ) {\n return this.client.fetch('/channels/catalyst', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n name,\n initialData: {\n type: installSampleData ? 'sample' : 'none',\n },\n deployStorefront: true,\n devOrigin: 'http://localhost:3000',\n storefrontLanguage: storefrontLocale,\n additionalLocales,\n }),\n });\n }\n}\n","import { execSync } from 'child_process';\n\nimport { checkoutRef } from './checkout-ref';\nimport { hasGitHubSSH } from './has-github-ssh';\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 console.log(`Cloning ${repository} using ${useSSH ? 'SSH' : 'HTTPS'}...\\n`);\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 console.log();\n\n execSync('git remote rename origin upstream', { cwd: projectDir, stdio: 'inherit' });\n console.log();\n\n if (ghRef) {\n if (resetMain) {\n // Create and checkout a new main branch\n execSync('git checkout -b main', { cwd: projectDir, stdio: 'inherit' });\n\n // Reset it to the specified ref\n resetBranchToRef(projectDir, ghRef);\n\n console.log(`Reset main to ${ghRef} successfully.\\n`);\n\n return;\n }\n\n checkoutRef(projectDir, ghRef);\n\n console.log();\n }\n};\n","import { sync as spawnSync } from 'cross-spawn';\n\nimport { isExecException } from './is-exec-exception';\n\nexport function checkoutRef(repoDir: string, ref: string): void {\n try {\n // Attempt to checkout the specified ref\n const spawn = spawnSync('git', ['checkout', ref, '--'], {\n cwd: repoDir,\n encoding: 'utf8',\n // Explicitly set shell to false to avoid shell injection\n // Don't use shell: true as it's a security risk\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 console.log(`Checked out ref ${ref} successfully.`);\n } catch (error: unknown) {\n // Handle the error safely according to ESLint rules\n if (isExecException(error)) {\n const stderr = error.stderr ? error.stderr.toString() : '';\n\n // Check if the error message indicates that the ref was not found\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 console.error(`Ref '${ref}' not found in the repository.`);\n } else {\n console.error(`Error checking out ref '${ref}':`, stderr.trim());\n }\n } else if (error instanceof Error) {\n // General error handling\n console.error(`Error checking out ref '${ref}':`, error.message);\n } else {\n // Unknown error type\n console.error(`Unknown error occurred while checking out ref '${ref}'.`);\n }\n\n console.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 // Attempt to connect to GitHub via SSH and capture the output\n const output = execSync('ssh -T git@github.com', {\n encoding: 'utf8',\n stdio: 'pipe',\n }).toString();\n\n // Check the output for successful authentication\n return output.includes('successfully authenticated');\n } catch (error: unknown) {\n // Use the type guard to check if error is an ExecException\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 // Check if the output indicates successful authentication\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 // Explicitly set shell to false to avoid shell injection\n // Don't use shell: true as it's a security risk\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 chalk from 'chalk';\nimport { installDependencies as installDeps } from 'nypm';\n\nimport { spinner } from './spinner';\n\nconst installAllDeps = async (projectDir: string) => {\n await installDeps({ cwd: projectDir, silent: true, packageManager: 'pnpm' });\n};\n\nexport const installDependencies = async (projectDir: string) =>\n spinner(installAllDeps(projectDir), {\n text: `Installing dependencies. This could take a minute...`,\n successText: `Dependencies installed successfully`,\n failText: (err) => chalk.red(`Failed to install dependencies: ${err.message}`),\n });\n","import { type Ora, oraPromise, type PromiseOptions } from 'ora';\n\nexport const spinner = async <T>(\n action: PromiseLike<T> | ((spinner: Ora) => PromiseLike<T>),\n oraOpts: PromiseOptions<T>,\n) => {\n return oraPromise(action, {\n spinner: 'triangle',\n ...oraOpts,\n }).catch(() => process.exit(1));\n};\n","import { z } from 'zod';\n\nimport { Https } from './https';\n\nconst allowedLocales = [\n 'en',\n 'da',\n 'es-AR',\n 'es-CL',\n 'es-CO',\n 'es-MX',\n 'es-PE',\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 (bc: Https) => {\n const response = await bc.fetch('/v3/settings/store/available-locales');\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 chalk from 'chalk';\nimport open from 'open';\nimport { createInterface } from 'readline';\n\nimport { Auth } from './auth';\nimport { Config } from './config';\nimport { spinner } from './spinner';\n\ninterface LoginResult {\n storeHash: string;\n accessToken: string;\n}\n\ninterface DeviceCodeCredentials {\n store_hash: string;\n access_token: string;\n}\n\nasync function pollDeviceCode(\n auth: Auth,\n deviceCode: string,\n interval: number,\n): Promise<DeviceCodeCredentials | null> {\n try {\n const credentials = await auth.checkDeviceCode(deviceCode);\n\n return credentials;\n } catch {\n await new Promise((resolve) => setTimeout(resolve, interval * 1000));\n\n return null;\n }\n}\n\nasync function waitForCredentials(\n auth: Auth,\n deviceCode: string,\n interval: number,\n): Promise<DeviceCodeCredentials> {\n const credentials = await pollDeviceCode(auth, deviceCode, interval);\n\n if (credentials) {\n return credentials;\n }\n\n return waitForCredentials(auth, deviceCode, interval);\n}\n\nasync function waitForKeyPress(prompt: string): Promise<boolean> {\n const rl = createInterface({\n input: process.stdin,\n output: process.stdout,\n });\n\n // Enable raw mode to get individual keystrokes\n process.stdin.setRawMode(true);\n process.stdin.resume();\n\n return new Promise((resolve) => {\n process.stdin.once('data', (data) => {\n // Restore normal stdin mode\n process.stdin.setRawMode(false);\n process.stdin.pause();\n rl.close();\n\n // Only proceed if Enter was pressed (13 or 10 are the ASCII codes for CR and LF)\n const shouldProceed = data[0] === 13 || data[0] === 10;\n\n // Add a newline since we're in raw mode\n process.stdout.write('\\n');\n\n resolve(shouldProceed);\n });\n\n // Display the prompt\n rl.write(prompt);\n });\n}\n\nexport async function login(baseUrl: string): Promise<LoginResult> {\n const auth = new Auth({ baseUrl });\n\n const deviceCode = await auth.getDeviceCode();\n\n console.log(\n chalk.yellow('\\n! First copy your one-time code: ') + chalk.bold(deviceCode.user_code),\n );\n console.log(`Press Enter to open ${deviceCode.verification_uri} in your browser...`);\n\n const shouldOpenUrl = await waitForKeyPress('');\n\n if (shouldOpenUrl) {\n await open(deviceCode.verification_uri);\n }\n\n const credentials = await spinner(\n () => waitForCredentials(auth, deviceCode.device_code, deviceCode.interval),\n { text: 'Waiting for authentication...', successText: 'Authentication complete' },\n );\n\n return {\n storeHash: credentials.store_hash,\n accessToken: credentials.access_token,\n };\n}\n\nexport function storeCredentials(projectDir: string, credentials: LoginResult): void {\n const config = new Config(projectDir);\n\n config.setAuth(credentials.storeHash, credentials.accessToken);\n}\n","import { z } from 'zod';\n\nimport { Https } from './https';\nimport { parse } from './parse';\n\ninterface AuthConfig {\n baseUrl: string;\n}\n\nexport class Auth {\n private client: Https;\n private readonly DEVICE_OAUTH_CLIENT_ID = 's1q4io7mah2lm1i6uwp9yl1eit80n3b';\n\n constructor({ baseUrl }: AuthConfig) {\n this.client = new Https({ baseUrl });\n }\n\n async getDeviceCode() {\n const response = await this.client.fetch('/device/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n scopes: [\n 'store_channel_settings',\n 'store_sites',\n 'store_storefront_api',\n 'store_v2_content',\n 'store_v2_information',\n 'store_v2_products',\n 'store_cart',\n ].join(' '),\n client_id: this.DEVICE_OAUTH_CLIENT_ID,\n }),\n });\n\n const DeviceCodeSchema = 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\n return parse(await response.json(), DeviceCodeSchema);\n }\n\n async checkDeviceCode(deviceCode: string) {\n const response = await this.client.fetch('/device/token', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n device_code: deviceCode,\n client_id: this.DEVICE_OAUTH_CLIENT_ID,\n }),\n });\n\n if (response.status !== 200) {\n throw new Error('Device code not yet verified');\n }\n\n const DeviceCodeSuccessSchema = z.object({\n access_token: z.string(),\n store_hash: z.string(),\n context: z.string(),\n api_uri: z.string().url(),\n });\n\n return parse(await response.json(), DeviceCodeSuccessSchema);\n }\n}\n","import * as z from 'zod';\nimport { fromZodError } from 'zod-validation-error';\n\nexport const parse = <T>(data: unknown, schema: z.Schema<T>): T => {\n try {\n return schema.parse(data);\n } catch (error) {\n if (error instanceof z.ZodError) {\n console.error(fromZodError(error).toString());\n }\n\n process.exit(1);\n }\n};\n","import { parse as parseTOML, stringify as stringifyTOML } from '@iarna/toml';\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'fs';\nimport { dirname, join } from 'path';\n\ninterface CatalystConfig {\n auth?: {\n storeHash?: string;\n accessToken?: string;\n };\n}\n\ninterface TomlRecord {\n [key: string]: string | number | boolean | TomlRecord | TomlRecord[];\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isCatalystConfig(obj: unknown): obj is CatalystConfig {\n if (!isRecord(obj)) {\n return false;\n }\n\n if ('auth' in obj) {\n if (!isRecord(obj.auth)) {\n return false;\n }\n\n const { storeHash, accessToken } = obj.auth;\n\n return (\n (storeHash === undefined || typeof storeHash === 'string') &&\n (accessToken === undefined || typeof accessToken === 'string')\n );\n }\n\n return true;\n}\n\nexport class Config {\n private configPath: string;\n private config: CatalystConfig;\n\n constructor(projectDir: string) {\n this.configPath = join(projectDir, '.catalyst');\n this.config = this.read();\n }\n\n getAuth(): { storeHash?: string; accessToken?: string } {\n return this.config.auth ?? {};\n }\n\n setAuth(storeHash: string, accessToken: string): void {\n this.config.auth = { storeHash, accessToken };\n this.save();\n }\n\n save(): void {\n const configObj: TomlRecord = {};\n\n if (this.config.auth?.storeHash && this.config.auth.accessToken) {\n configObj.auth = {\n storeHash: this.config.auth.storeHash,\n accessToken: this.config.auth.accessToken,\n };\n }\n\n const dir = dirname(this.configPath);\n\n if (!existsSync(dir)) {\n mkdirSync(dir, { recursive: true });\n }\n\n const preamble = `# DO NOT commit this file to your repository!\n# This file contains sensitive configuration specific to your local CLI setup.\n# It includes authentication tokens and store-specific information.\n# If using version control, make sure to add .catalyst to your .gitignore file.\n\n`;\n\n writeFileSync(this.configPath, preamble + stringifyTOML(configObj));\n }\n\n private read(): CatalystConfig {\n if (!existsSync(this.configPath)) {\n return {};\n }\n\n try {\n const contents = readFileSync(this.configPath, 'utf-8');\n const parsed = parseTOML(contents);\n\n if (isCatalystConfig(parsed)) {\n return parsed;\n }\n\n console.warn('Invalid config format in .catalyst file, using defaults');\n\n return {};\n } catch {\n console.warn('Failed to parse .catalyst config file, using defaults');\n\n return {};\n }\n }\n}\n","import { Analytics } from '@segment/analytics-node';\nimport Conf from 'conf';\nimport { randomBytes } from 'crypto';\n\nimport PACKAGE_INFO from '../../../package.json';\n\n// This is the key that stores whether or not telemetry is enabled or disabled.\nconst TELEMETRY_KEY_ENABLED = 'telemetry.enabled';\n\n// This is a quasi-persistent identifier used to dedupe recurring events.\nconst TELEMETRY_KEY_ID = `telemetry.anonymousId`;\n\ninterface Config {\n telemetry: {\n enabled: boolean;\n anonymousId: string;\n };\n}\n\nexport class Telemetry {\n readonly sessionId: string;\n readonly analytics: Analytics;\n\n private conf: Conf<Config> | null;\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 try {\n this.conf = new Conf({\n projectName: this.projectName,\n projectVersion: this.projectVersion,\n });\n } catch {\n this.conf = null;\n }\n\n this.sessionId = randomBytes(32).toString('hex');\n this.analytics = new Analytics({\n writeKey: process.env.CLI_SEGMENT_WRITE_KEY ?? 'not-a-valid-segment-write-key',\n });\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 sessionId: this.sessionId,\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.conf?.set(TELEMETRY_KEY_ENABLED, enabled);\n\n return this.conf?.path;\n };\n\n isEnabled(): boolean {\n return (\n !this.CATALYST_TELEMETRY_DISABLED &&\n !!this.conf &&\n this.conf.get<typeof TELEMETRY_KEY_ENABLED, boolean>(TELEMETRY_KEY_ENABLED, true)\n );\n }\n\n private getAnonymousId(): string {\n const val = this.conf?.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.conf?.set(TELEMETRY_KEY_ID, generated);\n\n return generated;\n }\n}\n","import { outputFileSync } from 'fs-extra/esm';\nimport { join } from 'path';\n\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 { Command, Option } from '@commander-js/extra-typings';\nimport { select } from '@inquirer/prompts';\nimport chalk from 'chalk';\n\nimport { CliApi } from '../utils/cli-api';\nimport { Config } from '../utils/config';\nimport { Https } from '../utils/https';\nimport { login, storeCredentials } from '../utils/login';\nimport { Telemetry } from '../utils/telemetry/telemetry';\nimport { writeEnv } from '../utils/write-env';\n\ninterface Channel {\n id: number;\n name: string;\n platform: string;\n}\n\ninterface ChannelsResponse {\n data: Channel[];\n}\n\ninterface InitResponse {\n data: {\n makeswift_dev_api_key: string;\n storefront_api_token: string;\n envVars: Record<string, string>;\n };\n}\n\nfunction isChannelsResponse(response: unknown): response is ChannelsResponse {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'data' in response &&\n Array.isArray(response.data) &&\n response.data.every(\n (item) =>\n typeof item === 'object' &&\n item !== null &&\n 'id' in item &&\n 'name' in item &&\n 'platform' in item,\n )\n );\n}\n\nfunction isInitResponse(response: unknown): response is InitResponse {\n return (\n typeof response === 'object' &&\n response !== null &&\n 'data' in response &&\n typeof response.data === 'object' &&\n response.data !== null &&\n 'storefront_api_token' in response.data &&\n 'envVars' in response.data\n );\n}\n\nconst telemetry = new Telemetry();\n\nexport const init = new Command('init')\n .description('Connect a BigCommerce store with an existing Catalyst project')\n .option('--store-hash <hash>', 'BigCommerce store hash')\n .option('--access-token <token>', 'BigCommerce access token')\n .option('--env <vars...>', 'Arbitrary environment variables to set in .env.local')\n .addOption(\n new Option('--bigcommerce-hostname <hostname>', 'BigCommerce hostname')\n .default('bigcommerce.com')\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 .action(async (options) => {\n const projectDir = process.cwd();\n\n let storeHash = options.storeHash;\n let accessToken = options.accessToken;\n\n // Check for stored credentials\n if (!storeHash || !accessToken) {\n const config = new Config(projectDir);\n const storedAuth = config.getAuth();\n\n storeHash = storeHash ?? storedAuth.storeHash;\n accessToken = accessToken ?? storedAuth.accessToken;\n }\n\n if (!storeHash || !accessToken) {\n const credentials = await login(`https://login.${options.bigcommerceHostname}`);\n\n storeHash = credentials.storeHash;\n accessToken = credentials.accessToken;\n\n // Store credentials after successful authentication\n storeCredentials(projectDir, credentials);\n }\n\n await telemetry.identify(storeHash);\n\n const bc = new Https({\n baseUrl: `https://api.${options.bigcommerceHostname}/stores/${storeHash}`,\n accessToken,\n });\n\n const cliApi = new CliApi({\n origin: options.cliApiOrigin,\n storeHash,\n accessToken,\n });\n\n const channelSortOrder = ['catalyst', 'next', 'bigcommerce'];\n const channelsResponse = await bc.fetch('/v3/channels?available=true&type=storefront');\n\n if (!channelsResponse.ok) {\n console.error(\n chalk.red(\n `\\nGET /v3/channels failed: ${channelsResponse.status} ${channelsResponse.statusText}\\n`,\n ),\n );\n process.exit(1);\n }\n\n const availableChannels: unknown = await channelsResponse.json();\n\n if (!isChannelsResponse(availableChannels)) {\n console.error(chalk.red('\\nUnexpected response format from channels endpoint\\n'));\n process.exit(1);\n }\n\n const existingChannel = await select({\n message: 'Which channel would you like to use?',\n choices: availableChannels.data\n .sort(\n (a: Channel, b: Channel) =>\n channelSortOrder.indexOf(a.platform) - channelSortOrder.indexOf(b.platform),\n )\n .map((ch: Channel) => ({\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 const channelId = existingChannel.id;\n\n // Get channel init data\n const initResponse = await cliApi.getChannelInit(channelId);\n\n if (!initResponse.ok) {\n console.error(\n chalk.red(\n `\\nGET /channels/${channelId}/init failed: ${initResponse.status} ${initResponse.statusText}\\n`,\n ),\n );\n process.exit(1);\n }\n\n const initData: unknown = await initResponse.json();\n\n if (!isInitResponse(initData)) {\n console.error(chalk.red('\\nUnexpected response format from init endpoint\\n'));\n process.exit(1);\n }\n\n const envVars = { ...initData.data.envVars };\n\n // Add any CLI-provided env vars as overrides\n if (options.env) {\n const cliEnvVars = options.env.reduce<Record<string, string>>((acc, env) => {\n const [key, value] = env.split('=');\n\n if (key && value) {\n acc[key] = value;\n }\n\n return acc;\n }, {});\n\n Object.assign(envVars, cliEnvVars);\n }\n\n writeEnv(projectDir, envVars);\n\n console.log(chalk.green(`\\n.env.local file created for channel ${existingChannel.name}!\\n`));\n console.log(chalk.green(`\\nNext steps:\\n`));\n console.log(chalk.yellow(`\\npnpm run dev\\n`));\n });\n","import { Command } from '@commander-js/extra-typings';\nimport { exec as execCb } from 'child_process';\nimport { parse } from 'dotenv';\nimport { outputFileSync, writeJsonSync } from 'fs-extra/esm';\nimport kebabCase from 'lodash.kebabcase';\nimport { coerce, compare } from 'semver';\nimport { promisify } from 'util';\nimport { z } from 'zod';\n\nconst exec = promisify(execCb);\n\nexport const ManifestSchema = z.object({\n name: z.string(),\n dependencies: z.object({ add: z.array(z.string()) }),\n devDependencies: z.object({ add: z.array(z.string()) }),\n environmentVariables: z.array(z.string()),\n});\n\ntype Manifest = z.infer<typeof ManifestSchema>;\n\nexport const integration = new Command('integration')\n .argument('<integration-name>', 'Formatted name of the integration')\n .option('--commit-hash <hash>', 'Override integration source branch with a specific commit hash')\n .action(async (integrationNameRaw, options) => {\n // @todo check for integration name conflicts\n const integrationName = z.string().transform(kebabCase).parse(integrationNameRaw);\n\n const manifest: Manifest = {\n name: integrationName,\n dependencies: { add: [] },\n devDependencies: { add: [] },\n environmentVariables: [],\n };\n\n await exec('git fetch --tags');\n\n const { stdout: headRefStdOut } = await exec('git rev-parse --abbrev-ref HEAD');\n let [sourceRef] = headRefStdOut.split('\\n');\n\n if (options.commitHash) {\n sourceRef = options.commitHash;\n }\n\n const { stdout: catalystTags } = await exec('git tag --list @bigcommerce/catalyst-core@\\\\*');\n const [latestCoreTag] = catalystTags\n .split('\\n')\n .filter(Boolean)\n .sort((a, b) => {\n const versionA = coerce(a.replace('@bigcommerce/catalyst-core@', ''));\n const versionB = coerce(b.replace('@bigcommerce/catalyst-core@', ''));\n\n if (versionA && versionB) {\n return compare(versionA, versionB);\n }\n\n return 0;\n })\n .reverse();\n\n const PackageDependenciesSchema = z.object({\n dependencies: z.object({}).passthrough(),\n devDependencies: z.object({}).passthrough(),\n });\n\n const getPackageDeps = async (ref: string) => {\n const { stdout } = await exec(`git show ${ref}:core/package.json`);\n\n return PackageDependenciesSchema.parse(JSON.parse(stdout));\n };\n\n const integrationJson = await getPackageDeps(sourceRef);\n const latestCoreTagJson = await getPackageDeps(latestCoreTag);\n\n const diffObjectKeys = (a: Record<string, unknown>, b: Record<string, unknown>) => {\n return Object.keys(a).filter((key) => !Object.keys(b).includes(key));\n };\n\n manifest.dependencies.add = diffObjectKeys(\n integrationJson.dependencies,\n latestCoreTagJson.dependencies,\n );\n manifest.devDependencies.add = diffObjectKeys(\n integrationJson.devDependencies,\n latestCoreTagJson.devDependencies,\n );\n\n const { stdout: latestCoreEnv } = await exec(`git show ${latestCoreTag}:core/.env.example`);\n const { stdout: integrationEnv } = await exec(`git show ${sourceRef}:core/.env.example`);\n\n manifest.environmentVariables = diffObjectKeys(parse(integrationEnv), parse(latestCoreEnv));\n\n const { stdout: integrationDiff } = await exec(\n `git diff ${latestCoreTag}...${sourceRef} -- ':(exclude)core/package.json' ':(exclude)pnpm-lock.yaml'`,\n );\n\n outputFileSync(`integrations/${integrationName}/integration.patch`, integrationDiff);\n writeJsonSync(`integrations/${integrationName}/manifest.json`, manifest, {\n spaces: 2,\n });\n\n console.log('Integration created successfully.');\n });\n","import { Argument, Command, Option } from '@commander-js/extra-typings';\n\nimport { catalystTelemetry, CatalystTelemetryOptions } from '../utils/telemetry';\n\nexport const telemetry = new Command('telemetry')\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: string | undefined, options: CatalystTelemetryOptions) =>\n catalystTelemetry(options, arg),\n );\n","import chalk from 'chalk';\n\nimport { Telemetry } from './telemetry';\n\nexport interface CatalystTelemetryOptions {\n enable?: boolean;\n disable?: boolean;\n}\n\nconst telemetry = new Telemetry();\nlet isEnabled = telemetry.isEnabled();\n\nconst catalystTelemetry = (options: CatalystTelemetryOptions, arg: string | undefined) => {\n if (options.enable || arg === 'enable') {\n telemetry.setEnabled(true);\n isEnabled = true;\n\n console.log('Success!');\n } else if (options.disable || arg === 'disable') {\n const path = telemetry.setEnabled(false);\n\n if (isEnabled) {\n console.log(`Your preference has been saved${path ? ` to ${path}` : ''}`);\n } else {\n console.log(`Catalyst CLI telemetry collection is already disabled.`);\n }\n\n isEnabled = false;\n } else {\n console.log('Catalyst CLI Telemetry');\n }\n\n console.log(\n `\\nStatus: ${chalk.bold(isEnabled ? chalk.green('Enabled') : chalk.red('Disabled'))}`,\n );\n\n if (!isEnabled) {\n console.log(\n `\\nYou have opted-out of Catalyst CLI telemetry.\\nNo data will be collected from your machine.`,\n );\n }\n};\n\nexport { catalystTelemetry };\n","import { Command } from '@commander-js/extra-typings';\n\nimport { Telemetry } from '../utils/telemetry/telemetry';\n\nconst telemetry = new Telemetry();\n\nconst allowlistArguments = ['--gh-ref', '--repository', '--project-name'];\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\nexport const telemetryPreHook = async (command: Command) => {\n // @ts-expect-error _name is a private property\n const availableCommands = command.commands.map((cmd) => cmd._name); // eslint-disable-line @typescript-eslint/no-unsafe-return, no-underscore-dangle\n\n const [commandName = 'create', ...args] = command.args;\n\n // When running `npm create @bigcommerce/catalyst`, the command defaults to\n // the `create` command but commander doesn't pass it as part of the arguments.\n // We need to handle this case separately.\n if (!availableCommands.includes(commandName)) {\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('create', {\n ...parseArguments(args),\n });\n }\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(args),\n });\n};\n\nexport const telemetryPostHook = async () => {\n await telemetry.analytics.closeAndFlush();\n};\n"],"mappings":"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","names":["chalk","chalk","execSync","join","Separator","name","Separator","Separator","process","process","name","execSync","spawnSync","execSync","chalk","chalk","name","chalk","z","z","z","chalk","join","isWindows","chalk","join","execSync","Command","Option","select","chalk","isChannelsResponse","isInitResponse","telemetry","Command","Option","chalk","select","Command","parse","outputFileSync","kebabCase","z","z","Command","kebabCase","parse","outputFileSync","Command","Option","chalk","telemetry","chalk","telemetry","Command","Option","telemetry","chalk","telemetry"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bigcommerce/create-catalyst",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.21.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": "bin/index.cjs",
|
|
6
6
|
"files": [
|
|
@@ -11,18 +11,23 @@
|
|
|
11
11
|
"node": ">=20.0.0"
|
|
12
12
|
},
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@commander-js/extra-typings": "^
|
|
14
|
+
"@commander-js/extra-typings": "^13.1.0",
|
|
15
15
|
"@iarna/toml": "^2.2.5",
|
|
16
|
-
"@inquirer/
|
|
17
|
-
"@
|
|
18
|
-
"
|
|
19
|
-
"
|
|
16
|
+
"@inquirer/core": "^10.1.6",
|
|
17
|
+
"@inquirer/figures": "^1.0.10",
|
|
18
|
+
"@inquirer/prompts": "^7.2.3",
|
|
19
|
+
"@inquirer/type": "^3.0.4",
|
|
20
|
+
"@segment/analytics-node": "^2.2.1",
|
|
21
|
+
"ansi-escapes": "^7.0.0",
|
|
22
|
+
"chalk": "^5.4.1",
|
|
23
|
+
"commander": "^13.1.0",
|
|
20
24
|
"conf": "^13.1.0",
|
|
25
|
+
"cross-spawn": "^7.0.6",
|
|
21
26
|
"dotenv": "^16.4.7",
|
|
22
|
-
"fs-extra": "^11.
|
|
27
|
+
"fs-extra": "^11.3.0",
|
|
23
28
|
"giget": "^1.2.3",
|
|
24
29
|
"lodash.kebabcase": "^4.1.1",
|
|
25
|
-
"nypm": "^0.
|
|
30
|
+
"nypm": "^0.5.0",
|
|
26
31
|
"open": "^10.1.0",
|
|
27
32
|
"ora": "^8.1.1",
|
|
28
33
|
"semver": "^7.6.3",
|
|
@@ -32,20 +37,21 @@
|
|
|
32
37
|
},
|
|
33
38
|
"devDependencies": {
|
|
34
39
|
"@bigcommerce/eslint-config": "^2.10.0",
|
|
35
|
-
"@swc/core": "^1.10.
|
|
40
|
+
"@swc/core": "^1.10.11",
|
|
36
41
|
"@swc/jest": "^0.2.37",
|
|
42
|
+
"@types/cross-spawn": "^6.0.6",
|
|
37
43
|
"@types/fs-extra": "^11.0.4",
|
|
38
44
|
"@types/jest": "^29.5.14",
|
|
39
45
|
"@types/lodash.kebabcase": "^4.1.9",
|
|
40
|
-
"@types/node": "^20.17.
|
|
46
|
+
"@types/node": "^20.17.16",
|
|
41
47
|
"@types/prompts": "^2.4.9",
|
|
42
48
|
"@types/semver": "^7.5.8",
|
|
43
49
|
"eslint": "^8.57.1",
|
|
44
50
|
"jest": "^29.7.0",
|
|
45
|
-
"msw": "^2.
|
|
51
|
+
"msw": "^2.7.0",
|
|
46
52
|
"prettier": "^3.4.2",
|
|
47
|
-
"tsup": "^8.3.
|
|
48
|
-
"typescript": "^5.7.
|
|
53
|
+
"tsup": "^8.3.6",
|
|
54
|
+
"typescript": "^5.7.3",
|
|
49
55
|
"@bigcommerce/eslint-config-catalyst": "^0.1.3"
|
|
50
56
|
},
|
|
51
57
|
"scripts": {
|