@bigcommerce/create-catalyst 0.13.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +303 -99
- package/dist/index.js.map +1 -1
- package/package.json +8 -5
package/dist/index.js
CHANGED
|
@@ -58,7 +58,7 @@ import chalk7 from "chalk";
|
|
|
58
58
|
// package.json
|
|
59
59
|
var package_default = {
|
|
60
60
|
name: "@bigcommerce/create-catalyst",
|
|
61
|
-
version: "0.
|
|
61
|
+
version: "0.14.0",
|
|
62
62
|
type: "module",
|
|
63
63
|
bin: "bin/index.cjs",
|
|
64
64
|
files: [
|
|
@@ -78,8 +78,10 @@ var package_default = {
|
|
|
78
78
|
dependencies: {
|
|
79
79
|
"@commander-js/extra-typings": "^12.1.0",
|
|
80
80
|
"@inquirer/prompts": "^7.0.0",
|
|
81
|
+
"@segment/analytics-node": "^2.2.0",
|
|
81
82
|
chalk: "^5.3.0",
|
|
82
83
|
commander: "^12.1.0",
|
|
84
|
+
conf: "^13.0.1",
|
|
83
85
|
dotenv: "^16.4.5",
|
|
84
86
|
"fs-extra": "^11.2.0",
|
|
85
87
|
giget: "^1.2.3",
|
|
@@ -87,67 +89,40 @@ var package_default = {
|
|
|
87
89
|
nypm: "^0.3.12",
|
|
88
90
|
ora: "^8.1.0",
|
|
89
91
|
semver: "^7.6.3",
|
|
92
|
+
"std-env": "^3.7.0",
|
|
90
93
|
zod: "^3.23.8",
|
|
91
94
|
"zod-validation-error": "^3.4.0"
|
|
92
95
|
},
|
|
93
96
|
devDependencies: {
|
|
94
97
|
"@bigcommerce/eslint-config": "^2.9.1",
|
|
95
98
|
"@bigcommerce/eslint-config-catalyst": "workspace:^",
|
|
96
|
-
"@swc/core": "^1.7.
|
|
99
|
+
"@swc/core": "^1.7.35",
|
|
97
100
|
"@swc/jest": "^0.2.36",
|
|
98
101
|
"@types/fs-extra": "^11.0.4",
|
|
99
102
|
"@types/jest": "^29.5.13",
|
|
100
103
|
"@types/lodash.kebabcase": "^4.1.9",
|
|
101
|
-
"@types/node": "^20.16.
|
|
104
|
+
"@types/node": "^20.16.11",
|
|
102
105
|
"@types/prompts": "^2.4.9",
|
|
103
106
|
"@types/semver": "^7.5.8",
|
|
104
107
|
eslint: "^8.57.1",
|
|
105
108
|
jest: "^29.7.0",
|
|
106
|
-
msw: "^2.4.
|
|
109
|
+
msw: "^2.4.11",
|
|
107
110
|
prettier: "^3.3.3",
|
|
108
111
|
tsup: "^8.3.0",
|
|
109
|
-
typescript: "^5.6.
|
|
112
|
+
typescript: "^5.6.3"
|
|
110
113
|
}
|
|
111
114
|
};
|
|
112
115
|
|
|
113
116
|
// src/commands/create.ts
|
|
114
117
|
import { Command, Option } from "@commander-js/extra-typings";
|
|
115
118
|
import { input, select as select2 } from "@inquirer/prompts";
|
|
116
|
-
import
|
|
119
|
+
import chalk4 from "chalk";
|
|
117
120
|
import { execSync as execSync4 } from "child_process";
|
|
118
121
|
import { pathExistsSync } from "fs-extra/esm";
|
|
119
122
|
import kebabCase from "lodash.kebabcase";
|
|
120
123
|
import { join as join2 } from "path";
|
|
121
124
|
import { z as z3 } from "zod";
|
|
122
125
|
|
|
123
|
-
// src/utils/check-storefront-limit.ts
|
|
124
|
-
import chalk from "chalk";
|
|
125
|
-
var checkStorefrontLimit = (channels, storeInfo) => {
|
|
126
|
-
const { data: availableChannels } = channels;
|
|
127
|
-
const { features } = storeInfo;
|
|
128
|
-
if (availableChannels.length >= features.storefront_limits.total_including_inactive) {
|
|
129
|
-
console.error(
|
|
130
|
-
chalk.yellow(
|
|
131
|
-
`You have reached the maximum number of storefronts allowed for your plan. Please select an existing channel below, purchase additional storefront seats in your BigCommerce Control Panel, or contact BigCommerce Support: ${chalk.cyan(
|
|
132
|
-
"https://support.bigcommerce.com"
|
|
133
|
-
)}
|
|
134
|
-
`
|
|
135
|
-
)
|
|
136
|
-
);
|
|
137
|
-
return false;
|
|
138
|
-
}
|
|
139
|
-
const activeChannels = availableChannels.filter((channel) => channel.status === "active");
|
|
140
|
-
if (activeChannels.length >= features.storefront_limits.active) {
|
|
141
|
-
console.error(
|
|
142
|
-
chalk.yellow(
|
|
143
|
-
"You have reached the maximum number of active storefronts allowed for your plan. Please select an existing channel below, de-activate an active channel, or purchase additional storefront seats in your BigCommerce Control Panel.\n"
|
|
144
|
-
)
|
|
145
|
-
);
|
|
146
|
-
return false;
|
|
147
|
-
}
|
|
148
|
-
return true;
|
|
149
|
-
};
|
|
150
|
-
|
|
151
126
|
// src/utils/clone-catalyst.ts
|
|
152
127
|
import { execSync as execSync3 } from "child_process";
|
|
153
128
|
|
|
@@ -176,12 +151,11 @@ function checkoutRef(repoDir, ref) {
|
|
|
176
151
|
} else {
|
|
177
152
|
console.error(`Error checking out ref '${ref}':`, stderr.trim());
|
|
178
153
|
}
|
|
179
|
-
}
|
|
154
|
+
}
|
|
155
|
+
if (error instanceof Error) {
|
|
180
156
|
console.error(`Error checking out ref '${ref}':`, error.message);
|
|
181
|
-
} else {
|
|
182
|
-
console.error(`Unknown error occurred while checking out ref '${ref}'.`);
|
|
183
157
|
}
|
|
184
|
-
|
|
158
|
+
console.error(`Unknown error occurred while checking out ref '${ref}'.`);
|
|
185
159
|
}
|
|
186
160
|
}
|
|
187
161
|
|
|
@@ -209,15 +183,15 @@ function hasGitHubSSH() {
|
|
|
209
183
|
|
|
210
184
|
// src/utils/clone-catalyst.ts
|
|
211
185
|
var cloneCatalyst = ({
|
|
186
|
+
repository,
|
|
212
187
|
projectName,
|
|
213
188
|
projectDir,
|
|
214
189
|
ghRef
|
|
215
190
|
}) => {
|
|
216
|
-
const repositoryName = "bigcommerce/catalyst";
|
|
217
191
|
const useSSH = hasGitHubSSH();
|
|
218
|
-
console.log(`Cloning ${
|
|
192
|
+
console.log(`Cloning ${repository} using ${useSSH ? "SSH" : "HTTPS"}...
|
|
219
193
|
`);
|
|
220
|
-
const cloneCommand = `git clone ${useSSH ? `git@github.com:${
|
|
194
|
+
const cloneCommand = `git clone ${useSSH ? `git@github.com:${repository}` : `https://github.com/${repository}`}.git${projectName ? ` ${projectName}` : ""}`;
|
|
221
195
|
execSync3(cloneCommand, { stdio: "inherit" });
|
|
222
196
|
console.log();
|
|
223
197
|
execSync3("git remote rename origin upstream", { cwd: projectDir, stdio: "inherit" });
|
|
@@ -229,7 +203,7 @@ var cloneCatalyst = ({
|
|
|
229
203
|
};
|
|
230
204
|
|
|
231
205
|
// src/utils/https.ts
|
|
232
|
-
import
|
|
206
|
+
import chalk from "chalk";
|
|
233
207
|
import { z as z2 } from "zod";
|
|
234
208
|
|
|
235
209
|
// src/utils/parse.ts
|
|
@@ -246,6 +220,56 @@ var parse = (data, schema) => {
|
|
|
246
220
|
}
|
|
247
221
|
};
|
|
248
222
|
|
|
223
|
+
// src/utils/user-agent.ts
|
|
224
|
+
import {
|
|
225
|
+
isDevelopment,
|
|
226
|
+
isLinux,
|
|
227
|
+
isMacOS,
|
|
228
|
+
isProduction,
|
|
229
|
+
isTest,
|
|
230
|
+
isWindows,
|
|
231
|
+
nodeVersion,
|
|
232
|
+
process as process2,
|
|
233
|
+
provider,
|
|
234
|
+
runtime
|
|
235
|
+
} from "std-env";
|
|
236
|
+
var { name, version } = package_default;
|
|
237
|
+
var getOS = () => {
|
|
238
|
+
if (isWindows) return "Windows";
|
|
239
|
+
if (isMacOS) return "macOS";
|
|
240
|
+
if (isLinux) return "Linux";
|
|
241
|
+
return "Unknown OS";
|
|
242
|
+
};
|
|
243
|
+
var getEnv = () => {
|
|
244
|
+
if (isDevelopment) return "Development";
|
|
245
|
+
if (isTest) return "Test";
|
|
246
|
+
if (isProduction) return "Production";
|
|
247
|
+
return "Unknown Env";
|
|
248
|
+
};
|
|
249
|
+
var getPlatform = () => {
|
|
250
|
+
const os = getOS();
|
|
251
|
+
const env = getEnv();
|
|
252
|
+
const keysOfInterest = [
|
|
253
|
+
os,
|
|
254
|
+
env,
|
|
255
|
+
runtime,
|
|
256
|
+
provider,
|
|
257
|
+
`Node ${nodeVersion}`,
|
|
258
|
+
process2.env.NODE_ENV
|
|
259
|
+
].filter(Boolean);
|
|
260
|
+
return keysOfInterest.join("; ");
|
|
261
|
+
};
|
|
262
|
+
var detectedPlatform = getPlatform();
|
|
263
|
+
var getCLIUserAgent = (platform, extensions) => {
|
|
264
|
+
const userAgentParts = [`${name}/${version}`];
|
|
265
|
+
const platformValue = platform != null ? platform : detectedPlatform;
|
|
266
|
+
userAgentParts.push(`(${platformValue})`);
|
|
267
|
+
if (extensions) {
|
|
268
|
+
userAgentParts.push(extensions);
|
|
269
|
+
}
|
|
270
|
+
return userAgentParts.join(" ");
|
|
271
|
+
};
|
|
272
|
+
|
|
249
273
|
// src/utils/https.ts
|
|
250
274
|
var BigCommerceStoreInfo = z2.object({
|
|
251
275
|
features: z2.object({
|
|
@@ -283,6 +307,7 @@ var Https = class {
|
|
|
283
307
|
this.sampleDataApiUrl = sampleDataApiUrl != null ? sampleDataApiUrl : "";
|
|
284
308
|
this.storeHash = storeHash != null ? storeHash : "";
|
|
285
309
|
this.accessToken = accessToken != null ? accessToken : "";
|
|
310
|
+
this.userAgent = getCLIUserAgent();
|
|
286
311
|
}
|
|
287
312
|
auth(path, opts = {}) {
|
|
288
313
|
if (!this.bigCommerceAuthUrl) {
|
|
@@ -293,7 +318,8 @@ var Https = class {
|
|
|
293
318
|
method: "POST",
|
|
294
319
|
headers: __spreadProps(__spreadValues({}, headers), {
|
|
295
320
|
Accept: "application/json",
|
|
296
|
-
"Content-Type": "application/json"
|
|
321
|
+
"Content-Type": "application/json",
|
|
322
|
+
"User-Agent": this.userAgent
|
|
297
323
|
})
|
|
298
324
|
}, rest);
|
|
299
325
|
return fetch(`${this.bigCommerceAuthUrl}${path}`, options);
|
|
@@ -303,20 +329,20 @@ var Https = class {
|
|
|
303
329
|
const response = yield this.auth("/device/token", {
|
|
304
330
|
body: JSON.stringify({
|
|
305
331
|
scopes: [
|
|
332
|
+
"store_channel_settings",
|
|
333
|
+
"store_sites",
|
|
334
|
+
"store_storefront_api",
|
|
335
|
+
"store_storefront_api_customer_impersonation",
|
|
306
336
|
"store_v2_content",
|
|
307
337
|
"store_v2_information",
|
|
308
|
-
"store_v2_products"
|
|
309
|
-
"store_cart",
|
|
310
|
-
"store_sites",
|
|
311
|
-
"store_channel_settings",
|
|
312
|
-
"store_storefront_api_customer_impersonation"
|
|
338
|
+
"store_v2_products"
|
|
313
339
|
].join(" "),
|
|
314
340
|
client_id: this.DEVICE_OAUTH_CLIENT_ID
|
|
315
341
|
})
|
|
316
342
|
});
|
|
317
343
|
if (!response.ok) {
|
|
318
344
|
console.error(
|
|
319
|
-
|
|
345
|
+
chalk.red(`
|
|
320
346
|
POST /device/token failed: ${response.status} ${response.statusText}
|
|
321
347
|
`)
|
|
322
348
|
);
|
|
@@ -362,7 +388,8 @@ POST /device/token failed: ${response.status} ${response.statusText}
|
|
|
362
388
|
const options = __spreadValues({
|
|
363
389
|
headers: __spreadProps(__spreadValues({}, headers), {
|
|
364
390
|
Accept: "application/json",
|
|
365
|
-
"X-Auth-Token": this.accessToken
|
|
391
|
+
"X-Auth-Token": this.accessToken,
|
|
392
|
+
"User-Agent": this.userAgent
|
|
366
393
|
})
|
|
367
394
|
}, rest);
|
|
368
395
|
return fetch(`${this.bigCommerceApiUrl}/stores/${this.storeHash}${path}`, options);
|
|
@@ -371,7 +398,7 @@ POST /device/token failed: ${response.status} ${response.statusText}
|
|
|
371
398
|
return __async(this, null, function* () {
|
|
372
399
|
const res = yield this.api("/v2/store");
|
|
373
400
|
if (!res.ok) {
|
|
374
|
-
console.error(
|
|
401
|
+
console.error(chalk.red(`
|
|
375
402
|
GET /v2/store failed: ${res.status} ${res.statusText}
|
|
376
403
|
`));
|
|
377
404
|
process.exit(1);
|
|
@@ -383,7 +410,7 @@ GET /v2/store failed: ${res.status} ${res.statusText}
|
|
|
383
410
|
return __async(this, null, function* () {
|
|
384
411
|
const res = yield this.api(`/v3/channels${query}`);
|
|
385
412
|
if (!res.ok) {
|
|
386
|
-
console.error(
|
|
413
|
+
console.error(chalk.red(`
|
|
387
414
|
GET /v3/channels failed: ${res.status} ${res.statusText}
|
|
388
415
|
`));
|
|
389
416
|
process.exit(1);
|
|
@@ -408,7 +435,7 @@ GET /v3/channels failed: ${res.status} ${res.statusText}
|
|
|
408
435
|
});
|
|
409
436
|
if (!res.ok) {
|
|
410
437
|
console.warn(
|
|
411
|
-
|
|
438
|
+
chalk.yellow(
|
|
412
439
|
`
|
|
413
440
|
Failed to create channel menus: ${res.status} ${res.statusText}. You may want to create these later: https://developer.bigcommerce.com/docs/rest-management/channels/menus#create-channel-menus
|
|
414
441
|
`
|
|
@@ -426,7 +453,7 @@ Failed to create channel menus: ${res.status} ${res.statusText}. You may want to
|
|
|
426
453
|
});
|
|
427
454
|
if (!res.ok) {
|
|
428
455
|
console.error(
|
|
429
|
-
|
|
456
|
+
chalk.red(
|
|
430
457
|
`
|
|
431
458
|
POST /v3/storefront/api-token-customer-impersonation failed: ${res.status} ${res.statusText}
|
|
432
459
|
`
|
|
@@ -454,11 +481,36 @@ POST /v3/storefront/api-token-customer-impersonation failed: ${res.status} ${res
|
|
|
454
481
|
headers: __spreadProps(__spreadValues({}, headers), {
|
|
455
482
|
Accept: "application/json",
|
|
456
483
|
"Content-Type": "application/json",
|
|
457
|
-
"X-Auth-Token": this.accessToken
|
|
484
|
+
"X-Auth-Token": this.accessToken,
|
|
485
|
+
"User-Agent": this.userAgent
|
|
458
486
|
})
|
|
459
487
|
}, rest);
|
|
460
488
|
return fetch(`${this.sampleDataApiUrl}/stores/${this.storeHash}${path}`, options);
|
|
461
489
|
}
|
|
490
|
+
checkEligibility() {
|
|
491
|
+
return __async(this, null, function* () {
|
|
492
|
+
const res = yield this.sampleDataApi("/v3/channels/catalyst/eligibility", {
|
|
493
|
+
method: "GET"
|
|
494
|
+
});
|
|
495
|
+
if (!res.ok) {
|
|
496
|
+
console.error(
|
|
497
|
+
chalk.red(
|
|
498
|
+
`
|
|
499
|
+
GET /v3/channels/catalyst/eligibility failed: ${res.status} ${res.statusText}
|
|
500
|
+
`
|
|
501
|
+
)
|
|
502
|
+
);
|
|
503
|
+
process.exit(1);
|
|
504
|
+
}
|
|
505
|
+
const CheckEligibilitySchema = z2.object({
|
|
506
|
+
data: z2.object({
|
|
507
|
+
eligible: z2.boolean(),
|
|
508
|
+
message: z2.string()
|
|
509
|
+
})
|
|
510
|
+
});
|
|
511
|
+
return parse(yield res.json(), CheckEligibilitySchema);
|
|
512
|
+
});
|
|
513
|
+
}
|
|
462
514
|
createChannel(channelName) {
|
|
463
515
|
return __async(this, null, function* () {
|
|
464
516
|
const res = yield this.sampleDataApi("/v3/channels/catalyst", {
|
|
@@ -466,7 +518,7 @@ POST /v3/storefront/api-token-customer-impersonation failed: ${res.status} ${res
|
|
|
466
518
|
});
|
|
467
519
|
if (!res.ok) {
|
|
468
520
|
console.error(
|
|
469
|
-
|
|
521
|
+
chalk.red(`
|
|
470
522
|
POST /v3/channels/catalyst failed: ${res.status} ${res.statusText}
|
|
471
523
|
`)
|
|
472
524
|
);
|
|
@@ -485,7 +537,7 @@ POST /v3/channels/catalyst failed: ${res.status} ${res.statusText}
|
|
|
485
537
|
};
|
|
486
538
|
|
|
487
539
|
// src/utils/install-dependencies.ts
|
|
488
|
-
import
|
|
540
|
+
import chalk2 from "chalk";
|
|
489
541
|
import { installDependencies as installDeps } from "nypm";
|
|
490
542
|
|
|
491
543
|
// src/utils/spinner.ts
|
|
@@ -504,13 +556,13 @@ var installDependencies = (projectDir) => __async(void 0, null, function* () {
|
|
|
504
556
|
return spinner(installAllDeps(projectDir), {
|
|
505
557
|
text: `Installing dependencies. This could take a minute...`,
|
|
506
558
|
successText: `Dependencies installed successfully`,
|
|
507
|
-
failText: (err) =>
|
|
559
|
+
failText: (err) => chalk2.red(`Failed to install dependencies: ${err.message}`)
|
|
508
560
|
});
|
|
509
561
|
});
|
|
510
562
|
|
|
511
563
|
// src/utils/login.ts
|
|
512
564
|
import { select } from "@inquirer/prompts";
|
|
513
|
-
import
|
|
565
|
+
import chalk3 from "chalk";
|
|
514
566
|
var poll = (auth, deviceCode, interval, expiresIn) => __async(void 0, null, function* () {
|
|
515
567
|
const intervalMs = interval * 1e3;
|
|
516
568
|
const expiresAtMs = expiresIn * 1e3;
|
|
@@ -522,7 +574,7 @@ var poll = (auth, deviceCode, interval, expiresIn) => __async(void 0, null, func
|
|
|
522
574
|
}
|
|
523
575
|
yield new Promise((resolve) => setTimeout(resolve, intervalMs));
|
|
524
576
|
}
|
|
525
|
-
console.error(
|
|
577
|
+
console.error(chalk3.red("\nDevice code expired. Please try again.\n"));
|
|
526
578
|
process.exit(1);
|
|
527
579
|
});
|
|
528
580
|
var login = (bigCommerceAuthUrl, storeHash, accessToken) => __async(void 0, null, function* () {
|
|
@@ -544,11 +596,11 @@ var login = (bigCommerceAuthUrl, storeHash, accessToken) => __async(void 0, null
|
|
|
544
596
|
console.log(
|
|
545
597
|
[
|
|
546
598
|
`
|
|
547
|
-
Please visit ${
|
|
599
|
+
Please visit ${chalk3.cyan(deviceCode.verification_uri)} and enter the code: ${chalk3.yellow(
|
|
548
600
|
deviceCode.user_code
|
|
549
601
|
)}
|
|
550
602
|
`,
|
|
551
|
-
`The code will expire in ${
|
|
603
|
+
`The code will expire in ${chalk3.yellow(`${deviceCode.expires_in / 60} minutes`)}
|
|
552
604
|
`
|
|
553
605
|
].join("\n")
|
|
554
606
|
);
|
|
@@ -566,8 +618,103 @@ Please visit ${chalk4.cyan(deviceCode.verification_uri)} and enter the code: ${c
|
|
|
566
618
|
};
|
|
567
619
|
});
|
|
568
620
|
|
|
569
|
-
// src/utils/
|
|
621
|
+
// src/utils/telemetry/telemetry.ts
|
|
622
|
+
import { Analytics } from "@segment/analytics-node";
|
|
623
|
+
import Conf from "conf";
|
|
570
624
|
import { randomBytes } from "crypto";
|
|
625
|
+
var TELEMETRY_KEY_ENABLED = "telemetry.enabled";
|
|
626
|
+
var TELEMETRY_KEY_ID = `telemetry.anonymousId`;
|
|
627
|
+
var Telemetry = class {
|
|
628
|
+
constructor() {
|
|
629
|
+
this.projectName = "catalyst-cli";
|
|
630
|
+
this.projectVersion = package_default.version;
|
|
631
|
+
this.setEnabled = (_enabled) => {
|
|
632
|
+
var _a, _b;
|
|
633
|
+
const enabled = Boolean(_enabled);
|
|
634
|
+
(_a = this.conf) == null ? void 0 : _a.set(TELEMETRY_KEY_ENABLED, enabled);
|
|
635
|
+
return (_b = this.conf) == null ? void 0 : _b.path;
|
|
636
|
+
};
|
|
637
|
+
this.CATALYST_TELEMETRY_DISABLED = process.env.CATALYST_TELEMETRY_DISABLED;
|
|
638
|
+
try {
|
|
639
|
+
this.conf = new Conf({
|
|
640
|
+
projectName: this.projectName,
|
|
641
|
+
projectVersion: this.projectVersion
|
|
642
|
+
});
|
|
643
|
+
} catch (e) {
|
|
644
|
+
this.conf = null;
|
|
645
|
+
}
|
|
646
|
+
this.sessionId = randomBytes(32).toString("hex");
|
|
647
|
+
this.analytics = new Analytics({
|
|
648
|
+
writeKey: "not-a-valid-segment-write-key"
|
|
649
|
+
});
|
|
650
|
+
}
|
|
651
|
+
track(eventName, payload) {
|
|
652
|
+
return __async(this, null, function* () {
|
|
653
|
+
yield new Promise((resolve) => {
|
|
654
|
+
if (!this.isEnabled()) {
|
|
655
|
+
resolve(void 0);
|
|
656
|
+
}
|
|
657
|
+
this.analytics.track(
|
|
658
|
+
{
|
|
659
|
+
event: eventName,
|
|
660
|
+
anonymousId: this.getAnonymousId(),
|
|
661
|
+
properties: __spreadProps(__spreadValues({}, payload), {
|
|
662
|
+
sessionId: this.sessionId
|
|
663
|
+
}),
|
|
664
|
+
context: {
|
|
665
|
+
app: {
|
|
666
|
+
name: this.projectName,
|
|
667
|
+
version: this.projectVersion
|
|
668
|
+
}
|
|
669
|
+
}
|
|
670
|
+
},
|
|
671
|
+
resolve
|
|
672
|
+
);
|
|
673
|
+
});
|
|
674
|
+
});
|
|
675
|
+
}
|
|
676
|
+
identify(storeHash) {
|
|
677
|
+
return __async(this, null, function* () {
|
|
678
|
+
yield new Promise((resolve) => {
|
|
679
|
+
if (!this.isEnabled()) {
|
|
680
|
+
resolve(void 0);
|
|
681
|
+
}
|
|
682
|
+
if (!storeHash) {
|
|
683
|
+
resolve(void 0);
|
|
684
|
+
}
|
|
685
|
+
this.analytics.identify(
|
|
686
|
+
{
|
|
687
|
+
userId: storeHash,
|
|
688
|
+
anonymousId: this.getAnonymousId(),
|
|
689
|
+
context: {
|
|
690
|
+
app: {
|
|
691
|
+
name: this.projectName,
|
|
692
|
+
version: this.projectVersion
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
},
|
|
696
|
+
resolve
|
|
697
|
+
);
|
|
698
|
+
});
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
isEnabled() {
|
|
702
|
+
return !this.CATALYST_TELEMETRY_DISABLED && !!this.conf && this.conf.get(TELEMETRY_KEY_ENABLED, true);
|
|
703
|
+
}
|
|
704
|
+
getAnonymousId() {
|
|
705
|
+
var _a, _b;
|
|
706
|
+
const val = (_a = this.conf) == null ? void 0 : _a.get(TELEMETRY_KEY_ID);
|
|
707
|
+
if (val) {
|
|
708
|
+
return val;
|
|
709
|
+
}
|
|
710
|
+
const generated = randomBytes(32).toString("hex");
|
|
711
|
+
(_b = this.conf) == null ? void 0 : _b.set(TELEMETRY_KEY_ID, generated);
|
|
712
|
+
return generated;
|
|
713
|
+
}
|
|
714
|
+
};
|
|
715
|
+
|
|
716
|
+
// src/utils/write-env.ts
|
|
717
|
+
import { randomBytes as randomBytes2 } from "crypto";
|
|
571
718
|
import { outputFileSync } from "fs-extra/esm";
|
|
572
719
|
import { join } from "path";
|
|
573
720
|
var writeEnv = (projectDir, {
|
|
@@ -582,7 +729,7 @@ var writeEnv = (projectDir, {
|
|
|
582
729
|
`BIGCOMMERCE_CHANNEL_ID=${channelId}`,
|
|
583
730
|
`BIGCOMMERCE_CUSTOMER_IMPERSONATION_TOKEN=${customerImpersonationToken}`,
|
|
584
731
|
"",
|
|
585
|
-
`AUTH_SECRET=${
|
|
732
|
+
`AUTH_SECRET=${randomBytes2(32).toString("hex")}`,
|
|
586
733
|
`CLIENT_LOGGER=false`,
|
|
587
734
|
`ENABLE_ADMIN_ROUTE=true`,
|
|
588
735
|
`DEFAULT_REVALIDATE_TARGET=3600`
|
|
@@ -591,23 +738,24 @@ var writeEnv = (projectDir, {
|
|
|
591
738
|
};
|
|
592
739
|
|
|
593
740
|
// src/commands/create.ts
|
|
594
|
-
var
|
|
741
|
+
var telemetry = new Telemetry();
|
|
742
|
+
var create = new Command("create").description("Command to scaffold and connect a Catalyst storefront to your BigCommerce store").option("--project-name <name>", "Name of your Catalyst project").option("--project-dir <dir>", "Directory in which to create your project", process.cwd()).option("--store-hash <hash>", "BigCommerce store hash").option("--access-token <token>", "BigCommerce access token").option("--channel-id <id>", "BigCommerce channel ID").option("--customer-impersonation-token <token>", "BigCommerce customer impersonation token").option("--gh-ref <ref>", "Clone a specific ref from the source repository").option("--repository <repository>", "GitHub repository to clone from", "bigcommerce/catalyst").addOption(
|
|
595
743
|
new Option("--bigcommerce-hostname <hostname>", "BigCommerce hostname").default("bigcommerce.com").hideHelp()
|
|
596
744
|
).addOption(
|
|
597
745
|
new Option("--sample-data-api-url <url>", "BigCommerce sample data API URL").default("https://api.bc-sample.store").hideHelp()
|
|
598
746
|
).action((options) => __async(void 0, null, function* () {
|
|
599
|
-
const { ghRef } = options;
|
|
747
|
+
const { ghRef, repository } = options;
|
|
600
748
|
try {
|
|
601
749
|
execSync4("which git", { stdio: "ignore" });
|
|
602
750
|
} catch (e) {
|
|
603
|
-
console.error(
|
|
751
|
+
console.error(chalk4.red("Error: git is required to create a Catalyst project\n"));
|
|
604
752
|
process.exit(1);
|
|
605
753
|
}
|
|
606
754
|
try {
|
|
607
755
|
execSync4("which pnpm", { stdio: "ignore" });
|
|
608
756
|
} catch (e) {
|
|
609
|
-
console.error(
|
|
610
|
-
console.error(
|
|
757
|
+
console.error(chalk4.red("Error: pnpm is required to create a Catalyst project\n"));
|
|
758
|
+
console.error(chalk4.yellow("Tip: Enable it by running `corepack enable pnpm`\n"));
|
|
611
759
|
process.exit(1);
|
|
612
760
|
}
|
|
613
761
|
const URLSchema = z3.string().url();
|
|
@@ -624,7 +772,7 @@ var create = new Command("create").description("Command to scaffold and connect
|
|
|
624
772
|
channelId = parseInt(options.channelId, 10);
|
|
625
773
|
}
|
|
626
774
|
if (!pathExistsSync(options.projectDir)) {
|
|
627
|
-
console.error(
|
|
775
|
+
console.error(chalk4.red(`Error: --projectDir ${options.projectDir} is not a valid path
|
|
628
776
|
`));
|
|
629
777
|
process.exit(1);
|
|
630
778
|
}
|
|
@@ -632,7 +780,7 @@ var create = new Command("create").description("Command to scaffold and connect
|
|
|
632
780
|
projectName = kebabCase(options.projectName);
|
|
633
781
|
projectDir = join2(options.projectDir, projectName);
|
|
634
782
|
if (pathExistsSync(projectDir)) {
|
|
635
|
-
console.error(
|
|
783
|
+
console.error(chalk4.red(`Error: ${projectDir} already exists
|
|
636
784
|
`));
|
|
637
785
|
process.exit(1);
|
|
638
786
|
}
|
|
@@ -664,30 +812,37 @@ var create = new Command("create").description("Command to scaffold and connect
|
|
|
664
812
|
console.log(`
|
|
665
813
|
Creating '${projectName}' at '${projectDir}'
|
|
666
814
|
`);
|
|
667
|
-
cloneCatalyst({
|
|
815
|
+
cloneCatalyst({ repository, projectName, projectDir, ghRef });
|
|
668
816
|
yield installDependencies(projectDir);
|
|
669
817
|
console.log(
|
|
670
818
|
[
|
|
671
819
|
`
|
|
672
|
-
${
|
|
820
|
+
${chalk4.green("Success!")} Created '${projectName}' at '${projectDir}'
|
|
673
821
|
`,
|
|
674
822
|
`Next steps:`,
|
|
675
|
-
|
|
823
|
+
chalk4.yellow(`
|
|
676
824
|
- cd ${projectName} && cp .env.example .env.local`),
|
|
677
|
-
|
|
825
|
+
chalk4.yellow(`
|
|
678
826
|
- Populate .env.local with your BigCommerce API credentials
|
|
679
827
|
`)
|
|
680
828
|
].join("\n")
|
|
681
829
|
);
|
|
682
830
|
process.exit(0);
|
|
683
831
|
}
|
|
832
|
+
yield telemetry.identify(storeHash);
|
|
684
833
|
if (!channelId || !customerImpersonationToken) {
|
|
685
834
|
const bc = new Https({ bigCommerceApiUrl: bigcommerceApiUrl, storeHash, accessToken });
|
|
686
|
-
const
|
|
687
|
-
|
|
688
|
-
|
|
835
|
+
const sampleDataApi = new Https({
|
|
836
|
+
sampleDataApiUrl,
|
|
837
|
+
storeHash,
|
|
838
|
+
accessToken
|
|
839
|
+
});
|
|
840
|
+
const eligibilityResponse = yield sampleDataApi.checkEligibility();
|
|
841
|
+
if (!eligibilityResponse.data.eligible) {
|
|
842
|
+
console.warn(chalk4.yellow(eligibilityResponse.data.message));
|
|
843
|
+
}
|
|
689
844
|
let shouldCreateChannel;
|
|
690
|
-
if (
|
|
845
|
+
if (eligibilityResponse.data.eligible) {
|
|
691
846
|
shouldCreateChannel = yield select2({
|
|
692
847
|
message: "Would you like to create a new channel?",
|
|
693
848
|
choices: [
|
|
@@ -700,11 +855,6 @@ ${chalk5.green("Success!")} Created '${projectName}' at '${projectDir}'
|
|
|
700
855
|
const newChannelName = yield input({
|
|
701
856
|
message: "What would you like to name your new channel?"
|
|
702
857
|
});
|
|
703
|
-
const sampleDataApi = new Https({
|
|
704
|
-
sampleDataApiUrl,
|
|
705
|
-
storeHash,
|
|
706
|
-
accessToken
|
|
707
|
-
});
|
|
708
858
|
const {
|
|
709
859
|
data: { id: createdChannelId, storefront_api_token: storefrontApiToken }
|
|
710
860
|
} = yield sampleDataApi.createChannel(newChannelName);
|
|
@@ -714,6 +864,7 @@ ${chalk5.green("Success!")} Created '${projectName}' at '${projectDir}'
|
|
|
714
864
|
}
|
|
715
865
|
if (!shouldCreateChannel) {
|
|
716
866
|
const channelSortOrder = ["catalyst", "next", "bigcommerce"];
|
|
867
|
+
const availableChannels = yield bc.channels("?available=true&type=storefront");
|
|
717
868
|
const existingChannel = yield select2({
|
|
718
869
|
message: "Which channel would you like to use?",
|
|
719
870
|
choices: availableChannels.data.sort(
|
|
@@ -737,7 +888,7 @@ ${chalk5.green("Success!")} Created '${projectName}' at '${projectDir}'
|
|
|
737
888
|
console.log(`
|
|
738
889
|
Creating '${projectName}' at '${projectDir}'
|
|
739
890
|
`);
|
|
740
|
-
cloneCatalyst({
|
|
891
|
+
cloneCatalyst({ repository, projectName, projectDir, ghRef });
|
|
741
892
|
writeEnv(projectDir, {
|
|
742
893
|
channelId: channelId.toString(),
|
|
743
894
|
storeHash,
|
|
@@ -746,10 +897,10 @@ Creating '${projectName}' at '${projectDir}'
|
|
|
746
897
|
yield installDependencies(projectDir);
|
|
747
898
|
console.log(
|
|
748
899
|
`
|
|
749
|
-
${
|
|
900
|
+
${chalk4.green("Success!")} Created '${projectName}' at '${projectDir}'
|
|
750
901
|
`,
|
|
751
902
|
"\nNext steps:\n",
|
|
752
|
-
|
|
903
|
+
chalk4.yellow(`
|
|
753
904
|
cd ${projectName} && pnpm run dev
|
|
754
905
|
`)
|
|
755
906
|
);
|
|
@@ -758,7 +909,7 @@ cd ${projectName} && pnpm run dev
|
|
|
758
909
|
// src/commands/init.ts
|
|
759
910
|
import { Command as Command2, Option as Option2 } from "@commander-js/extra-typings";
|
|
760
911
|
import { input as input2, select as select3 } from "@inquirer/prompts";
|
|
761
|
-
import
|
|
912
|
+
import chalk5 from "chalk";
|
|
762
913
|
import * as z4 from "zod";
|
|
763
914
|
var init = new Command2("init").description("Connect a BigCommerce store with an existing Catalyst project").option("--store-hash <hash>", "BigCommerce store hash").option("--access-token <token>", "BigCommerce access token").addOption(
|
|
764
915
|
new Option2("--bigcommerce-hostname <hostname>", "BigCommerce hostname").default("bigcommerce.com").hideHelp()
|
|
@@ -781,16 +932,22 @@ var init = new Command2("init").description("Connect a BigCommerce store with an
|
|
|
781
932
|
}
|
|
782
933
|
if (!storeHash || !accessToken) {
|
|
783
934
|
console.log(
|
|
784
|
-
|
|
935
|
+
chalk5.yellow("\nYou must authenticate with a store to overwrite your local environment.\n")
|
|
785
936
|
);
|
|
786
937
|
process.exit(1);
|
|
787
938
|
}
|
|
788
939
|
const bc = new Https({ bigCommerceApiUrl, storeHash, accessToken });
|
|
789
|
-
const
|
|
790
|
-
|
|
791
|
-
|
|
940
|
+
const sampleDataApi = new Https({
|
|
941
|
+
sampleDataApiUrl,
|
|
942
|
+
storeHash,
|
|
943
|
+
accessToken
|
|
944
|
+
});
|
|
945
|
+
const eligibilityResponse = yield sampleDataApi.checkEligibility();
|
|
946
|
+
if (!eligibilityResponse.data.eligible) {
|
|
947
|
+
console.warn(chalk5.yellow(eligibilityResponse.data.message));
|
|
948
|
+
}
|
|
792
949
|
let shouldCreateChannel;
|
|
793
|
-
if (
|
|
950
|
+
if (eligibilityResponse.data.eligible) {
|
|
794
951
|
shouldCreateChannel = yield select3({
|
|
795
952
|
message: "Would you like to create a new channel?",
|
|
796
953
|
choices: [
|
|
@@ -803,11 +960,6 @@ var init = new Command2("init").description("Connect a BigCommerce store with an
|
|
|
803
960
|
const newChannelName = yield input2({
|
|
804
961
|
message: "What would you like to name your new channel?"
|
|
805
962
|
});
|
|
806
|
-
const sampleDataApi = new Https({
|
|
807
|
-
sampleDataApiUrl,
|
|
808
|
-
storeHash,
|
|
809
|
-
accessToken
|
|
810
|
-
});
|
|
811
963
|
const {
|
|
812
964
|
data: { id: createdChannelId, storefront_api_token: storefrontApiToken }
|
|
813
965
|
} = yield sampleDataApi.createChannel(newChannelName);
|
|
@@ -816,6 +968,7 @@ var init = new Command2("init").description("Connect a BigCommerce store with an
|
|
|
816
968
|
}
|
|
817
969
|
if (!shouldCreateChannel) {
|
|
818
970
|
const channelSortOrder = ["catalyst", "next", "bigcommerce"];
|
|
971
|
+
const availableChannels = yield bc.channels("?available=true&type=storefront");
|
|
819
972
|
const existingChannel = yield select3({
|
|
820
973
|
message: "Which channel would you like to use?",
|
|
821
974
|
choices: availableChannels.data.sort(
|
|
@@ -915,10 +1068,61 @@ var integration = new Command3("integration").argument("<integration-name>", "Fo
|
|
|
915
1068
|
console.log("Integration created successfully.");
|
|
916
1069
|
}));
|
|
917
1070
|
|
|
1071
|
+
// src/commands/telemetry.ts
|
|
1072
|
+
import { Argument, Command as Command4, Option as Option3 } from "@commander-js/extra-typings";
|
|
1073
|
+
|
|
1074
|
+
// src/utils/telemetry/index.ts
|
|
1075
|
+
import chalk6 from "chalk";
|
|
1076
|
+
var telemetry2 = new Telemetry();
|
|
1077
|
+
var isEnabled = telemetry2.isEnabled();
|
|
1078
|
+
var catalystTelemetry = (options, arg) => {
|
|
1079
|
+
if (options.enable || arg === "enable") {
|
|
1080
|
+
telemetry2.setEnabled(true);
|
|
1081
|
+
isEnabled = true;
|
|
1082
|
+
console.log("Success!");
|
|
1083
|
+
} else if (options.disable || arg === "disable") {
|
|
1084
|
+
const path = telemetry2.setEnabled(false);
|
|
1085
|
+
if (isEnabled) {
|
|
1086
|
+
console.log(`Your preference has been saved${path ? ` to ${path}` : ""}`);
|
|
1087
|
+
} else {
|
|
1088
|
+
console.log(`Catalyst CLI telemetry collection is already disabled.`);
|
|
1089
|
+
}
|
|
1090
|
+
isEnabled = false;
|
|
1091
|
+
} else {
|
|
1092
|
+
console.log("Catalyst CLI Telemetry");
|
|
1093
|
+
}
|
|
1094
|
+
console.log(
|
|
1095
|
+
`
|
|
1096
|
+
Status: ${chalk6.bold(isEnabled ? chalk6.green("Enabled") : chalk6.red("Disabled"))}`
|
|
1097
|
+
);
|
|
1098
|
+
if (!isEnabled) {
|
|
1099
|
+
console.log(
|
|
1100
|
+
`
|
|
1101
|
+
You have opted-out of Catalyst CLI telemetry.
|
|
1102
|
+
No data will be collected from your machine.`
|
|
1103
|
+
);
|
|
1104
|
+
}
|
|
1105
|
+
};
|
|
1106
|
+
|
|
1107
|
+
// src/commands/telemetry.ts
|
|
1108
|
+
var telemetry3 = new Command4("telemetry").addArgument(new Argument("[arg]").choices(["disable", "enable", "status"])).addOption(new Option3("--enable", `Enables CLI telemetry collection.`).conflicts("disable")).option("--disable", `Disables CLI telemetry collection.`).action(
|
|
1109
|
+
(arg, options) => catalystTelemetry(options, arg)
|
|
1110
|
+
);
|
|
1111
|
+
|
|
1112
|
+
// src/hooks/telemetry.ts
|
|
1113
|
+
var telemetry4 = new Telemetry();
|
|
1114
|
+
var telemetryPreHook = (command) => __async(void 0, null, function* () {
|
|
1115
|
+
const [commandName] = command.args;
|
|
1116
|
+
yield telemetry4.track(commandName, {});
|
|
1117
|
+
});
|
|
1118
|
+
var telemetryPostHook = () => __async(void 0, null, function* () {
|
|
1119
|
+
yield telemetry4.analytics.closeAndFlush();
|
|
1120
|
+
});
|
|
1121
|
+
|
|
918
1122
|
// src/index.ts
|
|
919
1123
|
console.log(chalk7.cyanBright(`
|
|
920
1124
|
\u25E2 ${package_default.name} v${package_default.version}
|
|
921
1125
|
`));
|
|
922
|
-
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);
|
|
1126
|
+
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(telemetry3).hook("preAction", telemetryPreHook).hook("postAction", telemetryPostHook);
|
|
923
1127
|
program.parse(process.argv);
|
|
924
1128
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../package.json","../src/commands/create.ts","../src/utils/check-storefront-limit.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/https.ts","../src/utils/parse.ts","../src/utils/install-dependencies.ts","../src/utils/spinner.ts","../src/utils/login.ts","../src/utils/write-env.ts","../src/commands/init.ts","../src/commands/integration.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';\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\nprogram.parse(process.argv);\n","{\n \"name\": \"@bigcommerce/create-catalyst\",\n \"version\": \"0.13.0\",\n \"type\": \"module\",\n \"bin\": \"bin/index.cjs\",\n \"files\": [\n \"bin\",\n \"dist\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint . --max-warnings 0\",\n \"test\": \"jest\",\n \"build\": \"tsup\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"dependencies\": {\n \"@commander-js/extra-typings\": \"^12.1.0\",\n \"@inquirer/prompts\": \"^7.0.0\",\n \"chalk\": \"^5.3.0\",\n \"commander\": \"^12.1.0\",\n \"dotenv\": \"^16.4.5\",\n \"fs-extra\": \"^11.2.0\",\n \"giget\": \"^1.2.3\",\n \"lodash.kebabcase\": \"^4.1.1\",\n \"nypm\": \"^0.3.12\",\n \"ora\": \"^8.1.0\",\n \"semver\": \"^7.6.3\",\n \"zod\": \"^3.23.8\",\n \"zod-validation-error\": \"^3.4.0\"\n },\n \"devDependencies\": {\n \"@bigcommerce/eslint-config\": \"^2.9.1\",\n \"@bigcommerce/eslint-config-catalyst\": \"workspace:^\",\n \"@swc/core\": \"^1.7.26\",\n \"@swc/jest\": \"^0.2.36\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/jest\": \"^29.5.13\",\n \"@types/lodash.kebabcase\": \"^4.1.9\",\n \"@types/node\": \"^20.16.10\",\n \"@types/prompts\": \"^2.4.9\",\n \"@types/semver\": \"^7.5.8\",\n \"eslint\": \"^8.57.1\",\n \"jest\": \"^29.7.0\",\n \"msw\": \"^2.4.9\",\n \"prettier\": \"^3.3.3\",\n \"tsup\": \"^8.3.0\",\n \"typescript\": \"^5.6.2\"\n }\n}\n","import { Command, Option } from '@commander-js/extra-typings';\nimport { input, select } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport { execSync } from 'child_process';\nimport { pathExistsSync } from 'fs-extra/esm';\nimport kebabCase from 'lodash.kebabcase';\nimport { join } from 'path';\nimport { z } from 'zod';\n\nimport { checkStorefrontLimit } from '../utils/check-storefront-limit';\nimport { cloneCatalyst } from '../utils/clone-catalyst';\nimport { Https } from '../utils/https';\nimport { installDependencies } from '../utils/install-dependencies';\nimport { login } from '../utils/login';\nimport { parse } from '../utils/parse';\nimport { writeEnv } from '../utils/write-env';\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('--customer-impersonation-token <token>', 'BigCommerce customer impersonation token')\n .option('--gh-ref <ref>', 'Clone a specific ref from the bigcommerce/catalyst repository')\n .addOption(\n new Option('--bigcommerce-hostname <hostname>', 'BigCommerce hostname')\n .default('bigcommerce.com')\n .hideHelp(),\n )\n .addOption(\n new Option('--sample-data-api-url <url>', 'BigCommerce sample data API URL')\n .default('https://api.bc-sample.store')\n .hideHelp(),\n )\n // eslint-disable-next-line complexity\n .action(async (options) => {\n const { ghRef } = options;\n\n try {\n execSync('which 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('which 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 const URLSchema = z.string().url();\n const sampleDataApiUrl = parse(options.sampleDataApiUrl, URLSchema);\n const bigcommerceApiUrl = parse(`https://api.${options.bigcommerceHostname}`, URLSchema);\n const bigcommerceAuthUrl = parse(`https://login.${options.bigcommerceHostname}`, URLSchema);\n\n let projectName;\n let projectDir;\n let storeHash = options.storeHash;\n let accessToken = options.accessToken;\n let channelId;\n let customerImpersonationToken = options.customerImpersonationToken;\n\n if (options.channelId) {\n channelId = parseInt(options.channelId, 10);\n }\n\n if (!pathExistsSync(options.projectDir)) {\n console.error(chalk.red(`Error: --projectDir ${options.projectDir} is not a valid path\\n`));\n process.exit(1);\n }\n\n if (options.projectName) {\n projectName = kebabCase(options.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 (!options.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 (!options.storeHash || !options.accessToken) {\n const credentials = await login(bigcommerceAuthUrl);\n\n storeHash = credentials.storeHash;\n accessToken = credentials.accessToken;\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 if (!storeHash || !accessToken) {\n console.log(`\\nCreating '${projectName}' at '${projectDir}'\\n`);\n\n cloneCatalyst({ projectDir, projectName, ghRef });\n\n await installDependencies(projectDir);\n\n console.log(\n [\n `\\n${chalk.green('Success!')} Created '${projectName}' at '${projectDir}'\\n`,\n `Next steps:`,\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'),\n );\n\n process.exit(0);\n }\n\n if (!channelId || !customerImpersonationToken) {\n const bc = new Https({ bigCommerceApiUrl: bigcommerceApiUrl, storeHash, accessToken });\n const availableChannels = await bc.channels('?available=true&type=storefront');\n const storeInfo = await bc.storeInformation();\n\n const canCreateChannel = checkStorefrontLimit(availableChannels, storeInfo);\n\n let shouldCreateChannel;\n\n if (canCreateChannel) {\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 newChannelName = await input({\n message: 'What would you like to name your new channel?',\n });\n\n const sampleDataApi = new Https({\n sampleDataApiUrl,\n storeHash,\n accessToken,\n });\n\n const {\n data: { id: createdChannelId, storefront_api_token: storefrontApiToken },\n } = await sampleDataApi.createChannel(newChannelName);\n\n await bc.createChannelMenus(createdChannelId);\n\n channelId = createdChannelId;\n customerImpersonationToken = storefrontApiToken;\n\n /**\n * @todo prompt sample data API\n */\n }\n\n if (!shouldCreateChannel) {\n const channelSortOrder = ['catalyst', 'next', 'bigcommerce'];\n\n const existingChannel = await select({\n message: 'Which channel would you like to use?',\n choices: availableChannels.data\n .sort(\n (a, b) => channelSortOrder.indexOf(a.platform) - channelSortOrder.indexOf(b.platform),\n )\n .map((ch) => ({\n name: ch.name,\n value: ch,\n description: `Channel Platform: ${\n ch.platform === 'bigcommerce'\n ? 'Stencil'\n : ch.platform.charAt(0).toUpperCase() + ch.platform.slice(1)\n }`,\n })),\n });\n\n channelId = existingChannel.id;\n\n const {\n data: { token },\n } = await bc.customerImpersonationToken();\n\n customerImpersonationToken = token;\n }\n }\n\n if (!channelId) throw new Error('Something went wrong, channelId is not defined');\n if (!customerImpersonationToken)\n throw new Error('Something went wrong, customerImpersonationToken is not defined');\n\n console.log(`\\nCreating '${projectName}' at '${projectDir}'\\n`);\n\n cloneCatalyst({ projectDir, projectName, ghRef });\n\n writeEnv(projectDir, {\n channelId: channelId.toString(),\n storeHash,\n customerImpersonationToken,\n });\n\n await installDependencies(projectDir);\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","import chalk from 'chalk';\n\nimport { type BigCommerceChannelsV3Response, type BigCommerceStoreInfo } from './https';\n\nexport const checkStorefrontLimit = (\n channels: BigCommerceChannelsV3Response,\n storeInfo: BigCommerceStoreInfo,\n) => {\n const { data: availableChannels } = channels;\n const { features } = storeInfo;\n\n if (availableChannels.length >= features.storefront_limits.total_including_inactive) {\n console.error(\n chalk.yellow(\n `You have reached the maximum number of storefronts allowed for your plan. Please select an existing channel below, purchase additional storefront seats in your BigCommerce Control Panel, or contact BigCommerce Support: ${chalk.cyan(\n 'https://support.bigcommerce.com',\n )}\\n`,\n ),\n );\n\n return false;\n }\n\n const activeChannels = availableChannels.filter((channel) => channel.status === 'active');\n\n if (activeChannels.length >= features.storefront_limits.active) {\n console.error(\n chalk.yellow(\n 'You have reached the maximum number of active storefronts allowed for your plan. Please select an existing channel below, de-activate an active channel, or purchase additional storefront seats in your BigCommerce Control Panel.\\n',\n ),\n );\n\n return false;\n }\n\n return true;\n};\n","import { execSync } from 'child_process';\n\nimport { checkoutRef } from './checkout-ref';\nimport { hasGitHubSSH } from './has-github-ssh';\n\nexport const cloneCatalyst = ({\n projectName,\n projectDir,\n ghRef,\n}: {\n projectName: string;\n projectDir: string;\n ghRef?: string;\n}) => {\n const repositoryName = 'bigcommerce/catalyst';\n const useSSH = hasGitHubSSH();\n\n console.log(`Cloning ${repositoryName} using ${useSSH ? 'SSH' : 'HTTPS'}...\\n`);\n\n const cloneCommand = `git clone ${\n useSSH ? `git@github.com:${repositoryName}` : `https://github.com/${repositoryName}`\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 checkoutRef(projectDir, ghRef);\n console.log();\n }\n};\n","import { execSync } from 'node:child_process';\n\nimport { isExecException } from './is-exec-exception';\n\nexport function checkoutRef(repoDir: string, ref: string): void {\n try {\n // Attempt to checkout the specified ref\n execSync(`git checkout ${ref}`, {\n cwd: repoDir,\n stdio: 'inherit',\n encoding: 'utf8',\n });\n console.log(`Checked out ref ${ref} successfully.`);\n } catch (error: unknown) {\n // Handle the error safely according to ESLint rules\n if (isExecException(error)) {\n const stderr = error.stderr ? error.stderr.toString() : '';\n\n // Check if the error message indicates that the ref was not found\n if (\n stderr.includes(`fatal: reference is not a tree: ${ref}`) ||\n stderr.includes(`fatal: ambiguous argument '${ref}'`) ||\n stderr.includes(`unknown revision or path not in the working tree`)\n ) {\n console.error(`Ref '${ref}' not found in the repository.`);\n } else {\n console.error(`Error checking out ref '${ref}':`, stderr.trim());\n }\n } 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 // Exit the process with a non-zero exit code\n process.exit(1);\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","/* eslint-disable @typescript-eslint/unified-signatures */\n\nimport chalk from 'chalk';\nimport { z } from 'zod';\n\nimport { parse } from './parse';\n\ninterface BigCommerceRestApiConfig {\n bigCommerceApiUrl: string;\n storeHash: string;\n accessToken: string;\n}\n\ninterface SampleDataApiConfig {\n sampleDataApiUrl: string;\n storeHash: string;\n accessToken: string;\n}\n\ninterface DeviceOAuthConfig {\n bigCommerceAuthUrl: string;\n}\n\ninterface HttpsConfig {\n bigCommerceApiUrl?: string;\n bigCommerceAuthUrl?: string;\n sampleDataApiUrl?: string;\n storeHash?: string;\n accessToken?: string;\n}\n\nconst BigCommerceStoreInfo = z.object({\n features: z.object({\n storefront_limits: z.object({\n active: z.number(),\n total_including_inactive: z.number(),\n }),\n }),\n});\n\nexport type BigCommerceStoreInfo = z.infer<typeof BigCommerceStoreInfo>;\n\nconst BigCommerceV3ApiResponseSchema = <T>(schema: z.ZodType<T>) =>\n z.object({\n data: schema,\n meta: z.object({}),\n });\n\nconst BigCommerceChannelsV3ResponseSchema = BigCommerceV3ApiResponseSchema(\n z.array(\n z.object({\n id: z.number(),\n name: z.string(),\n status: z.string(),\n platform: z.string(),\n }),\n ),\n);\n\nexport type BigCommerceChannelsV3Response = z.infer<typeof BigCommerceChannelsV3ResponseSchema>;\n\nexport class Https {\n DEVICE_OAUTH_CLIENT_ID = 'acse0vvawm9r1n0evag4b8e1ea1fo90';\n\n bigCommerceApiUrl: string;\n bigCommerceAuthUrl: string;\n sampleDataApiUrl: string;\n storeHash: string;\n accessToken: string;\n\n constructor({ bigCommerceApiUrl, storeHash, accessToken }: BigCommerceRestApiConfig);\n constructor({ sampleDataApiUrl, storeHash, accessToken }: SampleDataApiConfig);\n constructor({ bigCommerceAuthUrl }: DeviceOAuthConfig);\n constructor({\n bigCommerceApiUrl,\n bigCommerceAuthUrl,\n sampleDataApiUrl,\n storeHash,\n accessToken,\n }: HttpsConfig) {\n this.bigCommerceApiUrl = bigCommerceApiUrl ?? '';\n this.bigCommerceAuthUrl = bigCommerceAuthUrl ?? '';\n this.sampleDataApiUrl = sampleDataApiUrl ?? '';\n this.storeHash = storeHash ?? '';\n this.accessToken = accessToken ?? '';\n }\n\n auth(path: string, opts: RequestInit = {}) {\n if (!this.bigCommerceAuthUrl) {\n throw new Error('bigCommerceAuthUrl is required to make API requests');\n }\n\n const { headers = {}, ...rest } = opts;\n\n const options = {\n method: 'POST',\n headers: {\n ...headers,\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n ...rest,\n };\n\n return fetch(`${this.bigCommerceAuthUrl}${path}`, options);\n }\n\n async getDeviceCode() {\n const response = await this.auth('/device/token', {\n body: JSON.stringify({\n scopes: [\n 'store_v2_content',\n 'store_v2_information',\n 'store_v2_products',\n 'store_cart',\n 'store_sites',\n 'store_channel_settings',\n 'store_storefront_api_customer_impersonation',\n ].join(' '),\n client_id: this.DEVICE_OAUTH_CLIENT_ID,\n }),\n });\n\n if (!response.ok) {\n console.error(\n chalk.red(`\\nPOST /device/token failed: ${response.status} ${response.statusText}\\n`),\n );\n process.exit(1);\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.auth('/device/token', {\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 api(path: string, opts: RequestInit = {}) {\n if (!this.bigCommerceApiUrl || !this.storeHash || !this.accessToken) {\n throw new Error(\n 'bigCommerceApiUrl, storeHash, and accessToken are required to make API requests',\n );\n }\n\n const { headers = {}, ...rest } = opts;\n\n const options = {\n headers: {\n ...headers,\n Accept: 'application/json',\n 'X-Auth-Token': this.accessToken,\n },\n ...rest,\n };\n\n return fetch(`${this.bigCommerceApiUrl}/stores/${this.storeHash}${path}`, options);\n }\n\n async storeInformation() {\n const res = await this.api('/v2/store');\n\n if (!res.ok) {\n console.error(chalk.red(`\\nGET /v2/store failed: ${res.status} ${res.statusText}\\n`));\n process.exit(1);\n }\n\n return parse(await res.json(), BigCommerceStoreInfo);\n }\n\n async channels(query = '') {\n const res = await this.api(`/v3/channels${query}`);\n\n if (!res.ok) {\n console.error(chalk.red(`\\nGET /v3/channels failed: ${res.status} ${res.statusText}\\n`));\n process.exit(1);\n }\n\n return parse(await res.json(), BigCommerceChannelsV3ResponseSchema);\n }\n\n async createChannelMenus(channelId: number) {\n const res = await this.api(`/v3/channels/${channelId}/channel-menus`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n bigcommerce_protected_app_sections: [\n 'storefront_settings',\n 'currencies',\n 'domains',\n 'notifications',\n 'social',\n ],\n }),\n });\n\n if (!res.ok) {\n console.warn(\n chalk.yellow(\n `\\nFailed to create channel menus: ${res.status} ${res.statusText}. You may want to create these later: https://developer.bigcommerce.com/docs/rest-management/channels/menus#create-channel-menus\\n`,\n ),\n );\n }\n }\n\n async customerImpersonationToken() {\n const res = await this.api('/v3/storefront/api-token-customer-impersonation', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ expires_at: 2147483647, channel_ids: [] }),\n });\n\n if (!res.ok) {\n console.error(\n chalk.red(\n `\\nPOST /v3/storefront/api-token-customer-impersonation failed: ${res.status} ${res.statusText}\\n`,\n ),\n );\n process.exit(1);\n }\n\n const BigCommerceCustomerImpersonationTokenSchema = z.object({\n data: z.object({\n token: z.string(),\n }),\n });\n\n return parse(await res.json(), BigCommerceCustomerImpersonationTokenSchema);\n }\n\n sampleDataApi(path: string, opts: RequestInit = {}) {\n if (!this.sampleDataApiUrl || !this.storeHash || !this.accessToken) {\n throw new Error(\n 'sampleDataApiUrl, storeHash, and accessToken are required to make API requests',\n );\n }\n\n const { headers = {}, ...rest } = opts;\n\n const options = {\n method: 'POST',\n headers: {\n ...headers,\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'X-Auth-Token': this.accessToken,\n },\n ...rest,\n };\n\n return fetch(`${this.sampleDataApiUrl}/stores/${this.storeHash}${path}`, options);\n }\n\n async createChannel(channelName: string) {\n const res = await this.sampleDataApi('/v3/channels/catalyst', {\n body: JSON.stringify({ name: channelName }),\n });\n\n if (!res.ok) {\n console.error(\n chalk.red(`\\nPOST /v3/channels/catalyst failed: ${res.status} ${res.statusText}\\n`),\n );\n process.exit(1);\n }\n\n const SampleDataChannelCreateSchema = z.object({\n data: z.object({\n id: z.number(),\n name: z.string().min(1),\n storefront_api_token: z.string(),\n }),\n });\n\n return parse(await res.json(), SampleDataChannelCreateSchema);\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 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","/* eslint-disable no-await-in-loop */\n\nimport { select } from '@inquirer/prompts';\nimport chalk from 'chalk';\n\nimport { Https } from './https';\nimport { spinner } from './spinner';\n\nconst poll = async (auth: Https, deviceCode: string, interval: number, expiresIn: number) => {\n const intervalMs = interval * 1000;\n const expiresAtMs = expiresIn * 1000;\n const retries = expiresAtMs / intervalMs;\n\n for (let i = 0; i < retries; i += 1) {\n try {\n return await auth.checkDeviceCode(deviceCode);\n } catch {\n // noop\n }\n\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n\n console.error(chalk.red('\\nDevice code expired. Please try again.\\n'));\n process.exit(1);\n};\n\nexport const login = async (\n bigCommerceAuthUrl: string,\n storeHash?: string,\n accessToken?: string,\n) => {\n if (storeHash && accessToken) {\n return { storeHash, accessToken };\n }\n\n const shouldLogin = await select({\n message: 'Would you like to connect to a BigCommerce store?',\n choices: [\n { name: 'Yes', value: true },\n { name: 'No', value: false },\n ],\n });\n\n if (!shouldLogin) {\n return { storeHash, accessToken };\n }\n\n const auth = new Https({ bigCommerceAuthUrl });\n\n const deviceCode = await auth.getDeviceCode();\n\n console.log(\n [\n `\\nPlease visit ${chalk.cyan(deviceCode.verification_uri)} and enter the code: ${chalk.yellow(\n deviceCode.user_code,\n )}\\n`,\n `The code will expire in ${chalk.yellow(`${deviceCode.expires_in / 60} minutes`)}\\n`,\n ].join('\\n'),\n );\n\n const { store_hash, access_token } = await spinner(\n poll(auth, deviceCode.device_code, deviceCode.interval, deviceCode.expires_in),\n {\n text: 'Waiting for device code to be authorized',\n successText: 'Device code authorized\\n',\n failText: 'Device code expired\\n',\n },\n );\n\n return {\n storeHash: store_hash,\n accessToken: access_token,\n };\n};\n","import { randomBytes } from 'crypto';\nimport { outputFileSync } from 'fs-extra/esm';\nimport { join } from 'path';\n\nexport const writeEnv = (\n projectDir: string,\n {\n channelId,\n storeHash,\n customerImpersonationToken,\n }: {\n channelId: string;\n storeHash: string;\n customerImpersonationToken: string;\n },\n) => {\n outputFileSync(\n join(projectDir, '.env.local'),\n [\n `BIGCOMMERCE_STORE_HASH=${storeHash}`,\n `BIGCOMMERCE_CHANNEL_ID=${channelId}`,\n `BIGCOMMERCE_CUSTOMER_IMPERSONATION_TOKEN=${customerImpersonationToken}`,\n '',\n `AUTH_SECRET=${randomBytes(32).toString('hex')}`,\n `CLIENT_LOGGER=false`,\n `ENABLE_ADMIN_ROUTE=true`,\n `DEFAULT_REVALIDATE_TARGET=3600`,\n ].join('\\n'),\n );\n};\n","import { Command, Option } from '@commander-js/extra-typings';\nimport { input, select } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport * as z from 'zod';\n\nimport { checkStorefrontLimit } from '../utils/check-storefront-limit';\nimport { Https } from '../utils/https';\nimport { login } from '../utils/login';\nimport { parse } from '../utils/parse';\nimport { writeEnv } from '../utils/write-env';\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 .addOption(\n new Option('--bigcommerce-hostname <hostname>', 'BigCommerce hostname')\n .default('bigcommerce.com')\n .hideHelp(),\n )\n .addOption(\n new Option('--sample-data-api-url <url>', 'BigCommerce sample data API URL')\n .default('https://api.bc-sample.store')\n .hideHelp(),\n )\n .action(async (options) => {\n const projectDir = process.cwd();\n\n const URLSchema = z.string().url();\n const sampleDataApiUrl = parse(options.sampleDataApiUrl, URLSchema);\n const bigCommerceApiUrl = `https://api.${options.bigcommerceHostname}`;\n const bigCommerceAuthUrl = `https://login.${options.bigcommerceHostname}`;\n\n let storeHash = options.storeHash;\n let accessToken = options.accessToken;\n let channelId;\n let customerImpersonationToken;\n\n if (!options.storeHash || !options.accessToken) {\n const credentials = await login(bigCommerceAuthUrl);\n\n storeHash = credentials.storeHash;\n accessToken = credentials.accessToken;\n }\n\n if (!storeHash || !accessToken) {\n console.log(\n chalk.yellow('\\nYou must authenticate with a store to overwrite your local environment.\\n'),\n );\n\n process.exit(1);\n }\n\n const bc = new Https({ bigCommerceApiUrl, storeHash, accessToken });\n\n const availableChannels = await bc.channels('?available=true&type=storefront');\n const storeInfo = await bc.storeInformation();\n\n const canCreateChannel = checkStorefrontLimit(availableChannels, storeInfo);\n\n let shouldCreateChannel;\n\n if (canCreateChannel) {\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 newChannelName = await input({\n message: 'What would you like to name your new channel?',\n });\n\n const sampleDataApi = new Https({\n sampleDataApiUrl,\n storeHash,\n accessToken,\n });\n\n const {\n data: { id: createdChannelId, storefront_api_token: storefrontApiToken },\n } = await sampleDataApi.createChannel(newChannelName);\n\n channelId = createdChannelId;\n customerImpersonationToken = storefrontApiToken;\n\n /**\n * @todo prompt sample data API\n */\n }\n\n if (!shouldCreateChannel) {\n const channelSortOrder = ['catalyst', 'next', 'bigcommerce'];\n\n const existingChannel = await select({\n message: 'Which channel would you like to use?',\n choices: availableChannels.data\n .sort(\n (a, b) => channelSortOrder.indexOf(a.platform) - channelSortOrder.indexOf(b.platform),\n )\n .map((ch) => ({\n name: ch.name,\n value: ch,\n description: `Channel Platform: ${\n ch.platform === 'bigcommerce'\n ? 'Stencil'\n : ch.platform.charAt(0).toUpperCase() + ch.platform.slice(1)\n }`,\n })),\n });\n\n channelId = existingChannel.id;\n\n const {\n data: { token },\n } = await bc.customerImpersonationToken();\n\n customerImpersonationToken = token;\n }\n\n if (!channelId) throw new Error('Something went wrong, channelId is not defined');\n if (!customerImpersonationToken)\n throw new Error('Something went wrong, customerImpersonationToken is not defined');\n\n writeEnv(projectDir, {\n channelId: channelId.toString(),\n storeHash,\n customerImpersonationToken,\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"],"mappings":"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","names":["chalk","select","chalk","execSync","join","z","execSync","execSync","execSync","execSync","chalk","z","z","chalk","chalk","chalk","chalk","chalk","execSync","chalk","z","join","select","Command","Option","input","select","chalk","z","Command","Option","chalk","select","input","Command","parse","outputFileSync","kebabCase","z","z","Command","kebabCase","parse","outputFileSync","chalk"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../package.json","../src/commands/create.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/https.ts","../src/utils/parse.ts","../src/utils/user-agent.ts","../src/utils/install-dependencies.ts","../src/utils/spinner.ts","../src/utils/login.ts","../src/utils/telemetry/telemetry.ts","../src/utils/write-env.ts","../src/commands/init.ts","../src/commands/integration.ts","../src/commands/telemetry.ts","../src/utils/telemetry/index.ts","../src/hooks/telemetry.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { program } from '@commander-js/extra-typings';\nimport chalk from 'chalk';\n\nimport PACKAGE_INFO from '../package.json';\n\nimport { create } from './commands/create';\nimport { init } from './commands/init';\nimport { integration } from './commands/integration';\nimport { telemetry } from './commands/telemetry';\nimport { telemetryPostHook, telemetryPreHook } from './hooks/telemetry';\n\nconsole.log(chalk.cyanBright(`\\n◢ ${PACKAGE_INFO.name} v${PACKAGE_INFO.version}\\n`));\n\nprogram\n .name(PACKAGE_INFO.name)\n .version(PACKAGE_INFO.version)\n .description('A command line tool to create a new Catalyst project.')\n .addCommand(create, { isDefault: true })\n .addCommand(init)\n .addCommand(integration)\n .addCommand(telemetry)\n .hook('preAction', telemetryPreHook)\n .hook('postAction', telemetryPostHook);\n\nprogram.parse(process.argv);\n","{\n \"name\": \"@bigcommerce/create-catalyst\",\n \"version\": \"0.14.0\",\n \"type\": \"module\",\n \"bin\": \"bin/index.cjs\",\n \"files\": [\n \"bin\",\n \"dist\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint . --max-warnings 0\",\n \"test\": \"jest\",\n \"build\": \"tsup\"\n },\n \"engines\": {\n \"node\": \">=20.0.0\"\n },\n \"dependencies\": {\n \"@commander-js/extra-typings\": \"^12.1.0\",\n \"@inquirer/prompts\": \"^7.0.0\",\n \"@segment/analytics-node\": \"^2.2.0\",\n \"chalk\": \"^5.3.0\",\n \"commander\": \"^12.1.0\",\n \"conf\": \"^13.0.1\",\n \"dotenv\": \"^16.4.5\",\n \"fs-extra\": \"^11.2.0\",\n \"giget\": \"^1.2.3\",\n \"lodash.kebabcase\": \"^4.1.1\",\n \"nypm\": \"^0.3.12\",\n \"ora\": \"^8.1.0\",\n \"semver\": \"^7.6.3\",\n \"std-env\": \"^3.7.0\",\n \"zod\": \"^3.23.8\",\n \"zod-validation-error\": \"^3.4.0\"\n },\n \"devDependencies\": {\n \"@bigcommerce/eslint-config\": \"^2.9.1\",\n \"@bigcommerce/eslint-config-catalyst\": \"workspace:^\",\n \"@swc/core\": \"^1.7.35\",\n \"@swc/jest\": \"^0.2.36\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/jest\": \"^29.5.13\",\n \"@types/lodash.kebabcase\": \"^4.1.9\",\n \"@types/node\": \"^20.16.11\",\n \"@types/prompts\": \"^2.4.9\",\n \"@types/semver\": \"^7.5.8\",\n \"eslint\": \"^8.57.1\",\n \"jest\": \"^29.7.0\",\n \"msw\": \"^2.4.11\",\n \"prettier\": \"^3.3.3\",\n \"tsup\": \"^8.3.0\",\n \"typescript\": \"^5.6.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';\nimport { z } from 'zod';\n\nimport { cloneCatalyst } from '../utils/clone-catalyst';\nimport { Https } from '../utils/https';\nimport { installDependencies } from '../utils/install-dependencies';\nimport { login } from '../utils/login';\nimport { parse } from '../utils/parse';\nimport { Telemetry } from '../utils/telemetry/telemetry';\nimport { writeEnv } from '../utils/write-env';\n\nconst telemetry = new Telemetry();\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('--customer-impersonation-token <token>', 'BigCommerce customer impersonation token')\n .option('--gh-ref <ref>', 'Clone a specific ref from the source repository')\n .option('--repository <repository>', 'GitHub repository to clone from', 'bigcommerce/catalyst')\n .addOption(\n new Option('--bigcommerce-hostname <hostname>', 'BigCommerce hostname')\n .default('bigcommerce.com')\n .hideHelp(),\n )\n .addOption(\n new Option('--sample-data-api-url <url>', 'BigCommerce sample data API URL')\n .default('https://api.bc-sample.store')\n .hideHelp(),\n )\n // eslint-disable-next-line complexity\n .action(async (options) => {\n const { ghRef, repository } = options;\n\n try {\n execSync('which 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('which 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 const URLSchema = z.string().url();\n const sampleDataApiUrl = parse(options.sampleDataApiUrl, URLSchema);\n const bigcommerceApiUrl = parse(`https://api.${options.bigcommerceHostname}`, URLSchema);\n const bigcommerceAuthUrl = parse(`https://login.${options.bigcommerceHostname}`, URLSchema);\n\n let projectName;\n let projectDir;\n let storeHash = options.storeHash;\n let accessToken = options.accessToken;\n let channelId;\n let customerImpersonationToken = options.customerImpersonationToken;\n\n if (options.channelId) {\n channelId = parseInt(options.channelId, 10);\n }\n\n if (!pathExistsSync(options.projectDir)) {\n console.error(chalk.red(`Error: --projectDir ${options.projectDir} is not a valid path\\n`));\n process.exit(1);\n }\n\n if (options.projectName) {\n projectName = kebabCase(options.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 (!options.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 (!options.storeHash || !options.accessToken) {\n const credentials = await login(bigcommerceAuthUrl);\n\n storeHash = credentials.storeHash;\n accessToken = credentials.accessToken;\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 if (!storeHash || !accessToken) {\n console.log(`\\nCreating '${projectName}' at '${projectDir}'\\n`);\n\n cloneCatalyst({ repository, projectName, projectDir, ghRef });\n\n await installDependencies(projectDir);\n\n console.log(\n [\n `\\n${chalk.green('Success!')} Created '${projectName}' at '${projectDir}'\\n`,\n `Next steps:`,\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'),\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 || !customerImpersonationToken) {\n const bc = new Https({ bigCommerceApiUrl: bigcommerceApiUrl, storeHash, accessToken });\n const sampleDataApi = new Https({\n sampleDataApiUrl,\n storeHash,\n accessToken,\n });\n\n const eligibilityResponse = await sampleDataApi.checkEligibility();\n\n if (!eligibilityResponse.data.eligible) {\n console.warn(chalk.yellow(eligibilityResponse.data.message));\n }\n\n let shouldCreateChannel;\n\n if (eligibilityResponse.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 newChannelName = await input({\n message: 'What would you like to name your new channel?',\n });\n\n const {\n data: { id: createdChannelId, storefront_api_token: storefrontApiToken },\n } = await sampleDataApi.createChannel(newChannelName);\n\n await bc.createChannelMenus(createdChannelId);\n\n channelId = createdChannelId;\n customerImpersonationToken = storefrontApiToken;\n\n /**\n * @todo prompt sample data API\n */\n }\n\n if (!shouldCreateChannel) {\n const channelSortOrder = ['catalyst', 'next', 'bigcommerce'];\n\n const availableChannels = await bc.channels('?available=true&type=storefront');\n\n const existingChannel = await select({\n message: 'Which channel would you like to use?',\n choices: availableChannels.data\n .sort(\n (a, b) => channelSortOrder.indexOf(a.platform) - channelSortOrder.indexOf(b.platform),\n )\n .map((ch) => ({\n name: ch.name,\n value: ch,\n description: `Channel Platform: ${\n ch.platform === 'bigcommerce'\n ? 'Stencil'\n : ch.platform.charAt(0).toUpperCase() + ch.platform.slice(1)\n }`,\n })),\n });\n\n channelId = existingChannel.id;\n\n const {\n data: { token },\n } = await bc.customerImpersonationToken();\n\n customerImpersonationToken = token;\n }\n }\n\n if (!channelId) throw new Error('Something went wrong, channelId is not defined');\n if (!customerImpersonationToken)\n throw new Error('Something went wrong, customerImpersonationToken is not defined');\n\n console.log(`\\nCreating '${projectName}' at '${projectDir}'\\n`);\n\n cloneCatalyst({ repository, projectName, projectDir, ghRef });\n\n writeEnv(projectDir, {\n channelId: channelId.toString(),\n storeHash,\n customerImpersonationToken,\n });\n\n await installDependencies(projectDir);\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","import { execSync } from 'child_process';\n\nimport { checkoutRef } from './checkout-ref';\nimport { hasGitHubSSH } from './has-github-ssh';\n\nexport const cloneCatalyst = ({\n repository,\n projectName,\n projectDir,\n ghRef,\n}: {\n repository: string;\n projectName: string;\n projectDir: string;\n ghRef?: string;\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 checkoutRef(projectDir, ghRef);\n console.log();\n }\n};\n","import { execSync } from 'node:child_process';\n\nimport { isExecException } from './is-exec-exception';\n\nexport function checkoutRef(repoDir: string, ref: string): void {\n try {\n // Attempt to checkout the specified ref\n execSync(`git checkout ${ref}`, {\n cwd: repoDir,\n stdio: 'inherit',\n encoding: 'utf8',\n });\n console.log(`Checked out ref ${ref} successfully.`);\n } catch (error: unknown) {\n // Handle the error safely according to ESLint rules\n if (isExecException(error)) {\n const stderr = error.stderr ? error.stderr.toString() : '';\n\n // Check if the error message indicates that the ref was not found\n if (\n stderr.includes(`fatal: reference is not a tree: ${ref}`) ||\n stderr.includes(`fatal: ambiguous argument '${ref}'`) ||\n stderr.includes(`unknown revision or path not in the working tree`)\n ) {\n console.error(`Ref '${ref}' not found in the repository.`);\n } else {\n console.error(`Error checking out ref '${ref}':`, stderr.trim());\n }\n }\n\n if (error instanceof Error) {\n // General error handling\n console.error(`Error checking out ref '${ref}':`, error.message);\n }\n\n // Unknown error type\n console.error(`Unknown error occurred while checking out ref '${ref}'.`);\n }\n}\n","import { ExecException } from 'node:child_process';\n\nexport function isExecException(error: unknown): error is ExecException {\n return typeof error === 'object' && error !== null && 'stdout' in error && 'stderr' in error;\n}\n","import { execSync } from 'child_process';\n\nimport { isExecException } from './is-exec-exception';\n\nexport function hasGitHubSSH(): boolean {\n try {\n // Attempt to connect to GitHub via SSH and capture the output\n const output = execSync('ssh -T git@github.com', {\n encoding: 'utf8',\n stdio: 'pipe',\n }).toString();\n\n // Check the output for successful authentication\n return output.includes('successfully authenticated');\n } catch (error: unknown) {\n // Use the type guard to check if error is an ExecException\n if (isExecException(error)) {\n const stdout = error.stdout ? error.stdout.toString() : '';\n const stderr = error.stderr ? error.stderr.toString() : '';\n const combinedOutput = stdout + stderr;\n\n // Check if the output indicates successful authentication\n if (combinedOutput.includes('successfully authenticated')) {\n return true;\n }\n }\n\n return false;\n }\n}\n","/* eslint-disable @typescript-eslint/unified-signatures */\n\nimport chalk from 'chalk';\nimport { z } from 'zod';\n\nimport { parse } from './parse';\nimport { getCLIUserAgent } from './user-agent';\n\ninterface BigCommerceRestApiConfig {\n bigCommerceApiUrl: string;\n storeHash: string;\n accessToken: string;\n}\n\ninterface SampleDataApiConfig {\n sampleDataApiUrl: string;\n storeHash: string;\n accessToken: string;\n}\n\ninterface DeviceOAuthConfig {\n bigCommerceAuthUrl: string;\n}\n\ninterface HttpsConfig {\n bigCommerceApiUrl?: string;\n bigCommerceAuthUrl?: string;\n sampleDataApiUrl?: string;\n storeHash?: string;\n accessToken?: string;\n}\n\nconst BigCommerceStoreInfo = z.object({\n features: z.object({\n storefront_limits: z.object({\n active: z.number(),\n total_including_inactive: z.number(),\n }),\n }),\n});\n\nexport type BigCommerceStoreInfo = z.infer<typeof BigCommerceStoreInfo>;\n\nconst BigCommerceV3ApiResponseSchema = <T>(schema: z.ZodType<T>) =>\n z.object({\n data: schema,\n meta: z.object({}),\n });\n\nconst BigCommerceChannelsV3ResponseSchema = BigCommerceV3ApiResponseSchema(\n z.array(\n z.object({\n id: z.number(),\n name: z.string(),\n status: z.string(),\n platform: z.string(),\n }),\n ),\n);\n\nexport type BigCommerceChannelsV3Response = z.infer<typeof BigCommerceChannelsV3ResponseSchema>;\n\nexport class Https {\n DEVICE_OAUTH_CLIENT_ID = 'acse0vvawm9r1n0evag4b8e1ea1fo90';\n\n bigCommerceApiUrl: string;\n bigCommerceAuthUrl: string;\n sampleDataApiUrl: string;\n storeHash: string;\n accessToken: string;\n userAgent: string;\n\n constructor({ bigCommerceApiUrl, storeHash, accessToken }: BigCommerceRestApiConfig);\n constructor({ sampleDataApiUrl, storeHash, accessToken }: SampleDataApiConfig);\n constructor({ bigCommerceAuthUrl }: DeviceOAuthConfig);\n constructor({\n bigCommerceApiUrl,\n bigCommerceAuthUrl,\n sampleDataApiUrl,\n storeHash,\n accessToken,\n }: HttpsConfig) {\n this.bigCommerceApiUrl = bigCommerceApiUrl ?? '';\n this.bigCommerceAuthUrl = bigCommerceAuthUrl ?? '';\n this.sampleDataApiUrl = sampleDataApiUrl ?? '';\n this.storeHash = storeHash ?? '';\n this.accessToken = accessToken ?? '';\n this.userAgent = getCLIUserAgent();\n }\n\n auth(path: string, opts: RequestInit = {}) {\n if (!this.bigCommerceAuthUrl) {\n throw new Error('bigCommerceAuthUrl is required to make API requests');\n }\n\n const { headers = {}, ...rest } = opts;\n\n const options = {\n method: 'POST',\n headers: {\n ...headers,\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'User-Agent': this.userAgent,\n },\n ...rest,\n };\n\n return fetch(`${this.bigCommerceAuthUrl}${path}`, options);\n }\n\n async getDeviceCode() {\n const response = await this.auth('/device/token', {\n body: JSON.stringify({\n scopes: [\n 'store_channel_settings',\n 'store_sites',\n 'store_storefront_api',\n 'store_storefront_api_customer_impersonation',\n 'store_v2_content',\n 'store_v2_information',\n 'store_v2_products',\n ].join(' '),\n client_id: this.DEVICE_OAUTH_CLIENT_ID,\n }),\n });\n\n if (!response.ok) {\n console.error(\n chalk.red(`\\nPOST /device/token failed: ${response.status} ${response.statusText}\\n`),\n );\n process.exit(1);\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.auth('/device/token', {\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 api(path: string, opts: RequestInit = {}) {\n if (!this.bigCommerceApiUrl || !this.storeHash || !this.accessToken) {\n throw new Error(\n 'bigCommerceApiUrl, storeHash, and accessToken are required to make API requests',\n );\n }\n\n const { headers = {}, ...rest } = opts;\n\n const options = {\n headers: {\n ...headers,\n Accept: 'application/json',\n 'X-Auth-Token': this.accessToken,\n 'User-Agent': this.userAgent,\n },\n ...rest,\n };\n\n return fetch(`${this.bigCommerceApiUrl}/stores/${this.storeHash}${path}`, options);\n }\n\n async storeInformation() {\n const res = await this.api('/v2/store');\n\n if (!res.ok) {\n console.error(chalk.red(`\\nGET /v2/store failed: ${res.status} ${res.statusText}\\n`));\n process.exit(1);\n }\n\n return parse(await res.json(), BigCommerceStoreInfo);\n }\n\n async channels(query = '') {\n const res = await this.api(`/v3/channels${query}`);\n\n if (!res.ok) {\n console.error(chalk.red(`\\nGET /v3/channels failed: ${res.status} ${res.statusText}\\n`));\n process.exit(1);\n }\n\n return parse(await res.json(), BigCommerceChannelsV3ResponseSchema);\n }\n\n async createChannelMenus(channelId: number) {\n const res = await this.api(`/v3/channels/${channelId}/channel-menus`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n bigcommerce_protected_app_sections: [\n 'storefront_settings',\n 'currencies',\n 'domains',\n 'notifications',\n 'social',\n ],\n }),\n });\n\n if (!res.ok) {\n console.warn(\n chalk.yellow(\n `\\nFailed to create channel menus: ${res.status} ${res.statusText}. You may want to create these later: https://developer.bigcommerce.com/docs/rest-management/channels/menus#create-channel-menus\\n`,\n ),\n );\n }\n }\n\n async customerImpersonationToken() {\n const res = await this.api('/v3/storefront/api-token-customer-impersonation', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ expires_at: 2147483647, channel_ids: [] }),\n });\n\n if (!res.ok) {\n console.error(\n chalk.red(\n `\\nPOST /v3/storefront/api-token-customer-impersonation failed: ${res.status} ${res.statusText}\\n`,\n ),\n );\n process.exit(1);\n }\n\n const BigCommerceCustomerImpersonationTokenSchema = z.object({\n data: z.object({\n token: z.string(),\n }),\n });\n\n return parse(await res.json(), BigCommerceCustomerImpersonationTokenSchema);\n }\n\n sampleDataApi(path: string, opts: RequestInit = {}) {\n if (!this.sampleDataApiUrl || !this.storeHash || !this.accessToken) {\n throw new Error(\n 'sampleDataApiUrl, storeHash, and accessToken are required to make API requests',\n );\n }\n\n const { headers = {}, ...rest } = opts;\n\n const options = {\n method: 'POST',\n headers: {\n ...headers,\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n 'X-Auth-Token': this.accessToken,\n 'User-Agent': this.userAgent,\n },\n ...rest,\n };\n\n return fetch(`${this.sampleDataApiUrl}/stores/${this.storeHash}${path}`, options);\n }\n\n async checkEligibility() {\n const res = await this.sampleDataApi('/v3/channels/catalyst/eligibility', {\n method: 'GET',\n });\n\n if (!res.ok) {\n console.error(\n chalk.red(\n `\\nGET /v3/channels/catalyst/eligibility failed: ${res.status} ${res.statusText}\\n`,\n ),\n );\n process.exit(1);\n }\n\n const CheckEligibilitySchema = z.object({\n data: z.object({\n eligible: z.boolean(),\n message: z.string(),\n }),\n });\n\n return parse(await res.json(), CheckEligibilitySchema);\n }\n\n async createChannel(channelName: string) {\n const res = await this.sampleDataApi('/v3/channels/catalyst', {\n body: JSON.stringify({ name: channelName }),\n });\n\n if (!res.ok) {\n console.error(\n chalk.red(`\\nPOST /v3/channels/catalyst failed: ${res.status} ${res.statusText}\\n`),\n );\n process.exit(1);\n }\n\n const SampleDataChannelCreateSchema = z.object({\n data: z.object({\n id: z.number(),\n name: z.string().min(1),\n storefront_api_token: z.string(),\n }),\n });\n\n return parse(await res.json(), SampleDataChannelCreateSchema);\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 {\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 return 'Unknown Env';\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 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","/* eslint-disable no-await-in-loop */\n\nimport { select } from '@inquirer/prompts';\nimport chalk from 'chalk';\n\nimport { Https } from './https';\nimport { spinner } from './spinner';\n\nconst poll = async (auth: Https, deviceCode: string, interval: number, expiresIn: number) => {\n const intervalMs = interval * 1000;\n const expiresAtMs = expiresIn * 1000;\n const retries = expiresAtMs / intervalMs;\n\n for (let i = 0; i < retries; i += 1) {\n try {\n return await auth.checkDeviceCode(deviceCode);\n } catch {\n // noop\n }\n\n await new Promise((resolve) => setTimeout(resolve, intervalMs));\n }\n\n console.error(chalk.red('\\nDevice code expired. Please try again.\\n'));\n process.exit(1);\n};\n\nexport const login = async (\n bigCommerceAuthUrl: string,\n storeHash?: string,\n accessToken?: string,\n) => {\n if (storeHash && accessToken) {\n return { storeHash, accessToken };\n }\n\n const shouldLogin = await select({\n message: 'Would you like to connect to a BigCommerce store?',\n choices: [\n { name: 'Yes', value: true },\n { name: 'No', value: false },\n ],\n });\n\n if (!shouldLogin) {\n return { storeHash, accessToken };\n }\n\n const auth = new Https({ bigCommerceAuthUrl });\n\n const deviceCode = await auth.getDeviceCode();\n\n console.log(\n [\n `\\nPlease visit ${chalk.cyan(deviceCode.verification_uri)} and enter the code: ${chalk.yellow(\n deviceCode.user_code,\n )}\\n`,\n `The code will expire in ${chalk.yellow(`${deviceCode.expires_in / 60} minutes`)}\\n`,\n ].join('\\n'),\n );\n\n const { store_hash, access_token } = await spinner(\n poll(auth, deviceCode.device_code, deviceCode.interval, deviceCode.expires_in),\n {\n text: 'Waiting for device code to be authorized',\n successText: 'Device code authorized\\n',\n failText: 'Device code expired\\n',\n },\n );\n\n return {\n storeHash: store_hash,\n accessToken: access_token,\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 await new Promise((resolve) => {\n if (!this.isEnabled()) {\n resolve(undefined);\n }\n\n this.analytics.track(\n {\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 resolve,\n );\n });\n }\n\n async identify(storeHash?: string) {\n await new Promise((resolve) => {\n if (!this.isEnabled()) {\n resolve(undefined);\n }\n\n if (!storeHash) {\n resolve(undefined);\n }\n\n this.analytics.identify(\n {\n userId: storeHash,\n anonymousId: this.getAnonymousId(),\n context: {\n app: {\n name: this.projectName,\n version: this.projectVersion,\n },\n },\n },\n resolve,\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 { randomBytes } from 'crypto';\nimport { outputFileSync } from 'fs-extra/esm';\nimport { join } from 'path';\n\nexport const writeEnv = (\n projectDir: string,\n {\n channelId,\n storeHash,\n customerImpersonationToken,\n }: {\n channelId: string;\n storeHash: string;\n customerImpersonationToken: string;\n },\n) => {\n outputFileSync(\n join(projectDir, '.env.local'),\n [\n `BIGCOMMERCE_STORE_HASH=${storeHash}`,\n `BIGCOMMERCE_CHANNEL_ID=${channelId}`,\n `BIGCOMMERCE_CUSTOMER_IMPERSONATION_TOKEN=${customerImpersonationToken}`,\n '',\n `AUTH_SECRET=${randomBytes(32).toString('hex')}`,\n `CLIENT_LOGGER=false`,\n `ENABLE_ADMIN_ROUTE=true`,\n `DEFAULT_REVALIDATE_TARGET=3600`,\n ].join('\\n'),\n );\n};\n","import { Command, Option } from '@commander-js/extra-typings';\nimport { input, select } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport * as z from 'zod';\n\nimport { Https } from '../utils/https';\nimport { login } from '../utils/login';\nimport { parse } from '../utils/parse';\nimport { writeEnv } from '../utils/write-env';\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 .addOption(\n new Option('--bigcommerce-hostname <hostname>', 'BigCommerce hostname')\n .default('bigcommerce.com')\n .hideHelp(),\n )\n .addOption(\n new Option('--sample-data-api-url <url>', 'BigCommerce sample data API URL')\n .default('https://api.bc-sample.store')\n .hideHelp(),\n )\n .action(async (options) => {\n const projectDir = process.cwd();\n\n const URLSchema = z.string().url();\n const sampleDataApiUrl = parse(options.sampleDataApiUrl, URLSchema);\n const bigCommerceApiUrl = `https://api.${options.bigcommerceHostname}`;\n const bigCommerceAuthUrl = `https://login.${options.bigcommerceHostname}`;\n\n let storeHash = options.storeHash;\n let accessToken = options.accessToken;\n let channelId;\n let customerImpersonationToken;\n\n if (!options.storeHash || !options.accessToken) {\n const credentials = await login(bigCommerceAuthUrl);\n\n storeHash = credentials.storeHash;\n accessToken = credentials.accessToken;\n }\n\n if (!storeHash || !accessToken) {\n console.log(\n chalk.yellow('\\nYou must authenticate with a store to overwrite your local environment.\\n'),\n );\n\n process.exit(1);\n }\n\n const bc = new Https({ bigCommerceApiUrl, storeHash, accessToken });\n const sampleDataApi = new Https({\n sampleDataApiUrl,\n storeHash,\n accessToken,\n });\n\n const eligibilityResponse = await sampleDataApi.checkEligibility();\n\n if (!eligibilityResponse.data.eligible) {\n console.warn(chalk.yellow(eligibilityResponse.data.message));\n }\n\n let shouldCreateChannel;\n\n if (eligibilityResponse.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 newChannelName = await input({\n message: 'What would you like to name your new channel?',\n });\n\n const {\n data: { id: createdChannelId, storefront_api_token: storefrontApiToken },\n } = await sampleDataApi.createChannel(newChannelName);\n\n channelId = createdChannelId;\n customerImpersonationToken = storefrontApiToken;\n\n /**\n * @todo prompt sample data API\n */\n }\n\n if (!shouldCreateChannel) {\n const channelSortOrder = ['catalyst', 'next', 'bigcommerce'];\n\n const availableChannels = await bc.channels('?available=true&type=storefront');\n\n const existingChannel = await select({\n message: 'Which channel would you like to use?',\n choices: availableChannels.data\n .sort(\n (a, b) => channelSortOrder.indexOf(a.platform) - channelSortOrder.indexOf(b.platform),\n )\n .map((ch) => ({\n name: ch.name,\n value: ch,\n description: `Channel Platform: ${\n ch.platform === 'bigcommerce'\n ? 'Stencil'\n : ch.platform.charAt(0).toUpperCase() + ch.platform.slice(1)\n }`,\n })),\n });\n\n channelId = existingChannel.id;\n\n const {\n data: { token },\n } = await bc.customerImpersonationToken();\n\n customerImpersonationToken = token;\n }\n\n if (!channelId) throw new Error('Something went wrong, channelId is not defined');\n if (!customerImpersonationToken)\n throw new Error('Something went wrong, customerImpersonationToken is not defined');\n\n writeEnv(projectDir, {\n channelId: channelId.toString(),\n storeHash,\n customerImpersonationToken,\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\nexport const telemetryPreHook = async (command: Command) => {\n const [commandName] = command.args;\n\n await telemetry.track(commandName, {});\n};\n\nexport const telemetryPostHook = async () => {\n await telemetry.analytics.closeAndFlush();\n};\n"],"mappings":"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","names":["chalk","select","chalk","execSync","join","z","execSync","execSync","execSync","execSync","z","process","process","z","chalk","chalk","chalk","chalk","randomBytes","execSync","chalk","z","join","select","Command","Option","input","select","chalk","z","Command","Option","chalk","select","input","Command","parse","outputFileSync","kebabCase","z","z","Command","kebabCase","parse","outputFileSync","Command","Option","chalk","telemetry","chalk","telemetry","Command","Option","telemetry","chalk","telemetry"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bigcommerce/create-catalyst",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.14.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": "bin/index.cjs",
|
|
6
6
|
"files": [
|
|
@@ -13,8 +13,10 @@
|
|
|
13
13
|
"dependencies": {
|
|
14
14
|
"@commander-js/extra-typings": "^12.1.0",
|
|
15
15
|
"@inquirer/prompts": "^7.0.0",
|
|
16
|
+
"@segment/analytics-node": "^2.2.0",
|
|
16
17
|
"chalk": "^5.3.0",
|
|
17
18
|
"commander": "^12.1.0",
|
|
19
|
+
"conf": "^13.0.1",
|
|
18
20
|
"dotenv": "^16.4.5",
|
|
19
21
|
"fs-extra": "^11.2.0",
|
|
20
22
|
"giget": "^1.2.3",
|
|
@@ -22,25 +24,26 @@
|
|
|
22
24
|
"nypm": "^0.3.12",
|
|
23
25
|
"ora": "^8.1.0",
|
|
24
26
|
"semver": "^7.6.3",
|
|
27
|
+
"std-env": "^3.7.0",
|
|
25
28
|
"zod": "^3.23.8",
|
|
26
29
|
"zod-validation-error": "^3.4.0"
|
|
27
30
|
},
|
|
28
31
|
"devDependencies": {
|
|
29
32
|
"@bigcommerce/eslint-config": "^2.9.1",
|
|
30
|
-
"@swc/core": "^1.7.
|
|
33
|
+
"@swc/core": "^1.7.35",
|
|
31
34
|
"@swc/jest": "^0.2.36",
|
|
32
35
|
"@types/fs-extra": "^11.0.4",
|
|
33
36
|
"@types/jest": "^29.5.13",
|
|
34
37
|
"@types/lodash.kebabcase": "^4.1.9",
|
|
35
|
-
"@types/node": "^20.16.
|
|
38
|
+
"@types/node": "^20.16.11",
|
|
36
39
|
"@types/prompts": "^2.4.9",
|
|
37
40
|
"@types/semver": "^7.5.8",
|
|
38
41
|
"eslint": "^8.57.1",
|
|
39
42
|
"jest": "^29.7.0",
|
|
40
|
-
"msw": "^2.4.
|
|
43
|
+
"msw": "^2.4.11",
|
|
41
44
|
"prettier": "^3.3.3",
|
|
42
45
|
"tsup": "^8.3.0",
|
|
43
|
-
"typescript": "^5.6.
|
|
46
|
+
"typescript": "^5.6.3",
|
|
44
47
|
"@bigcommerce/eslint-config-catalyst": "^0.1.2"
|
|
45
48
|
},
|
|
46
49
|
"scripts": {
|