@bigcommerce/create-catalyst 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bin/index.cjs CHANGED
@@ -1,12 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
 
3
3
  const semver = require('semver');
4
+ const { CATALYST_REQUIRED_NODE_VERSIONS } = require('./supported-node-versions.cjs');
4
5
 
5
- /**
6
- * Discourage use of odd-numbered versions of Node.js
7
- * @see https://nodejs.org/en/about/previous-releases#nodejs-releases
8
- */
9
- const catalystRequiredNodeVersions = ['^20', '^22'];
6
+ const catalystRequiredNodeVersions = CATALYST_REQUIRED_NODE_VERSIONS;
10
7
  const userNodeVersion = process.version;
11
8
 
12
9
  if (!catalystRequiredNodeVersions.some((version) => semver.satisfies(userNodeVersion, version))) {
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Supported Node.js version ranges for Catalyst.
3
+ * Odd-numbered versions are discouraged per the Node.js release policy.
4
+ * @see https://nodejs.org/en/about/previous-releases#nodejs-releases
5
+ */
6
+ const CATALYST_REQUIRED_NODE_VERSIONS = ['^24'];
7
+
8
+ module.exports = { CATALYST_REQUIRED_NODE_VERSIONS };
package/dist/index.js CHANGED
@@ -53,12 +53,17 @@ var __async = (__this, __arguments, generator) => {
53
53
 
54
54
  // src/index.ts
55
55
  import { program } from "@commander-js/extra-typings";
56
- import chalk7 from "chalk";
56
+ import { colorize as colorize7 } from "consola/utils";
57
57
 
58
58
  // package.json
59
59
  var package_default = {
60
60
  name: "@bigcommerce/create-catalyst",
61
- version: "1.0.0",
61
+ version: "1.0.2",
62
+ repository: {
63
+ type: "git",
64
+ url: "https://github.com/bigcommerce/catalyst",
65
+ directory: "packages/create-catalyst"
66
+ },
62
67
  type: "module",
63
68
  bin: "bin/index.cjs",
64
69
  files: [
@@ -73,7 +78,7 @@ var package_default = {
73
78
  build: "tsup"
74
79
  },
75
80
  engines: {
76
- node: "^20.0.0 || ^22.0.0"
81
+ node: "^24.0.0"
77
82
  },
78
83
  dependencies: {
79
84
  "@commander-js/extra-typings": "^14.0.0",
@@ -84,9 +89,9 @@ var package_default = {
84
89
  "@inquirer/type": "^3.0.7",
85
90
  "@segment/analytics-node": "^2.2.1",
86
91
  "ansi-escapes": "^7.0.0",
87
- chalk: "^5.4.1",
88
92
  commander: "^14.0.0",
89
93
  conf: "^13.1.0",
94
+ consola: "^3.4.2",
90
95
  "cross-spawn": "^7.0.6",
91
96
  dotenv: "^16.5.0",
92
97
  "fs-extra": "^11.3.0",
@@ -124,8 +129,8 @@ var package_default = {
124
129
  // src/commands/create.ts
125
130
  import { Command, Option } from "@commander-js/extra-typings";
126
131
  import { input, select } from "@inquirer/prompts";
127
- import chalk4 from "chalk";
128
132
  import { execSync as execSync3 } from "child_process";
133
+ import { colorize as colorize4 } from "consola/utils";
129
134
  import { pathExistsSync } from "fs-extra/esm";
130
135
  import kebabCase from "lodash.kebabcase";
131
136
  import { join as join3 } from "path";
@@ -155,17 +160,17 @@ import ansiEscapes from "ansi-escapes";
155
160
  // src/prompts/multi-select/helpers.ts
156
161
  import { Separator } from "@inquirer/core";
157
162
  import figures from "@inquirer/figures";
158
- import chalk from "chalk";
163
+ import { colorize } from "consola/utils";
159
164
  var selectTheme = {
160
165
  helpMode: "auto",
161
166
  icon: {
162
- checked: chalk.green(figures.circleFilled),
167
+ checked: colorize("green", figures.circleFilled),
163
168
  unchecked: figures.circle,
164
169
  cursor: figures.pointer
165
170
  },
166
171
  style: {
167
- description: (text) => chalk.cyan(text),
168
- disabledChoice: (text) => chalk.dim(`- ${text}`),
172
+ description: (text) => colorize("cyan", text),
173
+ disabledChoice: (text) => colorize("dim", `- ${text}`),
169
174
  renderSelectedChoices: (selectedChoices) => selectedChoices.map((choice) => choice.short).join(", ")
170
175
  }
171
176
  };
@@ -569,7 +574,7 @@ var cloneCatalyst = ({
569
574
  };
570
575
 
571
576
  // src/utils/install-dependencies.ts
572
- import chalk2 from "chalk";
577
+ import { colorize as colorize2 } from "consola/utils";
573
578
  import { installDependencies as installDeps } from "nypm";
574
579
 
575
580
  // src/utils/spinner.ts
@@ -588,7 +593,7 @@ var installDependencies = (projectDir) => __async(null, null, function* () {
588
593
  return spinner(installAllDeps(projectDir), {
589
594
  text: `Installing dependencies. This could take a minute...`,
590
595
  successText: `Dependencies installed successfully`,
591
- failText: (err) => chalk2.red(`Failed to install dependencies: ${err.message}`)
596
+ failText: (err) => colorize2("red", `Failed to install dependencies: ${err.message}`)
592
597
  });
593
598
  });
594
599
 
@@ -636,7 +641,7 @@ var getAvailableLocales = (bc) => __async(null, null, function* () {
636
641
  });
637
642
 
638
643
  // src/utils/login.ts
639
- import chalk3 from "chalk";
644
+ import { colorize as colorize3 } from "consola/utils";
640
645
  import open from "open";
641
646
  import { createInterface } from "readline";
642
647
 
@@ -835,7 +840,7 @@ function login(baseUrl) {
835
840
  const auth = new Auth({ baseUrl });
836
841
  const deviceCode = yield auth.getDeviceCode();
837
842
  console.log(
838
- chalk3.yellow("\n! First copy your one-time code: ") + chalk3.bold(deviceCode.user_code)
843
+ colorize3("yellow", "\n! First copy your one-time code: ") + colorize3("bold", deviceCode.user_code)
839
844
  );
840
845
  console.log(`Press Enter to open ${deviceCode.verification_uri} in your browser...`);
841
846
  const shouldOpenUrl = yield waitForKeyPress("");
@@ -969,7 +974,7 @@ function handleChannelCreation(bc, cliApi) {
969
974
  availableLocales = yield getAvailableLocales(bc);
970
975
  } catch (error) {
971
976
  if (error instanceof Error) {
972
- console.error(chalk4.red(error.message));
977
+ console.error(colorize4("red", error.message));
973
978
  }
974
979
  process.exit(1);
975
980
  }
@@ -979,7 +984,7 @@ function handleChannelCreation(bc, cliApi) {
979
984
  choices: availableLocales,
980
985
  theme: {
981
986
  style: {
982
- help: () => chalk4.dim("(Select locale from the list or start typing the name)")
987
+ help: () => colorize4("dim", "(Select locale from the list or start typing the name)")
983
988
  }
984
989
  }
985
990
  });
@@ -997,7 +1002,7 @@ function handleChannelCreation(bc, cliApi) {
997
1002
  message: "Which additional languages would you like to add to your channel?",
998
1003
  theme: {
999
1004
  style: {
1000
- help: () => chalk4.dim("(Select locale from the list or start typing the name)")
1005
+ help: () => colorize4("dim", "(Select locale from the list or start typing the name)")
1001
1006
  }
1002
1007
  },
1003
1008
  validate: (selections) => {
@@ -1023,15 +1028,18 @@ function handleChannelCreation(bc, cliApi) {
1023
1028
  );
1024
1029
  if (!response.ok) {
1025
1030
  console.error(
1026
- chalk4.red(`
1031
+ colorize4(
1032
+ "red",
1033
+ `
1027
1034
  POST /channels/catalyst failed: ${response.status} ${response.statusText}
1028
- `)
1035
+ `
1036
+ )
1029
1037
  );
1030
1038
  process.exit(1);
1031
1039
  }
1032
1040
  const channelData = yield response.json();
1033
1041
  if (!isCreateChannelResponse(channelData)) {
1034
- console.error(chalk4.red("\nUnexpected response format from create channel endpoint\n"));
1042
+ console.error(colorize4("red", "\nUnexpected response format from create channel endpoint\n"));
1035
1043
  process.exit(1);
1036
1044
  }
1037
1045
  return {
@@ -1047,7 +1055,8 @@ function handleChannelSelection(bc) {
1047
1055
  const channelsResponse = yield bc.fetch("/v3/channels?available=true&type=storefront");
1048
1056
  if (!channelsResponse.ok) {
1049
1057
  console.error(
1050
- chalk4.red(
1058
+ colorize4(
1059
+ "red",
1051
1060
  `
1052
1061
  GET /v3/channels failed: ${channelsResponse.status} ${channelsResponse.statusText}
1053
1062
  `
@@ -1057,7 +1066,7 @@ GET /v3/channels failed: ${channelsResponse.status} ${channelsResponse.statusTex
1057
1066
  }
1058
1067
  const availableChannels = yield channelsResponse.json();
1059
1068
  if (!isChannelsResponse(availableChannels)) {
1060
- console.error(chalk4.red("\nUnexpected response format from channels endpoint\n"));
1069
+ console.error(colorize4("red", "\nUnexpected response format from channels endpoint\n"));
1061
1070
  process.exit(1);
1062
1071
  }
1063
1072
  const existingChannel = yield select({
@@ -1085,7 +1094,8 @@ function getChannelInit(cliApi, channelId) {
1085
1094
  const initResponse = yield cliApi.getChannelInit(channelId);
1086
1095
  if (!initResponse.ok) {
1087
1096
  console.error(
1088
- chalk4.red(
1097
+ colorize4(
1098
+ "red",
1089
1099
  `
1090
1100
  GET /channels/${channelId}/init failed: ${initResponse.status} ${initResponse.statusText}
1091
1101
  `
@@ -1095,7 +1105,7 @@ GET /channels/${channelId}/init failed: ${initResponse.status} ${initResponse.st
1095
1105
  }
1096
1106
  const initData = yield initResponse.json();
1097
1107
  if (!isInitResponse(initData)) {
1098
- console.error(chalk4.red("\nUnexpected response format from init endpoint\n"));
1108
+ console.error(colorize4("red", "\nUnexpected response format from init endpoint\n"));
1099
1109
  process.exit(1);
1100
1110
  }
1101
1111
  return {
@@ -1108,7 +1118,7 @@ function setupProject(options) {
1108
1118
  return __async(this, null, function* () {
1109
1119
  let { projectName, projectDir } = options;
1110
1120
  if (!pathExistsSync(projectDir)) {
1111
- console.error(chalk4.red(`Error: --projectDir ${projectDir} is not a valid path
1121
+ console.error(colorize4("red", `Error: --projectDir ${projectDir} is not a valid path
1112
1122
  `));
1113
1123
  process.exit(1);
1114
1124
  }
@@ -1116,7 +1126,7 @@ function setupProject(options) {
1116
1126
  projectName = kebabCase(projectName);
1117
1127
  projectDir = join3(options.projectDir, projectName);
1118
1128
  if (pathExistsSync(projectDir)) {
1119
- console.error(chalk4.red(`Error: ${projectDir} already exists
1129
+ console.error(colorize4("red", `Error: ${projectDir} already exists
1120
1130
  `));
1121
1131
  process.exit(1);
1122
1132
  }
@@ -1146,14 +1156,14 @@ function checkRequiredTools() {
1146
1156
  try {
1147
1157
  execSync3(getPlatformCheckCommand("git"), { stdio: "ignore" });
1148
1158
  } catch (e) {
1149
- console.error(chalk4.red("Error: git is required to create a Catalyst project\n"));
1159
+ console.error(colorize4("red", "Error: git is required to create a Catalyst project\n"));
1150
1160
  process.exit(1);
1151
1161
  }
1152
1162
  try {
1153
1163
  execSync3(getPlatformCheckCommand("pnpm"), { stdio: "ignore" });
1154
1164
  } catch (e) {
1155
- console.error(chalk4.red("Error: pnpm is required to create a Catalyst project\n"));
1156
- console.error(chalk4.yellow("Tip: Enable it by running `corepack enable pnpm`\n"));
1165
+ console.error(colorize4("red", "Error: pnpm is required to create a Catalyst project\n"));
1166
+ console.error("Tip: Enable it by running `corepack enable pnpm`\n");
1157
1167
  process.exit(1);
1158
1168
  }
1159
1169
  }
@@ -1210,18 +1220,21 @@ Creating '${projectName}' at '${projectDir}'
1210
1220
  writeEnv(projectDir, envVars);
1211
1221
  console.log(
1212
1222
  [
1213
- `
1214
- ${chalk4.green("Success!")} Created '${projectName}' at '${projectDir}'
1215
- `,
1223
+ colorize4("green", `
1224
+ Success! Created '${projectName}' at '${projectDir}'
1225
+ `),
1216
1226
  `Next steps:`,
1217
- Object.keys(envVars).length > 0 ? chalk4.yellow(`
1227
+ Object.keys(envVars).length > 0 ? colorize4("yellow", `
1218
1228
  - cd ${projectName} && pnpm run dev
1219
1229
  `) : [
1220
- chalk4.yellow(`
1230
+ colorize4("yellow", `
1221
1231
  - cd ${projectName} && cp .env.example .env.local`),
1222
- chalk4.yellow(`
1232
+ colorize4(
1233
+ "yellow",
1234
+ `
1223
1235
  - Populate .env.local with your BigCommerce API credentials
1224
- `)
1236
+ `
1237
+ )
1225
1238
  ].join("")
1226
1239
  ].join("\n")
1227
1240
  );
@@ -1246,7 +1259,8 @@ ${chalk4.green("Success!")} Created '${projectName}' at '${projectDir}'
1246
1259
  const eligibilityResponse = yield cliApi.checkEligibility();
1247
1260
  if (!eligibilityResponse.ok) {
1248
1261
  console.error(
1249
- chalk4.red(
1262
+ colorize4(
1263
+ "red",
1250
1264
  `
1251
1265
  GET /channels/catalyst/eligibility failed: ${eligibilityResponse.status} ${eligibilityResponse.statusText}
1252
1266
  `
@@ -1256,11 +1270,13 @@ GET /channels/catalyst/eligibility failed: ${eligibilityResponse.status} ${eligi
1256
1270
  }
1257
1271
  const eligibilityData = yield eligibilityResponse.json();
1258
1272
  if (!isEligibilityResponse(eligibilityData)) {
1259
- console.error(chalk4.red("\nUnexpected response format from eligibility endpoint\n"));
1273
+ console.error(
1274
+ colorize4("red", "\nUnexpected response format from eligibility endpoint\n")
1275
+ );
1260
1276
  process.exit(1);
1261
1277
  }
1262
1278
  if (!eligibilityData.data.eligible) {
1263
- console.warn(chalk4.yellow(eligibilityData.data.message));
1279
+ console.warn(colorize4("yellow", eligibilityData.data.message));
1264
1280
  }
1265
1281
  let shouldCreateChannel;
1266
1282
  if (eligibilityData.data.eligible) {
@@ -1277,9 +1293,10 @@ GET /channels/catalyst/eligibility failed: ${eligibilityResponse.status} ${eligi
1277
1293
  channelId = channelData.channelId;
1278
1294
  storefrontToken = channelData.storefrontToken;
1279
1295
  envVars = __spreadValues({}, channelData.envVars);
1280
- console.log(chalk4.green(`Channel created successfully`));
1296
+ console.log(colorize4("green", `Channel created successfully`));
1281
1297
  console.warn(
1282
- chalk4.yellow(
1298
+ colorize4(
1299
+ "yellow",
1283
1300
  "\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."
1284
1301
  )
1285
1302
  );
@@ -1324,11 +1341,11 @@ Creating '${projectName}' at '${projectDir}'
1324
1341
  storeCredentials(projectDir, credentials);
1325
1342
  }
1326
1343
  console.log(
1327
- `
1328
- ${chalk4.green("Success!")} Created '${projectName}' at '${projectDir}'
1329
- `,
1344
+ colorize4("green", `
1345
+ Success! Created '${projectName}' at '${projectDir}'
1346
+ `),
1330
1347
  "\nNext steps:\n",
1331
- chalk4.yellow(`
1348
+ colorize4("yellow", `
1332
1349
  cd ${projectName} && pnpm run dev
1333
1350
  `)
1334
1351
  );
@@ -1351,7 +1368,7 @@ function isChannelsResponse(response) {
1351
1368
  // src/commands/init.ts
1352
1369
  import { Command as Command2, Option as Option2 } from "@commander-js/extra-typings";
1353
1370
  import { select as select2 } from "@inquirer/prompts";
1354
- import chalk5 from "chalk";
1371
+ import { colorize as colorize5 } from "consola/utils";
1355
1372
  function isChannelsResponse2(response) {
1356
1373
  return typeof response === "object" && response !== null && "data" in response && Array.isArray(response.data) && response.data.every(
1357
1374
  (item) => typeof item === "object" && item !== null && "id" in item && "name" in item && "platform" in item
@@ -1395,7 +1412,8 @@ var init = new Command2("init").description("Connect a BigCommerce store with an
1395
1412
  const channelsResponse = yield bc.fetch("/v3/channels?available=true&type=storefront");
1396
1413
  if (!channelsResponse.ok) {
1397
1414
  console.error(
1398
- chalk5.red(
1415
+ colorize5(
1416
+ "red",
1399
1417
  `
1400
1418
  GET /v3/channels failed: ${channelsResponse.status} ${channelsResponse.statusText}
1401
1419
  `
@@ -1405,7 +1423,7 @@ GET /v3/channels failed: ${channelsResponse.status} ${channelsResponse.statusTex
1405
1423
  }
1406
1424
  const availableChannels = yield channelsResponse.json();
1407
1425
  if (!isChannelsResponse2(availableChannels)) {
1408
- console.error(chalk5.red("\nUnexpected response format from channels endpoint\n"));
1426
+ console.error(colorize5("red", "\nUnexpected response format from channels endpoint\n"));
1409
1427
  process.exit(1);
1410
1428
  }
1411
1429
  const existingChannel = yield select2({
@@ -1422,7 +1440,8 @@ GET /v3/channels failed: ${channelsResponse.status} ${channelsResponse.statusTex
1422
1440
  const initResponse = yield cliApi.getChannelInit(channelId);
1423
1441
  if (!initResponse.ok) {
1424
1442
  console.error(
1425
- chalk5.red(
1443
+ colorize5(
1444
+ "red",
1426
1445
  `
1427
1446
  GET /channels/${channelId}/init failed: ${initResponse.status} ${initResponse.statusText}
1428
1447
  `
@@ -1432,7 +1451,7 @@ GET /channels/${channelId}/init failed: ${initResponse.status} ${initResponse.st
1432
1451
  }
1433
1452
  const initData = yield initResponse.json();
1434
1453
  if (!isInitResponse2(initData)) {
1435
- console.error(chalk5.red("\nUnexpected response format from init endpoint\n"));
1454
+ console.error(colorize5("red", "\nUnexpected response format from init endpoint\n"));
1436
1455
  process.exit(1);
1437
1456
  }
1438
1457
  const envVars = __spreadValues({}, initData.data.envVars);
@@ -1447,13 +1466,15 @@ GET /channels/${channelId}/init failed: ${initResponse.status} ${initResponse.st
1447
1466
  Object.assign(envVars, cliEnvVars);
1448
1467
  }
1449
1468
  writeEnv(projectDir, envVars);
1450
- console.log(chalk5.green(`
1469
+ console.log(
1470
+ colorize5("green", `
1451
1471
  .env.local file created for channel ${existingChannel.name}!
1452
- `));
1453
- console.log(chalk5.green(`
1472
+ `)
1473
+ );
1474
+ console.log(colorize5("green", `
1454
1475
  Next steps:
1455
1476
  `));
1456
- console.log(chalk5.yellow(`
1477
+ console.log(colorize5("yellow", `
1457
1478
  pnpm run dev
1458
1479
  `));
1459
1480
  }));
@@ -1535,7 +1556,7 @@ var integration = new Command3("integration").argument("<integration-name>", "Fo
1535
1556
  import { Argument, Command as Command4, Option as Option3 } from "@commander-js/extra-typings";
1536
1557
 
1537
1558
  // src/utils/telemetry/index.ts
1538
- import chalk6 from "chalk";
1559
+ import { colorize as colorize6 } from "consola/utils";
1539
1560
  var telemetry3 = new Telemetry();
1540
1561
  var isEnabled = telemetry3.isEnabled();
1541
1562
  var catalystTelemetry = (options, arg) => {
@@ -1556,7 +1577,7 @@ var catalystTelemetry = (options, arg) => {
1556
1577
  }
1557
1578
  console.log(
1558
1579
  `
1559
- Status: ${chalk6.bold(isEnabled ? chalk6.green("Enabled") : chalk6.red("Disabled"))}`
1580
+ Status: ${colorize6("bold", isEnabled ? colorize6("green", "Enabled") : colorize6("red", "Disabled"))}`
1560
1581
  );
1561
1582
  if (!isEnabled) {
1562
1583
  console.log(
@@ -1609,7 +1630,7 @@ var telemetryPostHook = () => __async(null, null, function* () {
1609
1630
  });
1610
1631
 
1611
1632
  // src/index.ts
1612
- console.log(chalk7.cyanBright(`
1633
+ console.log(colorize7("cyanBright", `
1613
1634
  \u25E2 ${package_default.name} v${package_default.version}
1614
1635
  `));
1615
1636
  program.name(package_default.name).version(package_default.version).description("A command line tool to create a new Catalyst project.").addCommand(create, { isDefault: true }).addCommand(init).addCommand(integration).addCommand(telemetry4).hook("preAction", telemetryPreHook).hook("postAction", telemetryPostHook);
package/dist/index.js.map CHANGED
@@ -1 +1 @@
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\": \"1.0.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 || ^22.0.0\"\n },\n \"dependencies\": {\n \"@commander-js/extra-typings\": \"^14.0.0\",\n \"@iarna/toml\": \"^2.2.5\",\n \"@inquirer/core\": \"^10.1.13\",\n \"@inquirer/figures\": \"^1.0.12\",\n \"@inquirer/prompts\": \"^7.5.3\",\n \"@inquirer/type\": \"^3.0.7\",\n \"@segment/analytics-node\": \"^2.2.1\",\n \"ansi-escapes\": \"^7.0.0\",\n \"chalk\": \"^5.4.1\",\n \"commander\": \"^14.0.0\",\n \"conf\": \"^13.1.0\",\n \"cross-spawn\": \"^7.0.6\",\n \"dotenv\": \"^16.5.0\",\n \"fs-extra\": \"^11.3.0\",\n \"giget\": \"^1.2.5\",\n \"lodash.kebabcase\": \"^4.1.1\",\n \"nypm\": \"^0.5.4\",\n \"open\": \"^10.1.2\",\n \"ora\": \"^8.2.0\",\n \"semver\": \"^7.7.2\",\n \"std-env\": \"^3.9.0\",\n \"zod\": \"^3.25.51\",\n \"zod-validation-error\": \"^3.4.1\"\n },\n \"devDependencies\": {\n \"@bigcommerce/eslint-config\": \"^2.11.0\",\n \"@bigcommerce/eslint-config-catalyst\": \"workspace:^\",\n \"@swc/core\": \"^1.11.31\",\n \"@swc/jest\": \"^0.2.38\",\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\": \"^22.15.30\",\n \"@types/prompts\": \"^2.4.9\",\n \"@types/semver\": \"^7.7.0\",\n \"eslint\": \"^8.57.1\",\n \"jest\": \"^29.7.0\",\n \"msw\": \"^2.9.0\",\n \"prettier\": \"^3.6.2\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.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-419',\n 'es',\n 'it',\n 'nl',\n 'pl',\n 'pt',\n 'de',\n 'fr',\n 'ja',\n 'no',\n 'pt-BR',\n 'sv',\n];\n\nconst AvailableLocalesSuccessSchema = z.object({\n data: z.array(\n z.object({\n id: z.string(),\n name: z.string(),\n fallback: z.string().nullable(),\n is_supported: z.boolean(),\n }),\n ),\n});\n\nexport const getAvailableLocales = async (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"]}
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 { colorize } from 'consola/utils';\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(colorize('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\": \"1.0.2\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/bigcommerce/catalyst\",\n \"directory\": \"packages/create-catalyst\"\n },\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\": \"^24.0.0\"\n },\n \"dependencies\": {\n \"@commander-js/extra-typings\": \"^14.0.0\",\n \"@iarna/toml\": \"^2.2.5\",\n \"@inquirer/core\": \"^10.1.13\",\n \"@inquirer/figures\": \"^1.0.12\",\n \"@inquirer/prompts\": \"^7.5.3\",\n \"@inquirer/type\": \"^3.0.7\",\n \"@segment/analytics-node\": \"^2.2.1\",\n \"ansi-escapes\": \"^7.0.0\",\n \"commander\": \"^14.0.0\",\n \"conf\": \"^13.1.0\",\n \"consola\": \"^3.4.2\",\n \"cross-spawn\": \"^7.0.6\",\n \"dotenv\": \"^16.5.0\",\n \"fs-extra\": \"^11.3.0\",\n \"giget\": \"^1.2.5\",\n \"lodash.kebabcase\": \"^4.1.1\",\n \"nypm\": \"^0.5.4\",\n \"open\": \"^10.1.2\",\n \"ora\": \"^8.2.0\",\n \"semver\": \"^7.7.2\",\n \"std-env\": \"^3.9.0\",\n \"zod\": \"^3.25.51\",\n \"zod-validation-error\": \"^3.4.1\"\n },\n \"devDependencies\": {\n \"@bigcommerce/eslint-config\": \"^2.11.0\",\n \"@bigcommerce/eslint-config-catalyst\": \"workspace:^\",\n \"@swc/core\": \"^1.11.31\",\n \"@swc/jest\": \"^0.2.38\",\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\": \"^22.15.30\",\n \"@types/prompts\": \"^2.4.9\",\n \"@types/semver\": \"^7.7.0\",\n \"eslint\": \"^8.57.1\",\n \"jest\": \"^29.7.0\",\n \"msw\": \"^2.9.0\",\n \"prettier\": \"^3.6.2\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\"\n }\n}\n","import { Command, Option } from '@commander-js/extra-typings';\nimport { input, select } from '@inquirer/prompts';\nimport { execSync } from 'child_process';\nimport { colorize } from 'consola/utils';\nimport { pathExistsSync } from 'fs-extra/esm';\nimport kebabCase from 'lodash.kebabcase';\nimport { join } from 'path';\n\nimport { 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(colorize('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: () => colorize('dim', '(Select locale from the list or start typing the name)'),\n },\n },\n });\n\n const shouldAddAdditionalLocales = await select({\n message: 'Would you like to add additional languages?',\n choices: [\n { name: 'Yes', value: true },\n { name: 'No', value: false },\n ],\n });\n\n let additionalLocales: string[] = [];\n\n if (shouldAddAdditionalLocales) {\n 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: () => colorize('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 colorize(\n 'red',\n `\\nPOST /channels/catalyst failed: ${response.status} ${response.statusText}\\n`,\n ),\n );\n process.exit(1);\n }\n\n const channelData: unknown = await response.json();\n\n if (!isCreateChannelResponse(channelData)) {\n console.error(colorize('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 colorize(\n '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(colorize('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 colorize(\n '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(colorize('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(colorize('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(colorize('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(colorize('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(colorize('red', 'Error: pnpm is required to create a Catalyst project\\n'));\n console.error('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 colorize('green', `\\nSuccess! Created '${projectName}' at '${projectDir}'\\n`),\n `Next steps:`,\n Object.keys(envVars).length > 0\n ? colorize('yellow', `\\n- cd ${projectName} && pnpm run dev\\n`)\n : [\n colorize('yellow', `\\n- cd ${projectName} && cp .env.example .env.local`),\n colorize(\n 'yellow',\n `\\n- Populate .env.local with your BigCommerce API credentials\\n`,\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 colorize(\n '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(\n colorize('red', '\\nUnexpected response format from eligibility endpoint\\n'),\n );\n process.exit(1);\n }\n\n if (!eligibilityData.data.eligible) {\n console.warn(colorize('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(colorize('green', `Channel created successfully`));\n console.warn(\n colorize(\n '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 colorize('green', `\\nSuccess! Created '${projectName}' at '${projectDir}'\\n`),\n '\\nNext steps:\\n',\n colorize('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 { colorize } from 'consola/utils';\n\nimport { Choice, Item, NormalizedChoice, SelectTheme } from './types';\n\nexport const selectTheme: SelectTheme = {\n helpMode: 'auto',\n icon: {\n checked: colorize('green', figures.circleFilled),\n unchecked: figures.circle,\n cursor: figures.pointer,\n },\n style: {\n description: (text: string) => colorize('cyan', text),\n disabledChoice: (text: string) => colorize('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 { colorize } from 'consola/utils';\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) => colorize('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-419',\n 'es',\n 'it',\n 'nl',\n 'pl',\n 'pt',\n 'de',\n 'fr',\n 'ja',\n 'no',\n 'pt-BR',\n 'sv',\n];\n\nconst AvailableLocalesSuccessSchema = z.object({\n data: z.array(\n z.object({\n id: z.string(),\n name: z.string(),\n fallback: z.string().nullable(),\n is_supported: z.boolean(),\n }),\n ),\n});\n\nexport const getAvailableLocales = async (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 { colorize } from 'consola/utils';\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 colorize('yellow', '\\n! First copy your one-time code: ') +\n colorize('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 { colorize } from 'consola/utils';\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 colorize(\n '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(colorize('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 colorize(\n '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(colorize('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(\n colorize('green', `\\n.env.local file created for channel ${existingChannel.name}!\\n`),\n );\n console.log(colorize('green', `\\nNext steps:\\n`));\n console.log(colorize('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 { colorize } from 'consola/utils';\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: ${colorize('bold', isEnabled ? colorize('green', 'Enabled') : colorize('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":["colorize","execSync","colorize","join","Separator","name","Separator","Separator","process","process","name","execSync","spawnSync","execSync","colorize","colorize","name","colorize","z","z","z","colorize","join","isWindows","colorize","join","execSync","Command","Option","select","colorize","isChannelsResponse","isInitResponse","telemetry","Command","Option","colorize","select","Command","parse","outputFileSync","kebabCase","z","z","Command","kebabCase","parse","outputFileSync","Command","Option","colorize","telemetry","colorize","telemetry","Command","Option","telemetry","colorize","telemetry"]}
package/package.json CHANGED
@@ -1,6 +1,11 @@
1
1
  {
2
2
  "name": "@bigcommerce/create-catalyst",
3
- "version": "1.0.1",
3
+ "version": "1.0.2",
4
+ "repository": {
5
+ "type": "git",
6
+ "url": "https://github.com/bigcommerce/catalyst",
7
+ "directory": "packages/create-catalyst"
8
+ },
4
9
  "type": "module",
5
10
  "bin": "bin/index.cjs",
6
11
  "files": [
@@ -8,7 +13,7 @@
8
13
  "dist"
9
14
  ],
10
15
  "engines": {
11
- "node": "^20.0.0 || ^22.0.0"
16
+ "node": "^24.0.0"
12
17
  },
13
18
  "dependencies": {
14
19
  "@commander-js/extra-typings": "^14.0.0",