@itznexus/itznexus-cli 1.136.0 → 1.138.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.
Files changed (39) hide show
  1. package/dist/commands/api/seo-backlinks.d.ts +2 -0
  2. package/dist/commands/api/seo-backlinks.js +132 -0
  3. package/dist/commands/api/seo-backlinks.js.map +1 -0
  4. package/dist/commands/api/seo-catalog.d.ts +2 -0
  5. package/dist/commands/api/seo-catalog.js +184 -0
  6. package/dist/commands/api/seo-catalog.js.map +1 -0
  7. package/dist/commands/api/seo-changes.d.ts +2 -0
  8. package/dist/commands/api/seo-changes.js +101 -0
  9. package/dist/commands/api/seo-changes.js.map +1 -0
  10. package/dist/commands/api/seo-data.d.ts +2 -0
  11. package/dist/commands/api/seo-data.js +175 -0
  12. package/dist/commands/api/seo-data.js.map +1 -0
  13. package/dist/commands/api/seo-keyword-writes.d.ts +2 -0
  14. package/dist/commands/api/seo-keyword-writes.js +134 -0
  15. package/dist/commands/api/seo-keyword-writes.js.map +1 -0
  16. package/dist/commands/api/seo-keywords.d.ts +2 -0
  17. package/dist/commands/api/seo-keywords.js +106 -0
  18. package/dist/commands/api/seo-keywords.js.map +1 -0
  19. package/dist/commands/api/seo-offers.d.ts +2 -0
  20. package/dist/commands/api/seo-offers.js +124 -0
  21. package/dist/commands/api/seo-offers.js.map +1 -0
  22. package/dist/commands/api/seo-page-writes.d.ts +2 -0
  23. package/dist/commands/api/seo-page-writes.js +130 -0
  24. package/dist/commands/api/seo-page-writes.js.map +1 -0
  25. package/dist/commands/api/seo-pages.d.ts +2 -0
  26. package/dist/commands/api/seo-pages.js +144 -0
  27. package/dist/commands/api/seo-pages.js.map +1 -0
  28. package/dist/commands/api/seo-settings.d.ts +2 -0
  29. package/dist/commands/api/seo-settings.js +148 -0
  30. package/dist/commands/api/seo-settings.js.map +1 -0
  31. package/dist/commands/api/seo-shared.d.ts +15 -0
  32. package/dist/commands/api/seo-shared.js +77 -0
  33. package/dist/commands/api/seo-shared.js.map +1 -0
  34. package/dist/commands/api/seo.d.ts +2 -0
  35. package/dist/commands/api/seo.js +25 -0
  36. package/dist/commands/api/seo.js.map +1 -0
  37. package/dist/index.js +5 -0
  38. package/dist/index.js.map +1 -1
  39. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-data.js","sourceRoot":"","sources":["../../../src/commands/api/seo-data.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const seoKeywordWriteCommands: Command[];
@@ -0,0 +1,134 @@
1
+ import { Command } from "commander";
2
+ import { api } from "../../lib/api.js";
3
+ import { handleError } from "../../lib/format.js";
4
+ import { compact, done, nullable, nullableInt, parseBool, readJsonFile, } from "./seo-shared.js";
5
+ function withFieldOptions(cmd) {
6
+ return cmd
7
+ .option("--hub <slug>", 'Hub slug ("null" to clear)')
8
+ .option("--offer <slug>", 'Offer this keyword sells ("null" to clear)')
9
+ .option("--category <name>", 'Category inside the hub ("null" to clear)')
10
+ .option("--page-id <id>", 'Page this keyword belongs to ("null" to clear)')
11
+ .option("--intent <intent>", "informational | navigational | commercial | transactional")
12
+ .option("--relevance <n>", "Relevance 1 to 10, lower is more relevant")
13
+ .option("--tracked <bool>", "Include in weekly rank tracking: true | false")
14
+ .option("--branded <bool>", "Branded keyword (own label): true | false")
15
+ .option("--source <source>", "competitor | search-console | keyword-ideas | manual")
16
+ .option("--notes <text>", 'SERP read notes ("null" to clear)');
17
+ }
18
+ function fieldPayload(opts) {
19
+ return compact({
20
+ hub: nullable(opts.hub),
21
+ offer: nullable(opts.offer),
22
+ category: nullable(opts.category),
23
+ pageId: nullable(opts.pageId),
24
+ intent: nullable(opts.intent),
25
+ relevance: nullableInt(opts.relevance, "relevance"),
26
+ tracked: opts.tracked !== undefined
27
+ ? parseBool(opts.tracked, "tracked")
28
+ : undefined,
29
+ branded: opts.branded !== undefined
30
+ ? parseBool(opts.branded, "branded")
31
+ : undefined,
32
+ source: nullable(opts.source),
33
+ notes: nullable(opts.notes),
34
+ });
35
+ }
36
+ function statusPayload(status, parkedReason) {
37
+ return status === "parked" ? { status, parkedReason } : { status };
38
+ }
39
+ const setCmd = withFieldOptions(new Command("set")
40
+ .description("Create or update a keyword keyed by (keyword, language); safe to rerun")
41
+ .argument("<keyword>", "The keyword as searched (stored lowercase)")
42
+ .requiredOption("--language <lang>", "en | fr"))
43
+ .option("--status <status>", "candidate | parked | targeted")
44
+ .option("--parked-reason <reason>", "With --status parked: high-da | listicle-serp | mixed-intent | off-offer | ambiguous | online-duplicate | other")
45
+ .option("--json", "Output as JSON")
46
+ .action(async (keyword, opts) => {
47
+ try {
48
+ let data = await api.post("/seo/keywords", {
49
+ keyword,
50
+ language: opts.language,
51
+ ...fieldPayload(opts),
52
+ });
53
+ const created = data.created;
54
+ if (opts.status) {
55
+ data = await api.post(`/seo/keywords/${data.id}/status`, statusPayload(opts.status, opts.parkedReason));
56
+ }
57
+ done({ ...data, created }, opts, `Keyword ${created ? "created" : "updated"}: ${data.keyword} (${data.id})`);
58
+ }
59
+ catch (err) {
60
+ handleError(err);
61
+ }
62
+ });
63
+ const updateCmd = withFieldOptions(new Command("update")
64
+ .description("Update a keyword's fields (status has its own command)")
65
+ .argument("<id>", "Keyword id"))
66
+ .option("--json", "Output as JSON")
67
+ .action(async (id, opts) => {
68
+ try {
69
+ const data = await api.post(`/seo/keywords/${id}`, fieldPayload(opts));
70
+ done(data, opts, `Keyword updated: ${data.keyword}`);
71
+ }
72
+ catch (err) {
73
+ handleError(err);
74
+ }
75
+ });
76
+ const statusCmd = new Command("status")
77
+ .description("Move a keyword to candidate, parked (with a reason), or targeted")
78
+ .argument("<id>", "Keyword id")
79
+ .argument("<status>", "candidate | parked | targeted")
80
+ .option("--parked-reason <reason>", "Required for parked: high-da | listicle-serp | mixed-intent | off-offer | ambiguous | online-duplicate | other")
81
+ .option("--json", "Output as JSON")
82
+ .action(async (id, status, opts) => {
83
+ try {
84
+ const data = await api.post(`/seo/keywords/${id}/status`, statusPayload(status, opts.parkedReason));
85
+ done(data, opts, `Keyword ${data.keyword}: ${data.status}`);
86
+ }
87
+ catch (err) {
88
+ handleError(err);
89
+ }
90
+ });
91
+ const metricsCmd = new Command("metrics")
92
+ .description("Set a keyword's volume, difficulty, and SERP read in one market")
93
+ .argument("<id>", "Keyword id")
94
+ .argument("<market>", "Market code (us, gb, fr, be, ch, lu, mc)")
95
+ .option("--search-volume <n>", 'Monthly search volume ("null" for no data)')
96
+ .option("--keyword-difficulty <n>", "Keyword difficulty 0 to 100")
97
+ .option("--serp-file <path>", "JSON array of the top results: {position, url, domain, title?, domainAuthority?, pageAuthority?, onPageScore?}")
98
+ .option("--checked-at <iso>", "When the data was read (defaults to now)")
99
+ .option("--json", "Output as JSON")
100
+ .action(async (id, market, opts) => {
101
+ try {
102
+ const data = await api.post(`/seo/keywords/${id}/metrics/${market}`, compact({
103
+ searchVolume: nullableInt(opts.searchVolume, "search-volume"),
104
+ keywordDifficulty: nullableInt(opts.keywordDifficulty, "keyword-difficulty"),
105
+ serp: opts.serpFile ? readJsonFile(opts.serpFile) : undefined,
106
+ checkedAt: opts.checkedAt,
107
+ }));
108
+ done(data, opts, `Metrics set for ${market}`);
109
+ }
110
+ catch (err) {
111
+ handleError(err);
112
+ }
113
+ });
114
+ const deleteCmd = new Command("delete")
115
+ .description("Delete a keyword with its metrics and rankings")
116
+ .argument("<id>", "Keyword id")
117
+ .option("--json", "Output as JSON")
118
+ .action(async (id, opts) => {
119
+ try {
120
+ const data = await api.delete(`/seo/keywords/${id}`);
121
+ done(data, opts, `Keyword deleted: ${id}`);
122
+ }
123
+ catch (err) {
124
+ handleError(err);
125
+ }
126
+ });
127
+ export const seoKeywordWriteCommands = [
128
+ setCmd,
129
+ updateCmd,
130
+ statusCmd,
131
+ metricsCmd,
132
+ deleteCmd,
133
+ ];
134
+ //# sourceMappingURL=seo-keyword-writes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-keyword-writes.js","sourceRoot":"","sources":["../../../src/commands/api/seo-keyword-writes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const seoKeywordCommand: Command;
@@ -0,0 +1,106 @@
1
+ import { Command } from "commander";
2
+ import chalk from "chalk";
3
+ import { api } from "../../lib/api.js";
4
+ import { handleError, printDetail, printList } from "../../lib/format.js";
5
+ import { printJson, qs } from "./seo-shared.js";
6
+ import { seoKeywordWriteCommands } from "./seo-keyword-writes.js";
7
+ const listCmd = new Command("list")
8
+ .description("List keywords with per-market volume and latest position")
9
+ .option("--language <lang>", "en | fr")
10
+ .option("--status <status>", "candidate | parked | targeted")
11
+ .option("--hub <slug>", "Hub slug")
12
+ .option("--offer <slug>", "Offer slug")
13
+ .option("--page-id <id>", "Keywords of one page")
14
+ .option("--tracked <bool>", "true | false")
15
+ .option("--q <text>", "Keyword contains")
16
+ .option("--page <n>", "Page number (default 1)")
17
+ .option("--page-size <n>", "Page size (default 100, max 1000)")
18
+ .option("--json", "Output as JSON")
19
+ .action(async (opts) => {
20
+ try {
21
+ const { data, meta } = await api.getWithMeta(`/seo/keywords${qs({
22
+ language: opts.language,
23
+ status: opts.status,
24
+ hub: opts.hub,
25
+ offer: opts.offer,
26
+ pageId: opts.pageId,
27
+ tracked: opts.tracked,
28
+ q: opts.q,
29
+ page: opts.page,
30
+ pageSize: opts.pageSize,
31
+ })}`);
32
+ if (opts.json) {
33
+ printJson({ data, meta });
34
+ return;
35
+ }
36
+ printList(data.map((k) => ({
37
+ ...k,
38
+ markets: (k.markets ?? [])
39
+ .map((m) => `${m.market}:${m.searchVolume ?? "-"}/#${m.position ?? "-"}`)
40
+ .join(" "),
41
+ state: k.status === "parked" ? `parked (${k.parkedReason})` : k.status,
42
+ })), [
43
+ { key: "keyword", label: "Keyword", width: 36 },
44
+ { key: "language", label: "Lang", width: 4 },
45
+ { key: "state", label: "Status", width: 22 },
46
+ { key: "offerSlug", label: "Offer", width: 14 },
47
+ { key: "pagePath", label: "Page", width: 28 },
48
+ { key: "markets", label: "Market:volume/#position", width: 30 },
49
+ { key: "id", label: "Id", width: 36 },
50
+ ], opts);
51
+ if (meta) {
52
+ console.log(chalk.dim(`page ${meta.page}/${meta.totalPages}, ${meta.total} total`));
53
+ }
54
+ }
55
+ catch (err) {
56
+ handleError(err);
57
+ }
58
+ });
59
+ const getCmd = new Command("get")
60
+ .description("Show a keyword with its SERP reads per market and rank history")
61
+ .argument("<id>", "Keyword id")
62
+ .option("--json", "Output as JSON")
63
+ .action(async (id, opts) => {
64
+ try {
65
+ const data = await api.get(`/seo/keywords/${id}`);
66
+ if (opts.json) {
67
+ printJson(data);
68
+ return;
69
+ }
70
+ printDetail(data, [
71
+ { key: "keyword", label: "Keyword" },
72
+ { key: "language", label: "Language" },
73
+ { key: "status", label: "Status" },
74
+ { key: "parkedReason", label: "Parked reason" },
75
+ { key: "offerSlug", label: "Offer" },
76
+ { key: "hubSlug", label: "Hub" },
77
+ { key: "category", label: "Category" },
78
+ { key: "pagePath", label: "Page" },
79
+ { key: "intent", label: "Intent" },
80
+ { key: "relevance", label: "Relevance" },
81
+ { key: "tracked", label: "Tracked" },
82
+ { key: "branded", label: "Branded" },
83
+ { key: "source", label: "Source" },
84
+ { key: "notes", label: "Notes" },
85
+ ], opts);
86
+ for (const m of data.metrics) {
87
+ const serp = (m.serp ?? [])
88
+ .map((r) => `#${r.position} ${r.domain} DA${r.domainAuthority ?? "?"}`)
89
+ .join(", ");
90
+ console.log(` ${chalk.cyan(m.market)} volume ${m.searchVolume ?? "-"}, KD ${m.keywordDifficulty ?? "-"}${serp ? chalk.dim(`\n ${serp}`) : ""}`);
91
+ }
92
+ if (data.rankings.length) {
93
+ console.log(chalk.dim(` ${data.rankings.length} ranking rows`));
94
+ }
95
+ }
96
+ catch (err) {
97
+ handleError(err);
98
+ }
99
+ });
100
+ export const seoKeywordCommand = new Command("keyword")
101
+ .description("Keywords per language, qualified by SERP read, linked to pages")
102
+ .addCommand(listCmd)
103
+ .addCommand(getCmd);
104
+ for (const cmd of seoKeywordWriteCommands)
105
+ seoKeywordCommand.addCommand(cmd);
106
+ //# sourceMappingURL=seo-keywords.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-keywords.js","sourceRoot":"","sources":["../../../src/commands/api/seo-keywords.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const seoOfferCommand: Command;
@@ -0,0 +1,124 @@
1
+ import { Command } from "commander";
2
+ import { api } from "../../lib/api.js";
3
+ import { handleError, printList } from "../../lib/format.js";
4
+ import { compact, done, nullable, printJson, readJsonObject, toInt, } from "./seo-shared.js";
5
+ const list = new Command("list")
6
+ .description("List offers with how many keywords point at each")
7
+ .option("--json", "Output as JSON")
8
+ .action(async (opts) => {
9
+ try {
10
+ const data = await api.get("/seo/offers");
11
+ printList(data, [
12
+ { key: "slug", label: "Slug", width: 18 },
13
+ { key: "name", label: "Name", width: 22 },
14
+ { key: "status", label: "Status", width: 8 },
15
+ { key: "priority", label: "Priority", width: 8 },
16
+ { key: "keywordCount", label: "Keywords", width: 8 },
17
+ { key: "archivedAt", label: "Archived", width: 24 },
18
+ ], opts);
19
+ }
20
+ catch (err) {
21
+ handleError(err);
22
+ }
23
+ });
24
+ const get = new Command("get")
25
+ .description("Show an offer with its buyer-side fields")
26
+ .argument("<slug>", "Offer slug")
27
+ .option("--json", "Output as JSON")
28
+ .action(async (slug, opts) => {
29
+ try {
30
+ const offer = (await api.get("/seo/offers")).find((o) => o.slug === slug);
31
+ if (!offer)
32
+ throw new Error(`Offer not found: ${slug}`);
33
+ if (opts.json)
34
+ return printJson(offer);
35
+ const lines = [
36
+ ["Name", offer.name],
37
+ ["Status", `${offer.status}, priority ${offer.priority}`],
38
+ ["Summary", offer.summary],
39
+ ["Buyers", offer.buyers],
40
+ ["Triggers", offer.triggers],
41
+ ["Buyer words (en)", offer.buyerWords.en],
42
+ ["Buyer words (fr)", offer.buyerWords.fr],
43
+ ["Not this", offer.notThis],
44
+ ["Notes", offer.notes],
45
+ ["Keywords", String(offer.keywordCount)],
46
+ ];
47
+ for (const [label, value] of lines) {
48
+ if (value)
49
+ console.log(`${label}:\n${value}\n`);
50
+ }
51
+ }
52
+ catch (err) {
53
+ handleError(err);
54
+ }
55
+ });
56
+ const set = new Command("set")
57
+ .description("Create or update an offer keyed by slug (--name required on create)")
58
+ .argument("<slug>", "Offer slug, kebab-case, immutable")
59
+ .option("--name <name>", "Display name")
60
+ .option("--status <status>", "selling | early | paused")
61
+ .option("--priority <priority>", "push | steady | hold")
62
+ .option("--position <n>", "Sort position")
63
+ .option("--summary <text>", 'What the buyer gets ("null" to clear)')
64
+ .option("--buyers <text>", 'Who buys it ("null" to clear)')
65
+ .option("--triggers <text>", 'What makes them look ("null" to clear)')
66
+ .option("--words-en <text>", 'Their words in English ("null" to clear)')
67
+ .option("--words-fr <text>", 'Their words in French ("null" to clear)')
68
+ .option("--not-this <text>", 'What it is not ("null" to clear)')
69
+ .option("--notes <text>", 'Notes ("null" to clear)')
70
+ .option("--file <path>", "JSON object with any of the fields above (camelCase, buyerWords as {en, fr}); flags win")
71
+ .option("--json", "Output as JSON")
72
+ .action(async (slug, opts) => {
73
+ try {
74
+ const fromFile = opts.file ? readJsonObject(opts.file) : {};
75
+ const words = compact({
76
+ en: nullable(opts.wordsEn),
77
+ fr: nullable(opts.wordsFr),
78
+ });
79
+ const data = await api.post("/seo/offers", {
80
+ ...fromFile,
81
+ ...compact({
82
+ slug,
83
+ name: opts.name,
84
+ status: opts.status,
85
+ priority: opts.priority,
86
+ position: opts.position !== undefined
87
+ ? toInt(opts.position, "position")
88
+ : undefined,
89
+ summary: nullable(opts.summary),
90
+ buyers: nullable(opts.buyers),
91
+ triggers: nullable(opts.triggers),
92
+ buyerWords: Object.keys(words).length
93
+ ? { ...fromFile.buyerWords, ...words }
94
+ : undefined,
95
+ notThis: nullable(opts.notThis),
96
+ notes: nullable(opts.notes),
97
+ }),
98
+ });
99
+ done(data, opts, `Offer set: ${slug}`);
100
+ }
101
+ catch (err) {
102
+ handleError(err);
103
+ }
104
+ });
105
+ const archive = new Command("archive")
106
+ .description("Archive an offer (never deleted; keywords keep pointing at it)")
107
+ .argument("<slug>", "Offer slug")
108
+ .option("--json", "Output as JSON")
109
+ .action(async (slug, opts) => {
110
+ try {
111
+ const data = await api.post(`/seo/offers/${encodeURIComponent(slug)}/archive`, {});
112
+ done(data, opts, `Archived offer ${slug}`);
113
+ }
114
+ catch (err) {
115
+ handleError(err);
116
+ }
117
+ });
118
+ export const seoOfferCommand = new Command("offer")
119
+ .description("What we sell, as the buyer sees it; keyword research judges relevance against it")
120
+ .addCommand(list)
121
+ .addCommand(get)
122
+ .addCommand(set)
123
+ .addCommand(archive);
124
+ //# sourceMappingURL=seo-offers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-offers.js","sourceRoot":"","sources":["../../../src/commands/api/seo-offers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const seoPageWriteCommands: Command[];
@@ -0,0 +1,130 @@
1
+ import { Command } from "commander";
2
+ import { api } from "../../lib/api.js";
3
+ import { handleError } from "../../lib/format.js";
4
+ import { compact, done, nullable, nullableInt, readJsonObject, } from "./seo-shared.js";
5
+ function withContentOptions(cmd) {
6
+ return cmd
7
+ .option("--hub <slug>", 'Hub slug ("null" to clear)')
8
+ .option("--category <name>", 'Category inside the hub ("null" to clear)')
9
+ .option("--primary-keyword-id <id>", 'Primary keyword ("null" to clear)')
10
+ .option("--title <text>", "Page title: Keyword | Benefit | ITzWorking")
11
+ .option("--meta-description <text>", "Meta description (120 to 158 chars)")
12
+ .option("--og-title <text>", "Open Graph title")
13
+ .option("--og-description <text>", "Open Graph description")
14
+ .option("--h1 <text>", "H1")
15
+ .option("--intro <text>", "Opening paragraph (keyword near the start)")
16
+ .option("--on-page-score <n>", "On-page grader score 0 to 100")
17
+ .option("--notes <text>", 'Content notes ("null" to clear)')
18
+ .option("--file <path>", "JSON object merged into the payload for structured fields: brief {searcher, want, goal}, sections [{heading, body}], cta {label, url}, images [{fileId, alt}]; flags win over the file");
19
+ }
20
+ function contentPayload(opts) {
21
+ const fromFile = opts.file ? readJsonObject(opts.file) : {};
22
+ return {
23
+ ...fromFile,
24
+ ...compact({
25
+ hub: nullable(opts.hub),
26
+ category: nullable(opts.category),
27
+ primaryKeywordId: nullable(opts.primaryKeywordId),
28
+ title: nullable(opts.title),
29
+ metaDescription: nullable(opts.metaDescription),
30
+ ogTitle: nullable(opts.ogTitle),
31
+ ogDescription: nullable(opts.ogDescription),
32
+ h1: nullable(opts.h1),
33
+ intro: nullable(opts.intro),
34
+ onPageScore: nullableInt(opts.onPageScore, "on-page-score"),
35
+ notes: nullable(opts.notes),
36
+ }),
37
+ };
38
+ }
39
+ const createCmd = withContentOptions(new Command("create")
40
+ .description("Track a page: nexus pages start planned, code pages (already on the site) start published")
41
+ .requiredOption("--path <path>", "URL path as served (/services/x, /fr/...)")
42
+ .requiredOption("--language <lang>", "en | fr (must match the path prefix)")
43
+ .option("--managed-by <who>", "nexus (default) | code"))
44
+ .option("--json", "Output as JSON")
45
+ .action(async (opts) => {
46
+ try {
47
+ const data = await api.post("/seo/pages", {
48
+ ...contentPayload(opts),
49
+ ...compact({
50
+ path: opts.path,
51
+ language: opts.language,
52
+ managedBy: opts.managedBy,
53
+ }),
54
+ });
55
+ done(data, opts, `Page created: ${data.path} (${data.id})`);
56
+ }
57
+ catch (err) {
58
+ handleError(err);
59
+ }
60
+ });
61
+ const updateCmd = withContentOptions(new Command("update")
62
+ .description("Update a page's content and placement (status has its own command)")
63
+ .argument("<id>", "Page id")
64
+ .option("--path <path>", "New path (refused once published)"))
65
+ .option("--json", "Output as JSON")
66
+ .action(async (id, opts) => {
67
+ try {
68
+ const data = await api.post(`/seo/pages/${id}`, {
69
+ ...contentPayload(opts),
70
+ ...compact({ path: opts.path }),
71
+ });
72
+ done(data, opts, `Page updated: ${data.path}`);
73
+ }
74
+ catch (err) {
75
+ handleError(err);
76
+ }
77
+ });
78
+ const statusCmd = new Command("status")
79
+ .description("Move a page through planned, drafted, approved, published, retired (approve and publish are human acts)")
80
+ .argument("<id>", "Page id")
81
+ .argument("<status>", "planned | drafted | approved | published | retired")
82
+ .option("--json", "Output as JSON")
83
+ .action(async (id, status, opts) => {
84
+ try {
85
+ const data = await api.post(`/seo/pages/${id}/status`, {
86
+ status,
87
+ });
88
+ done(data, opts, `Page ${data.path}: ${data.status}`);
89
+ }
90
+ catch (err) {
91
+ handleError(err);
92
+ }
93
+ });
94
+ const alternateCmd = new Command("alternate")
95
+ .description("Pair a page with its counterpart in the other language (hreflang)")
96
+ .argument("<id>", "Page id")
97
+ .argument("<pageId>", 'Counterpart page id, or "none" to unpair')
98
+ .option("--json", "Output as JSON")
99
+ .action(async (id, pageId, opts) => {
100
+ try {
101
+ const data = await api.post(`/seo/pages/${id}/alternate`, {
102
+ pageId: pageId === "none" ? null : pageId,
103
+ });
104
+ done(data, opts, `Alternate set on ${data.path}`);
105
+ }
106
+ catch (err) {
107
+ handleError(err);
108
+ }
109
+ });
110
+ const deleteCmd = new Command("delete")
111
+ .description("Delete a page that never went live (published pages are retired instead)")
112
+ .argument("<id>", "Page id")
113
+ .option("--json", "Output as JSON")
114
+ .action(async (id, opts) => {
115
+ try {
116
+ const data = await api.delete(`/seo/pages/${id}`);
117
+ done(data, opts, `Page deleted: ${id}`);
118
+ }
119
+ catch (err) {
120
+ handleError(err);
121
+ }
122
+ });
123
+ export const seoPageWriteCommands = [
124
+ createCmd,
125
+ updateCmd,
126
+ statusCmd,
127
+ alternateCmd,
128
+ deleteCmd,
129
+ ];
130
+ //# sourceMappingURL=seo-page-writes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seo-page-writes.js","sourceRoot":"","sources":["../../../src/commands/api/seo-page-writes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import { Command } from "commander";
2
+ export declare const seoPageCommand: Command;