@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,19 @@
1
+ import type { Document } from '@contentful/rich-text-types';
2
+ /**
3
+ * Converts a Markdown string to a Contentful Rich Text Document.
4
+ *
5
+ * Supports (basic):
6
+ * - Headings: # to ######
7
+ * - Paragraphs
8
+ * - Bold: **text** or __text__
9
+ * - Italic: *text* or _text_
10
+ * - Bold+italic: ***text***
11
+ * - Inline code: `code`
12
+ * - Links: [text](url)
13
+ * - Unordered lists: - item or * item
14
+ * - Ordered lists: 1. item
15
+ * - Blockquotes: > text
16
+ * - Horizontal rules: ---
17
+ */
18
+ export declare function markdownToRtf(markdown: string): Document;
19
+ //# sourceMappingURL=fromMarkdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fromMarkdown.d.ts","sourceRoot":"","sources":["../../src/rtf/fromMarkdown.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAS,QAAQ,EAA+B,MAAM,6BAA6B,CAAC;AAGhG;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,CAQxD"}
@@ -0,0 +1,230 @@
1
+ import { BLOCKS, INLINES, MARKS } from '@contentful/rich-text-types';
2
+ /**
3
+ * Converts a Markdown string to a Contentful Rich Text Document.
4
+ *
5
+ * Supports (basic):
6
+ * - Headings: # to ######
7
+ * - Paragraphs
8
+ * - Bold: **text** or __text__
9
+ * - Italic: *text* or _text_
10
+ * - Bold+italic: ***text***
11
+ * - Inline code: `code`
12
+ * - Links: [text](url)
13
+ * - Unordered lists: - item or * item
14
+ * - Ordered lists: 1. item
15
+ * - Blockquotes: > text
16
+ * - Horizontal rules: ---
17
+ */
18
+ export function markdownToRtf(markdown) {
19
+ const lines = markdown.split('\n');
20
+ const blocks = parseBlocks(lines);
21
+ return {
22
+ nodeType: BLOCKS.DOCUMENT,
23
+ data: {},
24
+ content: blocks,
25
+ };
26
+ }
27
+ function parseLine(line) {
28
+ // Headings
29
+ const headingMatch = /^(#{1,6})\s+(.+)$/.exec(line);
30
+ if (headingMatch?.[1] && headingMatch[2] !== undefined) {
31
+ const level = Math.min(headingMatch[1].length, 6);
32
+ return { type: 'heading', level, text: headingMatch[2] };
33
+ }
34
+ // HR
35
+ if (/^---+$/.test(line.trim()) || /^\*\*\*+$/.test(line.trim())) {
36
+ return { type: 'hr' };
37
+ }
38
+ // Unordered list items
39
+ const ulMatch = /^[-*+]\s+(.*)$/.exec(line);
40
+ if (ulMatch?.[1] !== undefined) {
41
+ return { type: 'ul-item', text: ulMatch[1] };
42
+ }
43
+ // Ordered list items
44
+ const olMatch = /^(\d+)\.\s+(.*)$/.exec(line);
45
+ if (olMatch?.[1] !== undefined && olMatch[2] !== undefined) {
46
+ return { type: 'ol-item', text: olMatch[2], index: Number.parseInt(olMatch[1], 10) };
47
+ }
48
+ // Blockquote
49
+ const bqMatch = /^>\s?(.*)$/.exec(line);
50
+ if (bqMatch?.[1] !== undefined) {
51
+ return { type: 'blockquote', text: bqMatch[1] };
52
+ }
53
+ // Blank line
54
+ if (line.trim() === '')
55
+ return { type: 'blank' };
56
+ // Normal text
57
+ return { type: 'text', text: line };
58
+ }
59
+ function parseBlocks(lines) {
60
+ const blocks = [];
61
+ let i = 0;
62
+ while (i < lines.length) {
63
+ const line = lines[i] ?? '';
64
+ const parsed = parseLine(line);
65
+ if (parsed.type === 'blank') {
66
+ i++;
67
+ continue;
68
+ }
69
+ if (parsed.type === 'hr') {
70
+ blocks.push({ nodeType: BLOCKS.HR, data: {}, content: [] });
71
+ i++;
72
+ continue;
73
+ }
74
+ if (parsed.type === 'heading') {
75
+ const nodeType = [
76
+ BLOCKS.HEADING_1,
77
+ BLOCKS.HEADING_2,
78
+ BLOCKS.HEADING_3,
79
+ BLOCKS.HEADING_4,
80
+ BLOCKS.HEADING_5,
81
+ BLOCKS.HEADING_6,
82
+ ][parsed.level - 1];
83
+ blocks.push({ nodeType, data: {}, content: parseInline(parsed.text) });
84
+ i++;
85
+ continue;
86
+ }
87
+ if (parsed.type === 'ul-item') {
88
+ const items = [];
89
+ while (i < lines.length) {
90
+ const l = lines[i] ?? '';
91
+ const p = parseLine(l);
92
+ if (p.type !== 'ul-item')
93
+ break;
94
+ items.push({
95
+ nodeType: BLOCKS.LIST_ITEM,
96
+ data: {},
97
+ content: [makeParagraph(parseInline(p.text))],
98
+ });
99
+ i++;
100
+ }
101
+ blocks.push({ nodeType: BLOCKS.UL_LIST, data: {}, content: items });
102
+ continue;
103
+ }
104
+ if (parsed.type === 'ol-item') {
105
+ const items = [];
106
+ while (i < lines.length) {
107
+ const l = lines[i] ?? '';
108
+ const p = parseLine(l);
109
+ if (p.type !== 'ol-item')
110
+ break;
111
+ items.push({
112
+ nodeType: BLOCKS.LIST_ITEM,
113
+ data: {},
114
+ content: [makeParagraph(parseInline(p.text))],
115
+ });
116
+ i++;
117
+ }
118
+ blocks.push({ nodeType: BLOCKS.OL_LIST, data: {}, content: items });
119
+ continue;
120
+ }
121
+ if (parsed.type === 'blockquote') {
122
+ const quoteLines = [];
123
+ while (i < lines.length) {
124
+ const l = lines[i] ?? '';
125
+ const p = parseLine(l);
126
+ if (p.type !== 'blockquote' && p.type !== 'blank')
127
+ break;
128
+ if (p.type === 'blockquote')
129
+ quoteLines.push(p.text);
130
+ i++;
131
+ }
132
+ blocks.push({
133
+ nodeType: BLOCKS.QUOTE,
134
+ data: {},
135
+ content: [makeParagraph(parseInline(quoteLines.join(' ')))],
136
+ });
137
+ continue;
138
+ }
139
+ // Accumulate text lines into a paragraph
140
+ const paraLines = [];
141
+ while (i < lines.length) {
142
+ const l = lines[i] ?? '';
143
+ const p = parseLine(l);
144
+ if (p.type === 'blank')
145
+ break;
146
+ if (p.type !== 'text')
147
+ break;
148
+ paraLines.push(p.text);
149
+ i++;
150
+ }
151
+ if (paraLines.length > 0) {
152
+ blocks.push(makeParagraph(parseInline(paraLines.join(' '))));
153
+ }
154
+ }
155
+ // Contentful requires at least one block
156
+ if (blocks.length === 0) {
157
+ blocks.push(makeParagraph([makeText('')]));
158
+ }
159
+ return blocks;
160
+ }
161
+ function makeParagraph(content) {
162
+ return { nodeType: BLOCKS.PARAGRAPH, data: {}, content };
163
+ }
164
+ function makeText(value, marks = []) {
165
+ return { nodeType: 'text', value, marks, data: {} };
166
+ }
167
+ function parseInline(text) {
168
+ const nodes = [];
169
+ let i = 0;
170
+ while (i < text.length) {
171
+ // Bold+italic: ***text*** or ___text___
172
+ const boldItalicMatch = /^\*{3}(.+?)\*{3}|^_{3}(.+?)_{3}/.exec(text.slice(i));
173
+ if (boldItalicMatch) {
174
+ const content = boldItalicMatch[1] ?? boldItalicMatch[2] ?? '';
175
+ nodes.push(makeText(content, [{ type: MARKS.BOLD }, { type: MARKS.ITALIC }]));
176
+ i += boldItalicMatch[0].length;
177
+ continue;
178
+ }
179
+ // Bold: **text** or __text__
180
+ const boldMatch = /^\*{2}(.+?)\*{2}|^_{2}(.+?)_{2}/.exec(text.slice(i));
181
+ if (boldMatch) {
182
+ const content = boldMatch[1] ?? boldMatch[2] ?? '';
183
+ nodes.push(makeText(content, [{ type: MARKS.BOLD }]));
184
+ i += boldMatch[0].length;
185
+ continue;
186
+ }
187
+ // Italic: *text* or _text_
188
+ const italicMatch = /^\*([^*]+?)\*|^_([^_]+?)_/.exec(text.slice(i));
189
+ if (italicMatch) {
190
+ const content = italicMatch[1] ?? italicMatch[2] ?? '';
191
+ nodes.push(makeText(content, [{ type: MARKS.ITALIC }]));
192
+ i += italicMatch[0].length;
193
+ continue;
194
+ }
195
+ // Inline code: `code`
196
+ const codeMatch = /^`([^`]+?)`/.exec(text.slice(i));
197
+ if (codeMatch?.[1] !== undefined) {
198
+ nodes.push(makeText(codeMatch[1], [{ type: MARKS.CODE }]));
199
+ i += codeMatch[0].length;
200
+ continue;
201
+ }
202
+ // Link: [text](url)
203
+ const linkMatch = /^\[([^\]]+)\]\(([^)]+)\)/.exec(text.slice(i));
204
+ if (linkMatch?.[1] !== undefined && linkMatch[2] !== undefined) {
205
+ const linkText = linkMatch[1];
206
+ const href = linkMatch[2];
207
+ const inline = {
208
+ nodeType: INLINES.HYPERLINK,
209
+ data: { uri: href },
210
+ content: [makeText(linkText)],
211
+ };
212
+ nodes.push(inline);
213
+ i += linkMatch[0].length;
214
+ continue;
215
+ }
216
+ // Regular character — accumulate into a text run
217
+ let j = i + 1;
218
+ const stopChars = new Set(['*', '_', '`', '[']);
219
+ while (j < text.length) {
220
+ const ch = text[j];
221
+ if (ch && stopChars.has(ch))
222
+ break;
223
+ j++;
224
+ }
225
+ nodes.push(makeText(text.slice(i, j)));
226
+ i = j;
227
+ }
228
+ return nodes.length > 0 ? nodes : [makeText('')];
229
+ }
230
+ //# sourceMappingURL=fromMarkdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fromMarkdown.js","sourceRoot":"","sources":["../../src/rtf/fromMarkdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Converts a Contentful Rich Text Document to a Markdown string for display.
3
+ * This is used by the `read` command to display rich text fields.
4
+ */
5
+ export declare function rtfToMarkdown(doc: unknown): string;
6
+ //# sourceMappingURL=toMarkdown.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toMarkdown.d.ts","sourceRoot":"","sources":["../../src/rtf/toMarkdown.ts"],"names":[],"mappings":"AAGA;;;GAGG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAGlD"}
@@ -0,0 +1,105 @@
1
+ import { BLOCKS, INLINES, MARKS } from '@contentful/rich-text-types';
2
+ /**
3
+ * Converts a Contentful Rich Text Document to a Markdown string for display.
4
+ * This is used by the `read` command to display rich text fields.
5
+ */
6
+ export function rtfToMarkdown(doc) {
7
+ if (!isDocument(doc))
8
+ return '[invalid rich text]';
9
+ return renderNodes(doc.content).trim();
10
+ }
11
+ function renderNodes(nodes) {
12
+ return nodes.map(renderNode).join('');
13
+ }
14
+ function renderNode(node) {
15
+ if (isText(node)) {
16
+ return renderText(node);
17
+ }
18
+ const block = node;
19
+ switch (block.nodeType) {
20
+ case BLOCKS.PARAGRAPH: {
21
+ const content = renderNodes(block.content);
22
+ return content.trim() ? `${content.trim()}\n\n` : '';
23
+ }
24
+ case BLOCKS.HEADING_1:
25
+ return `# ${renderNodes(block.content).trim()}\n\n`;
26
+ case BLOCKS.HEADING_2:
27
+ return `## ${renderNodes(block.content).trim()}\n\n`;
28
+ case BLOCKS.HEADING_3:
29
+ return `### ${renderNodes(block.content).trim()}\n\n`;
30
+ case BLOCKS.HEADING_4:
31
+ return `#### ${renderNodes(block.content).trim()}\n\n`;
32
+ case BLOCKS.HEADING_5:
33
+ return `##### ${renderNodes(block.content).trim()}\n\n`;
34
+ case BLOCKS.HEADING_6:
35
+ return `###### ${renderNodes(block.content).trim()}\n\n`;
36
+ case BLOCKS.UL_LIST:
37
+ return `${renderList(block.content, false)}\n`;
38
+ case BLOCKS.OL_LIST:
39
+ return `${renderList(block.content, true)}\n`;
40
+ case BLOCKS.LIST_ITEM:
41
+ return renderNodes(block.content).trim();
42
+ case BLOCKS.QUOTE:
43
+ return `${renderNodes(block.content)
44
+ .trim()
45
+ .split('\n')
46
+ .map((line) => `> ${line}`)
47
+ .join('\n')}\n\n`;
48
+ case BLOCKS.HR:
49
+ return '---\n\n';
50
+ case BLOCKS.EMBEDDED_ENTRY:
51
+ case BLOCKS.EMBEDDED_ASSET:
52
+ return '[embedded content]\n\n';
53
+ case INLINES.HYPERLINK: {
54
+ const href = block.data.uri ?? '#';
55
+ return `[${renderNodes(block.content).trim()}](${href})`;
56
+ }
57
+ case INLINES.ENTRY_HYPERLINK:
58
+ case INLINES.ASSET_HYPERLINK:
59
+ return `[${renderNodes(block.content).trim()}](#)`;
60
+ case INLINES.EMBEDDED_ENTRY:
61
+ return '[inline]';
62
+ default:
63
+ if ('content' in block && Array.isArray(block.content)) {
64
+ return renderNodes(block.content);
65
+ }
66
+ return '';
67
+ }
68
+ }
69
+ function renderText(node) {
70
+ let text = node.value;
71
+ const markTypes = node.marks.map((m) => m.type);
72
+ if (markTypes.includes(MARKS.CODE))
73
+ return `\`${text}\``;
74
+ if (markTypes.includes(MARKS.BOLD) && markTypes.includes(MARKS.ITALIC)) {
75
+ text = `***${text}***`;
76
+ }
77
+ else if (markTypes.includes(MARKS.BOLD)) {
78
+ text = `**${text}**`;
79
+ }
80
+ else if (markTypes.includes(MARKS.ITALIC)) {
81
+ text = `_${text}_`;
82
+ }
83
+ else if (markTypes.includes(MARKS.UNDERLINE)) {
84
+ text = `__${text}__`;
85
+ }
86
+ return text;
87
+ }
88
+ function renderList(items, ordered) {
89
+ return items
90
+ .map((item, index) => {
91
+ const prefix = ordered ? `${index + 1}. ` : '- ';
92
+ const content = renderNode(item).trim();
93
+ return `${prefix}${content}`;
94
+ })
95
+ .join('\n');
96
+ }
97
+ function isDocument(value) {
98
+ return (typeof value === 'object' &&
99
+ value !== null &&
100
+ value.nodeType === BLOCKS.DOCUMENT);
101
+ }
102
+ function isText(node) {
103
+ return node.nodeType === 'text';
104
+ }
105
+ //# sourceMappingURL=toMarkdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"toMarkdown.js","sourceRoot":"","sources":["../../src/rtf/toMarkdown.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,qBAAqB,CAAC;IACnD,OAAO,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;AACzC,CAAC;AAED,SAAS,WAAW,CAAC,KAAa;IAChC,OAAO,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,UAAU,CAAC,IAAU;IAC5B,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACjB,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,KAAK,GAAG,IAAsB,CAAC;IAErC,QAAQ,KAAK,CAAC,QAAQ,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;YACtB,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC3C,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QACvD,CAAC;QACD,KAAK,MAAM,CAAC,SAAS;YACnB,OAAO,KAAK,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;QACtD,KAAK,MAAM,CAAC,SAAS;YACnB,OAAO,MAAM,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;QACvD,KAAK,MAAM,CAAC,SAAS;YACnB,OAAO,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;QACxD,KAAK,MAAM,CAAC,SAAS;YACnB,OAAO,QAAQ,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;QACzD,KAAK,MAAM,CAAC,SAAS;YACnB,OAAO,SAAS,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;QAC1D,KAAK,MAAM,CAAC,SAAS;YACnB,OAAO,UAAU,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;QAC3D,KAAK,MAAM,CAAC,OAAO;YACjB,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC;QACjD,KAAK,MAAM,CAAC,OAAO;YACjB,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;QAChD,KAAK,MAAM,CAAC,SAAS;YACnB,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,KAAK,MAAM,CAAC,KAAK;YACf,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC;iBACjC,IAAI,EAAE;iBACN,KAAK,CAAC,IAAI,CAAC;iBACX,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;iBAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;QACtB,KAAK,MAAM,CAAC,EAAE;YACZ,OAAO,SAAS,CAAC;QACnB,KAAK,MAAM,CAAC,cAAc,CAAC;QAC3B,KAAK,MAAM,CAAC,cAAc;YACxB,OAAO,wBAAwB,CAAC;QAClC,KAAK,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YACvB,MAAM,IAAI,GAAI,KAAK,CAAC,IAAyB,CAAC,GAAG,IAAI,GAAG,CAAC;YACzD,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,GAAG,CAAC;QAC3D,CAAC;QACD,KAAK,OAAO,CAAC,eAAe,CAAC;QAC7B,KAAK,OAAO,CAAC,eAAe;YAC1B,OAAO,IAAI,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC;QACrD,KAAK,OAAO,CAAC,cAAc;YACzB,OAAO,UAAU,CAAC;QACpB;YACE,IAAI,SAAS,IAAI,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvD,OAAO,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAAU;IAC5B,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;IACtB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAEhD,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,IAAI,IAAI,CAAC;IAEzD,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QACvE,IAAI,GAAG,MAAM,IAAI,KAAK,CAAC;IACzB,CAAC;SAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;SAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;QAC5C,IAAI,GAAG,IAAI,IAAI,GAAG,CAAC;IACrB,CAAC;SAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/C,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC;IACvB,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,UAAU,CAAC,KAAa,EAAE,OAAgB;IACjD,OAAO,KAAK;SACT,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;QACnB,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QACjD,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,OAAO,GAAG,MAAM,GAAG,OAAO,EAAE,CAAC;IAC/B,CAAC,CAAC;SACD,IAAI,CAAC,IAAI,CAAC,CAAC;AAChB,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACb,KAA+B,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAC9D,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,IAAU;IACxB,OAAO,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC;AAClC,CAAC"}
@@ -0,0 +1,35 @@
1
+ import type { SerializedEntry, SessionState, TreeNode } from './state.js';
2
+ /**
3
+ * Resolves a ref string (@c0, @c1, ...) to a serialized entry.
4
+ * Throws a descriptive error if the ref is not found.
5
+ */
6
+ export declare function resolveRef(session: SessionState, ref: string): SerializedEntry;
7
+ /**
8
+ * Resolves a ref string to its entry ID.
9
+ */
10
+ export declare function resolveRefToId(session: SessionState, ref: string): string;
11
+ /**
12
+ * Finds the TreeNode for a given ref.
13
+ */
14
+ export declare function findTreeNode(session: SessionState, ref: string): TreeNode | null;
15
+ /**
16
+ * Builds a depth-first ordered tree from an entry map, assigning @c0, @c1... refs.
17
+ * Returns updated refs, refsByEntry, and treeNodes arrays.
18
+ */
19
+ export declare function buildTree(rootEntryId: string, entries: Record<string, SerializedEntry>, locale: string): Pick<SessionState, 'refs' | 'refsByEntry' | 'treeNodes'>;
20
+ /**
21
+ * Returns the field name for a navigation's item array ('items' or 'navigationItems').
22
+ * Prefers 'items' if both exist. Returns 'items' if neither exists (for new navigations).
23
+ */
24
+ export declare function getNavigationItemsFieldName(entry: SerializedEntry, locale: string): string;
25
+ /**
26
+ * Creates a Contentful entry link object for inserting into content arrays.
27
+ */
28
+ export declare function makeEntryLink(entryId: string): {
29
+ sys: {
30
+ type: 'Link';
31
+ linkType: 'Entry';
32
+ id: string;
33
+ };
34
+ };
35
+ //# sourceMappingURL=refs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.d.ts","sourceRoot":"","sources":["../../src/session/refs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE1E;;;GAGG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,CAY9E;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAQzE;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,GAAG,QAAQ,GAAG,IAAI,CAGhF;AAED;;;GAGG;AACH,wBAAgB,SAAS,CACvB,WAAW,EAAE,MAAM,EACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,EACxC,MAAM,EAAE,MAAM,GACb,IAAI,CAAC,YAAY,EAAE,MAAM,GAAG,aAAa,GAAG,WAAW,CAAC,CA0D1D;AAWD;;;GAGG;AACH,wBAAgB,2BAA2B,CAAC,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAS1F;AAYD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG;IAC9C,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CACtD,CAEA"}
@@ -0,0 +1,128 @@
1
+ /**
2
+ * Resolves a ref string (@c0, @c1, ...) to a serialized entry.
3
+ * Throws a descriptive error if the ref is not found.
4
+ */
5
+ export function resolveRef(session, ref) {
6
+ const normalizedRef = ref.startsWith('@') ? ref : `@${ref}`;
7
+ const entryId = session.refs[normalizedRef];
8
+ if (!entryId) {
9
+ const available = Object.keys(session.refs).join(', ');
10
+ throw new Error(`Ref "${normalizedRef}" not found. Available refs: ${available}`);
11
+ }
12
+ const entry = session.entries[entryId];
13
+ if (!entry) {
14
+ throw new Error(`Entry "${entryId}" not found in session. Try re-running "cms-edit open".`);
15
+ }
16
+ return entry;
17
+ }
18
+ /**
19
+ * Resolves a ref string to its entry ID.
20
+ */
21
+ export function resolveRefToId(session, ref) {
22
+ const normalizedRef = ref.startsWith('@') ? ref : `@${ref}`;
23
+ const entryId = session.refs[normalizedRef];
24
+ if (!entryId) {
25
+ const available = Object.keys(session.refs).join(', ');
26
+ throw new Error(`Ref "${normalizedRef}" not found. Available refs: ${available}`);
27
+ }
28
+ return entryId;
29
+ }
30
+ /**
31
+ * Finds the TreeNode for a given ref.
32
+ */
33
+ export function findTreeNode(session, ref) {
34
+ const normalizedRef = ref.startsWith('@') ? ref : `@${ref}`;
35
+ return session.treeNodes.find((n) => n.ref === normalizedRef) ?? null;
36
+ }
37
+ /**
38
+ * Builds a depth-first ordered tree from an entry map, assigning @c0, @c1... refs.
39
+ * Returns updated refs, refsByEntry, and treeNodes arrays.
40
+ */
41
+ export function buildTree(rootEntryId, entries, locale) {
42
+ const refs = {};
43
+ const refsByEntry = {};
44
+ const treeNodes = [];
45
+ let counter = 0;
46
+ function assignRef(entryId) {
47
+ const existing = refsByEntry[entryId];
48
+ if (existing)
49
+ return existing;
50
+ const ref = `@c${counter++}`;
51
+ refs[ref] = entryId;
52
+ refsByEntry[entryId] = ref;
53
+ return ref;
54
+ }
55
+ function traverse(entryId, parentId, parentField, depth) {
56
+ const entry = entries[entryId];
57
+ if (!entry)
58
+ return;
59
+ const ref = assignRef(entryId);
60
+ treeNodes.push({ entryId, ref, parentId, parentField, depth });
61
+ const ctId = entry.sys.contentType.sys.id;
62
+ const fieldsToExpand = ctId === 'collection'
63
+ ? ['contents']
64
+ : ctId === 'page' || ctId === 'article'
65
+ ? ['topContent', 'content', 'bottomContent']
66
+ : ctId === 'template'
67
+ ? ['preContent', 'postContent']
68
+ : ctId === 'navigation'
69
+ ? getNavigationItemsField(entry, locale)
70
+ : [];
71
+ for (const fieldId of fieldsToExpand) {
72
+ const fieldData = entry.fields[fieldId];
73
+ if (!fieldData)
74
+ continue;
75
+ const items = fieldData[locale] ?? fieldData['en-US'];
76
+ if (!Array.isArray(items))
77
+ continue;
78
+ for (const item of items) {
79
+ if (isEntryLink(item)) {
80
+ const childId = item.sys.id;
81
+ if (entries[childId]) {
82
+ traverse(childId, entryId, fieldId, depth + 1);
83
+ }
84
+ }
85
+ }
86
+ }
87
+ }
88
+ traverse(rootEntryId, null, null, 0);
89
+ return { refs, refsByEntry, treeNodes };
90
+ }
91
+ /**
92
+ * For navigation entries, returns the single array field to expand (items or navigationItems).
93
+ * Prefers 'items' if both exist and are arrays.
94
+ */
95
+ function getNavigationItemsField(entry, locale) {
96
+ const name = getNavigationItemsFieldName(entry, locale);
97
+ return name ? [name] : [];
98
+ }
99
+ /**
100
+ * Returns the field name for a navigation's item array ('items' or 'navigationItems').
101
+ * Prefers 'items' if both exist. Returns 'items' if neither exists (for new navigations).
102
+ */
103
+ export function getNavigationItemsFieldName(entry, locale) {
104
+ const fallback = 'en-US';
105
+ for (const fieldId of ['items', 'navigationItems']) {
106
+ const fieldData = entry.fields[fieldId];
107
+ if (!fieldData || typeof fieldData !== 'object')
108
+ continue;
109
+ const items = fieldData[locale] ?? fieldData[fallback];
110
+ if (Array.isArray(items))
111
+ return fieldId;
112
+ }
113
+ return 'items';
114
+ }
115
+ function isEntryLink(item) {
116
+ return (typeof item === 'object' &&
117
+ item !== null &&
118
+ 'sys' in item &&
119
+ typeof item.sys === 'object' &&
120
+ item.sys.linkType === 'Entry');
121
+ }
122
+ /**
123
+ * Creates a Contentful entry link object for inserting into content arrays.
124
+ */
125
+ export function makeEntryLink(entryId) {
126
+ return { sys: { type: 'Link', linkType: 'Entry', id: entryId } };
127
+ }
128
+ //# sourceMappingURL=refs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refs.js","sourceRoot":"","sources":["../../src/session/refs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ /**
2
+ * Serialized representation of a Contentful CMA entry for session storage.
3
+ * Fields use the CMA locale-keyed format: { fieldId: { locale: value } }
4
+ */
5
+ export interface SerializedEntry {
6
+ sys: {
7
+ id: string;
8
+ version: number;
9
+ publishedVersion?: number;
10
+ publishedAt?: string;
11
+ contentType: {
12
+ sys: {
13
+ id: string;
14
+ };
15
+ };
16
+ createdAt: string;
17
+ updatedAt: string;
18
+ };
19
+ fields: Record<string, Record<string, unknown>>;
20
+ }
21
+ /**
22
+ * A node in the content tree representing a single entry's position within a page.
23
+ * Stored depth-first so iteration order matches visual display order.
24
+ */
25
+ export interface TreeNode {
26
+ entryId: string;
27
+ ref: string;
28
+ parentId: string | null;
29
+ parentField: string | null;
30
+ depth: number;
31
+ }
32
+ /**
33
+ * A single field change to be applied on save.
34
+ */
35
+ export interface FieldPatch {
36
+ fieldId: string;
37
+ locale: string;
38
+ value: unknown;
39
+ appliedAt: string;
40
+ }
41
+ /**
42
+ * The full session state persisted between CLI commands.
43
+ */
44
+ export interface SessionState {
45
+ version: 1;
46
+ spaceKey: string;
47
+ spaceId: string;
48
+ environment: string;
49
+ defaultLocale: string;
50
+ rootEntryId: string;
51
+ rootEntryType: 'page' | 'article' | 'navigation' | 'template';
52
+ fetchedAt: string;
53
+ /** All fetched entries keyed by entry ID */
54
+ entries: Record<string, SerializedEntry>;
55
+ /** Original entry state at open time (for diff) */
56
+ originalEntries: Record<string, SerializedEntry>;
57
+ /** @c0 → entryId */
58
+ refs: Record<string, string>;
59
+ /** entryId → @c0 */
60
+ refsByEntry: Record<string, string>;
61
+ /** Depth-first ordered tree nodes */
62
+ treeNodes: TreeNode[];
63
+ /** Entry IDs that have been locally modified */
64
+ modifiedEntryIds: string[];
65
+ /** Draft-only entry IDs to delete on save (from remove operations) */
66
+ pendingDeletions: string[];
67
+ }
68
+ export type EntryStatus = 'published' | 'draft' | 'pending' | 'changed';
69
+ /**
70
+ * Derives the display status of an entry.
71
+ *
72
+ * - changed: has unsaved local patches
73
+ * - draft: never published
74
+ * - pending: published but has newer draft on Contentful
75
+ * - published: published and no pending changes
76
+ */
77
+ export declare function getEntryStatus(entry: SerializedEntry, isLocallyModified: boolean): EntryStatus;
78
+ /**
79
+ * Returns the display type label for any content type.
80
+ * Looks for a ${ctId}Type discriminator field (e.g. componentType, collectionType,
81
+ * externalComponentType) and renders as TypeName[value] when present.
82
+ * Falls back to the capitalised content type ID for types without a discriminator.
83
+ */
84
+ export declare function getEntryTypeLabel(entry: SerializedEntry, locale: string): string;
85
+ /**
86
+ * Returns the best display label (cmsLabel or heading or entry ID).
87
+ */
88
+ export declare function getEntryLabel(entry: SerializedEntry, locale: string): string;
89
+ /** The content array fields that can contain linked entries. */
90
+ export declare const CONTENT_ARRAY_FIELDS: readonly ["topContent", "content", "bottomContent", "contents"];
91
+ //# sourceMappingURL=state.d.ts.map