@bigcommerce/create-catalyst 0.5.0 → 0.7.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/README.md +11 -0
- package/dist/index.js +95 -80
- package/dist/index.js.map +1 -1
- package/package.json +10 -10
package/README.md
CHANGED
|
@@ -4,6 +4,9 @@ Create a new Catalyst project, and optionally connect the project to a BigCommer
|
|
|
4
4
|
|
|
5
5
|
## Usage
|
|
6
6
|
|
|
7
|
+
> [!WARNING]
|
|
8
|
+
> With yarn berry, you might run into a dependency issue with `stripAnsi`. You can circumvent this issue by setting the [nodeLinker](https://yarnpkg.com/configuration/yarnrc#nodeLinker) to either `pnpm` or `node-modules` while the dependency issue is resolved.
|
|
9
|
+
|
|
7
10
|
### Create a new Catalyst project
|
|
8
11
|
|
|
9
12
|
```sh
|
|
@@ -14,6 +17,10 @@ npm create @bigcommerce/catalyst@latest
|
|
|
14
17
|
pnpm create @bigcommerce/catalyst@latest
|
|
15
18
|
```
|
|
16
19
|
|
|
20
|
+
```sh
|
|
21
|
+
yarn create @bigcommerce/catalyst@latest
|
|
22
|
+
```
|
|
23
|
+
|
|
17
24
|
### Connect an existing Catalyst project to a BigCommerce store
|
|
18
25
|
|
|
19
26
|
```sh
|
|
@@ -23,3 +30,7 @@ npm create @bigcommerce/catalyst@latest init
|
|
|
23
30
|
```sh
|
|
24
31
|
pnpm create @bigcommerce/catalyst@latest init
|
|
25
32
|
```
|
|
33
|
+
|
|
34
|
+
```sh
|
|
35
|
+
yarn create @bigcommerce/catalyst@latest init
|
|
36
|
+
```
|
package/dist/index.js
CHANGED
|
@@ -59,7 +59,7 @@ import { satisfies } from "semver";
|
|
|
59
59
|
// package.json
|
|
60
60
|
var package_default = {
|
|
61
61
|
name: "@bigcommerce/create-catalyst",
|
|
62
|
-
version: "0.
|
|
62
|
+
version: "0.7.0",
|
|
63
63
|
type: "module",
|
|
64
64
|
bin: "dist/index.js",
|
|
65
65
|
files: [
|
|
@@ -77,7 +77,7 @@ var package_default = {
|
|
|
77
77
|
},
|
|
78
78
|
dependencies: {
|
|
79
79
|
"@commander-js/extra-typings": "^12.0.1",
|
|
80
|
-
"@inquirer/prompts": "^
|
|
80
|
+
"@inquirer/prompts": "^5.0.3",
|
|
81
81
|
chalk: "^5.3.0",
|
|
82
82
|
commander: "^12.0.0",
|
|
83
83
|
"fs-extra": "^11.2.0",
|
|
@@ -86,28 +86,28 @@ var package_default = {
|
|
|
86
86
|
"lodash.merge": "^4.6.2",
|
|
87
87
|
nypm: "^0.3.8",
|
|
88
88
|
ora: "^8.0.1",
|
|
89
|
-
semver: "^7.6.
|
|
90
|
-
zod: "^3.
|
|
91
|
-
"zod-validation-error": "^3.
|
|
89
|
+
semver: "^7.6.2",
|
|
90
|
+
zod: "^3.23.8",
|
|
91
|
+
"zod-validation-error": "^3.3.0"
|
|
92
92
|
},
|
|
93
93
|
devDependencies: {
|
|
94
|
-
"@bigcommerce/eslint-config": "^2.
|
|
94
|
+
"@bigcommerce/eslint-config": "^2.9.0",
|
|
95
95
|
"@bigcommerce/eslint-config-catalyst": "workspace:^",
|
|
96
|
-
"@swc/core": "^1.
|
|
96
|
+
"@swc/core": "^1.5.5",
|
|
97
97
|
"@swc/jest": "^0.2.36",
|
|
98
98
|
"@types/fs-extra": "^11.0.4",
|
|
99
99
|
"@types/jest": "^29.5.12",
|
|
100
100
|
"@types/lodash.kebabcase": "^4.1.9",
|
|
101
101
|
"@types/lodash.merge": "^4.6.9",
|
|
102
|
-
"@types/node": "^20.12.
|
|
102
|
+
"@types/node": "^20.12.11",
|
|
103
103
|
"@types/prompts": "^2.4.9",
|
|
104
104
|
"@types/semver": "^7.5.8",
|
|
105
105
|
eslint: "^8.57.0",
|
|
106
106
|
jest: "^29.7.0",
|
|
107
|
-
msw: "^2.
|
|
107
|
+
msw: "^2.3.0",
|
|
108
108
|
prettier: "^3.2.5",
|
|
109
109
|
tsup: "^8.0.2",
|
|
110
|
-
typescript: "^5.4.
|
|
110
|
+
typescript: "^5.4.5"
|
|
111
111
|
}
|
|
112
112
|
};
|
|
113
113
|
|
|
@@ -151,7 +151,8 @@ var checkStorefrontLimit = (channels, storeInfo) => {
|
|
|
151
151
|
|
|
152
152
|
// src/utils/clone-catalyst.ts
|
|
153
153
|
import chalk2 from "chalk";
|
|
154
|
-
import {
|
|
154
|
+
import { readFile, writeFile } from "fs/promises";
|
|
155
|
+
import { ensureDir, readJsonSync, removeSync, writeJsonSync } from "fs-extra/esm";
|
|
155
156
|
import { downloadTemplate } from "giget";
|
|
156
157
|
import merge from "lodash.merge";
|
|
157
158
|
import { join } from "path";
|
|
@@ -159,21 +160,23 @@ import * as z from "zod";
|
|
|
159
160
|
|
|
160
161
|
// src/utils/spinner.ts
|
|
161
162
|
import { oraPromise } from "ora";
|
|
162
|
-
var spinnerIcon = "triangle";
|
|
163
163
|
var spinner = (action, oraOpts) => __async(void 0, null, function* () {
|
|
164
164
|
return oraPromise(action, __spreadValues({
|
|
165
|
-
spinner:
|
|
165
|
+
spinner: "triangle"
|
|
166
166
|
}, oraOpts)).catch(() => process.exit(1));
|
|
167
167
|
});
|
|
168
168
|
|
|
169
169
|
// src/utils/clone-catalyst.ts
|
|
170
170
|
var cloneCatalyst = (_0) => __async(void 0, [_0], function* ({
|
|
171
|
+
codeEditor,
|
|
172
|
+
includeFunctionalTests,
|
|
171
173
|
projectDir,
|
|
172
174
|
projectName,
|
|
173
175
|
ghRef = "main"
|
|
174
176
|
}) {
|
|
177
|
+
var _a;
|
|
175
178
|
yield spinner(
|
|
176
|
-
downloadTemplate(`github:bigcommerce/catalyst/
|
|
179
|
+
downloadTemplate(`github:bigcommerce/catalyst/core#${ghRef}`, {
|
|
177
180
|
dir: projectDir,
|
|
178
181
|
offline: false
|
|
179
182
|
}),
|
|
@@ -183,68 +186,53 @@ var cloneCatalyst = (_0) => __async(void 0, [_0], function* ({
|
|
|
183
186
|
failText: (err) => chalk2.red(`Failed to clone Catalyst template: ${err.message}`)
|
|
184
187
|
}
|
|
185
188
|
);
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
copySync(join(projectDir, "tmp/tailwind.config.js"), join(projectDir, "tailwind.config.js"));
|
|
189
|
+
switch (codeEditor) {
|
|
190
|
+
case "vscode":
|
|
191
|
+
yield ensureDir(join(projectDir, ".vscode"));
|
|
192
|
+
writeJsonSync(
|
|
193
|
+
join(projectDir, ".vscode/settings.json"),
|
|
194
|
+
{ "typescript.tsdk": "node_modules/typescript/lib" },
|
|
195
|
+
{ spaces: 2 }
|
|
196
|
+
);
|
|
197
|
+
break;
|
|
198
|
+
default:
|
|
199
|
+
break;
|
|
200
|
+
}
|
|
199
201
|
const packageJson = z.object({
|
|
200
202
|
name: z.string(),
|
|
201
203
|
description: z.string(),
|
|
202
204
|
version: z.string(),
|
|
203
205
|
scripts: z.object({}).passthrough().optional(),
|
|
204
206
|
dependencies: z.object({}).passthrough(),
|
|
205
|
-
devDependencies: z.object({}).passthrough()
|
|
206
|
-
private: z.boolean().optional(),
|
|
207
|
-
exports: z.object({}).passthrough().optional(),
|
|
208
|
-
sideEffects: z.boolean().optional(),
|
|
209
|
-
peerDependencies: z.object({}).passthrough().optional()
|
|
207
|
+
devDependencies: z.object({}).passthrough()
|
|
210
208
|
}).passthrough().parse(
|
|
211
|
-
merge(
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
{ name: projectName, description: "" }
|
|
216
|
-
)
|
|
209
|
+
merge({}, readJsonSync(join(projectDir, "package.json")), {
|
|
210
|
+
name: projectName,
|
|
211
|
+
description: ""
|
|
212
|
+
})
|
|
217
213
|
);
|
|
218
|
-
delete packageJson.private;
|
|
219
|
-
delete packageJson.exports;
|
|
220
|
-
delete packageJson.sideEffects;
|
|
221
|
-
delete packageJson.peerDependencies;
|
|
222
|
-
delete packageJson.dependencies["@bigcommerce/components"];
|
|
223
214
|
delete packageJson.dependencies["@bigcommerce/catalyst-client"];
|
|
224
|
-
delete packageJson.devDependencies.react;
|
|
225
|
-
delete packageJson.devDependencies["react-dom"];
|
|
226
215
|
delete packageJson.devDependencies["@bigcommerce/eslint-config-catalyst"];
|
|
216
|
+
if (!includeFunctionalTests) {
|
|
217
|
+
delete packageJson.devDependencies["@faker-js/faker"];
|
|
218
|
+
delete packageJson.devDependencies["@playwright/test"];
|
|
219
|
+
}
|
|
227
220
|
writeJsonSync(join(projectDir, "package.json"), packageJson, { spaces: 2 });
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
})
|
|
236
|
-
}
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
)
|
|
242
|
-
|
|
243
|
-
delete tsConfigJson.compilerOptions.declaration;
|
|
244
|
-
delete tsConfigJson.compilerOptions.declarationMap;
|
|
245
|
-
tsConfigJson.compilerOptions.paths["@bigcommerce/components/*"] = ["./components/ui/*"];
|
|
246
|
-
writeJsonSync(join(projectDir, "tsconfig.json"), tsConfigJson, { spaces: 2 });
|
|
247
|
-
removeSync(join(projectDir, "tmp"));
|
|
221
|
+
if (!includeFunctionalTests) {
|
|
222
|
+
const tsConfigJson = z.object({
|
|
223
|
+
include: z.array(z.string()).optional()
|
|
224
|
+
}).passthrough().parse(readJsonSync(join(projectDir, "tsconfig.json")));
|
|
225
|
+
tsConfigJson.include = (_a = tsConfigJson.include) == null ? void 0 : _a.filter(
|
|
226
|
+
(include) => !["tests/**/*", "playwright.config.ts"].includes(include)
|
|
227
|
+
);
|
|
228
|
+
writeJsonSync(join(projectDir, "tsconfig.json"), tsConfigJson, { spaces: 2 });
|
|
229
|
+
}
|
|
230
|
+
if (!includeFunctionalTests) {
|
|
231
|
+
const eslint = (yield readFile(join(projectDir, ".eslintrc.cjs"), { encoding: "utf-8" })).replace(/['"]playwright-report\/\*\*['"],?/, "").replace(/['"]test-results\/\*\*['"],?/, "");
|
|
232
|
+
yield writeFile(join(projectDir, ".eslintrc.cjs"), eslint);
|
|
233
|
+
removeSync(join(projectDir, "tests"));
|
|
234
|
+
removeSync(join(projectDir, "playwright.config.ts"));
|
|
235
|
+
}
|
|
248
236
|
});
|
|
249
237
|
|
|
250
238
|
// src/utils/https.ts
|
|
@@ -297,11 +285,11 @@ var Https = class {
|
|
|
297
285
|
accessToken
|
|
298
286
|
}) {
|
|
299
287
|
this.DEVICE_OAUTH_CLIENT_ID = "acse0vvawm9r1n0evag4b8e1ea1fo90";
|
|
300
|
-
this.bigCommerceApiUrl = bigCommerceApiUrl
|
|
301
|
-
this.bigCommerceAuthUrl = bigCommerceAuthUrl
|
|
302
|
-
this.sampleDataApiUrl = sampleDataApiUrl
|
|
303
|
-
this.storeHash = storeHash
|
|
304
|
-
this.accessToken = accessToken
|
|
288
|
+
this.bigCommerceApiUrl = bigCommerceApiUrl != null ? bigCommerceApiUrl : "";
|
|
289
|
+
this.bigCommerceAuthUrl = bigCommerceAuthUrl != null ? bigCommerceAuthUrl : "";
|
|
290
|
+
this.sampleDataApiUrl = sampleDataApiUrl != null ? sampleDataApiUrl : "";
|
|
291
|
+
this.storeHash = storeHash != null ? storeHash : "";
|
|
292
|
+
this.accessToken = accessToken != null ? accessToken : "";
|
|
305
293
|
}
|
|
306
294
|
auth(path, opts = {}) {
|
|
307
295
|
if (!this.bigCommerceAuthUrl) {
|
|
@@ -410,6 +398,32 @@ GET /v3/channels failed: ${res.status} ${res.statusText}
|
|
|
410
398
|
return parse(yield res.json(), BigCommerceChannelsV3ResponseSchema);
|
|
411
399
|
});
|
|
412
400
|
}
|
|
401
|
+
createChannelMenus(channelId) {
|
|
402
|
+
return __async(this, null, function* () {
|
|
403
|
+
const res = yield this.api(`/v3/channels/${channelId}/channel-menus`, {
|
|
404
|
+
method: "POST",
|
|
405
|
+
headers: { "Content-Type": "application/json" },
|
|
406
|
+
body: JSON.stringify({
|
|
407
|
+
bigcommerce_protected_app_sections: [
|
|
408
|
+
"storefront_settings",
|
|
409
|
+
"currencies",
|
|
410
|
+
"domains",
|
|
411
|
+
"notifications",
|
|
412
|
+
"social"
|
|
413
|
+
]
|
|
414
|
+
})
|
|
415
|
+
});
|
|
416
|
+
if (!res.ok) {
|
|
417
|
+
console.warn(
|
|
418
|
+
chalk3.yellow(
|
|
419
|
+
`
|
|
420
|
+
Failed to create channel menus: ${res.status} ${res.statusText}. You may want to create these later: https://developer.bigcommerce.com/docs/rest-management/channels/menus#create-channel-menus
|
|
421
|
+
`
|
|
422
|
+
)
|
|
423
|
+
);
|
|
424
|
+
}
|
|
425
|
+
});
|
|
426
|
+
}
|
|
413
427
|
customerImpersonationToken(channelId) {
|
|
414
428
|
return __async(this, null, function* () {
|
|
415
429
|
const res = yield this.api("/v3/storefront/api-token-customer-impersonation", {
|
|
@@ -587,7 +601,7 @@ var writeEnv = (projectDir, {
|
|
|
587
601
|
// src/commands/create.ts
|
|
588
602
|
var exec = promisify(execCallback);
|
|
589
603
|
var create = (options) => __async(void 0, null, function* () {
|
|
590
|
-
const { packageManager } = options;
|
|
604
|
+
const { packageManager, codeEditor, includeFunctionalTests } = options;
|
|
591
605
|
const URLSchema = z4.string().url();
|
|
592
606
|
const sampleDataApiUrl = parse(options.sampleDataApiUrl, URLSchema);
|
|
593
607
|
const bigcommerceApiUrl = parse(`https://api.${options.bigcommerceHostname}`, URLSchema);
|
|
@@ -652,7 +666,7 @@ var create = (options) => __async(void 0, null, function* () {
|
|
|
652
666
|
console.log(`
|
|
653
667
|
Creating '${projectName}' at '${projectDir}'
|
|
654
668
|
`);
|
|
655
|
-
yield cloneCatalyst({ projectDir, projectName, ghRef });
|
|
669
|
+
yield cloneCatalyst({ projectDir, projectName, ghRef, codeEditor, includeFunctionalTests });
|
|
656
670
|
console.log(`
|
|
657
671
|
Using ${chalk6.bold(packageManager)}
|
|
658
672
|
`);
|
|
@@ -699,6 +713,7 @@ ${chalk6.green("Success!")} Created '${projectName}' at '${projectDir}'
|
|
|
699
713
|
const {
|
|
700
714
|
data: { id: createdChannelId, storefront_api_token: storefrontApiToken }
|
|
701
715
|
} = yield sampleDataApi.createChannel(newChannelName);
|
|
716
|
+
yield bc.createChannelMenus(createdChannelId);
|
|
702
717
|
channelId = createdChannelId;
|
|
703
718
|
customerImpersonationToken = storefrontApiToken;
|
|
704
719
|
}
|
|
@@ -728,7 +743,7 @@ ${chalk6.green("Success!")} Created '${projectName}' at '${projectDir}'
|
|
|
728
743
|
console.log(`
|
|
729
744
|
Creating '${projectName}' at '${projectDir}'
|
|
730
745
|
`);
|
|
731
|
-
yield cloneCatalyst({ projectDir, projectName, ghRef });
|
|
746
|
+
yield cloneCatalyst({ projectDir, projectName, ghRef, codeEditor, includeFunctionalTests });
|
|
732
747
|
writeEnv(projectDir, {
|
|
733
748
|
channelId: channelId.toString(),
|
|
734
749
|
storeHash,
|
|
@@ -744,11 +759,6 @@ Using ${chalk6.bold(packageManager)}
|
|
|
744
759
|
successText: "Created GraphQL schema",
|
|
745
760
|
failText: (err) => chalk6.red(`Failed to create GraphQL schema: ${err.message}`)
|
|
746
761
|
});
|
|
747
|
-
yield spinner(exec(`${packageManager} run lint -- --fix`, { cwd: projectDir }), {
|
|
748
|
-
text: "Linting to validate generated types...",
|
|
749
|
-
successText: "GraphQL types validated successfully",
|
|
750
|
-
failText: (err) => chalk6.red(`Failed to validate GraphQL types: ${err.message}`)
|
|
751
|
-
});
|
|
752
762
|
console.log(
|
|
753
763
|
`
|
|
754
764
|
${chalk6.green("Success!")} Created '${projectName}' at '${projectDir}'
|
|
@@ -845,7 +855,7 @@ var init = (options) => __async(void 0, null, function* () {
|
|
|
845
855
|
// src/utils/get-latest-core-tag.ts
|
|
846
856
|
import * as z6 from "zod";
|
|
847
857
|
var getLatestCoreTag = () => __async(void 0, null, function* () {
|
|
848
|
-
const rawPackageJsonUrl = "https://raw.githubusercontent.com/bigcommerce/catalyst/main/
|
|
858
|
+
const rawPackageJsonUrl = "https://raw.githubusercontent.com/bigcommerce/catalyst/main/core/package.json";
|
|
849
859
|
const response = yield fetch(rawPackageJsonUrl);
|
|
850
860
|
try {
|
|
851
861
|
const { version } = z6.object({ version: z6.string() }).parse(yield response.json());
|
|
@@ -858,7 +868,8 @@ var getLatestCoreTag = () => __async(void 0, null, function* () {
|
|
|
858
868
|
// src/utils/pm.ts
|
|
859
869
|
var packageManagerChoices = ["npm", "pnpm", "yarn"];
|
|
860
870
|
function getPackageManager() {
|
|
861
|
-
|
|
871
|
+
var _a;
|
|
872
|
+
const userAgent = (_a = process.env.npm_config_user_agent) != null ? _a : "";
|
|
862
873
|
if (userAgent.startsWith("yarn")) {
|
|
863
874
|
return "yarn";
|
|
864
875
|
}
|
|
@@ -899,6 +910,10 @@ var createCommand = program.command("create", { isDefault: true }).description("
|
|
|
899
910
|
new Option("--sample-data-api-url <url>", "BigCommerce sample data API URL").default("https://api.bc-sample.store").hideHelp()
|
|
900
911
|
).addOption(
|
|
901
912
|
new Option("--package-manager <pm>", "Override detected package manager").choices(packageManagerChoices).default(getPackageManager()).hideHelp()
|
|
913
|
+
).addOption(
|
|
914
|
+
new Option("--code-editor <editor>", "Your preferred code editor").choices(["vscode"]).default("vscode").hideHelp()
|
|
915
|
+
).addOption(
|
|
916
|
+
new Option("--include-functional-tests", "Include the functional test suite").default(false).hideHelp()
|
|
902
917
|
).action((opts) => create(opts));
|
|
903
918
|
var initCommand = program.command("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(
|
|
904
919
|
new Option("--bigcommerce-hostname <hostname>", "BigCommerce hostname").default("bigcommerce.com").hideHelp()
|
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/https.ts","../src/utils/parse.ts","../src/utils/install-dependencies.ts","../src/utils/login.ts","../src/utils/write-env.ts","../src/commands/init.ts","../src/utils/get-latest-core-tag.ts","../src/utils/pm.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command, Option } from '@commander-js/extra-typings';\nimport chalk from 'chalk';\nimport { satisfies } from 'semver';\n\nimport PACKAGE_INFO from '../package.json';\n\nimport { create } from './commands/create';\nimport { init } from './commands/init';\nimport { getLatestCoreTag } from './utils/get-latest-core-tag';\nimport { getPackageManager, packageManagerChoices } from './utils/pm';\n\nif (!satisfies(process.version, PACKAGE_INFO.engines.node)) {\n console.error(\n chalk.red(\n `\\nYou are using Node.js ${process.version}. Catalyst requires ${PACKAGE_INFO.engines.node}. Please upgrade your Node.js version to continue.\\n`,\n ),\n );\n console.log(\n chalk.yellow(\n 'Tip: If you use nvm, you can run `nvm install 18` to install a compatible node version.\\n',\n ),\n );\n process.exit(1);\n}\n\nconsole.log(chalk.cyanBright(`\\n◢ ${PACKAGE_INFO.name} v${PACKAGE_INFO.version}\\n`));\n\nexport type Options<T> = T extends Command<infer Args, infer Opts> ? [...Args, Opts, T] : never;\n\nconst program = new Command()\n .name(PACKAGE_INFO.name)\n .version(PACKAGE_INFO.version)\n .description('A command line tool to create a new Catalyst project.');\n\nconst createCommand = program\n .command('create', { isDefault: true })\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 .action((opts) => create(opts));\n\nexport type CreateCommandOptions = Options<typeof createCommand>[0];\n\nconst initCommand = program\n .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((opts) => init(opts));\n\nexport type InitCommandOptions = Options<typeof initCommand>[0];\n\nprogram.parse(process.argv);\n","{\n \"name\": \"@bigcommerce/create-catalyst\",\n \"version\": \"0.5.0\",\n \"type\": \"module\",\n \"bin\": \"dist/index.js\",\n \"files\": [\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.0.1\",\n \"@inquirer/prompts\": \"^4.3.2\",\n \"chalk\": \"^5.3.0\",\n \"commander\": \"^12.0.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.8\",\n \"ora\": \"^8.0.1\",\n \"semver\": \"^7.6.0\",\n \"zod\": \"^3.22.4\",\n \"zod-validation-error\": \"^3.1.0\"\n },\n \"devDependencies\": {\n \"@bigcommerce/eslint-config\": \"^2.8.0\",\n \"@bigcommerce/eslint-config-catalyst\": \"workspace:^\",\n \"@swc/core\": \"^1.4.12\",\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.12.7\",\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.2.13\",\n \"prettier\": \"^3.2.5\",\n \"tsup\": \"^8.0.2\",\n \"typescript\": \"^5.4.4\"\n }\n}\n","import { 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 { type CreateCommandOptions } from '..';\nimport { checkStorefrontLimit } from '../utils/check-storefront-limit';\nimport { cloneCatalyst } from '../utils/clone-catalyst';\nimport { Https } from '../utils/https';\nimport { installDependencies } from '../utils/install-dependencies';\nimport { login } from '../utils/login';\nimport { parse } from '../utils/parse';\nimport { spinner } from '../utils/spinner';\nimport { writeEnv } from '../utils/write-env';\n\nconst exec = promisify(execCallback);\n\nexport const create = async (options: CreateCommandOptions) => {\n const { packageManager } = 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 });\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 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(channelId);\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 });\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 spinner(exec(`${packageManager} run lint -- --fix`, { cwd: projectDir }), {\n text: 'Linting to validate generated types...',\n successText: 'GraphQL types validated successfully',\n failText: (err) => chalk.red(`Failed to validate GraphQL types: ${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 { copySync, 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 projectDir,\n projectName,\n ghRef = 'main',\n}: {\n projectDir: string;\n projectName: string;\n ghRef?: string;\n}) => {\n await spinner(\n downloadTemplate(`github:bigcommerce/catalyst/apps/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 await spinner(\n downloadTemplate(`github:bigcommerce/catalyst/packages/components#${ghRef}`, {\n dir: join(projectDir, 'tmp'),\n offline: false,\n }),\n {\n text: 'Cloning Catalyst components...',\n successText: 'Catalyst components cloned successfully',\n failText: (err) => chalk.red(`Failed to clone Catalyst components: ${err.message}`),\n },\n );\n\n copySync(join(projectDir, 'tmp/src/components'), join(projectDir, 'components', 'ui'));\n copySync(join(projectDir, 'tmp/tailwind.config.js'), join(projectDir, 'tailwind.config.js'));\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 private: z.boolean().optional(),\n exports: z.object({}).passthrough().optional(),\n sideEffects: z.boolean().optional(),\n peerDependencies: z.object({}).passthrough().optional(),\n })\n .passthrough()\n .parse(\n merge(\n {},\n readJsonSync(join(projectDir, 'tmp/package.json')),\n readJsonSync(join(projectDir, 'package.json')),\n { name: projectName, description: '' },\n ),\n );\n\n delete packageJson.private;\n delete packageJson.exports;\n delete packageJson.sideEffects;\n delete packageJson.peerDependencies; // will go away\n delete packageJson.dependencies['@bigcommerce/components']; // will go away\n delete packageJson.dependencies['@bigcommerce/catalyst-client'];\n delete packageJson.devDependencies.react; // will go away\n delete packageJson.devDependencies['react-dom']; // will go away\n delete packageJson.devDependencies['@bigcommerce/eslint-config-catalyst'];\n\n writeJsonSync(join(projectDir, 'package.json'), packageJson, { spaces: 2 });\n\n const tsConfigJson = z\n .object({\n compilerOptions: z\n .object({\n declaration: z.boolean().optional(),\n declarationMap: z.boolean().optional(),\n paths: z\n .object({\n '@bigcommerce/components/*': z.string().array().optional(),\n })\n .passthrough(),\n })\n .passthrough(),\n })\n .passthrough()\n .parse(\n merge(\n {},\n readJsonSync(join(projectDir, 'tmp/tsconfig.json')),\n readJsonSync(join(projectDir, 'tsconfig.json')),\n ),\n );\n\n delete tsConfigJson.compilerOptions.declaration;\n delete tsConfigJson.compilerOptions.declarationMap;\n\n tsConfigJson.compilerOptions.paths['@bigcommerce/components/*'] = ['./components/ui/*'];\n\n writeJsonSync(join(projectDir, 'tsconfig.json'), tsConfigJson, { spaces: 2 });\n\n removeSync(join(projectDir, 'tmp'));\n};\n","import { type Ora, oraPromise, type PromiseOptions } from 'ora';\n\nconst spinnerIcon = 'triangle' as const;\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: spinnerIcon,\n ...oraOpts,\n }).catch(() => process.exit(1));\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 customerImpersonationToken(channelId: number) {\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_id: channelId }),\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","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 { input, select } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport * as z from 'zod';\n\nimport { type InitCommandOptions } from '../index';\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 = async (options: InitCommandOptions) => {\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((a, b) => channelSortOrder.indexOf(a.platform) - channelSortOrder.indexOf(b.platform))\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(channelId);\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","import * as z from 'zod';\n\nexport const getLatestCoreTag = async () => {\n const rawPackageJsonUrl =\n 'https://raw.githubusercontent.com/bigcommerce/catalyst/main/apps/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","/**\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"],"mappings":"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","names":["chalk","select","chalk","join","z","chalk","chalk","chalk","z","z","z","chalk","chalk","chalk","chalk","chalk","join","z","chalk","join","select","input","select","chalk","z","chalk","select","input","z","chalk"]}
|
|
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/https.ts","../src/utils/parse.ts","../src/utils/install-dependencies.ts","../src/utils/login.ts","../src/utils/write-env.ts","../src/commands/init.ts","../src/utils/get-latest-core-tag.ts","../src/utils/pm.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport { Command, Option } from '@commander-js/extra-typings';\nimport chalk from 'chalk';\nimport { satisfies } from 'semver';\n\nimport PACKAGE_INFO from '../package.json';\n\nimport { create } from './commands/create';\nimport { init } from './commands/init';\nimport { getLatestCoreTag } from './utils/get-latest-core-tag';\nimport { getPackageManager, packageManagerChoices } from './utils/pm';\n\nif (!satisfies(process.version, PACKAGE_INFO.engines.node)) {\n console.error(\n chalk.red(\n `\\nYou are using Node.js ${process.version}. Catalyst requires ${PACKAGE_INFO.engines.node}. Please upgrade your Node.js version to continue.\\n`,\n ),\n );\n console.log(\n chalk.yellow(\n 'Tip: If you use nvm, you can run `nvm install 18` to install a compatible node version.\\n',\n ),\n );\n process.exit(1);\n}\n\nconsole.log(chalk.cyanBright(`\\n◢ ${PACKAGE_INFO.name} v${PACKAGE_INFO.version}\\n`));\n\nexport type Options<T> = T extends Command<infer Args, infer Opts> ? [...Args, Opts, T] : never;\n\nconst program = new Command()\n .name(PACKAGE_INFO.name)\n .version(PACKAGE_INFO.version)\n .description('A command line tool to create a new Catalyst project.');\n\nconst createCommand = program\n .command('create', { isDefault: true })\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((opts) => create(opts));\n\nexport type CreateCommandOptions = Options<typeof createCommand>[0];\n\nconst initCommand = program\n .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((opts) => init(opts));\n\nexport type InitCommandOptions = Options<typeof initCommand>[0];\n\nprogram.parse(process.argv);\n","{\n \"name\": \"@bigcommerce/create-catalyst\",\n \"version\": \"0.7.0\",\n \"type\": \"module\",\n \"bin\": \"dist/index.js\",\n \"files\": [\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.0.1\",\n \"@inquirer/prompts\": \"^5.0.3\",\n \"chalk\": \"^5.3.0\",\n \"commander\": \"^12.0.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.8\",\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.5.5\",\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.12.11\",\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.0\",\n \"prettier\": \"^3.2.5\",\n \"tsup\": \"^8.0.2\",\n \"typescript\": \"^5.4.5\"\n }\n}\n","import { 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 { type CreateCommandOptions } from '..';\nimport { checkStorefrontLimit } from '../utils/check-storefront-limit';\nimport { cloneCatalyst } from '../utils/clone-catalyst';\nimport { Https } from '../utils/https';\nimport { installDependencies } from '../utils/install-dependencies';\nimport { login } from '../utils/login';\nimport { parse } from '../utils/parse';\nimport { spinner } from '../utils/spinner';\nimport { writeEnv } from '../utils/write-env';\n\nconst exec = promisify(execCallback);\n\nexport const create = async (options: CreateCommandOptions) => {\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(channelId);\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","/* 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(channelId: number) {\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_id: channelId }),\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","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 { input, select } from '@inquirer/prompts';\nimport chalk from 'chalk';\nimport * as z from 'zod';\n\nimport { type InitCommandOptions } from '../index';\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 = async (options: InitCommandOptions) => {\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((a, b) => channelSortOrder.indexOf(a.platform) - channelSortOrder.indexOf(b.platform))\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(channelId);\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","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","/**\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"],"mappings":"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","names":["chalk","select","chalk","join","z","chalk","chalk","chalk","z","z","z","chalk","chalk","chalk","chalk","chalk","join","z","chalk","join","select","input","select","chalk","z","chalk","select","input","z","chalk"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bigcommerce/create-catalyst",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": "dist/index.js",
|
|
6
6
|
"files": [
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
13
|
"@commander-js/extra-typings": "^12.0.1",
|
|
14
|
-
"@inquirer/prompts": "^
|
|
14
|
+
"@inquirer/prompts": "^5.0.3",
|
|
15
15
|
"chalk": "^5.3.0",
|
|
16
16
|
"commander": "^12.0.0",
|
|
17
17
|
"fs-extra": "^11.2.0",
|
|
@@ -20,27 +20,27 @@
|
|
|
20
20
|
"lodash.merge": "^4.6.2",
|
|
21
21
|
"nypm": "^0.3.8",
|
|
22
22
|
"ora": "^8.0.1",
|
|
23
|
-
"semver": "^7.6.
|
|
24
|
-
"zod": "^3.
|
|
25
|
-
"zod-validation-error": "^3.
|
|
23
|
+
"semver": "^7.6.2",
|
|
24
|
+
"zod": "^3.23.8",
|
|
25
|
+
"zod-validation-error": "^3.3.0"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@bigcommerce/eslint-config": "^2.
|
|
29
|
-
"@swc/core": "^1.
|
|
28
|
+
"@bigcommerce/eslint-config": "^2.9.0",
|
|
29
|
+
"@swc/core": "^1.5.5",
|
|
30
30
|
"@swc/jest": "^0.2.36",
|
|
31
31
|
"@types/fs-extra": "^11.0.4",
|
|
32
32
|
"@types/jest": "^29.5.12",
|
|
33
33
|
"@types/lodash.kebabcase": "^4.1.9",
|
|
34
34
|
"@types/lodash.merge": "^4.6.9",
|
|
35
|
-
"@types/node": "^20.12.
|
|
35
|
+
"@types/node": "^20.12.11",
|
|
36
36
|
"@types/prompts": "^2.4.9",
|
|
37
37
|
"@types/semver": "^7.5.8",
|
|
38
38
|
"eslint": "^8.57.0",
|
|
39
39
|
"jest": "^29.7.0",
|
|
40
|
-
"msw": "^2.
|
|
40
|
+
"msw": "^2.3.0",
|
|
41
41
|
"prettier": "^3.2.5",
|
|
42
42
|
"tsup": "^8.0.2",
|
|
43
|
-
"typescript": "^5.4.
|
|
43
|
+
"typescript": "^5.4.5",
|
|
44
44
|
"@bigcommerce/eslint-config-catalyst": "^0.1.1"
|
|
45
45
|
},
|
|
46
46
|
"scripts": {
|