OverviewFilesCommitsIssuesDocsReleasesPeers

favela-markdown commits / 42bf8e2

lib: strip() — 36/36 vectors green
Implements spec/markdown-strip.md. micromark supplies the four extensions that change block/inline STRUCTURE (gfm strikethrough, tables, footnotes, directives); wiki-links and hashtags are handled here because the spec gives them as lexical rules over text, the hashtag one as a normative regex. Facets are recorded as CHARACTER ranges while building, mapped through normalisation via an index map, and converted to UTF-8 byte offsets LAST (6.4) - which is what makes the multibyte vectors pass. Normalisation is expressed as deletions so a facet range is carried exactly rather than re-found by searching the output. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
42bf8e2db0f4fd32ccd102a7376f657b2889ebd4
by plankatron <fleeky@gmail.com> · 2026-09-05T22:46:34.000Z

Changed files (3) +1524 -1

lib/strip.js +491 -0
……@@ -0,0 +1,491 @@
1// strip(source) -> { text, facets } — spec/markdown-strip.md
2//
3// The strip's output is what bsky sees and what a CID commits to, so every rule here cites the
4// spec section it implements and nothing is left to "whatever the parser does" (§1). The 36
5// vectors are the oracle; this file exists to reproduce them byte-for-byte.
6//
7// Structure, and why:
8//
9// 1. CRLF normalisation happens on the INPUT, before parsing (§5.1).
10// 2. Each block renders into its OWN buffer so an empty block can be omitted along with its
11// separator (§4.1) — you cannot decide that after concatenating.
12// 3. Facets are recorded as CHARACTER ranges while building, then mapped through normalisation,
13// then converted to UTF-8 BYTE offsets last (§6.4: offsets are computed against the FINAL
14// text, never an intermediate). Doing it in this order is what makes the multibyte vectors
15// pass; computing byte offsets early and patching them later is the defect §8 exists to catch.
16// 4. Normalisation is expressed as deletions with an index map, so a facet's range can be
17// carried across it exactly rather than re-derived by searching the text.
18//
19// Extensions: micromark supplies the four that change block/inline STRUCTURE (GFM strikethrough,
20// GFM tables, footnotes, directives). Wiki-links and hashtags are handled here because the spec
21// gives them as lexical rules over text (§3.6, §3.7) — a normative regex in the hashtag case —
22// so there is no structural ambiguity to get wrong.
23
24import { fromMarkdown } from 'mdast-util-from-markdown'
25import { gfmStrikethrough } from 'micromark-extension-gfm-strikethrough'
26import { gfmStrikethroughFromMarkdown } from 'mdast-util-gfm-strikethrough'
27import { gfmTable } from 'micromark-extension-gfm-table'
28import { gfmTableFromMarkdown } from 'mdast-util-gfm-table'
29import { gfmFootnote } from 'micromark-extension-gfm-footnote'
30import { gfmFootnoteFromMarkdown } from 'mdast-util-gfm-footnote'
31import { directive } from 'micromark-extension-directive'
32import { directiveFromMarkdown } from 'mdast-util-directive'
33
34const MICROMARK = {
35 extensions: [gfmStrikethrough(), gfmTable(), gfmFootnote(), directive()],
36 mdastExtensions: [
37 gfmStrikethroughFromMarkdown(),
38 gfmTableFromMarkdown(),
39 gfmFootnoteFromMarkdown(),
40 directiveFromMarkdown()
41 ]
42}
43
44// §3.3 — NORMATIVE. This is favela-web's shipped URL_RE verbatim; changing it changes records.
45// The trailing class is what keeps "see https://x.com." from swallowing the full stop.
46const URL_RE = /\bhttps?:\/\/[^\s<]+[^\s<.,:;!?)\]}'"]/g
47
48// §3.6 — [[Page]] and [[Page|label]].
49const WIKILINK_RE = /\[\[([^\][|]+)(?:\|([^\][]*))?\]\]/g
50
51// §3.7 — '#' at start-of-text or after whitespace, then 1-64 of [A-Za-z0-9_] plus any non-ASCII
52// letter. A '#' inside a word, or one followed only by digits, is literal text.
53const HASHTAG_RE = /(^|\s)(#([A-Za-z0-9_À-￿]{1,64}))/g
54
55// §3.2 — only http/https may carry a link facet. did: is handled separately, and ONLY for
56// mentions (§3.4); anything else emits its label as plain text with no facet.
57const isHttp = (uri) => /^https?:\/\//i.test(String(uri || ''))
58const isDid = (uri) => /^did:/i.test(String(uri || ''))
59
60const linkFeature = (uri) => ({ $type: 'app.bsky.richtext.facet#link', uri })
61const mentionFeature = (did) => ({ $type: 'app.bsky.richtext.facet#mention', did })
62const tagFeature = (tag) => ({ $type: 'app.bsky.richtext.facet#tag', tag })
63
64// A block's rendered text plus the facets found inside it, at character offsets relative to
65// this block. Kept per-block so §4.1 can drop an empty block and its separator together.
66class Buf {
67 constructor () {
68 this.text = ''
69 this.marks = [] // { start, end, feature } — character offsets into this.text
70 }
71
72 get length () { return this.text.length }
73
74 add (s) { this.text += s }
75
76 mark (start, end, feature) {
77 if (end > start) this.marks.push({ start, end, feature })
78 }
79
80 // Append another buffer's text and marks, shifting the marks by the current length.
81 append (other) {
82 const base = this.text.length
83 this.text += other.text
84 for (const m of other.marks) {
85 this.marks.push({ start: m.start + base, end: m.end + base, feature: m.feature })
86 }
87 }
88}
89
90// ── inline ────────────────────────────────────────────────────────────────────
91
92// §3.6 / §3.7 / §3.3 — lexical passes over a plain text run, in one left-to-right sweep so the
93// three can never produce overlapping facets (§6.2 would otherwise have to arbitrate).
94function addTextRun (buf, raw) {
95 // §3.8 — a SOFT line break arrives as "\n" inside a text node and becomes a single space.
96 // A HARD break is a separate 'break' node (below) and stays a newline, so the distinction is
97 // made here by node type rather than by trying to remember which newlines were which after
98 // the text is assembled. One character in, one character out, so no offset shifts.
99 const soft = raw.replace(/\n/g, ' ')
100
101 // Wiki-links next: they rewrite the text, and §3.6 emits no facet, so doing them before the
102 // facet-bearing scans keeps every offset below correct without any later adjustment.
103 const s = soft.replace(WIKILINK_RE, (_m, page, label) => (label !== undefined ? label : page))
104
105 const found = []
106 for (const m of s.matchAll(URL_RE)) {
107 found.push({ start: m.index, end: m.index + m[0].length, feature: linkFeature(m[0]) })
108 }
109 for (const m of s.matchAll(HASHTAG_RE)) {
110 // m[1] is the leading boundary (start-of-text or the whitespace); the facet covers '#tag'
111 // INCLUDING the hash (§3.7: "the hash is kept in the text"), while the value drops it.
112 const start = m.index + m[1].length
113 found.push({ start, end: start + m[2].length, feature: tagFeature(m[3]) })
114 }
115 found.sort((a, b) => a.start - b.start || b.end - a.end)
116
117 const base = buf.length
118 let taken = -1
119 for (const f of found) {
120 if (f.start < taken) continue // overlapping match: the earlier/longer one already won (§6.2)
121 buf.mark(base + f.start, base + f.end, f.feature)
122 taken = f.end
123 }
124 buf.add(s)
125}
126
127function inline (nodes, buf) {
128 for (const node of nodes || []) {
129 switch (node.type) {
130 case 'text':
131 addTextRun(buf, node.value)
132 break
133
134 // §3.1 — markers removed, inner text kept verbatim, NO facet (atproto has no bold).
135 case 'emphasis':
136 case 'strong':
137 case 'delete':
138 inline(node.children, buf)
139 break
140
141 // §3.1 — a code span is text, not markup. Its value is literal, so no lexical scan:
142 // a URL inside backticks was written as code and must not become a link.
143 case 'inlineCode':
144 buf.add(node.value)
145 break
146
147 case 'link': {
148 const uri = node.url
149 const start = buf.length
150 const inner = new Buf()
151 inline(node.children, inner)
152
153 if (isDid(uri)) {
154 // §3.4 — a mention carries a resolved DID in the target. The label is kept as-is.
155 buf.append(inner)
156 buf.mark(start, buf.length, mentionFeature(uri))
157 } else if (isHttp(uri)) {
158 if (inner.length === 0) {
159 // §3.2 — an empty label emits the URL as text, with a facet over it.
160 buf.add(uri)
161 buf.mark(start, buf.length, linkFeature(uri))
162 } else {
163 buf.append(inner)
164 buf.mark(start, buf.length, linkFeature(uri))
165 }
166 } else {
167 // §3.2 ⛔ — non-http (javascript:, etc.) emits the label as PLAIN TEXT, no facet.
168 // inner.marks are dropped deliberately: a refused link must not smuggle one out.
169 buf.add(inner.text)
170 }
171 break
172 }
173
174 // §3.5 — images produce no text and no facet. The embed pipeline consumes them separately.
175 case 'image':
176 case 'imageReference':
177 break
178
179 // §3.9 — a footnote reference is removed entirely.
180 case 'footnoteReference':
181 break
182
183 // §3.8 — a hard break is one newline. (A soft break arrives as "\n" inside a text node
184 // and is turned into a space by the block-level collapse below.)
185 case 'break':
186 buf.add('\n')
187 break
188
189 // §3.10 — raw HTML is emitted as its literal source text, unparsed, with no facet.
190 case 'html':
191 buf.add(node.value)
192 break
193
194 case 'linkReference':
195 // An unresolved reference has no target, so there is nothing to point a facet at:
196 // it degrades to its label, like a wiki-link (§3.6).
197 inline(node.children, buf)
198 break
199
200 default:
201 if (node.children) inline(node.children, buf)
202 else if (typeof node.value === 'string') buf.add(node.value)
203 }
204 }
205}
206
207function paragraphText (children) {
208 const buf = new Buf()
209 inline(children, buf)
210 return buf
211}
212
213// ── blocks ────────────────────────────────────────────────────────────────────
214
215function listBlock (node, depth) {
216 const buf = new Buf()
217 const indent = ' '.repeat(depth) // §4.5 — nested lists indent two spaces per level
218 let n = typeof node.start === 'number' ? node.start : 1
219 let first = true
220
221 for (const item of node.children || []) {
222 if (item.type !== 'listItem') continue
223 // §4.5 — ordered items use the RENDERED sequence, not the literal source numbers.
224 const marker = node.ordered ? n + '. ' : '• '
225 if (node.ordered) n++
226
227 const inner = new Buf()
228 let firstChild = true
229 for (const child of item.children || []) {
230 const sub = child.type === 'list' ? listBlock(child, depth + 1) : blockBuf(child, depth)
231 if (sub.length === 0) continue
232 if (!firstChild) inner.add('\n')
233 inner.append(sub)
234 firstChild = false
235 }
236 if (inner.length === 0) continue
237
238 if (!first) buf.add('\n')
239 buf.add(indent + marker)
240 buf.append(inner)
241 first = false
242 }
243 return buf
244}
245
246function tableBlock (node) {
247 const buf = new Buf()
248 let firstRow = true
249 for (const row of node.children || []) {
250 if (row.type !== 'tableRow') continue
251 if (!firstRow) buf.add('\n')
252 let firstCell = true
253 for (const cell of row.children || []) {
254 if (!firstCell) buf.add(' | ') // §4.6 — cells joined with ' | ', outer pipes dropped
255 buf.append(paragraphText(cell.children))
256 firstCell = false
257 }
258 firstRow = false
259 }
260 return buf
261}
262
263// Render one block node into its own buffer. Returns an empty buffer for anything §4 omits.
264function blockBuf (node, depth = 0) {
265 switch (node.type) {
266 case 'paragraph':
267 return paragraphText(node.children)
268
269 // §4.2 — ATX and setext both reduce to the heading text; no extra spacing, no case change.
270 case 'heading':
271 return paragraphText(node.children)
272
273 // §4.3 — contents verbatim: no fence, no info string, no re-indent. Not scanned for
274 // hashtags or URLs, for the same reason as an inline code span.
275 case 'code': {
276 const buf = new Buf()
277 buf.add(String(node.value || '').replace(/\n+$/, ''))
278 return buf
279 }
280
281 // §4.4 — the marker is removed and nested quotes flatten. No '> ' prefix is invented.
282 case 'blockquote': {
283 const buf = new Buf()
284 let first = true
285 for (const child of node.children || []) {
286 const sub = blockBuf(child, depth)
287 if (sub.length === 0) continue
288 if (!first) buf.add('\n\n')
289 buf.append(sub)
290 first = false
291 }
292 return buf
293 }
294
295 case 'list':
296 return listBlock(node, depth)
297
298 case 'table':
299 return tableBlock(node)
300
301 // §4.7 — a thematic break is omitted entirely, including its separator.
302 case 'thematicBreak':
303 return new Buf()
304
305 // §3.9 — the definition block is dropped along with its reference.
306 case 'footnoteDefinition':
307 return new Buf()
308
309 // §4.8 — a directive contributes its CONTENTS; the fences and the name are removed.
310 case 'containerDirective':
311 case 'leafDirective':
312 case 'textDirective': {
313 const buf = new Buf()
314 let first = true
315 for (const child of node.children || []) {
316 const sub = blockBuf(child, depth)
317 if (sub.length === 0) continue
318 if (!first) buf.add('\n\n')
319 buf.append(sub)
320 first = false
321 }
322 return buf
323 }
324
325 // §3.10 — block HTML is its literal source text.
326 case 'html': {
327 const buf = new Buf()
328 buf.add(String(node.value || ''))
329 return buf
330 }
331
332 default: {
333 if (node.children) {
334 const buf = new Buf()
335 let first = true
336 for (const child of node.children) {
337 const sub = blockBuf(child, depth)
338 if (sub.length === 0) continue
339 if (!first) buf.add('\n\n')
340 buf.append(sub)
341 first = false
342 }
343 return buf
344 }
345 const buf = new Buf()
346 if (typeof node.value === 'string') buf.add(node.value)
347 return buf
348 }
349 }
350}
351
352// ── normalisation (§5) ────────────────────────────────────────────────────────
353
354// Every §5 rule is a DELETION, so normalising is a filter that also yields old->new index map.
355// Carrying marks across the map is exact; re-finding them in the output would not be.
356function normalise (text) {
357 const keep = []
358 const map = new Array(text.length + 1).fill(-1)
359
360 // §5.2 trailing whitespace per line, §5.3 3+ newlines -> 2, §5.4 outer trim.
361 const lines = []
362 let lineStart = 0
363 for (let i = 0; i <= text.length; i++) {
364 if (i === text.length || text[i] === '\n') {
365 lines.push([lineStart, i])
366 lineStart = i + 1
367 }
368 }
369
370 let newlineRun = 0
371 let emitted = false
372 for (let li = 0; li < lines.length; li++) {
373 const [s, e] = lines[li]
374 let end = e
375 while (end > s && (text[end - 1] === ' ' || text[end - 1] === '\t')) end-- // §5.2
376
377 const blank = end === s
378 if (blank) { newlineRun++; continue }
379
380 if (emitted) {
381 // §5.3 — a run of blank lines collapses so that at most two newlines survive.
382 keep.push(-1)
383 if (newlineRun > 0) keep.push(-1)
384 }
385 newlineRun = 0
386 for (let i = s; i < end; i++) keep.push(i)
387 emitted = true
388 }
389
390 let out = ''
391 for (const idx of keep) {
392 if (idx === -1) { out += '\n'; continue }
393 map[idx] = out.length
394 out += text[idx]
395 }
396 map[text.length] = out.length
397
398 // §5.4 — leading whitespace of the first kept line is not removed by the per-line pass above
399 // (only trailing is), so trim the assembled result and shift the map to match.
400 const lead = out.length - out.replace(/^\s+/, '').length
401 if (lead > 0) {
402 out = out.slice(lead)
403 for (let i = 0; i < map.length; i++) if (map[i] >= 0) map[i] = Math.max(0, map[i] - lead)
404 }
405 const trimmed = out.replace(/\s+$/, '')
406 if (trimmed.length !== out.length) {
407 for (let i = 0; i < map.length; i++) if (map[i] > trimmed.length) map[i] = trimmed.length
408 out = trimmed
409 }
410
411 return { text: out, map }
412}
413
414const byteLen = (s) => {
415 let n = 0
416 for (let i = 0; i < s.length; i++) {
417 const c = s.codePointAt(i)
418 if (c > 0xffff) i++
419 n += c < 0x80 ? 1 : c < 0x800 ? 2 : c < 0x10000 ? 3 : 4
420 }
421 return n
422}
423
424// ── the strip ─────────────────────────────────────────────────────────────────
425
426export function strip (source) {
427 // §2 — total: never throws. Anything unparseable degrades to its literal text.
428 let src
429 try {
430 src = String(source == null ? '' : source).replace(/\r\n?/g, '\n') // §5.1, on the INPUT
431 } catch {
432 return { text: '', facets: [] }
433 }
434
435 let tree
436 try {
437 tree = fromMarkdown(src, MICROMARK)
438 } catch {
439 return { text: src, facets: [] }
440 }
441
442 // §4.1 — blocks joined with exactly "\n\n"; a block producing empty text is omitted along
443 // with its separator, which is why each renders into its own buffer first.
444 const doc = new Buf()
445 let first = true
446 try {
447 for (const node of tree.children || []) {
448 const b = blockBuf(node, 0)
449 if (b.length === 0) continue
450 if (!first) doc.add('\n\n')
451 doc.append(b)
452 first = false
453 }
454 } catch {
455 return { text: '', facets: [] }
456 }
457
458 const { text, map } = normalise(doc.text)
459
460 // §6.4 — offsets are computed against the FINAL text, and only now converted to bytes.
461 const facets = []
462 for (const m of doc.marks) {
463 const s = map[m.start]
464 const e = map[m.end]
465 if (s === undefined || e === undefined || s < 0 || e < 0 || e <= s) continue // §6.3
466 facets.push({
467 index: { byteStart: byteLen(text.slice(0, s)), byteEnd: byteLen(text.slice(0, e)) },
468 features: [m.feature] // §6.5 — exactly one feature per facet
469 })
470 }
471
472 // §6.1 sorted by byteStart; §6.2 on a tie the longer wins, then mention > link > tag.
473 const rank = (f) => (f.features[0].$type.endsWith('#mention') ? 0
474 : f.features[0].$type.endsWith('#link') ? 1 : 2)
475 facets.sort((a, b) =>
476 a.index.byteStart - b.index.byteStart ||
477 b.index.byteEnd - a.index.byteEnd ||
478 rank(a) - rank(b))
479
480 // §6.2 — no overlaps: the winner of the sort above keeps its range, later overlaps are dropped.
481 const out = []
482 let last = -1
483 for (const f of facets) {
484 if (f.index.byteStart < last) continue
485 out.push(f)
486 last = f.index.byteEnd
487 }
488 return { text, facets: out }
489}
490
491export default strip
package-lock.json +1021 -0
……@@ -0,0 +1,1021 @@
1{
2 "name": "favela-markdown",
3 "version": "0.0.0",
4 "lockfileVersion": 3,
5 "requires": true,
6 "packages": {
7 "": {
8 "name": "favela-markdown",
9 "version": "0.0.0",
10 "license": "MIT",
11 "dependencies": {
12 "mdast-util-directive": "^3.1.0",
13 "mdast-util-from-markdown": "^2.0.3",
14 "mdast-util-gfm-footnote": "^2.1.0",
15 "mdast-util-gfm-strikethrough": "^2.0.0",
16 "mdast-util-gfm-table": "^2.0.0",
17 "micromark-extension-directive": "^4.0.0",
18 "micromark-extension-gfm-footnote": "^2.1.0",
19 "micromark-extension-gfm-strikethrough": "^2.1.0",
20 "micromark-extension-gfm-table": "^2.1.1"
21 }
22 },
23 "../ap-bridge/node_modules/brittle": {
24 "version": "3.19.1",
25 "extraneous": true,
26 "license": "Apache-2.0",
27 "dependencies": {
28 "b4a": "^1.6.0",
29 "bare-assert": "^1.0.2",
30 "bare-cov": "^1.1.0",
31 "bare-fs": "^4.1.6",
32 "bare-os": "^3.6.1",
33 "bare-path": "^3.0.0",
34 "bare-process": "^4.2.1",
35 "bare-subprocess": "^5.0.0",
36 "bare-url": "^2.1.6",
37 "error-stack-parser": "^2.1.4",
38 "globbie": "^1.0.2",
39 "paparam": "^1.6.2",
40 "same-object": "^1.0.2",
41 "test-tmp": "^1.4.0",
42 "tmatch": "^5.0.0"
43 },
44 "bin": {
45 "brittle": "bin/node.js",
46 "brittle-bare": "bin/bare.js",
47 "brittle-node": "bin/node.js",
48 "brittle-pear": "bin/pear.js"
49 },
50 "devDependencies": {
51 "chalk": "^4.1.2",
52 "safety-catch": "^1.0.2",
53 "standard": "^17.0.0"
54 }
55 },
56 "node_modules/@types/debug": {
57 "version": "4.1.13",
58 "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz",
59 "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==",
60 "license": "MIT",
61 "dependencies": {
62 "@types/ms": "*"
63 }
64 },
65 "node_modules/@types/mdast": {
66 "version": "4.0.4",
67 "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz",
68 "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==",
69 "license": "MIT",
70 "dependencies": {
71 "@types/unist": "*"
72 }
73 },
74 "node_modules/@types/ms": {
75 "version": "2.1.0",
76 "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz",
77 "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==",
78 "license": "MIT"
79 },
80 "node_modules/@types/unist": {
81 "version": "3.0.3",
82 "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz",
83 "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==",
84 "license": "MIT"
85 },
86 "node_modules/ccount": {
87 "version": "2.0.1",
88 "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz",
89 "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==",
90 "license": "MIT",
91 "funding": {
92 "type": "github",
93 "url": "https://github.com/sponsors/wooorm"
94 }
95 },
96 "node_modules/character-entities": {
97 "version": "2.0.2",
98 "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz",
99 "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==",
100 "license": "MIT",
101 "funding": {
102 "type": "github",
103 "url": "https://github.com/sponsors/wooorm"
104 }
105 },
106 "node_modules/character-entities-html4": {
107 "version": "2.1.0",
108 "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz",
109 "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==",
110 "license": "MIT",
111 "funding": {
112 "type": "github",
113 "url": "https://github.com/sponsors/wooorm"
114 }
115 },
116 "node_modules/character-entities-legacy": {
117 "version": "3.0.0",
118 "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz",
119 "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==",
120 "license": "MIT",
121 "funding": {
122 "type": "github",
123 "url": "https://github.com/sponsors/wooorm"
124 }
125 },
126 "node_modules/character-reference-invalid": {
127 "version": "2.0.1",
128 "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz",
129 "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==",
130 "license": "MIT",
131 "funding": {
132 "type": "github",
133 "url": "https://github.com/sponsors/wooorm"
134 }
135 },
136 "node_modules/debug": {
137 "version": "4.4.3",
138 "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
139 "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
140 "license": "MIT",
141 "dependencies": {
142 "ms": "^2.1.3"
143 },
144 "engines": {
145 "node": ">=6.0"
146 },
147 "peerDependenciesMeta": {
148 "supports-color": {
149 "optional": true
150 }
151 }
152 },
153 "node_modules/decode-named-character-reference": {
154 "version": "1.3.0",
155 "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz",
156 "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==",
157 "license": "MIT",
158 "dependencies": {
159 "character-entities": "^2.0.0"
160 },
161 "funding": {
162 "type": "github",
163 "url": "https://github.com/sponsors/wooorm"
164 }
165 },
166 "node_modules/dequal": {
167 "version": "2.0.3",
168 "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
169 "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
170 "license": "MIT",
171 "engines": {
172 "node": ">=6"
173 }
174 },
175 "node_modules/devlop": {
176 "version": "1.1.0",
177 "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz",
178 "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==",
179 "license": "MIT",
180 "dependencies": {
181 "dequal": "^2.0.0"
182 },
183 "funding": {
184 "type": "github",
185 "url": "https://github.com/sponsors/wooorm"
186 }
187 },
188 "node_modules/is-alphabetical": {
189 "version": "2.0.1",
190 "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz",
191 "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==",
192 "license": "MIT",
193 "funding": {
194 "type": "github",
195 "url": "https://github.com/sponsors/wooorm"
196 }
197 },
198 "node_modules/is-alphanumerical": {
199 "version": "2.0.1",
200 "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz",
201 "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==",
202 "license": "MIT",
203 "dependencies": {
204 "is-alphabetical": "^2.0.0",
205 "is-decimal": "^2.0.0"
206 },
207 "funding": {
208 "type": "github",
209 "url": "https://github.com/sponsors/wooorm"
210 }
211 },
212 "node_modules/is-decimal": {
213 "version": "2.0.1",
214 "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz",
215 "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==",
216 "license": "MIT",
217 "funding": {
218 "type": "github",
219 "url": "https://github.com/sponsors/wooorm"
220 }
221 },
222 "node_modules/is-hexadecimal": {
223 "version": "2.0.1",
224 "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz",
225 "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==",
226 "license": "MIT",
227 "funding": {
228 "type": "github",
229 "url": "https://github.com/sponsors/wooorm"
230 }
231 },
232 "node_modules/longest-streak": {
233 "version": "3.1.0",
234 "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz",
235 "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==",
236 "license": "MIT",
237 "funding": {
238 "type": "github",
239 "url": "https://github.com/sponsors/wooorm"
240 }
241 },
242 "node_modules/markdown-table": {
243 "version": "3.0.4",
244 "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-3.0.4.tgz",
245 "integrity": "sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==",
246 "license": "MIT",
247 "funding": {
248 "type": "github",
249 "url": "https://github.com/sponsors/wooorm"
250 }
251 },
252 "node_modules/mdast-util-directive": {
253 "version": "3.1.0",
254 "resolved": "https://registry.npmjs.org/mdast-util-directive/-/mdast-util-directive-3.1.0.tgz",
255 "integrity": "sha512-I3fNFt+DHmpWCYAT7quoM6lHf9wuqtI+oCOfvILnoicNIqjh5E3dEJWiXuYME2gNe8vl1iMQwyUHa7bgFmak6Q==",
256 "license": "MIT",
257 "dependencies": {
258 "@types/mdast": "^4.0.0",
259 "@types/unist": "^3.0.0",
260 "ccount": "^2.0.0",
261 "devlop": "^1.0.0",
262 "mdast-util-from-markdown": "^2.0.0",
263 "mdast-util-to-markdown": "^2.0.0",
264 "parse-entities": "^4.0.0",
265 "stringify-entities": "^4.0.0",
266 "unist-util-visit-parents": "^6.0.0"
267 },
268 "funding": {
269 "type": "opencollective",
270 "url": "https://opencollective.com/unified"
271 }
272 },
273 "node_modules/mdast-util-from-markdown": {
274 "version": "2.0.3",
275 "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz",
276 "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==",
277 "license": "MIT",
278 "dependencies": {
279 "@types/mdast": "^4.0.0",
280 "@types/unist": "^3.0.0",
281 "decode-named-character-reference": "^1.0.0",
282 "devlop": "^1.0.0",
283 "mdast-util-to-string": "^4.0.0",
284 "micromark": "^4.0.0",
285 "micromark-util-decode-numeric-character-reference": "^2.0.0",
286 "micromark-util-decode-string": "^2.0.0",
287 "micromark-util-normalize-identifier": "^2.0.0",
288 "micromark-util-symbol": "^2.0.0",
289 "micromark-util-types": "^2.0.0",
290 "unist-util-stringify-position": "^4.0.0"
291 },
292 "funding": {
293 "type": "opencollective",
294 "url": "https://opencollective.com/unified"
295 }
296 },
297 "node_modules/mdast-util-gfm-footnote": {
298 "version": "2.1.0",
299 "resolved": "https://registry.npmjs.org/mdast-util-gfm-footnote/-/mdast-util-gfm-footnote-2.1.0.tgz",
300 "integrity": "sha512-sqpDWlsHn7Ac9GNZQMeUzPQSMzR6Wv0WKRNvQRg0KqHh02fpTz69Qc1QSseNX29bhz1ROIyNyxExfawVKTm1GQ==",
301 "license": "MIT",
302 "dependencies": {
303 "@types/mdast": "^4.0.0",
304 "devlop": "^1.1.0",
305 "mdast-util-from-markdown": "^2.0.0",
306 "mdast-util-to-markdown": "^2.0.0",
307 "micromark-util-normalize-identifier": "^2.0.0"
308 },
309 "funding": {
310 "type": "opencollective",
311 "url": "https://opencollective.com/unified"
312 }
313 },
314 "node_modules/mdast-util-gfm-strikethrough": {
315 "version": "2.0.0",
316 "resolved": "https://registry.npmjs.org/mdast-util-gfm-strikethrough/-/mdast-util-gfm-strikethrough-2.0.0.tgz",
317 "integrity": "sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==",
318 "license": "MIT",
319 "dependencies": {
320 "@types/mdast": "^4.0.0",
321 "mdast-util-from-markdown": "^2.0.0",
322 "mdast-util-to-markdown": "^2.0.0"
323 },
324 "funding": {
325 "type": "opencollective",
326 "url": "https://opencollective.com/unified"
327 }
328 },
329 "node_modules/mdast-util-gfm-table": {
330 "version": "2.0.0",
331 "resolved": "https://registry.npmjs.org/mdast-util-gfm-table/-/mdast-util-gfm-table-2.0.0.tgz",
332 "integrity": "sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==",
333 "license": "MIT",
334 "dependencies": {
335 "@types/mdast": "^4.0.0",
336 "devlop": "^1.0.0",
337 "markdown-table": "^3.0.0",
338 "mdast-util-from-markdown": "^2.0.0",
339 "mdast-util-to-markdown": "^2.0.0"
340 },
341 "funding": {
342 "type": "opencollective",
343 "url": "https://opencollective.com/unified"
344 }
345 },
346 "node_modules/mdast-util-phrasing": {
347 "version": "4.1.0",
348 "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz",
349 "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==",
350 "license": "MIT",
351 "dependencies": {
352 "@types/mdast": "^4.0.0",
353 "unist-util-is": "^6.0.0"
354 },
355 "funding": {
356 "type": "opencollective",
357 "url": "https://opencollective.com/unified"
358 }
359 },
360 "node_modules/mdast-util-to-markdown": {
361 "version": "2.1.2",
362 "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz",
363 "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==",
364 "license": "MIT",
365 "dependencies": {
366 "@types/mdast": "^4.0.0",
367 "@types/unist": "^3.0.0",
368 "longest-streak": "^3.0.0",
369 "mdast-util-phrasing": "^4.0.0",
370 "mdast-util-to-string": "^4.0.0",
371 "micromark-util-classify-character": "^2.0.0",
372 "micromark-util-decode-string": "^2.0.0",
373 "unist-util-visit": "^5.0.0",
374 "zwitch": "^2.0.0"
375 },
376 "funding": {
377 "type": "opencollective",
378 "url": "https://opencollective.com/unified"
379 }
380 },
381 "node_modules/mdast-util-to-string": {
382 "version": "4.0.0",
383 "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz",
384 "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==",
385 "license": "MIT",
386 "dependencies": {
387 "@types/mdast": "^4.0.0"
388 },
389 "funding": {
390 "type": "opencollective",
391 "url": "https://opencollective.com/unified"
392 }
393 },
394 "node_modules/micromark": {
395 "version": "4.0.2",
396 "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz",
397 "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==",
398 "funding": [
399 {
400 "type": "GitHub Sponsors",
401 "url": "https://github.com/sponsors/unifiedjs"
402 },
403 {
404 "type": "OpenCollective",
405 "url": "https://opencollective.com/unified"
406 }
407 ],
408 "license": "MIT",
409 "dependencies": {
410 "@types/debug": "^4.0.0",
411 "debug": "^4.0.0",
412 "decode-named-character-reference": "^1.0.0",
413 "devlop": "^1.0.0",
414 "micromark-core-commonmark": "^2.0.0",
415 "micromark-factory-space": "^2.0.0",
416 "micromark-util-character": "^2.0.0",
417 "micromark-util-chunked": "^2.0.0",
418 "micromark-util-combine-extensions": "^2.0.0",
419 "micromark-util-decode-numeric-character-reference": "^2.0.0",
420 "micromark-util-encode": "^2.0.0",
421 "micromark-util-normalize-identifier": "^2.0.0",
422 "micromark-util-resolve-all": "^2.0.0",
423 "micromark-util-sanitize-uri": "^2.0.0",
424 "micromark-util-subtokenize": "^2.0.0",
425 "micromark-util-symbol": "^2.0.0",
426 "micromark-util-types": "^2.0.0"
427 }
428 },
429 "node_modules/micromark-core-commonmark": {
430 "version": "2.0.3",
431 "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz",
432 "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==",
433 "funding": [
434 {
435 "type": "GitHub Sponsors",
436 "url": "https://github.com/sponsors/unifiedjs"
437 },
438 {
439 "type": "OpenCollective",
440 "url": "https://opencollective.com/unified"
441 }
442 ],
443 "license": "MIT",
444 "dependencies": {
445 "decode-named-character-reference": "^1.0.0",
446 "devlop": "^1.0.0",
447 "micromark-factory-destination": "^2.0.0",
448 "micromark-factory-label": "^2.0.0",
449 "micromark-factory-space": "^2.0.0",
450 "micromark-factory-title": "^2.0.0",
451 "micromark-factory-whitespace": "^2.0.0",
452 "micromark-util-character": "^2.0.0",
453 "micromark-util-chunked": "^2.0.0",
454 "micromark-util-classify-character": "^2.0.0",
455 "micromark-util-html-tag-name": "^2.0.0",
456 "micromark-util-normalize-identifier": "^2.0.0",
457 "micromark-util-resolve-all": "^2.0.0",
458 "micromark-util-subtokenize": "^2.0.0",
459 "micromark-util-symbol": "^2.0.0",
460 "micromark-util-types": "^2.0.0"
461 }
462 },
463 "node_modules/micromark-extension-directive": {
464 "version": "4.0.0",
465 "resolved": "https://registry.npmjs.org/micromark-extension-directive/-/micromark-extension-directive-4.0.0.tgz",
466 "integrity": "sha512-/C2nqVmXXmiseSSuCdItCMho7ybwwop6RrrRPk0KbOHW21JKoCldC+8rFOaundDoRBUWBnJJcxeA/Kvi34WQXg==",
467 "license": "MIT",
468 "dependencies": {
469 "devlop": "^1.0.0",
470 "micromark-factory-space": "^2.0.0",
471 "micromark-factory-whitespace": "^2.0.0",
472 "micromark-util-character": "^2.0.0",
473 "micromark-util-symbol": "^2.0.0",
474 "micromark-util-types": "^2.0.0",
475 "parse-entities": "^4.0.0"
476 },
477 "funding": {
478 "type": "opencollective",
479 "url": "https://opencollective.com/unified"
480 }
481 },
482 "node_modules/micromark-extension-gfm-footnote": {
483 "version": "2.1.0",
484 "resolved": "https://registry.npmjs.org/micromark-extension-gfm-footnote/-/micromark-extension-gfm-footnote-2.1.0.tgz",
485 "integrity": "sha512-/yPhxI1ntnDNsiHtzLKYnE3vf9JZ6cAisqVDauhp4CEHxlb4uoOTxOCJ+9s51bIB8U1N1FJ1RXOKTIlD5B/gqw==",
486 "license": "MIT",
487 "dependencies": {
488 "devlop": "^1.0.0",
489 "micromark-core-commonmark": "^2.0.0",
490 "micromark-factory-space": "^2.0.0",
491 "micromark-util-character": "^2.0.0",
492 "micromark-util-normalize-identifier": "^2.0.0",
493 "micromark-util-sanitize-uri": "^2.0.0",
494 "micromark-util-symbol": "^2.0.0",
495 "micromark-util-types": "^2.0.0"
496 },
497 "funding": {
498 "type": "opencollective",
499 "url": "https://opencollective.com/unified"
500 }
501 },
502 "node_modules/micromark-extension-gfm-strikethrough": {
503 "version": "2.1.0",
504 "resolved": "https://registry.npmjs.org/micromark-extension-gfm-strikethrough/-/micromark-extension-gfm-strikethrough-2.1.0.tgz",
505 "integrity": "sha512-ADVjpOOkjz1hhkZLlBiYA9cR2Anf8F4HqZUO6e5eDcPQd0Txw5fxLzzxnEkSkfnD0wziSGiv7sYhk/ktvbf1uw==",
506 "license": "MIT",
507 "dependencies": {
508 "devlop": "^1.0.0",
509 "micromark-util-chunked": "^2.0.0",
510 "micromark-util-classify-character": "^2.0.0",
511 "micromark-util-resolve-all": "^2.0.0",
512 "micromark-util-symbol": "^2.0.0",
513 "micromark-util-types": "^2.0.0"
514 },
515 "funding": {
516 "type": "opencollective",
517 "url": "https://opencollective.com/unified"
518 }
519 },
520 "node_modules/micromark-extension-gfm-table": {
521 "version": "2.1.1",
522 "resolved": "https://registry.npmjs.org/micromark-extension-gfm-table/-/micromark-extension-gfm-table-2.1.1.tgz",
523 "integrity": "sha512-t2OU/dXXioARrC6yWfJ4hqB7rct14e8f7m0cbI5hUmDyyIlwv5vEtooptH8INkbLzOatzKuVbQmAYcbWoyz6Dg==",
524 "license": "MIT",
525 "dependencies": {
526 "devlop": "^1.0.0",
527 "micromark-factory-space": "^2.0.0",
528 "micromark-util-character": "^2.0.0",
529 "micromark-util-symbol": "^2.0.0",
530 "micromark-util-types": "^2.0.0"
531 },
532 "funding": {
533 "type": "opencollective",
534 "url": "https://opencollective.com/unified"
535 }
536 },
537 "node_modules/micromark-factory-destination": {
538 "version": "2.0.1",
539 "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz",
540 "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==",
541 "funding": [
542 {
543 "type": "GitHub Sponsors",
544 "url": "https://github.com/sponsors/unifiedjs"
545 },
546 {
547 "type": "OpenCollective",
548 "url": "https://opencollective.com/unified"
549 }
550 ],
551 "license": "MIT",
552 "dependencies": {
553 "micromark-util-character": "^2.0.0",
554 "micromark-util-symbol": "^2.0.0",
555 "micromark-util-types": "^2.0.0"
556 }
557 },
558 "node_modules/micromark-factory-label": {
559 "version": "2.0.1",
560 "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz",
561 "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==",
562 "funding": [
563 {
564 "type": "GitHub Sponsors",
565 "url": "https://github.com/sponsors/unifiedjs"
566 },
567 {
568 "type": "OpenCollective",
569 "url": "https://opencollective.com/unified"
570 }
571 ],
572 "license": "MIT",
573 "dependencies": {
574 "devlop": "^1.0.0",
575 "micromark-util-character": "^2.0.0",
576 "micromark-util-symbol": "^2.0.0",
577 "micromark-util-types": "^2.0.0"
578 }
579 },
580 "node_modules/micromark-factory-space": {
581 "version": "2.0.1",
582 "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz",
583 "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==",
584 "funding": [
585 {
586 "type": "GitHub Sponsors",
587 "url": "https://github.com/sponsors/unifiedjs"
588 },
589 {
590 "type": "OpenCollective",
591 "url": "https://opencollective.com/unified"
592 }
593 ],
594 "license": "MIT",
595 "dependencies": {
596 "micromark-util-character": "^2.0.0",
597 "micromark-util-types": "^2.0.0"
598 }
599 },
600 "node_modules/micromark-factory-title": {
601 "version": "2.0.1",
602 "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz",
603 "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==",
604 "funding": [
605 {
606 "type": "GitHub Sponsors",
607 "url": "https://github.com/sponsors/unifiedjs"
608 },
609 {
610 "type": "OpenCollective",
611 "url": "https://opencollective.com/unified"
612 }
613 ],
614 "license": "MIT",
615 "dependencies": {
616 "micromark-factory-space": "^2.0.0",
617 "micromark-util-character": "^2.0.0",
618 "micromark-util-symbol": "^2.0.0",
619 "micromark-util-types": "^2.0.0"
620 }
621 },
622 "node_modules/micromark-factory-whitespace": {
623 "version": "2.0.1",
624 "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz",
625 "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==",
626 "funding": [
627 {
628 "type": "GitHub Sponsors",
629 "url": "https://github.com/sponsors/unifiedjs"
630 },
631 {
632 "type": "OpenCollective",
633 "url": "https://opencollective.com/unified"
634 }
635 ],
636 "license": "MIT",
637 "dependencies": {
638 "micromark-factory-space": "^2.0.0",
639 "micromark-util-character": "^2.0.0",
640 "micromark-util-symbol": "^2.0.0",
641 "micromark-util-types": "^2.0.0"
642 }
643 },
644 "node_modules/micromark-util-character": {
645 "version": "2.1.1",
646 "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz",
647 "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==",
648 "funding": [
649 {
650 "type": "GitHub Sponsors",
651 "url": "https://github.com/sponsors/unifiedjs"
652 },
653 {
654 "type": "OpenCollective",
655 "url": "https://opencollective.com/unified"
656 }
657 ],
658 "license": "MIT",
659 "dependencies": {
660 "micromark-util-symbol": "^2.0.0",
661 "micromark-util-types": "^2.0.0"
662 }
663 },
664 "node_modules/micromark-util-chunked": {
665 "version": "2.0.1",
666 "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz",
667 "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==",
668 "funding": [
669 {
670 "type": "GitHub Sponsors",
671 "url": "https://github.com/sponsors/unifiedjs"
672 },
673 {
674 "type": "OpenCollective",
675 "url": "https://opencollective.com/unified"
676 }
677 ],
678 "license": "MIT",
679 "dependencies": {
680 "micromark-util-symbol": "^2.0.0"
681 }
682 },
683 "node_modules/micromark-util-classify-character": {
684 "version": "2.0.1",
685 "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz",
686 "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==",
687 "funding": [
688 {
689 "type": "GitHub Sponsors",
690 "url": "https://github.com/sponsors/unifiedjs"
691 },
692 {
693 "type": "OpenCollective",
694 "url": "https://opencollective.com/unified"
695 }
696 ],
697 "license": "MIT",
698 "dependencies": {
699 "micromark-util-character": "^2.0.0",
700 "micromark-util-symbol": "^2.0.0",
701 "micromark-util-types": "^2.0.0"
702 }
703 },
704 "node_modules/micromark-util-combine-extensions": {
705 "version": "2.0.1",
706 "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz",
707 "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==",
708 "funding": [
709 {
710 "type": "GitHub Sponsors",
711 "url": "https://github.com/sponsors/unifiedjs"
712 },
713 {
714 "type": "OpenCollective",
715 "url": "https://opencollective.com/unified"
716 }
717 ],
718 "license": "MIT",
719 "dependencies": {
720 "micromark-util-chunked": "^2.0.0",
721 "micromark-util-types": "^2.0.0"
722 }
723 },
724 "node_modules/micromark-util-decode-numeric-character-reference": {
725 "version": "2.0.2",
726 "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz",
727 "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==",
728 "funding": [
729 {
730 "type": "GitHub Sponsors",
731 "url": "https://github.com/sponsors/unifiedjs"
732 },
733 {
734 "type": "OpenCollective",
735 "url": "https://opencollective.com/unified"
736 }
737 ],
738 "license": "MIT",
739 "dependencies": {
740 "micromark-util-symbol": "^2.0.0"
741 }
742 },
743 "node_modules/micromark-util-decode-string": {
744 "version": "2.0.1",
745 "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz",
746 "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==",
747 "funding": [
748 {
749 "type": "GitHub Sponsors",
750 "url": "https://github.com/sponsors/unifiedjs"
751 },
752 {
753 "type": "OpenCollective",
754 "url": "https://opencollective.com/unified"
755 }
756 ],
757 "license": "MIT",
758 "dependencies": {
759 "decode-named-character-reference": "^1.0.0",
760 "micromark-util-character": "^2.0.0",
761 "micromark-util-decode-numeric-character-reference": "^2.0.0",
762 "micromark-util-symbol": "^2.0.0"
763 }
764 },
765 "node_modules/micromark-util-encode": {
766 "version": "2.0.1",
767 "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz",
768 "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==",
769 "funding": [
770 {
771 "type": "GitHub Sponsors",
772 "url": "https://github.com/sponsors/unifiedjs"
773 },
774 {
775 "type": "OpenCollective",
776 "url": "https://opencollective.com/unified"
777 }
778 ],
779 "license": "MIT"
780 },
781 "node_modules/micromark-util-html-tag-name": {
782 "version": "2.0.1",
783 "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz",
784 "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==",
785 "funding": [
786 {
787 "type": "GitHub Sponsors",
788 "url": "https://github.com/sponsors/unifiedjs"
789 },
790 {
791 "type": "OpenCollective",
792 "url": "https://opencollective.com/unified"
793 }
794 ],
795 "license": "MIT"
796 },
797 "node_modules/micromark-util-normalize-identifier": {
798 "version": "2.0.1",
799 "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz",
800 "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==",
801 "funding": [
802 {
803 "type": "GitHub Sponsors",
804 "url": "https://github.com/sponsors/unifiedjs"
805 },
806 {
807 "type": "OpenCollective",
808 "url": "https://opencollective.com/unified"
809 }
810 ],
811 "license": "MIT",
812 "dependencies": {
813 "micromark-util-symbol": "^2.0.0"
814 }
815 },
816 "node_modules/micromark-util-resolve-all": {
817 "version": "2.0.1",
818 "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz",
819 "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==",
820 "funding": [
821 {
822 "type": "GitHub Sponsors",
823 "url": "https://github.com/sponsors/unifiedjs"
824 },
825 {
826 "type": "OpenCollective",
827 "url": "https://opencollective.com/unified"
828 }
829 ],
830 "license": "MIT",
831 "dependencies": {
832 "micromark-util-types": "^2.0.0"
833 }
834 },
835 "node_modules/micromark-util-sanitize-uri": {
836 "version": "2.0.1",
837 "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz",
838 "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==",
839 "funding": [
840 {
841 "type": "GitHub Sponsors",
842 "url": "https://github.com/sponsors/unifiedjs"
843 },
844 {
845 "type": "OpenCollective",
846 "url": "https://opencollective.com/unified"
847 }
848 ],
849 "license": "MIT",
850 "dependencies": {
851 "micromark-util-character": "^2.0.0",
852 "micromark-util-encode": "^2.0.0",
853 "micromark-util-symbol": "^2.0.0"
854 }
855 },
856 "node_modules/micromark-util-subtokenize": {
857 "version": "2.1.0",
858 "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz",
859 "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==",
860 "funding": [
861 {
862 "type": "GitHub Sponsors",
863 "url": "https://github.com/sponsors/unifiedjs"
864 },
865 {
866 "type": "OpenCollective",
867 "url": "https://opencollective.com/unified"
868 }
869 ],
870 "license": "MIT",
871 "dependencies": {
872 "devlop": "^1.0.0",
873 "micromark-util-chunked": "^2.0.0",
874 "micromark-util-symbol": "^2.0.0",
875 "micromark-util-types": "^2.0.0"
876 }
877 },
878 "node_modules/micromark-util-symbol": {
879 "version": "2.0.1",
880 "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz",
881 "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==",
882 "funding": [
883 {
884 "type": "GitHub Sponsors",
885 "url": "https://github.com/sponsors/unifiedjs"
886 },
887 {
888 "type": "OpenCollective",
889 "url": "https://opencollective.com/unified"
890 }
891 ],
892 "license": "MIT"
893 },
894 "node_modules/micromark-util-types": {
895 "version": "2.0.2",
896 "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz",
897 "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==",
898 "funding": [
899 {
900 "type": "GitHub Sponsors",
901 "url": "https://github.com/sponsors/unifiedjs"
902 },
903 {
904 "type": "OpenCollective",
905 "url": "https://opencollective.com/unified"
906 }
907 ],
908 "license": "MIT"
909 },
910 "node_modules/ms": {
911 "version": "2.1.3",
912 "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
913 "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
914 "license": "MIT"
915 },
916 "node_modules/parse-entities": {
917 "version": "4.0.2",
918 "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz",
919 "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==",
920 "license": "MIT",
921 "dependencies": {
922 "@types/unist": "^2.0.0",
923 "character-entities-legacy": "^3.0.0",
924 "character-reference-invalid": "^2.0.0",
925 "decode-named-character-reference": "^1.0.0",
926 "is-alphanumerical": "^2.0.0",
927 "is-decimal": "^2.0.0",
928 "is-hexadecimal": "^2.0.0"
929 },
930 "funding": {
931 "type": "github",
932 "url": "https://github.com/sponsors/wooorm"
933 }
934 },
935 "node_modules/parse-entities/node_modules/@types/unist": {
936 "version": "2.0.11",
937 "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz",
938 "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==",
939 "license": "MIT"
940 },
941 "node_modules/stringify-entities": {
942 "version": "4.0.4",
943 "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz",
944 "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==",
945 "license": "MIT",
946 "dependencies": {
947 "character-entities-html4": "^2.0.0",
948 "character-entities-legacy": "^3.0.0"
949 },
950 "funding": {
951 "type": "github",
952 "url": "https://github.com/sponsors/wooorm"
953 }
954 },
955 "node_modules/unist-util-is": {
956 "version": "6.0.1",
957 "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz",
958 "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==",
959 "license": "MIT",
960 "dependencies": {
961 "@types/unist": "^3.0.0"
962 },
963 "funding": {
964 "type": "opencollective",
965 "url": "https://opencollective.com/unified"
966 }
967 },
968 "node_modules/unist-util-stringify-position": {
969 "version": "4.0.0",
970 "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz",
971 "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==",
972 "license": "MIT",
973 "dependencies": {
974 "@types/unist": "^3.0.0"
975 },
976 "funding": {
977 "type": "opencollective",
978 "url": "https://opencollective.com/unified"
979 }
980 },
981 "node_modules/unist-util-visit": {
982 "version": "5.1.0",
983 "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz",
984 "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==",
985 "license": "MIT",
986 "dependencies": {
987 "@types/unist": "^3.0.0",
988 "unist-util-is": "^6.0.0",
989 "unist-util-visit-parents": "^6.0.0"
990 },
991 "funding": {
992 "type": "opencollective",
993 "url": "https://opencollective.com/unified"
994 }
995 },
996 "node_modules/unist-util-visit-parents": {
997 "version": "6.0.2",
998 "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz",
999 "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==",
1000 "license": "MIT",
1001 "dependencies": {
1002 "@types/unist": "^3.0.0",
1003 "unist-util-is": "^6.0.0"
1004 },
1005 "funding": {
1006 "type": "opencollective",
1007 "url": "https://opencollective.com/unified"
1008 }
1009 },
1010 "node_modules/zwitch": {
1011 "version": "2.0.4",
1012 "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz",
1013 "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==",
1014 "license": "MIT",
1015 "funding": {
1016 "type": "github",
1017 "url": "https://github.com/sponsors/wooorm"
1018 }
1019 }
1020 }
1021}
package.json +12 -1
……@@ -3,5 +3,16 @@
33 "version": "0.0.0",
44 "description": "The P2P-native markdown record layer for favela. A post is a markdown document; atproto and ActivityPub are projections derived from it on read.",
55 "type": "module",
6 "license": "MIT"
6 "license": "MIT",
7 "dependencies": {
8 "mdast-util-directive": "^3.1.0",
9 "mdast-util-from-markdown": "^2.0.3",
10 "mdast-util-gfm-footnote": "^2.1.0",
11 "mdast-util-gfm-strikethrough": "^2.0.0",
12 "mdast-util-gfm-table": "^2.0.0",
13 "micromark-extension-directive": "^4.0.0",
14 "micromark-extension-gfm-footnote": "^2.1.0",
15 "micromark-extension-gfm-strikethrough": "^2.1.0",
16 "micromark-extension-gfm-table": "^2.1.1"
17 }
718}