@zalify/cli 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +109 -75
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -12064,7 +12064,7 @@ async function imagesGenerate(storeDir) {
|
|
|
12064
12064
|
import { readFileSync as readFileSync6, existsSync as existsSync6 } from "node:fs";
|
|
12065
12065
|
import { basename as basename3, join as join6, resolve as resolve5 } from "node:path";
|
|
12066
12066
|
|
|
12067
|
-
// src/
|
|
12067
|
+
// src/shop.ts
|
|
12068
12068
|
import { spawn as spawn3, spawnSync as spawnSync3 } from "node:child_process";
|
|
12069
12069
|
import { existsSync as existsSync5, readFileSync as readFileSync5, writeFileSync as writeFileSync6 } from "node:fs";
|
|
12070
12070
|
import { basename as basename2, join as join5, resolve as resolve4 } from "node:path";
|
|
@@ -12493,11 +12493,11 @@ function mergePackageJson(projectDir, oldDir, newDir, dryRun) {
|
|
|
12493
12493
|
return depsChanged;
|
|
12494
12494
|
}
|
|
12495
12495
|
|
|
12496
|
-
// src/
|
|
12496
|
+
// src/shop.ts
|
|
12497
12497
|
function apiError2(status, json, appUrl) {
|
|
12498
12498
|
if (status === 402) {
|
|
12499
12499
|
return new Error(`${json.error ?? "Upgrade required"}
|
|
12500
|
-
` + `
|
|
12500
|
+
` + ` Shop hosting is a paid feature — upgrade the workspace in ${appUrl}`);
|
|
12501
12501
|
}
|
|
12502
12502
|
if (json.code === "NO_CONNECTION") {
|
|
12503
12503
|
return new Error(`${json.error}
|
|
@@ -12560,10 +12560,10 @@ async function pollUntilReady(auth, id) {
|
|
|
12560
12560
|
}
|
|
12561
12561
|
throw new Error("Provisioning timed out after 10 minutes — check the Temporal UI.");
|
|
12562
12562
|
}
|
|
12563
|
-
async function
|
|
12563
|
+
async function shopCreate(dir2, opts) {
|
|
12564
12564
|
const auth = requireActive();
|
|
12565
12565
|
const slug = basename2(resolve4(dir2)).toLowerCase().replaceAll(/[^a-z0-9-]+/g, "-").replaceAll(/^-+|-+$/g, "") || "site";
|
|
12566
|
-
console.log(`Provisioning
|
|
12566
|
+
console.log(`Provisioning shop "${slug}" (workspace "${auth.workspaceName}")`);
|
|
12567
12567
|
const created = await request(auth, "POST", "/api/sites", {
|
|
12568
12568
|
slug,
|
|
12569
12569
|
theme: opts.theme ?? "nextjs",
|
|
@@ -12619,7 +12619,7 @@ Live: https://${view.domain}`);
|
|
|
12619
12619
|
Next steps:
|
|
12620
12620
|
` + ` - author your theme in ${dir2}/theme/ (see theme/README.md), commit + push
|
|
12621
12621
|
` + ` - zalify brand push <brand-dir> --prune # catalog (auto-refreshes this site)
|
|
12622
|
-
` + ` - zalify
|
|
12622
|
+
` + ` - zalify shop open ${slug} # see it live
|
|
12623
12623
|
` + ` - zalify theme status ${dir2} # drift check anytime`);
|
|
12624
12624
|
}
|
|
12625
12625
|
async function resolveSite(auth, slugOrDir) {
|
|
@@ -12650,18 +12650,18 @@ async function resolveSite(auth, slugOrDir) {
|
|
|
12650
12650
|
const match = sites.find((s) => s.slug === slug);
|
|
12651
12651
|
if (match)
|
|
12652
12652
|
return match;
|
|
12653
|
-
throw new Error(`No
|
|
12654
|
-
` + `
|
|
12653
|
+
throw new Error(`No shop "${slug}" in workspace "${auth.workspaceName}".
|
|
12654
|
+
` + ` Shops here: ${sites.map((s) => s.slug).join(", ") || "(none)"}`);
|
|
12655
12655
|
}
|
|
12656
12656
|
if (sites.length === 1)
|
|
12657
12657
|
return sites[0];
|
|
12658
|
-
throw new Error(sites.length === 0 ? `No
|
|
12658
|
+
throw new Error(sites.length === 0 ? `No shops in workspace "${auth.workspaceName}" — create one with \`zalify shop create <dir>\`.` : `Multiple shops in this workspace — name one: ${sites.map((s) => s.slug).join(", ")}`);
|
|
12659
12659
|
}
|
|
12660
|
-
async function
|
|
12660
|
+
async function shopList() {
|
|
12661
12661
|
const auth = requireActive();
|
|
12662
12662
|
const sites = await listSites(auth);
|
|
12663
12663
|
if (!sites.length) {
|
|
12664
|
-
console.log(`No
|
|
12664
|
+
console.log(`No shops in workspace "${auth.workspaceName}".`);
|
|
12665
12665
|
return;
|
|
12666
12666
|
}
|
|
12667
12667
|
for (const s of sites) {
|
|
@@ -12669,23 +12669,34 @@ async function siteList() {
|
|
|
12669
12669
|
console.log(`${s.status === "READY" ? "✓" : s.status === "FAILED" ? "✗" : "…"} ${s.slug} ${url} (${s.status.toLowerCase()}${s.githubRepo ? `, ${s.githubRepo}` : ""})`);
|
|
12670
12670
|
}
|
|
12671
12671
|
}
|
|
12672
|
-
async function
|
|
12672
|
+
async function shopRefresh(slugOrDir) {
|
|
12673
12673
|
const auth = requireActive();
|
|
12674
12674
|
const site = await resolveSite(auth, slugOrDir);
|
|
12675
12675
|
await request(auth, "POST", `/api/sites/${site.id}/revalidate`, {});
|
|
12676
12676
|
console.log(`✓ refreshed https://${site.domain}`);
|
|
12677
12677
|
}
|
|
12678
|
-
async function
|
|
12678
|
+
async function shopOpen(slugOrDir) {
|
|
12679
12679
|
const auth = requireActive();
|
|
12680
12680
|
const site = await resolveSite(auth, slugOrDir);
|
|
12681
12681
|
if (!site.domain)
|
|
12682
|
-
throw new Error(`
|
|
12682
|
+
throw new Error(`Shop "${site.slug}" has no domain yet.`);
|
|
12683
12683
|
const url = `https://${site.domain}`;
|
|
12684
12684
|
const opener = process.platform === "darwin" ? "open" : process.platform === "win32" ? "start" : "xdg-open";
|
|
12685
12685
|
spawn3(opener, [url], { detached: true, stdio: "ignore" }).unref();
|
|
12686
12686
|
console.log(url);
|
|
12687
12687
|
}
|
|
12688
|
-
async function
|
|
12688
|
+
async function shopDomainSync(slugOrDir) {
|
|
12689
|
+
const auth = requireActive();
|
|
12690
|
+
const site = await resolveSite(auth, slugOrDir);
|
|
12691
|
+
const before = site.domain;
|
|
12692
|
+
const result = await request(auth, "POST", `/api/sites/${site.id}/domains`, {});
|
|
12693
|
+
if (!result.changed) {
|
|
12694
|
+
console.log(`Already in sync: https://${result.site.domain}`);
|
|
12695
|
+
return;
|
|
12696
|
+
}
|
|
12697
|
+
console.log(`✓ ${site.slug}: https://${before} → https://${result.site.domain} (old domain 308s)`);
|
|
12698
|
+
}
|
|
12699
|
+
async function maybeRefreshShops(auth, brandDir, siteSlugOverride) {
|
|
12689
12700
|
try {
|
|
12690
12701
|
let slug = siteSlugOverride ?? null;
|
|
12691
12702
|
if (!slug) {
|
|
@@ -12699,7 +12710,7 @@ async function maybeRefreshSites(auth, brandDir, siteSlugOverride) {
|
|
|
12699
12710
|
const sites = (await listSites(auth)).filter((s) => s.slug === slug && s.status === "READY");
|
|
12700
12711
|
for (const site of sites) {
|
|
12701
12712
|
await request(auth, "POST", `/api/sites/${site.id}/revalidate`, {});
|
|
12702
|
-
console.log(`✓
|
|
12713
|
+
console.log(`✓ shop refreshed (https://${site.domain})`);
|
|
12703
12714
|
}
|
|
12704
12715
|
} catch {}
|
|
12705
12716
|
}
|
|
@@ -12836,6 +12847,34 @@ async function shopifyImport(storeDir, options = {}) {
|
|
|
12836
12847
|
console.log(` ✓ pruned ${node.handle}`);
|
|
12837
12848
|
}
|
|
12838
12849
|
}
|
|
12850
|
+
for (const disc of catalog.discounts ?? []) {
|
|
12851
|
+
const existing = await gql(auth, `query($q: String!) { codeDiscountNodes(first: 1, query: $q) { nodes { id } } }`, { q: `code:${disc.code}` });
|
|
12852
|
+
if (existing.codeDiscountNodes.nodes.length) {
|
|
12853
|
+
console.log(` - discount ${disc.code} exists, skipped`);
|
|
12854
|
+
continue;
|
|
12855
|
+
}
|
|
12856
|
+
const res = await gql(auth, `mutation($discount: DiscountCodeBasicInput!) {
|
|
12857
|
+
discountCodeBasicCreate(basicCodeDiscount: $discount) {
|
|
12858
|
+
userErrors { field message }
|
|
12859
|
+
}
|
|
12860
|
+
}`, {
|
|
12861
|
+
discount: {
|
|
12862
|
+
title: disc.title ?? `${disc.code} — ${disc.percentOff}% off`,
|
|
12863
|
+
code: disc.code,
|
|
12864
|
+
startsAt: new Date().toISOString(),
|
|
12865
|
+
customerSelection: { all: true },
|
|
12866
|
+
customerGets: {
|
|
12867
|
+
value: { percentage: disc.percentOff / 100 },
|
|
12868
|
+
items: { all: true }
|
|
12869
|
+
}
|
|
12870
|
+
}
|
|
12871
|
+
});
|
|
12872
|
+
const errs = res.discountCodeBasicCreate.userErrors;
|
|
12873
|
+
if (errs.length)
|
|
12874
|
+
console.error(` ✗ discount ${disc.code}: ${joinErrors(errs)}`);
|
|
12875
|
+
else
|
|
12876
|
+
console.log(` ✓ discount ${disc.code} created (${disc.percentOff}% off)`);
|
|
12877
|
+
}
|
|
12839
12878
|
for (const pg of catalog.pages ?? []) {
|
|
12840
12879
|
const existing = await gql(auth, `query($q: String!) { pages(first: 1, query: $q) { nodes { id handle } } }`, { q: `handle:${pg.handle}` });
|
|
12841
12880
|
const node = existing.pages.nodes[0];
|
|
@@ -12951,7 +12990,7 @@ async function shopifyImport(storeDir, options = {}) {
|
|
|
12951
12990
|
console.warn(` ! could not publish to Online Store (write_publications scope missing?): ${e instanceof Error ? e.message : String(e)}`);
|
|
12952
12991
|
}
|
|
12953
12992
|
console.log("Done.");
|
|
12954
|
-
await
|
|
12993
|
+
await maybeRefreshShops(auth, dir2, options.site);
|
|
12955
12994
|
}
|
|
12956
12995
|
async function shopifyUploadImages(storeDir, options = {}) {
|
|
12957
12996
|
const auth = requireActive();
|
|
@@ -13031,7 +13070,7 @@ async function shopifyUploadImages(storeDir, options = {}) {
|
|
|
13031
13070
|
console.log(` ✓ ${entry.file}`);
|
|
13032
13071
|
}
|
|
13033
13072
|
console.log("Done.");
|
|
13034
|
-
await
|
|
13073
|
+
await maybeRefreshShops(auth, dir2, options.site);
|
|
13035
13074
|
}
|
|
13036
13075
|
|
|
13037
13076
|
// src/brand.ts
|
|
@@ -13076,6 +13115,10 @@ alone. Validate anytime with \`zalify brand validate\` (defaults to cwd).
|
|
|
13076
13115
|
privacy-policy, terms-of-service); write \`bodyHtml\` in the brand
|
|
13077
13116
|
voice (simple HTML: h2/p/ul/li). The \`contact\` page already exists in
|
|
13078
13117
|
every Shopify store — link it, don't create it.
|
|
13118
|
+
- **Discounts** (\`discounts\`): code discounts created by \`brand push\`
|
|
13119
|
+
(\`{ code, percentOff, title? }\`). Keep the scaffold's \`WELCOME20\` —
|
|
13120
|
+
it is the code the theme's cart voucher banner shows by default, so
|
|
13121
|
+
Apply actually works. Codes: 4-20 uppercase letters/digits.
|
|
13079
13122
|
- **Menus** (\`menus\`): \`main-menu\` (header nav) and \`footer\`, upserted
|
|
13080
13123
|
by \`brand push\`; the catalog is the source of truth (a push replaces
|
|
13081
13124
|
the menu's items). Items are \`{ title, url, items? }\`, max 3 levels.
|
|
@@ -13121,7 +13164,7 @@ alone. Validate anytime with \`zalify brand validate\` (defaults to cwd).
|
|
|
13121
13164
|
zalify brand validate # lint this folder (cwd)
|
|
13122
13165
|
# create the Shopify dev store + Zalify workspace, then:
|
|
13123
13166
|
zalify workspace set <workspace-slug>
|
|
13124
|
-
zalify
|
|
13167
|
+
zalify shop create <slug> # hosted shop: repo + deploy + domain + token
|
|
13125
13168
|
zalify brand push --prune # catalog → your Shopify store
|
|
13126
13169
|
zalify brand images generate # create the manifest's shots
|
|
13127
13170
|
zalify brand images attach # attach them to the products
|
|
@@ -13238,6 +13281,13 @@ var CATALOG_JSON = (vendor, currency) => JSON.stringify({
|
|
|
13238
13281
|
bodyHtml: "<p><Plain-language terms: orders, pricing, liability, governing law.></p>"
|
|
13239
13282
|
}
|
|
13240
13283
|
],
|
|
13284
|
+
discounts: [
|
|
13285
|
+
{
|
|
13286
|
+
code: "WELCOME20",
|
|
13287
|
+
percentOff: 20,
|
|
13288
|
+
title: "Welcome — 20% off the first order"
|
|
13289
|
+
}
|
|
13290
|
+
],
|
|
13241
13291
|
menus: {
|
|
13242
13292
|
"main-menu": [
|
|
13243
13293
|
{ title: "New in", url: "/collections/all" },
|
|
@@ -13478,6 +13528,15 @@ function brandValidate(dir2 = ".") {
|
|
|
13478
13528
|
for (const [menuHandle, nodes] of Object.entries(catalog.menus ?? {})) {
|
|
13479
13529
|
checkMenu(nodes ?? [], menuHandle, 1);
|
|
13480
13530
|
}
|
|
13531
|
+
for (const disc of catalog.discounts ?? []) {
|
|
13532
|
+
const where = `discount "${disc.code ?? "?"}"`;
|
|
13533
|
+
if (!disc.code || !/^[A-Z0-9]{4,20}$/.test(disc.code)) {
|
|
13534
|
+
problems.push(`${where}: code must be 4-20 uppercase letters/digits`);
|
|
13535
|
+
}
|
|
13536
|
+
if (typeof disc.percentOff !== "number" || !Number.isInteger(disc.percentOff) || disc.percentOff < 1 || disc.percentOff > 99) {
|
|
13537
|
+
problems.push(`${where}: percentOff must be an integer 1-99`);
|
|
13538
|
+
}
|
|
13539
|
+
}
|
|
13481
13540
|
}
|
|
13482
13541
|
const manifest = readJson2("images/manifest.json");
|
|
13483
13542
|
if (manifest) {
|
|
@@ -13540,12 +13599,12 @@ try {
|
|
|
13540
13599
|
});
|
|
13541
13600
|
} catch {}
|
|
13542
13601
|
var program2 = new Command;
|
|
13543
|
-
program2.name("zalify").description("Zalify CLI — author a brand, launch its
|
|
13602
|
+
program2.name("zalify").description("Zalify CLI — author a brand, launch its shop, keep the theme current").version(pkg.version, "-v, --version", "output the current version");
|
|
13544
13603
|
program2.addHelpText("after", `
|
|
13545
13604
|
The golden path (new brand, start to live):
|
|
13546
13605
|
1. zalify brand init stores/acme author the data (no login needed)
|
|
13547
13606
|
2. zalify login && zalify workspace set <workspace>
|
|
13548
|
-
3. zalify
|
|
13607
|
+
3. zalify shop create acme live at acme.z1.shop in ~4 minutes
|
|
13549
13608
|
4. cd stores/acme && zalify brand push --prune
|
|
13550
13609
|
5. zalify brand images generate && zalify brand images attach
|
|
13551
13610
|
6. zalify theme status | upgrade stay current, keep your edits
|
|
@@ -13572,15 +13631,15 @@ brand.command("init [dir]").description("Scaffold a brand folder (catalog, voice
|
|
|
13572
13631
|
brand.command("validate [dir]").description("Lint the brand folder against the authoring rules").action((dir2) => {
|
|
13573
13632
|
brandValidate(dir2);
|
|
13574
13633
|
});
|
|
13575
|
-
brand.command("push [dir]").description("Push catalog.json to your connected Shopify store (products, smart collections, publish; idempotent)").option("--prune", "delete store products (by catalog vendor) absent from catalog.json").option("--
|
|
13576
|
-
await shopifyImport(dir2 ?? ".", options);
|
|
13634
|
+
brand.command("push [dir]").description("Push catalog.json to your connected Shopify store (products, smart collections, publish; idempotent)").option("--prune", "delete store products (by catalog vendor) absent from catalog.json").option("--shop <slug>", "refresh only this shop afterwards (default: every shop matching the brand)").option("--site <slug>", "(old spelling of --shop)", undefined).action(async (dir2, options) => {
|
|
13635
|
+
await shopifyImport(dir2 ?? ".", { prune: options.prune, site: options.shop ?? options.site });
|
|
13577
13636
|
});
|
|
13578
13637
|
var brandImages = brand.command("images").description("The brand's imagery pipeline: generate → attach → push/pull masters");
|
|
13579
13638
|
brandImages.command("generate [dir]").description("Generate the manifest's missing images on Zalify infrastructure (resumable)").action(async (dir2) => {
|
|
13580
13639
|
await imagesGenerate(dir2 ?? ".");
|
|
13581
13640
|
});
|
|
13582
|
-
brandImages.command("attach [dir]").description("Attach generated images to their Shopify products per the manifest (skips already-attached)").option("--
|
|
13583
|
-
await shopifyUploadImages(dir2 ?? ".", options);
|
|
13641
|
+
brandImages.command("attach [dir]").description("Attach generated images to their Shopify products per the manifest (skips already-attached)").option("--shop <slug>", "refresh only this shop afterwards").option("--site <slug>", "(old spelling of --shop)", undefined).action(async (dir2, options) => {
|
|
13642
|
+
await shopifyUploadImages(dir2 ?? ".", { site: options.shop ?? options.site });
|
|
13584
13643
|
});
|
|
13585
13644
|
brandImages.command("push [dir]").description("Upload image masters to the Zalify asset library (sha256 dedup, writes assets.json)").action(async (dir2) => {
|
|
13586
13645
|
await assetsPush(dir2 ?? ".");
|
|
@@ -13588,18 +13647,21 @@ brandImages.command("push [dir]").description("Upload image masters to the Zalif
|
|
|
13588
13647
|
brandImages.command("pull [dir]").description("Download masters listed in images/assets.json (fresh-clone restore)").action(async (dir2) => {
|
|
13589
13648
|
await assetsPull(dir2 ?? ".");
|
|
13590
13649
|
});
|
|
13591
|
-
var
|
|
13592
|
-
|
|
13593
|
-
await
|
|
13650
|
+
var shop = program2.command("shop").description("Hosted shops at <slug>.z1.shop — Zalify provisions the repo, deployment, and domain");
|
|
13651
|
+
shop.command("create <dir>").description("One-command launch: provision repo + deployment + domain + storefront token, scaffold locally, push, go live").option("-t, --theme <name>", "theme", "nextjs").option("--editor", "include the Zalify canvas-editor (z1) wiring").option("--to <version>", "theme version (default: latest)").option("--no-install", "skip dependency install").option("--no-git", "skip git init/push").action(async (dir2, options) => {
|
|
13652
|
+
await shopCreate(dir2, options);
|
|
13594
13653
|
});
|
|
13595
|
-
|
|
13596
|
-
await
|
|
13654
|
+
shop.command("list", { isDefault: true }).description("List the workspace's hosted shops").action(async () => {
|
|
13655
|
+
await shopList();
|
|
13597
13656
|
});
|
|
13598
|
-
|
|
13599
|
-
await
|
|
13657
|
+
shop.command("refresh [slug-or-dir]").description("Refresh the live shop's data cache (defaults to the shop linked to cwd)").action(async (slugOrDir) => {
|
|
13658
|
+
await shopRefresh(slugOrDir);
|
|
13600
13659
|
});
|
|
13601
|
-
|
|
13602
|
-
await
|
|
13660
|
+
shop.command("open [slug-or-dir]").description("Open the live shop in your browser (defaults to the shop linked to cwd)").action(async (slugOrDir) => {
|
|
13661
|
+
await shopOpen(slugOrDir);
|
|
13662
|
+
});
|
|
13663
|
+
shop.command("domain-sync [slug-or-dir]").description("Re-point the shop at the current root domain (the old domain 308-redirects)").action(async (slugOrDir) => {
|
|
13664
|
+
await shopDomainSync(slugOrDir);
|
|
13603
13665
|
});
|
|
13604
13666
|
var theme = program2.command("theme").description("Theme source code — scaffold a copy and upgrade it without losing your edits");
|
|
13605
13667
|
theme.command("create <dir>").description("Scaffold only — no Zalify hosting (self-host path; `site create` is the fully-hosted launch)").option("-t, --template <name>", "liquid | hydrogen | nextjs", "nextjs").option("--editor", "include the Zalify canvas-editor (z1) wiring").option("--store-domain <domain>", "your-store.myshopify.com (default: mock.shop demo data)").option("--storefront-token <token>", "public Storefront API access token").option("--to <version>", "theme version (default: latest)").option("--no-install", "skip dependency install").option("--no-git", "skip git init + initial commit").option("--tarball <path>", "use a local @zalify/theme-templates .tgz instead of npm").action(async (dir2, options) => {
|
|
@@ -13632,50 +13694,22 @@ A new version (${update.latest}) is available. Run "zalify self-update" to updat
|
|
|
13632
13694
|
}
|
|
13633
13695
|
} catch {}
|
|
13634
13696
|
});
|
|
13635
|
-
var
|
|
13636
|
-
|
|
13637
|
-
moved("
|
|
13638
|
-
|
|
13639
|
-
});
|
|
13640
|
-
legacyStore.command("validate <dir>").action((dir2) => {
|
|
13641
|
-
moved("brand validate");
|
|
13642
|
-
brandValidate(dir2);
|
|
13643
|
-
});
|
|
13644
|
-
var legacyShopify = program2.command("shopify", { hidden: true });
|
|
13645
|
-
legacyShopify.command("import <store-dir>").option("--prune").action(async (storeDir, options) => {
|
|
13646
|
-
moved("brand push");
|
|
13647
|
-
await shopifyImport(storeDir, options);
|
|
13648
|
-
});
|
|
13649
|
-
legacyShopify.command("upload-images <store-dir>").action(async (storeDir) => {
|
|
13650
|
-
moved("brand images attach");
|
|
13651
|
-
await shopifyUploadImages(storeDir);
|
|
13652
|
-
});
|
|
13653
|
-
var legacyImages = program2.command("images", { hidden: true });
|
|
13654
|
-
legacyImages.command("generate <store-dir>").action(async (storeDir) => {
|
|
13655
|
-
moved("brand images generate");
|
|
13656
|
-
await imagesGenerate(storeDir);
|
|
13657
|
-
});
|
|
13658
|
-
var legacyAssets = program2.command("assets", { hidden: true });
|
|
13659
|
-
legacyAssets.command("push <store-dir>").action(async (storeDir) => {
|
|
13660
|
-
moved("brand images push");
|
|
13661
|
-
await assetsPush(storeDir);
|
|
13662
|
-
});
|
|
13663
|
-
legacyAssets.command("pull <store-dir>").action(async (storeDir) => {
|
|
13664
|
-
moved("brand images pull");
|
|
13665
|
-
await assetsPull(storeDir);
|
|
13697
|
+
var legacySite = program2.command("site", { hidden: true });
|
|
13698
|
+
legacySite.command("create <dir>").option("-t, --theme <name>", "", "nextjs").option("--editor").option("--to <version>").option("--no-install").option("--no-git").action(async (dir2, options) => {
|
|
13699
|
+
moved("shop create");
|
|
13700
|
+
await shopCreate(dir2, options);
|
|
13666
13701
|
});
|
|
13667
|
-
|
|
13668
|
-
|
|
13669
|
-
|
|
13670
|
-
await siteCreate(dir2, options);
|
|
13702
|
+
legacySite.command("list", { isDefault: true }).action(async () => {
|
|
13703
|
+
moved("shop list");
|
|
13704
|
+
await shopList();
|
|
13671
13705
|
});
|
|
13672
|
-
|
|
13673
|
-
moved("
|
|
13674
|
-
await
|
|
13706
|
+
legacySite.command("refresh [slug-or-dir]").action(async (slugOrDir) => {
|
|
13707
|
+
moved("shop refresh");
|
|
13708
|
+
await shopRefresh(slugOrDir);
|
|
13675
13709
|
});
|
|
13676
|
-
|
|
13677
|
-
moved("
|
|
13678
|
-
await
|
|
13710
|
+
legacySite.command("open [slug-or-dir]").action(async (slugOrDir) => {
|
|
13711
|
+
moved("shop open");
|
|
13712
|
+
await shopOpen(slugOrDir);
|
|
13679
13713
|
});
|
|
13680
13714
|
program2.parseAsync().catch((err) => {
|
|
13681
13715
|
console.error(`Error: ${err instanceof Error ? err.message : String(err)}`);
|