@bigcommerce/catalyst 1.0.0-alpha.0 → 1.0.0-alpha.1
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 +33 -1
- package/dist/cli.js +115 -19
- package/dist/cli.js.map +1 -1
- package/package.json +4 -3
- package/templates/open-next.config.ts +8 -2
- package/templates/public_headers +2 -0
package/README.md
CHANGED
|
@@ -1,3 +1,35 @@
|
|
|
1
1
|
# @bigcommerce/catalyst
|
|
2
2
|
|
|
3
|
-
CLI
|
|
3
|
+
CLI tool for Catalyst development and deployment.
|
|
4
|
+
|
|
5
|
+
## Developing the CLI
|
|
6
|
+
|
|
7
|
+
You'll need two terminal windows:
|
|
8
|
+
|
|
9
|
+
### Terminal 1 — Watch mode (rebuilds on changes)
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
cd packages/catalyst
|
|
13
|
+
pnpm dev
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
This runs `tsup --watch` and rebuilds `dist/cli.js` on every source change.
|
|
17
|
+
|
|
18
|
+
### Terminal 2 — Run the CLI
|
|
19
|
+
|
|
20
|
+
From the `core/` directory, run the CLI using the absolute path to the built executable:
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
cd core
|
|
24
|
+
pnpm exec <repo-root>/packages/catalyst/dist/cli.js <command>
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
For example:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
pnpm exec <repo-root>/packages/catalyst/dist/cli.js project list
|
|
31
|
+
pnpm exec <repo-root>/packages/catalyst/dist/cli.js logs tail
|
|
32
|
+
pnpm exec <repo-root>/packages/catalyst/dist/cli.js deploy
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
Replace `<repo-root>` with the absolute path to your local clone of the `catalyst` repository.
|
package/dist/cli.js
CHANGED
|
@@ -9,7 +9,7 @@ import { resolve } from "path";
|
|
|
9
9
|
// package.json
|
|
10
10
|
var package_default = {
|
|
11
11
|
name: "@bigcommerce/catalyst",
|
|
12
|
-
version: "
|
|
12
|
+
version: "0.1.0",
|
|
13
13
|
type: "module",
|
|
14
14
|
bin: {
|
|
15
15
|
catalyst: "dist/cli.js"
|
|
@@ -18,6 +18,7 @@ var package_default = {
|
|
|
18
18
|
"dist",
|
|
19
19
|
"templates"
|
|
20
20
|
],
|
|
21
|
+
private: true,
|
|
21
22
|
scripts: {
|
|
22
23
|
dev: "tsup --watch",
|
|
23
24
|
typecheck: "tsc --noEmit",
|
|
@@ -28,7 +29,7 @@ var package_default = {
|
|
|
28
29
|
build: "tsup"
|
|
29
30
|
},
|
|
30
31
|
engines: {
|
|
31
|
-
node: "^20.0.0 || ^22.0.0"
|
|
32
|
+
node: "^20.0.0 || ^22.0.0 || ^24.0.0"
|
|
32
33
|
},
|
|
33
34
|
dependencies: {
|
|
34
35
|
"@segment/analytics-node": "^2.2.1",
|
|
@@ -205,7 +206,7 @@ var build = new Command("build").allowUnknownOption().argument(
|
|
|
205
206
|
const projectUuid = options.projectUuid ?? config2.get("projectUuid");
|
|
206
207
|
if (!projectUuid) {
|
|
207
208
|
throw new Error(
|
|
208
|
-
"Project UUID is required. Please run `link` or
|
|
209
|
+
"Project UUID is required. Please run `catalyst project create` or `catalyst project link` or this command again with --project-uuid <uuid>."
|
|
209
210
|
);
|
|
210
211
|
}
|
|
211
212
|
const wranglerConfig = getWranglerConfig(projectUuid, "PLACEHOLDER_KV_ID");
|
|
@@ -561,7 +562,7 @@ var deploy = new Command2("deploy").description("Deploy your application to Clou
|
|
|
561
562
|
const projectUuid = options.projectUuid ?? config2.get("projectUuid");
|
|
562
563
|
if (!projectUuid) {
|
|
563
564
|
throw new Error(
|
|
564
|
-
"Project UUID is required. Please run either `
|
|
565
|
+
"Project UUID is required. Please run either `catalyst project link` or `catalyst project create` or this command again with --project-uuid <uuid>."
|
|
565
566
|
);
|
|
566
567
|
}
|
|
567
568
|
await generateBundleZip();
|
|
@@ -626,10 +627,11 @@ var dev = new Command3("dev").description("Start the Catalyst development server
|
|
|
626
627
|
}
|
|
627
628
|
});
|
|
628
629
|
|
|
629
|
-
// src/cli/commands/
|
|
630
|
+
// src/cli/commands/project.ts
|
|
630
631
|
import { Command as Command4, Option as Option3 } from "commander";
|
|
632
|
+
|
|
633
|
+
// src/cli/lib/project.ts
|
|
631
634
|
import { z as z2 } from "zod";
|
|
632
|
-
var telemetry2 = new Telemetry();
|
|
633
635
|
var fetchProjectsSchema = z2.object({
|
|
634
636
|
data: z2.array(
|
|
635
637
|
z2.object({
|
|
@@ -638,14 +640,6 @@ var fetchProjectsSchema = z2.object({
|
|
|
638
640
|
})
|
|
639
641
|
)
|
|
640
642
|
});
|
|
641
|
-
var createProjectSchema = z2.object({
|
|
642
|
-
data: z2.object({
|
|
643
|
-
uuid: z2.string(),
|
|
644
|
-
name: z2.string(),
|
|
645
|
-
date_created: z2.coerce.date(),
|
|
646
|
-
date_modified: z2.coerce.date()
|
|
647
|
-
})
|
|
648
|
-
});
|
|
649
643
|
async function fetchProjects(storeHash, accessToken, apiHost) {
|
|
650
644
|
const response = await fetch(
|
|
651
645
|
`https://${apiHost}/stores/${storeHash}/v3/infrastructure/projects`,
|
|
@@ -668,6 +662,14 @@ async function fetchProjects(storeHash, accessToken, apiHost) {
|
|
|
668
662
|
const { data } = fetchProjectsSchema.parse(res);
|
|
669
663
|
return data;
|
|
670
664
|
}
|
|
665
|
+
var createProjectSchema = z2.object({
|
|
666
|
+
data: z2.object({
|
|
667
|
+
uuid: z2.string(),
|
|
668
|
+
name: z2.string(),
|
|
669
|
+
date_created: z2.coerce.date(),
|
|
670
|
+
date_modified: z2.coerce.date()
|
|
671
|
+
})
|
|
672
|
+
});
|
|
671
673
|
async function createProject(name, storeHash, accessToken, apiHost) {
|
|
672
674
|
const response = await fetch(
|
|
673
675
|
`https://${apiHost}/stores/${storeHash}/v3/infrastructure/projects`,
|
|
@@ -696,6 +698,99 @@ async function createProject(name, storeHash, accessToken, apiHost) {
|
|
|
696
698
|
const { data } = createProjectSchema.parse(res);
|
|
697
699
|
return data;
|
|
698
700
|
}
|
|
701
|
+
|
|
702
|
+
// src/cli/commands/project.ts
|
|
703
|
+
var telemetry2 = new Telemetry();
|
|
704
|
+
var list = new Command4("list").description("List BigCommerce infrastructure projects for your store.").addOption(
|
|
705
|
+
new Option3(
|
|
706
|
+
"--store-hash <hash>",
|
|
707
|
+
"BigCommerce store hash. Can be found in the URL of your store Control Panel."
|
|
708
|
+
).env("BIGCOMMERCE_STORE_HASH")
|
|
709
|
+
).addOption(
|
|
710
|
+
new Option3(
|
|
711
|
+
"--access-token <token>",
|
|
712
|
+
"BigCommerce access token. Can be found after creating a store-level API account."
|
|
713
|
+
).env("BIGCOMMERCE_ACCESS_TOKEN")
|
|
714
|
+
).addOption(
|
|
715
|
+
new Option3("--api-host <host>", "BigCommerce API host. The default is api.bigcommerce.com.").env("BIGCOMMERCE_API_HOST").default("api.bigcommerce.com")
|
|
716
|
+
).action(async (options) => {
|
|
717
|
+
try {
|
|
718
|
+
if (!options.storeHash || !options.accessToken) {
|
|
719
|
+
consola.error("Insufficient information to list projects.");
|
|
720
|
+
consola.info(
|
|
721
|
+
"Provide both --store-hash and --access-token (or set BIGCOMMERCE_STORE_HASH and BIGCOMMERCE_ACCESS_TOKEN)."
|
|
722
|
+
);
|
|
723
|
+
process.exit(1);
|
|
724
|
+
return;
|
|
725
|
+
}
|
|
726
|
+
await telemetry2.identify(options.storeHash);
|
|
727
|
+
consola.start("Fetching projects...");
|
|
728
|
+
const projects = await fetchProjects(options.storeHash, options.accessToken, options.apiHost);
|
|
729
|
+
consola.success("Projects fetched.");
|
|
730
|
+
if (projects.length === 0) {
|
|
731
|
+
consola.info("No projects found.");
|
|
732
|
+
process.exit(0);
|
|
733
|
+
return;
|
|
734
|
+
}
|
|
735
|
+
projects.forEach((p) => {
|
|
736
|
+
consola.log(`${p.name} (${p.uuid})`);
|
|
737
|
+
});
|
|
738
|
+
process.exit(0);
|
|
739
|
+
} catch (error) {
|
|
740
|
+
consola.error(error instanceof Error ? error.message : error);
|
|
741
|
+
process.exit(1);
|
|
742
|
+
}
|
|
743
|
+
});
|
|
744
|
+
var create = new Command4("create").description(
|
|
745
|
+
"Create a new BigCommerce infrastructure project and link it to your local Catalyst project."
|
|
746
|
+
).addOption(
|
|
747
|
+
new Option3(
|
|
748
|
+
"--store-hash <hash>",
|
|
749
|
+
"BigCommerce store hash. Can be found in the URL of your store Control Panel."
|
|
750
|
+
).env("BIGCOMMERCE_STORE_HASH")
|
|
751
|
+
).addOption(
|
|
752
|
+
new Option3(
|
|
753
|
+
"--access-token <token>",
|
|
754
|
+
"BigCommerce access token. Can be found after creating a store-level API account."
|
|
755
|
+
).env("BIGCOMMERCE_ACCESS_TOKEN")
|
|
756
|
+
).addOption(
|
|
757
|
+
new Option3("--api-host <host>", "BigCommerce API host. The default is api.bigcommerce.com.").env("BIGCOMMERCE_API_HOST").default("api.bigcommerce.com")
|
|
758
|
+
).option(
|
|
759
|
+
"--root-dir <path>",
|
|
760
|
+
"Path to the root directory of your Catalyst project (default: current working directory).",
|
|
761
|
+
process.cwd()
|
|
762
|
+
).action(async (options) => {
|
|
763
|
+
try {
|
|
764
|
+
if (!options.storeHash || !options.accessToken) {
|
|
765
|
+
consola.error("Insufficient information to create a project.");
|
|
766
|
+
consola.info(
|
|
767
|
+
"Provide both --store-hash and --access-token (or set BIGCOMMERCE_STORE_HASH and BIGCOMMERCE_ACCESS_TOKEN)."
|
|
768
|
+
);
|
|
769
|
+
process.exit(1);
|
|
770
|
+
return;
|
|
771
|
+
}
|
|
772
|
+
await telemetry2.identify(options.storeHash);
|
|
773
|
+
const newProjectName = await consola.prompt("Enter a name for the new project:", {
|
|
774
|
+
type: "text"
|
|
775
|
+
});
|
|
776
|
+
const data = await createProject(
|
|
777
|
+
newProjectName,
|
|
778
|
+
options.storeHash,
|
|
779
|
+
options.accessToken,
|
|
780
|
+
options.apiHost
|
|
781
|
+
);
|
|
782
|
+
consola.success(`Project "${data.name}" created successfully.`);
|
|
783
|
+
const config2 = getProjectConfig(options.rootDir);
|
|
784
|
+
consola.start("Writing project UUID to .bigcommerce/project.json...");
|
|
785
|
+
config2.set("projectUuid", data.uuid);
|
|
786
|
+
config2.set("framework", "catalyst");
|
|
787
|
+
consola.success("Project UUID written to .bigcommerce/project.json.");
|
|
788
|
+
process.exit(0);
|
|
789
|
+
} catch (error) {
|
|
790
|
+
consola.error(error instanceof Error ? error.message : error);
|
|
791
|
+
process.exit(1);
|
|
792
|
+
}
|
|
793
|
+
});
|
|
699
794
|
var link = new Command4("link").description(
|
|
700
795
|
"Link your local Catalyst project to a BigCommerce infrastructure project. You can provide a project UUID directly, or fetch and select from available projects using your store credentials."
|
|
701
796
|
).addOption(
|
|
@@ -740,10 +835,10 @@ var link = new Command4("link").description(
|
|
|
740
835
|
);
|
|
741
836
|
consola.success("Projects fetched.");
|
|
742
837
|
const promptOptions = [
|
|
743
|
-
...projects.map((
|
|
744
|
-
label:
|
|
745
|
-
value:
|
|
746
|
-
hint:
|
|
838
|
+
...projects.map((proj) => ({
|
|
839
|
+
label: proj.name,
|
|
840
|
+
value: proj.uuid,
|
|
841
|
+
hint: proj.uuid
|
|
747
842
|
})),
|
|
748
843
|
{
|
|
749
844
|
label: "Create a new project",
|
|
@@ -784,6 +879,7 @@ var link = new Command4("link").description(
|
|
|
784
879
|
process.exit(1);
|
|
785
880
|
}
|
|
786
881
|
});
|
|
882
|
+
var project = new Command4("project").description("Manage your BigCommerce infrastructure project.").addCommand(create).addCommand(list).addCommand(link);
|
|
787
883
|
|
|
788
884
|
// src/cli/commands/start.ts
|
|
789
885
|
import { Command as Command5, Option as Option4 } from "commander";
|
|
@@ -923,7 +1019,7 @@ config({
|
|
|
923
1019
|
});
|
|
924
1020
|
consola.log(colorize2("cyanBright", `\u25E2 ${package_default.name} v${package_default.version}
|
|
925
1021
|
`));
|
|
926
|
-
program.name(package_default.name).version(package_default.version).description("CLI tool for Catalyst development").addCommand(version).addCommand(dev).addCommand(start).addCommand(build).addCommand(deploy).addCommand(
|
|
1022
|
+
program.name(package_default.name).version(package_default.version).description("CLI tool for Catalyst development").addCommand(version).addCommand(dev).addCommand(start).addCommand(build).addCommand(deploy).addCommand(project).addCommand(telemetry3).hook("preAction", telemetryPreHook).hook("postAction", telemetryPostHook);
|
|
927
1023
|
|
|
928
1024
|
// src/cli/index.ts
|
|
929
1025
|
program.parse(process.argv);
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cli/program.ts","../package.json","../src/cli/commands/build.ts","../src/cli/lib/get-module-cli-path.ts","../src/cli/lib/logger.ts","../src/cli/lib/project-config.ts","../src/cli/lib/wrangler-config.ts","../src/cli/commands/deploy.ts","../src/cli/lib/telemetry.ts","../src/cli/commands/dev.ts","../src/cli/commands/link.ts","../src/cli/commands/start.ts","../src/cli/commands/telemetry.ts","../src/cli/commands/version.ts","../src/cli/hooks/telemetry.ts","../src/cli/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { colorize } from 'consola/utils';\nimport { config } from 'dotenv';\nimport { resolve } from 'node:path';\n\nimport PACKAGE_INFO from '../../package.json';\n\nimport { build } from './commands/build';\nimport { deploy } from './commands/deploy';\nimport { dev } from './commands/dev';\nimport { link } from './commands/link';\nimport { start } from './commands/start';\nimport { telemetry } from './commands/telemetry';\nimport { version } from './commands/version';\nimport { telemetryPostHook, telemetryPreHook } from './hooks/telemetry';\nimport { consola } from './lib/logger';\n\nexport const program = new Command();\n\nconfig({\n path: [\n resolve(process.cwd(), '.env'),\n resolve(process.cwd(), '.env.local'),\n // Assumes the parent directory is the monorepo root:\n resolve(process.cwd(), '..', '.env'),\n resolve(process.cwd(), '..', '.env.local'),\n ],\n});\n\nconsola.log(colorize('cyanBright', `◢ ${PACKAGE_INFO.name} v${PACKAGE_INFO.version}\\n`));\n\nprogram\n .name(PACKAGE_INFO.name)\n .version(PACKAGE_INFO.version)\n .description('CLI tool for Catalyst development')\n .addCommand(version)\n .addCommand(dev)\n .addCommand(start)\n .addCommand(build)\n .addCommand(deploy)\n .addCommand(link)\n .addCommand(telemetry)\n .hook('preAction', telemetryPreHook)\n .hook('postAction', telemetryPostHook);\n","{\n \"name\": \"@bigcommerce/catalyst\",\n \"version\": \"1.0.0-alpha.0\",\n \"type\": \"module\",\n \"bin\": {\n \"catalyst\": \"dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"templates\"\n ],\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint . --max-warnings 0\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"build\": \"tsup\"\n },\n \"engines\": {\n \"node\": \"^20.0.0 || ^22.0.0\"\n },\n \"dependencies\": {\n \"@segment/analytics-node\": \"^2.2.1\",\n \"adm-zip\": \"^0.5.16\",\n \"commander\": \"^14.0.0\",\n \"conf\": \"^13.1.0\",\n \"consola\": \"^3.4.2\",\n \"dotenv\": \"^16.5.0\",\n \"execa\": \"^9.6.0\",\n \"yocto-spinner\": \"^1.0.0\",\n \"zod\": \"^4.0.5\"\n },\n \"devDependencies\": {\n \"@bigcommerce/eslint-config\": \"^2.11.0\",\n \"@bigcommerce/eslint-config-catalyst\": \"workspace:^\",\n \"@commander-js/extra-typings\": \"^14.0.0\",\n \"@types/adm-zip\": \"^0.5.7\",\n \"@types/node\": \"^22.15.30\",\n \"@vitest/coverage-v8\": \"^3.2.4\",\n \"@vitest/ui\": \"^3.2.4\",\n \"eslint\": \"^8.57.1\",\n \"msw\": \"^2.9.0\",\n \"prettier\": \"^3.6.2\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n },\n \"peerDependencies\": {\n \"@opennextjs/cloudflare\": \"^1.8.0\"\n }\n}\n","import { Command, Option } from 'commander';\nimport { execa } from 'execa';\nimport { existsSync } from 'node:fs';\nimport { copyFile, cp, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getModuleCliPath } from '../lib/get-module-cli-path';\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\nimport { getWranglerConfig } from '../lib/wrangler-config';\n\nconst WRANGLER_VERSION = '4.24.3';\n\nexport const build = new Command('build')\n .allowUnknownOption()\n // The unknown options end up in program.args, not in program.opts(). Commander does not take a guess at how to interpret the unknown options.\n .argument(\n '[next-build-options...]',\n 'Next.js `build` options (see: https://nextjs.org/docs/app/api-reference/cli/next#next-build-options)',\n )\n .addOption(\n new Option(\n '--project-uuid <uuid>',\n 'Project UUID to be included in the deployment configuration.',\n ).env('BIGCOMMERCE_PROJECT_UUID'),\n )\n .addOption(\n new Option('--framework <framework>', 'The framework to use for the build.').choices([\n 'nextjs',\n 'catalyst',\n ]),\n )\n .action(async (nextBuildOptions, options) => {\n const coreDir = process.cwd();\n\n try {\n const config = getProjectConfig();\n const framework = options.framework ?? config.get('framework');\n\n if (framework === 'nextjs') {\n const nextBin = join('node_modules', '.bin', 'next');\n\n if (!existsSync(nextBin)) {\n throw new Error(\n `Next.js is not installed in ${coreDir}. Are you in a valid Next.js project?`,\n );\n }\n\n await execa(nextBin, ['build', ...nextBuildOptions], {\n stdio: 'inherit',\n cwd: coreDir,\n });\n }\n\n if (framework === 'catalyst') {\n const openNextOutDir = join(coreDir, '.open-next');\n const bigcommerceDistDir = join(coreDir, '.bigcommerce', 'dist');\n\n const projectUuid = options.projectUuid ?? config.get('projectUuid');\n\n if (!projectUuid) {\n throw new Error(\n 'Project UUID is required. Please run `link` or provide `--project-uuid`',\n );\n }\n\n const wranglerConfig = getWranglerConfig(projectUuid, 'PLACEHOLDER_KV_ID');\n\n consola.start('Copying templates...');\n\n await copyFile(\n join(getModuleCliPath(), 'templates', 'open-next.config.ts'),\n join(coreDir, '.bigcommerce', 'open-next.config.ts'),\n );\n await writeFile(\n join(coreDir, '.bigcommerce', 'wrangler.jsonc'),\n JSON.stringify(wranglerConfig, null, 2),\n );\n\n consola.success('Templates copied');\n\n consola.start('Building project...');\n\n await execa(\n 'pnpm',\n [\n 'exec',\n 'opennextjs-cloudflare',\n 'build',\n '--skipWranglerConfigCheck',\n '--openNextConfigPath',\n join(coreDir, '.bigcommerce', 'open-next.config.ts'),\n ],\n {\n stdout: ['pipe', 'inherit'],\n cwd: coreDir,\n },\n );\n\n await execa(\n 'pnpm',\n [\n 'dlx',\n `wrangler@${WRANGLER_VERSION}`,\n 'deploy',\n '--config',\n join(coreDir, '.bigcommerce', 'wrangler.jsonc'),\n '--keep-vars',\n '--outdir',\n bigcommerceDistDir,\n '--dry-run',\n ],\n {\n stdout: ['pipe', 'inherit'],\n cwd: coreDir,\n },\n );\n\n consola.success('Project built');\n\n await cp(join(openNextOutDir, 'assets'), join(bigcommerceDistDir, 'assets'), {\n recursive: true,\n force: true,\n });\n }\n } catch (error) {\n consola.error(error);\n process.exit(1);\n }\n });\n","/* eslint-disable no-underscore-dangle */\n\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getModuleCliPath() {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n return join(__dirname, '..');\n}\n","import { createConsola } from 'consola';\n\nexport const consola = createConsola({\n level: process.env.CONSOLA_LEVEL ? parseInt(process.env.CONSOLA_LEVEL, 10) : 3,\n});\n","import Conf from 'conf';\nimport { join } from 'path';\n\nexport interface ProjectConfigSchema {\n projectUuid: string;\n framework: 'catalyst' | 'nextjs';\n telemetry: {\n enabled: boolean;\n anonymousId: string;\n };\n}\n\nexport function getProjectConfig(rootDir = process.cwd()) {\n return new Conf<ProjectConfigSchema>({\n cwd: join(rootDir, '.bigcommerce'),\n projectSuffix: '',\n configName: 'project',\n schema: {\n projectUuid: { type: 'string', format: 'uuid' },\n framework: {\n type: 'string',\n enum: ['catalyst', 'nextjs'],\n default: 'nextjs',\n },\n telemetry: {\n type: 'object',\n properties: {\n enabled: { type: 'boolean' },\n anonymousId: { type: 'string' },\n },\n },\n },\n });\n}\n","export function getWranglerConfig(projectUuid: string, kvNamespaceId: string) {\n return {\n $schema: 'node_modules/wrangler/config-schema.json',\n main: '../.open-next/worker.js',\n name: `project-${projectUuid}`,\n compatibility_date: '2025-07-15',\n compatibility_flags: ['nodejs_compat', 'global_fetch_strictly_public'],\n observability: {\n enabled: true,\n head_sampling_rate: 0.05,\n logs: {\n enabled: true,\n head_sampling_rate: 1,\n invocation_logs: false,\n },\n },\n assets: {\n directory: '../.open-next/assets',\n binding: 'ASSETS',\n },\n services: [\n {\n binding: 'WORKER_SELF_REFERENCE',\n service: `project-${projectUuid}`,\n },\n ],\n kv_namespaces: [\n {\n binding: 'NEXT_INC_CACHE_KV',\n id: kvNamespaceId,\n },\n ],\n durable_objects: {\n bindings: [\n {\n name: 'NEXT_CACHE_DO_QUEUE',\n class_name: 'DOQueueHandler',\n },\n {\n name: 'NEXT_TAG_CACHE_DO_SHARDED',\n class_name: 'DOShardedTagCache',\n },\n {\n name: 'NEXT_CACHE_DO_PURGE',\n class_name: 'BucketCachePurge',\n },\n ],\n },\n migrations: [\n {\n tag: 'v1',\n new_sqlite_classes: ['DOQueueHandler', 'DOShardedTagCache', 'BucketCachePurge'],\n },\n ],\n };\n}\n","import AdmZip from 'adm-zip';\nimport { Command, Option } from 'commander';\nimport { access, readdir, readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport yoctoSpinner from 'yocto-spinner';\nimport { z } from 'zod';\n\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\nimport { Telemetry } from '../lib/telemetry';\n\nconst telemetry = new Telemetry();\n\nconst stepsEnum = z.enum([\n 'initializing',\n 'downloading',\n 'unzipping',\n 'processing',\n 'deploying',\n 'finalizing',\n 'complete',\n]);\n\nconst STEPS: Record<z.infer<typeof stepsEnum>, string> = {\n initializing: 'Initializing...',\n downloading: 'Downloading...',\n unzipping: 'Unzipping...',\n processing: 'Processing...',\n deploying: 'Deploying...',\n finalizing: 'Finalizing...',\n complete: 'Complete',\n};\n\nconst UploadSignatureSchema = z.object({\n data: z.object({\n upload_url: z.url(),\n upload_uuid: z.string(),\n }),\n});\n\nconst CreateDeploymentSchema = z.object({\n data: z.object({\n deployment_uuid: z.uuid(),\n }),\n});\n\nconst DeploymentStatusSchema = z.object({\n deployment_uuid: z.uuid(),\n deployment_status: z.enum(['queued', 'in_progress', 'failed', 'completed']),\n event: z\n .object({\n step: stepsEnum,\n progress: z.number(),\n })\n .nullable(),\n error: z\n .object({\n code: z.number(),\n })\n .optional(),\n});\n\nexport const generateBundleZip = async () => {\n consola.info('Generating bundle...');\n\n const bigcommerceDir = join(process.cwd(), '.bigcommerce');\n const distDir = join(process.cwd(), '.bigcommerce', 'dist');\n\n // Check if .bigcommerce/dist exists\n try {\n await access(distDir);\n } catch {\n throw new Error(`Dist directory not found: ${distDir}`);\n }\n\n // Check if .bigcommerce/dist is not empty\n const buildDirContents = await readdir(distDir);\n\n if (buildDirContents.length === 0) {\n throw new Error(`Dist directory is empty: ${distDir}`);\n }\n\n const outputZip = join(bigcommerceDir, 'bundle.zip');\n\n // Use AdmZip to create the zip\n const zip = new AdmZip();\n\n zip.addLocalFolder(distDir, 'output');\n zip.writeZip(outputZip);\n\n consola.success(`Bundle created at: ${outputZip}`);\n};\n\nexport const generateUploadSignature = async (\n storeHash: string,\n accessToken: string,\n apiHost: string,\n) => {\n consola.info('Generating upload signature...');\n\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/deployments/uploads`,\n {\n method: 'POST',\n headers: {\n 'X-Auth-Token': accessToken,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify({}),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch upload signature: ${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const { data } = UploadSignatureSchema.parse(res);\n\n consola.success('Upload signature generated.');\n\n return data;\n};\n\nexport const uploadBundleZip = async (uploadUrl: string) => {\n consola.info('Uploading bundle...');\n\n const zipPath = join(process.cwd(), '.bigcommerce', 'bundle.zip');\n\n // Read the zip file as a buffer\n const fileBuffer = await readFile(zipPath);\n\n const response = await fetch(uploadUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/zip',\n },\n body: fileBuffer,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to upload bundle: ${response.status} ${response.statusText}`);\n }\n\n consola.success('Bundle uploaded successfully.');\n\n return true;\n};\n\nexport const parseEnvironmentVariables = (secretOption?: string[]) => {\n return secretOption?.map((envVar) => {\n const [key, value] = envVar.split('=');\n\n if (!key || !value) {\n throw new Error(`Invalid secret format: ${envVar}. Expected format: KEY=VALUE`);\n }\n\n return {\n type: 'secret' as const,\n key: key.trim(),\n value: value.trim(),\n };\n });\n};\n\nexport const createDeployment = async (\n projectUuid: string,\n uploadUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n environmentVariables?: Array<{ type: 'secret' | 'plain_text'; key: string; value: string }>,\n) => {\n consola.info('Creating deployment...');\n\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/deployments`,\n {\n method: 'POST',\n headers: {\n 'X-Auth-Token': accessToken,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify({\n project_uuid: projectUuid,\n upload_uuid: uploadUuid,\n environment_variables: environmentVariables,\n }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to create deployment: ${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const { data } = CreateDeploymentSchema.parse(res);\n\n consola.success('Deployment started...');\n\n return data;\n};\n\nexport const getDeploymentStatus = async (\n deploymentUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n) => {\n consola.info('Fetching deployment status...');\n\n const spinner = yoctoSpinner().start('Fetching...');\n\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/deployments/${deploymentUuid}/events`,\n {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n Accept: 'text/event-stream',\n Connection: 'keep-alive',\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to open event stream: ${response.status} ${response.statusText}`);\n }\n\n const reader = response.body?.getReader();\n\n if (!reader) {\n throw new Error('Failed to read event stream.');\n }\n\n const decoder = new TextDecoder();\n let done = false;\n\n while (!done) {\n // eslint-disable-next-line no-await-in-loop\n const { value, done: streamDone } = await reader.read();\n let json: unknown;\n\n if (value) {\n const chunk = decoder.decode(value, { stream: true }).trim();\n const split = chunk\n .split('\\n\\n')\n .map((s) => s.replace('data:', '').trim())\n .filter(Boolean);\n\n split.forEach((event) => {\n try {\n json = JSON.parse(event);\n } catch (error) {\n consola.warn(`Failed to parse event, dropping from stream. Event: ${event}`, error);\n\n return;\n }\n\n const data = DeploymentStatusSchema.parse(json);\n\n if (data.error) {\n throw new Error(`Deployment failed with error code: ${data.error.code}`);\n }\n\n if (data.event && STEPS[data.event.step] !== spinner.text) {\n spinner.text = STEPS[data.event.step];\n }\n });\n }\n\n done = streamDone;\n }\n\n spinner.success('Deployment completed successfully.');\n};\n\nexport const deploy = new Command('deploy')\n .description('Deploy your application to Cloudflare.')\n .addOption(\n new Option(\n '--store-hash <hash>',\n 'BigCommerce store hash. Can be found in the URL of your store Control Panel.',\n )\n .env('BIGCOMMERCE_STORE_HASH')\n .makeOptionMandatory(),\n )\n .addOption(\n new Option(\n '--access-token <token>',\n 'BigCommerce access token. Can be found after creating a store-level API account.',\n )\n .env('BIGCOMMERCE_ACCESS_TOKEN')\n .makeOptionMandatory(),\n )\n .addOption(\n new Option('--api-host <host>', 'BigCommerce API host. The default is api.bigcommerce.com.')\n .env('BIGCOMMERCE_API_HOST')\n .default('api.bigcommerce.com'),\n )\n .addOption(\n new Option(\n '--project-uuid <uuid>',\n 'BigCommerce intrastructure project UUID. Can be found via the BigCommerce API (GET /v3/infrastructure/projects).',\n ).env('BIGCOMMERCE_PROJECT_UUID'),\n )\n .addOption(\n new Option(\n '--secret <secrets...>',\n 'Secrets to set for the deployment. Format: SECRET_1=FOO SECRET_2=BAR',\n ),\n )\n .option('--dry-run', 'Run the command to generate the bundle without uploading or deploying.')\n\n .action(async (options) => {\n try {\n const config = getProjectConfig();\n\n await telemetry.identify(options.storeHash);\n\n const projectUuid = options.projectUuid ?? config.get('projectUuid');\n\n if (!projectUuid) {\n throw new Error(\n 'Project UUID is required. Please run either `bigcommerce link` or this command again with --project-uuid <uuid>.',\n );\n }\n\n await generateBundleZip();\n\n if (options.dryRun) {\n consola.info('Dry run enabled — skipping upload and deployment steps.');\n consola.info('Next steps (skipped):');\n consola.info('- Generate upload signature');\n consola.info('- Upload bundle.zip');\n consola.info('- Create deployment');\n\n process.exit(0);\n }\n\n const uploadSignature = await generateUploadSignature(\n options.storeHash,\n options.accessToken,\n options.apiHost,\n );\n\n await uploadBundleZip(uploadSignature.upload_url);\n\n const environmentVariables = parseEnvironmentVariables(options.secret);\n\n const { deployment_uuid: deploymentUuid } = await createDeployment(\n projectUuid,\n uploadSignature.upload_uuid,\n options.storeHash,\n options.accessToken,\n options.apiHost,\n environmentVariables,\n );\n\n await getDeploymentStatus(\n deploymentUuid,\n options.storeHash,\n options.accessToken,\n options.apiHost,\n );\n } catch (error) {\n consola.error(error);\n process.exit(1);\n }\n });\n","import { Analytics } from '@segment/analytics-node';\nimport Conf from 'conf';\nimport { randomBytes } from 'node:crypto';\n\nimport PACKAGE_INFO from '../../../package.json';\n\nimport { getProjectConfig, ProjectConfigSchema } from './project-config';\n\nconst TELEMETRY_KEY_ENABLED = 'telemetry.enabled';\nconst TELEMETRY_KEY_ID = `telemetry.anonymousId`;\n\nexport class Telemetry {\n readonly sessionId: string;\n readonly analytics: Analytics;\n\n private projectConfig: Conf<ProjectConfigSchema>;\n private CATALYST_TELEMETRY_DISABLED: string | undefined;\n\n private readonly projectName = 'catalyst-cli';\n private readonly projectVersion = PACKAGE_INFO.version;\n\n constructor() {\n this.CATALYST_TELEMETRY_DISABLED = process.env.CATALYST_TELEMETRY_DISABLED;\n\n this.projectConfig = getProjectConfig();\n\n this.sessionId = randomBytes(32).toString('hex');\n this.analytics = new Analytics({\n writeKey: process.env.CLI_SEGMENT_WRITE_KEY ?? 'not-a-valid-segment-write-key',\n });\n }\n\n async track(eventName: string, payload: Record<string, unknown>) {\n if (!this.isEnabled()) {\n return Promise.resolve(undefined);\n }\n\n this.analytics.track({\n event: eventName,\n anonymousId: this.getAnonymousId(),\n properties: {\n ...payload,\n sessionId: this.sessionId,\n },\n context: {\n app: {\n name: this.projectName,\n version: this.projectVersion,\n },\n },\n });\n }\n\n async identify(storeHash?: string) {\n if (!this.isEnabled()) {\n return Promise.resolve(undefined);\n }\n\n if (!storeHash) {\n return Promise.resolve(undefined);\n }\n\n this.analytics.identify({\n userId: storeHash,\n anonymousId: this.getAnonymousId(),\n context: {\n app: {\n name: this.projectName,\n version: this.projectVersion,\n },\n },\n });\n }\n\n setEnabled = (_enabled: boolean) => {\n const enabled = Boolean(_enabled);\n\n this.projectConfig.set('telemetry.enabled', enabled);\n };\n\n isEnabled() {\n return (\n !this.CATALYST_TELEMETRY_DISABLED &&\n this.projectConfig.get<typeof TELEMETRY_KEY_ENABLED, boolean>(TELEMETRY_KEY_ENABLED, true)\n );\n }\n\n private getAnonymousId(): string {\n const val = this.projectConfig.get<typeof TELEMETRY_KEY_ID, string>(TELEMETRY_KEY_ID);\n\n if (val) {\n return val;\n }\n\n const generated = randomBytes(32).toString('hex');\n\n this.projectConfig.set(TELEMETRY_KEY_ID, generated);\n\n return generated;\n }\n}\n","import { Command } from 'commander';\nimport { execa } from 'execa';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { consola } from '../lib/logger';\n\nexport const dev = new Command('dev')\n .description('Start the Catalyst development server.')\n // Proxy `--help` to the underlying `next dev` command\n .helpOption(false)\n .allowUnknownOption(true)\n // The unknown options end up in program.args, not in program.opts(). Commander does not take a guess at how to interpret the unknown options.\n .argument(\n '[options...]',\n 'Next.js `dev` options (see: https://nextjs.org/docs/app/api-reference/cli/next#next-dev-options)',\n )\n .action(async (options) => {\n try {\n const nextBin = join('node_modules', '.bin', 'next');\n\n if (!existsSync(nextBin)) {\n throw new Error(\n `Next.js is not installed in ${process.cwd()}. Are you in a valid Next.js project?`,\n );\n }\n\n await execa(nextBin, ['dev', ...options], {\n stdio: 'inherit',\n cwd: process.cwd(),\n });\n } catch (error) {\n consola.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n","import { Command, Option } from 'commander';\nimport { z } from 'zod';\n\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\nimport { Telemetry } from '../lib/telemetry';\n\nconst telemetry = new Telemetry();\n\nconst fetchProjectsSchema = z.object({\n data: z.array(\n z.object({\n uuid: z.string(),\n name: z.string(),\n }),\n ),\n});\n\nconst createProjectSchema = z.object({\n data: z.object({\n uuid: z.string(),\n name: z.string(),\n date_created: z.coerce.date(),\n date_modified: z.coerce.date(),\n }),\n});\n\nasync function fetchProjects(storeHash: string, accessToken: string, apiHost: string) {\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/projects`,\n {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n },\n },\n );\n\n if (response.status === 403) {\n throw new Error(\n 'Infrastructure Projects API not enabled. If you are part of the alpha, contact support@bigcommerce.com to enable it.',\n );\n }\n\n if (!response.ok) {\n throw new Error(`Failed to fetch projects: ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n\n const { data } = fetchProjectsSchema.parse(res);\n\n return data;\n}\n\nasync function createProject(\n name: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n) {\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/projects`,\n {\n method: 'POST',\n headers: {\n 'X-Auth-Token': accessToken,\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ name }),\n },\n );\n\n if (response.status === 502) {\n throw new Error('Failed to create project, is the name already in use?');\n }\n\n if (response.status === 403) {\n throw new Error(\n 'Infrastructure Projects API not enabled. If you are part of the alpha, contact support@bigcommerce.com to enable it.',\n );\n }\n\n if (!response.ok) {\n throw new Error(`Failed to create project: ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n\n const { data } = createProjectSchema.parse(res);\n\n return data;\n}\n\nexport const link = new Command('link')\n .description(\n 'Link your local Catalyst project to a BigCommerce infrastructure project. You can provide a project UUID directly, or fetch and select from available projects using your store credentials.',\n )\n .addOption(\n new Option(\n '--store-hash <hash>',\n 'BigCommerce store hash. Can be found in the URL of your store Control Panel.',\n ).env('BIGCOMMERCE_STORE_HASH'),\n )\n .addOption(\n new Option(\n '--access-token <token>',\n 'BigCommerce access token. Can be found after creating a store-level API account.',\n ).env('BIGCOMMERCE_ACCESS_TOKEN'),\n )\n .addOption(\n new Option('--api-host <host>', 'BigCommerce API host. The default is api.bigcommerce.com.')\n .env('BIGCOMMERCE_API_HOST')\n .default('api.bigcommerce.com'),\n )\n .option(\n '--project-uuid <uuid>',\n 'BigCommerce infrastructure project UUID. Can be found via the BigCommerce API (GET /v3/infrastructure/projects). Use this to link directly without fetching projects.',\n )\n .option(\n '--root-dir <path>',\n 'Path to the root directory of your Catalyst project (default: current working directory).',\n process.cwd(),\n )\n .action(async (options) => {\n try {\n const config = getProjectConfig(options.rootDir);\n\n const writeProjectConfig = (uuid: string) => {\n consola.start('Writing project UUID to .bigcommerce/project.json...');\n config.set('projectUuid', uuid);\n config.set('framework', 'catalyst');\n consola.success('Project UUID written to .bigcommerce/project.json.');\n };\n\n if (options.projectUuid) {\n writeProjectConfig(options.projectUuid);\n\n process.exit(0);\n }\n\n if (options.storeHash && options.accessToken) {\n await telemetry.identify(options.storeHash);\n\n consola.start('Fetching projects...');\n\n const projects = await fetchProjects(\n options.storeHash,\n options.accessToken,\n options.apiHost,\n );\n\n consola.success('Projects fetched.');\n\n const promptOptions = [\n ...projects.map((project) => ({\n label: project.name,\n value: project.uuid,\n hint: project.uuid,\n })),\n {\n label: 'Create a new project',\n value: 'create',\n hint: 'Create a new infrastructure project for this BigCommerce store.',\n },\n ];\n\n let projectUuid = await consola.prompt(\n 'Select a project or create a new project (Press <enter> to select).',\n {\n type: 'select',\n options: promptOptions,\n cancel: 'reject',\n },\n );\n\n if (projectUuid === 'create') {\n const newProjectName = await consola.prompt('Enter a name for the new project:', {\n type: 'text',\n });\n\n const data = await createProject(\n newProjectName,\n options.storeHash,\n options.accessToken,\n options.apiHost,\n );\n\n projectUuid = data.uuid;\n\n consola.success(`Project \"${data.name}\" created successfully.`);\n }\n\n writeProjectConfig(projectUuid);\n\n process.exit(0);\n }\n\n consola.error('Insufficient information to link a project.');\n consola.info('Provide a project UUID with --project-uuid, or');\n consola.info('Provide both --store-hash and --access-token to fetch and select a project.');\n process.exit(1);\n } catch (error) {\n consola.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n","import { Command, Option } from 'commander';\nimport { execa } from 'execa';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\n\nexport const start = new Command('start')\n .description('Start your Catalyst storefront in optimized production mode.')\n .allowUnknownOption(true)\n // The unknown options end up in program.args, not in program.opts(). Commander does not take a guess at how to interpret the unknown options.\n .argument(\n '[start-options...]',\n 'Pass additional options to the start command. If framework is Next.js, see https://nextjs.org/docs/api-reference/cli#start for available options.',\n )\n .addOption(\n new Option('--framework <framework>', 'The framework to use for the preview').choices([\n 'catalyst',\n 'nextjs',\n ]),\n )\n .action(async (startOptions, options) => {\n try {\n const config = getProjectConfig();\n const framework = options.framework ?? config.get('framework');\n\n if (framework === 'nextjs') {\n const nextBin = join('node_modules', '.bin', 'next');\n\n if (!existsSync(nextBin)) {\n throw new Error(\n `Next.js is not installed in ${process.cwd()}. Are you in a valid Next.js project?`,\n );\n }\n\n await execa(nextBin, ['start', ...startOptions], {\n stdio: 'inherit',\n cwd: process.cwd(),\n });\n }\n\n await execa(\n 'pnpm',\n [\n 'exec',\n 'opennextjs-cloudflare',\n 'preview',\n '--config',\n join('.bigcommerce', 'wrangler.jsonc'),\n ...startOptions,\n ],\n {\n stdio: 'inherit',\n cwd: process.cwd(),\n },\n );\n } catch (error) {\n consola.error(error instanceof Error ? error.message : error);\n }\n });\n","import { Argument, Command, Option } from 'commander';\nimport { colorize } from 'consola/utils';\n\nimport { consola } from '../lib/logger';\nimport { Telemetry } from '../lib/telemetry';\n\nconst telemetryService = new Telemetry();\nlet isEnabled = telemetryService.isEnabled();\n\nexport const telemetry = new Command('telemetry')\n .addArgument(new Argument('[arg]').choices(['disable', 'enable', 'status']))\n .addOption(new Option('--enable', `Enables CLI telemetry collection.`).conflicts('disable'))\n .option('--disable', `Disables CLI telemetry collection.`)\n .action((arg, options) => {\n if (options.enable || arg === 'enable') {\n telemetryService.setEnabled(true);\n isEnabled = true;\n\n consola.success('Success!\\n');\n } else if (options.disable || arg === 'disable') {\n telemetryService.setEnabled(false);\n\n if (isEnabled) {\n consola.success('Your preference has been saved to .bigcommerce/project.json');\n } else {\n consola.info(`Catalyst CLI telemetry collection is already disabled.`);\n }\n\n isEnabled = false;\n } else {\n consola.info('Catalyst CLI Telemetry\\n');\n }\n\n consola.info(\n `Status: ${colorize('bold', isEnabled ? colorize('green', 'Enabled') : colorize('red', 'Disabled'))}`,\n );\n\n if (!isEnabled) {\n consola.info(\n `You have opted-out of Catalyst CLI telemetry. No data will be collected from your machine.`,\n );\n }\n });\n","import { Command } from 'commander';\n\nimport PACKAGE_INFO from '../../../package.json';\nimport { consola } from '../lib/logger';\n\nexport const version = new Command('version')\n .description('Display detailed version information.')\n .action(() => {\n consola.log('Version Information:');\n consola.log(`CLI Version: ${PACKAGE_INFO.version}`);\n consola.log(`Node Version: ${process.version}`);\n consola.log(`Platform: ${process.platform} (${process.arch})`);\n });\n","import { Command } from '@commander-js/extra-typings';\n\nimport { Telemetry } from '../lib/telemetry';\n\nconst telemetry = new Telemetry();\n\nconst allowlistArguments = ['--keep-temp-dir', '--api-host', '--project-uuid'];\n\nfunction parseArguments(args: string[]) {\n return args.reduce<Record<string, string>>((result, arg, index, array) => {\n if (arg.includes('=')) {\n const [key, value] = arg.split('=');\n\n if (allowlistArguments.includes(key)) {\n return {\n ...result,\n [key]: value,\n };\n }\n }\n\n if (allowlistArguments.includes(arg)) {\n const nextValue =\n array[index + 1] && !array[index + 1].startsWith('--') ? array[index + 1] : null;\n\n if (nextValue && !nextValue.includes('--')) {\n return {\n ...result,\n [arg]: nextValue,\n };\n }\n }\n\n return result;\n }, {});\n}\n\nexport const telemetryPreHook = async (command: Command) => {\n const [commandName, ...args] = command.args;\n\n // Return the await to get a proper stack trace.\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n return await telemetry.track(commandName, {\n ...parseArguments(args),\n });\n};\n\nexport const telemetryPostHook = async () => {\n await telemetry.analytics.closeAndFlush();\n};\n","#!/usr/bin/env node\nimport { program } from './program';\n\nprogram.parse(process.argv);\n"],"mappings":"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","names":["Command","colorize","join","join","config","join","Command","Option","join","join","Command","Option","config","Command","execa","existsSync","join","Command","join","existsSync","execa","Command","Option","z","telemetry","z","Command","Option","config","Command","Option","execa","existsSync","join","Command","Option","config","join","existsSync","execa","Command","Option","telemetry","Command","Option","Command","Command","telemetry","Command","colorize","telemetry"]}
|
|
1
|
+
{"version":3,"sources":["../src/cli/program.ts","../package.json","../src/cli/commands/build.ts","../src/cli/lib/get-module-cli-path.ts","../src/cli/lib/logger.ts","../src/cli/lib/project-config.ts","../src/cli/lib/wrangler-config.ts","../src/cli/commands/deploy.ts","../src/cli/lib/telemetry.ts","../src/cli/commands/dev.ts","../src/cli/commands/project.ts","../src/cli/lib/project.ts","../src/cli/commands/start.ts","../src/cli/commands/telemetry.ts","../src/cli/commands/version.ts","../src/cli/hooks/telemetry.ts","../src/cli/index.ts"],"sourcesContent":["import { Command } from 'commander';\nimport { colorize } from 'consola/utils';\nimport { config } from 'dotenv';\nimport { resolve } from 'node:path';\n\nimport PACKAGE_INFO from '../../package.json';\n\nimport { build } from './commands/build';\nimport { deploy } from './commands/deploy';\nimport { dev } from './commands/dev';\nimport { project } from './commands/project';\nimport { start } from './commands/start';\nimport { telemetry } from './commands/telemetry';\nimport { version } from './commands/version';\nimport { telemetryPostHook, telemetryPreHook } from './hooks/telemetry';\nimport { consola } from './lib/logger';\n\nexport const program = new Command();\n\nconfig({\n path: [\n resolve(process.cwd(), '.env'),\n resolve(process.cwd(), '.env.local'),\n // Assumes the parent directory is the monorepo root:\n resolve(process.cwd(), '..', '.env'),\n resolve(process.cwd(), '..', '.env.local'),\n ],\n});\n\nconsola.log(colorize('cyanBright', `◢ ${PACKAGE_INFO.name} v${PACKAGE_INFO.version}\\n`));\n\nprogram\n .name(PACKAGE_INFO.name)\n .version(PACKAGE_INFO.version)\n .description('CLI tool for Catalyst development')\n .addCommand(version)\n .addCommand(dev)\n .addCommand(start)\n .addCommand(build)\n .addCommand(deploy)\n .addCommand(project)\n .addCommand(telemetry)\n .hook('preAction', telemetryPreHook)\n .hook('postAction', telemetryPostHook);\n","{\n \"name\": \"@bigcommerce/catalyst\",\n \"version\": \"0.1.0\",\n \"type\": \"module\",\n \"bin\": {\n \"catalyst\": \"dist/cli.js\"\n },\n \"files\": [\n \"dist\",\n \"templates\"\n ],\n \"private\": true,\n \"scripts\": {\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"lint\": \"eslint . --max-warnings 0\",\n \"test\": \"vitest run\",\n \"test:watch\": \"vitest\",\n \"test:coverage\": \"vitest run --coverage\",\n \"build\": \"tsup\"\n },\n \"engines\": {\n \"node\": \"^20.0.0 || ^22.0.0 || ^24.0.0\"\n },\n \"dependencies\": {\n \"@segment/analytics-node\": \"^2.2.1\",\n \"adm-zip\": \"^0.5.16\",\n \"commander\": \"^14.0.0\",\n \"conf\": \"^13.1.0\",\n \"consola\": \"^3.4.2\",\n \"dotenv\": \"^16.5.0\",\n \"execa\": \"^9.6.0\",\n \"yocto-spinner\": \"^1.0.0\",\n \"zod\": \"^4.0.5\"\n },\n \"devDependencies\": {\n \"@bigcommerce/eslint-config\": \"^2.11.0\",\n \"@bigcommerce/eslint-config-catalyst\": \"workspace:^\",\n \"@commander-js/extra-typings\": \"^14.0.0\",\n \"@types/adm-zip\": \"^0.5.7\",\n \"@types/node\": \"^22.15.30\",\n \"@vitest/coverage-v8\": \"^3.2.4\",\n \"@vitest/ui\": \"^3.2.4\",\n \"eslint\": \"^8.57.1\",\n \"msw\": \"^2.9.0\",\n \"prettier\": \"^3.6.2\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"^5.8.3\",\n \"vitest\": \"^3.2.4\"\n },\n \"peerDependencies\": {\n \"@opennextjs/cloudflare\": \"^1.8.0\"\n }\n}\n","import { Command, Option } from 'commander';\nimport { execa } from 'execa';\nimport { existsSync } from 'node:fs';\nimport { copyFile, cp, writeFile } from 'node:fs/promises';\nimport { join } from 'node:path';\n\nimport { getModuleCliPath } from '../lib/get-module-cli-path';\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\nimport { getWranglerConfig } from '../lib/wrangler-config';\n\nconst WRANGLER_VERSION = '4.24.3';\n\nexport const build = new Command('build')\n .allowUnknownOption()\n // The unknown options end up in program.args, not in program.opts(). Commander does not take a guess at how to interpret the unknown options.\n .argument(\n '[next-build-options...]',\n 'Next.js `build` options (see: https://nextjs.org/docs/app/api-reference/cli/next#next-build-options)',\n )\n .addOption(\n new Option(\n '--project-uuid <uuid>',\n 'Project UUID to be included in the deployment configuration.',\n ).env('BIGCOMMERCE_PROJECT_UUID'),\n )\n .addOption(\n new Option('--framework <framework>', 'The framework to use for the build.').choices([\n 'nextjs',\n 'catalyst',\n ]),\n )\n .action(async (nextBuildOptions, options) => {\n const coreDir = process.cwd();\n\n try {\n const config = getProjectConfig();\n const framework = options.framework ?? config.get('framework');\n\n if (framework === 'nextjs') {\n const nextBin = join('node_modules', '.bin', 'next');\n\n if (!existsSync(nextBin)) {\n throw new Error(\n `Next.js is not installed in ${coreDir}. Are you in a valid Next.js project?`,\n );\n }\n\n await execa(nextBin, ['build', ...nextBuildOptions], {\n stdio: 'inherit',\n cwd: coreDir,\n });\n }\n\n if (framework === 'catalyst') {\n const openNextOutDir = join(coreDir, '.open-next');\n const bigcommerceDistDir = join(coreDir, '.bigcommerce', 'dist');\n\n const projectUuid = options.projectUuid ?? config.get('projectUuid');\n\n if (!projectUuid) {\n throw new Error(\n 'Project UUID is required. Please run `catalyst project create` or `catalyst project link` or this command again with --project-uuid <uuid>.',\n );\n }\n\n const wranglerConfig = getWranglerConfig(projectUuid, 'PLACEHOLDER_KV_ID');\n\n consola.start('Copying templates...');\n\n await copyFile(\n join(getModuleCliPath(), 'templates', 'open-next.config.ts'),\n join(coreDir, '.bigcommerce', 'open-next.config.ts'),\n );\n await writeFile(\n join(coreDir, '.bigcommerce', 'wrangler.jsonc'),\n JSON.stringify(wranglerConfig, null, 2),\n );\n\n consola.success('Templates copied');\n\n consola.start('Building project...');\n\n await execa(\n 'pnpm',\n [\n 'exec',\n 'opennextjs-cloudflare',\n 'build',\n '--skipWranglerConfigCheck',\n '--openNextConfigPath',\n join(coreDir, '.bigcommerce', 'open-next.config.ts'),\n ],\n {\n stdout: ['pipe', 'inherit'],\n cwd: coreDir,\n },\n );\n\n await execa(\n 'pnpm',\n [\n 'dlx',\n `wrangler@${WRANGLER_VERSION}`,\n 'deploy',\n '--config',\n join(coreDir, '.bigcommerce', 'wrangler.jsonc'),\n '--keep-vars',\n '--outdir',\n bigcommerceDistDir,\n '--dry-run',\n ],\n {\n stdout: ['pipe', 'inherit'],\n cwd: coreDir,\n },\n );\n\n consola.success('Project built');\n\n await cp(join(openNextOutDir, 'assets'), join(bigcommerceDistDir, 'assets'), {\n recursive: true,\n force: true,\n });\n }\n } catch (error) {\n consola.error(error);\n process.exit(1);\n }\n });\n","/* eslint-disable no-underscore-dangle */\n\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nexport function getModuleCliPath() {\n const __filename = fileURLToPath(import.meta.url);\n const __dirname = dirname(__filename);\n\n return join(__dirname, '..');\n}\n","import { createConsola } from 'consola';\n\nexport const consola = createConsola({\n level: process.env.CONSOLA_LEVEL ? parseInt(process.env.CONSOLA_LEVEL, 10) : 3,\n});\n","import Conf from 'conf';\nimport { join } from 'path';\n\nexport interface ProjectConfigSchema {\n projectUuid: string;\n framework: 'catalyst' | 'nextjs';\n telemetry: {\n enabled: boolean;\n anonymousId: string;\n };\n}\n\nexport function getProjectConfig(rootDir = process.cwd()) {\n return new Conf<ProjectConfigSchema>({\n cwd: join(rootDir, '.bigcommerce'),\n projectSuffix: '',\n configName: 'project',\n schema: {\n projectUuid: { type: 'string', format: 'uuid' },\n framework: {\n type: 'string',\n enum: ['catalyst', 'nextjs'],\n default: 'nextjs',\n },\n telemetry: {\n type: 'object',\n properties: {\n enabled: { type: 'boolean' },\n anonymousId: { type: 'string' },\n },\n },\n },\n });\n}\n","export function getWranglerConfig(projectUuid: string, kvNamespaceId: string) {\n return {\n $schema: 'node_modules/wrangler/config-schema.json',\n main: '../.open-next/worker.js',\n name: `project-${projectUuid}`,\n compatibility_date: '2025-07-15',\n compatibility_flags: ['nodejs_compat', 'global_fetch_strictly_public'],\n observability: {\n enabled: true,\n head_sampling_rate: 0.05,\n logs: {\n enabled: true,\n head_sampling_rate: 1,\n invocation_logs: false,\n },\n },\n assets: {\n directory: '../.open-next/assets',\n binding: 'ASSETS',\n },\n services: [\n {\n binding: 'WORKER_SELF_REFERENCE',\n service: `project-${projectUuid}`,\n },\n ],\n kv_namespaces: [\n {\n binding: 'NEXT_INC_CACHE_KV',\n id: kvNamespaceId,\n },\n ],\n durable_objects: {\n bindings: [\n {\n name: 'NEXT_CACHE_DO_QUEUE',\n class_name: 'DOQueueHandler',\n },\n {\n name: 'NEXT_TAG_CACHE_DO_SHARDED',\n class_name: 'DOShardedTagCache',\n },\n {\n name: 'NEXT_CACHE_DO_PURGE',\n class_name: 'BucketCachePurge',\n },\n ],\n },\n migrations: [\n {\n tag: 'v1',\n new_sqlite_classes: ['DOQueueHandler', 'DOShardedTagCache', 'BucketCachePurge'],\n },\n ],\n };\n}\n","import AdmZip from 'adm-zip';\nimport { Command, Option } from 'commander';\nimport { access, readdir, readFile } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport yoctoSpinner from 'yocto-spinner';\nimport { z } from 'zod';\n\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\nimport { Telemetry } from '../lib/telemetry';\n\nconst telemetry = new Telemetry();\n\nconst stepsEnum = z.enum([\n 'initializing',\n 'downloading',\n 'unzipping',\n 'processing',\n 'deploying',\n 'finalizing',\n 'complete',\n]);\n\nconst STEPS: Record<z.infer<typeof stepsEnum>, string> = {\n initializing: 'Initializing...',\n downloading: 'Downloading...',\n unzipping: 'Unzipping...',\n processing: 'Processing...',\n deploying: 'Deploying...',\n finalizing: 'Finalizing...',\n complete: 'Complete',\n};\n\nconst UploadSignatureSchema = z.object({\n data: z.object({\n upload_url: z.url(),\n upload_uuid: z.string(),\n }),\n});\n\nconst CreateDeploymentSchema = z.object({\n data: z.object({\n deployment_uuid: z.uuid(),\n }),\n});\n\nconst DeploymentStatusSchema = z.object({\n deployment_uuid: z.uuid(),\n deployment_status: z.enum(['queued', 'in_progress', 'failed', 'completed']),\n event: z\n .object({\n step: stepsEnum,\n progress: z.number(),\n })\n .nullable(),\n error: z\n .object({\n code: z.number(),\n })\n .optional(),\n});\n\nexport const generateBundleZip = async () => {\n consola.info('Generating bundle...');\n\n const bigcommerceDir = join(process.cwd(), '.bigcommerce');\n const distDir = join(process.cwd(), '.bigcommerce', 'dist');\n\n // Check if .bigcommerce/dist exists\n try {\n await access(distDir);\n } catch {\n throw new Error(`Dist directory not found: ${distDir}`);\n }\n\n // Check if .bigcommerce/dist is not empty\n const buildDirContents = await readdir(distDir);\n\n if (buildDirContents.length === 0) {\n throw new Error(`Dist directory is empty: ${distDir}`);\n }\n\n const outputZip = join(bigcommerceDir, 'bundle.zip');\n\n // Use AdmZip to create the zip\n const zip = new AdmZip();\n\n zip.addLocalFolder(distDir, 'output');\n zip.writeZip(outputZip);\n\n consola.success(`Bundle created at: ${outputZip}`);\n};\n\nexport const generateUploadSignature = async (\n storeHash: string,\n accessToken: string,\n apiHost: string,\n) => {\n consola.info('Generating upload signature...');\n\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/deployments/uploads`,\n {\n method: 'POST',\n headers: {\n 'X-Auth-Token': accessToken,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify({}),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to fetch upload signature: ${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const { data } = UploadSignatureSchema.parse(res);\n\n consola.success('Upload signature generated.');\n\n return data;\n};\n\nexport const uploadBundleZip = async (uploadUrl: string) => {\n consola.info('Uploading bundle...');\n\n const zipPath = join(process.cwd(), '.bigcommerce', 'bundle.zip');\n\n // Read the zip file as a buffer\n const fileBuffer = await readFile(zipPath);\n\n const response = await fetch(uploadUrl, {\n method: 'PUT',\n headers: {\n 'Content-Type': 'application/zip',\n },\n body: fileBuffer,\n });\n\n if (!response.ok) {\n throw new Error(`Failed to upload bundle: ${response.status} ${response.statusText}`);\n }\n\n consola.success('Bundle uploaded successfully.');\n\n return true;\n};\n\nexport const parseEnvironmentVariables = (secretOption?: string[]) => {\n return secretOption?.map((envVar) => {\n const [key, value] = envVar.split('=');\n\n if (!key || !value) {\n throw new Error(`Invalid secret format: ${envVar}. Expected format: KEY=VALUE`);\n }\n\n return {\n type: 'secret' as const,\n key: key.trim(),\n value: value.trim(),\n };\n });\n};\n\nexport const createDeployment = async (\n projectUuid: string,\n uploadUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n environmentVariables?: Array<{ type: 'secret' | 'plain_text'; key: string; value: string }>,\n) => {\n consola.info('Creating deployment...');\n\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/deployments`,\n {\n method: 'POST',\n headers: {\n 'X-Auth-Token': accessToken,\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n },\n body: JSON.stringify({\n project_uuid: projectUuid,\n upload_uuid: uploadUuid,\n environment_variables: environmentVariables,\n }),\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to create deployment: ${response.status} ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n const { data } = CreateDeploymentSchema.parse(res);\n\n consola.success('Deployment started...');\n\n return data;\n};\n\nexport const getDeploymentStatus = async (\n deploymentUuid: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n) => {\n consola.info('Fetching deployment status...');\n\n const spinner = yoctoSpinner().start('Fetching...');\n\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/deployments/${deploymentUuid}/events`,\n {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n Accept: 'text/event-stream',\n Connection: 'keep-alive',\n },\n },\n );\n\n if (!response.ok) {\n throw new Error(`Failed to open event stream: ${response.status} ${response.statusText}`);\n }\n\n const reader = response.body?.getReader();\n\n if (!reader) {\n throw new Error('Failed to read event stream.');\n }\n\n const decoder = new TextDecoder();\n let done = false;\n\n while (!done) {\n // eslint-disable-next-line no-await-in-loop\n const { value, done: streamDone } = await reader.read();\n let json: unknown;\n\n if (value) {\n const chunk = decoder.decode(value, { stream: true }).trim();\n const split = chunk\n .split('\\n\\n')\n .map((s) => s.replace('data:', '').trim())\n .filter(Boolean);\n\n split.forEach((event) => {\n try {\n json = JSON.parse(event);\n } catch (error) {\n consola.warn(`Failed to parse event, dropping from stream. Event: ${event}`, error);\n\n return;\n }\n\n const data = DeploymentStatusSchema.parse(json);\n\n if (data.error) {\n throw new Error(`Deployment failed with error code: ${data.error.code}`);\n }\n\n if (data.event && STEPS[data.event.step] !== spinner.text) {\n spinner.text = STEPS[data.event.step];\n }\n });\n }\n\n done = streamDone;\n }\n\n spinner.success('Deployment completed successfully.');\n};\n\nexport const deploy = new Command('deploy')\n .description('Deploy your application to Cloudflare.')\n .addOption(\n new Option(\n '--store-hash <hash>',\n 'BigCommerce store hash. Can be found in the URL of your store Control Panel.',\n )\n .env('BIGCOMMERCE_STORE_HASH')\n .makeOptionMandatory(),\n )\n .addOption(\n new Option(\n '--access-token <token>',\n 'BigCommerce access token. Can be found after creating a store-level API account.',\n )\n .env('BIGCOMMERCE_ACCESS_TOKEN')\n .makeOptionMandatory(),\n )\n .addOption(\n new Option('--api-host <host>', 'BigCommerce API host. The default is api.bigcommerce.com.')\n .env('BIGCOMMERCE_API_HOST')\n .default('api.bigcommerce.com'),\n )\n .addOption(\n new Option(\n '--project-uuid <uuid>',\n 'BigCommerce intrastructure project UUID. Can be found via the BigCommerce API (GET /v3/infrastructure/projects).',\n ).env('BIGCOMMERCE_PROJECT_UUID'),\n )\n .addOption(\n new Option(\n '--secret <secrets...>',\n 'Secrets to set for the deployment. Format: SECRET_1=FOO SECRET_2=BAR',\n ),\n )\n .option('--dry-run', 'Run the command to generate the bundle without uploading or deploying.')\n\n .action(async (options) => {\n try {\n const config = getProjectConfig();\n\n await telemetry.identify(options.storeHash);\n\n const projectUuid = options.projectUuid ?? config.get('projectUuid');\n\n if (!projectUuid) {\n throw new Error(\n 'Project UUID is required. Please run either `catalyst project link` or `catalyst project create` or this command again with --project-uuid <uuid>.',\n );\n }\n\n await generateBundleZip();\n\n if (options.dryRun) {\n consola.info('Dry run enabled — skipping upload and deployment steps.');\n consola.info('Next steps (skipped):');\n consola.info('- Generate upload signature');\n consola.info('- Upload bundle.zip');\n consola.info('- Create deployment');\n\n process.exit(0);\n }\n\n const uploadSignature = await generateUploadSignature(\n options.storeHash,\n options.accessToken,\n options.apiHost,\n );\n\n await uploadBundleZip(uploadSignature.upload_url);\n\n const environmentVariables = parseEnvironmentVariables(options.secret);\n\n const { deployment_uuid: deploymentUuid } = await createDeployment(\n projectUuid,\n uploadSignature.upload_uuid,\n options.storeHash,\n options.accessToken,\n options.apiHost,\n environmentVariables,\n );\n\n await getDeploymentStatus(\n deploymentUuid,\n options.storeHash,\n options.accessToken,\n options.apiHost,\n );\n } catch (error) {\n consola.error(error);\n process.exit(1);\n }\n });\n","import { Analytics } from '@segment/analytics-node';\nimport Conf from 'conf';\nimport { randomBytes } from 'node:crypto';\n\nimport PACKAGE_INFO from '../../../package.json';\n\nimport { getProjectConfig, ProjectConfigSchema } from './project-config';\n\nconst TELEMETRY_KEY_ENABLED = 'telemetry.enabled';\nconst TELEMETRY_KEY_ID = `telemetry.anonymousId`;\n\nexport class Telemetry {\n readonly sessionId: string;\n readonly analytics: Analytics;\n\n private projectConfig: Conf<ProjectConfigSchema>;\n private CATALYST_TELEMETRY_DISABLED: string | undefined;\n\n private readonly projectName = 'catalyst-cli';\n private readonly projectVersion = PACKAGE_INFO.version;\n\n constructor() {\n this.CATALYST_TELEMETRY_DISABLED = process.env.CATALYST_TELEMETRY_DISABLED;\n\n this.projectConfig = getProjectConfig();\n\n this.sessionId = randomBytes(32).toString('hex');\n this.analytics = new Analytics({\n writeKey: process.env.CLI_SEGMENT_WRITE_KEY ?? 'not-a-valid-segment-write-key',\n });\n }\n\n async track(eventName: string, payload: Record<string, unknown>) {\n if (!this.isEnabled()) {\n return Promise.resolve(undefined);\n }\n\n this.analytics.track({\n event: eventName,\n anonymousId: this.getAnonymousId(),\n properties: {\n ...payload,\n sessionId: this.sessionId,\n },\n context: {\n app: {\n name: this.projectName,\n version: this.projectVersion,\n },\n },\n });\n }\n\n async identify(storeHash?: string) {\n if (!this.isEnabled()) {\n return Promise.resolve(undefined);\n }\n\n if (!storeHash) {\n return Promise.resolve(undefined);\n }\n\n this.analytics.identify({\n userId: storeHash,\n anonymousId: this.getAnonymousId(),\n context: {\n app: {\n name: this.projectName,\n version: this.projectVersion,\n },\n },\n });\n }\n\n setEnabled = (_enabled: boolean) => {\n const enabled = Boolean(_enabled);\n\n this.projectConfig.set('telemetry.enabled', enabled);\n };\n\n isEnabled() {\n return (\n !this.CATALYST_TELEMETRY_DISABLED &&\n this.projectConfig.get<typeof TELEMETRY_KEY_ENABLED, boolean>(TELEMETRY_KEY_ENABLED, true)\n );\n }\n\n private getAnonymousId(): string {\n const val = this.projectConfig.get<typeof TELEMETRY_KEY_ID, string>(TELEMETRY_KEY_ID);\n\n if (val) {\n return val;\n }\n\n const generated = randomBytes(32).toString('hex');\n\n this.projectConfig.set(TELEMETRY_KEY_ID, generated);\n\n return generated;\n }\n}\n","import { Command } from 'commander';\nimport { execa } from 'execa';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { consola } from '../lib/logger';\n\nexport const dev = new Command('dev')\n .description('Start the Catalyst development server.')\n // Proxy `--help` to the underlying `next dev` command\n .helpOption(false)\n .allowUnknownOption(true)\n // The unknown options end up in program.args, not in program.opts(). Commander does not take a guess at how to interpret the unknown options.\n .argument(\n '[options...]',\n 'Next.js `dev` options (see: https://nextjs.org/docs/app/api-reference/cli/next#next-dev-options)',\n )\n .action(async (options) => {\n try {\n const nextBin = join('node_modules', '.bin', 'next');\n\n if (!existsSync(nextBin)) {\n throw new Error(\n `Next.js is not installed in ${process.cwd()}. Are you in a valid Next.js project?`,\n );\n }\n\n await execa(nextBin, ['dev', ...options], {\n stdio: 'inherit',\n cwd: process.cwd(),\n });\n } catch (error) {\n consola.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n","import { Command, Option } from 'commander';\n\nimport { consola } from '../lib/logger';\nimport { createProject, fetchProjects } from '../lib/project';\nimport { getProjectConfig } from '../lib/project-config';\nimport { Telemetry } from '../lib/telemetry';\n\nconst telemetry = new Telemetry();\n\nconst list = new Command('list')\n .description('List BigCommerce infrastructure projects for your store.')\n .addOption(\n new Option(\n '--store-hash <hash>',\n 'BigCommerce store hash. Can be found in the URL of your store Control Panel.',\n ).env('BIGCOMMERCE_STORE_HASH'),\n )\n .addOption(\n new Option(\n '--access-token <token>',\n 'BigCommerce access token. Can be found after creating a store-level API account.',\n ).env('BIGCOMMERCE_ACCESS_TOKEN'),\n )\n .addOption(\n new Option('--api-host <host>', 'BigCommerce API host. The default is api.bigcommerce.com.')\n .env('BIGCOMMERCE_API_HOST')\n .default('api.bigcommerce.com'),\n )\n .action(async (options) => {\n try {\n if (!options.storeHash || !options.accessToken) {\n consola.error('Insufficient information to list projects.');\n consola.info(\n 'Provide both --store-hash and --access-token (or set BIGCOMMERCE_STORE_HASH and BIGCOMMERCE_ACCESS_TOKEN).',\n );\n process.exit(1);\n\n return;\n }\n\n await telemetry.identify(options.storeHash);\n\n consola.start('Fetching projects...');\n\n const projects = await fetchProjects(options.storeHash, options.accessToken, options.apiHost);\n\n consola.success('Projects fetched.');\n\n if (projects.length === 0) {\n consola.info('No projects found.');\n process.exit(0);\n\n return;\n }\n\n projects.forEach((p) => {\n consola.log(`${p.name} (${p.uuid})`);\n });\n\n process.exit(0);\n } catch (error) {\n consola.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nconst create = new Command('create')\n .description(\n 'Create a new BigCommerce infrastructure project and link it to your local Catalyst project.',\n )\n .addOption(\n new Option(\n '--store-hash <hash>',\n 'BigCommerce store hash. Can be found in the URL of your store Control Panel.',\n ).env('BIGCOMMERCE_STORE_HASH'),\n )\n .addOption(\n new Option(\n '--access-token <token>',\n 'BigCommerce access token. Can be found after creating a store-level API account.',\n ).env('BIGCOMMERCE_ACCESS_TOKEN'),\n )\n .addOption(\n new Option('--api-host <host>', 'BigCommerce API host. The default is api.bigcommerce.com.')\n .env('BIGCOMMERCE_API_HOST')\n .default('api.bigcommerce.com'),\n )\n .option(\n '--root-dir <path>',\n 'Path to the root directory of your Catalyst project (default: current working directory).',\n process.cwd(),\n )\n .action(async (options) => {\n try {\n if (!options.storeHash || !options.accessToken) {\n consola.error('Insufficient information to create a project.');\n consola.info(\n 'Provide both --store-hash and --access-token (or set BIGCOMMERCE_STORE_HASH and BIGCOMMERCE_ACCESS_TOKEN).',\n );\n process.exit(1);\n\n return;\n }\n\n await telemetry.identify(options.storeHash);\n\n const newProjectName = await consola.prompt('Enter a name for the new project:', {\n type: 'text',\n });\n\n const data = await createProject(\n newProjectName,\n options.storeHash,\n options.accessToken,\n options.apiHost,\n );\n\n consola.success(`Project \"${data.name}\" created successfully.`);\n\n const config = getProjectConfig(options.rootDir);\n\n consola.start('Writing project UUID to .bigcommerce/project.json...');\n config.set('projectUuid', data.uuid);\n config.set('framework', 'catalyst');\n consola.success('Project UUID written to .bigcommerce/project.json.');\n\n process.exit(0);\n } catch (error) {\n consola.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nexport const link = new Command('link')\n .description(\n 'Link your local Catalyst project to a BigCommerce infrastructure project. You can provide a project UUID directly, or fetch and select from available projects using your store credentials.',\n )\n .addOption(\n new Option(\n '--store-hash <hash>',\n 'BigCommerce store hash. Can be found in the URL of your store Control Panel.',\n ).env('BIGCOMMERCE_STORE_HASH'),\n )\n .addOption(\n new Option(\n '--access-token <token>',\n 'BigCommerce access token. Can be found after creating a store-level API account.',\n ).env('BIGCOMMERCE_ACCESS_TOKEN'),\n )\n .addOption(\n new Option('--api-host <host>', 'BigCommerce API host. The default is api.bigcommerce.com.')\n .env('BIGCOMMERCE_API_HOST')\n .default('api.bigcommerce.com'),\n )\n .option(\n '--project-uuid <uuid>',\n 'BigCommerce infrastructure project UUID. Can be found via the BigCommerce API (GET /v3/infrastructure/projects). Use this to link directly without fetching projects.',\n )\n .option(\n '--root-dir <path>',\n 'Path to the root directory of your Catalyst project (default: current working directory).',\n process.cwd(),\n )\n .action(async (options) => {\n try {\n const config = getProjectConfig(options.rootDir);\n\n const writeProjectConfig = (uuid: string) => {\n consola.start('Writing project UUID to .bigcommerce/project.json...');\n config.set('projectUuid', uuid);\n config.set('framework', 'catalyst');\n consola.success('Project UUID written to .bigcommerce/project.json.');\n };\n\n if (options.projectUuid) {\n writeProjectConfig(options.projectUuid);\n\n process.exit(0);\n }\n\n if (options.storeHash && options.accessToken) {\n await telemetry.identify(options.storeHash);\n\n consola.start('Fetching projects...');\n\n const projects = await fetchProjects(\n options.storeHash,\n options.accessToken,\n options.apiHost,\n );\n\n consola.success('Projects fetched.');\n\n const promptOptions = [\n ...projects.map((proj) => ({\n label: proj.name,\n value: proj.uuid,\n hint: proj.uuid,\n })),\n {\n label: 'Create a new project',\n value: 'create',\n hint: 'Create a new infrastructure project for this BigCommerce store.',\n },\n ];\n\n let projectUuid = await consola.prompt(\n 'Select a project or create a new project (Press <enter> to select).',\n {\n type: 'select',\n options: promptOptions,\n cancel: 'reject',\n },\n );\n\n if (projectUuid === 'create') {\n const newProjectName = await consola.prompt('Enter a name for the new project:', {\n type: 'text',\n });\n\n const data = await createProject(\n newProjectName,\n options.storeHash,\n options.accessToken,\n options.apiHost,\n );\n\n projectUuid = data.uuid;\n\n consola.success(`Project \"${data.name}\" created successfully.`);\n }\n\n writeProjectConfig(projectUuid);\n\n process.exit(0);\n }\n\n consola.error('Insufficient information to link a project.');\n consola.info('Provide a project UUID with --project-uuid, or');\n consola.info('Provide both --store-hash and --access-token to fetch and select a project.');\n process.exit(1);\n } catch (error) {\n consola.error(error instanceof Error ? error.message : error);\n process.exit(1);\n }\n });\n\nexport const project = new Command('project')\n .description('Manage your BigCommerce infrastructure project.')\n .addCommand(create)\n .addCommand(list)\n .addCommand(link);\n","import { z } from 'zod';\n\nconst fetchProjectsSchema = z.object({\n data: z.array(\n z.object({\n uuid: z.string(),\n name: z.string(),\n }),\n ),\n});\n\nexport interface ProjectListItem {\n uuid: string;\n name: string;\n}\n\nexport async function fetchProjects(\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<ProjectListItem[]> {\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/projects`,\n {\n method: 'GET',\n headers: {\n 'X-Auth-Token': accessToken,\n },\n },\n );\n\n if (response.status === 403) {\n throw new Error(\n 'Infrastructure Projects API not enabled. If you are part of the alpha, contact support@bigcommerce.com to enable it.',\n );\n }\n\n if (!response.ok) {\n throw new Error(`Failed to fetch projects: ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n\n const { data } = fetchProjectsSchema.parse(res);\n\n return data;\n}\n\nconst createProjectSchema = z.object({\n data: z.object({\n uuid: z.string(),\n name: z.string(),\n date_created: z.coerce.date(),\n date_modified: z.coerce.date(),\n }),\n});\n\nexport interface CreateProjectResult {\n uuid: string;\n name: string;\n date_created: Date;\n date_modified: Date;\n}\n\nexport async function createProject(\n name: string,\n storeHash: string,\n accessToken: string,\n apiHost: string,\n): Promise<CreateProjectResult> {\n const response = await fetch(\n `https://${apiHost}/stores/${storeHash}/v3/infrastructure/projects`,\n {\n method: 'POST',\n headers: {\n 'X-Auth-Token': accessToken,\n Accept: 'application/json',\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({ name }),\n },\n );\n\n if (response.status === 502) {\n throw new Error('Failed to create project, is the name already in use?');\n }\n\n if (response.status === 403) {\n throw new Error(\n 'Infrastructure Projects API not enabled. If you are part of the alpha, contact support@bigcommerce.com to enable it.',\n );\n }\n\n if (!response.ok) {\n throw new Error(`Failed to create project: ${response.statusText}`);\n }\n\n const res: unknown = await response.json();\n\n const { data } = createProjectSchema.parse(res);\n\n return data;\n}\n","import { Command, Option } from 'commander';\nimport { execa } from 'execa';\nimport { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nimport { consola } from '../lib/logger';\nimport { getProjectConfig } from '../lib/project-config';\n\nexport const start = new Command('start')\n .description('Start your Catalyst storefront in optimized production mode.')\n .allowUnknownOption(true)\n // The unknown options end up in program.args, not in program.opts(). Commander does not take a guess at how to interpret the unknown options.\n .argument(\n '[start-options...]',\n 'Pass additional options to the start command. If framework is Next.js, see https://nextjs.org/docs/api-reference/cli#start for available options.',\n )\n .addOption(\n new Option('--framework <framework>', 'The framework to use for the preview').choices([\n 'catalyst',\n 'nextjs',\n ]),\n )\n .action(async (startOptions, options) => {\n try {\n const config = getProjectConfig();\n const framework = options.framework ?? config.get('framework');\n\n if (framework === 'nextjs') {\n const nextBin = join('node_modules', '.bin', 'next');\n\n if (!existsSync(nextBin)) {\n throw new Error(\n `Next.js is not installed in ${process.cwd()}. Are you in a valid Next.js project?`,\n );\n }\n\n await execa(nextBin, ['start', ...startOptions], {\n stdio: 'inherit',\n cwd: process.cwd(),\n });\n }\n\n await execa(\n 'pnpm',\n [\n 'exec',\n 'opennextjs-cloudflare',\n 'preview',\n '--config',\n join('.bigcommerce', 'wrangler.jsonc'),\n ...startOptions,\n ],\n {\n stdio: 'inherit',\n cwd: process.cwd(),\n },\n );\n } catch (error) {\n consola.error(error instanceof Error ? error.message : error);\n }\n });\n","import { Argument, Command, Option } from 'commander';\nimport { colorize } from 'consola/utils';\n\nimport { consola } from '../lib/logger';\nimport { Telemetry } from '../lib/telemetry';\n\nconst telemetryService = new Telemetry();\nlet isEnabled = telemetryService.isEnabled();\n\nexport const telemetry = new Command('telemetry')\n .addArgument(new Argument('[arg]').choices(['disable', 'enable', 'status']))\n .addOption(new Option('--enable', `Enables CLI telemetry collection.`).conflicts('disable'))\n .option('--disable', `Disables CLI telemetry collection.`)\n .action((arg, options) => {\n if (options.enable || arg === 'enable') {\n telemetryService.setEnabled(true);\n isEnabled = true;\n\n consola.success('Success!\\n');\n } else if (options.disable || arg === 'disable') {\n telemetryService.setEnabled(false);\n\n if (isEnabled) {\n consola.success('Your preference has been saved to .bigcommerce/project.json');\n } else {\n consola.info(`Catalyst CLI telemetry collection is already disabled.`);\n }\n\n isEnabled = false;\n } else {\n consola.info('Catalyst CLI Telemetry\\n');\n }\n\n consola.info(\n `Status: ${colorize('bold', isEnabled ? colorize('green', 'Enabled') : colorize('red', 'Disabled'))}`,\n );\n\n if (!isEnabled) {\n consola.info(\n `You have opted-out of Catalyst CLI telemetry. No data will be collected from your machine.`,\n );\n }\n });\n","import { Command } from 'commander';\n\nimport PACKAGE_INFO from '../../../package.json';\nimport { consola } from '../lib/logger';\n\nexport const version = new Command('version')\n .description('Display detailed version information.')\n .action(() => {\n consola.log('Version Information:');\n consola.log(`CLI Version: ${PACKAGE_INFO.version}`);\n consola.log(`Node Version: ${process.version}`);\n consola.log(`Platform: ${process.platform} (${process.arch})`);\n });\n","import { Command } from '@commander-js/extra-typings';\n\nimport { Telemetry } from '../lib/telemetry';\n\nconst telemetry = new Telemetry();\n\nconst allowlistArguments = ['--keep-temp-dir', '--api-host', '--project-uuid'];\n\nfunction parseArguments(args: string[]) {\n return args.reduce<Record<string, string>>((result, arg, index, array) => {\n if (arg.includes('=')) {\n const [key, value] = arg.split('=');\n\n if (allowlistArguments.includes(key)) {\n return {\n ...result,\n [key]: value,\n };\n }\n }\n\n if (allowlistArguments.includes(arg)) {\n const nextValue =\n array[index + 1] && !array[index + 1].startsWith('--') ? array[index + 1] : null;\n\n if (nextValue && !nextValue.includes('--')) {\n return {\n ...result,\n [arg]: nextValue,\n };\n }\n }\n\n return result;\n }, {});\n}\n\nexport const telemetryPreHook = async (command: Command) => {\n const [commandName, ...args] = command.args;\n\n // Return the await to get a proper stack trace.\n // eslint-disable-next-line @typescript-eslint/no-confusing-void-expression\n return await telemetry.track(commandName, {\n ...parseArguments(args),\n });\n};\n\nexport const telemetryPostHook = async () => {\n await telemetry.analytics.closeAndFlush();\n};\n","#!/usr/bin/env node\nimport { program } from './program';\n\nprogram.parse(process.argv);\n"],"mappings":"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","names":["Command","colorize","join","join","config","join","Command","Option","join","join","Command","Option","config","Command","execa","existsSync","join","Command","join","existsSync","execa","Command","Option","z","telemetry","Command","Option","config","Command","Option","execa","existsSync","join","Command","Option","config","join","existsSync","execa","Command","Option","telemetry","Command","Option","Command","Command","telemetry","Command","colorize","telemetry"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bigcommerce/catalyst",
|
|
3
|
-
"version": "1.0.0-alpha.
|
|
3
|
+
"version": "1.0.0-alpha.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"catalyst": "dist/cli.js"
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
"templates"
|
|
11
11
|
],
|
|
12
12
|
"engines": {
|
|
13
|
-
"node": "^20.0.0 || ^22.0.0"
|
|
13
|
+
"node": "^20.0.0 || ^22.0.0 || ^24.0.0"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
16
|
"@segment/analytics-node": "^2.2.1",
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
"consola": "^3.4.2",
|
|
21
21
|
"dotenv": "^16.5.0",
|
|
22
22
|
"execa": "^9.6.0",
|
|
23
|
+
"open": "^10.1.0",
|
|
23
24
|
"yocto-spinner": "^1.0.0",
|
|
24
25
|
"zod": "^4.0.5"
|
|
25
26
|
},
|
|
@@ -39,7 +40,7 @@
|
|
|
39
40
|
"@bigcommerce/eslint-config-catalyst": "^1.0.0"
|
|
40
41
|
},
|
|
41
42
|
"peerDependencies": {
|
|
42
|
-
"@opennextjs/cloudflare": "
|
|
43
|
+
"@opennextjs/cloudflare": "1.17.3"
|
|
43
44
|
},
|
|
44
45
|
"scripts": {
|
|
45
46
|
"dev": "tsup --watch",
|
|
@@ -1,20 +1,26 @@
|
|
|
1
1
|
import { defineCloudflareConfig, type OpenNextConfig } from '@opennextjs/cloudflare';
|
|
2
2
|
import { purgeCache } from '@opennextjs/cloudflare/overrides/cache-purge/index';
|
|
3
|
-
import
|
|
3
|
+
import r2IncrementalCache from '@opennextjs/cloudflare/overrides/incremental-cache/r2-incremental-cache';
|
|
4
|
+
import { withRegionalCache } from '@opennextjs/cloudflare/overrides/incremental-cache/regional-cache';
|
|
4
5
|
import doQueue from '@opennextjs/cloudflare/overrides/queue/do-queue';
|
|
5
6
|
import queueCache from '@opennextjs/cloudflare/overrides/queue/queue-cache';
|
|
6
7
|
import doShardedTagCache from '@opennextjs/cloudflare/overrides/tag-cache/do-sharded-tag-cache';
|
|
7
8
|
|
|
8
9
|
const cloudflareConfig = defineCloudflareConfig({
|
|
9
|
-
incrementalCache:
|
|
10
|
+
incrementalCache: withRegionalCache(r2IncrementalCache, {
|
|
11
|
+
mode: 'long-lived',
|
|
12
|
+
bypassTagCacheOnCacheHit: true,
|
|
13
|
+
}),
|
|
10
14
|
queue: queueCache(doQueue, {
|
|
11
15
|
regionalCacheTtlSec: 5,
|
|
16
|
+
waitForQueueAck: true,
|
|
12
17
|
}),
|
|
13
18
|
routePreloadingBehavior: 'withWaitUntil',
|
|
14
19
|
tagCache: doShardedTagCache({
|
|
15
20
|
baseShardSize: 12,
|
|
16
21
|
regionalCache: true,
|
|
17
22
|
regionalCacheTtlSec: 5,
|
|
23
|
+
regionalCacheDangerouslyPersistMissingTags: true,
|
|
18
24
|
shardReplication: {
|
|
19
25
|
numberOfSoftReplicas: 4,
|
|
20
26
|
numberOfHardReplicas: 2,
|