@bigcommerce/create-catalyst 0.10.0 → 0.11.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 CHANGED
@@ -58,7 +58,7 @@ import chalk8 from "chalk";
58
58
  // package.json
59
59
  var package_default = {
60
60
  name: "@bigcommerce/create-catalyst",
61
- version: "0.9.0",
61
+ version: "0.11.0",
62
62
  type: "module",
63
63
  bin: "bin/index.cjs",
64
64
  files: [
@@ -77,50 +77,209 @@ var package_default = {
77
77
  },
78
78
  dependencies: {
79
79
  "@commander-js/extra-typings": "^12.1.0",
80
- "@inquirer/prompts": "^5.1.2",
80
+ "@inquirer/prompts": "^5.3.8",
81
81
  chalk: "^5.3.0",
82
82
  commander: "^12.1.0",
83
+ dotenv: "^16.4.5",
83
84
  "fs-extra": "^11.2.0",
84
85
  giget: "^1.2.3",
85
86
  "lodash.kebabcase": "^4.1.1",
86
87
  "lodash.merge": "^4.6.2",
87
88
  nypm: "^0.3.9",
88
89
  ora: "^8.0.1",
89
- semver: "^7.6.2",
90
+ semver: "^7.6.3",
90
91
  zod: "^3.23.8",
91
- "zod-validation-error": "^3.3.0"
92
+ "zod-validation-error": "^3.3.1"
92
93
  },
93
94
  devDependencies: {
94
95
  "@bigcommerce/eslint-config": "^2.9.0",
95
96
  "@bigcommerce/eslint-config-catalyst": "workspace:^",
96
- "@swc/core": "^1.6.13",
97
+ "@swc/core": "^1.7.3",
97
98
  "@swc/jest": "^0.2.36",
98
99
  "@types/fs-extra": "^11.0.4",
99
100
  "@types/jest": "^29.5.12",
100
101
  "@types/lodash.kebabcase": "^4.1.9",
101
102
  "@types/lodash.merge": "^4.6.9",
102
- "@types/node": "^20.14.10",
103
+ "@types/node": "^20.14.15",
103
104
  "@types/prompts": "^2.4.9",
104
105
  "@types/semver": "^7.5.8",
105
106
  eslint: "^8.57.0",
106
107
  jest: "^29.7.0",
107
- msw: "^2.3.1",
108
+ msw: "^2.3.5",
108
109
  prettier: "^3.3.3",
109
- tsup: "^8.1.0",
110
- typescript: "^5.5.3"
110
+ tsup: "^8.2.4",
111
+ typescript: "^5.5.4"
111
112
  }
112
113
  };
113
114
 
114
115
  // src/commands/create.ts
115
- import { Command, Option } from "@commander-js/extra-typings";
116
+ import { Command as Command2, Option } from "@commander-js/extra-typings";
116
117
  import { input, select as select2 } from "@inquirer/prompts";
117
118
  import chalk6 from "chalk";
118
- import { exec as execCallback } from "child_process";
119
+ import { exec as execCallback2 } from "child_process";
119
120
  import { pathExistsSync } from "fs-extra/esm";
121
+ import kebabCase2 from "lodash.kebabcase";
122
+ import { join as join4 } from "path";
123
+ import { promisify as promisify3 } from "util";
124
+ import { z as z6 } from "zod";
125
+
126
+ // src/utils/apply-integration.ts
127
+ import { exec as execCallback } from "child_process";
128
+ import { readJsonSync } from "fs-extra/esm";
129
+ import { downloadTemplate } from "giget";
130
+ import { addDependency, addDevDependency } from "nypm";
131
+ import { join } from "path";
132
+ import { promisify as promisify2 } from "util";
133
+
134
+ // src/commands/integration.ts
135
+ import { Command } from "@commander-js/extra-typings";
136
+ import { exec as execCb } from "child_process";
137
+ import { parse } from "dotenv";
138
+ import { outputFileSync, writeJsonSync } from "fs-extra/esm";
120
139
  import kebabCase from "lodash.kebabcase";
121
- import { join as join3 } from "path";
140
+ import { coerce, compare } from "semver";
122
141
  import { promisify } from "util";
123
- import { z as z5 } from "zod";
142
+ import { z } from "zod";
143
+ var exec = promisify(execCb);
144
+ var ManifestSchema = z.object({
145
+ name: z.string(),
146
+ dependencies: z.object({ add: z.array(z.string()) }),
147
+ devDependencies: z.object({ add: z.array(z.string()) }),
148
+ environmentVariables: z.array(z.string())
149
+ });
150
+ var integration = new Command("integration").argument("<integration-name>", "Formatted name of the integration").option("--commit-hash <hash>", "Override integration source branch with a specific commit hash").action((integrationNameRaw, options) => __async(void 0, null, function* () {
151
+ const integrationName = z.string().transform(kebabCase).parse(integrationNameRaw);
152
+ const manifest = {
153
+ name: integrationName,
154
+ dependencies: { add: [] },
155
+ devDependencies: { add: [] },
156
+ environmentVariables: []
157
+ };
158
+ yield exec("git fetch --tags");
159
+ const { stdout: headRefStdOut } = yield exec("git rev-parse --abbrev-ref HEAD");
160
+ let [sourceRef] = headRefStdOut.split("\n");
161
+ if (options.commitHash) {
162
+ sourceRef = options.commitHash;
163
+ }
164
+ const { stdout: catalystTags } = yield exec("git tag --list @bigcommerce/catalyst-core@\\*");
165
+ const [latestCoreTag] = catalystTags.split("\n").filter(Boolean).sort((a, b) => {
166
+ const versionA = coerce(a.replace("@bigcommerce/catalyst-core@", ""));
167
+ const versionB = coerce(b.replace("@bigcommerce/catalyst-core@", ""));
168
+ if (versionA && versionB) {
169
+ return compare(versionA, versionB);
170
+ }
171
+ return 0;
172
+ }).reverse();
173
+ const PackageDependenciesSchema = z.object({
174
+ dependencies: z.object({}).passthrough(),
175
+ devDependencies: z.object({}).passthrough()
176
+ });
177
+ const getPackageDeps = (ref) => __async(void 0, null, function* () {
178
+ const { stdout } = yield exec(`git show ${ref}:core/package.json`);
179
+ return PackageDependenciesSchema.parse(JSON.parse(stdout));
180
+ });
181
+ const integrationJson = yield getPackageDeps(sourceRef);
182
+ const latestCoreTagJson = yield getPackageDeps(latestCoreTag);
183
+ const diffObjectKeys = (a, b) => {
184
+ return Object.keys(a).filter((key) => !Object.keys(b).includes(key));
185
+ };
186
+ manifest.dependencies.add = diffObjectKeys(
187
+ integrationJson.dependencies,
188
+ latestCoreTagJson.dependencies
189
+ );
190
+ manifest.devDependencies.add = diffObjectKeys(
191
+ integrationJson.devDependencies,
192
+ latestCoreTagJson.devDependencies
193
+ );
194
+ const { stdout: latestCoreEnv } = yield exec(`git show ${latestCoreTag}:core/.env.example`);
195
+ const { stdout: integrationEnv } = yield exec(`git show ${sourceRef}:core/.env.example`);
196
+ manifest.environmentVariables = diffObjectKeys(parse(integrationEnv), parse(latestCoreEnv));
197
+ const { stdout: integrationDiff } = yield exec(
198
+ `git diff ${latestCoreTag}...${sourceRef} -- ':(exclude)core/package.json' ':(exclude)pnpm-lock.yaml'`
199
+ );
200
+ outputFileSync(`integrations/${integrationName}/integration.patch`, integrationDiff);
201
+ writeJsonSync(`integrations/${integrationName}/manifest.json`, manifest, {
202
+ spaces: 2
203
+ });
204
+ console.log("Integration created successfully.");
205
+ }));
206
+
207
+ // src/utils/spinner.ts
208
+ import { oraPromise } from "ora";
209
+ var spinner = (action, oraOpts) => __async(void 0, null, function* () {
210
+ return oraPromise(action, __spreadValues({
211
+ spinner: "triangle"
212
+ }, oraOpts)).catch(() => process.exit(1));
213
+ });
214
+
215
+ // src/utils/apply-integration.ts
216
+ var exec2 = promisify2(execCallback);
217
+ function applyIntegration(_0, _1) {
218
+ return __async(this, arguments, function* (integration2, { projectDir, packageManager }) {
219
+ if (!integration2) {
220
+ return;
221
+ }
222
+ const integrationDir = join(projectDir, "integrations", integration2);
223
+ yield spinner(
224
+ downloadTemplate(`github:bigcommerce/catalyst/integrations/${integration2}#main`, {
225
+ dir: integrationDir,
226
+ offline: false
227
+ }),
228
+ {
229
+ text: `Cloning ${integration2} integration...`,
230
+ successText: `${integration2} integration cloned successfully`,
231
+ failText: (err) => `Failed to clone ${integration2} integration: ${err.message}`
232
+ }
233
+ );
234
+ try {
235
+ readJsonSync(join(integrationDir, "manifest.json"));
236
+ } catch (err) {
237
+ console.error(
238
+ `
239
+ No manifest.json found in the ${integration2} integration folder. Please check that the integration exists in the Catalyst monorepo: https://github.com/bigcommerce/catalyst`
240
+ );
241
+ return;
242
+ }
243
+ const manifest = ManifestSchema.parse(readJsonSync(join(integrationDir, "manifest.json")));
244
+ if (manifest.dependencies.add.length) {
245
+ yield spinner(
246
+ addDependency(manifest.dependencies.add, {
247
+ cwd: projectDir,
248
+ silent: true,
249
+ packageManager
250
+ }),
251
+ {
252
+ text: "Installing integration dependencies...",
253
+ successText: "Integration dependencies installed successfully",
254
+ failText: (err) => `Failed to install dependencies: ${err.message}`
255
+ }
256
+ );
257
+ }
258
+ if (manifest.devDependencies.add.length) {
259
+ yield spinner(
260
+ addDevDependency(manifest.devDependencies.add, {
261
+ cwd: projectDir,
262
+ silent: true,
263
+ packageManager
264
+ }),
265
+ {
266
+ text: "Installing integration development dependencies...",
267
+ successText: "Integration development dependencies installed successfully",
268
+ failText: (err) => `Failed to install integration development dependencies: ${err.message}`
269
+ }
270
+ );
271
+ }
272
+ yield spinner(
273
+ exec2(`git apply -p2 ${join(integrationDir, "integration.patch")}`, { cwd: projectDir }),
274
+ {
275
+ text: "Applying integration patch...",
276
+ successText: "Integration patch applied successfully",
277
+ failText: (err) => `Failed to apply integration patch: ${err.message}`
278
+ }
279
+ );
280
+ console.log("\nIntegration applied successfully! Feel free to delete the `integrations` folder.");
281
+ });
282
+ }
124
283
 
125
284
  // src/utils/check-storefront-limit.ts
126
285
  import chalk from "chalk";
@@ -153,21 +312,11 @@ var checkStorefrontLimit = (channels, storeInfo) => {
153
312
  // src/utils/clone-catalyst.ts
154
313
  import chalk2 from "chalk";
155
314
  import { readFile, writeFile } from "fs/promises";
156
- import { ensureDir, readJsonSync, removeSync, writeJsonSync } from "fs-extra/esm";
157
- import { downloadTemplate } from "giget";
315
+ import { ensureDir, readJsonSync as readJsonSync2, removeSync, writeJsonSync as writeJsonSync2 } from "fs-extra/esm";
316
+ import { downloadTemplate as downloadTemplate2 } from "giget";
158
317
  import merge from "lodash.merge";
159
- import { join } from "path";
160
- import * as z from "zod";
161
-
162
- // src/utils/spinner.ts
163
- import { oraPromise } from "ora";
164
- var spinner = (action, oraOpts) => __async(void 0, null, function* () {
165
- return oraPromise(action, __spreadValues({
166
- spinner: "triangle"
167
- }, oraOpts)).catch(() => process.exit(1));
168
- });
169
-
170
- // src/utils/clone-catalyst.ts
318
+ import { join as join2 } from "path";
319
+ import * as z2 from "zod";
171
320
  var cloneCatalyst = (_0) => __async(void 0, [_0], function* ({
172
321
  codeEditor,
173
322
  includeFunctionalTests,
@@ -177,7 +326,7 @@ var cloneCatalyst = (_0) => __async(void 0, [_0], function* ({
177
326
  }) {
178
327
  var _a;
179
328
  yield spinner(
180
- downloadTemplate(`github:bigcommerce/catalyst/core#${ghRef}`, {
329
+ downloadTemplate2(`github:bigcommerce/catalyst/core#${ghRef}`, {
181
330
  dir: projectDir,
182
331
  offline: false
183
332
  }),
@@ -189,9 +338,9 @@ var cloneCatalyst = (_0) => __async(void 0, [_0], function* ({
189
338
  );
190
339
  switch (codeEditor) {
191
340
  case "vscode":
192
- yield ensureDir(join(projectDir, ".vscode"));
193
- writeJsonSync(
194
- join(projectDir, ".vscode/settings.json"),
341
+ yield ensureDir(join2(projectDir, ".vscode"));
342
+ writeJsonSync2(
343
+ join2(projectDir, ".vscode/settings.json"),
195
344
  { "typescript.tsdk": "node_modules/typescript/lib" },
196
345
  { spaces: 2 }
197
346
  );
@@ -199,15 +348,15 @@ var cloneCatalyst = (_0) => __async(void 0, [_0], function* ({
199
348
  default:
200
349
  break;
201
350
  }
202
- const packageJson = z.object({
203
- name: z.string(),
204
- description: z.string(),
205
- version: z.string(),
206
- scripts: z.object({}).passthrough().optional(),
207
- dependencies: z.object({}).passthrough(),
208
- devDependencies: z.object({}).passthrough()
351
+ const packageJson = z2.object({
352
+ name: z2.string(),
353
+ description: z2.string(),
354
+ version: z2.string(),
355
+ scripts: z2.object({}).passthrough().optional(),
356
+ dependencies: z2.object({}).passthrough(),
357
+ devDependencies: z2.object({}).passthrough()
209
358
  }).passthrough().parse(
210
- merge({}, readJsonSync(join(projectDir, "package.json")), {
359
+ merge({}, readJsonSync2(join2(projectDir, "package.json")), {
211
360
  name: projectName,
212
361
  description: ""
213
362
  })
@@ -218,31 +367,31 @@ var cloneCatalyst = (_0) => __async(void 0, [_0], function* ({
218
367
  delete packageJson.devDependencies["@faker-js/faker"];
219
368
  delete packageJson.devDependencies["@playwright/test"];
220
369
  }
221
- writeJsonSync(join(projectDir, "package.json"), packageJson, { spaces: 2 });
370
+ writeJsonSync2(join2(projectDir, "package.json"), packageJson, { spaces: 2 });
222
371
  if (!includeFunctionalTests) {
223
- const tsConfigJson = z.object({
224
- include: z.array(z.string()).optional()
225
- }).passthrough().parse(readJsonSync(join(projectDir, "tsconfig.json")));
372
+ const tsConfigJson = z2.object({
373
+ include: z2.array(z2.string()).optional()
374
+ }).passthrough().parse(readJsonSync2(join2(projectDir, "tsconfig.json")));
226
375
  tsConfigJson.include = (_a = tsConfigJson.include) == null ? void 0 : _a.filter(
227
376
  (include) => !["tests/**/*", "playwright.config.ts"].includes(include)
228
377
  );
229
- writeJsonSync(join(projectDir, "tsconfig.json"), tsConfigJson, { spaces: 2 });
378
+ writeJsonSync2(join2(projectDir, "tsconfig.json"), tsConfigJson, { spaces: 2 });
230
379
  }
231
380
  if (!includeFunctionalTests) {
232
- const eslint = (yield readFile(join(projectDir, ".eslintrc.cjs"), { encoding: "utf-8" })).replace(/['"]playwright-report\/\*\*['"],?/, "").replace(/['"]test-results\/\*\*['"],?/, "");
233
- yield writeFile(join(projectDir, ".eslintrc.cjs"), eslint);
234
- removeSync(join(projectDir, "tests"));
235
- removeSync(join(projectDir, "playwright.config.ts"));
381
+ const eslint = (yield readFile(join2(projectDir, ".eslintrc.cjs"), { encoding: "utf-8" })).replace(/['"]playwright-report\/\*\*['"],?/, "").replace(/['"]test-results\/\*\*['"],?/, "");
382
+ yield writeFile(join2(projectDir, ".eslintrc.cjs"), eslint);
383
+ removeSync(join2(projectDir, "tests"));
384
+ removeSync(join2(projectDir, "playwright.config.ts"));
236
385
  }
237
386
  });
238
387
 
239
388
  // src/utils/get-latest-core-tag.ts
240
- import * as z2 from "zod";
389
+ import * as z3 from "zod";
241
390
  var getLatestCoreTag = () => __async(void 0, null, function* () {
242
391
  const rawPackageJsonUrl = "https://raw.githubusercontent.com/bigcommerce/catalyst/main/core/package.json";
243
392
  const response = yield fetch(rawPackageJsonUrl);
244
393
  try {
245
- const { version } = z2.object({ version: z2.string() }).parse(yield response.json());
394
+ const { version } = z3.object({ version: z3.string() }).parse(yield response.json());
246
395
  return `@bigcommerce/catalyst-core@${version}`;
247
396
  } catch (err) {
248
397
  throw new Error("Unable to determine the latest valid Catalyst release");
@@ -251,16 +400,16 @@ var getLatestCoreTag = () => __async(void 0, null, function* () {
251
400
 
252
401
  // src/utils/https.ts
253
402
  import chalk3 from "chalk";
254
- import { z as z4 } from "zod";
403
+ import { z as z5 } from "zod";
255
404
 
256
405
  // src/utils/parse.ts
257
- import * as z3 from "zod";
406
+ import * as z4 from "zod";
258
407
  import { fromZodError } from "zod-validation-error";
259
- var parse = (data, schema) => {
408
+ var parse2 = (data, schema) => {
260
409
  try {
261
410
  return schema.parse(data);
262
411
  } catch (error) {
263
- if (error instanceof z3.ZodError) {
412
+ if (error instanceof z4.ZodError) {
264
413
  console.error(fromZodError(error).toString());
265
414
  }
266
415
  process.exit(1);
@@ -268,25 +417,25 @@ var parse = (data, schema) => {
268
417
  };
269
418
 
270
419
  // src/utils/https.ts
271
- var BigCommerceStoreInfo = z4.object({
272
- features: z4.object({
273
- storefront_limits: z4.object({
274
- active: z4.number(),
275
- total_including_inactive: z4.number()
420
+ var BigCommerceStoreInfo = z5.object({
421
+ features: z5.object({
422
+ storefront_limits: z5.object({
423
+ active: z5.number(),
424
+ total_including_inactive: z5.number()
276
425
  })
277
426
  })
278
427
  });
279
- var BigCommerceV3ApiResponseSchema = (schema) => z4.object({
428
+ var BigCommerceV3ApiResponseSchema = (schema) => z5.object({
280
429
  data: schema,
281
- meta: z4.object({})
430
+ meta: z5.object({})
282
431
  });
283
432
  var BigCommerceChannelsV3ResponseSchema = BigCommerceV3ApiResponseSchema(
284
- z4.array(
285
- z4.object({
286
- id: z4.number(),
287
- name: z4.string(),
288
- status: z4.string(),
289
- platform: z4.string()
433
+ z5.array(
434
+ z5.object({
435
+ id: z5.number(),
436
+ name: z5.string(),
437
+ status: z5.string(),
438
+ platform: z5.string()
290
439
  })
291
440
  )
292
441
  );
@@ -343,14 +492,14 @@ POST /device/token failed: ${response.status} ${response.statusText}
343
492
  );
344
493
  process.exit(1);
345
494
  }
346
- const DeviceCodeSchema = z4.object({
347
- device_code: z4.string(),
348
- user_code: z4.string(),
349
- verification_uri: z4.string(),
350
- expires_in: z4.number(),
351
- interval: z4.number()
495
+ const DeviceCodeSchema = z5.object({
496
+ device_code: z5.string(),
497
+ user_code: z5.string(),
498
+ verification_uri: z5.string(),
499
+ expires_in: z5.number(),
500
+ interval: z5.number()
352
501
  });
353
- return parse(yield response.json(), DeviceCodeSchema);
502
+ return parse2(yield response.json(), DeviceCodeSchema);
354
503
  });
355
504
  }
356
505
  checkDeviceCode(deviceCode) {
@@ -364,13 +513,13 @@ POST /device/token failed: ${response.status} ${response.statusText}
364
513
  if (response.status !== 200) {
365
514
  throw new Error("Device code not yet verified");
366
515
  }
367
- const DeviceCodeSuccessSchema = z4.object({
368
- access_token: z4.string(),
369
- store_hash: z4.string(),
370
- context: z4.string(),
371
- api_uri: z4.string().url()
516
+ const DeviceCodeSuccessSchema = z5.object({
517
+ access_token: z5.string(),
518
+ store_hash: z5.string(),
519
+ context: z5.string(),
520
+ api_uri: z5.string().url()
372
521
  });
373
- return parse(yield response.json(), DeviceCodeSuccessSchema);
522
+ return parse2(yield response.json(), DeviceCodeSuccessSchema);
374
523
  });
375
524
  }
376
525
  api(path, opts = {}) {
@@ -397,7 +546,7 @@ GET /v2/store failed: ${res.status} ${res.statusText}
397
546
  `));
398
547
  process.exit(1);
399
548
  }
400
- return parse(yield res.json(), BigCommerceStoreInfo);
549
+ return parse2(yield res.json(), BigCommerceStoreInfo);
401
550
  });
402
551
  }
403
552
  channels(query = "") {
@@ -409,7 +558,7 @@ GET /v3/channels failed: ${res.status} ${res.statusText}
409
558
  `));
410
559
  process.exit(1);
411
560
  }
412
- return parse(yield res.json(), BigCommerceChannelsV3ResponseSchema);
561
+ return parse2(yield res.json(), BigCommerceChannelsV3ResponseSchema);
413
562
  });
414
563
  }
415
564
  createChannelMenus(channelId) {
@@ -455,12 +604,12 @@ POST /v3/storefront/api-token-customer-impersonation failed: ${res.status} ${res
455
604
  );
456
605
  process.exit(1);
457
606
  }
458
- const BigCommerceCustomerImpersonationTokenSchema = z4.object({
459
- data: z4.object({
460
- token: z4.string()
607
+ const BigCommerceCustomerImpersonationTokenSchema = z5.object({
608
+ data: z5.object({
609
+ token: z5.string()
461
610
  })
462
611
  });
463
- return parse(yield res.json(), BigCommerceCustomerImpersonationTokenSchema);
612
+ return parse2(yield res.json(), BigCommerceCustomerImpersonationTokenSchema);
464
613
  });
465
614
  }
466
615
  sampleDataApi(path, opts = {}) {
@@ -493,29 +642,29 @@ POST /v3/channels/catalyst failed: ${res.status} ${res.statusText}
493
642
  );
494
643
  process.exit(1);
495
644
  }
496
- const SampleDataChannelCreateSchema = z4.object({
497
- data: z4.object({
498
- id: z4.number(),
499
- name: z4.string().min(1),
500
- storefront_api_token: z4.string()
645
+ const SampleDataChannelCreateSchema = z5.object({
646
+ data: z5.object({
647
+ id: z5.number(),
648
+ name: z5.string().min(1),
649
+ storefront_api_token: z5.string()
501
650
  })
502
651
  });
503
- return parse(yield res.json(), SampleDataChannelCreateSchema);
652
+ return parse2(yield res.json(), SampleDataChannelCreateSchema);
504
653
  });
505
654
  }
506
655
  };
507
656
 
508
657
  // src/utils/install-dependencies.ts
509
658
  import chalk4 from "chalk";
510
- import { addDependency, addDevDependency, installDependencies as installDeps } from "nypm";
659
+ import { addDependency as addDependency2, addDevDependency as addDevDependency2, installDependencies as installDeps } from "nypm";
511
660
  var installAllDeps = (projectDir, packageManager) => __async(void 0, null, function* () {
512
661
  yield installDeps({ cwd: projectDir, silent: true, packageManager });
513
- yield addDependency("@bigcommerce/catalyst-client", {
662
+ yield addDependency2("@bigcommerce/catalyst-client", {
514
663
  cwd: projectDir,
515
664
  silent: true,
516
665
  packageManager
517
666
  });
518
- yield addDevDependency("@bigcommerce/eslint-config-catalyst", {
667
+ yield addDevDependency2("@bigcommerce/eslint-config-catalyst", {
519
668
  cwd: projectDir,
520
669
  silent: true,
521
670
  packageManager
@@ -603,16 +752,16 @@ function getPackageManager() {
603
752
 
604
753
  // src/utils/write-env.ts
605
754
  import { randomBytes } from "crypto";
606
- import { outputFileSync } from "fs-extra/esm";
607
- import { join as join2 } from "path";
755
+ import { outputFileSync as outputFileSync2 } from "fs-extra/esm";
756
+ import { join as join3 } from "path";
608
757
  var writeEnv = (projectDir, {
609
758
  channelId,
610
759
  storeHash,
611
760
  accessToken,
612
761
  customerImpersonationToken
613
762
  }) => {
614
- outputFileSync(
615
- join2(projectDir, ".env.local"),
763
+ outputFileSync2(
764
+ join3(projectDir, ".env.local"),
616
765
  [
617
766
  `AUTH_SECRET=${randomBytes(32).toString("hex")}`,
618
767
  `BIGCOMMERCE_STORE_HASH=${storeHash}`,
@@ -627,8 +776,8 @@ var writeEnv = (projectDir, {
627
776
  };
628
777
 
629
778
  // src/commands/create.ts
630
- var exec = promisify(execCallback);
631
- 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").addOption(
779
+ var exec3 = promisify3(execCallback2);
780
+ var create = new Command2("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("--integration <provider>", "Integration to apply to your new storefront").addOption(
632
781
  new Option(
633
782
  "--gh-ref <ref>",
634
783
  "Clone a specific ref from the bigcommerce/catalyst repository"
@@ -645,10 +794,10 @@ var create = new Command("create").description("Command to scaffold and connect
645
794
  new Option("--include-functional-tests", "Include the functional test suite").default(false).hideHelp()
646
795
  ).action((options) => __async(void 0, null, function* () {
647
796
  const { packageManager, codeEditor, includeFunctionalTests } = options;
648
- const URLSchema = z5.string().url();
649
- const sampleDataApiUrl = parse(options.sampleDataApiUrl, URLSchema);
650
- const bigcommerceApiUrl = parse(`https://api.${options.bigcommerceHostname}`, URLSchema);
651
- const bigcommerceAuthUrl = parse(`https://login.${options.bigcommerceHostname}`, URLSchema);
797
+ const URLSchema = z6.string().url();
798
+ const sampleDataApiUrl = parse2(options.sampleDataApiUrl, URLSchema);
799
+ const bigcommerceApiUrl = parse2(`https://api.${options.bigcommerceHostname}`, URLSchema);
800
+ const bigcommerceAuthUrl = parse2(`https://login.${options.bigcommerceHostname}`, URLSchema);
652
801
  let ghRef;
653
802
  if (options.ghRef instanceof Function) {
654
803
  ghRef = yield options.ghRef();
@@ -670,8 +819,8 @@ var create = new Command("create").description("Command to scaffold and connect
670
819
  process.exit(1);
671
820
  }
672
821
  if (options.projectName) {
673
- projectName = kebabCase(options.projectName);
674
- projectDir = join3(options.projectDir, projectName);
822
+ projectName = kebabCase2(options.projectName);
823
+ projectDir = join4(options.projectDir, projectName);
675
824
  if (pathExistsSync(projectDir)) {
676
825
  console.error(chalk6.red(`Error: ${projectDir} already exists
677
826
  `));
@@ -680,9 +829,9 @@ var create = new Command("create").description("Command to scaffold and connect
680
829
  }
681
830
  if (!options.projectName) {
682
831
  const validateProjectName = (i) => {
683
- const formatted = kebabCase(i);
832
+ const formatted = kebabCase2(i);
684
833
  if (!formatted) return "Project name is required";
685
- const targetDir = join3(options.projectDir, formatted);
834
+ const targetDir = join4(options.projectDir, formatted);
686
835
  if (pathExistsSync(targetDir)) return `Destination '${targetDir}' already exists`;
687
836
  projectName = formatted;
688
837
  projectDir = targetDir;
@@ -710,6 +859,7 @@ Creating '${projectName}' at '${projectDir}'
710
859
  Using ${chalk6.bold(packageManager)}
711
860
  `);
712
861
  yield installDependencies(projectDir, packageManager);
862
+ yield applyIntegration(options.integration, { projectDir, packageManager });
713
863
  console.log(
714
864
  [
715
865
  `
@@ -792,11 +942,12 @@ Creating '${projectName}' at '${projectDir}'
792
942
  Using ${chalk6.bold(packageManager)}
793
943
  `);
794
944
  yield installDependencies(projectDir, packageManager);
795
- yield spinner(exec(`${packageManager} run --prefix ${projectDir} generate`), {
945
+ yield spinner(exec3(`${packageManager} run --prefix ${projectDir} generate`), {
796
946
  text: "Creating GraphQL schema...",
797
947
  successText: "Created GraphQL schema",
798
948
  failText: (err) => chalk6.red(`Failed to create GraphQL schema: ${err.message}`)
799
949
  });
950
+ yield applyIntegration(options.integration, { projectDir, packageManager });
800
951
  console.log(
801
952
  `
802
953
  ${chalk6.green("Success!")} Created '${projectName}' at '${projectDir}'
@@ -809,18 +960,18 @@ cd ${projectName} && ${packageManager} run dev
809
960
  }));
810
961
 
811
962
  // src/commands/init.ts
812
- import { Command as Command2, Option as Option2 } from "@commander-js/extra-typings";
963
+ import { Command as Command3, Option as Option2 } from "@commander-js/extra-typings";
813
964
  import { input as input2, select as select3 } from "@inquirer/prompts";
814
965
  import chalk7 from "chalk";
815
- import * as z6 from "zod";
816
- 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(
966
+ import * as z7 from "zod";
967
+ var init = new Command3("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(
817
968
  new Option2("--bigcommerce-hostname <hostname>", "BigCommerce hostname").default("bigcommerce.com").hideHelp()
818
969
  ).addOption(
819
970
  new Option2("--sample-data-api-url <url>", "BigCommerce sample data API URL").default("https://api.bc-sample.store").hideHelp()
820
971
  ).action((options) => __async(void 0, null, function* () {
821
972
  const projectDir = process.cwd();
822
- const URLSchema = z6.string().url();
823
- const sampleDataApiUrl = parse(options.sampleDataApiUrl, URLSchema);
973
+ const URLSchema = z7.string().url();
974
+ const sampleDataApiUrl = parse2(options.sampleDataApiUrl, URLSchema);
824
975
  const bigCommerceApiUrl = `https://api.${options.bigcommerceHostname}`;
825
976
  const bigCommerceAuthUrl = `https://login.${options.bigcommerceHostname}`;
826
977
  let storeHash = options.storeHash;
@@ -900,6 +1051,6 @@ var init = new Command2("init").description("Connect a BigCommerce store with an
900
1051
  console.log(chalk8.cyanBright(`
901
1052
  \u25E2 ${package_default.name} v${package_default.version}
902
1053
  `));
903
- 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);
1054
+ 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);
904
1055
  program.parse(process.argv);
905
1056
  //# 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/spinner.ts","../src/utils/get-latest-core-tag.ts","../src/utils/https.ts","../src/utils/parse.ts","../src/utils/install-dependencies.ts","../src/utils/login.ts","../src/utils/pm.ts","../src/utils/write-env.ts","../src/commands/init.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';\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\nprogram.parse(process.argv);\n","{\n \"name\": \"@bigcommerce/create-catalyst\",\n \"version\": \"0.9.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\": \"^5.1.2\",\n \"chalk\": \"^5.3.0\",\n \"commander\": \"^12.1.0\",\n \"fs-extra\": \"^11.2.0\",\n \"giget\": \"^1.2.3\",\n \"lodash.kebabcase\": \"^4.1.1\",\n \"lodash.merge\": \"^4.6.2\",\n \"nypm\": \"^0.3.9\",\n \"ora\": \"^8.0.1\",\n \"semver\": \"^7.6.2\",\n \"zod\": \"^3.23.8\",\n \"zod-validation-error\": \"^3.3.0\"\n },\n \"devDependencies\": {\n \"@bigcommerce/eslint-config\": \"^2.9.0\",\n \"@bigcommerce/eslint-config-catalyst\": \"workspace:^\",\n \"@swc/core\": \"^1.6.13\",\n \"@swc/jest\": \"^0.2.36\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/jest\": \"^29.5.12\",\n \"@types/lodash.kebabcase\": \"^4.1.9\",\n \"@types/lodash.merge\": \"^4.6.9\",\n \"@types/node\": \"^20.14.10\",\n \"@types/prompts\": \"^2.4.9\",\n \"@types/semver\": \"^7.5.8\",\n \"eslint\": \"^8.57.0\",\n \"jest\": \"^29.7.0\",\n \"msw\": \"^2.3.1\",\n \"prettier\": \"^3.3.3\",\n \"tsup\": \"^8.1.0\",\n \"typescript\": \"^5.5.3\"\n }\n}\n","import { Command, Option } from '@commander-js/extra-typings';\nimport { input, select } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport { exec as execCallback } from 'child_process';\nimport { pathExistsSync } from 'fs-extra/esm';\nimport kebabCase from 'lodash.kebabcase';\nimport { join } from 'path';\nimport { promisify } from 'util';\nimport { z } from 'zod';\n\nimport { checkStorefrontLimit } from '../utils/check-storefront-limit';\nimport { cloneCatalyst } from '../utils/clone-catalyst';\nimport { getLatestCoreTag } from '../utils/get-latest-core-tag';\nimport { Https } from '../utils/https';\nimport { installDependencies } from '../utils/install-dependencies';\nimport { login } from '../utils/login';\nimport { parse } from '../utils/parse';\nimport { getPackageManager, packageManagerChoices } from '../utils/pm';\nimport { spinner } from '../utils/spinner';\nimport { writeEnv } from '../utils/write-env';\n\nconst exec = promisify(execCallback);\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 .addOption(\n new Option(\n '--gh-ref <ref>',\n 'Clone a specific ref from the bigcommerce/catalyst repository',\n ).default(getLatestCoreTag),\n )\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 .addOption(\n new Option('--package-manager <pm>', 'Override detected package manager')\n .choices(packageManagerChoices)\n .default(getPackageManager())\n .hideHelp(),\n )\n .addOption(\n new Option('--code-editor <editor>', 'Your preferred code editor')\n .choices(['vscode'])\n .default('vscode')\n .hideHelp(),\n )\n .addOption(\n new Option('--include-functional-tests', 'Include the functional test suite')\n .default(false)\n .hideHelp(),\n )\n .action(async (options) => {\n const { packageManager, codeEditor, includeFunctionalTests } = options;\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 ghRef: string;\n\n if (options.ghRef instanceof Function) {\n ghRef = await options.ghRef();\n } else {\n ghRef = options.ghRef;\n }\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 await cloneCatalyst({ projectDir, projectName, ghRef, codeEditor, includeFunctionalTests });\n\n console.log(`\\nUsing ${chalk.bold(packageManager)}\\n`);\n\n await installDependencies(projectDir, packageManager);\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 await cloneCatalyst({ projectDir, projectName, ghRef, codeEditor, includeFunctionalTests });\n\n writeEnv(projectDir, {\n channelId: channelId.toString(),\n storeHash,\n accessToken,\n customerImpersonationToken,\n });\n\n console.log(`\\nUsing ${chalk.bold(packageManager)}\\n`);\n\n await installDependencies(projectDir, packageManager);\n\n await spinner(exec(`${packageManager} run --prefix ${projectDir} generate`), {\n text: 'Creating GraphQL schema...',\n successText: 'Created GraphQL schema',\n failText: (err) => chalk.red(`Failed to create GraphQL schema: ${err.message}`),\n });\n\n console.log(\n `\\n${chalk.green('Success!')} Created '${projectName}' at '${projectDir}'\\n`,\n '\\nNext steps:\\n',\n chalk.yellow(`\\ncd ${projectName} && ${packageManager} 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 chalk from 'chalk';\nimport { readFile, writeFile } from 'fs/promises';\nimport { ensureDir, readJsonSync, removeSync, writeJsonSync } from 'fs-extra/esm';\nimport { downloadTemplate } from 'giget';\nimport merge from 'lodash.merge';\nimport { join } from 'path';\nimport * as z from 'zod';\n\nimport { spinner } from './spinner';\n\nexport const cloneCatalyst = async ({\n codeEditor,\n includeFunctionalTests,\n projectDir,\n projectName,\n ghRef = 'main',\n}: {\n codeEditor: string;\n includeFunctionalTests: boolean;\n projectDir: string;\n projectName: string;\n ghRef?: string;\n}) => {\n await spinner(\n downloadTemplate(`github:bigcommerce/catalyst/core#${ghRef}`, {\n dir: projectDir,\n offline: false,\n }),\n {\n text: 'Cloning Catalyst template...',\n successText: 'Catalyst template cloned successfully',\n failText: (err) => chalk.red(`Failed to clone Catalyst template: ${err.message}`),\n },\n );\n\n switch (codeEditor) {\n case 'vscode':\n await ensureDir(join(projectDir, '.vscode'));\n\n writeJsonSync(\n join(projectDir, '.vscode/settings.json'),\n { 'typescript.tsdk': 'node_modules/typescript/lib' },\n { spaces: 2 },\n );\n break;\n\n default:\n break;\n }\n\n const packageJson = z\n .object({\n name: z.string(),\n description: z.string(),\n version: z.string(),\n scripts: z.object({}).passthrough().optional(),\n dependencies: z.object({}).passthrough(),\n devDependencies: z.object({}).passthrough(),\n })\n .passthrough()\n .parse(\n merge({}, readJsonSync(join(projectDir, 'package.json')), {\n name: projectName,\n description: '',\n }),\n );\n\n delete packageJson.dependencies['@bigcommerce/catalyst-client'];\n delete packageJson.devDependencies['@bigcommerce/eslint-config-catalyst'];\n\n if (!includeFunctionalTests) {\n delete packageJson.devDependencies['@faker-js/faker'];\n delete packageJson.devDependencies['@playwright/test'];\n }\n\n writeJsonSync(join(projectDir, 'package.json'), packageJson, { spaces: 2 });\n\n if (!includeFunctionalTests) {\n const tsConfigJson = z\n .object({\n include: z.array(z.string()).optional(),\n })\n .passthrough()\n .parse(readJsonSync(join(projectDir, 'tsconfig.json')));\n\n tsConfigJson.include = tsConfigJson.include?.filter(\n (include) => !['tests/**/*', 'playwright.config.ts'].includes(include),\n );\n\n writeJsonSync(join(projectDir, 'tsconfig.json'), tsConfigJson, { spaces: 2 });\n }\n\n if (!includeFunctionalTests) {\n const eslint = (await readFile(join(projectDir, '.eslintrc.cjs'), { encoding: 'utf-8' }))\n .replace(/['\"]playwright-report\\/\\*\\*['\"],?/, '')\n .replace(/['\"]test-results\\/\\*\\*['\"],?/, '');\n\n await writeFile(join(projectDir, '.eslintrc.cjs'), eslint);\n\n removeSync(join(projectDir, 'tests'));\n removeSync(join(projectDir, 'playwright.config.ts'));\n }\n};\n","import { type Ora, oraPromise, type PromiseOptions } from 'ora';\n\nexport const spinner = async <T>(\n action: PromiseLike<T> | ((spinner: Ora) => PromiseLike<T>),\n oraOpts: PromiseOptions<T>,\n) => {\n return oraPromise(action, {\n spinner: 'triangle',\n ...oraOpts,\n }).catch(() => process.exit(1));\n};\n","import * as z from 'zod';\n\nexport const getLatestCoreTag = async () => {\n const rawPackageJsonUrl =\n 'https://raw.githubusercontent.com/bigcommerce/catalyst/main/core/package.json';\n\n const response = await fetch(rawPackageJsonUrl);\n\n try {\n const { version } = z.object({ version: z.string() }).parse(await response.json());\n\n return `@bigcommerce/catalyst-core@${version}`;\n } catch (err) {\n throw new Error('Unable to determine the latest valid Catalyst release');\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 { addDependency, addDevDependency, installDependencies as installDeps } from 'nypm';\n\nimport { type PackageManager } from './pm';\nimport { spinner } from './spinner';\n\nconst installAllDeps = async (projectDir: string, packageManager: PackageManager) => {\n await installDeps({ cwd: projectDir, silent: true, packageManager });\n await addDependency('@bigcommerce/catalyst-client', {\n cwd: projectDir,\n silent: true,\n packageManager,\n });\n await addDevDependency('@bigcommerce/eslint-config-catalyst', {\n cwd: projectDir,\n silent: true,\n packageManager,\n });\n};\n\nexport const installDependencies = async (projectDir: string, packageManager: PackageManager) =>\n spinner(installAllDeps(projectDir, packageManager), {\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","/* 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 (err) {\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","/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2024 Vercel, Inc.\n *\n * Sourced and modified from:\n * https://github.com/vercel/next.js/blob/771e29cb719b382e92d89cac11fbfcb818f5f628/packages/create-next-app/helpers/get-pkg-manager.ts\n *\n * License:\n * https://github.com/vercel/next.js/blob/771e29cb719b382e92d89cac11fbfcb818f5f628/license.md\n */\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn';\n\nexport const packageManagerChoices: PackageManager[] = ['npm', 'pnpm', 'yarn'];\n\nexport function getPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent ?? '';\n\n if (userAgent.startsWith('yarn')) {\n return 'yarn';\n }\n\n if (userAgent.startsWith('pnpm')) {\n return 'pnpm';\n }\n\n return 'npm';\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 accessToken,\n customerImpersonationToken,\n }: {\n channelId: string;\n storeHash: string;\n accessToken: string;\n customerImpersonationToken: string;\n },\n) => {\n /**\n * @todo silence request logs by default\n */\n outputFileSync(\n join(projectDir, '.env.local'),\n [\n `AUTH_SECRET=${randomBytes(32).toString('hex')}`,\n `BIGCOMMERCE_STORE_HASH=${storeHash}`,\n `BIGCOMMERCE_CHANNEL_ID=${channelId}`,\n `BIGCOMMERCE_ACCESS_TOKEN=${accessToken}`,\n `BIGCOMMERCE_CUSTOMER_IMPERSONATION_TOKEN=${customerImpersonationToken}`,\n `CLIENT_LOGGER=false`,\n `ENABLE_ADMIN_ROUTE=true`,\n `NEXT_PUBLIC_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 accessToken,\n customerImpersonationToken,\n });\n });\n"],"mappings":"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","names":["chalk","select","chalk","join","z","chalk","chalk","z","chalk","z","z","z","chalk","chalk","chalk","chalk","chalk","join","z","chalk","join","select","Command","Option","input","select","chalk","z","Command","Option","chalk","select","input","chalk"]}
1
+ {"version":3,"sources":["../src/index.ts","../package.json","../src/commands/create.ts","../src/utils/apply-integration.ts","../src/commands/integration.ts","../src/utils/spinner.ts","../src/utils/check-storefront-limit.ts","../src/utils/clone-catalyst.ts","../src/utils/get-latest-core-tag.ts","../src/utils/https.ts","../src/utils/parse.ts","../src/utils/install-dependencies.ts","../src/utils/login.ts","../src/utils/pm.ts","../src/utils/write-env.ts","../src/commands/init.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.11.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\": \"^5.3.8\",\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 \"lodash.merge\": \"^4.6.2\",\n \"nypm\": \"^0.3.9\",\n \"ora\": \"^8.0.1\",\n \"semver\": \"^7.6.3\",\n \"zod\": \"^3.23.8\",\n \"zod-validation-error\": \"^3.3.1\"\n },\n \"devDependencies\": {\n \"@bigcommerce/eslint-config\": \"^2.9.0\",\n \"@bigcommerce/eslint-config-catalyst\": \"workspace:^\",\n \"@swc/core\": \"^1.7.3\",\n \"@swc/jest\": \"^0.2.36\",\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/jest\": \"^29.5.12\",\n \"@types/lodash.kebabcase\": \"^4.1.9\",\n \"@types/lodash.merge\": \"^4.6.9\",\n \"@types/node\": \"^20.14.15\",\n \"@types/prompts\": \"^2.4.9\",\n \"@types/semver\": \"^7.5.8\",\n \"eslint\": \"^8.57.0\",\n \"jest\": \"^29.7.0\",\n \"msw\": \"^2.3.5\",\n \"prettier\": \"^3.3.3\",\n \"tsup\": \"^8.2.4\",\n \"typescript\": \"^5.5.4\"\n }\n}\n","import { Command, Option } from '@commander-js/extra-typings';\nimport { input, select } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport { exec as execCallback } from 'child_process';\nimport { pathExistsSync } from 'fs-extra/esm';\nimport kebabCase from 'lodash.kebabcase';\nimport { join } from 'path';\nimport { promisify } from 'util';\nimport { z } from 'zod';\n\nimport { applyIntegration } from '../utils/apply-integration';\nimport { checkStorefrontLimit } from '../utils/check-storefront-limit';\nimport { cloneCatalyst } from '../utils/clone-catalyst';\nimport { getLatestCoreTag } from '../utils/get-latest-core-tag';\nimport { Https } from '../utils/https';\nimport { installDependencies } from '../utils/install-dependencies';\nimport { login } from '../utils/login';\nimport { parse } from '../utils/parse';\nimport { getPackageManager, packageManagerChoices } from '../utils/pm';\nimport { spinner } from '../utils/spinner';\nimport { writeEnv } from '../utils/write-env';\n\nconst exec = promisify(execCallback);\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('--integration <provider>', 'Integration to apply to your new storefront')\n .addOption(\n new Option(\n '--gh-ref <ref>',\n 'Clone a specific ref from the bigcommerce/catalyst repository',\n ).default(getLatestCoreTag),\n )\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 .addOption(\n new Option('--package-manager <pm>', 'Override detected package manager')\n .choices(packageManagerChoices)\n .default(getPackageManager())\n .hideHelp(),\n )\n .addOption(\n new Option('--code-editor <editor>', 'Your preferred code editor')\n .choices(['vscode'])\n .default('vscode')\n .hideHelp(),\n )\n .addOption(\n new Option('--include-functional-tests', 'Include the functional test suite')\n .default(false)\n .hideHelp(),\n )\n .action(async (options) => {\n const { packageManager, codeEditor, includeFunctionalTests } = options;\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 ghRef: string;\n\n if (options.ghRef instanceof Function) {\n ghRef = await options.ghRef();\n } else {\n ghRef = options.ghRef;\n }\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 await cloneCatalyst({ projectDir, projectName, ghRef, codeEditor, includeFunctionalTests });\n\n console.log(`\\nUsing ${chalk.bold(packageManager)}\\n`);\n\n await installDependencies(projectDir, packageManager);\n\n await applyIntegration(options.integration, { projectDir, packageManager });\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 await cloneCatalyst({ projectDir, projectName, ghRef, codeEditor, includeFunctionalTests });\n\n writeEnv(projectDir, {\n channelId: channelId.toString(),\n storeHash,\n accessToken,\n customerImpersonationToken,\n });\n\n console.log(`\\nUsing ${chalk.bold(packageManager)}\\n`);\n\n await installDependencies(projectDir, packageManager);\n\n await spinner(exec(`${packageManager} run --prefix ${projectDir} generate`), {\n text: 'Creating GraphQL schema...',\n successText: 'Created GraphQL schema',\n failText: (err) => chalk.red(`Failed to create GraphQL schema: ${err.message}`),\n });\n\n await applyIntegration(options.integration, { projectDir, packageManager });\n\n console.log(\n `\\n${chalk.green('Success!')} Created '${projectName}' at '${projectDir}'\\n`,\n '\\nNext steps:\\n',\n chalk.yellow(`\\ncd ${projectName} && ${packageManager} run dev\\n`),\n );\n });\n","import { exec as execCallback } from 'child_process';\nimport { readJsonSync } from 'fs-extra/esm';\nimport { downloadTemplate } from 'giget';\nimport { addDependency, addDevDependency } from 'nypm';\nimport { join } from 'path';\nimport { promisify } from 'util';\n\nimport { ManifestSchema } from '../commands/integration';\n\nimport { PackageManager } from './pm';\nimport { spinner } from './spinner';\n\nconst exec = promisify(execCallback);\n\nexport async function applyIntegration(\n integration: string | undefined,\n { projectDir, packageManager }: { projectDir: string; packageManager: PackageManager },\n) {\n if (!integration) {\n return;\n }\n\n const integrationDir = join(projectDir, 'integrations', integration);\n\n await spinner(\n downloadTemplate(`github:bigcommerce/catalyst/integrations/${integration}#main`, {\n dir: integrationDir,\n offline: false,\n }),\n {\n text: `Cloning ${integration} integration...`,\n successText: `${integration} integration cloned successfully`,\n failText: (err) => `Failed to clone ${integration} integration: ${err.message}`,\n },\n );\n\n try {\n readJsonSync(join(integrationDir, 'manifest.json'));\n } catch (err) {\n console.error(\n `\\nNo manifest.json found in the ${integration} integration folder. Please check that the integration exists in the Catalyst monorepo: https://github.com/bigcommerce/catalyst`,\n );\n\n return;\n }\n\n const manifest = ManifestSchema.parse(readJsonSync(join(integrationDir, 'manifest.json')));\n\n if (manifest.dependencies.add.length) {\n await spinner(\n addDependency(manifest.dependencies.add, {\n cwd: projectDir,\n silent: true,\n packageManager,\n }),\n {\n text: 'Installing integration dependencies...',\n successText: 'Integration dependencies installed successfully',\n failText: (err) => `Failed to install dependencies: ${err.message}`,\n },\n );\n }\n\n if (manifest.devDependencies.add.length) {\n await spinner(\n addDevDependency(manifest.devDependencies.add, {\n cwd: projectDir,\n silent: true,\n packageManager,\n }),\n {\n text: 'Installing integration development dependencies...',\n successText: 'Integration development dependencies installed successfully',\n failText: (err) => `Failed to install integration development dependencies: ${err.message}`,\n },\n );\n }\n\n await spinner(\n exec(`git apply -p2 ${join(integrationDir, 'integration.patch')}`, { cwd: projectDir }),\n {\n text: 'Applying integration patch...',\n successText: 'Integration patch applied successfully',\n failText: (err) => `Failed to apply integration patch: ${err.message}`,\n },\n );\n\n console.log('\\nIntegration applied successfully! Feel free to delete the `integrations` folder.');\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 { type Ora, oraPromise, type PromiseOptions } from 'ora';\n\nexport const spinner = async <T>(\n action: PromiseLike<T> | ((spinner: Ora) => PromiseLike<T>),\n oraOpts: PromiseOptions<T>,\n) => {\n return oraPromise(action, {\n spinner: 'triangle',\n ...oraOpts,\n }).catch(() => process.exit(1));\n};\n","import chalk from 'chalk';\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 chalk from 'chalk';\nimport { readFile, writeFile } from 'fs/promises';\nimport { ensureDir, readJsonSync, removeSync, writeJsonSync } from 'fs-extra/esm';\nimport { downloadTemplate } from 'giget';\nimport merge from 'lodash.merge';\nimport { join } from 'path';\nimport * as z from 'zod';\n\nimport { spinner } from './spinner';\n\nexport const cloneCatalyst = async ({\n codeEditor,\n includeFunctionalTests,\n projectDir,\n projectName,\n ghRef = 'main',\n}: {\n codeEditor: string;\n includeFunctionalTests: boolean;\n projectDir: string;\n projectName: string;\n ghRef?: string;\n}) => {\n await spinner(\n downloadTemplate(`github:bigcommerce/catalyst/core#${ghRef}`, {\n dir: projectDir,\n offline: false,\n }),\n {\n text: 'Cloning Catalyst template...',\n successText: 'Catalyst template cloned successfully',\n failText: (err) => chalk.red(`Failed to clone Catalyst template: ${err.message}`),\n },\n );\n\n switch (codeEditor) {\n case 'vscode':\n await ensureDir(join(projectDir, '.vscode'));\n\n writeJsonSync(\n join(projectDir, '.vscode/settings.json'),\n { 'typescript.tsdk': 'node_modules/typescript/lib' },\n { spaces: 2 },\n );\n break;\n\n default:\n break;\n }\n\n const packageJson = z\n .object({\n name: z.string(),\n description: z.string(),\n version: z.string(),\n scripts: z.object({}).passthrough().optional(),\n dependencies: z.object({}).passthrough(),\n devDependencies: z.object({}).passthrough(),\n })\n .passthrough()\n .parse(\n merge({}, readJsonSync(join(projectDir, 'package.json')), {\n name: projectName,\n description: '',\n }),\n );\n\n delete packageJson.dependencies['@bigcommerce/catalyst-client'];\n delete packageJson.devDependencies['@bigcommerce/eslint-config-catalyst'];\n\n if (!includeFunctionalTests) {\n delete packageJson.devDependencies['@faker-js/faker'];\n delete packageJson.devDependencies['@playwright/test'];\n }\n\n writeJsonSync(join(projectDir, 'package.json'), packageJson, { spaces: 2 });\n\n if (!includeFunctionalTests) {\n const tsConfigJson = z\n .object({\n include: z.array(z.string()).optional(),\n })\n .passthrough()\n .parse(readJsonSync(join(projectDir, 'tsconfig.json')));\n\n tsConfigJson.include = tsConfigJson.include?.filter(\n (include) => !['tests/**/*', 'playwright.config.ts'].includes(include),\n );\n\n writeJsonSync(join(projectDir, 'tsconfig.json'), tsConfigJson, { spaces: 2 });\n }\n\n if (!includeFunctionalTests) {\n const eslint = (await readFile(join(projectDir, '.eslintrc.cjs'), { encoding: 'utf-8' }))\n .replace(/['\"]playwright-report\\/\\*\\*['\"],?/, '')\n .replace(/['\"]test-results\\/\\*\\*['\"],?/, '');\n\n await writeFile(join(projectDir, '.eslintrc.cjs'), eslint);\n\n removeSync(join(projectDir, 'tests'));\n removeSync(join(projectDir, 'playwright.config.ts'));\n }\n};\n","import * as z from 'zod';\n\nexport const getLatestCoreTag = async () => {\n const rawPackageJsonUrl =\n 'https://raw.githubusercontent.com/bigcommerce/catalyst/main/core/package.json';\n\n const response = await fetch(rawPackageJsonUrl);\n\n try {\n const { version } = z.object({ version: z.string() }).parse(await response.json());\n\n return `@bigcommerce/catalyst-core@${version}`;\n } catch (err) {\n throw new Error('Unable to determine the latest valid Catalyst release');\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 { addDependency, addDevDependency, installDependencies as installDeps } from 'nypm';\n\nimport { type PackageManager } from './pm';\nimport { spinner } from './spinner';\n\nconst installAllDeps = async (projectDir: string, packageManager: PackageManager) => {\n await installDeps({ cwd: projectDir, silent: true, packageManager });\n await addDependency('@bigcommerce/catalyst-client', {\n cwd: projectDir,\n silent: true,\n packageManager,\n });\n await addDevDependency('@bigcommerce/eslint-config-catalyst', {\n cwd: projectDir,\n silent: true,\n packageManager,\n });\n};\n\nexport const installDependencies = async (projectDir: string, packageManager: PackageManager) =>\n spinner(installAllDeps(projectDir, packageManager), {\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","/* 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 (err) {\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","/**\n * The MIT License (MIT)\n *\n * Copyright (c) 2024 Vercel, Inc.\n *\n * Sourced and modified from:\n * https://github.com/vercel/next.js/blob/771e29cb719b382e92d89cac11fbfcb818f5f628/packages/create-next-app/helpers/get-pkg-manager.ts\n *\n * License:\n * https://github.com/vercel/next.js/blob/771e29cb719b382e92d89cac11fbfcb818f5f628/license.md\n */\n\nexport type PackageManager = 'npm' | 'pnpm' | 'yarn';\n\nexport const packageManagerChoices: PackageManager[] = ['npm', 'pnpm', 'yarn'];\n\nexport function getPackageManager(): PackageManager {\n const userAgent = process.env.npm_config_user_agent ?? '';\n\n if (userAgent.startsWith('yarn')) {\n return 'yarn';\n }\n\n if (userAgent.startsWith('pnpm')) {\n return 'pnpm';\n }\n\n return 'npm';\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 accessToken,\n customerImpersonationToken,\n }: {\n channelId: string;\n storeHash: string;\n accessToken: string;\n customerImpersonationToken: string;\n },\n) => {\n outputFileSync(\n join(projectDir, '.env.local'),\n [\n `AUTH_SECRET=${randomBytes(32).toString('hex')}`,\n `BIGCOMMERCE_STORE_HASH=${storeHash}`,\n `BIGCOMMERCE_CHANNEL_ID=${channelId}`,\n `BIGCOMMERCE_ACCESS_TOKEN=${accessToken}`,\n `BIGCOMMERCE_CUSTOMER_IMPERSONATION_TOKEN=${customerImpersonationToken}`,\n `CLIENT_LOGGER=false`,\n `ENABLE_ADMIN_ROUTE=true`,\n `NEXT_PUBLIC_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 accessToken,\n customerImpersonationToken,\n });\n });\n"],"mappings":"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","names":["chalk","Command","select","chalk","execCallback","kebabCase","join","promisify","z","promisify","exec","promisify","integration","chalk","readJsonSync","writeJsonSync","downloadTemplate","join","z","downloadTemplate","chalk","join","writeJsonSync","readJsonSync","z","chalk","z","z","parse","z","chalk","parse","chalk","addDependency","addDevDependency","addDependency","addDevDependency","chalk","chalk","chalk","outputFileSync","join","exec","promisify","execCallback","Command","z","parse","chalk","kebabCase","join","select","Command","Option","input","select","chalk","z","Command","Option","parse","chalk","select","input","chalk"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bigcommerce/create-catalyst",
3
- "version": "0.10.0",
3
+ "version": "0.11.0",
4
4
  "type": "module",
5
5
  "bin": "bin/index.cjs",
6
6
  "files": [