@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 +267 -116
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
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.
|
|
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.
|
|
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.
|
|
90
|
+
semver: "^7.6.3",
|
|
90
91
|
zod: "^3.23.8",
|
|
91
|
-
"zod-validation-error": "^3.3.
|
|
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.
|
|
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.
|
|
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.
|
|
108
|
+
msw: "^2.3.5",
|
|
108
109
|
prettier: "^3.3.3",
|
|
109
|
-
tsup: "^8.
|
|
110
|
-
typescript: "^5.5.
|
|
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
|
|
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 {
|
|
140
|
+
import { coerce, compare } from "semver";
|
|
122
141
|
import { promisify } from "util";
|
|
123
|
-
import { z
|
|
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
|
|
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
|
-
|
|
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(
|
|
193
|
-
|
|
194
|
-
|
|
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 =
|
|
203
|
-
name:
|
|
204
|
-
description:
|
|
205
|
-
version:
|
|
206
|
-
scripts:
|
|
207
|
-
dependencies:
|
|
208
|
-
devDependencies:
|
|
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({},
|
|
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
|
-
|
|
370
|
+
writeJsonSync2(join2(projectDir, "package.json"), packageJson, { spaces: 2 });
|
|
222
371
|
if (!includeFunctionalTests) {
|
|
223
|
-
const tsConfigJson =
|
|
224
|
-
include:
|
|
225
|
-
}).passthrough().parse(
|
|
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
|
-
|
|
378
|
+
writeJsonSync2(join2(projectDir, "tsconfig.json"), tsConfigJson, { spaces: 2 });
|
|
230
379
|
}
|
|
231
380
|
if (!includeFunctionalTests) {
|
|
232
|
-
const eslint = (yield readFile(
|
|
233
|
-
yield writeFile(
|
|
234
|
-
removeSync(
|
|
235
|
-
removeSync(
|
|
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
|
|
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 } =
|
|
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
|
|
403
|
+
import { z as z5 } from "zod";
|
|
255
404
|
|
|
256
405
|
// src/utils/parse.ts
|
|
257
|
-
import * as
|
|
406
|
+
import * as z4 from "zod";
|
|
258
407
|
import { fromZodError } from "zod-validation-error";
|
|
259
|
-
var
|
|
408
|
+
var parse2 = (data, schema) => {
|
|
260
409
|
try {
|
|
261
410
|
return schema.parse(data);
|
|
262
411
|
} catch (error) {
|
|
263
|
-
if (error instanceof
|
|
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 =
|
|
272
|
-
features:
|
|
273
|
-
storefront_limits:
|
|
274
|
-
active:
|
|
275
|
-
total_including_inactive:
|
|
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) =>
|
|
428
|
+
var BigCommerceV3ApiResponseSchema = (schema) => z5.object({
|
|
280
429
|
data: schema,
|
|
281
|
-
meta:
|
|
430
|
+
meta: z5.object({})
|
|
282
431
|
});
|
|
283
432
|
var BigCommerceChannelsV3ResponseSchema = BigCommerceV3ApiResponseSchema(
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
id:
|
|
287
|
-
name:
|
|
288
|
-
status:
|
|
289
|
-
platform:
|
|
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 =
|
|
347
|
-
device_code:
|
|
348
|
-
user_code:
|
|
349
|
-
verification_uri:
|
|
350
|
-
expires_in:
|
|
351
|
-
interval:
|
|
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
|
|
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 =
|
|
368
|
-
access_token:
|
|
369
|
-
store_hash:
|
|
370
|
-
context:
|
|
371
|
-
api_uri:
|
|
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
|
|
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
|
|
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
|
|
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 =
|
|
459
|
-
data:
|
|
460
|
-
token:
|
|
607
|
+
const BigCommerceCustomerImpersonationTokenSchema = z5.object({
|
|
608
|
+
data: z5.object({
|
|
609
|
+
token: z5.string()
|
|
461
610
|
})
|
|
462
611
|
});
|
|
463
|
-
return
|
|
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 =
|
|
497
|
-
data:
|
|
498
|
-
id:
|
|
499
|
-
name:
|
|
500
|
-
storefront_api_token:
|
|
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
|
|
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
|
|
662
|
+
yield addDependency2("@bigcommerce/catalyst-client", {
|
|
514
663
|
cwd: projectDir,
|
|
515
664
|
silent: true,
|
|
516
665
|
packageManager
|
|
517
666
|
});
|
|
518
|
-
yield
|
|
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
|
|
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
|
-
|
|
615
|
-
|
|
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
|
|
631
|
-
var create = new
|
|
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 =
|
|
649
|
-
const sampleDataApiUrl =
|
|
650
|
-
const bigcommerceApiUrl =
|
|
651
|
-
const bigcommerceAuthUrl =
|
|
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 =
|
|
674
|
-
projectDir =
|
|
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 =
|
|
832
|
+
const formatted = kebabCase2(i);
|
|
684
833
|
if (!formatted) return "Project name is required";
|
|
685
|
-
const targetDir =
|
|
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(
|
|
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
|
|
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
|
|
816
|
-
var init = new
|
|
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 =
|
|
823
|
-
const sampleDataApiUrl =
|
|
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,SAAS,eAAe;AACxB,OAAOA,YAAW;;;ACHlB;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,MAAQ;AAAA,EACR,KAAO;AAAA,EACP,OAAS;AAAA,IACP;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,KAAO;AAAA,IACP,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,MAAQ;AAAA,IACR,OAAS;AAAA,EACX;AAAA,EACA,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,cAAgB;AAAA,IACd,+BAA+B;AAAA,IAC/B,qBAAqB;AAAA,IACrB,OAAS;AAAA,IACT,WAAa;AAAA,IACb,QAAU;AAAA,IACV,YAAY;AAAA,IACZ,OAAS;AAAA,IACT,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,QAAU;AAAA,IACV,KAAO;AAAA,IACP,wBAAwB;AAAA,EAC1B;AAAA,EACA,iBAAmB;AAAA,IACjB,8BAA8B;AAAA,IAC9B,uCAAuC;AAAA,IACvC,aAAa;AAAA,IACb,aAAa;AAAA,IACb,mBAAmB;AAAA,IACnB,eAAe;AAAA,IACf,2BAA2B;AAAA,IAC3B,uBAAuB;AAAA,IACvB,eAAe;AAAA,IACf,kBAAkB;AAAA,IAClB,iBAAiB;AAAA,IACjB,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,UAAY;AAAA,IACZ,MAAQ;AAAA,IACR,YAAc;AAAA,EAChB;AACF;;;ACtDA,SAAS,WAAAC,UAAS,cAAc;AAChC,SAAS,OAAO,UAAAC,eAAc;AAC9B,OAAOC,YAAW;AAClB,SAAS,QAAQC,qBAAoB;AACrC,SAAS,sBAAsB;AAC/B,OAAOC,gBAAe;AACtB,SAAS,QAAAC,aAAY;AACrB,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,KAAAC,UAAS;;;ACRlB,SAAS,QAAQ,oBAAoB;AACrC,SAAS,oBAAoB;AAC7B,SAAS,wBAAwB;AACjC,SAAS,eAAe,wBAAwB;AAChD,SAAS,YAAY;AACrB,SAAS,aAAAC,kBAAiB;;;ACL1B,SAAS,eAAe;AACxB,SAAS,QAAQ,cAAc;AAC/B,SAAS,aAAa;AACtB,SAAS,gBAAgB,qBAAqB;AAC9C,OAAO,eAAe;AACtB,SAAS,QAAQ,eAAe;AAChC,SAAS,iBAAiB;AAC1B,SAAS,SAAS;AAElB,IAAM,OAAO,UAAU,MAAM;AAEtB,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,MAAM,EAAE,OAAO;AAAA,EACf,cAAc,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;AAAA,EACnD,iBAAiB,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;AAAA,EACtD,sBAAsB,EAAE,MAAM,EAAE,OAAO,CAAC;AAC1C,CAAC;AAIM,IAAM,cAAc,IAAI,QAAQ,aAAa,EACjD,SAAS,sBAAsB,mCAAmC,EAClE,OAAO,wBAAwB,gEAAgE,EAC/F,OAAO,CAAO,oBAAoB,YAAY;AAE7C,QAAM,kBAAkB,EAAE,OAAO,EAAE,UAAU,SAAS,EAAE,MAAM,kBAAkB;AAEhF,QAAM,WAAqB;AAAA,IACzB,MAAM;AAAA,IACN,cAAc,EAAE,KAAK,CAAC,EAAE;AAAA,IACxB,iBAAiB,EAAE,KAAK,CAAC,EAAE;AAAA,IAC3B,sBAAsB,CAAC;AAAA,EACzB;AAEA,QAAM,KAAK,kBAAkB;AAE7B,QAAM,EAAE,QAAQ,cAAc,IAAI,MAAM,KAAK,iCAAiC;AAC9E,MAAI,CAAC,SAAS,IAAI,cAAc,MAAM,IAAI;AAE1C,MAAI,QAAQ,YAAY;AACtB,gBAAY,QAAQ;AAAA,EACtB;AAEA,QAAM,EAAE,QAAQ,aAAa,IAAI,MAAM,KAAK,+CAA+C;AAC3F,QAAM,CAAC,aAAa,IAAI,aACrB,MAAM,IAAI,EACV,OAAO,OAAO,EACd,KAAK,CAAC,GAAG,MAAM;AACd,UAAM,WAAW,OAAO,EAAE,QAAQ,+BAA+B,EAAE,CAAC;AACpE,UAAM,WAAW,OAAO,EAAE,QAAQ,+BAA+B,EAAE,CAAC;AAEpE,QAAI,YAAY,UAAU;AACxB,aAAO,QAAQ,UAAU,QAAQ;AAAA,IACnC;AAEA,WAAO;AAAA,EACT,CAAC,EACA,QAAQ;AAEX,QAAM,4BAA4B,EAAE,OAAO;AAAA,IACzC,cAAc,EAAE,OAAO,CAAC,CAAC,EAAE,YAAY;AAAA,IACvC,iBAAiB,EAAE,OAAO,CAAC,CAAC,EAAE,YAAY;AAAA,EAC5C,CAAC;AAED,QAAM,iBAAiB,CAAO,QAAgB;AAC5C,UAAM,EAAE,OAAO,IAAI,MAAM,KAAK,YAAY,GAAG,oBAAoB;AAEjE,WAAO,0BAA0B,MAAM,KAAK,MAAM,MAAM,CAAC;AAAA,EAC3D;AAEA,QAAM,kBAAkB,MAAM,eAAe,SAAS;AACtD,QAAM,oBAAoB,MAAM,eAAe,aAAa;AAE5D,QAAM,iBAAiB,CAAC,GAA4B,MAA+B;AACjF,WAAO,OAAO,KAAK,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,OAAO,KAAK,CAAC,EAAE,SAAS,GAAG,CAAC;AAAA,EACrE;AAEA,WAAS,aAAa,MAAM;AAAA,IAC1B,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB;AACA,WAAS,gBAAgB,MAAM;AAAA,IAC7B,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB;AAEA,QAAM,EAAE,QAAQ,cAAc,IAAI,MAAM,KAAK,YAAY,aAAa,oBAAoB;AAC1F,QAAM,EAAE,QAAQ,eAAe,IAAI,MAAM,KAAK,YAAY,SAAS,oBAAoB;AAEvF,WAAS,uBAAuB,eAAe,MAAM,cAAc,GAAG,MAAM,aAAa,CAAC;AAE1F,QAAM,EAAE,QAAQ,gBAAgB,IAAI,MAAM;AAAA,IACxC,YAAY,aAAa,MAAM,SAAS;AAAA,EAC1C;AAEA,iBAAe,gBAAgB,eAAe,sBAAsB,eAAe;AACnF,gBAAc,gBAAgB,eAAe,kBAAkB,UAAU;AAAA,IACvE,QAAQ;AAAA,EACV,CAAC;AAED,UAAQ,IAAI,mCAAmC;AACjD,EAAC;;;ACrGH,SAAmB,kBAAuC;AAEnD,IAAM,UAAU,CACrB,QACA,YACG;AACH,SAAO,WAAW,QAAQ;AAAA,IACxB,SAAS;AAAA,KACN,QACJ,EAAE,MAAM,MAAM,QAAQ,KAAK,CAAC,CAAC;AAChC;;;AFEA,IAAMC,QAAOC,WAAU,YAAY;AAEnC,SAAsB,iBACpB,IACA,IACA;AAAA,6CAFAC,cACA,EAAE,YAAY,eAAe,GAC7B;AACA,QAAI,CAACA,cAAa;AAChB;AAAA,IACF;AAEA,UAAM,iBAAiB,KAAK,YAAY,gBAAgBA,YAAW;AAEnE,UAAM;AAAA,MACJ,iBAAiB,4CAA4CA,YAAW,SAAS;AAAA,QAC/E,KAAK;AAAA,QACL,SAAS;AAAA,MACX,CAAC;AAAA,MACD;AAAA,QACE,MAAM,WAAWA,YAAW;AAAA,QAC5B,aAAa,GAAGA,YAAW;AAAA,QAC3B,UAAU,CAAC,QAAQ,mBAAmBA,YAAW,iBAAiB,IAAI,OAAO;AAAA,MAC/E;AAAA,IACF;AAEA,QAAI;AACF,mBAAa,KAAK,gBAAgB,eAAe,CAAC;AAAA,IACpD,SAAS,KAAK;AACZ,cAAQ;AAAA,QACN;AAAA,gCAAmCA,YAAW;AAAA,MAChD;AAEA;AAAA,IACF;AAEA,UAAM,WAAW,eAAe,MAAM,aAAa,KAAK,gBAAgB,eAAe,CAAC,CAAC;AAEzF,QAAI,SAAS,aAAa,IAAI,QAAQ;AACpC,YAAM;AAAA,QACJ,cAAc,SAAS,aAAa,KAAK;AAAA,UACvC,KAAK;AAAA,UACL,QAAQ;AAAA,UACR;AAAA,QACF,CAAC;AAAA,QACD;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,UAAU,CAAC,QAAQ,mCAAmC,IAAI,OAAO;AAAA,QACnE;AAAA,MACF;AAAA,IACF;AAEA,QAAI,SAAS,gBAAgB,IAAI,QAAQ;AACvC,YAAM;AAAA,QACJ,iBAAiB,SAAS,gBAAgB,KAAK;AAAA,UAC7C,KAAK;AAAA,UACL,QAAQ;AAAA,UACR;AAAA,QACF,CAAC;AAAA,QACD;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,UAAU,CAAC,QAAQ,2DAA2D,IAAI,OAAO;AAAA,QAC3F;AAAA,MACF;AAAA,IACF;AAEA,UAAM;AAAA,MACJF,MAAK,iBAAiB,KAAK,gBAAgB,mBAAmB,CAAC,IAAI,EAAE,KAAK,WAAW,CAAC;AAAA,MACtF;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,UAAU,CAAC,QAAQ,sCAAsC,IAAI,OAAO;AAAA,MACtE;AAAA,IACF;AAEA,YAAQ,IAAI,oFAAoF;AAAA,EAClG;AAAA;;;AGxFA,OAAO,WAAW;AAIX,IAAM,uBAAuB,CAClC,UACA,cACG;AACH,QAAM,EAAE,MAAM,kBAAkB,IAAI;AACpC,QAAM,EAAE,SAAS,IAAI;AAErB,MAAI,kBAAkB,UAAU,SAAS,kBAAkB,0BAA0B;AACnF,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ,8NAA8N,MAAM;AAAA,UAClO;AAAA,QACF,CAAC;AAAA;AAAA,MACH;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,kBAAkB,OAAO,CAAC,YAAY,QAAQ,WAAW,QAAQ;AAExF,MAAI,eAAe,UAAU,SAAS,kBAAkB,QAAQ;AAC9D,YAAQ;AAAA,MACN,MAAM;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;ACpCA,OAAOG,YAAW;AAClB,SAAS,UAAU,iBAAiB;AACpC,SAAS,WAAW,gBAAAC,eAAc,YAAY,iBAAAC,sBAAqB;AACnE,SAAS,oBAAAC,yBAAwB;AACjC,OAAO,WAAW;AAClB,SAAS,QAAAC,aAAY;AACrB,YAAYC,QAAO;AAIZ,IAAM,gBAAgB,CAAO,OAY9B,iBAZ8B,KAY9B,WAZ8B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AACV,GAMM;AAtBN;AAuBE,QAAM;AAAA,IACJC,kBAAiB,oCAAoC,KAAK,IAAI;AAAA,MAC5D,KAAK;AAAA,MACL,SAAS;AAAA,IACX,CAAC;AAAA,IACD;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU,CAAC,QAAQC,OAAM,IAAI,sCAAsC,IAAI,OAAO,EAAE;AAAA,IAClF;AAAA,EACF;AAEA,UAAQ,YAAY;AAAA,IAClB,KAAK;AACH,YAAM,UAAUC,MAAK,YAAY,SAAS,CAAC;AAE3C,MAAAC;AAAA,QACED,MAAK,YAAY,uBAAuB;AAAA,QACxC,EAAE,mBAAmB,8BAA8B;AAAA,QACnD,EAAE,QAAQ,EAAE;AAAA,MACd;AACA;AAAA,IAEF;AACE;AAAA,EACJ;AAEA,QAAM,cACH,UAAO;AAAA,IACN,MAAQ,UAAO;AAAA,IACf,aAAe,UAAO;AAAA,IACtB,SAAW,UAAO;AAAA,IAClB,SAAW,UAAO,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS;AAAA,IAC7C,cAAgB,UAAO,CAAC,CAAC,EAAE,YAAY;AAAA,IACvC,iBAAmB,UAAO,CAAC,CAAC,EAAE,YAAY;AAAA,EAC5C,CAAC,EACA,YAAY,EACZ;AAAA,IACC,MAAM,CAAC,GAAGE,cAAaF,MAAK,YAAY,cAAc,CAAC,GAAG;AAAA,MACxD,MAAM;AAAA,MACN,aAAa;AAAA,IACf,CAAC;AAAA,EACH;AAEF,SAAO,YAAY,aAAa,8BAA8B;AAC9D,SAAO,YAAY,gBAAgB,qCAAqC;AAExE,MAAI,CAAC,wBAAwB;AAC3B,WAAO,YAAY,gBAAgB,iBAAiB;AACpD,WAAO,YAAY,gBAAgB,kBAAkB;AAAA,EACvD;AAEA,EAAAC,eAAcD,MAAK,YAAY,cAAc,GAAG,aAAa,EAAE,QAAQ,EAAE,CAAC;AAE1E,MAAI,CAAC,wBAAwB;AAC3B,UAAM,eACH,UAAO;AAAA,MACN,SAAW,SAAQ,UAAO,CAAC,EAAE,SAAS;AAAA,IACxC,CAAC,EACA,YAAY,EACZ,MAAME,cAAaF,MAAK,YAAY,eAAe,CAAC,CAAC;AAExD,iBAAa,WAAU,kBAAa,YAAb,mBAAsB;AAAA,MAC3C,CAAC,YAAY,CAAC,CAAC,cAAc,sBAAsB,EAAE,SAAS,OAAO;AAAA;AAGvE,IAAAC,eAAcD,MAAK,YAAY,eAAe,GAAG,cAAc,EAAE,QAAQ,EAAE,CAAC;AAAA,EAC9E;AAEA,MAAI,CAAC,wBAAwB;AAC3B,UAAM,UAAU,MAAM,SAASA,MAAK,YAAY,eAAe,GAAG,EAAE,UAAU,QAAQ,CAAC,GACpF,QAAQ,qCAAqC,EAAE,EAC/C,QAAQ,gCAAgC,EAAE;AAE7C,UAAM,UAAUA,MAAK,YAAY,eAAe,GAAG,MAAM;AAEzD,eAAWA,MAAK,YAAY,OAAO,CAAC;AACpC,eAAWA,MAAK,YAAY,sBAAsB,CAAC;AAAA,EACrD;AACF;;;ACtGA,YAAYG,QAAO;AAEZ,IAAM,mBAAmB,MAAY;AAC1C,QAAM,oBACJ;AAEF,QAAM,WAAW,MAAM,MAAM,iBAAiB;AAE9C,MAAI;AACF,UAAM,EAAE,QAAQ,IAAM,UAAO,EAAE,SAAW,UAAO,EAAE,CAAC,EAAE,MAAM,MAAM,SAAS,KAAK,CAAC;AAEjF,WAAO,8BAA8B,OAAO;AAAA,EAC9C,SAAS,KAAK;AACZ,UAAM,IAAI,MAAM,uDAAuD;AAAA,EACzE;AACF;;;ACbA,OAAOC,YAAW;AAClB,SAAS,KAAAC,UAAS;;;ACHlB,YAAYC,QAAO;AACnB,SAAS,oBAAoB;AAEtB,IAAMC,SAAQ,CAAI,MAAe,WAA2B;AACjE,MAAI;AACF,WAAO,OAAO,MAAM,IAAI;AAAA,EAC1B,SAAS,OAAO;AACd,QAAI,iBAAmB,aAAU;AAC/B,cAAQ,MAAM,aAAa,KAAK,EAAE,SAAS,CAAC;AAAA,IAC9C;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB;AACF;;;ADkBA,IAAM,uBAAuBC,GAAE,OAAO;AAAA,EACpC,UAAUA,GAAE,OAAO;AAAA,IACjB,mBAAmBA,GAAE,OAAO;AAAA,MAC1B,QAAQA,GAAE,OAAO;AAAA,MACjB,0BAA0BA,GAAE,OAAO;AAAA,IACrC,CAAC;AAAA,EACH,CAAC;AACH,CAAC;AAID,IAAM,iCAAiC,CAAI,WACzCA,GAAE,OAAO;AAAA,EACP,MAAM;AAAA,EACN,MAAMA,GAAE,OAAO,CAAC,CAAC;AACnB,CAAC;AAEH,IAAM,sCAAsC;AAAA,EAC1CA,GAAE;AAAA,IACAA,GAAE,OAAO;AAAA,MACP,IAAIA,GAAE,OAAO;AAAA,MACb,MAAMA,GAAE,OAAO;AAAA,MACf,QAAQA,GAAE,OAAO;AAAA,MACjB,UAAUA,GAAE,OAAO;AAAA,IACrB,CAAC;AAAA,EACH;AACF;AAIO,IAAM,QAAN,MAAY;AAAA,EAYjB,YAAY;AAAA,IACV;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAgB;AAjBhB,kCAAyB;AAkBvB,SAAK,oBAAoB,gDAAqB;AAC9C,SAAK,qBAAqB,kDAAsB;AAChD,SAAK,mBAAmB,8CAAoB;AAC5C,SAAK,YAAY,gCAAa;AAC9B,SAAK,cAAc,oCAAe;AAAA,EACpC;AAAA,EAEA,KAAK,MAAc,OAAoB,CAAC,GAAG;AACzC,QAAI,CAAC,KAAK,oBAAoB;AAC5B,YAAM,IAAI,MAAM,qDAAqD;AAAA,IACvE;AAEA,UAAkC,WAA1B,YAAU,CAAC,EA5FvB,IA4FsC,IAAT,iBAAS,IAAT,CAAjB;AAER,UAAM,UAAU;AAAA,MACd,QAAQ;AAAA,MACR,SAAS,iCACJ,UADI;AAAA,QAEP,QAAQ;AAAA,QACR,gBAAgB;AAAA,MAClB;AAAA,OACG;AAGL,WAAO,MAAM,GAAG,KAAK,kBAAkB,GAAG,IAAI,IAAI,OAAO;AAAA,EAC3D;AAAA,EAEM,gBAAgB;AAAA;AACpB,YAAM,WAAW,MAAM,KAAK,KAAK,iBAAiB;AAAA,QAChD,MAAM,KAAK,UAAU;AAAA,UACnB,QAAQ;AAAA,YACN;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF,EAAE,KAAK,GAAG;AAAA,UACV,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,MACH,CAAC;AAED,UAAI,CAAC,SAAS,IAAI;AAChB,gBAAQ;AAAA,UACNC,OAAM,IAAI;AAAA,6BAAgC,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,CAAI;AAAA,QACtF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,mBAAmBD,GAAE,OAAO;AAAA,QAChC,aAAaA,GAAE,OAAO;AAAA,QACtB,WAAWA,GAAE,OAAO;AAAA,QACpB,kBAAkBA,GAAE,OAAO;AAAA,QAC3B,YAAYA,GAAE,OAAO;AAAA,QACrB,UAAUA,GAAE,OAAO;AAAA,MACrB,CAAC;AAED,aAAOE,OAAM,MAAM,SAAS,KAAK,GAAG,gBAAgB;AAAA,IACtD;AAAA;AAAA,EAEM,gBAAgB,YAAoB;AAAA;AACxC,YAAM,WAAW,MAAM,KAAK,KAAK,iBAAiB;AAAA,QAChD,MAAM,KAAK,UAAU;AAAA,UACnB,aAAa;AAAA,UACb,WAAW,KAAK;AAAA,QAClB,CAAC;AAAA,MACH,CAAC;AAED,UAAI,SAAS,WAAW,KAAK;AAC3B,cAAM,IAAI,MAAM,8BAA8B;AAAA,MAChD;AAEA,YAAM,0BAA0BF,GAAE,OAAO;AAAA,QACvC,cAAcA,GAAE,OAAO;AAAA,QACvB,YAAYA,GAAE,OAAO;AAAA,QACrB,SAASA,GAAE,OAAO;AAAA,QAClB,SAASA,GAAE,OAAO,EAAE,IAAI;AAAA,MAC1B,CAAC;AAED,aAAOE,OAAM,MAAM,SAAS,KAAK,GAAG,uBAAuB;AAAA,IAC7D;AAAA;AAAA,EAEA,IAAI,MAAc,OAAoB,CAAC,GAAG;AACxC,QAAI,CAAC,KAAK,qBAAqB,CAAC,KAAK,aAAa,CAAC,KAAK,aAAa;AACnE,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAkC,WAA1B,YAAU,CAAC,EA1KvB,IA0KsC,IAAT,iBAAS,IAAT,CAAjB;AAER,UAAM,UAAU;AAAA,MACd,SAAS,iCACJ,UADI;AAAA,QAEP,QAAQ;AAAA,QACR,gBAAgB,KAAK;AAAA,MACvB;AAAA,OACG;AAGL,WAAO,MAAM,GAAG,KAAK,iBAAiB,WAAW,KAAK,SAAS,GAAG,IAAI,IAAI,OAAO;AAAA,EACnF;AAAA,EAEM,mBAAmB;AAAA;AACvB,YAAM,MAAM,MAAM,KAAK,IAAI,WAAW;AAEtC,UAAI,CAAC,IAAI,IAAI;AACX,gBAAQ,MAAMD,OAAM,IAAI;AAAA,wBAA2B,IAAI,MAAM,IAAI,IAAI,UAAU;AAAA,CAAI,CAAC;AACpF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,aAAOC,OAAM,MAAM,IAAI,KAAK,GAAG,oBAAoB;AAAA,IACrD;AAAA;AAAA,EAEM,SAAS,QAAQ,IAAI;AAAA;AACzB,YAAM,MAAM,MAAM,KAAK,IAAI,eAAe,KAAK,EAAE;AAEjD,UAAI,CAAC,IAAI,IAAI;AACX,gBAAQ,MAAMD,OAAM,IAAI;AAAA,2BAA8B,IAAI,MAAM,IAAI,IAAI,UAAU;AAAA,CAAI,CAAC;AACvF,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,aAAOC,OAAM,MAAM,IAAI,KAAK,GAAG,mCAAmC;AAAA,IACpE;AAAA;AAAA,EAEM,mBAAmB,WAAmB;AAAA;AAC1C,YAAM,MAAM,MAAM,KAAK,IAAI,gBAAgB,SAAS,kBAAkB;AAAA,QACpE,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU;AAAA,UACnB,oCAAoC;AAAA,YAClC;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAED,UAAI,CAAC,IAAI,IAAI;AACX,gBAAQ;AAAA,UACND,OAAM;AAAA,YACJ;AAAA,kCAAqC,IAAI,MAAM,IAAI,IAAI,UAAU;AAAA;AAAA,UACnE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA;AAAA,EAEM,6BAA6B;AAAA;AACjC,YAAM,MAAM,MAAM,KAAK,IAAI,mDAAmD;AAAA,QAC5E,QAAQ;AAAA,QACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,QAC9C,MAAM,KAAK,UAAU,EAAE,YAAY,YAAY,aAAa,CAAC,EAAE,CAAC;AAAA,MAClE,CAAC;AAED,UAAI,CAAC,IAAI,IAAI;AACX,gBAAQ;AAAA,UACNA,OAAM;AAAA,YACJ;AAAA,+DAAkE,IAAI,MAAM,IAAI,IAAI,UAAU;AAAA;AAAA,UAChG;AAAA,QACF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,8CAA8CD,GAAE,OAAO;AAAA,QAC3D,MAAMA,GAAE,OAAO;AAAA,UACb,OAAOA,GAAE,OAAO;AAAA,QAClB,CAAC;AAAA,MACH,CAAC;AAED,aAAOE,OAAM,MAAM,IAAI,KAAK,GAAG,2CAA2C;AAAA,IAC5E;AAAA;AAAA,EAEA,cAAc,MAAc,OAAoB,CAAC,GAAG;AAClD,QAAI,CAAC,KAAK,oBAAoB,CAAC,KAAK,aAAa,CAAC,KAAK,aAAa;AAClE,YAAM,IAAI;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAEA,UAAkC,WAA1B,YAAU,CAAC,EAtQvB,IAsQsC,IAAT,iBAAS,IAAT,CAAjB;AAER,UAAM,UAAU;AAAA,MACd,QAAQ;AAAA,MACR,SAAS,iCACJ,UADI;AAAA,QAEP,QAAQ;AAAA,QACR,gBAAgB;AAAA,QAChB,gBAAgB,KAAK;AAAA,MACvB;AAAA,OACG;AAGL,WAAO,MAAM,GAAG,KAAK,gBAAgB,WAAW,KAAK,SAAS,GAAG,IAAI,IAAI,OAAO;AAAA,EAClF;AAAA,EAEM,cAAc,aAAqB;AAAA;AACvC,YAAM,MAAM,MAAM,KAAK,cAAc,yBAAyB;AAAA,QAC5D,MAAM,KAAK,UAAU,EAAE,MAAM,YAAY,CAAC;AAAA,MAC5C,CAAC;AAED,UAAI,CAAC,IAAI,IAAI;AACX,gBAAQ;AAAA,UACND,OAAM,IAAI;AAAA,qCAAwC,IAAI,MAAM,IAAI,IAAI,UAAU;AAAA,CAAI;AAAA,QACpF;AACA,gBAAQ,KAAK,CAAC;AAAA,MAChB;AAEA,YAAM,gCAAgCD,GAAE,OAAO;AAAA,QAC7C,MAAMA,GAAE,OAAO;AAAA,UACb,IAAIA,GAAE,OAAO;AAAA,UACb,MAAMA,GAAE,OAAO,EAAE,IAAI,CAAC;AAAA,UACtB,sBAAsBA,GAAE,OAAO;AAAA,QACjC,CAAC;AAAA,MACH,CAAC;AAED,aAAOE,OAAM,MAAM,IAAI,KAAK,GAAG,6BAA6B;AAAA,IAC9D;AAAA;AACF;;;AE5SA,OAAOC,YAAW;AAClB,SAAS,iBAAAC,gBAAe,oBAAAC,mBAAkB,uBAAuB,mBAAmB;AAKpF,IAAM,iBAAiB,CAAO,YAAoB,mBAAmC;AACnF,QAAM,YAAY,EAAE,KAAK,YAAY,QAAQ,MAAM,eAAe,CAAC;AACnE,QAAMC,eAAc,gCAAgC;AAAA,IAClD,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACD,QAAMC,kBAAiB,uCAAuC;AAAA,IAC5D,KAAK;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,EACF,CAAC;AACH;AAEO,IAAM,sBAAsB,CAAO,YAAoB,mBAAgC;AAC5F,iBAAQ,eAAe,YAAY,cAAc,GAAG;AAAA,IAClD,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU,CAAC,QAAQC,OAAM,IAAI,mCAAmC,IAAI,OAAO,EAAE;AAAA,EAC/E,CAAC;AAAA;;;ACvBH,SAAS,cAAc;AACvB,OAAOC,YAAW;AAKlB,IAAM,OAAO,CAAO,MAAa,YAAoB,UAAkB,cAAsB;AAC3F,QAAM,aAAa,WAAW;AAC9B,QAAM,cAAc,YAAY;AAChC,QAAM,UAAU,cAAc;AAE9B,WAAS,IAAI,GAAG,IAAI,SAAS,KAAK,GAAG;AACnC,QAAI;AACF,aAAO,MAAM,KAAK,gBAAgB,UAAU;AAAA,IAC9C,SAAS,KAAK;AAAA,IAEd;AAEA,UAAM,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,UAAU,CAAC;AAAA,EAChE;AAEA,UAAQ,MAAMC,OAAM,IAAI,4CAA4C,CAAC;AACrE,UAAQ,KAAK,CAAC;AAChB;AAEO,IAAM,QAAQ,CACnB,oBACA,WACA,gBACG;AACH,MAAI,aAAa,aAAa;AAC5B,WAAO,EAAE,WAAW,YAAY;AAAA,EAClC;AAEA,QAAM,cAAc,MAAM,OAAO;AAAA,IAC/B,SAAS;AAAA,IACT,SAAS;AAAA,MACP,EAAE,MAAM,OAAO,OAAO,KAAK;AAAA,MAC3B,EAAE,MAAM,MAAM,OAAO,MAAM;AAAA,IAC7B;AAAA,EACF,CAAC;AAED,MAAI,CAAC,aAAa;AAChB,WAAO,EAAE,WAAW,YAAY;AAAA,EAClC;AAEA,QAAM,OAAO,IAAI,MAAM,EAAE,mBAAmB,CAAC;AAE7C,QAAM,aAAa,MAAM,KAAK,cAAc;AAE5C,UAAQ;AAAA,IACN;AAAA,MACE;AAAA,eAAkBA,OAAM,KAAK,WAAW,gBAAgB,CAAC,wBAAwBA,OAAM;AAAA,QACrF,WAAW;AAAA,MACb,CAAC;AAAA;AAAA,MACD,2BAA2BA,OAAM,OAAO,GAAG,WAAW,aAAa,EAAE,UAAU,CAAC;AAAA;AAAA,IAClF,EAAE,KAAK,IAAI;AAAA,EACb;AAEA,QAAM,EAAE,YAAY,aAAa,IAAI,MAAM;AAAA,IACzC,KAAK,MAAM,WAAW,aAAa,WAAW,UAAU,WAAW,UAAU;AAAA,IAC7E;AAAA,MACE,MAAM;AAAA,MACN,aAAa;AAAA,MACb,UAAU;AAAA,IACZ;AAAA,EACF;AAEA,SAAO;AAAA,IACL,WAAW;AAAA,IACX,aAAa;AAAA,EACf;AACF;;;AC5DO,IAAM,wBAA0C,CAAC,OAAO,QAAQ,MAAM;AAEtE,SAAS,oBAAoC;AAhBpD;AAiBE,QAAM,aAAY,aAAQ,IAAI,0BAAZ,YAAqC;AAEvD,MAAI,UAAU,WAAW,MAAM,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,WAAW,MAAM,GAAG;AAChC,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AC5BA,SAAS,mBAAmB;AAC5B,SAAS,kBAAAC,uBAAsB;AAC/B,SAAS,QAAAC,aAAY;AAEd,IAAM,WAAW,CACtB,YACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAMG;AACH,EAAAD;AAAA,IACEC,MAAK,YAAY,YAAY;AAAA,IAC7B;AAAA,MACE,eAAe,YAAY,EAAE,EAAE,SAAS,KAAK,CAAC;AAAA,MAC9C,0BAA0B,SAAS;AAAA,MACnC,0BAA0B,SAAS;AAAA,MACnC,4BAA4B,WAAW;AAAA,MACvC,4CAA4C,0BAA0B;AAAA,MACtE;AAAA,MACA;AAAA,MACA;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;;;AZTA,IAAMC,QAAOC,WAAUC,aAAY;AAE5B,IAAM,SAAS,IAAIC,SAAQ,QAAQ,EACvC,YAAY,iFAAiF,EAC7F,OAAO,yBAAyB,+BAA+B,EAC/D,OAAO,uBAAuB,6CAA6C,QAAQ,IAAI,CAAC,EACxF,OAAO,uBAAuB,wBAAwB,EACtD,OAAO,0BAA0B,0BAA0B,EAC3D,OAAO,qBAAqB,wBAAwB,EACpD,OAAO,0CAA0C,0CAA0C,EAC3F,OAAO,4BAA4B,6CAA6C,EAChF;AAAA,EACC,IAAI;AAAA,IACF;AAAA,IACA;AAAA,EACF,EAAE,QAAQ,gBAAgB;AAC5B,EACC;AAAA,EACC,IAAI,OAAO,qCAAqC,sBAAsB,EACnE,QAAQ,iBAAiB,EACzB,SAAS;AACd,EACC;AAAA,EACC,IAAI,OAAO,+BAA+B,iCAAiC,EACxE,QAAQ,6BAA6B,EACrC,SAAS;AACd,EACC;AAAA,EACC,IAAI,OAAO,0BAA0B,mCAAmC,EACrE,QAAQ,qBAAqB,EAC7B,QAAQ,kBAAkB,CAAC,EAC3B,SAAS;AACd,EACC;AAAA,EACC,IAAI,OAAO,0BAA0B,4BAA4B,EAC9D,QAAQ,CAAC,QAAQ,CAAC,EAClB,QAAQ,QAAQ,EAChB,SAAS;AACd,EACC;AAAA,EACC,IAAI,OAAO,8BAA8B,mCAAmC,EACzE,QAAQ,KAAK,EACb,SAAS;AACd,EACC,OAAO,CAAO,YAAY;AACzB,QAAM,EAAE,gBAAgB,YAAY,uBAAuB,IAAI;AAE/D,QAAM,YAAYC,GAAE,OAAO,EAAE,IAAI;AACjC,QAAM,mBAAmBC,OAAM,QAAQ,kBAAkB,SAAS;AAClE,QAAM,oBAAoBA,OAAM,eAAe,QAAQ,mBAAmB,IAAI,SAAS;AACvF,QAAM,qBAAqBA,OAAM,iBAAiB,QAAQ,mBAAmB,IAAI,SAAS;AAE1F,MAAI;AAEJ,MAAI,QAAQ,iBAAiB,UAAU;AACrC,YAAQ,MAAM,QAAQ,MAAM;AAAA,EAC9B,OAAO;AACL,YAAQ,QAAQ;AAAA,EAClB;AAEA,MAAI;AACJ,MAAI;AACJ,MAAI,YAAY,QAAQ;AACxB,MAAI,cAAc,QAAQ;AAC1B,MAAI;AACJ,MAAI,6BAA6B,QAAQ;AAEzC,MAAI,QAAQ,WAAW;AACrB,gBAAY,SAAS,QAAQ,WAAW,EAAE;AAAA,EAC5C;AAEA,MAAI,CAAC,eAAe,QAAQ,UAAU,GAAG;AACvC,YAAQ,MAAMC,OAAM,IAAI,uBAAuB,QAAQ,UAAU;AAAA,CAAwB,CAAC;AAC1F,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,QAAQ,aAAa;AACvB,kBAAcC,WAAU,QAAQ,WAAW;AAC3C,iBAAaC,MAAK,QAAQ,YAAY,WAAW;AAEjD,QAAI,eAAe,UAAU,GAAG;AAC9B,cAAQ,MAAMF,OAAM,IAAI,UAAU,UAAU;AAAA,CAAmB,CAAC;AAChE,cAAQ,KAAK,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,MAAI,CAAC,QAAQ,aAAa;AACxB,UAAM,sBAAsB,CAAC,MAAc;AACzC,YAAM,YAAYC,WAAU,CAAC;AAE7B,UAAI,CAAC,UAAW,QAAO;AAEvB,YAAM,YAAYC,MAAK,QAAQ,YAAY,SAAS;AAEpD,UAAI,eAAe,SAAS,EAAG,QAAO,gBAAgB,SAAS;AAE/D,oBAAc;AACd,mBAAa;AAEb,aAAO;AAAA,IACT;AAEA,UAAM,MAAM;AAAA,MACV,SAAS;AAAA,MACT,SAAS;AAAA,MACT,UAAU;AAAA,IACZ,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,QAAQ,aAAa,CAAC,QAAQ,aAAa;AAC9C,UAAM,cAAc,MAAM,MAAM,kBAAkB;AAElD,gBAAY,YAAY;AACxB,kBAAc,YAAY;AAAA,EAC5B;AAEA,MAAI,CAAC,YAAa,OAAM,IAAI,MAAM,kDAAkD;AACpF,MAAI,CAAC,WAAY,OAAM,IAAI,MAAM,iDAAiD;AAElF,MAAI,CAAC,aAAa,CAAC,aAAa;AAC9B,YAAQ,IAAI;AAAA,YAAe,WAAW,SAAS,UAAU;AAAA,CAAK;AAE9D,UAAM,cAAc,EAAE,YAAY,aAAa,OAAO,YAAY,uBAAuB,CAAC;AAE1F,YAAQ,IAAI;AAAA,QAAWF,OAAM,KAAK,cAAc,CAAC;AAAA,CAAI;AAErD,UAAM,oBAAoB,YAAY,cAAc;AAEpD,UAAM,iBAAiB,QAAQ,aAAa,EAAE,YAAY,eAAe,CAAC;AAE1E,YAAQ;AAAA,MACN;AAAA,QACE;AAAA,EAAKA,OAAM,MAAM,UAAU,CAAC,aAAa,WAAW,SAAS,UAAU;AAAA;AAAA,QACvE;AAAA,QACAA,OAAM,OAAO;AAAA,OAAU,WAAW,gCAAgC;AAAA,QAClEA,OAAM,OAAO;AAAA;AAAA,CAAiE;AAAA,MAChF,EAAE,KAAK,IAAI;AAAA,IACb;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,MAAI,CAAC,aAAa,CAAC,4BAA4B;AAC7C,UAAM,KAAK,IAAI,MAAM,EAAE,mBAAmB,mBAAmB,WAAW,YAAY,CAAC;AACrF,UAAM,oBAAoB,MAAM,GAAG,SAAS,iCAAiC;AAC7E,UAAM,YAAY,MAAM,GAAG,iBAAiB;AAE5C,UAAM,mBAAmB,qBAAqB,mBAAmB,SAAS;AAE1E,QAAI;AAEJ,QAAI,kBAAkB;AACpB,4BAAsB,MAAMG,QAAO;AAAA,QACjC,SAAS;AAAA,QACT,SAAS;AAAA,UACP,EAAE,MAAM,OAAO,OAAO,KAAK;AAAA,UAC3B,EAAE,MAAM,MAAM,OAAO,MAAM;AAAA,QAC7B;AAAA,MACF,CAAC;AAAA,IACH;AAEA,QAAI,qBAAqB;AACvB,YAAM,iBAAiB,MAAM,MAAM;AAAA,QACjC,SAAS;AAAA,MACX,CAAC;AAED,YAAM,gBAAgB,IAAI,MAAM;AAAA,QAC9B;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,YAAM;AAAA,QACJ,MAAM,EAAE,IAAI,kBAAkB,sBAAsB,mBAAmB;AAAA,MACzE,IAAI,MAAM,cAAc,cAAc,cAAc;AAEpD,YAAM,GAAG,mBAAmB,gBAAgB;AAE5C,kBAAY;AACZ,mCAA6B;AAAA,IAK/B;AAEA,QAAI,CAAC,qBAAqB;AACxB,YAAM,mBAAmB,CAAC,YAAY,QAAQ,aAAa;AAE3D,YAAM,kBAAkB,MAAMA,QAAO;AAAA,QACnC,SAAS;AAAA,QACT,SAAS,kBAAkB,KACxB;AAAA,UACC,CAAC,GAAG,MAAM,iBAAiB,QAAQ,EAAE,QAAQ,IAAI,iBAAiB,QAAQ,EAAE,QAAQ;AAAA,QACtF,EACC,IAAI,CAAC,QAAQ;AAAA,UACZ,MAAM,GAAG;AAAA,UACT,OAAO;AAAA,UACP,aAAa,qBACX,GAAG,aAAa,gBACZ,YACA,GAAG,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,GAAG,SAAS,MAAM,CAAC,CAC/D;AAAA,QACF,EAAE;AAAA,MACN,CAAC;AAED,kBAAY,gBAAgB;AAE5B,YAAM;AAAA,QACJ,MAAM,EAAE,MAAM;AAAA,MAChB,IAAI,MAAM,GAAG,2BAA2B;AAExC,mCAA6B;AAAA,IAC/B;AAAA,EACF;AAEA,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,gDAAgD;AAChF,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,iEAAiE;AAEnF,UAAQ,IAAI;AAAA,YAAe,WAAW,SAAS,UAAU;AAAA,CAAK;AAE9D,QAAM,cAAc,EAAE,YAAY,aAAa,OAAO,YAAY,uBAAuB,CAAC;AAE1F,WAAS,YAAY;AAAA,IACnB,WAAW,UAAU,SAAS;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AAED,UAAQ,IAAI;AAAA,QAAWH,OAAM,KAAK,cAAc,CAAC;AAAA,CAAI;AAErD,QAAM,oBAAoB,YAAY,cAAc;AAEpD,QAAM,QAAQN,MAAK,GAAG,cAAc,iBAAiB,UAAU,WAAW,GAAG;AAAA,IAC3E,MAAM;AAAA,IACN,aAAa;AAAA,IACb,UAAU,CAAC,QAAQM,OAAM,IAAI,oCAAoC,IAAI,OAAO,EAAE;AAAA,EAChF,CAAC;AAED,QAAM,iBAAiB,QAAQ,aAAa,EAAE,YAAY,eAAe,CAAC;AAE1E,UAAQ;AAAA,IACN;AAAA,EAAKA,OAAM,MAAM,UAAU,CAAC,aAAa,WAAW,SAAS,UAAU;AAAA;AAAA,IACvE;AAAA,IACAA,OAAM,OAAO;AAAA,KAAQ,WAAW,OAAO,cAAc;AAAA,CAAY;AAAA,EACnE;AACF,EAAC;;;Aa9QH,SAAS,WAAAI,UAAS,UAAAC,eAAc;AAChC,SAAS,SAAAC,QAAO,UAAAC,eAAc;AAC9B,OAAOC,YAAW;AAClB,YAAYC,QAAO;AAQZ,IAAM,OAAO,IAAIC,SAAQ,MAAM,EACnC,YAAY,+DAA+D,EAC3E,OAAO,uBAAuB,wBAAwB,EACtD,OAAO,0BAA0B,0BAA0B,EAC3D;AAAA,EACC,IAAIC,QAAO,qCAAqC,sBAAsB,EACnE,QAAQ,iBAAiB,EACzB,SAAS;AACd,EACC;AAAA,EACC,IAAIA,QAAO,+BAA+B,iCAAiC,EACxE,QAAQ,6BAA6B,EACrC,SAAS;AACd,EACC,OAAO,CAAO,YAAY;AACzB,QAAM,aAAa,QAAQ,IAAI;AAE/B,QAAM,YAAc,UAAO,EAAE,IAAI;AACjC,QAAM,mBAAmBC,OAAM,QAAQ,kBAAkB,SAAS;AAClE,QAAM,oBAAoB,eAAe,QAAQ,mBAAmB;AACpE,QAAM,qBAAqB,iBAAiB,QAAQ,mBAAmB;AAEvE,MAAI,YAAY,QAAQ;AACxB,MAAI,cAAc,QAAQ;AAC1B,MAAI;AACJ,MAAI;AAEJ,MAAI,CAAC,QAAQ,aAAa,CAAC,QAAQ,aAAa;AAC9C,UAAM,cAAc,MAAM,MAAM,kBAAkB;AAElD,gBAAY,YAAY;AACxB,kBAAc,YAAY;AAAA,EAC5B;AAEA,MAAI,CAAC,aAAa,CAAC,aAAa;AAC9B,YAAQ;AAAA,MACNC,OAAM,OAAO,6EAA6E;AAAA,IAC5F;AAEA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAEA,QAAM,KAAK,IAAI,MAAM,EAAE,mBAAmB,WAAW,YAAY,CAAC;AAElE,QAAM,oBAAoB,MAAM,GAAG,SAAS,iCAAiC;AAC7E,QAAM,YAAY,MAAM,GAAG,iBAAiB;AAE5C,QAAM,mBAAmB,qBAAqB,mBAAmB,SAAS;AAE1E,MAAI;AAEJ,MAAI,kBAAkB;AACpB,0BAAsB,MAAMC,QAAO;AAAA,MACjC,SAAS;AAAA,MACT,SAAS;AAAA,QACP,EAAE,MAAM,OAAO,OAAO,KAAK;AAAA,QAC3B,EAAE,MAAM,MAAM,OAAO,MAAM;AAAA,MAC7B;AAAA,IACF,CAAC;AAAA,EACH;AAEA,MAAI,qBAAqB;AACvB,UAAM,iBAAiB,MAAMC,OAAM;AAAA,MACjC,SAAS;AAAA,IACX,CAAC;AAED,UAAM,gBAAgB,IAAI,MAAM;AAAA,MAC9B;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAED,UAAM;AAAA,MACJ,MAAM,EAAE,IAAI,kBAAkB,sBAAsB,mBAAmB;AAAA,IACzE,IAAI,MAAM,cAAc,cAAc,cAAc;AAEpD,gBAAY;AACZ,iCAA6B;AAAA,EAK/B;AAEA,MAAI,CAAC,qBAAqB;AACxB,UAAM,mBAAmB,CAAC,YAAY,QAAQ,aAAa;AAE3D,UAAM,kBAAkB,MAAMD,QAAO;AAAA,MACnC,SAAS;AAAA,MACT,SAAS,kBAAkB,KACxB;AAAA,QACC,CAAC,GAAG,MAAM,iBAAiB,QAAQ,EAAE,QAAQ,IAAI,iBAAiB,QAAQ,EAAE,QAAQ;AAAA,MACtF,EACC,IAAI,CAAC,QAAQ;AAAA,QACZ,MAAM,GAAG;AAAA,QACT,OAAO;AAAA,QACP,aAAa,qBACX,GAAG,aAAa,gBACZ,YACA,GAAG,SAAS,OAAO,CAAC,EAAE,YAAY,IAAI,GAAG,SAAS,MAAM,CAAC,CAC/D;AAAA,MACF,EAAE;AAAA,IACN,CAAC;AAED,gBAAY,gBAAgB;AAE5B,UAAM;AAAA,MACJ,MAAM,EAAE,MAAM;AAAA,IAChB,IAAI,MAAM,GAAG,2BAA2B;AAExC,iCAA6B;AAAA,EAC/B;AAEA,MAAI,CAAC,UAAW,OAAM,IAAI,MAAM,gDAAgD;AAChF,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,iEAAiE;AAEnF,WAAS,YAAY;AAAA,IACnB,WAAW,UAAU,SAAS;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH,EAAC;;;Af3HH,QAAQ,IAAIE,OAAM,WAAW;AAAA,SAAO,gBAAa,IAAI,KAAK,gBAAa,OAAO;AAAA,CAAI,CAAC;AAEnF,QACG,KAAK,gBAAa,IAAI,EACtB,QAAQ,gBAAa,OAAO,EAC5B,YAAY,uDAAuD,EACnE,WAAW,QAAQ,EAAE,WAAW,KAAK,CAAC,EACtC,WAAW,IAAI,EACf,WAAW,WAAW;AAEzB,QAAQ,MAAM,QAAQ,IAAI;","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"]}
|