@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.
- package/CHANGELOG.md +15 -0
- package/README.md +519 -0
- package/dist/bin/cms-edit.d.ts +4 -0
- package/dist/bin/cms-edit.d.ts.map +1 -0
- package/dist/bin/cms-edit.js +101 -0
- package/dist/bin/cms-edit.js.map +1 -0
- package/dist/commands/add.d.ts +4 -0
- package/dist/commands/add.d.ts.map +1 -0
- package/dist/commands/add.js +166 -0
- package/dist/commands/add.js.map +1 -0
- package/dist/commands/asset.d.ts +4 -0
- package/dist/commands/asset.d.ts.map +1 -0
- package/dist/commands/asset.js +110 -0
- package/dist/commands/asset.js.map +1 -0
- package/dist/commands/colours.d.ts +4 -0
- package/dist/commands/colours.d.ts.map +1 -0
- package/dist/commands/colours.js +91 -0
- package/dist/commands/colours.js.map +1 -0
- package/dist/commands/create.d.ts +4 -0
- package/dist/commands/create.d.ts.map +1 -0
- package/dist/commands/create.js +223 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/diff.d.ts +4 -0
- package/dist/commands/diff.d.ts.map +1 -0
- package/dist/commands/diff.js +141 -0
- package/dist/commands/diff.js.map +1 -0
- package/dist/commands/discard.d.ts +4 -0
- package/dist/commands/discard.d.ts.map +1 -0
- package/dist/commands/discard.js +36 -0
- package/dist/commands/discard.js.map +1 -0
- package/dist/commands/entry-search.d.ts +4 -0
- package/dist/commands/entry-search.d.ts.map +1 -0
- package/dist/commands/entry-search.js +81 -0
- package/dist/commands/entry-search.js.map +1 -0
- package/dist/commands/export-converted.d.ts +8 -0
- package/dist/commands/export-converted.d.ts.map +1 -0
- package/dist/commands/export-converted.js +62 -0
- package/dist/commands/export-converted.js.map +1 -0
- package/dist/commands/links.d.ts +4 -0
- package/dist/commands/links.d.ts.map +1 -0
- package/dist/commands/links.js +255 -0
- package/dist/commands/links.js.map +1 -0
- package/dist/commands/list.d.ts +4 -0
- package/dist/commands/list.d.ts.map +1 -0
- package/dist/commands/list.js +91 -0
- package/dist/commands/list.js.map +1 -0
- package/dist/commands/move.d.ts +3 -0
- package/dist/commands/move.d.ts.map +1 -0
- package/dist/commands/move.js +84 -0
- package/dist/commands/move.js.map +1 -0
- package/dist/commands/nav.d.ts +4 -0
- package/dist/commands/nav.d.ts.map +1 -0
- package/dist/commands/nav.js +196 -0
- package/dist/commands/nav.js.map +1 -0
- package/dist/commands/open.d.ts +4 -0
- package/dist/commands/open.d.ts.map +1 -0
- package/dist/commands/open.js +74 -0
- package/dist/commands/open.js.map +1 -0
- package/dist/commands/read.d.ts +4 -0
- package/dist/commands/read.d.ts.map +1 -0
- package/dist/commands/read.js +102 -0
- package/dist/commands/read.js.map +1 -0
- package/dist/commands/remove.d.ts +4 -0
- package/dist/commands/remove.d.ts.map +1 -0
- package/dist/commands/remove.js +98 -0
- package/dist/commands/remove.js.map +1 -0
- package/dist/commands/rtf.d.ts +3 -0
- package/dist/commands/rtf.d.ts.map +1 -0
- package/dist/commands/rtf.js +131 -0
- package/dist/commands/rtf.js.map +1 -0
- package/dist/commands/save.d.ts +4 -0
- package/dist/commands/save.d.ts.map +1 -0
- package/dist/commands/save.js +59 -0
- package/dist/commands/save.js.map +1 -0
- package/dist/commands/screenshot.d.ts +4 -0
- package/dist/commands/screenshot.d.ts.map +1 -0
- package/dist/commands/screenshot.js +246 -0
- package/dist/commands/screenshot.js.map +1 -0
- package/dist/commands/set.d.ts +3 -0
- package/dist/commands/set.d.ts.map +1 -0
- package/dist/commands/set.js +152 -0
- package/dist/commands/set.js.map +1 -0
- package/dist/commands/skill.d.ts +4 -0
- package/dist/commands/skill.d.ts.map +1 -0
- package/dist/commands/skill.js +73 -0
- package/dist/commands/skill.js.map +1 -0
- package/dist/commands/snapshot.d.ts +3 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +21 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/commands/types.d.ts +4 -0
- package/dist/commands/types.d.ts.map +1 -0
- package/dist/commands/types.js +78 -0
- package/dist/commands/types.js.map +1 -0
- package/dist/config/load.d.ts +14 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +79 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/types.d.ts +13 -0
- package/dist/config/types.d.ts.map +1 -0
- package/dist/config/types.js +2 -0
- package/dist/config/types.js.map +1 -0
- package/dist/contentful/assets.d.ts +20 -0
- package/dist/contentful/assets.d.ts.map +1 -0
- package/dist/contentful/assets.js +36 -0
- package/dist/contentful/assets.js.map +1 -0
- package/dist/contentful/client.d.ts +28 -0
- package/dist/contentful/client.d.ts.map +1 -0
- package/dist/contentful/client.js +30 -0
- package/dist/contentful/client.js.map +1 -0
- package/dist/contentful/fetch.d.ts +20 -0
- package/dist/contentful/fetch.d.ts.map +1 -0
- package/dist/contentful/fetch.js +154 -0
- package/dist/contentful/fetch.js.map +1 -0
- package/dist/contentful/references.d.ts +7 -0
- package/dist/contentful/references.d.ts.map +1 -0
- package/dist/contentful/references.js +12 -0
- package/dist/contentful/references.js.map +1 -0
- package/dist/contentful/write.d.ts +16 -0
- package/dist/contentful/write.d.ts.map +1 -0
- package/dist/contentful/write.js +75 -0
- package/dist/contentful/write.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/output/json.d.ts +47 -0
- package/dist/output/json.d.ts.map +1 -0
- package/dist/output/json.js +87 -0
- package/dist/output/json.js.map +1 -0
- package/dist/output/mode.d.ts +3 -0
- package/dist/output/mode.d.ts.map +1 -0
- package/dist/output/mode.js +16 -0
- package/dist/output/mode.js.map +1 -0
- package/dist/output/print.d.ts +14 -0
- package/dist/output/print.d.ts.map +1 -0
- package/dist/output/print.js +61 -0
- package/dist/output/print.js.map +1 -0
- package/dist/rtf/fromMarkdown.d.ts +19 -0
- package/dist/rtf/fromMarkdown.d.ts.map +1 -0
- package/dist/rtf/fromMarkdown.js +230 -0
- package/dist/rtf/fromMarkdown.js.map +1 -0
- package/dist/rtf/toMarkdown.d.ts +6 -0
- package/dist/rtf/toMarkdown.d.ts.map +1 -0
- package/dist/rtf/toMarkdown.js +105 -0
- package/dist/rtf/toMarkdown.js.map +1 -0
- package/dist/session/refs.d.ts +35 -0
- package/dist/session/refs.d.ts.map +1 -0
- package/dist/session/refs.js +128 -0
- package/dist/session/refs.js.map +1 -0
- package/dist/session/state.d.ts +91 -0
- package/dist/session/state.d.ts.map +1 -0
- package/dist/session/state.js +61 -0
- package/dist/session/state.js.map +1 -0
- package/dist/session/store.d.ts +10 -0
- package/dist/session/store.d.ts.map +1 -0
- package/dist/session/store.js +62 -0
- package/dist/session/store.js.map +1 -0
- package/dist/snapshot/render.d.ts +15 -0
- package/dist/snapshot/render.d.ts.map +1 -0
- package/dist/snapshot/render.js +166 -0
- package/dist/snapshot/render.js.map +1 -0
- package/dist/validation/allowed-types.d.ts +7 -0
- package/dist/validation/allowed-types.d.ts.map +1 -0
- package/dist/validation/allowed-types.js +16 -0
- package/dist/validation/allowed-types.js.map +1 -0
- package/package.json +61 -0
- package/skills/core/SKILL.md +483 -0
- package/skills/manifest.json +7 -0
- package/skills/navigation/SKILL.md +18 -0
- package/skills/rich-text/SKILL.md +23 -0
- package/skills/screenshots/SKILL.md +32 -0
- 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 @@
|
|
|
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":"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"}
|
|
@@ -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
|