@se-studio/contentful-cms 1.0.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.
Files changed (173) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +519 -0
  3. package/dist/bin/cms-edit.d.ts +4 -0
  4. package/dist/bin/cms-edit.d.ts.map +1 -0
  5. package/dist/bin/cms-edit.js +101 -0
  6. package/dist/bin/cms-edit.js.map +1 -0
  7. package/dist/commands/add.d.ts +4 -0
  8. package/dist/commands/add.d.ts.map +1 -0
  9. package/dist/commands/add.js +166 -0
  10. package/dist/commands/add.js.map +1 -0
  11. package/dist/commands/asset.d.ts +4 -0
  12. package/dist/commands/asset.d.ts.map +1 -0
  13. package/dist/commands/asset.js +110 -0
  14. package/dist/commands/asset.js.map +1 -0
  15. package/dist/commands/colours.d.ts +4 -0
  16. package/dist/commands/colours.d.ts.map +1 -0
  17. package/dist/commands/colours.js +91 -0
  18. package/dist/commands/colours.js.map +1 -0
  19. package/dist/commands/create.d.ts +4 -0
  20. package/dist/commands/create.d.ts.map +1 -0
  21. package/dist/commands/create.js +223 -0
  22. package/dist/commands/create.js.map +1 -0
  23. package/dist/commands/diff.d.ts +4 -0
  24. package/dist/commands/diff.d.ts.map +1 -0
  25. package/dist/commands/diff.js +141 -0
  26. package/dist/commands/diff.js.map +1 -0
  27. package/dist/commands/discard.d.ts +4 -0
  28. package/dist/commands/discard.d.ts.map +1 -0
  29. package/dist/commands/discard.js +36 -0
  30. package/dist/commands/discard.js.map +1 -0
  31. package/dist/commands/entry-search.d.ts +4 -0
  32. package/dist/commands/entry-search.d.ts.map +1 -0
  33. package/dist/commands/entry-search.js +81 -0
  34. package/dist/commands/entry-search.js.map +1 -0
  35. package/dist/commands/export-converted.d.ts +8 -0
  36. package/dist/commands/export-converted.d.ts.map +1 -0
  37. package/dist/commands/export-converted.js +62 -0
  38. package/dist/commands/export-converted.js.map +1 -0
  39. package/dist/commands/links.d.ts +4 -0
  40. package/dist/commands/links.d.ts.map +1 -0
  41. package/dist/commands/links.js +255 -0
  42. package/dist/commands/links.js.map +1 -0
  43. package/dist/commands/list.d.ts +4 -0
  44. package/dist/commands/list.d.ts.map +1 -0
  45. package/dist/commands/list.js +91 -0
  46. package/dist/commands/list.js.map +1 -0
  47. package/dist/commands/move.d.ts +3 -0
  48. package/dist/commands/move.d.ts.map +1 -0
  49. package/dist/commands/move.js +84 -0
  50. package/dist/commands/move.js.map +1 -0
  51. package/dist/commands/nav.d.ts +4 -0
  52. package/dist/commands/nav.d.ts.map +1 -0
  53. package/dist/commands/nav.js +196 -0
  54. package/dist/commands/nav.js.map +1 -0
  55. package/dist/commands/open.d.ts +4 -0
  56. package/dist/commands/open.d.ts.map +1 -0
  57. package/dist/commands/open.js +74 -0
  58. package/dist/commands/open.js.map +1 -0
  59. package/dist/commands/read.d.ts +4 -0
  60. package/dist/commands/read.d.ts.map +1 -0
  61. package/dist/commands/read.js +102 -0
  62. package/dist/commands/read.js.map +1 -0
  63. package/dist/commands/remove.d.ts +4 -0
  64. package/dist/commands/remove.d.ts.map +1 -0
  65. package/dist/commands/remove.js +98 -0
  66. package/dist/commands/remove.js.map +1 -0
  67. package/dist/commands/rtf.d.ts +3 -0
  68. package/dist/commands/rtf.d.ts.map +1 -0
  69. package/dist/commands/rtf.js +131 -0
  70. package/dist/commands/rtf.js.map +1 -0
  71. package/dist/commands/save.d.ts +4 -0
  72. package/dist/commands/save.d.ts.map +1 -0
  73. package/dist/commands/save.js +59 -0
  74. package/dist/commands/save.js.map +1 -0
  75. package/dist/commands/screenshot.d.ts +4 -0
  76. package/dist/commands/screenshot.d.ts.map +1 -0
  77. package/dist/commands/screenshot.js +246 -0
  78. package/dist/commands/screenshot.js.map +1 -0
  79. package/dist/commands/set.d.ts +3 -0
  80. package/dist/commands/set.d.ts.map +1 -0
  81. package/dist/commands/set.js +152 -0
  82. package/dist/commands/set.js.map +1 -0
  83. package/dist/commands/skill.d.ts +4 -0
  84. package/dist/commands/skill.d.ts.map +1 -0
  85. package/dist/commands/skill.js +73 -0
  86. package/dist/commands/skill.js.map +1 -0
  87. package/dist/commands/snapshot.d.ts +3 -0
  88. package/dist/commands/snapshot.d.ts.map +1 -0
  89. package/dist/commands/snapshot.js +21 -0
  90. package/dist/commands/snapshot.js.map +1 -0
  91. package/dist/commands/types.d.ts +4 -0
  92. package/dist/commands/types.d.ts.map +1 -0
  93. package/dist/commands/types.js +78 -0
  94. package/dist/commands/types.js.map +1 -0
  95. package/dist/config/load.d.ts +14 -0
  96. package/dist/config/load.d.ts.map +1 -0
  97. package/dist/config/load.js +79 -0
  98. package/dist/config/load.js.map +1 -0
  99. package/dist/config/types.d.ts +13 -0
  100. package/dist/config/types.d.ts.map +1 -0
  101. package/dist/config/types.js +2 -0
  102. package/dist/config/types.js.map +1 -0
  103. package/dist/contentful/assets.d.ts +20 -0
  104. package/dist/contentful/assets.d.ts.map +1 -0
  105. package/dist/contentful/assets.js +36 -0
  106. package/dist/contentful/assets.js.map +1 -0
  107. package/dist/contentful/client.d.ts +28 -0
  108. package/dist/contentful/client.d.ts.map +1 -0
  109. package/dist/contentful/client.js +30 -0
  110. package/dist/contentful/client.js.map +1 -0
  111. package/dist/contentful/fetch.d.ts +20 -0
  112. package/dist/contentful/fetch.d.ts.map +1 -0
  113. package/dist/contentful/fetch.js +154 -0
  114. package/dist/contentful/fetch.js.map +1 -0
  115. package/dist/contentful/references.d.ts +7 -0
  116. package/dist/contentful/references.d.ts.map +1 -0
  117. package/dist/contentful/references.js +12 -0
  118. package/dist/contentful/references.js.map +1 -0
  119. package/dist/contentful/write.d.ts +16 -0
  120. package/dist/contentful/write.d.ts.map +1 -0
  121. package/dist/contentful/write.js +75 -0
  122. package/dist/contentful/write.js.map +1 -0
  123. package/dist/index.d.ts +3 -0
  124. package/dist/index.d.ts.map +1 -0
  125. package/dist/index.js +2 -0
  126. package/dist/index.js.map +1 -0
  127. package/dist/output/json.d.ts +47 -0
  128. package/dist/output/json.d.ts.map +1 -0
  129. package/dist/output/json.js +87 -0
  130. package/dist/output/json.js.map +1 -0
  131. package/dist/output/mode.d.ts +3 -0
  132. package/dist/output/mode.d.ts.map +1 -0
  133. package/dist/output/mode.js +16 -0
  134. package/dist/output/mode.js.map +1 -0
  135. package/dist/output/print.d.ts +14 -0
  136. package/dist/output/print.d.ts.map +1 -0
  137. package/dist/output/print.js +61 -0
  138. package/dist/output/print.js.map +1 -0
  139. package/dist/rtf/fromMarkdown.d.ts +19 -0
  140. package/dist/rtf/fromMarkdown.d.ts.map +1 -0
  141. package/dist/rtf/fromMarkdown.js +230 -0
  142. package/dist/rtf/fromMarkdown.js.map +1 -0
  143. package/dist/rtf/toMarkdown.d.ts +6 -0
  144. package/dist/rtf/toMarkdown.d.ts.map +1 -0
  145. package/dist/rtf/toMarkdown.js +105 -0
  146. package/dist/rtf/toMarkdown.js.map +1 -0
  147. package/dist/session/refs.d.ts +35 -0
  148. package/dist/session/refs.d.ts.map +1 -0
  149. package/dist/session/refs.js +128 -0
  150. package/dist/session/refs.js.map +1 -0
  151. package/dist/session/state.d.ts +91 -0
  152. package/dist/session/state.d.ts.map +1 -0
  153. package/dist/session/state.js +61 -0
  154. package/dist/session/state.js.map +1 -0
  155. package/dist/session/store.d.ts +10 -0
  156. package/dist/session/store.d.ts.map +1 -0
  157. package/dist/session/store.js +62 -0
  158. package/dist/session/store.js.map +1 -0
  159. package/dist/snapshot/render.d.ts +15 -0
  160. package/dist/snapshot/render.d.ts.map +1 -0
  161. package/dist/snapshot/render.js +166 -0
  162. package/dist/snapshot/render.js.map +1 -0
  163. package/dist/validation/allowed-types.d.ts +7 -0
  164. package/dist/validation/allowed-types.d.ts.map +1 -0
  165. package/dist/validation/allowed-types.js +16 -0
  166. package/dist/validation/allowed-types.js.map +1 -0
  167. package/package.json +61 -0
  168. package/skills/core/SKILL.md +483 -0
  169. package/skills/manifest.json +7 -0
  170. package/skills/navigation/SKILL.md +18 -0
  171. package/skills/rich-text/SKILL.md +23 -0
  172. package/skills/screenshots/SKILL.md +32 -0
  173. package/skills/templates/SKILL.md +16 -0
@@ -0,0 +1,196 @@
1
+ /** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
2
+ import pc from 'picocolors';
3
+ import { loadConfig, resolveSpaceConfig } from '../config/load.js';
4
+ import { createSafeEnvironment } from '../contentful/client.js';
5
+ import { fetchEntryTree, findEntryBySlug, serializeEntry } from '../contentful/fetch.js';
6
+ import { isJsonMode } from '../output/mode.js';
7
+ import { errorMsg, successMsg } from '../output/print.js';
8
+ import { buildTree, getNavigationItemsFieldName, makeEntryLink, resolveRefToId, } from '../session/refs.js';
9
+ import { requireSession, saveSession } from '../session/store.js';
10
+ export function registerNavCommand(program) {
11
+ const nav = program.command('nav').description('Manage navigation entries');
12
+ nav
13
+ .command('open <slug-or-id>')
14
+ .description('Load a navigation entry by slug or ID')
15
+ .option('--id', 'Treat argument as entry ID')
16
+ .action(async (slugOrId, opts, cmd) => {
17
+ const parentOpts = cmd.parent?.parent?.opts() ?? {};
18
+ try {
19
+ const config = loadConfig(parentOpts.config);
20
+ const { key, space } = resolveSpaceConfig(config, parentOpts.space);
21
+ const env = await createSafeEnvironment(space);
22
+ const locale = space.defaultLocale;
23
+ let navEntry;
24
+ if (opts.id) {
25
+ navEntry = await env.getEntry(slugOrId);
26
+ }
27
+ else {
28
+ const found = await env.getEntries({
29
+ content_type: 'navigation',
30
+ 'fields.slug': slugOrId,
31
+ limit: 1,
32
+ });
33
+ navEntry = found.items[0] ?? (await findEntryBySlug(env, slugOrId, locale));
34
+ }
35
+ if (!navEntry) {
36
+ errorMsg(`Navigation entry "${slugOrId}" not found.`);
37
+ process.exit(1);
38
+ return;
39
+ }
40
+ const rootEntryId = navEntry.sys.id;
41
+ const entries = await fetchEntryTree(env, rootEntryId);
42
+ entries[rootEntryId] = serializeEntry(navEntry);
43
+ const { refs, refsByEntry, treeNodes } = buildTree(rootEntryId, entries, locale);
44
+ const session = {
45
+ version: 1,
46
+ spaceKey: key,
47
+ spaceId: space.spaceId,
48
+ environment: space.environment,
49
+ defaultLocale: locale,
50
+ rootEntryId,
51
+ rootEntryType: 'navigation',
52
+ fetchedAt: new Date().toISOString(),
53
+ entries,
54
+ originalEntries: JSON.parse(JSON.stringify(entries)),
55
+ refs,
56
+ refsByEntry,
57
+ treeNodes,
58
+ modifiedEntryIds: [],
59
+ pendingDeletions: [],
60
+ };
61
+ saveSession(session);
62
+ printNavTree(session, locale);
63
+ }
64
+ catch (err) {
65
+ errorMsg(err instanceof Error ? err.message : String(err));
66
+ process.exit(1);
67
+ }
68
+ });
69
+ nav
70
+ .command('add')
71
+ .description('Add a navigation item to the navigation')
72
+ .requiredOption('--label <label>', 'Display label')
73
+ .option('--slug <slug>', 'Link to a page by slug')
74
+ .option('--href <href>', 'External URL')
75
+ .option('--after <ref>', 'Insert after this ref')
76
+ .action(async (opts, _cmd, cmd2) => {
77
+ const parentOpts = cmd2.parent?.parent?.opts() ?? {};
78
+ try {
79
+ const session = requireSession();
80
+ const locale = session.defaultLocale;
81
+ const config = loadConfig(parentOpts.config);
82
+ const { space } = resolveSpaceConfig(config, session.spaceKey);
83
+ const env = await createSafeEnvironment(space);
84
+ const fields = {
85
+ label: { [locale]: opts.label },
86
+ };
87
+ if (opts.slug) {
88
+ const slugValue = opts.slug.startsWith('/') ? opts.slug.slice(1) : opts.slug;
89
+ const pages = await env.getEntries({
90
+ 'fields.slug': slugValue,
91
+ 'content_type[in]': 'page,article',
92
+ limit: 1,
93
+ });
94
+ const page = pages.items[0];
95
+ if (page) {
96
+ fields['page'] = {
97
+ [locale]: { sys: { type: 'Link', linkType: 'Entry', id: page.sys.id } },
98
+ };
99
+ }
100
+ }
101
+ else if (opts.href) {
102
+ fields['externalUrl'] = { [locale]: opts.href };
103
+ }
104
+ const navItem = await env.createEntry('navigationItem', fields);
105
+ session.entries[navItem.sys.id] = serializeEntry(navItem);
106
+ const rootEntry = session.entries[session.rootEntryId];
107
+ if (!rootEntry) {
108
+ errorMsg('Root entry not found in session.');
109
+ process.exit(1);
110
+ return;
111
+ }
112
+ const itemsFieldId = getNavigationItemsFieldName(rootEntry, locale);
113
+ if (!rootEntry.fields[itemsFieldId]) {
114
+ rootEntry.fields[itemsFieldId] = {};
115
+ }
116
+ const itemsMap = rootEntry.fields[itemsFieldId];
117
+ if (!itemsMap[locale])
118
+ itemsMap[locale] = [];
119
+ const arr = itemsMap[locale];
120
+ if (opts.after) {
121
+ const afterId = resolveRefToId(session, opts.after);
122
+ const afterIdx = arr.findIndex((item) => isEntryLink(item) && item.sys.id === afterId);
123
+ arr.splice(afterIdx >= 0 ? afterIdx + 1 : arr.length, 0, makeEntryLink(navItem.sys.id));
124
+ }
125
+ else {
126
+ arr.push(makeEntryLink(navItem.sys.id));
127
+ }
128
+ if (!session.modifiedEntryIds.includes(session.rootEntryId)) {
129
+ session.modifiedEntryIds.push(session.rootEntryId);
130
+ }
131
+ const { refs, refsByEntry, treeNodes } = buildTree(session.rootEntryId, session.entries, locale);
132
+ session.refs = refs;
133
+ session.refsByEntry = refsByEntry;
134
+ session.treeNodes = treeNodes;
135
+ saveSession(session);
136
+ successMsg(`Added nav item "${opts.label}" (${navItem.sys.id})`);
137
+ printNavTree(session, locale);
138
+ }
139
+ catch (err) {
140
+ errorMsg(err instanceof Error ? err.message : String(err));
141
+ process.exit(1);
142
+ }
143
+ });
144
+ nav
145
+ .command('remove <ref>')
146
+ .description('Remove a navigation item')
147
+ .action((_ref, _opts, _cmd) => {
148
+ errorMsg('Use "cms-edit remove <ref>" to remove a navigation item from its parent.');
149
+ });
150
+ }
151
+ function printNavTree(session, locale) {
152
+ if (isJsonMode()) {
153
+ const items = session.treeNodes
154
+ .filter((n) => n.entryId !== session.rootEntryId)
155
+ .map((node) => {
156
+ const entry = session.entries[node.entryId];
157
+ if (!entry)
158
+ return null;
159
+ const f = entry.fields;
160
+ const getField = (id) => f[id]?.[locale] ?? f[id]?.['en-US'] ?? null;
161
+ return {
162
+ ref: node.ref,
163
+ entryId: node.entryId,
164
+ label: getField('label'),
165
+ externalUrl: getField('externalUrl'),
166
+ page: f['page']
167
+ ? { id: f['page'][locale]?.sys?.id ?? null }
168
+ : null,
169
+ depth: node.depth,
170
+ parentRef: session.treeNodes.find((n) => n.entryId === node.parentId)?.ref ?? null,
171
+ };
172
+ })
173
+ .filter((x) => x !== null);
174
+ console.log(JSON.stringify({ rootId: session.rootEntryId, items }, null, 2));
175
+ return;
176
+ }
177
+ console.log(`\n${pc.bold('Navigation:')} ${pc.dim(session.rootEntryId)}\n`);
178
+ for (const node of session.treeNodes) {
179
+ if (node.entryId === session.rootEntryId)
180
+ continue;
181
+ const entry = session.entries[node.entryId];
182
+ if (!entry)
183
+ continue;
184
+ const label = String(entry.fields['label']?.[locale] ?? entry.fields['label']?.['en-US'] ?? node.entryId);
185
+ const indent = ' '.repeat(node.depth);
186
+ console.log(`${indent}${pc.bold(node.ref)} ${pc.cyan(label)}`);
187
+ }
188
+ console.log('');
189
+ }
190
+ function isEntryLink(item) {
191
+ return (typeof item === 'object' &&
192
+ item !== null &&
193
+ 'sys' in item &&
194
+ item.sys?.linkType === 'Entry');
195
+ }
196
+ //# sourceMappingURL=nav.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nav.js","sourceRoot":"","sources":["../../src/commands/nav.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
2
+ import type { Command } from 'commander';
3
+ export declare function registerOpenCommand(program: Command): void;
4
+ //# sourceMappingURL=open.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.d.ts","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyE1D"}
@@ -0,0 +1,74 @@
1
+ import { loadConfig, resolveSpaceConfig } from '../config/load.js';
2
+ import { createSafeEnvironment } from '../contentful/client.js';
3
+ import { fetchEntryTree, findEntryBySlug, serializeEntry } from '../contentful/fetch.js';
4
+ import { errorMsg, infoMsg } from '../output/print.js';
5
+ import { buildTree } from '../session/refs.js';
6
+ import { saveSession } from '../session/store.js';
7
+ import { renderSnapshot } from '../snapshot/render.js';
8
+ export function registerOpenCommand(program) {
9
+ program
10
+ .command('open <slug-or-id>')
11
+ .description('Load a page, article, template, or navigation by slug (or entry ID with --id) and start a session')
12
+ .option('--id', 'Treat the argument as a Contentful entry ID instead of a slug')
13
+ .action(async (slugOrId, opts, cmd) => {
14
+ const parentOpts = cmd.parent?.opts() ?? {};
15
+ try {
16
+ const config = loadConfig(parentOpts.config);
17
+ const { key, space } = resolveSpaceConfig(config, parentOpts.space);
18
+ const env = await createSafeEnvironment(space);
19
+ const locale = space.defaultLocale;
20
+ infoMsg(`Loading ${opts.id ? 'entry' : 'slug'} "${slugOrId}" from space "${key}"…`);
21
+ let rootEntry;
22
+ if (opts.id) {
23
+ rootEntry = await env.getEntry(slugOrId);
24
+ }
25
+ else {
26
+ const found = await findEntryBySlug(env, slugOrId, locale);
27
+ if (!found) {
28
+ errorMsg(`No entry found with slug "${slugOrId}"`);
29
+ process.exit(1);
30
+ }
31
+ rootEntry = found;
32
+ }
33
+ const rootEntryId = rootEntry.sys.id;
34
+ const contentTypeId = rootEntry.sys.contentType.sys.id;
35
+ const rootEntryType = contentTypeId === 'page'
36
+ ? 'page'
37
+ : contentTypeId === 'article'
38
+ ? 'article'
39
+ : contentTypeId === 'navigation'
40
+ ? 'navigation'
41
+ : contentTypeId === 'template'
42
+ ? 'template'
43
+ : 'page';
44
+ infoMsg(`Fetching entry tree…`);
45
+ const entries = await fetchEntryTree(env, rootEntryId);
46
+ entries[rootEntryId] = serializeEntry(rootEntry);
47
+ const { refs, refsByEntry, treeNodes } = buildTree(rootEntryId, entries, locale);
48
+ const session = {
49
+ version: 1,
50
+ spaceKey: key,
51
+ spaceId: space.spaceId,
52
+ environment: space.environment,
53
+ defaultLocale: locale,
54
+ rootEntryId,
55
+ rootEntryType,
56
+ fetchedAt: new Date().toISOString(),
57
+ entries,
58
+ originalEntries: JSON.parse(JSON.stringify(entries)),
59
+ refs,
60
+ refsByEntry,
61
+ treeNodes,
62
+ modifiedEntryIds: [],
63
+ pendingDeletions: [],
64
+ };
65
+ saveSession(session);
66
+ renderSnapshot(session);
67
+ }
68
+ catch (err) {
69
+ errorMsg(err instanceof Error ? err.message : String(err));
70
+ process.exit(1);
71
+ }
72
+ });
73
+ }
74
+ //# sourceMappingURL=open.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"open.js","sourceRoot":"","sources":["../../src/commands/open.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
2
+ import type { Command } from 'commander';
3
+ export declare function registerReadCommand(program: Command): void;
4
+ //# sourceMappingURL=read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../../src/commands/read.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAoG1D"}
@@ -0,0 +1,102 @@
1
+ /** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
2
+ import pc from 'picocolors';
3
+ import { entryFieldsToJson, entryToJson } from '../output/json.js';
4
+ import { isJsonMode } from '../output/mode.js';
5
+ import { errorMsg, statusBadge } from '../output/print.js';
6
+ import { rtfToMarkdown } from '../rtf/toMarkdown.js';
7
+ import { resolveRef } from '../session/refs.js';
8
+ import { getEntryLabel, getEntryStatus, getEntryTypeLabel } from '../session/state.js';
9
+ import { requireSession } from '../session/store.js';
10
+ import { renderFieldValue, renderSnapshot } from '../snapshot/render.js';
11
+ export function registerReadCommand(program) {
12
+ program
13
+ .command('read [ref] [field]')
14
+ .description('Read all fields of a ref entry, or a specific field. Omit ref to re-print snapshot.')
15
+ .option('--json', 'Output as JSON (entry object, or field value)')
16
+ .action((ref, field, opts) => {
17
+ try {
18
+ const session = requireSession();
19
+ if (!ref) {
20
+ renderSnapshot(session);
21
+ return;
22
+ }
23
+ const entry = resolveRef(session, ref);
24
+ const locale = session.defaultLocale;
25
+ const isModified = session.modifiedEntryIds.includes(entry.sys.id);
26
+ const status = getEntryStatus(entry, isModified);
27
+ if (opts.json || isJsonMode()) {
28
+ if (field) {
29
+ const fieldData = entry.fields[field];
30
+ if (!fieldData) {
31
+ errorMsg(`Field "${field}" not found on this entry.`);
32
+ process.exit(1);
33
+ return;
34
+ }
35
+ const serialized = entryFieldsToJson({ [field]: fieldData }, locale);
36
+ console.log(JSON.stringify(serialized[field] ?? null, null, 2));
37
+ }
38
+ else {
39
+ const json = entryToJson({
40
+ sys: {
41
+ id: entry.sys.id,
42
+ contentType: { sys: { id: entry.sys.contentType.sys.id } },
43
+ publishedVersion: entry.sys.publishedVersion,
44
+ updatedAt: entry.sys.updatedAt,
45
+ },
46
+ fields: entry.fields,
47
+ }, locale);
48
+ console.log(JSON.stringify(json, null, 2));
49
+ }
50
+ return;
51
+ }
52
+ if (field) {
53
+ const fieldData = entry.fields[field];
54
+ if (!fieldData) {
55
+ errorMsg(`Field "${field}" not found on this entry.`);
56
+ const available = Object.keys(entry.fields).join(', ');
57
+ console.log(pc.dim(`Available fields: ${available}`));
58
+ process.exit(1);
59
+ }
60
+ const value = fieldData[locale] ?? fieldData['en-US'];
61
+ if (isRtfDocument(value)) {
62
+ console.log(pc.bold(`\n${field} (rich text):\n`));
63
+ console.log(rtfToMarkdown(value));
64
+ }
65
+ else {
66
+ console.log(pc.bold(`\n${field}:\n`));
67
+ console.log(renderFieldValue(value));
68
+ }
69
+ }
70
+ else {
71
+ const ref2 = session.refsByEntry[entry.sys.id] ?? '?';
72
+ const typeLabel = getEntryTypeLabel(entry, locale);
73
+ const displayLabel = getEntryLabel(entry, locale);
74
+ console.log(`\n${pc.bold(ref2)} ${pc.blue(typeLabel)} ${pc.white(`"${displayLabel}"`)} ${statusBadge(status)}`);
75
+ console.log(pc.dim(`Entry ID: ${entry.sys.id} v${entry.sys.version} Content type: ${entry.sys.contentType.sys.id}\n`));
76
+ for (const [fieldId, fieldData] of Object.entries(entry.fields)) {
77
+ const value = fieldData[locale] ?? fieldData['en-US'];
78
+ const label = pc.bold(`${fieldId}:`).padEnd(30);
79
+ if (isRtfDocument(value)) {
80
+ console.log(`${label} ${pc.dim('[Rich text]')} — use: cms-edit read ${ref2} ${fieldId}`);
81
+ }
82
+ else {
83
+ const rendered = renderFieldValue(value);
84
+ const firstLine = rendered.split('\n')[0] ?? rendered;
85
+ console.log(`${label} ${firstLine}`);
86
+ }
87
+ }
88
+ console.log('');
89
+ }
90
+ }
91
+ catch (err) {
92
+ errorMsg(err instanceof Error ? err.message : String(err));
93
+ process.exit(1);
94
+ }
95
+ });
96
+ }
97
+ function isRtfDocument(value) {
98
+ return (typeof value === 'object' &&
99
+ value !== null &&
100
+ value.nodeType === 'document');
101
+ }
102
+ //# sourceMappingURL=read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"read.js","sourceRoot":"","sources":["../../src/commands/read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
2
+ import type { Command } from 'commander';
3
+ export declare function registerRemoveCommand(program: Command): void;
4
+ //# sourceMappingURL=remove.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.d.ts","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"AAAA,uFAAuF;AAEvF,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAUzC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAyG5D"}
@@ -0,0 +1,98 @@
1
+ /** biome-ignore-all lint/suspicious/noConsole: Console output is intentional in CLI */
2
+ import { loadConfig, resolveSpaceConfig } from '../config/load.js';
3
+ import { createSafeEnvironment } from '../contentful/client.js';
4
+ import { countInboundReferences } from '../contentful/references.js';
5
+ import { isJsonMode } from '../output/mode.js';
6
+ import { errorMsg, infoMsg, successMsg, warnMsg } from '../output/print.js';
7
+ import { buildTree, findTreeNode, resolveRefToId } from '../session/refs.js';
8
+ import { requireSession, saveSession } from '../session/store.js';
9
+ import { renderSnapshot } from '../snapshot/render.js';
10
+ export function registerRemoveCommand(program) {
11
+ program
12
+ .command('remove <ref>')
13
+ .description('Unlink a component or collection from the page.\n' +
14
+ 'If the entry is unreferenced elsewhere and is a draft, it will be deleted on save.')
15
+ .action(async (ref, _opts, cmd) => {
16
+ const parentOpts = cmd.parent?.opts() ?? {};
17
+ try {
18
+ const session = requireSession();
19
+ const locale = session.defaultLocale;
20
+ const entryId = resolveRefToId(session, ref);
21
+ const node = findTreeNode(session, ref);
22
+ if (!node) {
23
+ errorMsg(`Ref "${ref}" not found in the content tree.`);
24
+ process.exit(1);
25
+ return;
26
+ }
27
+ if (!node.parentId || !node.parentField) {
28
+ errorMsg(`Cannot remove the root entry.`);
29
+ process.exit(1);
30
+ return;
31
+ }
32
+ const parentEntry = session.entries[node.parentId];
33
+ if (!parentEntry) {
34
+ errorMsg(`Parent entry not found.`);
35
+ process.exit(1);
36
+ return;
37
+ }
38
+ // Remove the link from the parent's content array
39
+ const fieldData = parentEntry.fields[node.parentField];
40
+ if (fieldData) {
41
+ const arr = fieldData[locale];
42
+ if (Array.isArray(arr)) {
43
+ const idx = arr.findIndex((item) => typeof item === 'object' &&
44
+ item !== null &&
45
+ 'sys' in item &&
46
+ item.sys.id === entryId);
47
+ if (idx >= 0)
48
+ arr.splice(idx, 1);
49
+ }
50
+ }
51
+ if (!session.modifiedEntryIds.includes(node.parentId)) {
52
+ session.modifiedEntryIds.push(node.parentId);
53
+ }
54
+ // Check if the entry should be deleted (draft-only + no other references)
55
+ const targetEntry = session.entries[entryId];
56
+ const isPublished = !!targetEntry?.sys.publishedVersion;
57
+ if (!isPublished) {
58
+ try {
59
+ const config = loadConfig(parentOpts.config);
60
+ const { space } = resolveSpaceConfig(config, session.spaceKey);
61
+ const env = await createSafeEnvironment(space);
62
+ const refCount = await countInboundReferences(env, entryId);
63
+ if (refCount <= 1) {
64
+ if (!session.pendingDeletions.includes(entryId)) {
65
+ session.pendingDeletions.push(entryId);
66
+ }
67
+ infoMsg(`Entry ${ref} is unreferenced and draft-only — will be deleted on save.`);
68
+ }
69
+ else {
70
+ warnMsg(`Entry ${ref} is referenced by ${refCount - 1} other entr${refCount - 1 === 1 ? 'y' : 'ies'} — unlinking only.`);
71
+ }
72
+ }
73
+ catch {
74
+ warnMsg(`Could not check references for ${ref} — unlinking only.`);
75
+ }
76
+ }
77
+ else {
78
+ warnMsg(`Entry ${ref} is published — unlinking only. Delete it manually in Contentful if needed.`);
79
+ }
80
+ // Rebuild tree without the removed entry
81
+ delete session.entries[entryId];
82
+ const { refs, refsByEntry, treeNodes } = buildTree(session.rootEntryId, session.entries, locale);
83
+ session.refs = refs;
84
+ session.refsByEntry = refsByEntry;
85
+ session.treeNodes = treeNodes;
86
+ saveSession(session);
87
+ successMsg(`Removed ${ref} from the page.`);
88
+ if (!isJsonMode()) {
89
+ renderSnapshot(session);
90
+ }
91
+ }
92
+ catch (err) {
93
+ errorMsg(err instanceof Error ? err.message : String(err));
94
+ process.exit(1);
95
+ }
96
+ });
97
+ }
98
+ //# sourceMappingURL=remove.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"remove.js","sourceRoot":"","sources":["../../src/commands/remove.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerRtfCommand(program: Command): void;
3
+ //# sourceMappingURL=rtf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rtf.d.ts","sourceRoot":"","sources":["../../src/commands/rtf.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAsIzD"}