@cairn-tool/cairn 2.1.0 → 3.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -3
- package/dist/agent/conditionals.d.ts +43 -0
- package/dist/agent/conditionals.js +314 -0
- package/dist/agent/conditionals.js.map +1 -0
- package/dist/agent/install/config.d.ts +47 -0
- package/dist/agent/install/config.js +156 -0
- package/dist/agent/install/config.js.map +1 -0
- package/dist/agent/install/index.d.ts +95 -14
- package/dist/agent/install/index.js +460 -188
- package/dist/agent/install/index.js.map +1 -1
- package/dist/agent/parser.js +15 -41
- package/dist/agent/parser.js.map +1 -1
- package/dist/agent/render.d.ts +9 -1
- package/dist/agent/render.js +12 -9
- package/dist/agent/render.js.map +1 -1
- package/dist/agent/types.d.ts +2 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/agent/verify/compare.d.ts +10 -1
- package/dist/agent/verify/compare.js +1 -1
- package/dist/agent/verify/compare.js.map +1 -1
- package/dist/agent/verify/config.js +1 -1
- package/dist/agent/verify/config.js.map +1 -1
- package/dist/agent/verify/index.js +20 -4
- package/dist/agent/verify/index.js.map +1 -1
- package/dist/agent/verify/resolve.d.ts +1 -0
- package/dist/agent/verify/resolve.js +2 -2
- package/dist/agent/verify/resolve.js.map +1 -1
- package/dist/cli.js +40 -5
- package/dist/cli.js.map +1 -1
- package/dist/commands/agent-install.d.ts +15 -1
- package/dist/commands/agent-install.js +121 -24
- package/dist/commands/agent-install.js.map +1 -1
- package/dist/commands/jira.d.ts +17 -0
- package/dist/commands/jira.js +195 -0
- package/dist/commands/jira.js.map +1 -0
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/contract/registry.js +39 -2
- package/dist/contract/registry.js.map +1 -1
- package/dist/contract/schemas/index.js +2 -0
- package/dist/contract/schemas/index.js.map +1 -1
- package/dist/contract/schemas/jira.d.ts +2 -0
- package/dist/contract/schemas/jira.js +102 -0
- package/dist/contract/schemas/jira.js.map +1 -0
- package/dist/jira/adf/diagnostics.d.ts +77 -0
- package/dist/jira/adf/diagnostics.js +100 -0
- package/dist/jira/adf/diagnostics.js.map +1 -0
- package/dist/jira/adf/from-markdown.d.ts +6 -0
- package/dist/jira/adf/from-markdown.js +650 -0
- package/dist/jira/adf/from-markdown.js.map +1 -0
- package/dist/jira/adf/inspect.d.ts +11 -0
- package/dist/jira/adf/inspect.js +56 -0
- package/dist/jira/adf/inspect.js.map +1 -0
- package/dist/jira/adf/profile.d.ts +101 -0
- package/dist/jira/adf/profile.js +248 -0
- package/dist/jira/adf/profile.js.map +1 -0
- package/dist/jira/adf/read.d.ts +33 -0
- package/dist/jira/adf/read.js +250 -0
- package/dist/jira/adf/read.js.map +1 -0
- package/dist/jira/adf/serialize.d.ts +5 -0
- package/dist/jira/adf/serialize.js +54 -0
- package/dist/jira/adf/serialize.js.map +1 -0
- package/dist/jira/adf/to-markdown.d.ts +14 -0
- package/dist/jira/adf/to-markdown.js +512 -0
- package/dist/jira/adf/to-markdown.js.map +1 -0
- package/dist/jira/adf/types.d.ts +73 -0
- package/dist/jira/adf/types.js +2 -0
- package/dist/jira/adf/types.js.map +1 -0
- package/dist/jira/adf/validate.d.ts +7 -0
- package/dist/jira/adf/validate.js +182 -0
- package/dist/jira/adf/validate.js.map +1 -0
- package/dist/mapping-quality.d.ts +18 -0
- package/dist/mapping-quality.js +12 -0
- package/dist/mapping-quality.js.map +1 -0
- package/package.json +13 -10
|
@@ -0,0 +1,512 @@
|
|
|
1
|
+
import { unified } from "unified";
|
|
2
|
+
import remarkGfm from "remark-gfm";
|
|
3
|
+
import remarkStringify from "remark-stringify";
|
|
4
|
+
import { CODES, DiagnosticSink } from "./diagnostics.js";
|
|
5
|
+
import { FIDELITY, MARK_FIDELITY, PANEL_TYPES } from "./profile.js";
|
|
6
|
+
/**
|
|
7
|
+
* Every stringify option is pinned.
|
|
8
|
+
*
|
|
9
|
+
* Left at their defaults, a `remark-stringify` minor bump silently changes the
|
|
10
|
+
* bytes of every document this command has ever produced. `emphasis: "_"` and
|
|
11
|
+
* `strong: "*"` also match this repository's own `.markdownlintrc`, so converted
|
|
12
|
+
* documents lint clean where they land.
|
|
13
|
+
*/
|
|
14
|
+
const STRINGIFY_OPTIONS = {
|
|
15
|
+
bullet: "-",
|
|
16
|
+
bulletOrdered: ".",
|
|
17
|
+
emphasis: "_",
|
|
18
|
+
strong: "*",
|
|
19
|
+
fence: "`",
|
|
20
|
+
fences: true,
|
|
21
|
+
rule: "-",
|
|
22
|
+
ruleRepetition: 3,
|
|
23
|
+
ruleSpaces: false,
|
|
24
|
+
setext: false,
|
|
25
|
+
closeAtx: false,
|
|
26
|
+
incrementListMarker: true,
|
|
27
|
+
listItemIndent: "one",
|
|
28
|
+
resourceLink: false,
|
|
29
|
+
tightDefinitions: false,
|
|
30
|
+
};
|
|
31
|
+
const processor = unified()
|
|
32
|
+
.use(remarkGfm)
|
|
33
|
+
.use(remarkStringify, STRINGIFY_OPTIONS);
|
|
34
|
+
/**
|
|
35
|
+
* The order marks are applied, innermost first.
|
|
36
|
+
*
|
|
37
|
+
* Fixed rather than following the order the marks happen to appear in, because
|
|
38
|
+
* mdast nests what ADF keeps flat and a varying nesting order would vary the
|
|
39
|
+
* output bytes for identical input. `code` is innermost because `inlineCode` is
|
|
40
|
+
* a literal and cannot contain other nodes; `link` is outermost so the whole
|
|
41
|
+
* styled run becomes the link text.
|
|
42
|
+
*/
|
|
43
|
+
const MARK_ORDER = ["code", "strike", "em", "strong", "link"];
|
|
44
|
+
const text = (value) => ({ type: "text", value });
|
|
45
|
+
function markNamed(marks, name) {
|
|
46
|
+
return marks?.find((mark) => mark.type === name);
|
|
47
|
+
}
|
|
48
|
+
function asString(value) {
|
|
49
|
+
return typeof value === "string" ? value : undefined;
|
|
50
|
+
}
|
|
51
|
+
/** Formats an ADF `date` in UTC. Reading the host zone would make output machine-dependent. */
|
|
52
|
+
function formatTimestamp(timestamp) {
|
|
53
|
+
const millis = Number(timestamp);
|
|
54
|
+
if (!Number.isFinite(millis))
|
|
55
|
+
return String(timestamp ?? "");
|
|
56
|
+
return new Date(millis).toISOString().slice(0, 10);
|
|
57
|
+
}
|
|
58
|
+
class Converter {
|
|
59
|
+
sink = new DiagnosticSink();
|
|
60
|
+
/** `trail` is the *parent* path: `node` already names the type, so it is not repeated. */
|
|
61
|
+
note(node, trail) {
|
|
62
|
+
const rating = FIDELITY[node.type];
|
|
63
|
+
if (!rating) {
|
|
64
|
+
this.sink.add({
|
|
65
|
+
code: CODES.unknownNode,
|
|
66
|
+
quality: "unsupported",
|
|
67
|
+
severity: "warning",
|
|
68
|
+
message: `Unrecognized ADF node type '${node.type}'; nothing was emitted for it`,
|
|
69
|
+
node: node.type,
|
|
70
|
+
location: trail.join("/"),
|
|
71
|
+
remediation: "This tool's content model does not know this node. Check for a newer cairn, or report the type.",
|
|
72
|
+
});
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (rating.quality === "exact")
|
|
76
|
+
return;
|
|
77
|
+
this.sink.add({
|
|
78
|
+
code: CODE_FOR_NODE[node.type] ?? CODES.inlineApproximated,
|
|
79
|
+
quality: rating.quality,
|
|
80
|
+
message: `${node.type}: ${rating.note}`,
|
|
81
|
+
node: node.type,
|
|
82
|
+
location: trail.join("/"),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/** Applies ADF marks to a phrasing node, innermost first. */
|
|
86
|
+
applyMarks(content, marks, trail) {
|
|
87
|
+
if (!marks?.length)
|
|
88
|
+
return content;
|
|
89
|
+
for (const mark of marks) {
|
|
90
|
+
const rating = MARK_FIDELITY[mark.type];
|
|
91
|
+
if (!rating) {
|
|
92
|
+
this.sink.add({
|
|
93
|
+
code: CODES.unknownMark,
|
|
94
|
+
quality: "unsupported",
|
|
95
|
+
severity: "warning",
|
|
96
|
+
message: `Unrecognized ADF mark '${mark.type}'; its formatting was dropped`,
|
|
97
|
+
node: mark.type,
|
|
98
|
+
location: trail.join("/"),
|
|
99
|
+
});
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
if (rating.quality !== "exact")
|
|
103
|
+
this.sink.add({
|
|
104
|
+
code: CODES.markDropped,
|
|
105
|
+
quality: rating.quality,
|
|
106
|
+
message: `mark ${mark.type}: ${rating.note}`,
|
|
107
|
+
node: mark.type,
|
|
108
|
+
location: trail.join("/"),
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
let current = content;
|
|
112
|
+
for (const name of MARK_ORDER) {
|
|
113
|
+
const mark = markNamed(marks, name);
|
|
114
|
+
if (!mark)
|
|
115
|
+
continue;
|
|
116
|
+
if (name === "code") {
|
|
117
|
+
const literal = { type: "inlineCode", value: plainText(current) };
|
|
118
|
+
current = [literal];
|
|
119
|
+
continue;
|
|
120
|
+
}
|
|
121
|
+
if (name === "strike") {
|
|
122
|
+
const node = { type: "delete", children: current };
|
|
123
|
+
current = [node];
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
if (name === "em") {
|
|
127
|
+
const node = { type: "emphasis", children: current };
|
|
128
|
+
current = [node];
|
|
129
|
+
continue;
|
|
130
|
+
}
|
|
131
|
+
if (name === "strong") {
|
|
132
|
+
const node = { type: "strong", children: current };
|
|
133
|
+
current = [node];
|
|
134
|
+
continue;
|
|
135
|
+
}
|
|
136
|
+
const href = asString(mark.attrs?.href) ?? "";
|
|
137
|
+
const title = asString(mark.attrs?.title);
|
|
138
|
+
const node = {
|
|
139
|
+
type: "link",
|
|
140
|
+
url: href,
|
|
141
|
+
...(title ? { title } : {}),
|
|
142
|
+
children: current,
|
|
143
|
+
};
|
|
144
|
+
current = [node];
|
|
145
|
+
}
|
|
146
|
+
return current;
|
|
147
|
+
}
|
|
148
|
+
/** Converts a run of ADF inline nodes to mdast phrasing content. */
|
|
149
|
+
inline(nodes, trail) {
|
|
150
|
+
const out = [];
|
|
151
|
+
for (const node of nodes ?? []) {
|
|
152
|
+
const here = [...trail, node.type];
|
|
153
|
+
switch (node.type) {
|
|
154
|
+
case "text": {
|
|
155
|
+
const value = node.text ?? "";
|
|
156
|
+
if (value === "")
|
|
157
|
+
break;
|
|
158
|
+
out.push(...this.applyMarks([text(value)], node.marks, trail));
|
|
159
|
+
break;
|
|
160
|
+
}
|
|
161
|
+
case "hardBreak": {
|
|
162
|
+
const node2 = { type: "break" };
|
|
163
|
+
out.push(node2);
|
|
164
|
+
break;
|
|
165
|
+
}
|
|
166
|
+
case "emoji": {
|
|
167
|
+
this.note(node, trail);
|
|
168
|
+
out.push(text(asString(node.attrs?.text) ?? asString(node.attrs?.shortName) ?? ""));
|
|
169
|
+
break;
|
|
170
|
+
}
|
|
171
|
+
case "mention": {
|
|
172
|
+
this.note(node, trail);
|
|
173
|
+
out.push(text(asString(node.attrs?.text) ?? `@${asString(node.attrs?.id) ?? "unknown"}`));
|
|
174
|
+
break;
|
|
175
|
+
}
|
|
176
|
+
case "date": {
|
|
177
|
+
this.note(node, trail);
|
|
178
|
+
out.push(text(formatTimestamp(node.attrs?.timestamp)));
|
|
179
|
+
break;
|
|
180
|
+
}
|
|
181
|
+
case "status": {
|
|
182
|
+
this.note(node, trail);
|
|
183
|
+
out.push({ type: "inlineCode", value: asString(node.attrs?.text) ?? "" });
|
|
184
|
+
break;
|
|
185
|
+
}
|
|
186
|
+
case "inlineCard": {
|
|
187
|
+
this.note(node, trail);
|
|
188
|
+
const url = asString(node.attrs?.url) ?? "";
|
|
189
|
+
out.push({ type: "link", url, children: [text(url)] });
|
|
190
|
+
break;
|
|
191
|
+
}
|
|
192
|
+
case "mediaInline": {
|
|
193
|
+
this.note(node, trail);
|
|
194
|
+
out.push(this.mediaLink(node, trail));
|
|
195
|
+
break;
|
|
196
|
+
}
|
|
197
|
+
case "placeholder":
|
|
198
|
+
case "inlineExtension": {
|
|
199
|
+
this.note(node, trail);
|
|
200
|
+
break;
|
|
201
|
+
}
|
|
202
|
+
default: {
|
|
203
|
+
this.note(node, trail);
|
|
204
|
+
// An unknown inline node still contributes its text children, if any,
|
|
205
|
+
// rather than silently taking them with it.
|
|
206
|
+
out.push(...this.inline(node.content, here));
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
return out;
|
|
211
|
+
}
|
|
212
|
+
/** A `media` node with no fetchable URL becomes a link carrying its id. */
|
|
213
|
+
mediaLink(node, trail) {
|
|
214
|
+
const id = asString(node.attrs?.id) ?? "unknown";
|
|
215
|
+
this.sink.add({
|
|
216
|
+
code: CODES.mediaUnresolvable,
|
|
217
|
+
quality: "approximate",
|
|
218
|
+
message: `Attachment ${id} has no URL, so it became a link carrying its media id`,
|
|
219
|
+
node: node.type,
|
|
220
|
+
location: trail.join("/"),
|
|
221
|
+
remediation: "Resolve the attachment through the Jira API if you need a fetchable link; this tool has no site URL.",
|
|
222
|
+
});
|
|
223
|
+
return { type: "link", url: `media:${id}`, children: [text(`attachment ${id}`)] };
|
|
224
|
+
}
|
|
225
|
+
media(node, trail) {
|
|
226
|
+
const kind = asString(node.attrs?.type);
|
|
227
|
+
const url = asString(node.attrs?.url);
|
|
228
|
+
if (kind === "external" && url) {
|
|
229
|
+
const alt = asString(node.attrs?.alt);
|
|
230
|
+
return { type: "image", url, ...(alt ? { alt } : {}) };
|
|
231
|
+
}
|
|
232
|
+
return this.mediaLink(node, trail);
|
|
233
|
+
}
|
|
234
|
+
/** Converts a run of ADF block nodes to mdast block content. */
|
|
235
|
+
blocks(nodes, trail) {
|
|
236
|
+
const out = [];
|
|
237
|
+
for (const node of nodes ?? []) {
|
|
238
|
+
const here = [...trail, node.type];
|
|
239
|
+
switch (node.type) {
|
|
240
|
+
case "paragraph": {
|
|
241
|
+
const paragraph = {
|
|
242
|
+
type: "paragraph",
|
|
243
|
+
children: this.inline(node.content, here),
|
|
244
|
+
};
|
|
245
|
+
out.push(paragraph);
|
|
246
|
+
break;
|
|
247
|
+
}
|
|
248
|
+
case "heading": {
|
|
249
|
+
const level = Number(node.attrs?.level);
|
|
250
|
+
const depth = (Number.isInteger(level) && level >= 1 && level <= 6 ? level : 1);
|
|
251
|
+
const heading = {
|
|
252
|
+
type: "heading",
|
|
253
|
+
depth,
|
|
254
|
+
children: this.inline(node.content, here),
|
|
255
|
+
};
|
|
256
|
+
out.push(heading);
|
|
257
|
+
break;
|
|
258
|
+
}
|
|
259
|
+
case "rule": {
|
|
260
|
+
out.push({ type: "thematicBreak" });
|
|
261
|
+
break;
|
|
262
|
+
}
|
|
263
|
+
case "codeBlock": {
|
|
264
|
+
const lang = asString(node.attrs?.language);
|
|
265
|
+
out.push({
|
|
266
|
+
type: "code",
|
|
267
|
+
...(lang ? { lang } : {}),
|
|
268
|
+
value: (node.content ?? []).map((child) => child.text ?? "").join(""),
|
|
269
|
+
});
|
|
270
|
+
break;
|
|
271
|
+
}
|
|
272
|
+
case "blockquote": {
|
|
273
|
+
out.push({ type: "blockquote", children: this.blocks(node.content, here) });
|
|
274
|
+
break;
|
|
275
|
+
}
|
|
276
|
+
case "bulletList": {
|
|
277
|
+
out.push(this.list(node, here, false));
|
|
278
|
+
break;
|
|
279
|
+
}
|
|
280
|
+
case "orderedList": {
|
|
281
|
+
out.push(this.list(node, here, true));
|
|
282
|
+
break;
|
|
283
|
+
}
|
|
284
|
+
case "table": {
|
|
285
|
+
this.note(node, trail);
|
|
286
|
+
out.push(this.table(node, here));
|
|
287
|
+
break;
|
|
288
|
+
}
|
|
289
|
+
case "taskList": {
|
|
290
|
+
this.note(node, trail);
|
|
291
|
+
out.push(this.taskList(node, here));
|
|
292
|
+
break;
|
|
293
|
+
}
|
|
294
|
+
case "decisionList": {
|
|
295
|
+
this.note(node, trail);
|
|
296
|
+
const items = (node.content ?? []).map((item) => ({
|
|
297
|
+
type: "listItem",
|
|
298
|
+
spread: false,
|
|
299
|
+
children: [
|
|
300
|
+
{ type: "paragraph", children: this.inline(item.content, here) },
|
|
301
|
+
],
|
|
302
|
+
}));
|
|
303
|
+
out.push({ type: "list", ordered: false, spread: false, children: items });
|
|
304
|
+
break;
|
|
305
|
+
}
|
|
306
|
+
case "panel": {
|
|
307
|
+
this.note(node, trail);
|
|
308
|
+
const kind = asString(node.attrs?.panelType) ?? "info";
|
|
309
|
+
const label = PANEL_TYPES.has(kind) ? kind : "info";
|
|
310
|
+
const lead = {
|
|
311
|
+
type: "paragraph",
|
|
312
|
+
children: [
|
|
313
|
+
{ type: "strong", children: [text(`${label[0].toUpperCase()}${label.slice(1)}`)] },
|
|
314
|
+
],
|
|
315
|
+
};
|
|
316
|
+
out.push({ type: "blockquote", children: [lead, ...this.blocks(node.content, here)] });
|
|
317
|
+
break;
|
|
318
|
+
}
|
|
319
|
+
case "expand":
|
|
320
|
+
case "nestedExpand": {
|
|
321
|
+
this.note(node, trail);
|
|
322
|
+
const title = asString(node.attrs?.title) ?? "Details";
|
|
323
|
+
const lead = {
|
|
324
|
+
type: "paragraph",
|
|
325
|
+
children: [{ type: "strong", children: [text(title)] }],
|
|
326
|
+
};
|
|
327
|
+
out.push(lead, ...this.blocks(node.content, here));
|
|
328
|
+
break;
|
|
329
|
+
}
|
|
330
|
+
case "mediaSingle": {
|
|
331
|
+
this.note(node, trail);
|
|
332
|
+
const media = (node.content ?? [])[0];
|
|
333
|
+
if (media)
|
|
334
|
+
out.push({ type: "paragraph", children: [this.media(media, here)] });
|
|
335
|
+
break;
|
|
336
|
+
}
|
|
337
|
+
case "mediaGroup": {
|
|
338
|
+
this.note(node, trail);
|
|
339
|
+
const items = (node.content ?? []).map((media) => ({
|
|
340
|
+
type: "listItem",
|
|
341
|
+
spread: false,
|
|
342
|
+
children: [{ type: "paragraph", children: [this.media(media, here)] }],
|
|
343
|
+
}));
|
|
344
|
+
if (items.length)
|
|
345
|
+
out.push({ type: "list", ordered: false, spread: false, children: items });
|
|
346
|
+
break;
|
|
347
|
+
}
|
|
348
|
+
case "layoutSection":
|
|
349
|
+
case "layoutColumn": {
|
|
350
|
+
this.note(node, trail);
|
|
351
|
+
out.push(...this.blocks(node.content, here));
|
|
352
|
+
break;
|
|
353
|
+
}
|
|
354
|
+
case "extension":
|
|
355
|
+
case "bodiedExtension":
|
|
356
|
+
case "multiBodiedExtension":
|
|
357
|
+
case "extensionFrame": {
|
|
358
|
+
this.note(node, trail);
|
|
359
|
+
break;
|
|
360
|
+
}
|
|
361
|
+
default: {
|
|
362
|
+
this.note(node, trail);
|
|
363
|
+
out.push(...this.blocks(node.content, here));
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
}
|
|
367
|
+
return out;
|
|
368
|
+
}
|
|
369
|
+
list(node, trail, ordered) {
|
|
370
|
+
const start = Number(node.attrs?.order);
|
|
371
|
+
const children = (node.content ?? []).map((item) => ({
|
|
372
|
+
type: "listItem",
|
|
373
|
+
spread: false,
|
|
374
|
+
children: this.blocks(item.content, [...trail, "listItem"]),
|
|
375
|
+
}));
|
|
376
|
+
return {
|
|
377
|
+
type: "list",
|
|
378
|
+
ordered,
|
|
379
|
+
...(ordered && Number.isInteger(start) && start !== 1 ? { start } : {}),
|
|
380
|
+
spread: false,
|
|
381
|
+
children,
|
|
382
|
+
};
|
|
383
|
+
}
|
|
384
|
+
taskList(node, trail) {
|
|
385
|
+
const children = [];
|
|
386
|
+
for (const item of node.content ?? []) {
|
|
387
|
+
if (item.type === "taskList") {
|
|
388
|
+
// A nested taskList is a sibling of the items in ADF; in Markdown it
|
|
389
|
+
// belongs inside the preceding item, which is where its indentation puts it.
|
|
390
|
+
const previous = children[children.length - 1];
|
|
391
|
+
if (previous)
|
|
392
|
+
previous.children.push(this.taskList(item, trail));
|
|
393
|
+
continue;
|
|
394
|
+
}
|
|
395
|
+
children.push({
|
|
396
|
+
type: "listItem",
|
|
397
|
+
checked: asString(item.attrs?.state) === "DONE",
|
|
398
|
+
spread: false,
|
|
399
|
+
children: [
|
|
400
|
+
{
|
|
401
|
+
type: "paragraph",
|
|
402
|
+
children: this.inline(item.content, [...trail, "taskItem"]),
|
|
403
|
+
},
|
|
404
|
+
],
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
return { type: "list", ordered: false, spread: false, children };
|
|
408
|
+
}
|
|
409
|
+
table(node, trail) {
|
|
410
|
+
const rows = [];
|
|
411
|
+
for (const row of node.content ?? []) {
|
|
412
|
+
const cells = [];
|
|
413
|
+
for (const cell of row.content ?? []) {
|
|
414
|
+
const here = [...trail, cell.type];
|
|
415
|
+
const blocks = this.blocks(cell.content, here);
|
|
416
|
+
// A GFM cell holds inline content only; an ADF cell holds blocks. So the
|
|
417
|
+
// blocks collapse into one run, joined by a space.
|
|
418
|
+
if (blocks.length > 1 || (blocks[0] && blocks[0].type !== "paragraph"))
|
|
419
|
+
this.sink.add({
|
|
420
|
+
code: CODES.tableFlattened,
|
|
421
|
+
quality: "approximate",
|
|
422
|
+
message: "Table cell block content was flattened to inline text",
|
|
423
|
+
node: cell.type,
|
|
424
|
+
location: here.join("/"),
|
|
425
|
+
});
|
|
426
|
+
if (cell.attrs && (cell.attrs.colspan !== undefined || cell.attrs.rowspan !== undefined))
|
|
427
|
+
this.sink.add({
|
|
428
|
+
code: CODES.tableFlattened,
|
|
429
|
+
quality: "approximate",
|
|
430
|
+
message: "Table cell spans are not representable in a GFM table",
|
|
431
|
+
node: cell.type,
|
|
432
|
+
location: here.join("/"),
|
|
433
|
+
});
|
|
434
|
+
cells.push({ type: "tableCell", children: flattenToPhrasing(blocks) });
|
|
435
|
+
}
|
|
436
|
+
rows.push({ type: "tableRow", children: cells });
|
|
437
|
+
}
|
|
438
|
+
const width = Math.max(0, ...rows.map((row) => row.children.length));
|
|
439
|
+
return { type: "table", align: Array.from({ length: width }, () => null), children: rows };
|
|
440
|
+
}
|
|
441
|
+
}
|
|
442
|
+
/** Diagnostic code per approximated node type, so a consumer can suppress precisely. */
|
|
443
|
+
const CODE_FOR_NODE = {
|
|
444
|
+
table: CODES.tableFlattened,
|
|
445
|
+
tableRow: CODES.tableFlattened,
|
|
446
|
+
tableCell: CODES.tableFlattened,
|
|
447
|
+
tableHeader: CODES.tableFlattened,
|
|
448
|
+
taskList: CODES.taskListApproximated,
|
|
449
|
+
taskItem: CODES.taskListApproximated,
|
|
450
|
+
panel: CODES.panelApproximated,
|
|
451
|
+
expand: CODES.expandApproximated,
|
|
452
|
+
nestedExpand: CODES.expandApproximated,
|
|
453
|
+
mediaSingle: CODES.mediaApproximated,
|
|
454
|
+
mediaGroup: CODES.mediaApproximated,
|
|
455
|
+
media: CODES.mediaApproximated,
|
|
456
|
+
mediaInline: CODES.mediaApproximated,
|
|
457
|
+
decisionList: CODES.decisionApproximated,
|
|
458
|
+
decisionItem: CODES.decisionApproximated,
|
|
459
|
+
layoutSection: CODES.layoutCollapsed,
|
|
460
|
+
layoutColumn: CODES.layoutCollapsed,
|
|
461
|
+
inlineCard: CODES.cardApproximated,
|
|
462
|
+
blockCard: CODES.cardApproximated,
|
|
463
|
+
embedCard: CODES.cardApproximated,
|
|
464
|
+
extension: CODES.extensionDropped,
|
|
465
|
+
bodiedExtension: CODES.extensionDropped,
|
|
466
|
+
inlineExtension: CODES.extensionDropped,
|
|
467
|
+
multiBodiedExtension: CODES.extensionDropped,
|
|
468
|
+
extensionFrame: CODES.extensionDropped,
|
|
469
|
+
placeholder: CODES.extensionDropped,
|
|
470
|
+
};
|
|
471
|
+
/** The visible text of a phrasing run, for `inlineCode`, which holds no children. */
|
|
472
|
+
function plainText(nodes) {
|
|
473
|
+
return nodes
|
|
474
|
+
.map((node) => {
|
|
475
|
+
if (node.type === "text" || node.type === "inlineCode")
|
|
476
|
+
return node.value;
|
|
477
|
+
if ("children" in node)
|
|
478
|
+
return plainText(node.children);
|
|
479
|
+
return "";
|
|
480
|
+
})
|
|
481
|
+
.join("");
|
|
482
|
+
}
|
|
483
|
+
/** Collapses block content into a single phrasing run, joining blocks with a space. */
|
|
484
|
+
function flattenToPhrasing(blocks) {
|
|
485
|
+
const out = [];
|
|
486
|
+
for (const block of blocks) {
|
|
487
|
+
if (out.length)
|
|
488
|
+
out.push(text(" "));
|
|
489
|
+
if (block.type === "paragraph" || block.type === "heading")
|
|
490
|
+
out.push(...block.children);
|
|
491
|
+
else if (block.type === "code")
|
|
492
|
+
out.push({ type: "inlineCode", value: block.value });
|
|
493
|
+
else if ("children" in block)
|
|
494
|
+
out.push(...flattenToPhrasing(block.children));
|
|
495
|
+
}
|
|
496
|
+
return out;
|
|
497
|
+
}
|
|
498
|
+
/**
|
|
499
|
+
* Converts an ADF document to Markdown.
|
|
500
|
+
*
|
|
501
|
+
* Emits no frontmatter, ever, and this is not an option: an ADF document carries
|
|
502
|
+
* no title, key, status, or author, so there is nothing to put there. Provenance
|
|
503
|
+
* belongs in the result payload, the way `agent convert` writes a report rather
|
|
504
|
+
* than inlining one.
|
|
505
|
+
*/
|
|
506
|
+
export function toMarkdown(document) {
|
|
507
|
+
const converter = new Converter();
|
|
508
|
+
const children = converter.blocks(document.content, ["doc"]);
|
|
509
|
+
const root = { type: "root", children };
|
|
510
|
+
return { markdown: processor.stringify(root), diagnostics: converter.sink.all() };
|
|
511
|
+
}
|
|
512
|
+
//# sourceMappingURL=to-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"to-markdown.js","sourceRoot":"","sources":["../../../src/jira/adf/to-markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import type { MappingQuality } from "../../mapping-quality.js";
|
|
2
|
+
export type { MappingQuality } from "../../mapping-quality.js";
|
|
3
|
+
/** An ADF mark: inline formatting attached to a text node. */
|
|
4
|
+
export interface AdfMark {
|
|
5
|
+
type: string;
|
|
6
|
+
attrs?: Record<string, unknown>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* An ADF node.
|
|
10
|
+
*
|
|
11
|
+
* Deliberately structural rather than a discriminated union over the ~40 node
|
|
12
|
+
* types. The converters branch on `type` through the profile's tables, and a
|
|
13
|
+
* union would have to be widened every time Atlassian adds a node — which is
|
|
14
|
+
* the case that must reach `AD100` rather than failing to compile.
|
|
15
|
+
*/
|
|
16
|
+
export interface AdfNode {
|
|
17
|
+
type: string;
|
|
18
|
+
attrs?: Record<string, unknown>;
|
|
19
|
+
content?: AdfNode[];
|
|
20
|
+
marks?: AdfMark[];
|
|
21
|
+
/** Present only on `text` nodes. */
|
|
22
|
+
text?: string;
|
|
23
|
+
}
|
|
24
|
+
/** The root of an ADF document. `version` is the document version, always 1. */
|
|
25
|
+
export interface AdfDocument extends AdfNode {
|
|
26
|
+
version: number;
|
|
27
|
+
type: "doc";
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* A conversion finding.
|
|
31
|
+
*
|
|
32
|
+
* The third finding record in this tool, and not interchangeable with the other
|
|
33
|
+
* two: `Issue` carries no severity or quality, and `AgentDiagnostic`'s published
|
|
34
|
+
* schema pins `code` to `^AB[0-9]{3}$` and carries agent-bundle concepts in
|
|
35
|
+
* `target` and `profile`. See docs/diagnostics.md.
|
|
36
|
+
*/
|
|
37
|
+
export interface ConversionDiagnostic {
|
|
38
|
+
code: string;
|
|
39
|
+
severity: "notice" | "warning" | "error";
|
|
40
|
+
message: string;
|
|
41
|
+
quality: MappingQuality;
|
|
42
|
+
/** ADF node or mark type the finding concerns. */
|
|
43
|
+
node?: string;
|
|
44
|
+
/** Slash-joined ancestor types, e.g. `doc/bulletList/listItem`. */
|
|
45
|
+
location?: string;
|
|
46
|
+
remediation?: string;
|
|
47
|
+
}
|
|
48
|
+
export type AdfCommand = "to-markdown" | "from-markdown" | "validate" | "inspect";
|
|
49
|
+
/** One row of `jira adf inspect`'s inventory. */
|
|
50
|
+
export interface InventoryEntry {
|
|
51
|
+
/** Node or mark type. */
|
|
52
|
+
type: string;
|
|
53
|
+
kind: "node" | "mark";
|
|
54
|
+
count: number;
|
|
55
|
+
/** How this construct survives a conversion to Markdown. */
|
|
56
|
+
quality: MappingQuality;
|
|
57
|
+
note: string;
|
|
58
|
+
}
|
|
59
|
+
export interface AdfResult {
|
|
60
|
+
command: AdfCommand;
|
|
61
|
+
ok: boolean;
|
|
62
|
+
/** Input path, or `-` for stdin. */
|
|
63
|
+
source: string;
|
|
64
|
+
/** Emitted by `to-markdown`. */
|
|
65
|
+
markdown?: string;
|
|
66
|
+
/** Emitted by `from-markdown`. */
|
|
67
|
+
adf?: AdfDocument;
|
|
68
|
+
/** Emitted by `inspect`. */
|
|
69
|
+
inventory?: InventoryEntry[];
|
|
70
|
+
/** Where `--output` wrote, when it was given. */
|
|
71
|
+
output?: string;
|
|
72
|
+
diagnostics: ConversionDiagnostic[];
|
|
73
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/jira/adf/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { AdfDocument, ConversionDiagnostic } from "./types.js";
|
|
2
|
+
export interface ValidateResult {
|
|
3
|
+
diagnostics: ConversionDiagnostic[];
|
|
4
|
+
/** Node and mark types the content model does not know. */
|
|
5
|
+
unknown: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare function validateAdf(document: AdfDocument): ValidateResult;
|