@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 +2 -5
- package/bin/supported-node-versions.cjs +8 -0
- package/dist/index.js +77 -56
- package/dist/index.js.map +1 -1
- package/package.json +7 -2
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
|
|
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.
|
|
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: "^
|
|
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
|
|
163
|
+
import { colorize } from "consola/utils";
|
|
159
164
|
var selectTheme = {
|
|
160
165
|
helpMode: "auto",
|
|
161
166
|
icon: {
|
|
162
|
-
checked:
|
|
167
|
+
checked: colorize("green", figures.circleFilled),
|
|
163
168
|
unchecked: figures.circle,
|
|
164
169
|
cursor: figures.pointer
|
|
165
170
|
},
|
|
166
171
|
style: {
|
|
167
|
-
description: (text) =>
|
|
168
|
-
disabledChoice: (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
|
|
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) =>
|
|
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
|
|
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
|
-
|
|
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(
|
|
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: () =>
|
|
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: () =>
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
1156
|
-
console.error(
|
|
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
|
-
|
|
1215
|
-
|
|
1223
|
+
colorize4("green", `
|
|
1224
|
+
Success! Created '${projectName}' at '${projectDir}'
|
|
1225
|
+
`),
|
|
1216
1226
|
`Next steps:`,
|
|
1217
|
-
Object.keys(envVars).length > 0 ?
|
|
1227
|
+
Object.keys(envVars).length > 0 ? colorize4("yellow", `
|
|
1218
1228
|
- cd ${projectName} && pnpm run dev
|
|
1219
1229
|
`) : [
|
|
1220
|
-
|
|
1230
|
+
colorize4("yellow", `
|
|
1221
1231
|
- cd ${projectName} && cp .env.example .env.local`),
|
|
1222
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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(
|
|
1296
|
+
console.log(colorize4("green", `Channel created successfully`));
|
|
1281
1297
|
console.warn(
|
|
1282
|
-
|
|
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
|
-
|
|
1329
|
-
|
|
1344
|
+
colorize4("green", `
|
|
1345
|
+
Success! Created '${projectName}' at '${projectDir}'
|
|
1346
|
+
`),
|
|
1330
1347
|
"\nNext steps:\n",
|
|
1331
|
-
|
|
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
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
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(
|
|
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(
|
|
1469
|
+
console.log(
|
|
1470
|
+
colorize5("green", `
|
|
1451
1471
|
.env.local file created for channel ${existingChannel.name}!
|
|
1452
|
-
`)
|
|
1453
|
-
|
|
1472
|
+
`)
|
|
1473
|
+
);
|
|
1474
|
+
console.log(colorize5("green", `
|
|
1454
1475
|
Next steps:
|
|
1455
1476
|
`));
|
|
1456
|
-
console.log(
|
|
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
|
|
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: ${
|
|
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(
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,eAAe;AACxB,SAAS,YAAAA,iBAAgB;;;ACHzB;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,WAAa;AAAA,EACf;AAAA,EACA,MAAQ;AAAA,EACR,KAAO;AAAA,EACP,OAAS;AAAA,IACP;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,KAAO;AAAA,IACP,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,EACX;AAAA,EACA,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,cAAgB;AAAA,IACd,+BAA+B;AAAA,IAC/B,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,qBAAqB;AAAA,IACrB,kBAAkB;AAAA,IAClB,2BAA2B;AAAA,IAC3B,gBAAgB;AAAA,IAChB,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,eAAe;AAAA,IACf,QAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAS;AAAA,IACT,oBAAoB;AAAA,IACpB,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,QAAU;AAAA,IACV,WAAW;AAAA,IACX,KAAO;AAAA,IACP,wBAAwB;AAAA,EAC1B;AAAA,EACA,iBAAmB;AAAA,IACjB,8BAA8B;AAAA,IAC9B,uCAAuC;AAAA,IACvC,aAAa;AAAA,IACb,aAAa;AAAA,IACb,sBAAsB;AAAA,IACtB,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,2BAA2B;AAAA,IAC3B,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,YAAc;AAAA,EAChB;AACF;;;ACpEA,SAAS,SAAS,cAAc;AAChC,SAAS,OAAO,cAAc;AAC9B,SAAS,YAAAC,iBAAgB;AACzB,SAAS,YAAAC,iBAAgB;AACzB,SAAS,sBAAsB;AAC/B,OAAO,eAAe;AACtB,SAAS,QAAAC,aAAY;;;ACNrB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,aAAAC;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,OAAO,iBAAiB;;;ACpBxB,SAAS,iBAAiB;AAC1B,OAAO,aAAa;AACpB,SAAS,gBAAgB;AAIlB,IAAM,cAA2B;AAAA,EACtC,UAAU;AAAA,EACV,MAAM;AAAA,IACJ,SAAS,SAAS,SAAS,QAAQ,YAAY;AAAA,IAC/C,WAAW,QAAQ;AAAA,IACnB,QAAQ,QAAQ;AAAA,EAClB;AAAA,EACA,OAAO;AAAA,IACL,aAAa,CAAC,SAAiB,SAAS,QAAQ,IAAI;AAAA,IACpD,gBAAgB,CAAC,SAAiB,SAAS,OAAO,KAAK,IAAI,EAAE;AAAA,IAC7D,uBAAuB,CAAC,oBACtB,gBAAgB,IAAI,CAAC,WAAW,OAAO,KAAK,EAAE,KAAK,IAAI;AAAA,EAC3D;AACF;AAEO,IAAM,eAAe,CAAQ,SAClC,CAAC,UAAU,YAAY,IAAI,KAAK,CAAC,KAAK;AAEjC,IAAM,YAAY,CAAQ,SAC/B,aAAa,IAAI,KAAK,QAAQ,KAAK,OAAO;AAErC,IAAM,SAAS,CAAQ,SAC5B,aAAa,IAAI,IAAI,iCAAK,OAAL,EAAW,SAAS,CAAC,KAAK,QAAQ,KAAI;AAEtD,IAAM,mBAAmB,CAC9B,YAEA,QAAQ,IAAI,CAAC,WAAW;AAjC1B;AAkCI,MAAI,UAAU,YAAY,MAAM,GAAG;AACjC,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,WAAW,UAAU;AAC9B,WAAO;AAAA,MACL,SAAS;AAAA,MACT,UAAU;AAAA,MACV,MAAM;AAAA,MACN,OAAO;AAAA;AAAA,MAEP,OAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAMC,SAAO,YAAO,SAAP,YAAe,OAAO,OAAO,KAAK;AAE/C,SAAO;AAAA,IACL,UAAS,YAAO,YAAP,YAAkB;AAAA,IAC3B,aAAa,OAAO;AAAA,IACpB,WAAU,YAAO,aAAP,YAAmB;AAAA,IAC7B,MAAAA;AAAA,IACA,QAAO,YAAO,UAAP,YAAgBA;AAAA,IACvB,OAAO,OAAO;AAAA,EAChB;AACF,CAAC;;;AD8JH,SAAS,aAAAC,kBAAiB;AAhMnB,IAAM,cAAc;AAAA,EACzB,CAAQ,QAAkC,SAAmC;AAC3E,UAAM,QAAQ,UAAuB,aAAa,OAAO,KAAK;AAC9D,UAAM,mBAAmB,OAAsC;AAC/D,UAAM,cAAc,OAAO,IAAI;AAC/B,UAAM,CAAC,OAAO,QAAQ,IAAI;AAAA,MACxB,iBAAiB,OAAO,OAAO;AAAA,IACjC;AACA,UAAM,CAAC,QAAQ,SAAS,IAAI,SAAiB,MAAM;AACnD,UAAM,CAAC,UAAU,QAAQ,IAAI,SAAiB;AAC9C,UAAM,SAAS,UAAU,EAAE,QAAQ,MAAM,CAAC;AAC1C,UAAM,EAAE,cAAc,OAAO,MAAM,WAAW,GAAG,UAAU,WAAW,MAAM,KAAK,IAAI;AAErF,UAAM,SAAS,QAAQ,MAAM;AAC3B,YAAM,QAAQ,MAAM,UAAU,YAAY;AAC1C,YAAM,OAAO,MAAM,cAAc,YAAY;AAE7C,UAAI,UAAU,IAAI;AAChB,cAAM,IAAI;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE,OAAO,KAAK;AAAA,IACvB,GAAG,CAAC,KAAK,CAAC;AAEV,UAAM,CAAC,aAAa,cAAc,IAAI,SAAS,IAAI;AACnD,UAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,OAAO,KAAK;AAEjD;AAAA,MACE,MAAM,MAAM;AACV,qBAAa,iBAAiB,OAAO;AAAA,MACvC;AAAA,MACA,CAAC;AAAA,IACH;AAGA,gBAAY,CAAO,KAAK,OAAO;AAC7B,mBAAa,iBAAiB,OAAO;AAErC,UAAI,WAAW,GAAG,GAAG;AACnB,cAAM,YAAY,MAAM,OAAO,SAAS;AACxC,cAAM,UAAU,MAAM,SAAS,CAAC,GAAG,SAAS,CAAC;AAE7C,YAAI,YAAY,CAAC,MAAM,KAAK,SAAS,GAAG;AACtC,mBAAS,sCAAsC;AAAA,QACjD,WAAW,YAAY,MAAM;AAC3B,oBAAU,MAAM;AAChB,eAAK,UAAU,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC;AAAA,QAC9C,OAAO;AACL,mBAAS,WAAW,+BAA+B;AAAA,QACrD;AAAA,MACF,WAAW,QAAQ,GAAG,KAAK,UAAU,GAAG,GAAG;AACzC,WAAG,UAAU,CAAC;AAEd,YACE,QACC,QAAQ,GAAG,KAAK,WAAW,OAAO,SAClC,UAAU,GAAG,KAAK,WAAW,OAAO,MACrC;AACA,gBAAM,SAAS,QAAQ,GAAG,IAAI,KAAK;AACnC,cAAI,OAAO;AAEX,aAAG;AACD,oBAAQ,OAAO,SAAS,MAAM,UAAU,MAAM;AAAA,UAChD,SAAS,CAAC,aAAa,MAAM,IAAI,CAAC;AAElC,oBAAU,IAAI;AAAA,QAChB;AAAA,MACF,WAAW,YAAY,GAAG,GAAG;AAC3B,WAAG,UAAU,CAAC;AAEd,cAAM,WAAW,OAAO,IAAI,IAAI,IAAI;AAEpC,YAAI,aAAa,MAAM,QAAQ,CAAC,GAAG;AACjC,oBAAU,QAAQ;AAAA,QACpB;AAAA,MACF,WAAW,eAAe,GAAG,GAAG;AAC9B,WAAG,UAAU,CAAC;AAAA,MAChB,WAAW,WAAW,GAAG,GAAG;AAC1B,WAAG,UAAU,CAAC;AACd,uBAAe,KAAK;AAEpB,cAAM,YAAY,MAAM,IAAI,CAAC,QAAQ,MAAO,MAAM,SAAS,OAAO,MAAM,IAAI,MAAO;AACnF,cAAM,YAAY,UAAU,OAAO,SAAS;AAC5C,cAAM,UAAU,MAAM,SAAS,CAAC,GAAG,SAAS,CAAC;AAE7C,YAAI,YAAY,MAAM;AACpB,mBAAS,MAAS;AAClB,mBAAS,SAAS;AAAA,QACpB,OAAO;AACL,mBAAS,WAAW,+BAA+B;AAAA,QACrD;AAAA,MACF,OAAO;AAEL,cAAM,aAAa,GAAG,KAAK,YAAY;AACvC,cAAM,aAAa,MAAM;AAAA,UAAU,CAAC,SAClCC,WAAU,YAAY,IAAI,KAAK,CAAC,aAAa,IAAI,IAC7C,QACA,KAAK,KAAK,YAAY,EAAE,WAAW,UAAU;AAAA,QACnD;AAEA,YAAI,eAAe,IAAI;AACrB,oBAAU,UAAU;AAAA,QACtB;AAEA,yBAAiB,UAAU,WAAW,MAAM;AAC1C,aAAG,UAAU,CAAC;AAAA,QAChB,GAAG,GAAG;AAAA,MACR;AAAA,IACF,EAAC;AAED,UAAM,UAAU,MAAM,MAAM,QAAQ,OAAO,SAAS,MAAM;AAE1D,QAAI,aAAa;AACjB,QAAI,gBAAgB;AACpB,QAAI;AAEJ,QACE,MAAM,aAAa,YAClB,MAAM,aAAa,UAAU,gBAAgB,iBAAiB,UAAa,eAC5E;AACA,UAAI,OAAO,iBAAiB,UAAU;AACpC,qBAAa;AAAA,MACf,OAAO;AACL,cAAM,OAAO;AAAA,UACX,GAAG,MAAM,MAAM,IAAI,OAAO,CAAC;AAAA,UAC3B,GAAG,MAAM,MAAM,IAAI,OAAO,CAAC;AAAA,QAC7B;AAEA,qBAAa,WAAW,KAAK,OAAO,CAAC,QAAQ,QAAQ,EAAE,EAAE,KAAK,IAAI,CAAC;AAAA,MACrE;AAEA,UACE,MAAM,SAAS,aACd,MAAM,aAAa;AAAA,MAEjB,MAAM,aAAa,UAAU,YAAY,UAC5C;AACA,wBAAgB;AAAA,EAAK,MAAM,MAAM,KAAK,yCAAyC,CAAC;AAChF,oBAAY,UAAU;AAAA,MACxB;AAAA,IACF;AAEA,UAAM,OAAO,cAAc;AAAA,MACzB;AAAA,MACA;AAAA,MACA,WAAW,EAAE,MAAM,SAAS,GAAG;AAC7B,YAAIA,WAAU,YAAY,IAAI,GAAG;AAC/B,iBAAO,IAAI,KAAK,SAAS;AAAA,QAC3B;AAEA,YAAI,KAAK,UAAU;AACjB,iBAAO,MAAM,MAAM;AAAA,YACjB,GAAG,KAAK,IAAI,IAAI,OAAO,KAAK,aAAa,WAAW,KAAK,WAAW,YAAY;AAAA,UAClF;AAAA,QACF;AAEA,YAAI,UAAU;AACZ,wBAAc,KAAK;AAAA,QACrB;AAEA,cAAM,WAAW,KAAK,UAAU,MAAM,KAAK,UAAU,MAAM,KAAK;AAChE,cAAM,QAAQ,WAAW,MAAM,MAAM,YAAY,CAAC,MAAc;AAChE,cAAM,SAAS,WAAW,MAAM,KAAK,SAAS;AAE9C,eAAO,MAAM,GAAG,MAAM,GAAG,QAAQ,IAAI,KAAK,IAAI,EAAE;AAAA,MAClD;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,QAAI,WAAW,QAAQ;AACrB,aAAO,GAAG,MAAM,IAAI,OAAO,IAAI,MAAM,MAAM,OAAO,MAAM,MAAM,sBAAsB,MAAM,OAAO,SAAS,GAAG,KAAK,CAAC,CAAC;AAAA,IACtH;AAEA,UAAM,kBACJ,MAAM,OAAO,SAAS,EAAE,SAAS,IAC7B,KAAK,MAAM,MAAM,OAAO,MAAM,MAAM,sBAAsB,MAAM,OAAO,SAAS,GAAG,KAAK,CAAC,CAAC,MAC1F;AACN,UAAM,oBAAoB,cAAc;AAAA,EAAK,MAAM,MAAM,YAAY,WAAW,CAAC,KAAK;AAEtF,QAAI,QAAQ;AAEZ,QAAI,UAAU;AACZ,cAAQ;AAAA,EAAK,MAAM,MAAM,MAAM,QAAQ,CAAC;AAAA,IAC1C;AAEA,WAAO,GAAG,MAAM,IAAI,OAAO,GAAG,eAAe,GAAG,UAAU;AAAA,EAAK,IAAI,GAAG,aAAa,GAAG,iBAAiB,GAAG,KAAK,GAAG,YAAY,UAAU;AAAA,EAC1I;AACF;;;AEvNA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAAC;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAIP,IAAM,EAAE,MAAM,QAAQ,IAAI;AAE1B,IAAM,QAAQ,MAAM;AAClB,MAAI,UAAW,QAAO;AACtB,MAAI,QAAS,QAAO;AACpB,MAAI,QAAS,QAAO;AAEpB,SAAO;AACT;AAEA,IAAM,SAAS,MAAM;AACnB,MAAI,cAAe,QAAO;AAC1B,MAAI,OAAQ,QAAO;AACnB,MAAI,aAAc,QAAO;AAC3B;AAEA,IAAM,cAAc,MAAM;AACxB,QAAM,KAAK,MAAM;AACjB,QAAM,MAAM,OAAO;AAEnB,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ,WAAW;AAAA,IACnBC,SAAQ,IAAI;AAAA,EACd,EAAE,OAAO,OAAO;AAEhB,SAAO,eAAe,KAAK,IAAI;AACjC;AAEA,IAAM,mBAAmB,YAAY;AAE9B,IAAM,kBAAkB,CAAC,UAAmB,eAAgC;AACjF,QAAM,iBAAiB,CAAC,GAAG,IAAI,IAAI,OAAO,EAAE;AAE5C,QAAM,gBAAgB,8BAAY;AAElC,iBAAe,KAAK,IAAI,aAAa,GAAG;AAExC,MAAI,YAAY;AACd,mBAAe,KAAK,UAAU;AAAA,EAChC;AAEA,SAAO,eAAe,KAAK,GAAG;AAChC;;;ACtDO,IAAM,QAAN,MAAY;AAAA,EAKjB,YAAY,EAAE,SAAS,YAAY,GAAgB;AACjD,SAAK,UAAU;AACf,SAAK,cAAc;AACnB,SAAK,YAAY,gBAAgB;AAAA,EACnC;AAAA,EAEM,MAAM,IAAsC;AAAA,+CAAtC,MAAc,OAAoB,CAAC,GAAG;AAChD,YAAkC,WAA1B,YAAU,CAAC,EAnBvB,IAmBsC,IAAT,iBAAS,IAAT,CAAjB;AAER,YAAM,UAAU;AAAA,QACd,SAAS,gDACJ,OAAO,YAAY,IAAI,QAAQ,OAAO,CAAC,IADnC;AAAA,UAEP,QAAQ;AAAA,UACR,cAAc,KAAK;AAAA,YACf,KAAK,eAAe,EAAE,gBAAgB,KAAK,YAAY;AAAA,SAE1D;AAGL,aAAO,MAAM,GAAG,KAAK,OAAO,GAAG,IAAI,IAAI,OAAO;AAAA,IAChD;AAAA;AACF;;;ACzBO,IAAM,SAAN,MAAa;AAAA,EAGlB,YAAY,EAAE,QAAQ,WAAW,YAAY,GAAiB;AAC5D,SAAK,SAAS,IAAI,MAAM;AAAA,MACtB,SAAS,GAAG,MAAM,WAAW,SAAS;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEM,eAAe,WAA4B;AAAA;AAC/C,aAAO,KAAK,OAAO,MAAM,aAAa,SAAS,SAAS;AAAA,QACtD,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA;AAAA,EAEM,mBAAmB;AAAA;AACvB,aAAO,KAAK,OAAO,MAAM,kCAAkC;AAAA,QACzD,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAAA;AAAA,EAEM,cACJC,OACA,kBACA,mBACA,oBAAoB,OACpB;AAAA;AACA,aAAO,KAAK,OAAO,MAAM,sBAAsB;AAAA,QAC7C,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU;AAAA,UACnB,MAAAA;AAAA,UACA,aAAa;AAAA,YACX,MAAM,oBAAoB,WAAW;AAAA,UACvC;AAAA,UACA,kBAAkB;AAAA,UAClB,WAAW;AAAA,UACX,oBAAoB;AAAA,UACpB;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,IACH;AAAA;AACF;;;ACnDA,SAAS,YAAAC,iBAAgB;;;ACAzB,SAAS,QAAQ,iBAAiB;;;ACE3B,SAAS,gBAAgB,OAAwC;AACtE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,YAAY,SAAS,YAAY;AACzF;;;ADAO,SAAS,YAAY,SAAiB,KAAmB;AAC9D,MAAI;AAEF,UAAM,QAAQ,UAAU,OAAO,CAAC,YAAY,KAAK,IAAI,GAAG;AAAA,MACtD,KAAK;AAAA,MACL,UAAU;AAAA;AAAA;AAAA,MAGV,OAAO;AAAA,IACT,CAAC;AAED,UAAM,SAAS,MAAM,OAAO,KAAK;AAEjC,QAAI,MAAM,WAAW,KAAK,QAAQ;AAChC,YAAM,IAAI,MAAM,MAAM;AAAA,IACxB;AAEA,YAAQ,IAAI,mBAAmB,GAAG,gBAAgB;AAAA,EACpD,SAAS,OAAgB;AAEvB,QAAI,gBAAgB,KAAK,GAAG;AAC1B,YAAM,SAAS,MAAM,SAAS,MAAM,OAAO,SAAS,IAAI;AAGxD,UACE,OAAO,SAAS,mCAAmC,GAAG,EAAE,KACxD,OAAO,SAAS,8BAA8B,GAAG,GAAG,KACpD,OAAO,SAAS,kDAAkD,GAClE;AACA,gBAAQ,MAAM,QAAQ,GAAG,gCAAgC;AAAA,MAC3D,OAAO;AACL,gBAAQ,MAAM,2BAA2B,GAAG,MAAM,OAAO,KAAK,CAAC;AAAA,MACjE;AAAA,IACF,WAAW,iBAAiB,OAAO;AAEjC,cAAQ,MAAM,2BAA2B,GAAG,MAAM,MAAM,OAAO;AAAA,IACjE,OAAO;AAEL,cAAQ,MAAM,kDAAkD,GAAG,IAAI;AAAA,IACzE;AAEA,YAAQ,KAAK,qCAAqC;AAAA,EACpD;AACF;;;AE/CA,SAAS,gBAAgB;AAIlB,SAAS,eAAwB;AACtC,MAAI;AAEF,UAAM,SAAS,SAAS,yBAAyB;AAAA,MAC/C,UAAU;AAAA,MACV,OAAO;AAAA,IACT,CAAC,EAAE,SAAS;AAGZ,WAAO,OAAO,SAAS,4BAA4B;AAAA,EACrD,SAAS,OAAgB;AAEvB,QAAI,gBAAgB,KAAK,GAAG;AAC1B,YAAM,SAAS,MAAM,SAAS,MAAM,OAAO,SAAS,IAAI;AACxD,YAAM,SAAS,MAAM,SAAS,MAAM,OAAO,SAAS,IAAI;AACxD,YAAM,iBAAiB,SAAS;AAGhC,UAAI,eAAe,SAAS,4BAA4B,GAAG;AACzD,eAAO;AAAA,MACT;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;AC7BA,SAAS,QAAQC,kBAAiB;AAE3B,SAAS,iBAAiB,YAAoB,OAAe;AAClE,QAAM,QAAQA,WAAU,OAAO,CAAC,SAAS,UAAU,OAAO,IAAI,GAAG;AAAA,IAC/D,KAAK;AAAA,IACL,UAAU;AAAA;AAAA;AAAA,IAGV,OAAO;AAAA,EACT,CAAC;AAED,QAAM,SAAS,MAAM,OAAO,KAAK;AAEjC,MAAI,MAAM,WAAW,KAAK,QAAQ;AAChC,UAAM,IAAI,MAAM,MAAM;AAAA,EACxB;AACF;;;AJVO,IAAM,gBAAgB,CAAC;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY;AACd,MAMM;AACJ,QAAM,SAAS,aAAa;AAE5B,UAAQ,IAAI,WAAW,UAAU,UAAU,SAAS,QAAQ,OAAO;AAAA,CAAO;AAE1E,QAAM,eAAe,aACnB,SAAS,kBAAkB,UAAU,KAAK,sBAAsB,UAAU,EAC5E,OAAO,cAAc,IAAI,WAAW,KAAK,EAAE;AAE3C,EAAAC,UAAS,cAAc,EAAE,OAAO,UAAU,CAAC;AAC3C,UAAQ,IAAI;AAEZ,EAAAA,UAAS,qCAAqC,EAAE,KAAK,YAAY,OAAO,UAAU,CAAC;AACnF,UAAQ,IAAI;AAEZ,MAAI,OAAO;AACT,QAAI,WAAW;AAEb,MAAAA,UAAS,wBAAwB,EAAE,KAAK,YAAY,OAAO,UAAU,CAAC;AAGtE,uBAAiB,YAAY,KAAK;AAElC,cAAQ,IAAI,iBAAiB,KAAK;AAAA,CAAkB;AAEpD;AAAA,IACF;AAEA,gBAAY,YAAY,KAAK;AAE7B,YAAQ,IAAI;AAAA,EACd;AACF;;;AKlDA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,uBAAuB,mBAAmB;;;ACDnD,SAAmB,kBAAuC;AAEnD,IAAM,UAAU,CACrB,QACA,YACG;AACH,SAAO,WAAW,QAAQ;AAAA,IACxB,SAAS;AAAA,KACN,QACJ,EAAE,MAAM,MAAM,QAAQ,KAAK,CAAC,CAAC;AAChC;;;ADLA,IAAM,iBAAiB,CAAO,eAAuB;AACnD,QAAM,YAAY,EAAE,KAAK,YAAY,QAAQ,MAAM,gBAAgB,OAAO,CAAC;AAC7E;AAEO,IAAM,sBAAsB,CAAO,eAAoB;AAC5D,iBAAQ,eAAe,UAAU,GAAG;AAAA,IAClC,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU,CAAC,QAAQC,UAAS,OAAO,mCAAmC,IAAI,OAAO,EAAE;AAAA,EACrF,CAAC;AAAA;;;AEdH,SAAS,SAAS;AAIlB,IAAM,iBAAiB;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,gCAAgC,EAAE,OAAO;AAAA,EAC7C,MAAM,EAAE;AAAA,IACN,EAAE,OAAO;AAAA,MACP,IAAI,EAAE,OAAO;AAAA,MACb,MAAM,EAAE,OAAO;AAAA,MACf,UAAU,EAAE,OAAO,EAAE,SAAS;AAAA,MAC9B,cAAc,EAAE,QAAQ;AAAA,IAC1B,CAAC;AAAA,EACH;AACF,CAAC;AAEM,IAAM,sBAAsB,CAAO,OAAc;AACtD,QAAM,WAAW,MAAM,GAAG,MAAM,sCAAsC;AAEtE,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,IAAI;AAAA,MACR,oDAAoD,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,IAC5F;AAAA,EACF;AAEA,SAAO,8BAA8B,MAAM,MAAM,SAAS,KAAK,CAAC,EAC7D,KAAK,OAAO,CAAC,EAAE,GAAG,MAAM,eAAe,SAAS,EAAE,CAAC,EACnD,IAAI,CAAC,EAAE,MAAAC,OAAM,GAAG,OAAO,EAAE,MAAM,GAAGA,KAAI,KAAK,EAAE,KAAK,OAAO,GAAG,EAAE;AACnE;;;ACjDA,SAAS,YAAAC,iBAAgB;AACzB,OAAO,UAAU;AACjB,SAAS,uBAAuB;;;ACFhC,SAAS,KAAAC,UAAS;;;ACAlB,YAAYC,QAAO;AACnB,SAAS,oBAAoB;AAEtB,IAAM,QAAQ,CAAI,MAAe,WAA2B;AACjE,MAAI;AACF,WAAO,OAAO,MAAM,IAAI;AAAA,EAC1B,SAAS,OAAO;AACd,QAAI,iBAAmB,aAAU;AAC/B,cAAQ,MAAM,aAAa,KAAK,EAAE,SAAS,CAAC;AAAA,IAC9C;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ADJO,IAAM,OAAN,MAAW;AAAA,EAIhB,YAAY,EAAE,QAAQ,GAAe;AAFrC,SAAiB,yBAAyB;AAGxC,SAAK,SAAS,IAAI,MAAM,EAAE,QAAQ,CAAC;AAAA,EACrC;AAAA,EAEM,gBAAgB;AAAA;AACpB,YAAM,WAAW,MAAM,KAAK,OAAO,MAAM,iBAAiB;AAAA,QACxD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU;AAAA,UACnB,QAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,EAAE,KAAK,GAAG;AAAA,UACV,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,MACH,CAAC;AAED,YAAM,mBAAmBC,GAAE,OAAO;AAAA,QAChC,aAAaA,GAAE,OAAO;AAAA,QACtB,WAAWA,GAAE,OAAO;AAAA,QACpB,kBAAkBA,GAAE,OAAO;AAAA,QAC3B,YAAYA,GAAE,OAAO;AAAA,QACrB,UAAUA,GAAE,OAAO;AAAA,MACrB,CAAC;AAED,aAAO,MAAM,MAAM,SAAS,KAAK,GAAG,gBAAgB;AAAA,IACtD;AAAA;AAAA,EAEM,gBAAgB,YAAoB;AAAA;AACxC,YAAM,WAAW,MAAM,KAAK,OAAO,MAAM,iBAAiB;AAAA,QACxD,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU;AAAA,UACnB,aAAa;AAAA,UACb,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,MACH,CAAC;AAED,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AAEA,YAAM,0BAA0BA,GAAE,OAAO;AAAA,QACvC,cAAcA,GAAE,OAAO;AAAA,QACvB,YAAYA,GAAE,OAAO;AAAA,QACrB,SAASA,GAAE,OAAO;AAAA,QAClB,SAASA,GAAE,OAAO,EAAE,IAAI;AAAA,MAC1B,CAAC;AAED,aAAO,MAAM,MAAM,SAAS,KAAK,GAAG,uBAAuB;AAAA,IAC7D;AAAA;AACF;;;AErEA,SAAS,SAAS,WAAW,aAAa,qBAAqB;AAC/D,SAAS,YAAY,WAAW,cAAc,qBAAqB;AACnE,SAAS,SAAS,YAAY;AAa9B,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,iBAAiB,KAAqC;AAC7D,MAAI,CAAC,SAAS,GAAG,GAAG;AAClB,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,KAAK;AACjB,QAAI,CAAC,SAAS,IAAI,IAAI,GAAG;AACvB,aAAO;AAAA,IACT;AAEA,UAAM,EAAE,WAAW,YAAY,IAAI,IAAI;AAEvC,YACG,cAAc,UAAa,OAAO,cAAc,cAChD,gBAAgB,UAAa,OAAO,gBAAgB;AAAA,EAEzD;AAEA,SAAO;AACT;AAEO,IAAM,SAAN,MAAa;AAAA,EAIlB,YAAY,YAAoB;AAC9B,SAAK,aAAa,KAAK,YAAY,WAAW;AAC9C,SAAK,SAAS,KAAK,KAAK;AAAA,EAC1B;AAAA,EAEA,UAAwD;AAjD1D;AAkDI,YAAO,UAAK,OAAO,SAAZ,YAAoB,CAAC;AAAA,EAC9B;AAAA,EAEA,QAAQ,WAAmB,aAA2B;AACpD,SAAK,OAAO,OAAO,EAAE,WAAW,YAAY;AAC5C,SAAK,KAAK;AAAA,EACZ;AAAA,EAEA,OAAa;AA1Df;AA2DI,UAAM,YAAwB,CAAC;AAE/B,UAAI,UAAK,OAAO,SAAZ,mBAAkB,cAAa,KAAK,OAAO,KAAK,aAAa;AAC/D,gBAAU,OAAO;AAAA,QACf,WAAW,KAAK,OAAO,KAAK;AAAA,QAC5B,aAAa,KAAK,OAAO,KAAK;AAAA,MAChC;AAAA,IACF;AAEA,UAAM,MAAM,QAAQ,KAAK,UAAU;AAEnC,QAAI,CAAC,WAAW,GAAG,GAAG;AACpB,gBAAU,KAAK,EAAE,WAAW,KAAK,CAAC;AAAA,IACpC;AAEA,UAAM,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAOjB,kBAAc,KAAK,YAAY,WAAW,cAAc,SAAS,CAAC;AAAA,EACpE;AAAA,EAEQ,OAAuB;AAC7B,QAAI,CAAC,WAAW,KAAK,UAAU,GAAG;AAChC,aAAO,CAAC;AAAA,IACV;AAEA,QAAI;AACF,YAAM,WAAW,aAAa,KAAK,YAAY,OAAO;AACtD,YAAM,SAAS,UAAU,QAAQ;AAEjC,UAAI,iBAAiB,MAAM,GAAG;AAC5B,eAAO;AAAA,MACT;AAEA,cAAQ,KAAK,yDAAyD;AAEtE,aAAO,CAAC;AAAA,IACV,SAAQ;AACN,cAAQ,KAAK,uDAAuD;AAEpE,aAAO,CAAC;AAAA,IACV;AAAA,EACF;AACF;;;AHxFA,SAAe,eACb,MACA,YACA,UACuC;AAAA;AACvC,QAAI;AACF,YAAM,cAAc,MAAM,KAAK,gBAAgB,UAAU;AAEzD,aAAO;AAAA,IACT,SAAQ;AACN,YAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,WAAW,GAAI,CAAC;AAEnE,aAAO;AAAA,IACT;AAAA,EACF;AAAA;AAEA,SAAe,mBACb,MACA,YACA,UACgC;AAAA;AAChC,UAAM,cAAc,MAAM,eAAe,MAAM,YAAY,QAAQ;AAEnE,QAAI,aAAa;AACf,aAAO;AAAA,IACT;AAEA,WAAO,mBAAmB,MAAM,YAAY,QAAQ;AAAA,EACtD;AAAA;AAEA,SAAe,gBAAgB,QAAkC;AAAA;AAC/D,UAAM,KAAK,gBAAgB;AAAA,MACzB,OAAO,QAAQ;AAAA,MACf,QAAQ,QAAQ;AAAA,IAClB,CAAC;AAGD,YAAQ,MAAM,WAAW,IAAI;AAC7B,YAAQ,MAAM,OAAO;AAErB,WAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,cAAQ,MAAM,KAAK,QAAQ,CAAC,SAAS;AAEnC,gBAAQ,MAAM,WAAW,KAAK;AAC9B,gBAAQ,MAAM,MAAM;AACpB,WAAG,MAAM;AAGT,cAAM,gBAAgB,KAAK,CAAC,MAAM,MAAM,KAAK,CAAC,MAAM;AAGpD,gBAAQ,OAAO,MAAM,IAAI;AAEzB,gBAAQ,aAAa;AAAA,MACvB,CAAC;AAGD,SAAG,MAAM,MAAM;AAAA,IACjB,CAAC;AAAA,EACH;AAAA;AAEA,SAAsB,MAAM,SAAuC;AAAA;AACjE,UAAM,OAAO,IAAI,KAAK,EAAE,QAAQ,CAAC;AAEjC,UAAM,aAAa,MAAM,KAAK,cAAc;AAE5C,YAAQ;AAAA,MACNC,UAAS,UAAU,qCAAqC,IACtDA,UAAS,QAAQ,WAAW,SAAS;AAAA,IACzC;AACA,YAAQ,IAAI,uBAAuB,WAAW,gBAAgB,qBAAqB;AAEnF,UAAM,gBAAgB,MAAM,gBAAgB,EAAE;AAE9C,QAAI,eAAe;AACjB,YAAM,KAAK,WAAW,gBAAgB;AAAA,IACxC;AAEA,UAAM,cAAc,MAAM;AAAA,MACxB,MAAM,mBAAmB,MAAM,WAAW,aAAa,WAAW,QAAQ;AAAA,MAC1E,EAAE,MAAM,iCAAiC,aAAa,0BAA0B;AAAA,IAClF;AAEA,WAAO;AAAA,MACL,WAAW,YAAY;AAAA,MACvB,aAAa,YAAY;AAAA,IAC3B;AAAA,EACF;AAAA;AAEO,SAAS,iBAAiB,YAAoB,aAAgC;AACnF,QAAM,SAAS,IAAI,OAAO,UAAU;AAEpC,SAAO,QAAQ,YAAY,WAAW,YAAY,WAAW;AAC/D;;;AI/GA,SAAS,iBAAiB;AAC1B,OAAO,UAAU;AACjB,SAAS,mBAAmB;AAK5B,IAAM,wBAAwB;AAG9B,IAAM,mBAAmB;AASlB,IAAM,YAAN,MAAgB;AAAA,EAUrB,cAAc;AAHd,SAAiB,cAAc;AAC/B,SAAiB,iBAAiB,gBAAa;AA8D/C,sBAAa,CAAC,aAAsB;AAzFtC;AA0FI,YAAM,UAAU,QAAQ,QAAQ;AAEhC,iBAAK,SAAL,mBAAW,IAAI,uBAAuB;AAEtC,cAAO,UAAK,SAAL,mBAAW;AAAA,IACpB;AAjEE,SAAK,8BAA8B,QAAQ,IAAI;AAE/C,QAAI;AACF,WAAK,OAAO,IAAI,KAAK;AAAA,QACnB,aAAa,KAAK;AAAA,QAClB,gBAAgB,KAAK;AAAA,MACvB,CAAC;AAAA,IACH,SAAQ;AACN,WAAK,OAAO;AAAA,IACd;AAEA,SAAK,YAAY,YAAY,EAAE,EAAE,SAAS,KAAK;AAC/C,SAAK,YAAY,IAAI,UAAU;AAAA,MAC7B,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAAA,EAEM,MAAM,WAAmB,SAAkC;AAAA;AAC/D,UAAI,CAAC,KAAK,UAAU,GAAG;AACrB,eAAO,QAAQ,QAAQ,MAAS;AAAA,MAClC;AAEA,WAAK,UAAU,MAAM;AAAA,QACnB,OAAO;AAAA,QACP,aAAa,KAAK,eAAe;AAAA,QACjC,YAAY,iCACP,UADO;AAAA,UAEV,WAAW,KAAK;AAAA,QAClB;AAAA,QACA,SAAS;AAAA,UACP,KAAK;AAAA,YACH,MAAM,KAAK;AAAA,YACX,SAAS,KAAK;AAAA,UAChB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA;AAAA,EAEM,SAAS,WAAoB;AAAA;AACjC,UAAI,CAAC,KAAK,UAAU,GAAG;AACrB,eAAO,QAAQ,QAAQ,MAAS;AAAA,MAClC;AAEA,UAAI,CAAC,WAAW;AACd,eAAO,QAAQ,QAAQ,MAAS;AAAA,MAClC;AAEA,WAAK,UAAU,SAAS;AAAA,QACtB,QAAQ;AAAA,QACR,aAAa,KAAK,eAAe;AAAA,QACjC,SAAS;AAAA,UACP,KAAK;AAAA,YACH,MAAM,KAAK;AAAA,YACX,SAAS,KAAK;AAAA,UAChB;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA;AAAA,EAUA,YAAqB;AACnB,WACE,CAAC,KAAK,+BACN,CAAC,CAAC,KAAK,QACP,KAAK,KAAK,IAA2C,uBAAuB,IAAI;AAAA,EAEpF;AAAA,EAEQ,iBAAyB;AAzGnC;AA0GI,UAAM,OAAM,UAAK,SAAL,mBAAW,IAAqC;AAE5D,QAAI,KAAK;AACP,aAAO;AAAA,IACT;AAEA,UAAM,YAAY,YAAY,EAAE,EAAE,SAAS,KAAK;AAEhD,eAAK,SAAL,mBAAW,IAAI,kBAAkB;AAEjC,WAAO;AAAA,EACT;AACF;;;ACtHA,SAAS,sBAAsB;AAC/B,SAAS,QAAAC,aAAY;AAEd,IAAM,WAAW,CAAC,YAAoB,YAAoC;AAC/E;AAAA,IACEA,MAAK,YAAY,YAAY;AAAA,IAC7B,GAAG,OAAO,QAAQ,OAAO,EACtB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,GAAG,GAAG,IAAI,KAAK,EAAE,EACvC,KAAK,IAAI,CAAC;AAAA;AAAA,EACf;AACF;;;AnByCA,SAAS,wBAAwB,SAAyB;AACxD,QAAMC,aAAY,QAAQ,aAAa;AAEvC,SAAOA,aAAY,aAAa,OAAO,KAAK,SAAS,OAAO;AAC9D;AAEA,IAAM,YAAY,IAAI,UAAU;AAEhC,SAAe,sBAAsB,IAAW,QAAgB;AAAA;AAC9D,UAAM,iBAAiB,MAAM,MAAM;AAAA,MACjC,SAAS;AAAA,IACX,CAAC;AAED,QAAI,mBAAmB,CAAC;AAExB,QAAI;AACF,yBAAmB,MAAM,oBAAoB,EAAE;AAAA,IACjD,SAAS,OAAO;AACd,UAAI,iBAAiB,OAAO;AAC1B,gBAAQ,MAAMC,UAAS,OAAO,MAAM,OAAO,CAAC;AAAA,MAC9C;AAEA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,mBAAmB,MAAM,OAAO;AAAA,MACpC,SAAS;AAAA,MACT,SAAS;AAAA,MACT,SAAS;AAAA,MACT,OAAO;AAAA,QACL,OAAO;AAAA,UACL,MAAM,MAAMA,UAAS,OAAO,wDAAwD;AAAA,QACtF;AAAA,MACF;AAAA,IACF,CAAC;AAED,UAAM,6BAA6B,MAAM,OAAO;AAAA,MAC9C,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,OAAO,OAAO,KAAK;AAAA,QAC3B,EAAE,MAAM,MAAM,OAAO,MAAM;AAAA,MAC7B;AAAA,IACF,CAAC;AAED,QAAI,oBAA8B,CAAC;AAEnC,QAAI,4BAA4B;AAC9B,0BAAoB,MAAM,YAAY;AAAA,QACpC,SAAS,iBAAiB,OAAO,CAAC,EAAE,MAAM,MAAM,UAAU,gBAAgB;AAAA,QAC1E,SAAS;AAAA,QACT,OAAO;AAAA,UACL,OAAO;AAAA,YACL,MAAM,MAAMA,UAAS,OAAO,wDAAwD;AAAA,UACtF;AAAA,QACF;AAAA,QACA,UAAU,CAAC,eAAe;AACxB,cAAI,WAAW,SAAS,GAAG;AACzB,mBAAO;AAAA,UACT;AAEA,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,0BAA0B,MAAM,OAAO;AAAA,MAC3C,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,OAAO,OAAO,KAAK;AAAA,QAC3B,EAAE,MAAM,MAAM,OAAO,MAAM;AAAA,MAC7B;AAAA,IACF,CAAC;AAED,UAAM,WAAW,MAAM,OAAO;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,IAAI;AAChB,cAAQ;AAAA,QACNA;AAAA,UACE;AAAA,UACA;AAAA,kCAAqC,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA;AAAA,QAC7E;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,cAAuB,MAAM,SAAS,KAAK;AAEjD,QAAI,CAAC,wBAAwB,WAAW,GAAG;AACzC,cAAQ,MAAMA,UAAS,OAAO,6DAA6D,CAAC;AAC5F,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,WAAO;AAAA,MACL,WAAW,YAAY,KAAK;AAAA,MAC5B,iBAAiB,YAAY,KAAK;AAAA,MAClC,SAAS,YAAY,KAAK;AAAA,IAC5B;AAAA,EACF;AAAA;AAEA,SAAe,uBAAuB,IAAW;AAAA;AAC/C,UAAM,mBAAmB,CAAC,YAAY,QAAQ,aAAa;AAC3D,UAAM,mBAAmB,MAAM,GAAG,MAAM,6CAA6C;AAErF,QAAI,CAAC,iBAAiB,IAAI;AACxB,cAAQ;AAAA,QACNA;AAAA,UACE;AAAA,UACA;AAAA,2BAA8B,iBAAiB,MAAM,IAAI,iBAAiB,UAAU;AAAA;AAAA,QACtF;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,oBAA6B,MAAM,iBAAiB,KAAK;AAE/D,QAAI,CAAC,mBAAmB,iBAAiB,GAAG;AAC1C,cAAQ,MAAMA,UAAS,OAAO,uDAAuD,CAAC;AACtF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,kBAAkB,MAAM,OAAO;AAAA,MACnC,SAAS;AAAA,MACT,SAAS,kBAAkB,KACxB,KAAK,CAAC,GAAY,MAAe;AAChC,cAAM,SAAS,iBAAiB,QAAQ,EAAE,QAAQ;AAClD,cAAM,SAAS,iBAAiB,QAAQ,EAAE,QAAQ;AAGlD,YAAI,WAAW,MAAM,WAAW,IAAI;AAClC,iBAAO;AAAA,QACT;AAGA,YAAI,WAAW,GAAI,QAAO;AAC1B,YAAI,WAAW,GAAI,QAAO;AAG1B,eAAO,SAAS;AAAA,MAClB,CAAC,EACA,IAAI,CAAC,QAAiB;AAAA,QACrB,MAAM,GAAG;AAAA,QACT,OAAO;AAAA,QACP,aAAa,qBACX,GAAG,aAAa,gBACZ,YACA,GAAG,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,GAAG,SAAS,MAAM,CAAC,CAC/D;AAAA,MACF,EAAE;AAAA,IACN,CAAC;AAED,WAAO,gBAAgB;AAAA,EACzB;AAAA;AAEA,SAAe,eAAe,QAAgB,WAAmB;AAAA;AAC/D,UAAM,eAAe,MAAM,OAAO,eAAe,SAAS;AAE1D,QAAI,CAAC,aAAa,IAAI;AACpB,cAAQ;AAAA,QACNA;AAAA,UACE;AAAA,UACA;AAAA,gBAAmB,SAAS,iBAAiB,aAAa,MAAM,IAAI,aAAa,UAAU;AAAA;AAAA,QAC7F;AAAA,MACF;AACA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,UAAM,WAAoB,MAAM,aAAa,KAAK;AAElD,QAAI,CAAC,eAAe,QAAQ,GAAG;AAC7B,cAAQ,MAAMA,UAAS,OAAO,mDAAmD,CAAC;AAClF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,WAAO;AAAA,MACL,iBAAiB,SAAS,KAAK;AAAA,MAC/B,SAAS,SAAS,KAAK;AAAA,IACzB;AAAA,EACF;AAAA;AAEA,SAAe,aAAa,SAG6B;AAAA;AACvD,QAAI,EAAE,aAAa,WAAW,IAAI;AAElC,QAAI,CAAC,eAAe,UAAU,GAAG;AAC/B,cAAQ,MAAMA,UAAS,OAAO,uBAAuB,UAAU;AAAA,CAAwB,CAAC;AACxF,cAAQ,KAAK,CAAC;AAAA,IAChB;AAEA,QAAI,aAAa;AACf,oBAAc,UAAU,WAAW;AACnC,mBAAaC,MAAK,QAAQ,YAAY,WAAW;AAEjD,UAAI,eAAe,UAAU,GAAG;AAC9B,gBAAQ,MAAMD,UAAS,OAAO,UAAU,UAAU;AAAA,CAAmB,CAAC;AACtE,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,CAAC,aAAa;AAChB,YAAM,sBAAsB,CAAC,MAAc;AACzC,cAAM,YAAY,UAAU,CAAC;AAE7B,YAAI,CAAC,UAAW,QAAO;AAEvB,cAAM,YAAYC,MAAK,QAAQ,YAAY,SAAS;AAEpD,YAAI,eAAe,SAAS,EAAG,QAAO,gBAAgB,SAAS;AAE/D,sBAAc;AACd,qBAAa;AAEb,eAAO;AAAA,MACT;AAEA,YAAM,MAAM;AAAA,QACV,SAAS;AAAA,QACT,SAAS;AAAA,QACT,UAAU;AAAA,MACZ,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,YAAa,OAAM,IAAI,MAAM,kDAAkD;AACpF,QAAI,CAAC,WAAY,OAAM,IAAI,MAAM,iDAAiD;AAElF,WAAO,EAAE,aAAa,WAAW;AAAA,EACnC;AAAA;AAEA,SAAS,qBAAqB;AAC5B,MAAI;AACF,IAAAC,UAAS,wBAAwB,KAAK,GAAG,EAAE,OAAO,SAAS,CAAC;AAAA,EAC9D,SAAQ;AACN,YAAQ,MAAMF,UAAS,OAAO,uDAAuD,CAAC;AACtF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI;AACF,IAAAE,UAAS,wBAAwB,MAAM,GAAG,EAAE,OAAO,SAAS,CAAC;AAAA,EAC/D,SAAQ;AACN,YAAQ,MAAMF,UAAS,OAAO,wDAAwD,CAAC;AACvF,YAAQ,MAAM,oDAAoD;AAClE,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;AAEO,IAAM,SAAS,IAAI,QAAQ,QAAQ,EACvC,YAAY,iFAAiF,EAC7F,OAAO,yBAAyB,+BAA+B,EAC/D,OAAO,uBAAuB,6CAA6C,QAAQ,IAAI,CAAC,EACxF,OAAO,uBAAuB,wBAAwB,EACtD,OAAO,0BAA0B,0BAA0B,EAC3D,OAAO,qBAAqB,wBAAwB,EACpD,OAAO,8BAA8B,8BAA8B,EACnE;AAAA,EACC;AAAA,EACA;AAAA,EACA;AACF,EACC,OAAO,gBAAgB,qCAAqC,EAC5D,OAAO,6BAA6B,mCAAmC,sBAAsB,EAC7F,OAAO,mBAAmB,sDAAsD,EAChF;AAAA,EACC,IAAI,OAAO,qCAAqC,sBAAsB,EACnE,QAAQ,iBAAiB,EACzB,SAAS;AACd,EACC;AAAA,EACC,IAAI,OAAO,6BAA6B,yBAAyB,EAC9D,QAAQ,oCAAoC,EAC5C,SAAS;AACd,EAEC,OAAO,CAAO,YAAY;AACzB,QAAM,EAAE,OAAO,WAAW,IAAI;AAE9B,qBAAmB;AAEnB,QAAM,EAAE,aAAa,WAAW,IAAI,MAAM,aAAa;AAAA,IACrD,aAAa,QAAQ;AAAA,IACrB,YAAY,QAAQ;AAAA,EACtB,CAAC;AAED,MAAI,YAAY,QAAQ;AACxB,MAAI,cAAc,QAAQ;AAC1B,MAAI;AACJ,MAAI,kBAAkB,QAAQ;AAC9B,MAAI;AAEJ,MAAI,QAAQ,WAAW;AACrB,gBAAY,SAAS,QAAQ,WAAW,EAAE;AAAA,EAC5C;AAEA,MAAI,UAAkC,CAAC;AAGvC,OAAK,CAAC,aAAa,CAAC,iBAAiB,CAAC,aAAa,CAAC,kBAAkB;AACpE,kBAAc,MAAM,MAAM,iBAAiB,QAAQ,mBAAmB,EAAE;AACxE,gBAAY,YAAY;AACxB,kBAAc,YAAY;AAAA,EAC5B;AAGA,MAAI,aAAa,aAAa,iBAAiB;AAC7C,YAAQ,yBAAyB;AACjC,YAAQ,yBAAyB,UAAU,SAAS;AACpD,YAAQ,mCAAmC;AAAA,EAC7C,OAAO;AACL,QAAI,CAAC,aAAa,CAAC,aAAa;AAE9B,cAAQ,IAAI;AAAA,YAAe,WAAW,SAAS,UAAU;AAAA,CAAK;AAC9D,oBAAc,EAAE,YAAY,aAAa,YAAY,OAAO,WAAW,QAAQ,UAAU,CAAC;AAC1F,YAAM,oBAAoB,UAAU;AAGpC,UAAI,QAAQ,KAAK;AACf,cAAM,aAAa,QAAQ,IAAI,OAA+B,CAAC,KAAK,QAAQ;AAC1E,gBAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,GAAG;AAElC,cAAI,OAAO,OAAO;AAChB,gBAAI,GAAG,IAAI;AAAA,UACb;AAEA,iBAAO;AAAA,QACT,GAAG,CAAC,CAAC;AAEL,eAAO,OAAO,SAAS,UAAU;AAAA,MACnC;AAGA,eAAS,YAAY,OAAO;AAE5B,cAAQ;AAAA,QACN;AAAA,UACEA,UAAS,SAAS;AAAA,oBAAuB,WAAW,SAAS,UAAU;AAAA,CAAK;AAAA,UAC5E;AAAA,UACA,OAAO,KAAK,OAAO,EAAE,SAAS,IAC1BA,UAAS,UAAU;AAAA,OAAU,WAAW;AAAA,CAAoB,IAC5D;AAAA,YACEA,UAAS,UAAU;AAAA,OAAU,WAAW,gCAAgC;AAAA,YACxEA;AAAA,cACE;AAAA,cACA;AAAA;AAAA;AAAA,YACF;AAAA,UACF,EAAE,KAAK,EAAE;AAAA,QACf,EAAE,KAAK,IAAI;AAAA,MACb;AAEA,cAAQ,KAAK,CAAC;AAAA,IAChB;AAGA,UAAM,UAAU,SAAS,SAAS;AAElC,QAAI,CAAC,aAAa,CAAC,iBAAiB;AAClC,YAAM,KAAK,IAAI,MAAM;AAAA,QACnB,SAAS,eAAe,QAAQ,mBAAmB,WAAW,SAAS;AAAA,QACvE;AAAA,MACF,CAAC;AAED,YAAM,SAAS,IAAI,OAAO;AAAA,QACxB,QAAQ,QAAQ;AAAA,QAChB;AAAA,QACA;AAAA,MACF,CAAC;AAGD,UAAI,aAAa,CAAC,iBAAiB;AACjC,cAAM,WAAW,MAAM,eAAe,QAAQ,SAAS;AAEvD,kBAAU,mBAAK,SAAS;AACxB,0BAAkB,SAAS;AAAA,MAC7B,WAAW,CAAC,WAAW;AACrB,cAAM,sBAAsB,MAAM,OAAO,iBAAiB;AAE1D,YAAI,CAAC,oBAAoB,IAAI;AAC3B,kBAAQ;AAAA,YACNA;AAAA,cACE;AAAA,cACA;AAAA,6CAAgD,oBAAoB,MAAM,IAAI,oBAAoB,UAAU;AAAA;AAAA,YAC9G;AAAA,UACF;AACA,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,cAAM,kBAA2B,MAAM,oBAAoB,KAAK;AAEhE,YAAI,CAAC,sBAAsB,eAAe,GAAG;AAC3C,kBAAQ;AAAA,YACNA,UAAS,OAAO,0DAA0D;AAAA,UAC5E;AACA,kBAAQ,KAAK,CAAC;AAAA,QAChB;AAEA,YAAI,CAAC,gBAAgB,KAAK,UAAU;AAClC,kBAAQ,KAAKA,UAAS,UAAU,gBAAgB,KAAK,OAAO,CAAC;AAAA,QAC/D;AAEA,YAAI;AAEJ,YAAI,gBAAgB,KAAK,UAAU;AACjC,gCAAsB,MAAM,OAAO;AAAA,YACjC,SAAS;AAAA,YACT,SAAS;AAAA,cACP,EAAE,MAAM,OAAO,OAAO,KAAK;AAAA,cAC3B,EAAE,MAAM,MAAM,OAAO,MAAM;AAAA,YAC7B;AAAA,UACF,CAAC;AAAA,QACH;AAEA,YAAI,qBAAqB;AACvB,gBAAM,cAAc,MAAM,sBAAsB,IAAI,MAAM;AAE1D,sBAAY,YAAY;AACxB,4BAAkB,YAAY;AAC9B,oBAAU,mBAAK,YAAY;AAE3B,kBAAQ,IAAIA,UAAS,SAAS,8BAA8B,CAAC;AAC7D,kBAAQ;AAAA,YACNA;AAAA,cACE;AAAA,cACA;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,CAAC,qBAAqB;AACxB,sBAAY,MAAM,uBAAuB,EAAE;AAE3C,gBAAM,WAAW,MAAM,eAAe,QAAQ,SAAS;AAEvD,oBAAU,mBAAK,SAAS;AACxB,4BAAkB,SAAS;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,KAAK;AACf,UAAM,aAAa,QAAQ,IAAI,OAA+B,CAAC,KAAK,QAAQ;AAC1E,YAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,GAAG;AAElC,UAAI,OAAO,OAAO;AAChB,YAAI,GAAG,IAAI;AAAA,MACb;AAEA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAEL,WAAO,OAAO,SAAS,UAAU;AAAA,EACnC;AAGA,MAAI,QAAQ,WAAW;AACrB,YAAQ,yBAAyB,QAAQ;AAAA,EAC3C;AAEA,MAAI,QAAQ,WAAW;AACrB,YAAQ,yBAAyB,QAAQ;AAAA,EAC3C;AAEA,MAAI,QAAQ,iBAAiB;AAC3B,YAAQ,+BAA+B,QAAQ;AAAA,EACjD;AAEA,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,gDAAgD;AAChF,MAAI,CAAC,gBAAiB,OAAM,IAAI,MAAM,sDAAsD;AAG5F,UAAQ,IAAI;AAAA,YAAe,WAAW,SAAS,UAAU;AAAA,CAAK;AAC9D,gBAAc,EAAE,YAAY,aAAa,YAAY,OAAO,WAAW,QAAQ,UAAU,CAAC;AAC1F,QAAM,oBAAoB,UAAU;AAGpC,WAAS,YAAY,OAAO;AAG5B,MAAI,aAAa;AACf,qBAAiB,YAAY,WAAW;AAAA,EAC1C;AAEA,UAAQ;AAAA,IACNA,UAAS,SAAS;AAAA,oBAAuB,WAAW,SAAS,UAAU;AAAA,CAAK;AAAA,IAC5E;AAAA,IACAA,UAAS,UAAU;AAAA,KAAQ,WAAW;AAAA,CAAoB;AAAA,EAC5D;AACF,EAAC;AAEH,SAAS,eAAe,UAA6C;AACnE,SACE,OAAO,aAAa,YACpB,aAAa,QACb,UAAU,YACV,OAAO,SAAS,SAAS,YACzB,SAAS,SAAS,QAClB,0BAA0B,SAAS,QACnC,aAAa,SAAS;AAE1B;AAEA,SAAS,sBAAsB,UAAoD;AACjF,SACE,OAAO,aAAa,YACpB,aAAa,QACb,UAAU,YACV,OAAO,SAAS,SAAS,YACzB,SAAS,SAAS,QAClB,cAAc,SAAS,QACvB,aAAa,SAAS;AAE1B;AAEA,SAAS,wBAAwB,UAAsD;AACrF,SACE,OAAO,aAAa,YACpB,aAAa,QACb,UAAU,YACV,OAAO,SAAS,SAAS,YACzB,SAAS,SAAS,QAClB,QAAQ,SAAS,QACjB,0BAA0B,SAAS,QACnC,aAAa,SAAS;AAE1B;AAEA,SAAS,mBAAmB,UAAiD;AAC3E,SACE,OAAO,aAAa,YACpB,aAAa,QACb,UAAU,YACV,MAAM,QAAQ,SAAS,IAAI,KAC3B,SAAS,KAAK;AAAA,IACZ,CAAC,SACC,OAAO,SAAS,YAChB,SAAS,QACT,QAAQ,QACR,UAAU,QACV,cAAc;AAAA,EAClB;AAEJ;;;AoBrlBA,SAAS,WAAAG,UAAS,UAAAC,eAAc;AAChC,SAAS,UAAAC,eAAc;AACvB,SAAS,YAAAC,iBAAgB;AA2BzB,SAASC,oBAAmB,UAAiD;AAC3E,SACE,OAAO,aAAa,YACpB,aAAa,QACb,UAAU,YACV,MAAM,QAAQ,SAAS,IAAI,KAC3B,SAAS,KAAK;AAAA,IACZ,CAAC,SACC,OAAO,SAAS,YAChB,SAAS,QACT,QAAQ,QACR,UAAU,QACV,cAAc;AAAA,EAClB;AAEJ;AAEA,SAASC,gBAAe,UAA6C;AACnE,SACE,OAAO,aAAa,YACpB,aAAa,QACb,UAAU,YACV,OAAO,SAAS,SAAS,YACzB,SAAS,SAAS,QAClB,0BAA0B,SAAS,QACnC,aAAa,SAAS;AAE1B;AAEA,IAAMC,aAAY,IAAI,UAAU;AAEzB,IAAM,OAAO,IAAIC,SAAQ,MAAM,EACnC,YAAY,+DAA+D,EAC3E,OAAO,uBAAuB,wBAAwB,EACtD,OAAO,0BAA0B,0BAA0B,EAC3D,OAAO,mBAAmB,sDAAsD,EAChF;AAAA,EACC,IAAIC,QAAO,qCAAqC,sBAAsB,EACnE,QAAQ,iBAAiB,EACzB,SAAS;AACd,EACC;AAAA,EACC,IAAIA,QAAO,6BAA6B,yBAAyB,EAC9D,QAAQ,oCAAoC,EAC5C,SAAS;AACd,EACC,OAAO,CAAO,YAAY;AACzB,QAAM,aAAa,QAAQ,IAAI;AAE/B,MAAI,YAAY,QAAQ;AACxB,MAAI,cAAc,QAAQ;AAG1B,MAAI,CAAC,aAAa,CAAC,aAAa;AAC9B,UAAM,SAAS,IAAI,OAAO,UAAU;AACpC,UAAM,aAAa,OAAO,QAAQ;AAElC,gBAAY,gCAAa,WAAW;AACpC,kBAAc,oCAAe,WAAW;AAAA,EAC1C;AAEA,MAAI,CAAC,aAAa,CAAC,aAAa;AAC9B,UAAM,cAAc,MAAM,MAAM,iBAAiB,QAAQ,mBAAmB,EAAE;AAE9E,gBAAY,YAAY;AACxB,kBAAc,YAAY;AAG1B,qBAAiB,YAAY,WAAW;AAAA,EAC1C;AAEA,QAAMF,WAAU,SAAS,SAAS;AAElC,QAAM,KAAK,IAAI,MAAM;AAAA,IACnB,SAAS,eAAe,QAAQ,mBAAmB,WAAW,SAAS;AAAA,IACvE;AAAA,EACF,CAAC;AAED,QAAM,SAAS,IAAI,OAAO;AAAA,IACxB,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA;AAAA,EACF,CAAC;AAED,QAAM,mBAAmB,CAAC,YAAY,QAAQ,aAAa;AAC3D,QAAM,mBAAmB,MAAM,GAAG,MAAM,6CAA6C;AAErF,MAAI,CAAC,iBAAiB,IAAI;AACxB,YAAQ;AAAA,MACNG;AAAA,QACE;AAAA,QACA;AAAA,2BAA8B,iBAAiB,MAAM,IAAI,iBAAiB,UAAU;AAAA;AAAA,MACtF;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,oBAA6B,MAAM,iBAAiB,KAAK;AAE/D,MAAI,CAACL,oBAAmB,iBAAiB,GAAG;AAC1C,YAAQ,MAAMK,UAAS,OAAO,uDAAuD,CAAC;AACtF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,kBAAkB,MAAMC,QAAO;AAAA,IACnC,SAAS;AAAA,IACT,SAAS,kBAAkB,KACxB;AAAA,MACC,CAAC,GAAY,MACX,iBAAiB,QAAQ,EAAE,QAAQ,IAAI,iBAAiB,QAAQ,EAAE,QAAQ;AAAA,IAC9E,EACC,IAAI,CAAC,QAAiB;AAAA,MACrB,MAAM,GAAG;AAAA,MACT,OAAO;AAAA,MACP,aAAa,qBACX,GAAG,aAAa,gBACZ,YACA,GAAG,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,GAAG,SAAS,MAAM,CAAC,CAC/D;AAAA,IACF,EAAE;AAAA,EACN,CAAC;AAED,QAAM,YAAY,gBAAgB;AAGlC,QAAM,eAAe,MAAM,OAAO,eAAe,SAAS;AAE1D,MAAI,CAAC,aAAa,IAAI;AACpB,YAAQ;AAAA,MACND;AAAA,QACE;AAAA,QACA;AAAA,gBAAmB,SAAS,iBAAiB,aAAa,MAAM,IAAI,aAAa,UAAU;AAAA;AAAA,MAC7F;AAAA,IACF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,WAAoB,MAAM,aAAa,KAAK;AAElD,MAAI,CAACJ,gBAAe,QAAQ,GAAG;AAC7B,YAAQ,MAAMI,UAAS,OAAO,mDAAmD,CAAC;AAClF,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,UAAU,mBAAK,SAAS,KAAK;AAGnC,MAAI,QAAQ,KAAK;AACf,UAAM,aAAa,QAAQ,IAAI,OAA+B,CAAC,KAAK,QAAQ;AAC1E,YAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,GAAG;AAElC,UAAI,OAAO,OAAO;AAChB,YAAI,GAAG,IAAI;AAAA,MACb;AAEA,aAAO;AAAA,IACT,GAAG,CAAC,CAAC;AAEL,WAAO,OAAO,SAAS,UAAU;AAAA,EACnC;AAEA,WAAS,YAAY,OAAO;AAE5B,UAAQ;AAAA,IACNA,UAAS,SAAS;AAAA,sCAAyC,gBAAgB,IAAI;AAAA,CAAK;AAAA,EACtF;AACA,UAAQ,IAAIA,UAAS,SAAS;AAAA;AAAA,CAAiB,CAAC;AAChD,UAAQ,IAAIA,UAAS,UAAU;AAAA;AAAA,CAAkB,CAAC;AACpD,EAAC;;;ACrMH,SAAS,WAAAE,gBAAe;AACxB,SAAS,QAAQ,cAAc;AAC/B,SAAS,SAAAC,cAAa;AACtB,SAAS,kBAAAC,iBAAgB,qBAAqB;AAC9C,OAAOC,gBAAe;AACtB,SAAS,QAAQ,eAAe;AAChC,SAAS,iBAAiB;AAC1B,SAAS,KAAAC,UAAS;AAElB,IAAM,OAAO,UAAU,MAAM;AAEtB,IAAM,iBAAiBC,GAAE,OAAO;AAAA,EACrC,MAAMA,GAAE,OAAO;AAAA,EACf,cAAcA,GAAE,OAAO,EAAE,KAAKA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,CAAC;AAAA,EACnD,iBAAiBA,GAAE,OAAO,EAAE,KAAKA,GAAE,MAAMA,GAAE,OAAO,CAAC,EAAE,CAAC;AAAA,EACtD,sBAAsBA,GAAE,MAAMA,GAAE,OAAO,CAAC;AAC1C,CAAC;AAIM,IAAM,cAAc,IAAIC,SAAQ,aAAa,EACjD,SAAS,sBAAsB,mCAAmC,EAClE,OAAO,wBAAwB,gEAAgE,EAC/F,OAAO,CAAO,oBAAoB,YAAY;AAE7C,QAAM,kBAAkBD,GAAE,OAAO,EAAE,UAAUE,UAAS,EAAE,MAAM,kBAAkB;AAEhF,QAAM,WAAqB;AAAA,IACzB,MAAM;AAAA,IACN,cAAc,EAAE,KAAK,CAAC,EAAE;AAAA,IACxB,iBAAiB,EAAE,KAAK,CAAC,EAAE;AAAA,IAC3B,sBAAsB,CAAC;AAAA,EACzB;AAEA,QAAM,KAAK,kBAAkB;AAE7B,QAAM,EAAE,QAAQ,cAAc,IAAI,MAAM,KAAK,iCAAiC;AAC9E,MAAI,CAAC,SAAS,IAAI,cAAc,MAAM,IAAI;AAE1C,MAAI,QAAQ,YAAY;AACtB,gBAAY,QAAQ;AAAA,EACtB;AAEA,QAAM,EAAE,QAAQ,aAAa,IAAI,MAAM,KAAK,+CAA+C;AAC3F,QAAM,CAAC,aAAa,IAAI,aACrB,MAAM,IAAI,EACV,OAAO,OAAO,EACd,KAAK,CAAC,GAAG,MAAM;AACd,UAAM,WAAW,OAAO,EAAE,QAAQ,+BAA+B,EAAE,CAAC;AACpE,UAAM,WAAW,OAAO,EAAE,QAAQ,+BAA+B,EAAE,CAAC;AAEpE,QAAI,YAAY,UAAU;AACxB,aAAO,QAAQ,UAAU,QAAQ;AAAA,IACnC;AAEA,WAAO;AAAA,EACT,CAAC,EACA,QAAQ;AAEX,QAAM,4BAA4BF,GAAE,OAAO;AAAA,IACzC,cAAcA,GAAE,OAAO,CAAC,CAAC,EAAE,YAAY;AAAA,IACvC,iBAAiBA,GAAE,OAAO,CAAC,CAAC,EAAE,YAAY;AAAA,EAC5C,CAAC;AAED,QAAM,iBAAiB,CAAO,QAAgB;AAC5C,UAAM,EAAE,OAAO,IAAI,MAAM,KAAK,YAAY,GAAG,oBAAoB;AAEjE,WAAO,0BAA0B,MAAM,KAAK,MAAM,MAAM,CAAC;AAAA,EAC3D;AAEA,QAAM,kBAAkB,MAAM,eAAe,SAAS;AACtD,QAAM,oBAAoB,MAAM,eAAe,aAAa;AAE5D,QAAM,iBAAiB,CAAC,GAA4B,MAA+B;AACjF,WAAO,OAAO,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC,EAAE,SAAS,GAAG,CAAC;AAAA,EACrE;AAEA,WAAS,aAAa,MAAM;AAAA,IAC1B,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB;AACA,WAAS,gBAAgB,MAAM;AAAA,IAC7B,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB;AAEA,QAAM,EAAE,QAAQ,cAAc,IAAI,MAAM,KAAK,YAAY,aAAa,oBAAoB;AAC1F,QAAM,EAAE,QAAQ,eAAe,IAAI,MAAM,KAAK,YAAY,SAAS,oBAAoB;AAEvF,WAAS,uBAAuB,eAAeG,OAAM,cAAc,GAAGA,OAAM,aAAa,CAAC;AAE1F,QAAM,EAAE,QAAQ,gBAAgB,IAAI,MAAM;AAAA,IACxC,YAAY,aAAa,MAAM,SAAS;AAAA,EAC1C;AAEA,EAAAC,gBAAe,gBAAgB,eAAe,sBAAsB,eAAe;AACnF,gBAAc,gBAAgB,eAAe,kBAAkB,UAAU;AAAA,IACvE,QAAQ;AAAA,EACV,CAAC;AAED,UAAQ,IAAI,mCAAmC;AACjD,EAAC;;;ACrGH,SAAS,UAAU,WAAAC,UAAS,UAAAC,eAAc;;;ACA1C,SAAS,YAAAC,iBAAgB;AASzB,IAAMC,aAAY,IAAI,UAAU;AAChC,IAAI,YAAYA,WAAU,UAAU;AAEpC,IAAM,oBAAoB,CAAC,SAAmC,QAA4B;AACxF,MAAI,QAAQ,UAAU,QAAQ,UAAU;AACtC,IAAAA,WAAU,WAAW,IAAI;AACzB,gBAAY;AAEZ,YAAQ,IAAI,UAAU;AAAA,EACxB,WAAW,QAAQ,WAAW,QAAQ,WAAW;AAC/C,UAAM,OAAOA,WAAU,WAAW,KAAK;AAEvC,QAAI,WAAW;AACb,cAAQ,IAAI,iCAAiC,OAAO,OAAO,IAAI,KAAK,EAAE,EAAE;AAAA,IAC1E,OAAO;AACL,cAAQ,IAAI,wDAAwD;AAAA,IACtE;AAEA,gBAAY;AAAA,EACd,OAAO;AACL,YAAQ,IAAI,wBAAwB;AAAA,EACtC;AAEA,UAAQ;AAAA,IACN;AAAA,UAAaC,UAAS,QAAQ,YAAYA,UAAS,SAAS,SAAS,IAAIA,UAAS,OAAO,UAAU,CAAC,CAAC;AAAA,EACvG;AAEA,MAAI,CAAC,WAAW;AACd,YAAQ;AAAA,MACN;AAAA;AAAA;AAAA,IACF;AAAA,EACF;AACF;;;ADrCO,IAAMC,aAAY,IAAIC,SAAQ,WAAW,EAC7C,YAAY,IAAI,SAAS,OAAO,EAAE,QAAQ,CAAC,WAAW,UAAU,QAAQ,CAAC,CAAC,EAC1E,UAAU,IAAIC,QAAO,YAAY,mCAAmC,EAAE,UAAU,SAAS,CAAC,EAC1F,OAAO,aAAa,oCAAoC,EACxD;AAAA,EAAO,CAAC,KAAyB,YAChC,kBAAkB,SAAS,GAAG;AAChC;;;AENF,IAAMC,aAAY,IAAI,UAAU;AAEhC,IAAM,qBAAqB,CAAC,YAAY,gBAAgB,gBAAgB;AAExE,SAAS,eAAe,MAAgB;AACtC,SAAO,KAAK,OAA+B,CAAC,QAAQ,KAAK,OAAO,UAAU;AACxE,QAAI,IAAI,SAAS,GAAG,GAAG;AACrB,YAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,GAAG;AAElC,UAAI,mBAAmB,SAAS,GAAG,GAAG;AACpC,eAAO,iCACF,SADE;AAAA,UAEL,CAAC,GAAG,GAAG;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,QAAI,mBAAmB,SAAS,GAAG,GAAG;AACpC,YAAM,YACJ,MAAM,QAAQ,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,EAAE,WAAW,IAAI,IAAI,MAAM,QAAQ,CAAC,IAAI;AAE9E,UAAI,aAAa,CAAC,UAAU,SAAS,IAAI,GAAG;AAC1C,eAAO,iCACF,SADE;AAAA,UAEL,CAAC,GAAG,GAAG;AAAA,QACT;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,GAAG,CAAC,CAAC;AACP;AAEO,IAAM,mBAAmB,CAAO,YAAqB;AAE1D,QAAM,oBAAoB,QAAQ,SAAS,IAAI,CAAC,QAAQ,IAAI,KAAK;AAEjE,QAAM,CAAC,cAAc,UAAU,GAAG,IAAI,IAAI,QAAQ;AAKlD,MAAI,CAAC,kBAAkB,SAAS,WAAW,GAAG;AAG5C,WAAO,MAAMA,WAAU,MAAM,UAAU,mBAClC,eAAe,IAAI,EACvB;AAAA,EACH;AAIA,SAAO,MAAMA,WAAU,MAAM,aAAa,mBACrC,eAAe,IAAI,EACvB;AACH;AAEO,IAAM,oBAAoB,MAAY;AAC3C,QAAMA,WAAU,UAAU,cAAc;AAC1C;;;A1BlDA,QAAQ,IAAIC,UAAS,cAAc;AAAA,SAAO,gBAAa,IAAI,KAAK,gBAAa,OAAO;AAAA,CAAI,CAAC;AAEzF,QACG,KAAK,gBAAa,IAAI,EACtB,QAAQ,gBAAa,OAAO,EAC5B,YAAY,uDAAuD,EACnE,WAAW,QAAQ,EAAE,WAAW,KAAK,CAAC,EACtC,WAAW,IAAI,EACf,WAAW,WAAW,EACtB,WAAWC,UAAS,EACpB,KAAK,aAAa,gBAAgB,EAClC,KAAK,cAAc,iBAAiB;AAEvC,QAAQ,MAAM,QAAQ,IAAI;","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.
|
|
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": "^
|
|
16
|
+
"node": "^24.0.0"
|
|
12
17
|
},
|
|
13
18
|
"dependencies": {
|
|
14
19
|
"@commander-js/extra-typings": "^14.0.0",
|