@arbidocs/coedit 0.5.29 → 0.5.31
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/dist/encoding.cjs +0 -5
- package/dist/encoding.cjs.map +1 -1
- package/dist/encoding.d.cts +5 -5
- package/dist/encoding.d.ts +5 -5
- package/dist/encoding.js +1 -5
- package/dist/encoding.js.map +1 -1
- package/dist/hocuspocus.cjs +1 -5
- package/dist/hocuspocus.cjs.map +1 -1
- package/dist/hocuspocus.js +1 -5
- package/dist/hocuspocus.js.map +1 -1
- package/dist/index.cjs +10 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +9 -6
- package/dist/index.js.map +1 -1
- package/dist/server.cjs +23 -9
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +17 -4
- package/dist/server.d.ts +17 -4
- package/dist/server.js +22 -10
- package/dist/server.js.map +1 -1
- package/dist/versions-ClPpc7Sg.d.cts +21 -0
- package/dist/versions-ClPpc7Sg.d.ts +21 -0
- package/package.json +1 -1
- package/dist/versions-XSYTVmOU.d.cts +0 -8
- package/dist/versions-XSYTVmOU.d.ts +0 -8
package/dist/server.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/read.ts","../src/commands/numbering.ts","../src/commands/ooxml.ts","../src/commands/references.ts","../src/template/xml.ts","../src/template/pkg.ts","../src/template/track.ts","../src/commands/fragment.ts","../src/rich.ts","../src/mirror.ts","../src/encoding.ts","../src/registry.ts","../src/journal.ts","../src/sync.ts","../src/session.ts","../src/versions.ts","../src/server.ts"],"names":["buildStyleCascadeTable","withNumberingStyleLinks","buildNumberingIndex","resolveStoryListItems","resolveNumberingLevel","zipSync","strToU8","readXml","serialize","strFromU8","unzipSync","attr","WML","isEl","el","Y","XML_NAMESPACE_URI","Y2","readOoxmlPart","validateExternalTarget","relsName","relsPartNameFor","contentTypesPartBytes","withContentTypeOverride","writeOoxmlPackage","readOoxmlPackage","Y3","index","Y4","text","parent","inserted","destination","ORIGIN_IDS","safeParticipantColor","createCollaborationStatusTracker","Y5","historyGroupOfJournal","mapOffsetAcrossText","same","createServerAutomationHost","awareness","Awareness","store","TreePackageStore","createCollaborationDocumentPort","headlessViewOfStore","validateRasterHeader"],"mappings":"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","file":"server.cjs","sourcesContent":["/**\n * The read side of the Word-editor commands: a document's paragraphs as the commands see them\n * (text in the engine's offset vocabulary, bookmarks, internal links, fields, note references),\n * read from the engine's OOXML tree. The same tree comes from a live editor\n * (`surface.session.part().root`) or from document bytes (`openHeadlessDocument`), so the toolbar\n * and ARBI's headless tools read a document the same way.\n */\n\n/** Character style of an inserted term: a dotted underline, so a defined term reads as one. */\nexport const DEFINED_TERM_STYLE = 'DefinedTerm'\n\n/** Character style of a cross-reference: a muted blue with a dotted underline (Word's name). */\nexport const CROSS_REFERENCE_STYLE = 'CrossReference'\n/** Character style of a cross-reference whose target is gone: its last text, flagged. */\nexport const BROKEN_CROSS_REFERENCE_STYLE = 'CrossReferenceBroken'\n\n/** A position: a paragraph (the engine's node id) and a UTF-16 offset into its text. */\nexport interface DocPoint {\n paragraphId: string\n offset: number\n}\n\n/** An internal link in a paragraph. */\nexport interface DocLink {\n anchor: string\n text: string\n /** Where its text starts in the paragraph's text. */\n offset?: number\n}\n\n/** A footnote or endnote reference: one character of the paragraph, as the engine counts it. */\nexport interface DocNote {\n offset: number\n kind: 'footnote' | 'endnote'\n /** `w:id` of the note. */\n id: string\n}\n\n/** One paragraph, in document order. */\nexport interface DocParagraph {\n id: string\n /** `w14:paraId`, the id that is the same in every replica of a collaboration room. */\n paraId?: string\n text: string\n /** Styled as a heading (a `Heading n` style or an outline level). */\n heading: boolean\n styleId?: string\n /** A paragraph of the body itself, not inside a table. */\n topLevel: boolean\n /** Names of the bookmarks that start in it. */\n bookmarks: string[]\n /** Its internal links (`w:hyperlink w:anchor`). */\n links: DocLink[]\n /** Its complex fields: where each sits (its one-character offset), its instruction and result. */\n fields?: DocField[]\n /** Its runs in a watched character style (a broken cross-reference's mark), with their text. */\n marks?: DocMark[]\n /** Its footnote and endnote references. */\n notes?: DocNote[]\n /** Its pending tracked insertions and deletions, in document order. */\n revisions?: DocRevision[]\n}\n\n/**\n * A pending tracked change in a paragraph. `text` leaves deleted text out, while the engine's\n * offsets (a {@link DocPoint}) count it: an insertion covers `length` characters of `text` from\n * `offset`; a deletion's `text` sits at `offset`, between the characters of `text` around it.\n */\nexport interface DocRevision {\n kind: 'insert' | 'delete'\n offset: number\n length: number\n author?: string\n /** A deletion's text. */\n text?: string\n}\n\n/**\n * Where a position in a paragraph's `text` is in the engine's offsets, which count pending\n * deleted text. `pastDeletions`: a position with deleted text right at it is placed after that\n * text rather than before it.\n */\nexport function engineOffset(\n paragraph: DocParagraph,\n offset: number,\n pastDeletions = false\n): number {\n let out = offset\n for (const r of paragraph.revisions ?? [])\n if (r.kind === 'delete' && (r.offset < offset || (pastDeletions && r.offset === offset)))\n out += r.length\n return out\n}\n\n/** A paragraph's length in the engine's offsets: its text and its pending deleted text. */\nexport const engineLength = (paragraph: DocParagraph) =>\n engineOffset(paragraph, paragraph.text.length, true)\n\n/** A stretch of a paragraph's text in a watched character style. */\nexport interface DocMark {\n styleId: string\n offset: number\n text: string\n}\n\n/** Character styles whose runs a paragraph read reports as marks. */\nexport const WATCHED_STYLES = new Set([BROKEN_CROSS_REFERENCE_STYLE])\n\n/** A complex field of a paragraph. */\nexport interface DocField {\n offset: number\n instruction: string\n result: string\n}\n\nexport type OoxmlNodeLike = {\n id: string\n kind: string\n localName?: string\n value?: string\n attributes?: readonly { localName: string; value: string }[]\n children?: readonly OoxmlNodeLike[]\n}\n\nconst attr = (node: OoxmlNodeLike, name: string) =>\n node.attributes?.find((a) => a.localName === name)?.value\n\n/** How a field (or a note reference) counts in a paragraph's text (the engine's model vocabulary). */\nexport const FIELD_ATOM = '\\uFFFC'\n\n/** A heading style id in any of the spellings Word localises it to (`Heading1`, `berschrift1`…). */\nconst HEADING_STYLE = /^(heading|berschrift|titre|t[ií]tulo|titolo|kop)\\s*\\d/i\n\n/** The paragraphs of a part's body, read from the engine's OOXML tree. */\nexport function readParagraphs(root: OoxmlNodeLike): DocParagraph[] {\n const out: DocParagraph[] = []\n const body = root.children?.find((n) => n.kind === 'body') ?? root\n const visit = (node: OoxmlNodeLike, topLevel: boolean, pending: string[]) => {\n for (const child of node.children ?? []) {\n if (child.kind === 'paragraph') {\n out.push(readParagraph(child, topLevel, pending.splice(0)))\n } else if (child.localName === 'bookmarkStart') {\n // A bookmark between paragraphs belongs to the next one.\n const name = attr(child, 'name')\n if (name) pending.push(name)\n } else if (\n child.localName === 'tbl' ||\n child.localName === 'tr' ||\n child.localName === 'tc'\n ) {\n visit(child, false, pending)\n } else if (child.localName === 'sdt' || child.localName === 'sdtContent') {\n visit(child, topLevel, pending)\n }\n }\n }\n visit(body, true, [])\n return out\n}\n\nfunction readParagraph(node: OoxmlNodeLike, topLevel: boolean, bookmarks: string[]): DocParagraph {\n let text = ''\n const links: DocLink[] = []\n let styleId: string | undefined\n let outline = false\n // A field reads as ONE character (U+FFFC), as the engine counts offsets: its instruction and\n // its cached result are not text of the paragraph.\n let fieldDepth = 0\n const marks: DocMark[] = []\n /** The watched style of the run being walked, if any. */\n let runStyle: string | undefined\n const fields: DocField[] = []\n const notes: DocNote[] = []\n const revisions: DocRevision[] = []\n let current: (DocField & { inResult: boolean }) | null = null\n const field = (c: OoxmlNodeLike) => {\n const type = attr(c, 'fldCharType')\n if (type === 'begin') {\n if (fieldDepth === 0) {\n current = { offset: text.length, instruction: '', result: '', inResult: false }\n text += FIELD_ATOM\n }\n fieldDepth++\n } else if (type === 'separate' && fieldDepth === 1 && current) current.inResult = true\n else if (type === 'end') {\n fieldDepth = Math.max(0, fieldDepth - 1)\n if (fieldDepth === 0 && current) {\n const { offset, instruction, result } = current\n fields.push({ offset, instruction: instruction.trim(), result })\n current = null\n }\n }\n }\n const walk = (n: OoxmlNodeLike, link?: DocLink) => {\n for (const c of n.children ?? []) {\n if (c.localName === 'fldChar') {\n field(c)\n continue\n }\n if (c.localName === 'fldSimple') {\n if (fieldDepth === 0) text += FIELD_ATOM\n continue\n }\n if (c.localName === 'instrText') {\n if (fieldDepth === 1 && current)\n (current as DocField).instruction += (c.children ?? []).map((t) => t.value ?? '').join('')\n continue\n }\n if (c.kind === 'paragraphProperties' || c.localName === 'pPr') {\n for (const p of c.children ?? []) {\n if (p.localName === 'pStyle') styleId = attr(p, 'val')\n if (p.localName === 'outlineLvl' && Number(attr(p, 'val')) < 9) outline = true\n }\n continue\n }\n if (c.localName === 'del') {\n // Deleted text is not part of the paragraph's text; where it sits is (see DocRevision).\n const deleted = deletedText(c)\n if (deleted && fieldDepth === 0)\n revisions.push({\n kind: 'delete',\n offset: text.length,\n length: deleted.length,\n author: attr(c, 'author'),\n text: deleted,\n })\n continue\n }\n if (c.localName === 'ins') {\n const start = text.length\n walk(c, link)\n if (text.length > start && fieldDepth === 0)\n revisions.push({\n kind: 'insert',\n offset: start,\n length: text.length - start,\n author: attr(c, 'author'),\n })\n continue\n }\n if (c.localName === 'delText' || c.localName === 'rPr') continue\n if (c.localName === 'r') {\n const rStyle = c.children\n ?.find((x) => x.localName === 'rPr')\n ?.children?.find((x) => x.localName === 'rStyle')\n const watched = rStyle && attr(rStyle, 'val')\n runStyle = watched && WATCHED_STYLES.has(watched) ? watched : undefined\n walk(c, link)\n runStyle = undefined\n continue\n }\n if (\n (c.localName === 'footnoteReference' || c.localName === 'endnoteReference') &&\n fieldDepth === 0\n ) {\n notes.push({\n offset: text.length,\n kind: c.localName === 'footnoteReference' ? 'footnote' : 'endnote',\n id: attr(c, 'id') ?? '',\n })\n text += FIELD_ATOM\n continue\n }\n if (c.localName === 'bookmarkStart') {\n const name = attr(c, 'name')\n if (name) bookmarks.push(name)\n continue\n }\n if (c.localName === 'hyperlink') {\n const anchor = attr(c, 'anchor')\n const next = anchor ? { anchor, text: '', offset: text.length } : undefined\n walk(c, next ?? link)\n if (next) links.push(next)\n continue\n }\n if (c.kind === 'textValue') {\n if (fieldDepth > 0) {\n const open = current as (DocField & { inResult: boolean }) | null\n if (fieldDepth === 1 && open?.inResult) open.result += c.value ?? ''\n continue\n }\n if (runStyle && c.value) {\n const last = marks[marks.length - 1]\n if (last && last.styleId === runStyle && last.offset + last.text.length === text.length)\n last.text += c.value\n else marks.push({ styleId: runStyle, offset: text.length, text: c.value })\n }\n text += c.value ?? ''\n if (link) link.text += c.value ?? ''\n continue\n }\n if (c.localName === 'tab' && fieldDepth === 0) text += '\\t'\n walk(c, link)\n }\n }\n walk(node)\n const paraId = attr(node, 'paraId')\n return {\n id: node.id,\n ...(paraId ? { paraId } : {}),\n text,\n heading: outline || (!!styleId && HEADING_STYLE.test(styleId)),\n styleId,\n topLevel,\n bookmarks,\n links,\n ...(fields.length ? { fields } : {}),\n ...(marks.length ? { marks } : {}),\n ...(notes.length ? { notes } : {}),\n ...(revisions.length ? { revisions } : {}),\n }\n}\n\n/** The text a tracked deletion removes (its `w:delText`; a deleted tab counts as one character). */\nfunction deletedText(node: OoxmlNodeLike): string {\n let out = ''\n for (const c of node.children ?? []) {\n if (c.localName === 'instrText') continue\n if (c.localName === 'delText') out += (c.children ?? []).map((t) => t.value ?? '').join('')\n else if (c.localName === 'tab') out += '\\t'\n else if (c.localName !== 'rPr') out += deletedText(c)\n }\n return out\n}\n\n/** Style id to style name (`Heading1` → `heading 1`), from a styles part's tree. */\nexport function styleNames(root: OoxmlNodeLike | null | undefined): Map<string, string> {\n const names = new Map<string, string>()\n for (const style of root?.children ?? []) {\n if (style.localName !== 'style') continue\n const id = attr(style, 'styleId')\n const name = style.children?.find((c) => c.localName === 'name')\n if (id) names.set(id, (name && attr(name, 'val')) || id)\n }\n return names\n}\n","/**\n * Cross-reference targets: the document's numbered paragraphs (clauses, sub-clauses, numbered\n * captions) and its headings, with the number Word's `REF \\r` shows for each.\n *\n * The number is what the editor computes for a `REF … \\r` field — and it has to be exactly that,\n * because the engine shows a field's live value only while the field's cached result matches what\n * it computes (otherwise it keeps the cached text for good). So this mirrors the engine: the\n * paragraph's own list level, preceded by each higher level whose number its level text does not\n * already show (`%1.%2` already shows level 1; `(%3)` does not show `2.1`), and one trailing\n * period dropped (`2.` reads `2`).\n */\n\nimport type { DocParagraph, OoxmlNodeLike } from './read'\nimport {\n buildNumberingIndex,\n buildStyleCascadeTable,\n resolveNumberingLevel,\n resolveStoryListItems,\n withNumberingStyleLinks,\n} from '@docx-editor.dev/core/layout'\n\n/** A paragraph's resolved list numbering (the engine's list item). */\nexport interface ListItemInfo {\n numId: string\n ilvl: number\n markerText: string\n numFmt: string\n}\n\n/** A list level's definition: its level text (`%1.%2`) and number format. */\nexport interface LevelInfo {\n lvlText: string\n numFmt: string\n}\n\nexport type LevelOf = (numId: string, ilvl: number) => LevelInfo | null\n\nconst numbers = (level: { numFmt: string; lvlText?: string; markerText?: string } | null) =>\n !!level &&\n level.numFmt !== 'bullet' &&\n level.numFmt !== 'none' &&\n (level.lvlText ?? level.markerText ?? '').length > 0\n\n/**\n * The number `REF \\r` shows for a paragraph, or null when it is not numbered. `order` is every\n * paragraph id in document order (for the markers of the levels above it).\n */\nexport function paragraphNumber(\n order: readonly string[],\n items: ReadonlyMap<string, ListItemInfo>,\n levelOf: LevelOf,\n paragraphId: string\n): string | null {\n const item = items.get(paragraphId)\n if (!item || !numbers(item)) return null\n const at = order.indexOf(paragraphId)\n /** The marker the nearest paragraph at `ilvl` of this list had, up to the target. */\n const markerAt = (ilvl: number): string | null => {\n if (ilvl === item.ilvl) return item.markerText\n for (let i = at - 1; i >= 0; i--) {\n const other = items.get(order[i])\n if (other && other.numId === item.numId && other.ilvl === ilvl) return other.markerText\n }\n return null\n }\n const chain: number[] = []\n const texts: string[] = []\n for (let u = item.ilvl; u >= 0; u--) {\n const level = levelOf(item.numId, u)\n if (!level || !numbers(level)) continue\n if (u !== item.ilvl && texts.some((t) => t.includes(`%${u + 1}`))) continue\n chain.push(u)\n texts.push(level.lvlText)\n }\n const value = chain\n .reverse()\n .map((u) => markerAt(u) ?? '')\n .join('')\n if (!value) return null\n return value.length > 1 && value.endsWith('.') ? value.slice(0, -1) : value\n}\n\n/** One place a cross-reference can point at. */\nexport interface CrossReferenceTarget {\n paragraphId: string\n /** A numbered paragraph (clause, sub-clause, caption) or an unnumbered heading. */\n kind: 'numbered' | 'heading'\n /** What `REF \\r` shows (`8.2`), or null for an unnumbered heading. */\n number: string | null\n /** The paragraph's list marker as painted (`8.2`, `(a)`), or empty. */\n marker: string\n /** The paragraph's text (without its marker). */\n text: string\n heading: boolean\n /** Its list level (0 for a top-level clause), or 0 for a heading. */\n level: number\n}\n\n/** Every numbered paragraph and every heading, in document order. */\nexport function listTargets(\n paragraphs: readonly DocParagraph[],\n items: ReadonlyMap<string, ListItemInfo>,\n levelOf: LevelOf\n): CrossReferenceTarget[] {\n const order = paragraphs.map((p) => p.id)\n const out: CrossReferenceTarget[] = []\n for (const p of paragraphs) {\n const text = p.text.replace(//g, '').trim()\n if (!text) continue\n const number = paragraphNumber(order, items, levelOf, p.id)\n const item = items.get(p.id)\n if (number !== null)\n out.push({\n paragraphId: p.id,\n kind: 'numbered',\n number,\n marker: item?.markerText ?? '',\n text,\n heading: p.heading,\n level: item?.ilvl ?? 0,\n })\n else if (p.heading)\n out.push({\n paragraphId: p.id,\n kind: 'heading',\n number: null,\n marker: '',\n text,\n heading: true,\n level: 0,\n })\n }\n return out\n}\n\n/** Targets whose number or text contains the query (case-insensitive). */\nexport function filterTargets(\n targets: readonly CrossReferenceTarget[],\n query: string\n): CrossReferenceTarget[] {\n const q = query.trim().toLowerCase()\n if (!q) return [...targets]\n return targets.filter(\n (t) => (t.number ?? '').toLowerCase().startsWith(q) || t.text.toLowerCase().includes(q)\n )\n}\n\n/** What the engine's numbering needs of a document: its parts' trees. */\nexport interface NumberingSource {\n /** The main document part's root. */\n root(): OoxmlNodeLike\n stylesRoot(): unknown\n numberingRoot(): unknown\n settingsRoot(): unknown\n}\n\n/** A document's list numbering as the engine resolves it. */\nexport interface DocumentNumbering {\n /** Each numbered paragraph's list item, by paragraph (node) id. */\n listItems(): ReadonlyMap<string, ListItemInfo>\n levelOf: LevelOf\n}\n\n/**\n * The numbering of a document, as the editor paints it: from a live editor's session or from a\n * headless document view alike.\n */\nexport function documentNumbering(source: NumberingSource): DocumentNumbering {\n type Index = ReturnType<typeof buildNumberingIndex>\n type Cascade = ReturnType<typeof buildStyleCascadeTable>\n let numbering: Index | undefined\n let cascade: Cascade | undefined\n const index = () => {\n if (!numbering) {\n cascade = buildStyleCascadeTable(\n source.stylesRoot() as Parameters<typeof buildStyleCascadeTable>[0],\n undefined,\n source.settingsRoot() as Parameters<typeof buildStyleCascadeTable>[2]\n )\n numbering = withNumberingStyleLinks(\n buildNumberingIndex(source.numberingRoot() as Parameters<typeof buildNumberingIndex>[0]),\n cascade\n )\n }\n return numbering\n }\n return {\n listItems: () => {\n const body = source.root().children?.find((n) => n.kind === 'body')\n const items = resolveStoryListItems(\n (body?.children ?? []) as unknown as Parameters<typeof resolveStoryListItems>[0],\n index(),\n cascade\n )\n const out = new Map<string, ListItemInfo>()\n for (const [id, item] of items)\n out.set(id, {\n numId: item.numId,\n ilvl: item.ilvl,\n markerText: item.markerText,\n numFmt: item.numFmt,\n })\n return out\n },\n levelOf: (numId, ilvl) => {\n const level = resolveNumberingLevel(index(), numId, ilvl)?.level\n return level ? { lvlText: level.lvlText, numFmt: level.numFmt } : null\n },\n }\n}\n","/**\n * The minimal WordprocessingML a command writes: escaped text, a `word/document.xml` and\n * `word/styles.xml` around it, and the `.docx` package that carries them (a paste fragment).\n */\n\nimport { strToU8, zipSync } from 'fflate'\n\nexport const W_NAMESPACES =\n 'xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"'\n\n// Text that is not allowed in XML 1.0 at all (control characters) is dropped, not escaped.\n// eslint-disable-next-line no-control-regex\nconst INVALID_XML = /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F]/g\n\n/** Text as XML character data or an attribute value. */\nexport const esc = (text: string) =>\n text\n .replace(INVALID_XML, '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n\n/** A `word/document.xml` around body content (paragraphs, tables, then the section). */\nexport const documentXml = (body: string) =>\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:document ${W_NAMESPACES}><w:body>${body}</w:body></w:document>`\n\n/** `word/styles.xml` holding the given style definitions. */\nexport const stylesXml = (defaults: string, styles: string) =>\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:styles xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">${defaults}${styles}</w:styles>`\n\nconst CONTENT_TYPES = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/><Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/><Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/><Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/></Types>`\n\nconst ROOT_RELS = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/><Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/></Relationships>`\n\n/** `word/_rels/document.xml.rels`: the styles part, then any further relationships given. */\nconst documentRels = (more = '') => `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>${more}</Relationships>`\n\n/** A relationship to an external hyperlink target, for `w:hyperlink r:id`. */\nexport const hyperlinkRelationship = (id: string, url: string) =>\n `<Relationship Id=\"${esc(id)}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\" Target=\"${esc(url)}\" TargetMode=\"External\"/>`\n\nconst coreXml = (\n title: string,\n at: string\n) => `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><dc:title>${esc(\n title\n)}</dc:title><dcterms:created xsi:type=\"dcterms:W3CDTF\">${at}</dcterms:created><dcterms:modified xsi:type=\"dcterms:W3CDTF\">${at}</dcterms:modified></cp:coreProperties>`\n\n/** The minimal `.docx` package: a document, its styles, and its title and time. */\nexport function docxPackage(parts: {\n document: string\n styles: string\n title: string\n /** ISO time; default now. */\n at?: string\n /** Further `word/document.xml` relationships (e.g. {@link hyperlinkRelationship}). */\n relationships?: string\n}): Uint8Array {\n const at = new Date(parts.at ?? Date.now()).toISOString().replace(/\\.\\d{3}Z$/, 'Z')\n return zipSync({\n '[Content_Types].xml': strToU8(CONTENT_TYPES),\n '_rels/.rels': strToU8(ROOT_RELS),\n 'docProps/core.xml': strToU8(coreXml(parts.title, at)),\n 'word/document.xml': strToU8(parts.document),\n 'word/styles.xml': strToU8(parts.styles),\n 'word/_rels/document.xml.rels': strToU8(documentRels(parts.relationships)),\n })\n}\n","/**\n * Cross-references, the way Word does them, and their status.\n *\n * Within the document: a hidden `_Ref…` bookmark on the target paragraph and a `REF` field at the\n * caret — `REF _Ref123 \\\\r \\\\h` for a numbered paragraph (Word's Cross-reference › Numbered item ›\n * Paragraph number), `REF _Ref123 \\\\h` for a heading's text. The field's cached result is the value\n * the editor computes, so it updates live when the clauses are renumbered, and Word updates it\n * with the document's other fields.\n *\n * To another document: a hyperlink with the reference text (\"SPA, clause 8.2\"), aimed at the app\n * address of that document's passage (so it works from Word too), with a screen tip saying so.\n *\n * Every cross-reference reads as current, stale (a clause renumbered, a heading reworded) or broken\n * (the target is gone).\n */\n\nimport {\n BROKEN_CROSS_REFERENCE_STYLE,\n CROSS_REFERENCE_STYLE,\n FIELD_ATOM,\n type DocParagraph,\n type DocPoint,\n type OoxmlNodeLike,\n} from './read'\nimport {\n paragraphNumber,\n type CrossReferenceTarget,\n type LevelOf,\n type ListItemInfo,\n} from './numbering'\nimport { esc, hyperlinkRelationship } from './ooxml'\nimport type { ReferencesPort } from './port'\n\n/** Prefix of Word's hidden cross-reference bookmarks. */\nexport const REF_BOOKMARK_PREFIX = '_Ref'\n\nexport type CrossReferenceMode = 'number' | 'text'\n\nconst REF_FIELD = /^REF\\s+(\\S+)((?:\\s+\\\\[A-Za-z*]+(?:\\s+MERGEFORMAT)?)*)\\s*$/i\n\n/** What reading cross-references needs of a document. */\nexport interface ReferencesReader {\n paragraphs(): DocParagraph[]\n /** Each numbered paragraph's list item, by paragraph id. */\n listItems(): ReadonlyMap<string, ListItemInfo>\n levelOf: LevelOf\n}\n\n/** One `REF` field to a `_Ref` bookmark. */\nexport interface CrossReference {\n paragraphId: string\n offset: number\n instruction: string\n bookmark: string\n mode: CrossReferenceMode\n /** The field's cached result (what it shows). */\n cached: string\n /** The paragraph the bookmark is in, or null when it is gone (the reference is broken). */\n target: string | null\n /** What the reference should show now, or null when that cannot be computed. */\n value: string | null\n}\n\n/** A `REF` field whose cached result no longer says what its target now is. */\nexport interface StaleReference {\n paragraphId: string\n offset: number\n instruction: string\n /** The current value, or null when the target is gone (the reference is broken). */\n value: string | null\n /** The field's cached result (what it last showed). */\n cached: string\n bookmark: string\n mode: CrossReferenceMode\n}\n\n/** A cross-reference whose target was deleted: its last text, marked in the Broken style. */\nexport interface BrokenReference {\n paragraphId: string\n offset: number\n text: string\n}\n\n/** Every cross-reference of the document, in document order. */\nexport function crossReferences(port: ReferencesReader): CrossReference[] {\n const paragraphs = port.paragraphs()\n if (!paragraphs.some((p) => p.fields?.length)) return []\n const items = port.listItems()\n const order = paragraphs.map((p) => p.id)\n const owner = new Map<string, string>()\n for (const p of paragraphs) for (const b of p.bookmarks) if (!owner.has(b)) owner.set(b, p.id)\n const out: CrossReference[] = []\n for (const p of paragraphs)\n for (const field of p.fields ?? []) {\n const match = REF_FIELD.exec(field.instruction)\n if (!match || !match[1].startsWith(REF_BOOKMARK_PREFIX)) continue\n const switches = match[2].toLowerCase()\n const mode: CrossReferenceMode = /\\\\[rwn]\\b/.test(switches) ? 'number' : 'text'\n const target = owner.get(match[1]) ?? null\n const value = !target\n ? null\n : mode === 'number'\n ? switches.includes('\\\\r')\n ? paragraphNumber(order, items, port.levelOf, target)\n : null\n : (paragraphs.find((x) => x.id === target)?.text ?? '').replace(//g, '').trim()\n out.push({\n paragraphId: p.id,\n offset: field.offset,\n instruction: field.instruction,\n bookmark: match[1],\n mode,\n cached: field.result,\n target,\n value,\n })\n }\n return out\n}\n\n/**\n * The cross-references whose cached result is out of date: a clause renumbered, a heading\n * reworded, or the target gone. The editor paints a field's live value only while its cached\n * result matches what it computes, so a stale cache shows the OLD number after the document is\n * reopened (and Word shows the cached result until its fields are updated).\n */\nexport function staleCrossReferences(port: ReferencesReader): StaleReference[] {\n return crossReferences(port)\n .filter((ref) => !ref.target || (ref.value && ref.value !== ref.cached.trim()))\n .map(({ paragraphId, offset, instruction, value, cached, bookmark, mode }) => ({\n paragraphId,\n offset,\n instruction,\n value,\n cached,\n bookmark,\n mode,\n }))\n}\n\n/** The broken cross-references marked in the document, in document order. */\nexport function brokenCrossReferences(\n port: Pick<ReferencesReader, 'paragraphs'>\n): BrokenReference[] {\n return port\n .paragraphs()\n .flatMap((p) =>\n (p.marks ?? [])\n .filter((m) => m.styleId === BROKEN_CROSS_REFERENCE_STYLE)\n .map((m) => ({ paragraphId: p.id, offset: m.offset, text: m.text }))\n )\n}\n\n/** A new `_Ref` bookmark name: Word's shape (`_Ref` and nine digits), not yet in the document. */\nexport function newRefBookmark(taken: ReadonlySet<string>, random: () => number = Math.random) {\n for (;;) {\n const name = `${REF_BOOKMARK_PREFIX}${String(Math.floor(random() * 9e8) + 1e8)}`\n if (!taken.has(name)) return name\n }\n}\n\nconst styled = (style?: string) => (style ? `<w:rPr><w:rStyle w:val=\"${style}\"/></w:rPr>` : '')\nconst run = (text: string, style?: string) =>\n `<w:r>${styled(style)}<w:t xml:space=\"preserve\">${esc(text)}</w:t></w:r>`\n\n/**\n * A complex `REF` field with its cached result, every run in the Cross Reference style (Word gives\n * an updated result the formatting of the field's first run).\n */\nexport function refFieldXml(instruction: string, cached: string): string {\n const r = (inner: string) => `<w:r>${styled(CROSS_REFERENCE_STYLE)}${inner}</w:r>`\n return `${r('<w:fldChar w:fldCharType=\"begin\"/>')}${r(\n `<w:instrText xml:space=\"preserve\"> ${esc(instruction)} </w:instrText>`\n )}${r('<w:fldChar w:fldCharType=\"separate\"/>')}${run(cached, CROSS_REFERENCE_STYLE)}${r(\n '<w:fldChar w:fldCharType=\"end\"/>'\n )}`\n}\n\n/** The screen tip of a reference to this document: \"Cross-reference to clause 2.2\". */\nexport const refTooltip = (value: string, mode: CrossReferenceMode) =>\n mode === 'number' ? `Cross-reference to clause ${value}` : `Cross-reference to “${value}”`\n\n/**\n * A reference to this document: the `REF` field inside a link to the same bookmark, which carries\n * the screen tip Word shows on hover (\"Cross-reference to clause 2.2\").\n */\nexport function crossReferenceXml(bookmark: string, mode: CrossReferenceMode, value: string) {\n return `<w:hyperlink w:anchor=\"${esc(bookmark)}\" w:tooltip=\"${esc(\n refTooltip(value, mode)\n )}\" w:history=\"1\">${refFieldXml(refInstruction(bookmark, mode), value)}</w:hyperlink>`\n}\n\n/** The field instruction for a target: its paragraph number, or its text. */\nexport const refInstruction = (bookmark: string, mode: CrossReferenceMode) =>\n mode === 'number' ? `REF ${bookmark} \\\\r \\\\h` : `REF ${bookmark} \\\\h`\n\n/** What the reference reads in the text. */\nexport const refResult = (target: CrossReferenceTarget, mode: CrossReferenceMode) =>\n mode === 'number' && target.number ? target.number : target.text\n\nconst allBookmarks = (port: ReferencesPort) =>\n new Set(port.paragraphs().flatMap((p) => p.bookmarks))\n\n/**\n * The `_Ref` bookmark a target carries: an existing one at the paragraph, else a new one. For a\n * paragraph number it is an empty bookmark at the paragraph's start (the number is the\n * paragraph's); for heading text it wraps the heading's runs (REF shows the bookmarked text).\n */\nexport function ensureTargetBookmark(\n port: ReferencesPort,\n target: CrossReferenceTarget,\n mode: CrossReferenceMode\n): string {\n const paragraph = port.paragraphs().find((p) => p.id === target.paragraphId)\n if (!paragraph) throw new Error('That clause is no longer in the document.')\n const existing = paragraph.bookmarks.find((b) => b.startsWith(REF_BOOKMARK_PREFIX))\n if (existing && mode === 'number') return existing\n const name = newRefBookmark(allBookmarks(port))\n const start = `<w:bookmarkStart w:id=\"0\" w:name=\"${name}\"/>`\n const end = '<w:bookmarkEnd w:id=\"0\"/>'\n if (mode === 'number') {\n port.setCaret({ paragraphId: paragraph.id, offset: 0 })\n if (!port.paste(`<w:p>${start}${end}</w:p>`, '', false))\n throw new Error('The cross-reference target could not be marked.')\n return name\n }\n const runs = port.runsXml(paragraph.id)\n if (!runs) throw new Error('This heading cannot be referred to by its text; use its number.')\n // The heading's text is replaced by the same runs inside the bookmark.\n port.deleteRange(\n { paragraphId: paragraph.id, offset: 0 },\n { paragraphId: paragraph.id, offset: paragraph.text.length }\n )\n if (!port.paste(`<w:p>${start}${runs}${end}</w:p>`, paragraph.text, false))\n throw new Error('The cross-reference target could not be marked.')\n return name\n}\n\n/**\n * Where to paste at `caret`. Right after a field the engine would paste INTO the field (its result\n * runs), so a space is typed first and the paste goes after it.\n */\nfunction pastePoint(port: ReferencesPort, caret: DocPoint): DocPoint {\n const paragraph = port.paragraphs().find((p) => p.id === caret.paragraphId)\n if (paragraph?.text[caret.offset - 1] !== FIELD_ATOM) return caret\n port.setCaret(caret)\n port.typeText(' ')\n return { paragraphId: caret.paragraphId, offset: caret.offset + 1 }\n}\n\n/**\n * Mark a cross-reference's target (see {@link ensureTargetBookmark}): what the reference will\n * address and read. A paragraph number falls back to the heading text when it has none. Done as a\n * direct edit even while suggesting — the bookmark is hidden, and a heading's text is put back as\n * it was — so rejecting the reference leaves the target as it was.\n */\nexport function markCrossReferenceTarget(\n port: ReferencesPort,\n target: CrossReferenceTarget,\n mode: CrossReferenceMode\n): { bookmark: string; mode: CrossReferenceMode; value: string } {\n if (mode === 'number' && !target.number) mode = 'text'\n const bookmark = ensureTargetBookmark(port, target, mode)\n return { bookmark, mode, value: refResult(target, mode) }\n}\n\n/**\n * Insert the `REF` field of a marked target at `caret`; the caret ends after it. With a port\n * whose pastes are tracked, the reference is one suggestion.\n */\nexport function insertCrossReferenceField(\n port: ReferencesPort,\n { bookmark, mode, value }: { bookmark: string; mode: CrossReferenceMode; value: string },\n caret: DocPoint\n): { bookmark: string } {\n caret = pastePoint(port, caret)\n port.setCaret(caret)\n if (!port.paste(`<w:p>${crossReferenceXml(bookmark, mode, value)}</w:p>`, value, false))\n throw new Error('The cross-reference could not be inserted.')\n // A field is one character of the paragraph.\n port.setCaret({ paragraphId: caret.paragraphId, offset: caret.offset + 1 })\n return { bookmark }\n}\n\n/** Insert a cross-reference to a target of this document at `caret`; the caret ends after it. */\nexport function insertCrossReference(\n port: ReferencesPort,\n target: CrossReferenceTarget,\n mode: CrossReferenceMode,\n caret: DocPoint\n): { bookmark: string } {\n return insertCrossReferenceField(port, markCrossReferenceTarget(port, target, mode), caret)\n}\n\n/** The screen tip of a reference to another document: \"Cross-reference: SPA, clause 8.2 — opens in ARBI\". */\nexport const documentReferenceTooltip = (text: string, appName = 'ARBI') =>\n `Cross-reference: ${text} — opens in ${appName}`\n\n/**\n * Insert a reference to another document's passage: the reference text in the Cross Reference\n * style, linked to the passage's (absolute) app address, at `caret`.\n */\nexport function insertDocumentReference(\n port: ReferencesPort,\n reference: { text: string; url: string; appName?: string },\n caret: DocPoint\n): void {\n const text = reference.text.trim()\n if (!text) throw new Error('Enter the reference text.')\n const tooltip = documentReferenceTooltip(text, reference.appName).slice(0, 255)\n caret = pastePoint(port, caret)\n port.setCaret(caret)\n const link = `<w:p><w:hyperlink r:id=\"rIdRef1\"${\n tooltip ? ` w:tooltip=\"${esc(tooltip)}\"` : ''\n } w:history=\"1\">${run(text, CROSS_REFERENCE_STYLE)}</w:hyperlink></w:p>`\n if (!port.paste(link, text, false, hyperlinkRelationship('rIdRef1', reference.url)))\n throw new Error('The reference could not be inserted.')\n port.setCaret({ paragraphId: caret.paragraphId, offset: caret.offset + text.length })\n}\n\nexport interface RefreshResult {\n /** References rewritten with their current number or text. */\n refreshed: number\n /** References whose target is gone, now (or already) marked broken. */\n broken: BrokenReference[]\n}\n\n/**\n * Bring every cross-reference up to date: a stale one is replaced by the same reference with its\n * current value (and screen tip); one whose target was deleted becomes its last text in the Cross\n * Reference Broken style — never Word's \"Error! Reference source not found.\" A field directly\n * after another field is left alone: a paste there would land inside the previous field.\n */\nexport function refreshCrossReferences(port: ReferencesPort): RefreshResult {\n const stale = staleCrossReferences(port).sort((a, b) =>\n a.paragraphId === b.paragraphId ? b.offset - a.offset : 0\n )\n let refreshed = 0\n for (const ref of stale) {\n const paragraph = port.paragraphs().find((p) => p.id === ref.paragraphId)\n if (!paragraph || paragraph.text[ref.offset - 1] === FIELD_ATOM) continue\n const at = { paragraphId: ref.paragraphId, offset: ref.offset }\n port.deleteRange(at, { paragraphId: ref.paragraphId, offset: ref.offset + 1 })\n port.setCaret(at)\n const text = ref.value ?? (ref.cached.trim() || ref.bookmark)\n const body =\n ref.value === null\n ? run(text, BROKEN_CROSS_REFERENCE_STYLE)\n : crossReferenceXml(ref.bookmark, ref.mode, ref.value)\n if (port.paste(`<w:p>${body}</w:p>`, text, false) && ref.value !== null) refreshed++\n }\n return { refreshed, broken: brokenCrossReferences(port) }\n}\n\ntype Attr = { localName: string; value: string; prefix?: string }\ntype Element = OoxmlNodeLike & { prefix?: string }\n\n/** Run content a heading may hold and still be rewritten as runs. */\nconst RUN_PARTS = new Set(['rPr', 't', 'tab', 'br', 'lastRenderedPageBreak'])\n/** Paragraph children that are not content (kept out of the rewrite). */\nconst SKIPPED = new Set(['pPr', 'bookmarkStart', 'bookmarkEnd', 'proofErr', 'permStart', 'permEnd'])\n\nfunction serialize(node: Element): string {\n if (node.kind === 'textValue') return esc(node.value ?? '')\n const name = `${node.prefix ?? 'w'}:${node.localName}`\n const attrs = ((node.attributes ?? []) as readonly Attr[])\n .map((a) => ` ${a.prefix ? `${a.prefix}:` : ''}${a.localName}=\"${esc(a.value)}\"`)\n .join('')\n const children = (node.children ?? []).map((c) => serialize(c as Element)).join('')\n return children ? `<${name}${attrs}>${children}</${name}>` : `<${name}${attrs}/>`\n}\n\n/** A paragraph's runs as XML (formatting kept), or null for anything but plain runs. */\nexport function paragraphRunsXml(paragraph: OoxmlNodeLike): string | null {\n const runs: string[] = []\n for (const child of (paragraph.children ?? []) as Element[]) {\n if (child.localName && SKIPPED.has(child.localName)) continue\n if (child.localName !== 'r') return null\n if ((child.children ?? []).some((c) => !c.localName || !RUN_PARTS.has(c.localName))) return null\n runs.push(serialize(child))\n }\n return runs.length ? runs.join('') : null\n}\n","/**\n * A small mutable XML tree over core's hardened reader (`readXml`: no DTDs or entities, bounded),\n * for rewriting WordprocessingML parts. Names are qualified as written (`w:style`); every part this\n * module edits is written by Word, LibreOffice or this engine with the conventional prefixes, and\n * `readPart` refuses a part whose `w` prefix is bound elsewhere rather than editing it blind.\n */\nimport { readXml } from '@docx-editor.dev/core/store'\n\nexport const W_NS = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'\nexport const R_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'\n\nexport interface El {\n name: string\n attrs: Record<string, string>\n children: Node[]\n}\nexport type Node = El | string\n\nexport class TemplateError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'TemplateError'\n }\n}\n\n/** Parse one part. Text is decoded; comments and the declaration are dropped. */\nexport function parse(xml: string, part = 'part'): El {\n const read = readXml(xml, { maxBytes: 64 * 1024 * 1024, maxElements: 2_000_000 })\n if (!read.ok) throw new TemplateError(`${part} is not readable XML (${read.reason})`)\n const convert = (node: (typeof read.nodes)[number]): Node =>\n node.type === 'text'\n ? node.value\n : { name: node.name, attrs: { ...node.attributes }, children: node.children.map(convert) }\n const root = read.nodes.map(convert).find((n): n is El => typeof n !== 'string')\n if (!root) throw new TemplateError(`${part} has no root element`)\n const w = root.attrs['xmlns:w']\n if (w !== undefined && w !== W_NS) throw new TemplateError(`${part} binds w: to ${w}`)\n return root\n}\n\nconst escText = (s: string) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\nconst escAttr = (s: string) => escText(s).replace(/\"/g, '"')\n\nexport function serialize(root: El): string {\n const out: string[] = ['<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n']\n const walk = (node: Node) => {\n if (typeof node === 'string') return void out.push(escText(node))\n out.push('<', node.name)\n for (const [k, v] of Object.entries(node.attrs)) out.push(' ', k, '=\"', escAttr(v), '\"')\n if (node.children.length === 0) return void out.push('/>')\n out.push('>')\n node.children.forEach(walk)\n out.push('</', node.name, '>')\n }\n walk(root)\n return out.join('')\n}\n\nexport const el = (\n name: string,\n attrs: Record<string, string> = {},\n children: Node[] = []\n): El => ({\n name,\n attrs,\n children,\n})\nexport const isEl = (n: Node | undefined): n is El => typeof n === 'object' && n !== null\nexport const kids = (e: El, name?: string): El[] =>\n e.children.filter((c): c is El => isEl(c) && (name === undefined || c.name === name))\nexport const kid = (e: El | undefined, name: string): El | undefined =>\n e ? kids(e, name)[0] : undefined\n/** `w:val` of a child, e.g. `val(style, 'w:basedOn')`. */\nexport const val = (e: El | undefined, name: string): string | undefined =>\n kid(e, name)?.attrs['w:val']\n\n/** Every descendant element (depth-first, document order), the root included. */\nexport function* walk(e: El): Generator<El> {\n yield e\n for (const c of e.children) if (isEl(c)) yield* walk(c)\n}\n\nexport const clone = <T extends Node>(n: T): T =>\n (typeof n === 'string'\n ? n\n : { name: n.name, attrs: { ...n.attrs }, children: n.children.map(clone) }) as T\n\n/** Text of an element's `w:t` descendants. */\nexport const textOf = (e: El): string =>\n [...walk(e)]\n .filter((x) => x.name === 'w:t')\n .map((x) => x.children.filter((c): c is string => typeof c === 'string').join(''))\n .join('')\n","/**\n * A DOCX/DOTX as a map of part names to bytes, with the OPC plumbing a merge needs: content types,\n * relationships, and resolving a relationship's target to a part name.\n */\nimport { strFromU8, strToU8, unzipSync, zipSync } from 'fflate'\nimport { el, kids, parse, serialize, TemplateError, type El } from './xml'\n\nconst REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'\nexport const RT = {\n officeDocument: `${REL}/officeDocument`,\n styles: `${REL}/styles`,\n numbering: `${REL}/numbering`,\n theme: `${REL}/theme`,\n fontTable: `${REL}/fontTable`,\n settings: `${REL}/settings`,\n header: `${REL}/header`,\n footer: `${REL}/footer`,\n image: `${REL}/image`,\n hyperlink: `${REL}/hyperlink`,\n glossary: `${REL}/glossaryDocument`,\n attachedTemplate: `${REL}/attachedTemplate`,\n} as const\nconst WML = 'application/vnd.openxmlformats-officedocument.wordprocessingml'\nexport const CT = {\n document: `${WML}.document.main+xml`,\n template: `${WML}.template.main+xml`,\n macroDocument: 'application/vnd.ms-word.document.macroEnabled.main+xml',\n macroTemplate: 'application/vnd.ms-word.template.macroEnabledTemplate.main+xml',\n styles: `${WML}.styles+xml`,\n numbering: `${WML}.numbering+xml`,\n settings: `${WML}.settings+xml`,\n fontTable: `${WML}.fontTable+xml`,\n header: `${WML}.header+xml`,\n footer: `${WML}.footer+xml`,\n glossary: `${WML}.document.glossary+xml`,\n theme: 'application/vnd.openxmlformats-officedocument.theme+xml',\n rels: 'application/vnd.openxmlformats-package.relationships+xml',\n} as const\n\nexport interface Rel {\n id: string\n type: string\n target: string\n external: boolean\n}\n\n/** Part names are kept without the leading slash, as the zip stores them. */\nexport class Pkg {\n readonly files: Map<string, Uint8Array>\n private types: El\n\n constructor(files: Map<string, Uint8Array>) {\n this.files = files\n const ct = this.find('[Content_Types].xml')\n if (!ct) throw new TemplateError('not a Word package: no [Content_Types].xml')\n this.types = parse(strFromU8(files.get(ct)!), '[Content_Types].xml')\n }\n\n static read(bytes: Uint8Array): Pkg {\n let files: Record<string, Uint8Array>\n try {\n files = unzipSync(bytes)\n } catch {\n throw new TemplateError('not a Word package: not a zip')\n }\n return new Pkg(new Map(Object.entries(files).filter(([n]) => !n.endsWith('/'))))\n }\n\n write(): Uint8Array {\n this.files.set(\n this.find('[Content_Types].xml') ?? '[Content_Types].xml',\n strToU8(serialize(this.types))\n )\n return zipSync(Object.fromEntries(this.files), { level: 6 })\n }\n\n /** The stored name of a part, matched case-insensitively as OPC does. */\n find(name: string): string | undefined {\n const key = name.replace(/^\\//, '').toLowerCase()\n for (const n of this.files.keys()) if (n.toLowerCase() === key) return n\n return undefined\n }\n has(name: string) {\n return this.find(name) !== undefined\n }\n text(name: string): string | undefined {\n const n = this.find(name)\n return n === undefined ? undefined : strFromU8(this.files.get(n)!)\n }\n xml(name: string): El | undefined {\n const t = this.text(name)\n return t === undefined ? undefined : parse(t, name)\n }\n setXml(name: string, root: El, contentType?: string) {\n this.files.set(this.find(name) ?? name, strToU8(serialize(root)))\n if (contentType) this.setContentType(name, contentType)\n }\n setBytes(name: string, bytes: Uint8Array, contentType?: string) {\n this.files.set(this.find(name) ?? name, bytes)\n if (contentType) this.setContentType(name, contentType)\n }\n remove(name: string) {\n const n = this.find(name)\n if (n === undefined) return\n this.files.delete(n)\n this.types.children = this.types.children.filter(\n (c) =>\n !(\n typeof c !== 'string' &&\n c.name === 'Override' &&\n c.attrs.PartName.toLowerCase() === `/${n.toLowerCase()}`\n )\n )\n this.files.delete(relsName(n))\n }\n\n contentType(name: string): string | undefined {\n const part = `/${name.replace(/^\\//, '')}`.toLowerCase()\n const override = kids(this.types, 'Override').find(\n (o) => o.attrs.PartName.toLowerCase() === part\n )\n if (override) return override.attrs.ContentType\n const ext = part.slice(part.lastIndexOf('.') + 1)\n return kids(this.types, 'Default').find((d) => d.attrs.Extension.toLowerCase() === ext)?.attrs\n .ContentType\n }\n setContentType(name: string, type: string) {\n const part = `/${name.replace(/^\\//, '')}`\n const override = kids(this.types, 'Override').find(\n (o) => o.attrs.PartName.toLowerCase() === part.toLowerCase()\n )\n if (override) override.attrs.ContentType = type\n else this.types.children.push(el('Override', { PartName: part, ContentType: type }))\n }\n /** A `Default` for an extension (media), unless one exists. */\n ensureDefault(ext: string, type: string) {\n if (\n !kids(this.types, 'Default').some(\n (d) => d.attrs.Extension.toLowerCase() === ext.toLowerCase()\n )\n )\n this.types.children.unshift(el('Default', { Extension: ext, ContentType: type }))\n }\n\n rels(owner: string): Rel[] {\n const root = this.xml(relsName(owner))\n if (!root) return []\n return kids(root, 'Relationship').map((r) => ({\n id: r.attrs.Id,\n type: r.attrs.Type,\n target: r.attrs.Target,\n external: r.attrs.TargetMode === 'External',\n }))\n }\n setRels(owner: string, rels: Rel[]) {\n const root = el(\n 'Relationships',\n { xmlns: 'http://schemas.openxmlformats.org/package/2006/relationships' },\n rels.map((r) =>\n el('Relationship', {\n Id: r.id,\n Type: r.type,\n Target: r.target,\n ...(r.external ? { TargetMode: 'External' } : {}),\n })\n )\n )\n this.setXml(relsName(owner), root)\n }\n /** Add a relationship from `owner`; returns its new id. */\n addRel(owner: string, type: string, target: string, external = false): string {\n const rels = this.rels(owner)\n const id = freshId(new Set(rels.map((r) => r.id)), 'rIdT')\n rels.push({ id, type, target, external })\n this.setRels(owner, rels)\n return id\n }\n\n /** The part a relationship of `owner` points at (internal targets only). */\n target(owner: string, rel: Rel): string {\n return resolveTarget(owner, rel.target)\n }\n /** The first internal part of a relationship type from `owner`. */\n partOf(owner: string, type: string): string | undefined {\n const rel = this.rels(owner).find((r) => r.type === type && !r.external)\n return rel && this.find(this.target(owner, rel))\n }\n /** The main document part (`word/document.xml` by convention). */\n get main(): string {\n const main = this.partOf('', RT.officeDocument)\n if (!main) throw new TemplateError('not a Word package: no main document part')\n return main\n }\n}\n\n/** `word/document.xml` → `word/_rels/document.xml.rels`; '' (the package) → `_rels/.rels`. */\nfunction relsName(owner: string): string {\n const slash = owner.lastIndexOf('/')\n return `${owner.slice(0, slash + 1)}_rels/${owner.slice(slash + 1)}.rels`\n}\n\nfunction resolveTarget(owner: string, target: string): string {\n if (target.startsWith('/')) return target.slice(1)\n const base = owner\n .slice(0, owner.lastIndexOf('/') + 1)\n .split('/')\n .filter(Boolean)\n for (const seg of target.split('/')) {\n if (seg === '..') base.pop()\n else if (seg !== '.' && seg !== '') base.push(seg)\n }\n return base.join('/')\n}\n\n/** A target for `part` relative to `owner`'s folder. */\nexport function relativeTarget(owner: string, part: string): string {\n const from = owner.slice(0, owner.lastIndexOf('/') + 1)\n return part.startsWith(from) ? part.slice(from.length) : `/${part}`\n}\n\nfunction freshId(taken: ReadonlySet<string>, prefix: string): string {\n for (let i = 1; ; i++) if (!taken.has(`${prefix}${i}`)) return `${prefix}${i}`\n}\n\n/** An unused part name like `word/header3.xml` / `word/media/image2.png`. */\nexport function freshPartName(pkg: Pkg, folder: string, stem: string, ext: string): string {\n for (let i = 1; ; i++) {\n const name = `${folder}${stem}${i}.${ext}`\n if (!pkg.has(name)) return name\n }\n}\n","/**\n * A fragment package marked as one tracked insertion, so that pasting it while suggesting lands a\n * change to review rather than an untracked edit. The editor's paste keeps `w:ins` from a\n * fragment (renumbering its id), and accepting or rejecting the change takes the whole insertion.\n */\nimport { Pkg } from './pkg'\nimport { el, isEl, kid, type El } from './xml'\n\n/** Who made a tracked change and when (`w:author`, `w:date`). */\nexport interface Revision {\n author: string\n /** ISO 8601, seconds precision, e.g. `2026-10-19T09:30:00Z`. */\n date: string\n}\n\n/** Already tracked in the fragment: left as they are. */\nconst TRACKED = new Set(['w:ins', 'w:del', 'w:moveFrom', 'w:moveTo'])\n\n/**\n * The fragment with every run wrapped in `w:ins` and every new paragraph mark marked inserted. A\n * table row is marked inserted as a whole, its cells left as they are: the editor rejects an\n * inserted row whose content is tracked as well only partly. A run is not descended into, so a\n * text box goes in with its run. `covered`: the fragment's last paragraph mark is pasted too (a\n * block before the caret's paragraph); otherwise the last paragraph runs into the text after the\n * caret and its mark is not new.\n */\nexport function trackInsertion(\n fragment: Uint8Array,\n revision: Revision,\n covered: boolean\n): Uint8Array {\n const pkg = Pkg.read(fragment)\n const main = pkg.main\n const root = pkg.xml(main)\n const body = kid(root, 'w:body')\n if (!root || !body) return fragment\n const attrs = { 'w:id': '1', 'w:author': revision.author, 'w:date': revision.date }\n const lastParagraph = body.children.filter(isEl).findLast((c) => c.name === 'w:p')\n\n const visit = (node: El) => {\n node.children = node.children.map((child) => {\n if (!isEl(child)) return child\n if (child.name === 'w:r') return TRACKED.has(node.name) ? child : el('w:ins', attrs, [child])\n if (TRACKED.has(child.name)) return child\n if (child.name === 'w:tr') {\n markRow(child, attrs)\n return child\n }\n visit(child)\n if (child.name === 'w:p' && (covered || child !== lastParagraph)) markParagraph(child, attrs)\n return child\n })\n }\n visit(body)\n pkg.setXml(main, root)\n return pkg.write()\n}\n\n/** `w:pPr/w:rPr/w:ins`: the paragraph mark is inserted (`w:ins` comes first in `CT_ParaRPr`). */\nfunction markParagraph(p: El, attrs: Record<string, string>) {\n let pPr = kid(p, 'w:pPr')\n if (!pPr) p.children.unshift((pPr = el('w:pPr')))\n let rPr = kid(pPr, 'w:rPr')\n if (!rPr) {\n rPr = el('w:rPr')\n // Before `w:sectPr` and `w:pPrChange`, which close `CT_PPr`.\n const at = pPr.children.findIndex(\n (c) => isEl(c) && (c.name === 'w:sectPr' || c.name === 'w:pPrChange')\n )\n pPr.children.splice(at < 0 ? pPr.children.length : at, 0, rPr)\n }\n if (!kid(rPr, 'w:ins')) rPr.children.unshift(el('w:ins', attrs))\n}\n\n/** `w:trPr/w:ins`: the table row is inserted (after the row properties, before `w:trPrChange`). */\nfunction markRow(tr: El, attrs: Record<string, string>) {\n let trPr = kid(tr, 'w:trPr')\n if (!trPr) {\n trPr = el('w:trPr')\n const after = tr.children.findIndex((c) => isEl(c) && c.name === 'w:tblPrEx')\n tr.children.splice(after + 1, 0, trPr)\n }\n if (kid(trPr, 'w:ins')) return\n const at = trPr.children.findIndex((c) => isEl(c) && c.name === 'w:trPrChange')\n trPr.children.splice(at < 0 ? trPr.children.length : at, 0, el('w:ins', attrs))\n}\n","/**\n * Defined-term and cross-reference content as WordprocessingML, and the clipboard fragment (a small\n * `.docx` package) that carries it into a document. The engine has no \"insert bookmark\" command, but\n * its paste lands an embedded fragment with everything in it — `w:bookmarkStart`/`w:bookmarkEnd` and\n * `w:hyperlink w:anchor` included — freshening bookmark ids as it goes.\n */\n\nimport { docxPackage, documentXml, esc, stylesXml } from './ooxml'\nimport { trackInsertion, type Revision } from '../template/track'\nimport {\n BROKEN_CROSS_REFERENCE_STYLE,\n CROSS_REFERENCE_STYLE,\n DEFINED_TERM_STYLE,\n type OoxmlNodeLike,\n} from './read'\nimport type { ParsedDefinition } from './terms'\n\ntype Definition = Pick<ParsedDefinition, 'term' | 'rest'>\n\n/**\n * The character styles the inserted content uses. A paste brings a style the document does not\n * define; one it already defines (a house template's) is used as it is, so only the missing ones\n * go into a fragment (see {@link stylesUsed}).\n */\nexport const CHARACTER_STYLES: Record<string, string> = {\n [DEFINED_TERM_STYLE]: `<w:style w:type=\"character\" w:customStyle=\"1\" w:styleId=\"${DEFINED_TERM_STYLE}\"><w:name w:val=\"Defined Term\"/><w:rPr><w:u w:val=\"dotted\" w:color=\"7F7F7F\"/></w:rPr></w:style>`,\n [CROSS_REFERENCE_STYLE]: `<w:style w:type=\"character\" w:customStyle=\"1\" w:styleId=\"${CROSS_REFERENCE_STYLE}\"><w:name w:val=\"Cross Reference\"/><w:rPr><w:color w:val=\"1F4E79\"/><w:u w:val=\"dotted\" w:color=\"8EA9C1\"/></w:rPr></w:style>`,\n [BROKEN_CROSS_REFERENCE_STYLE]: `<w:style w:type=\"character\" w:customStyle=\"1\" w:styleId=\"${BROKEN_CROSS_REFERENCE_STYLE}\"><w:name w:val=\"Cross Reference Broken\"/><w:basedOn w:val=\"${CROSS_REFERENCE_STYLE}\"/><w:rPr><w:color w:val=\"C00000\"/><w:u w:val=\"wave\" w:color=\"C00000\"/></w:rPr></w:style>`,\n}\n\n/** The character styles a fragment's runs use (`w:rStyle`), as ids. */\nexport function stylesUsed(body: string): string[] {\n return [...new Set([...body.matchAll(/<w:rStyle w:val=\"([^\"]+)\"/g)].map((m) => m[1]))]\n}\n\n// No document defaults: the paste writes a fragment's defaults onto its runs as direct formatting,\n// and pasted terms and definitions should take the formatting of the document they land in.\nconst fragmentStyles = (ids: readonly string[]) =>\n stylesXml(\n '',\n `<w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\"><w:name w:val=\"Normal\"/><w:qFormat/></w:style>${ids\n .map((id) => CHARACTER_STYLES[id] ?? '')\n .join('')}`\n )\n\nconst textRun = (text: string, props = '') =>\n `<w:r>${props ? `<w:rPr>${props}</w:rPr>` : ''}<w:t xml:space=\"preserve\">${esc(text)}</w:t></w:r>`\n\n/** What Word shows on hover over a term: its definition, as one line of at most 255 characters. */\nexport function definitionTooltip(definition: Definition): string {\n const line = `“${definition.term}”${definition.rest}`.replace(/\\s+/g, ' ').trim()\n return line.length > 255 ? `${line.slice(0, 254)}…` : line\n}\n\n/** The definition paragraph's text as the document shows it: `“Shares” means the issued shares.` */\nexport const definitionParagraphText = (definition: Definition) =>\n `“${definition.term}”${definition.rest}`\n\n/**\n * A definition paragraph: the quoted term in bold, bookmarked (`bookmark`), then the definition as\n * the fact writes it. `id` is the bookmark id inside the fragment; the paste renumbers it.\n */\nexport function definitionParagraphXml(definition: Definition, bookmark: string, id = 0): string {\n return `<w:p><w:bookmarkStart w:id=\"${id}\" w:name=\"${esc(bookmark)}\"/>${textRun('“')}${textRun(\n definition.term,\n '<w:b/>'\n )}${textRun('”')}<w:bookmarkEnd w:id=\"${id}\"/>${textRun(definition.rest)}</w:p>`\n}\n\n/** A heading paragraph: the document's own heading style when it has one, else bold text. */\nexport function headingParagraphXml(text: string, styleId?: string): string {\n return styleId\n ? `<w:p><w:pPr><w:pStyle w:val=\"${esc(styleId)}\"/></w:pPr>${textRun(text)}</w:p>`\n : `<w:p><w:pPr><w:keepNext/></w:pPr>${textRun(text, '<w:b/>')}</w:p>`\n}\n\n/** The term as an internal link to its definition's bookmark, with the definition as its tooltip. */\nexport function termLinkXml(term: string, bookmark: string, tooltip: string): string {\n return `<w:p><w:hyperlink w:anchor=\"${esc(bookmark)}\" w:tooltip=\"${esc(tooltip)}\" w:history=\"1\">${textRun(\n term,\n `<w:rStyle w:val=\"${DEFINED_TERM_STYLE}\"/>`\n )}</w:hyperlink></w:p>`\n}\n\n/**\n * The fragment package carrying `body` (paragraph XML). `covered` says the last paragraph mark is\n * part of it: the paste then ends with a whole paragraph (a block inserted before the caret's\n * paragraph) instead of running into the text after the caret (inline). With a `revision`, the\n * fragment is one tracked insertion by it.\n */\nexport function fragmentPackage(\n body: string,\n covered: boolean,\n {\n revision,\n relationships,\n styles = stylesUsed(body),\n }: {\n revision?: Revision | null\n /** Relationships the body refers to (a hyperlink's target). */\n relationships?: string\n /** The character styles to bring (default: every one the body uses). */\n styles?: readonly string[]\n } = {}\n): Uint8Array {\n const untracked = docxPackage({\n document: documentXml(body),\n styles: fragmentStyles(styles),\n title: 'Defined terms',\n relationships,\n })\n return revision ? trackInsertion(untracked, revision, covered) : untracked\n}\n\nconst attr = (node: OoxmlNodeLike, name: string) =>\n node.attributes?.find((a) => a.localName === name)?.value\n\n/** The style ids a document's styles part defines. */\nexport function documentStyleIds(root: OoxmlNodeLike | null | undefined): Set<string> {\n const ids = new Set<string>()\n for (const style of root?.children ?? [])\n if (style.localName === 'style') {\n const id = attr(style, 'styleId')\n if (id) ids.add(id)\n }\n return ids\n}\n","/**\n * Paragraph text as one rich-text string.\n *\n * Why: the OOXML tree splits a run whenever formatting or a tracked change starts in the middle of\n * it, and a tree CRDT can only express that as \"delete the suffix here, insert a copy there\". When\n * two people do it to the same run at once, both copies survive and the text is duplicated. Here a\n * paragraph's characters live in a single Y.Text and everything that used to split them (run\n * properties, tracked-change and hyperlink wrappers, the shape of a text element) is an attribute on\n * a range of it, so a split only moves a boundary and never moves a character.\n *\n * A unit is one UTF-16 code unit of text, or one embedded element (a tab, a break, a field\n * character, a drawing, a bookmark...). Its attributes say which run, which wrappers and which text\n * element it belongs to. `encodeParagraph` returns null for a paragraph this model cannot hold\n * exactly, and the caller then keeps that paragraph as a plain element tree.\n */\nimport type * as Y from 'yjs'\n\nexport const WML = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'\n\nexport interface XmlAttr {\n ns: string\n local: string\n prefix?: string\n value: string\n}\n\nexport interface XmlBinding {\n prefix: string\n ns: string\n}\n\n/** A plain element: the generic shape the mirror stores, with text nodes as strings. */\nexport interface XmlEl {\n ns: string\n local: string\n prefix?: string\n attrs: XmlAttr[]\n bindings: XmlBinding[]\n children: (XmlEl | string)[]\n /** Identity of a run or wrapper, so two neighbours with equal properties stay two elements. Not XML. */\n _id?: string\n}\n\n/** An element without its children, as carried in an attribute. */\ninterface ElDesc {\n ns: string\n local: string\n prefix?: string\n attrs: XmlAttr[]\n bindings: XmlBinding[]\n}\n\ninterface WrapperDesc extends ElDesc {\n /** Children that come before the inline content (an inline content control's properties). */\n head: XmlEl[]\n id: string\n}\n\ninterface UnitAttrs {\n /** The run's `w:rPr`, or null when it has none. */\n r: XmlEl | null\n /** The run element itself, without children. */\n ra: ElDesc | null\n /** Which run: stays the same when the run is split, so neighbours with equal properties never merge. */\n ri: string | null\n /** Wrappers around the run, outermost first. */\n w: WrapperDesc[]\n /** The text element this character sits in (`w:t`, `w:delText`, `w:instrText`). */\n tx: ElDesc | null\n /** 'a' for an atom placed directly in the paragraph or a wrapper, 'e' for an empty run. */\n k: 'a' | 'e' | null\n}\n\nexport interface Unit {\n /** One UTF-16 code unit, or an embedded element. */\n v: string | { x: XmlEl }\n a: UnitAttrs\n}\n\nexport interface EncodedParagraph {\n /** Children that precede the inline content: the paragraph properties. */\n head: XmlEl[]\n units: Unit[]\n}\n\nconst WRAPPERS = new Set([\n 'ins',\n 'del',\n 'moveFrom',\n 'moveTo',\n 'hyperlink',\n 'smartTag',\n 'fldSimple',\n 'customXml',\n 'dir',\n 'bdo',\n 'sdtContent',\n])\nconst TEXT_ELEMENTS = new Set(['t', 'delText', 'instrText'])\n\nconst isEl = (n: XmlEl | string): n is XmlEl => typeof n !== 'string'\nconst isWml = (el: XmlEl, local: string): boolean => el.ns === WML && el.local === local\n\nfunction describe(el: XmlEl): ElDesc {\n const desc: ElDesc = { ns: el.ns, local: el.local, attrs: el.attrs, bindings: el.bindings }\n if (el.prefix !== undefined) desc.prefix = el.prefix\n return desc\n}\n\nfunction withChildren(desc: ElDesc, children: (XmlEl | string)[], id?: string): XmlEl {\n const el: XmlEl = {\n ns: desc.ns,\n local: desc.local,\n attrs: desc.attrs,\n bindings: desc.bindings,\n children,\n }\n if (desc.prefix !== undefined) el.prefix = desc.prefix\n if (id !== undefined) el._id = id\n return el\n}\n\nlet counter = 0\n/** A fresh run or wrapper identity. */\nexport function newRunId(): string {\n counter += 1\n return `${Math.random().toString(36).slice(2, 8)}${counter.toString(36)}`\n}\n\nclass Unrepresentable extends Error {}\n\nfunction fail(): never {\n throw new Unrepresentable()\n}\n\nfunction encodeRun(run: XmlEl, wrappers: WrapperDesc[], out: Unit[]): void {\n const children = run.children\n let rPr: XmlEl | null = null\n let start = 0\n const first = children[0]\n if (first !== undefined && isEl(first) && isWml(first, 'rPr')) {\n rPr = first\n start = 1\n }\n const base = { r: rPr, ra: describe(run), ri: run._id ?? newRunId(), w: wrappers }\n let produced = false\n for (let i = start; i < children.length; i++) {\n const child = children[i]\n if (!isEl(child)) fail()\n const only = child.children[0]\n if (\n child.ns === WML &&\n TEXT_ELEMENTS.has(child.local) &&\n child.children.length === 1 &&\n typeof only === 'string' &&\n only.length > 0\n ) {\n const tx = describe(child)\n for (let c = 0; c < only.length; c++) out.push({ v: only[c], a: { ...base, tx, k: null } })\n } else {\n out.push({ v: { x: child }, a: { ...base, tx: null, k: null } })\n }\n produced = true\n }\n if (!produced)\n out.push({\n v: { x: { ns: WML, local: 'e', attrs: [], bindings: [], children: [] } },\n a: { ...base, tx: null, k: 'e' },\n })\n}\n\nfunction encodeInline(children: (XmlEl | string)[], wrappers: WrapperDesc[], out: Unit[]): void {\n for (const child of children) {\n if (!isEl(child)) fail()\n if (child.ns === WML && child.local === 'r') {\n encodeRun(child, wrappers, out)\n } else if (child.ns === WML && WRAPPERS.has(child.local)) {\n const before = out.length\n const desc: WrapperDesc = { ...describe(child), head: [], id: child._id ?? newRunId() }\n let ok = true\n const inner: Unit[] = []\n try {\n encodeInline(child.children, [...wrappers, desc], inner)\n } catch (error) {\n if (!(error instanceof Unrepresentable)) throw error\n ok = false\n }\n if (ok && inner.length > 0) out.push(...inner)\n else {\n out.length = before\n out.push(atom(child, wrappers))\n }\n } else if (child.ns === WML && child.local === 'sdt') {\n const last = child.children[child.children.length - 1]\n const head = child.children.slice(0, -1)\n if (last !== undefined && isEl(last) && isWml(last, 'sdtContent') && head.every(isEl)) {\n const before = out.length\n const sdt: WrapperDesc = {\n ...describe(child),\n head: head as XmlEl[],\n id: child._id ?? newRunId(),\n }\n const content: WrapperDesc = { ...describe(last), head: [], id: last._id ?? newRunId() }\n const inner: Unit[] = []\n let ok = true\n try {\n encodeInline(last.children, [...wrappers, sdt, content], inner)\n } catch (error) {\n if (!(error instanceof Unrepresentable)) throw error\n ok = false\n }\n if (ok && inner.length > 0) out.push(...inner)\n else {\n out.length = before\n out.push(atom(child, wrappers))\n }\n } else out.push(atom(child, wrappers))\n } else {\n out.push(atom(child, wrappers))\n }\n }\n}\n\nfunction atom(el: XmlEl, wrappers: WrapperDesc[]): Unit {\n return { v: { x: el }, a: { r: null, ra: null, ri: null, w: wrappers, tx: null, k: 'a' } }\n}\n\n/** Encode a paragraph's children, or null when the paragraph cannot be held exactly. */\nexport function encodeParagraph(children: (XmlEl | string)[]): EncodedParagraph | null {\n const head: XmlEl[] = []\n let start = 0\n const first = children[0]\n if (first !== undefined && isEl(first) && isWml(first, 'pPr')) {\n head.push(first)\n start = 1\n }\n const units: Unit[] = []\n try {\n encodeInline(children.slice(start), [], units)\n } catch (error) {\n if (error instanceof Unrepresentable) return null\n throw error\n }\n return { head, units }\n}\n\nconst same = (a: unknown, b: unknown): boolean => JSON.stringify(a) === JSON.stringify(b)\n\nfunction decodeRange(units: Unit[], from: number, to: number, depth: number): XmlEl[] {\n const out: XmlEl[] = []\n let i = from\n while (i < to) {\n const unit = units[i]\n const { w } = unit.a\n if (w.length > depth) {\n const wrapper = w[depth]\n let j = i + 1\n while (j < to && units[j].a.w.length > depth && same(units[j].a.w[depth], wrapper)) j++\n out.push(\n withChildren(wrapper, [...wrapper.head, ...decodeRange(units, i, j, depth + 1)], wrapper.id)\n )\n i = j\n } else if (unit.a.k === 'a') {\n out.push((unit.v as { x: XmlEl }).x)\n i++\n } else {\n let j = i + 1\n // An empty run stands alone, so it never merges into a neighbour with the same properties.\n while (\n unit.a.k !== 'e' &&\n j < to &&\n units[j].a.w.length === depth &&\n units[j].a.k !== 'a' &&\n units[j].a.k !== 'e' &&\n units[j].a.ri === unit.a.ri &&\n same(units[j].a.r, unit.a.r) &&\n same(units[j].a.ra, unit.a.ra)\n ) {\n j++\n }\n out.push(decodeRun(units, i, j))\n i = j\n }\n }\n return out\n}\n\nfunction decodeRun(units: Unit[], from: number, to: number): XmlEl {\n const { r, ra } = units[from].a\n const children: (XmlEl | string)[] = []\n if (r) children.push(r)\n let i = from\n while (i < to) {\n const unit = units[i]\n if (unit.a.k === 'e') {\n i++\n } else if (typeof unit.v === 'string') {\n let j = i + 1\n while (j < to && typeof units[j].v === 'string' && same(units[j].a.tx, unit.a.tx)) j++\n let text = ''\n for (let c = i; c < j; c++) text += units[c].v as string\n children.push(withChildren(unit.a.tx as ElDesc, [text]))\n i = j\n } else {\n children.push(unit.v.x)\n i++\n }\n }\n return withChildren(ra as ElDesc, children, units[from].a.ri ?? undefined)\n}\n\n/** The children a paragraph's units stand for, after its properties. */\nexport function decodeInline(units: Unit[]): XmlEl[] {\n return decodeRange(units, 0, units.length, 0)\n}\n\nexport function decodeParagraph(encoded: EncodedParagraph): (XmlEl | string)[] {\n return [...encoded.head, ...decodeInline(encoded.units)]\n}\n\n// ── Y.Text input and output ────────────────────────────────────────────────\n\nconst KEYS = ['r', 'ra', 'ri', 'w', 'tx', 'k'] as const\n\nfunction toAttributes(a: UnitAttrs): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const key of KEYS) {\n const value = a[key]\n if (value !== null && !(key === 'w' && (value as unknown[]).length === 0)) out[key] = value\n }\n return out\n}\n\nfunction fromAttributes(attributes: Record<string, unknown> | undefined): UnitAttrs {\n const a = attributes ?? {}\n return {\n r: (a.r as XmlEl | undefined) ?? null,\n ra: (a.ra as ElDesc | undefined) ?? null,\n ri: (a.ri as string | undefined) ?? null,\n w: (a.w as WrapperDesc[] | undefined) ?? [],\n tx: (a.tx as ElDesc | undefined) ?? null,\n k: (a.k as UnitAttrs['k'] | undefined) ?? null,\n }\n}\n\n/** The units a Y.Text currently holds. */\nexport function readUnits(text: Y.Text): Unit[] {\n const units: Unit[] = []\n for (const op of text.toDelta() as {\n insert: string | { x: XmlEl }\n attributes?: Record<string, unknown>\n }[]) {\n const a = fromAttributes(op.attributes)\n if (typeof op.insert === 'string') {\n for (let i = 0; i < op.insert.length; i++) units.push({ v: op.insert[i], a })\n } else {\n units.push({ v: op.insert, a })\n }\n }\n return units\n}\n\nconst valueKeyOf = (u: Unit): string => (typeof u.v === 'string' ? u.v : JSON.stringify(u.v))\nconst attrsKeyOf = (u: Unit): string => JSON.stringify(u.a)\n\ntype DeltaOp = {\n retain?: number\n delete?: number\n insert?: string | object\n attributes?: Record<string, unknown>\n}\n\nfunction attributeChange(from: UnitAttrs, to: UnitAttrs): Record<string, unknown> {\n const a = toAttributes(from)\n const b = toAttributes(to)\n const change: Record<string, unknown> = {}\n for (const key of KEYS) {\n if (JSON.stringify(a[key]) !== JSON.stringify(b[key])) change[key] = b[key] ?? null\n }\n return change\n}\n\nfunction pushRetain(delta: DeltaOp[], length: number, attributes?: Record<string, unknown>): void {\n if (length === 0) return\n const last = delta[delta.length - 1]\n const empty = !attributes || Object.keys(attributes).length === 0\n if (last && last.retain !== undefined && !last.attributes && empty) {\n last.retain += length\n return\n }\n delta.push(empty ? { retain: length } : { retain: length, attributes })\n}\n\n/** Retain `length` units, reformatting where the attributes of `previous` and `next` differ. */\nfunction reformat(\n delta: DeltaOp[],\n previous: Unit[],\n from: number,\n next: Unit[],\n to: number,\n length: number\n): void {\n let i = 0\n while (i < length) {\n const change = attributeChange(previous[from + i].a, next[to + i].a)\n const key = JSON.stringify(change)\n let j = i + 1\n while (\n j < length &&\n JSON.stringify(attributeChange(previous[from + j].a, next[to + j].a)) === key\n ) {\n j++\n }\n pushRetain(delta, j - i, change)\n i = j\n }\n}\n\n/**\n * Make `text` hold `next`, changing as little as possible. Characters are matched by value from both\n * ends, so what a person typed is the only thing inserted; matched characters whose attributes\n * changed (a run split, a tracked change started) are reformatted in place and never retyped. That is\n * what lets two people's edits of one paragraph merge instead of duplicating text.\n */\nexport function applyUnits(text: Y.Text, previous: Unit[], next: Unit[]): void {\n let start = 0\n const limit = Math.min(previous.length, next.length)\n while (start < limit && valueKeyOf(previous[start]) === valueKeyOf(next[start])) start++\n let endPrev = previous.length\n let endNext = next.length\n while (\n endPrev > start &&\n endNext > start &&\n valueKeyOf(previous[endPrev - 1]) === valueKeyOf(next[endNext - 1])\n ) {\n endPrev--\n endNext--\n }\n\n const delta: DeltaOp[] = []\n reformat(delta, previous, 0, next, 0, start)\n if (endPrev > start) delta.push({ delete: endPrev - start })\n let i = start\n while (i < endNext) {\n const unit = next[i]\n if (typeof unit.v !== 'string') {\n delta.push({ insert: unit.v, attributes: toAttributes(unit.a) })\n i++\n continue\n }\n let j = i + 1\n let chunk = unit.v\n const attributes = attrsKeyOf(unit)\n while (j < endNext && typeof next[j].v === 'string' && attrsKeyOf(next[j]) === attributes) {\n chunk += next[j].v as string\n j++\n }\n delta.push({ insert: chunk, attributes: toAttributes(unit.a) })\n i = j\n }\n reformat(delta, previous, endPrev, next, endNext, previous.length - endPrev)\n if (delta.every((op) => op.retain !== undefined && !op.attributes)) return\n text.applyDelta(delta, { sanitize: false })\n}\n\n/** Write units into an empty Y.Text. */\nexport function writeUnits(text: Y.Text, units: Unit[]): void {\n applyUnits(text, [], units)\n}\n","/**\n * Elements of the mirror, in both directions: plain `XmlEl` objects to Yjs types and back, and\n * `XmlEl` to XML text.\n *\n * Three forms:\n *\n * - A paragraph is held as a rich paragraph (see rich.ts) whenever it can be represented exactly:\n * its properties stay in `children`, and its inline content is the single Y.Text `inline`.\n * - An element with no editable text anywhere below it (a style, a numbering definition, a font, a\n * setting, a theme, paragraph or table properties, a section's setup) is packed: the map holds\n * its whole subtree as one XML string under `xml`. It is opened into a plain tree when an edit\n * touches it and written back whole, so concurrent edits to the same packed element are last\n * writer wins, while different elements (two styles) still merge. Held as a tree, every element,\n * attribute and namespace URI was its own CRDT item: a 350 KB styles part took 3.2 MB of room\n * state and over 100 MB of heap to load.\n * - Every other element (the body, a table, a cell, a footnote: the path to editable text) is a\n * generic map with a `children` array.\n */\nimport * as Y from 'yjs'\nimport { readXml, XML_NAMESPACE_URI } from '@docx-editor.dev/core/store'\nimport {\n decodeInline,\n encodeParagraph,\n readUnits,\n WML,\n writeUnits,\n type EncodedParagraph,\n type XmlAttr,\n type XmlBinding,\n type XmlEl,\n} from './rich'\n\nexport type LiveElement = Y.Map<unknown>\ntype LiveChild = LiveElement | Y.Text\n\nexport function isRichParagraph(map: Y.Map<unknown>): boolean {\n return map.has('inline')\n}\n\n/** Key of a packed element's XML. */\nconst PACKED = 'xml'\n\nexport function isPackedElement(map: Y.Map<unknown>): boolean {\n return map.has(PACKED)\n}\n\n/** A rich paragraph or a packed element: its inner nodes have no Yjs type of their own. */\nexport function isCompact(map: Y.Map<unknown>): boolean {\n return isRichParagraph(map) || isPackedElement(map)\n}\n\n/** Elements that carry or contain editable text: never packed, so typing merges character-wise. */\nconst TEXT_BEARING = new Set(['p', 't', 'delText', 'instrText', 'delInstrText'])\n\n/** Whether an element is held packed: nothing below it is a paragraph or a run's text. */\nexport function packable(xml: XmlEl): boolean {\n if (xml.ns === WML && TEXT_BEARING.has(xml.local)) return false\n return xml.children.every((c) => typeof c === 'string' || packable(c))\n}\n\n/** The packed form of an element. */\nfunction createPacked(xml: XmlEl, scope: Scope): LiveElement {\n const map = new Y.Map<unknown>()\n map.set(PACKED, serializeXml(xml, scope))\n return map\n}\n\n/** Rewrite a packed element when its content changed. */\nexport function repack(map: LiveElement, xml: XmlEl): void {\n const next = serializeXml(xml, scopeOf(map))\n if (map.get(PACKED) !== next) map.set(PACKED, next)\n}\n\n/** Namespace bindings in scope where `node` sits: those of every element above it. */\nexport function scopeOf(node: LiveElement): Map<string, string> {\n const chain: LiveElement[] = []\n let parent = node.parent\n while (parent instanceof Y.Array) {\n const owner = parent.parent\n if (!(owner instanceof Y.Map)) break\n chain.push(owner)\n parent = owner.parent\n }\n const scope = new Map<string, string>()\n for (const el of chain.reverse()) {\n for (const b of (el.get('bindings') as Y.Array<XmlBinding>).toArray()) scope.set(b.prefix, b.ns)\n }\n return scope\n}\n\n/** The scope inside `el`: what its children see. */\nexport function scopeWithin(el: LiveElement): Map<string, string> {\n const scope = scopeOf(el)\n if (!isPackedElement(el)) {\n for (const b of (el.get('bindings') as Y.Array<XmlBinding>).toArray()) scope.set(b.prefix, b.ns)\n }\n return scope\n}\n\nconst unpackLimits = { maxBytes: 64 * 1024 * 1024, maxElements: 2_000_000 }\n\n/** Parse a packed element's XML back into the generic form, resolving prefixes against `scope`. */\nfunction unpack(text: string, scope: Scope): XmlEl {\n const read = readXml(text, unpackLimits)\n if (!read.ok) throw new Error(`collab: a packed element is not readable XML (${read.reason})`)\n type Node = (typeof read.nodes)[number]\n const convert = (node: Extract<Node, { type: 'element' }>, outer: Scope): XmlEl => {\n const bindings: XmlBinding[] = []\n const named: [string, string][] = []\n for (const [name, value] of Object.entries(node.attributes)) {\n if (name === 'xmlns') bindings.push({ prefix: '', ns: value })\n else if (name.startsWith('xmlns:')) bindings.push({ prefix: name.slice(6), ns: value })\n else named.push([name, value])\n }\n const inner = new Map(outer)\n for (const b of bindings) inner.set(b.prefix, b.ns)\n const resolve = (prefix: string): string => {\n if (prefix === 'xml') return XML_NAMESPACE_URI\n const ns = inner.get(prefix)\n if (ns === undefined)\n throw new Error(`collab: prefix ${prefix} is not bound in a packed element`)\n return ns\n }\n const colon = node.name.indexOf(':')\n const xml: XmlEl = {\n ns: colon < 0 ? (inner.get('') ?? '') : resolve(node.name.slice(0, colon)),\n local: colon < 0 ? node.name : node.name.slice(colon + 1),\n attrs: named.map(([name, value]) => {\n const at = name.indexOf(':')\n if (at < 0) return { ns: '', local: name, value }\n const prefix = name.slice(0, at)\n return { ns: resolve(prefix), local: name.slice(at + 1), prefix, value }\n }),\n bindings,\n children: node.children.map((child) =>\n child.type === 'text' ? child.value : convert(child, inner)\n ),\n }\n if (colon >= 0) xml.prefix = node.name.slice(0, colon)\n return xml\n }\n const root = read.nodes.find((n) => n.type === 'element')\n if (!root || root.type !== 'element') throw new Error('collab: a packed element is empty')\n return convert(root, scope)\n}\n\nexport function isParagraphEl(el: { ns: string; local: string }): boolean {\n return el.ns === WML && el.local === 'p'\n}\n\nfunction fieldsOf(map: Y.Map<unknown>, xml: XmlEl): void {\n map.set('ns', xml.ns)\n map.set('local', xml.local)\n if (xml.prefix !== undefined) map.set('prefix', xml.prefix)\n const attrs = new Y.Array<XmlAttr>()\n attrs.push(xml.attrs.map((a) => ({ ...a })))\n map.set('attrs', attrs)\n const bindings = new Y.Array<XmlBinding>()\n bindings.push(xml.bindings.map((b) => ({ ...b })))\n map.set('bindings', bindings)\n}\n\nexport function newText(value: string): Y.Text {\n const text = new Y.Text()\n text.insert(0, value)\n return text\n}\n\n/** A rich paragraph: properties in `children`, inline content in `inline`. */\nexport function createRichParagraph(\n xml: XmlEl,\n encoded: EncodedParagraph,\n scope: Scope = new Map()\n): LiveElement {\n const map = new Y.Map<unknown>()\n fieldsOf(map, xml)\n const inner = withBindings(scope, xml.bindings)\n const children = new Y.Array<LiveChild>()\n children.push(encoded.head.map((el) => xmlToLive(el, inner)))\n map.set('children', children)\n const inline = new Y.Text()\n writeUnits(inline, encoded.units)\n map.set('inline', inline)\n return map\n}\n\nexport function withBindings(scope: Scope, bindings: readonly XmlBinding[]): Map<string, string> {\n const inner = new Map(scope)\n for (const b of bindings) inner.set(b.prefix, b.ns)\n return inner\n}\n\n/**\n * Build the Yjs form of an element sitting where `scope` is in force. A paragraph that cannot be\n * held as rich text is stored plainly; a part's `root` is never packed, so its children (styles,\n * numbering definitions, settings) stay separate items.\n */\nexport function xmlToLive(xml: XmlEl, scope: Scope = new Map(), root = false): LiveElement {\n if (isParagraphEl(xml)) {\n const encoded = encodeParagraph(xml.children)\n if (encoded) return createRichParagraph(xml, encoded, scope)\n }\n if (!root && packable(xml)) return createPacked(xml, scope)\n const map = new Y.Map<unknown>()\n fieldsOf(map, xml)\n const inner = withBindings(scope, xml.bindings)\n const children = new Y.Array<LiveChild>()\n children.push(xml.children.map((c) => (typeof c === 'string' ? newText(c) : xmlToLive(c, inner))))\n map.set('children', children)\n return map\n}\n\n/** Read an element back as plain data. */\nexport function liveToXml(map: LiveElement): XmlEl {\n if (isPackedElement(map)) return unpack(map.get(PACKED) as string, scopeOf(map))\n const prefix = map.get('prefix') as string | undefined\n const stored = (map.get('children') as Y.Array<LiveChild>)\n .toArray()\n .map((child) => (child instanceof Y.Text ? child.toString() : liveToXml(child)))\n const children: (XmlEl | string)[] = isRichParagraph(map)\n ? [...stored, ...decodeInline(readUnits(map.get('inline') as Y.Text))]\n : stored\n const xml: XmlEl = {\n ns: map.get('ns') as string,\n local: map.get('local') as string,\n attrs: (map.get('attrs') as Y.Array<XmlAttr>).toArray().map((a) => ({ ...a })),\n bindings: (map.get('bindings') as Y.Array<XmlBinding>).toArray().map((b) => ({ ...b })),\n children,\n }\n if (prefix !== undefined) xml.prefix = prefix\n return xml\n}\n\n// ── XML text ───────────────────────────────────────────────────────────────\n\nconst escapeText = (value: string): string =>\n value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n\nexport const escapeAttr = (value: string): string =>\n value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/\\t/g, '	')\n .replace(/\\n/g, ' ')\n .replace(/\\r/g, ' ')\n\nconst qualified = (prefix: string | undefined, local: string): string =>\n prefix ? `${prefix}:${local}` : local\n\n/** Prefixes in scope for an element; innermost binding wins. */\nexport type Scope = ReadonlyMap<string, string>\n\n/** An element's start tag without its closing `>`, and the scope inside it. */\nfunction startTag(\n prefix: string | undefined,\n local: string,\n bindings: readonly XmlBinding[],\n attrs: readonly XmlAttr[],\n scope: Scope\n): [string, Scope] {\n const inScope = withBindings(scope, bindings)\n let out = `<${qualified(prefix, local)}`\n for (const b of bindings) {\n out +=\n b.prefix === '' ? ` xmlns=\"${escapeAttr(b.ns)}\"` : ` xmlns:${b.prefix}=\"${escapeAttr(b.ns)}\"`\n }\n for (const a of attrs) {\n let p = a.prefix\n if (a.ns !== '' && !p) {\n for (const [candidate, uri] of inScope) {\n if (candidate !== '' && uri === a.ns) {\n p = candidate\n break\n }\n }\n }\n out += ` ${qualified(p, a.local)}=\"${escapeAttr(a.value)}\"`\n }\n return [out, inScope]\n}\n\nexport function serializeXml(el: XmlEl, scope: Scope): string {\n const [out, inScope] = startTag(el.prefix, el.local, el.bindings, el.attrs, scope)\n if (el.children.length === 0) return `${out}/>`\n let body = ''\n for (const child of el.children) {\n body += typeof child === 'string' ? escapeText(child) : serializeXml(child, inScope)\n }\n return `${out}>${body}</${qualified(el.prefix, el.local)}>`\n}\n\n/** Serialise an element of the mirror. A packed element is its stored XML, never re-parsed. */\nexport function serializeLive(el: LiveElement, scope: Scope): string {\n if (isPackedElement(el)) return el.get(PACKED) as string\n const prefix = el.get('prefix') as string | undefined\n const local = el.get('local') as string\n const bindings = (el.get('bindings') as Y.Array<XmlBinding>).toArray()\n const attrs = (el.get('attrs') as Y.Array<XmlAttr>).toArray()\n const children = (el.get('children') as Y.Array<LiveChild>).toArray()\n const [out, inScope] = startTag(prefix, local, bindings, attrs, scope)\n\n const inline = isRichParagraph(el) ? decodeInline(readUnits(el.get('inline') as Y.Text)) : []\n if (children.length === 0 && inline.length === 0) return `${out}/>`\n let body = ''\n for (const child of children) {\n body += child instanceof Y.Text ? escapeText(child.toString()) : serializeLive(child, inScope)\n }\n for (const child of inline) body += serializeXml(child, inScope)\n return `${out}>${body}</${qualified(prefix, local)}>`\n}\n","/**\n * Yjs mirror of a canonical OOXML package.\n *\n * The mirror is deliberately generic: it stores XML (namespace, local name, prefix, attributes,\n * namespace bindings, children) and not core's typed node kinds. Materialising serialises the mirror\n * back to XML and lets core's own reader classify it, so the typed vocabulary never leaks into the\n * replicated state and a core upgrade cannot invalidate stored rooms.\n *\n * Layout of the Yjs document (all under the top level maps named below):\n *\n * meta Y.Map { format, mainDocumentPart }\n * parts Y.Map partName -> element\n * rels Y.Map ownerPart -> Y.Map(relId -> RelationshipJson), internal and external\n * alike; the `.rels` XML parts are regenerated from these, never mirrored\n * ctDefaults Y.Map extension -> mime\n * ctOverrides Y.Map case folded part name -> mime\n * binaries Y.Map partName -> Uint8Array (every non-XML part)\n *\n * element = Y.Map { ns, local, prefix?, attrs: Y.Array<AttrJson>, bindings: Y.Array<BindingJson>,\n * children: Y.Array<element | Y.Text> }\n * | Y.Map { ns, local, prefix?, attrs, bindings, children: head, inline: Y.Text } (rich paragraph)\n * | Y.Map { xml: string } (packed: an element with no editable text below it)\n * text = Y.Text (a text node is a Y.Text living in a children array)\n */\nimport * as Y from 'yjs'\nimport {\n readOoxmlPackage,\n readOoxmlPart,\n relsPartNameFor,\n validateExternalTarget,\n withContentTypeOverride,\n contentTypesPartBytes,\n writeOoxmlPackage,\n type OoxmlPackage,\n} from '@docx-editor.dev/core/store'\nimport { escapeAttr, serializeLive, xmlToLive, newText } from './mirror'\nimport type { XmlEl } from './rich'\nimport type { NodeRegistry } from './registry'\n\n/**\n * The room format this build writes. `arbi-docx/2` holds elements without editable text packed (see\n * mirror.ts); it reads `arbi-docx/1` rooms, whose elements are all trees, unchanged. A build that\n * only knows `/1` cannot read a packed element, so the client handshake requires this exact format.\n */\nexport const COLLAB_FORMAT = 'arbi-docx/2'\n\n/** Room formats this build reads. */\nconst READABLE_FORMATS: ReadonlySet<string> = new Set(['arbi-docx/1', COLLAB_FORMAT])\n\nexport function isReadableFormat(format: string | undefined): boolean {\n return format !== undefined && READABLE_FORMATS.has(format)\n}\n\nexport interface AttrJson {\n ns: string\n local: string\n prefix?: string\n value: string\n}\n\nexport interface BindingJson {\n prefix: string\n ns: string\n}\n\nexport interface RelationshipJson {\n ownerPart: string\n id: string\n type: string\n rawTarget: string\n targetMode: string\n order: number\n}\n\n/** Structural view of core's canonical node; only the fields the mirror carries. */\ninterface CanonicalElement {\n readonly kind: string\n readonly namespaceUri: string\n readonly localName: string\n readonly prefix?: string\n readonly namespaceBindings: readonly { prefix: string; namespaceUri: string }[]\n readonly attributes: readonly {\n namespaceUri: string\n localName: string\n prefix?: string\n value: string\n }[]\n readonly children: readonly (CanonicalElement | CanonicalText)[]\n}\n\ninterface CanonicalText {\n readonly kind: 'textValue'\n readonly value: string\n}\n\nfunction isText(node: CanonicalElement | CanonicalText): node is CanonicalText {\n return node.kind === 'textValue'\n}\n\nfunction canonicalToXml(node: CanonicalElement | CanonicalText): XmlEl | string {\n if (isText(node)) return node.value\n const xml: XmlEl = {\n ns: node.namespaceUri,\n local: node.localName,\n attrs: node.attributes.map((a) => {\n const json: AttrJson = { ns: a.namespaceUri, local: a.localName, value: a.value }\n if (a.prefix !== undefined) json.prefix = a.prefix\n return json\n }),\n bindings: node.namespaceBindings.map((b) => ({ prefix: b.prefix, ns: b.namespaceUri })),\n children: node.children.map(canonicalToXml),\n }\n if (node.prefix !== undefined) xml.prefix = node.prefix\n return xml\n}\n\n/** The Yjs form of a part's root element. */\nexport function encodeElement(el: CanonicalElement): Y.Map<unknown> {\n return xmlToLive(canonicalToXml(el) as XmlEl, new Map(), true)\n}\n\nexport function encodeText(value: string): Y.Text {\n return newText(value)\n}\n\n/** Seed an empty Yjs document from a loaded package. Call once, inside a transaction. */\nexport function bootstrap(doc: Y.Doc, pkg: OoxmlPackage): void {\n doc.transact(() => {\n const meta = doc.getMap('meta')\n meta.set('format', COLLAB_FORMAT)\n meta.set('mainDocumentPart', pkg.mainDocumentPart)\n\n const parts = doc.getMap<Y.Map<unknown>>('parts')\n for (const [name, part] of pkg.parts) {\n if (isRelsPart(name)) continue\n parts.set(name, encodeElement(part.root as unknown as CanonicalElement))\n }\n\n const binaries = doc.getMap<Uint8Array>('binaries')\n for (const [name, bytes] of pkg.partBytes) {\n if (!pkg.parts.has(name)) binaries.set(name, bytes)\n }\n\n const rels = doc.getMap<Y.Map<RelationshipJson>>('rels')\n for (const [owner, records] of pkg.relationships) {\n const byId = new Y.Map<RelationshipJson>()\n for (const r of records) {\n byId.set(r.id, {\n ownerPart: r.ownerPart,\n id: r.id,\n type: r.type,\n rawTarget: r.rawTarget,\n targetMode: r.targetMode as string,\n order: r.order,\n })\n }\n rels.set(owner, byId)\n }\n\n for (const e of pkg.externalTargets) {\n let byId = rels.get(e.ownerPart)\n if (!byId) {\n byId = new Y.Map<RelationshipJson>()\n rels.set(e.ownerPart, byId)\n }\n byId.set(e.id, {\n ownerPart: e.ownerPart,\n id: e.id,\n type: e.type,\n rawTarget: e.rawTarget,\n targetMode: 'External',\n order: byId.size,\n })\n }\n\n const ctDefaults = doc.getMap<string>('ctDefaults')\n for (const [ext, mime] of pkg.contentTypes.defaults) ctDefaults.set(ext, mime)\n const ctOverrides = doc.getMap<string>('ctOverrides')\n for (const [name, mime] of pkg.contentTypes.overrides) ctOverrides.set(name, mime)\n })\n}\n\nexport function isBootstrapped(doc: Y.Doc): boolean {\n return doc.getMap('meta').get('format') !== undefined\n}\n\nexport function readFormat(doc: Y.Doc): string | undefined {\n const format = doc.getMap('meta').get('format')\n return typeof format === 'string' ? format : undefined\n}\n\n// ── XML serialisation of the mirror ────────────────────────────────────────\n\nexport function serializePart(doc: Y.Doc, partName: string): string {\n const root = doc.getMap<Y.Map<unknown>>('parts').get(partName)\n if (!root) throw new Error(`collab: part ${partName} is not in the room`)\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n${serializeLive(root, new Map())}`\n}\n\n/** Override first, then the extension default, as the package's content type index resolves it. */\nexport function contentTypeOf(doc: Y.Doc, partName: string): string | undefined {\n const override = doc.getMap<string>('ctOverrides').get(partName.toLowerCase())\n if (override !== undefined) return override\n const dot = partName.lastIndexOf('.')\n if (dot < 0) return undefined\n return doc.getMap<string>('ctDefaults').get(partName.slice(dot + 1).toLowerCase())\n}\n\n/**\n * Register mirrored nodes under their positional ids. Run after bootstrap and after a remote apply.\n * Pass `only` to refresh just the parts that changed.\n */\nexport function registerMirror(\n doc: Y.Doc,\n registry: NodeRegistry,\n only?: ReadonlySet<string>\n): void {\n const parts = doc.getMap<Y.Map<unknown>>('parts')\n if (!only) {\n registry.clear()\n for (const [name, root] of parts) registry.registerTree(name, root)\n return\n }\n for (const name of only) {\n registry.dropPart(name)\n const root = parts.get(name)\n if (root) registry.registerTree(name, root)\n }\n}\n\n/**\n * Remembers each part's last materialised tree and which parts changed since, so a remote edit\n * re-reads only the part it touched. Unchanged parts keep the identical frozen object, which also\n * lets the local store reuse everything it already derived from them.\n */\nexport class MaterializeCache {\n readonly parts = new Map<\n string,\n OoxmlPackage['parts'] extends ReadonlyMap<string, infer P> ? P : never\n >()\n private dirty = new Set<string>()\n private everything = true\n private readonly stop: (() => void)[] = []\n\n constructor(doc: Y.Doc) {\n const parts = doc.getMap<Y.Map<unknown>>('parts')\n const onParts = (events: Y.YEvent<Y.AbstractType<unknown>>[]): void => {\n for (const event of events) {\n if (event.target === parts) {\n for (const key of (event as Y.YMapEvent<unknown>).keysChanged) this.dirty.add(key)\n } else if (typeof event.path[0] === 'string') this.dirty.add(event.path[0])\n }\n }\n parts.observeDeep(onParts)\n this.stop.push(() => parts.unobserveDeep(onParts))\n // A content type change can change how every part reads.\n for (const name of ['ctOverrides', 'ctDefaults']) {\n const map = doc.getMap(name)\n const onTypes = (): void => {\n this.everything = true\n }\n map.observe(onTypes)\n this.stop.push(() => map.unobserve(onTypes))\n }\n }\n\n /** Names to re-read, or null when everything must be. Clears the pending set. */\n take(): ReadonlySet<string> | null {\n const names = this.everything ? null : this.dirty\n this.dirty = new Set()\n this.everything = false\n return names\n }\n\n /** Mark parts changed again, for a materialisation that did not complete. */\n restore(names: ReadonlySet<string> | null): void {\n if (names === null) this.everything = true\n else for (const name of names) this.dirty.add(name)\n }\n\n destroy(): void {\n for (const stop of this.stop.splice(0)) stop()\n }\n}\n\nconst RELS_CONTENT_TYPE = 'application/vnd.openxmlformats-package.relationships+xml'\nconst RELS_NAMESPACE = 'http://schemas.openxmlformats.org/package/2006/relationships'\n\ninterface ExternalTargetRecord {\n ownerPart: string\n id: string\n type: string\n rawTarget: string\n sinkSafe: boolean\n}\n\nfunction isRelsPart(partName: string): boolean {\n return partName.endsWith('.rels')\n}\n\nfunction relationshipsXml(records: readonly RelationshipJson[]): string {\n const rows = records\n .map(\n (r) =>\n `<Relationship Id=\"${escapeAttr(r.id)}\" Type=\"${escapeAttr(r.type)}\" Target=\"${escapeAttr(r.rawTarget)}\"` +\n `${r.targetMode === 'External' ? ' TargetMode=\"External\"' : ''}/>`\n )\n .join('')\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"${RELS_NAMESPACE}\">${rows}</Relationships>`\n}\n\n// ── Materialisation ────────────────────────────────────────────────────────\n\nexport class MaterializeError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MaterializeError'\n }\n}\n\n/** Build a frozen canonical package from the mirror. Throws MaterializeError on a corrupt room. */\nexport function materialize(\n doc: Y.Doc,\n cache?: MaterializeCache,\n changed: ReadonlySet<string> | null = null\n): OoxmlPackage {\n const meta = doc.getMap('meta')\n const main = meta.get('mainDocumentPart')\n if (typeof main !== 'string') throw new MaterializeError('room has no main document part')\n\n const parts = new Map<\n string,\n OoxmlPackage['parts'] extends ReadonlyMap<string, infer P> ? P : never\n >()\n for (const name of doc.getMap('parts').keys()) {\n if (isRelsPart(name)) continue\n const reusable = cache && changed && !changed.has(name) ? cache.parts.get(name) : undefined\n if (reusable) {\n parts.set(name, reusable)\n continue\n }\n const contentType = contentTypeOf(doc, name)\n if (contentType === undefined) throw new MaterializeError(`part ${name} has no content type`)\n const read = readOoxmlPart(serializePart(doc, name), { name, contentType })\n if (!read.ok) throw new MaterializeError(`part ${name} is not readable: ${read.reason}`)\n parts.set(name, read.part)\n }\n if (cache) {\n cache.parts.clear()\n for (const [name, part] of parts) if (!isRelsPart(name)) cache.parts.set(name, part)\n }\n\n const partBytes = new Map<string, Uint8Array>()\n for (const [name, bytes] of doc.getMap<Uint8Array>('binaries')) partBytes.set(name, bytes)\n\n // Relationship records are the authority; the `.rels` XML parts are rebuilt from them.\n const relationships = new Map<string, readonly RelationshipJson[]>()\n const externalTargets: ExternalTargetRecord[] = []\n for (const [owner, byId] of doc.getMap<Y.Map<RelationshipJson>>('rels')) {\n // Ties on `order` are broken by id so every peer writes the same bytes.\n const records = [...byId.values()].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id))\n if (records.length === 0) continue\n const internal = records.filter((r) => r.targetMode !== 'External')\n if (internal.length > 0) relationships.set(owner, internal)\n for (const r of records) {\n if (r.targetMode !== 'External') continue\n externalTargets.push({\n ownerPart: r.ownerPart,\n id: r.id,\n type: r.type,\n rawTarget: r.rawTarget,\n sinkSafe: validateExternalTarget(r.rawTarget).ok,\n })\n }\n const relsName = relsPartNameFor(owner)\n const read = readOoxmlPart(relationshipsXml(records), {\n name: relsName,\n contentType: RELS_CONTENT_TYPE,\n })\n if (!read.ok)\n throw new MaterializeError(`relationships of ${owner} are not valid: ${read.reason}`)\n parts.set(relsName, read.part)\n }\n\n const contentTypes = {\n defaults: new Map(doc.getMap<string>('ctDefaults')),\n overrides: new Map(doc.getMap<string>('ctOverrides')),\n }\n\n return withMirroredOverrides({\n parts,\n partBytes,\n relationships,\n externalTargets,\n contentTypes,\n mainDocumentPart: main,\n } as unknown as OoxmlPackage)\n}\n\n/** Media a document embeds, by extension: what a picture part is when nothing declares it. */\nconst MEDIA_TYPES: Readonly<Record<string, string>> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n bmp: 'image/bmp',\n tif: 'image/tiff',\n tiff: 'image/tiff',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n emf: 'image/x-emf',\n wmf: 'image/x-wmf',\n}\n\n/**\n * Bring the `[Content_Types].xml` bytes in line with the mirrored overrides.\n *\n * The overrides are the authority, but the package also carries the content-types part itself as\n * bytes, which is what the writer emits. Core journals a new part's override (Insert footnote on a\n * document without notes creates `/word/footnotes.xml`) without re-journalling those bytes, so a\n * room would otherwise export the new part under the generic `application/xml` default — and Word\n * ignores a footnotes part it cannot recognise.\n *\n * An inserted picture is journalled as its bytes and relationship only: neither its override nor\n * the content-types bytes. A media part that nothing declares is given its type by extension, or\n * Word reports the whole file as unreadable.\n */\nfunction withMirroredOverrides(pkg: OoxmlPackage): OoxmlPackage {\n const bytes = contentTypesPartBytes(pkg)\n if (!bytes) return pkg\n const xml = new TextDecoder().decode(bytes.bytes)\n const declared = new Set(\n [...xml.matchAll(/PartName\\s*=\\s*[\"']([^\"']+)[\"']/gi)].map((m) => m[1].toLowerCase())\n )\n const defaults = new Set(\n [...xml.matchAll(/Extension\\s*=\\s*[\"']([^\"']+)[\"']/gi)].map((m) => m[1].toLowerCase())\n )\n let next = pkg\n for (const name of [...pkg.parts.keys(), ...pkg.partBytes.keys()]) {\n const key = name.toLowerCase()\n if (declared.has(key) || key === bytes.storageKey.toLowerCase()) continue\n const extension = key.slice(key.lastIndexOf('.') + 1)\n const type =\n pkg.contentTypes.overrides.get(key) ??\n (defaults.has(extension) ? undefined : MEDIA_TYPES[extension])\n if (type) {\n next = withContentTypeOverride(next, name, type, { forceOverride: true })\n declared.add(key)\n }\n }\n return next\n}\n\n/** Serialise the room as DOCX bytes. */\nexport function materializeBytes(doc: Y.Doc): Uint8Array {\n return writeOoxmlPackage(materialize(doc))\n}\n\n/** Load DOCX bytes and seed an empty room from them. */\nexport function bootstrapFromBytes(doc: Y.Doc, bytes: Uint8Array): OoxmlPackage {\n const result = readOoxmlPackage(bytes)\n if (!result.ok) throw new MaterializeError(`not a readable DOCX: ${result.reason}`)\n bootstrap(doc, result.package)\n return result.package\n}\n","/**\n * Identity registry between core's logical node ids and the Yjs mirror.\n *\n * A journal addresses nodes by logical id: an original node keeps its positional id from the moment\n * the package was opened, a node minted later gets `#new:N`. Ids never shift when siblings are\n * inserted or removed, so the registry maps an id to a live Yjs type by reference, and a remote edit\n * that moves positions cannot invalidate it.\n *\n * A Yjs type cannot be read before it is integrated and cannot be integrated twice. Nodes that are\n * under construction, detached, or about to move are therefore held as plain objects and converted\n * to Yjs types when they are attached to a live parent. `snapshot` is the live to plain direction.\n *\n * Rich paragraphs (see rich.ts) hold their runs as attributes on one Y.Text, and packed elements\n * (see mirror.ts) hold their subtree as one XML string, so their inner nodes have no Yjs type of\n * their own. The first effect that touches one opens it: it is read into a plain tree, the journal's\n * effects change that tree, and `flushRich` writes the result back (a minimal edit of the text, or\n * the packed element's new XML). The tree stays open, mirroring the editor's own, until a remote\n * change re-reads it.\n */\nimport * as Y from 'yjs'\nimport type { AttrJson, BindingJson } from './encoding'\nimport {\n createRichParagraph,\n isCompact,\n isPackedElement,\n isParagraphEl,\n liveToXml,\n packable,\n repack,\n scopeOf,\n scopeWithin,\n serializeLive,\n serializeXml,\n withBindings,\n xmlToLive,\n type Scope,\n} from './mirror'\nimport { applyUnits, encodeParagraph, newRunId, readUnits, WML, type XmlEl } from './rich'\n\nexport interface PlainElement {\n type: 'element'\n id: string\n ns: string\n local: string\n prefix?: string\n attrs: AttrJson[]\n bindings: BindingJson[]\n children: PlainNode[]\n /** Identity of a run or wrapper inside a rich paragraph. */\n rid?: string\n}\n\ninterface PlainText {\n type: 'text'\n id: string\n value: string\n}\n\nexport type PlainNode = PlainElement | PlainText\n\nexport type LiveNode = Y.Map<unknown> | Y.Text\n\nexport type RegistryEntry = { live: LiveNode } | { plain: PlainNode }\n\nexport class RegistryError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'RegistryError'\n }\n}\n\nexport function childrenOf(el: Y.Map<unknown>): Y.Array<LiveNode> {\n return el.get('children') as Y.Array<LiveNode>\n}\n\nexport function attrsOf(el: Y.Map<unknown>): Y.Array<AttrJson> {\n return el.get('attrs') as Y.Array<AttrJson>\n}\n\nexport function bindingsOf(el: Y.Map<unknown>): Y.Array<BindingJson> {\n return el.get('bindings') as Y.Array<BindingJson>\n}\n\n/** Elements that need an identity so neighbours with equal properties stay separate in a rich paragraph. */\nconst IDENTIFIED = new Set([\n 'r',\n 'ins',\n 'del',\n 'moveFrom',\n 'moveTo',\n 'hyperlink',\n 'smartTag',\n 'fldSimple',\n 'customXml',\n 'dir',\n 'bdo',\n 'sdt',\n 'sdtContent',\n])\n\nfunction plainToXml(node: PlainNode): XmlEl | string {\n if (node.type === 'text') return node.value\n const xml: XmlEl = {\n ns: node.ns,\n local: node.local,\n attrs: node.attrs.map((a) => ({ ...a })),\n bindings: node.bindings.map((b) => ({ ...b })),\n children: node.children.map(plainToXml),\n }\n if (node.prefix !== undefined) xml.prefix = node.prefix\n if (node.ns === WML && IDENTIFIED.has(node.local)) {\n node.rid ??= newRunId()\n xml._id = node.rid\n }\n return xml\n}\n\nfunction xmlToPlain(xml: XmlEl | string, id: string): PlainNode {\n if (typeof xml === 'string') return { type: 'text', id, value: xml }\n const plain: PlainElement = {\n type: 'element',\n id,\n ns: xml.ns,\n local: xml.local,\n attrs: xml.attrs.map((a) => ({ ...a })),\n bindings: xml.bindings.map((b) => ({ ...b })),\n children: xml.children.map((child, index) => xmlToPlain(child, `${id}.${index}`)),\n }\n if (xml.prefix !== undefined) plain.prefix = xml.prefix\n if (xml._id !== undefined) plain.rid = xml._id\n return plain\n}\n\ninterface OpenParagraph {\n live: Y.Map<unknown>\n root: PlainElement\n id: string\n}\n\nconst partOf = (id: string): string => id.slice(0, id.indexOf('#'))\n\nexport class NodeRegistry {\n private readonly entries = new Map<string, RegistryEntry>()\n /** Ids per part (the text before `#`), so one part can be dropped without scanning the rest. */\n private readonly byPart = new Map<string, Set<string>>()\n private readonly liveIds = new WeakMap<LiveNode, string>()\n private readonly open = new Map<Y.Map<unknown>, OpenParagraph>()\n private readonly ownerOf = new WeakMap<PlainNode, Y.Map<unknown>>()\n private readonly dirty = new Set<Y.Map<unknown>>()\n\n clear(): void {\n this.entries.clear()\n this.byPart.clear()\n this.open.clear()\n this.dirty.clear()\n }\n\n /** Forget every node of one part, live or detached. */\n dropPart(partName: string): void {\n for (const id of this.byPart.get(partName) ?? []) this.entries.delete(id)\n this.byPart.delete(partName)\n for (const [live, record] of this.open) {\n if (partOf(record.id) !== partName) continue\n this.open.delete(live)\n this.dirty.delete(live)\n }\n }\n\n private index(id: string): void {\n const part = partOf(id)\n let ids = this.byPart.get(part)\n if (!ids) this.byPart.set(part, (ids = new Set()))\n ids.add(id)\n }\n\n get(id: string): RegistryEntry | undefined {\n return this.entries.get(id)\n }\n\n /** Whether the id names a node, one inside a paragraph that is not open yet included. */\n has(id: string): boolean {\n return (this.entries.get(id) ?? this.resolveInsideParagraph(id)) !== undefined\n }\n\n require(id: string): RegistryEntry {\n let entry = this.entries.get(id) ?? this.resolveInsideParagraph(id)\n if (!entry) throw new RegistryError(`journal names unknown node ${id}`)\n if ('live' in entry && entry.live instanceof Y.Map && isCompact(entry.live)) {\n this.openParagraph(entry.live)\n entry = this.entries.get(id) as RegistryEntry\n }\n if ('plain' in entry) {\n const owner = this.ownerOf.get(entry.plain)\n if (owner) this.dirty.add(owner)\n }\n return entry\n }\n\n /** An id inside a paragraph that is not open yet: open the paragraph it belongs to. */\n private resolveInsideParagraph(id: string): RegistryEntry | undefined {\n const hash = id.indexOf('#')\n if (hash < 0 || id.startsWith('new:', hash + 1)) return undefined\n const path = id.slice(hash + 1).split('.')\n for (let length = path.length - 1; length >= 1; length--) {\n const ancestor = this.entries.get(id.slice(0, hash + 1) + path.slice(0, length).join('.'))\n if (!ancestor) continue\n if ('live' in ancestor && ancestor.live instanceof Y.Map && isCompact(ancestor.live)) {\n this.openParagraph(ancestor.live)\n return this.entries.get(id)\n }\n return undefined\n }\n return undefined\n }\n\n idOf(node: LiveNode): string | undefined {\n return this.liveIds.get(node)\n }\n\n isCurrentLive(id: string, node: LiveNode): boolean {\n const entry = this.entries.get(id)\n return entry !== undefined && 'live' in entry && entry.live === node\n }\n\n registerLive(id: string, node: LiveNode): void {\n this.entries.set(id, { live: node })\n this.liveIds.set(node, id)\n this.index(id)\n }\n\n registerPlain(node: PlainNode, keepNewer = false): void {\n // A journal may mint a node under the id of one that is being replaced. Opening a paragraph in the\n // middle of that journal must not put the replaced node back.\n const existing = this.entries.get(node.id)\n if (!(keepNewer && existing && 'plain' in existing)) {\n this.entries.set(node.id, { plain: node })\n this.index(node.id)\n }\n if (node.type === 'element')\n for (const child of node.children) this.registerPlain(child, keepNewer)\n }\n\n /**\n * Walk a mirror root and register every node under its positional id, `${part}#0` for the root and\n * `${parent}.${index}` below it. This is the id scheme core assigns when it reads a part. A rich\n * paragraph or a packed element is registered as one node; its inner nodes appear when it is opened.\n */\n registerTree(partName: string, root: Y.Map<unknown>): void {\n const walk = (node: LiveNode, id: string): void => {\n this.registerLive(id, node)\n if (node instanceof Y.Text) return\n if (isCompact(node)) return\n childrenOf(node).forEach((child, index) => walk(child, `${id}.${index}`))\n }\n walk(root, `${partName}#0`)\n }\n\n // ── Rich paragraphs ──────────────────────────────────────────────────────\n\n private own(node: PlainNode, live: Y.Map<unknown> | undefined): void {\n if (live) this.ownerOf.set(node, live)\n else this.ownerOf.delete(node)\n if (node.type === 'element') for (const child of node.children) this.own(child, live)\n }\n\n private openParagraph(live: Y.Map<unknown>): OpenParagraph {\n const existing = this.open.get(live)\n if (existing) return existing\n const id = this.liveIds.get(live)\n if (id === undefined) throw new RegistryError('paragraph has no registered id')\n const root = xmlToPlain(liveToXml(live), id) as PlainElement\n const record: OpenParagraph = { live, root, id }\n this.open.set(live, record)\n this.registerPlain(root, true)\n this.own(root, live)\n return record\n }\n\n /** The Yjs paragraph an open plain root stands for. */\n liveOfRoot(node: PlainNode): Y.Map<unknown> | undefined {\n const live = this.ownerOf.get(node)\n return live && this.open.get(live)?.root === node ? live : undefined\n }\n\n /** Parent and index of a node inside an open paragraph. */\n locatePlain(node: PlainNode): { parent: PlainElement; index: number } | undefined {\n const live = this.ownerOf.get(node)\n const record = live && this.open.get(live)\n if (!record) return undefined\n const search = (parent: PlainElement): { parent: PlainElement; index: number } | undefined => {\n const index = parent.children.indexOf(node)\n if (index >= 0) return { parent, index }\n for (const child of parent.children) {\n if (child.type === 'element') {\n const found = search(child)\n if (found) return found\n }\n }\n return undefined\n }\n return search(record.root)\n }\n\n /** Mark the paragraph a plain node belongs to as changed. */\n touch(node: PlainNode): void {\n const owner = this.ownerOf.get(node)\n if (owner) this.dirty.add(owner)\n }\n\n /** Nodes just placed under `parent` belong to the same paragraph as it, if any. */\n adopt(parent: PlainElement, children: readonly PlainNode[]): void {\n const owner = this.ownerOf.get(parent)\n for (const child of children) this.own(child, owner)\n if (owner) this.dirty.add(owner)\n }\n\n /** Write every changed open paragraph or packed element back into the mirror. Call at the end of a journal. */\n flushRich(): void {\n for (const live of [...this.dirty]) {\n this.dirty.delete(live)\n const record = this.open.get(live)\n if (record) this.writeBack(record)\n }\n }\n\n private writeBack(record: OpenParagraph): void {\n const { live, root } = record\n const xml = plainToXml(root) as XmlEl\n if (isPackedElement(live)) {\n // Gained a paragraph or run text: from now on it is a tree, so that text merges as usual.\n if (packable(xml)) repack(live, xml)\n else this.degrade(record)\n return\n }\n const encoded = encodeParagraph(xml.children)\n if (!encoded) {\n this.degrade(record)\n return\n }\n const attrs = attrsOf(live)\n if (JSON.stringify(attrs.toArray()) !== JSON.stringify(xml.attrs)) {\n attrs.delete(0, attrs.length)\n attrs.push(xml.attrs.map((a) => ({ ...a })))\n }\n const bindings = bindingsOf(live)\n if (JSON.stringify(bindings.toArray()) !== JSON.stringify(xml.bindings)) {\n bindings.delete(0, bindings.length)\n bindings.push(xml.bindings.map((b) => ({ ...b })))\n }\n const head = childrenOf(live)\n // Compared as XML: a packed property element reads back with prefixes resolved.\n const scope = scopeWithin(live)\n const stored = head\n .toArray()\n .map((child) => serializeLive(child as Y.Map<unknown>, scope))\n .join('')\n if (stored !== encoded.head.map((el) => serializeXml(el, scope)).join('')) {\n head.delete(0, head.length)\n head.push(encoded.head.map((el) => xmlToLive(el, scope)))\n }\n const inline = live.get('inline') as Y.Text\n applyUnits(inline, readUnits(inline), encoded.units)\n }\n\n /** The paragraph can no longer be held as rich text, or the element packed: store it as a tree. */\n private degrade(record: OpenParagraph): void {\n const parent = record.live.parent\n if (!(parent instanceof Y.Array))\n throw new RegistryError('a paragraph outside a parent cannot change form')\n const index = (parent as Y.Array<LiveNode>).toArray().indexOf(record.live)\n const generic = this.toGenericLive(record.root, scopeOf(record.live))\n this.open.delete(record.live)\n ;(parent as Y.Array<LiveNode>).delete(index, 1)\n ;(parent as Y.Array<LiveNode>).insert(index, [generic])\n }\n\n // ── Snapshots and conversion ─────────────────────────────────────────────\n\n /** Deep copy of a node into plain objects carrying the same ids. */\n snapshot(id: string): PlainNode {\n const entry = this.require(id)\n if ('plain' in entry) return entry.plain\n return this.snapshotLive(entry.live)\n }\n\n private snapshotLive(node: LiveNode): PlainNode {\n const id = this.liveIds.get(node)\n if (id === undefined) throw new RegistryError('live node has no registered id')\n if (node instanceof Y.Text) return { type: 'text', id, value: node.toString() }\n if (isCompact(node)) {\n return this.open.get(node)?.root ?? xmlToPlain(liveToXml(node), id)\n }\n const prefix = node.get('prefix') as string | undefined\n const plain: PlainElement = {\n type: 'element',\n id,\n ns: node.get('ns') as string,\n local: node.get('local') as string,\n attrs: attrsOf(node)\n .toArray()\n .map((a) => ({ ...a })),\n bindings: bindingsOf(node)\n .toArray()\n .map((b) => ({ ...b })),\n children: childrenOf(node).map((child) => this.snapshotLive(child)),\n }\n if (prefix !== undefined) plain.prefix = prefix\n return plain\n }\n\n /**\n * Replace the registry entries of a subtree with plain copies, if they still point at these exact\n * live nodes. A node that was already re-registered elsewhere (moved) is left alone.\n */\n detach(node: LiveNode): void {\n this.detachInto(node, this.snapshotLive(node))\n }\n\n private detachInto(node: LiveNode, plain: PlainNode): void {\n const id = this.liveIds.get(node)\n if (id !== undefined && this.isCurrentLive(id, node)) {\n this.entries.set(id, { plain })\n }\n if (node instanceof Y.Text || plain.type === 'text') return\n if (isCompact(node)) {\n // The paragraph or packed element is going away; its open tree, if any, is detached with it.\n this.open.delete(node)\n this.dirty.delete(node)\n return\n }\n const liveChildren = childrenOf(node).toArray()\n liveChildren.forEach((child, index) => this.detachInto(child, plain.children[index]))\n }\n\n /**\n * Build Yjs types for a plain subtree placed where `scope` is in force, and register every node as\n * live. A rich paragraph or packed element stays open on the plain tree, which is already current.\n * A part's `root` is never packed.\n */\n toLive(plain: PlainNode, scope: Scope = new Map(), root = false): LiveNode {\n if (plain.type === 'text') {\n const text = new Y.Text()\n text.insert(0, plain.value)\n this.registerLive(plain.id, text)\n return text\n }\n const xml = plainToXml(plain) as XmlEl\n let map: Y.Map<unknown> | undefined\n if (isParagraphEl(plain)) {\n const encoded = encodeParagraph(xml.children)\n if (encoded) map = createRichParagraph(xml, encoded, scope)\n }\n if (!map && !root && packable(xml)) map = xmlToLive(xml, scope)\n if (map) {\n this.liveIds.set(map, plain.id)\n this.registerPlain(plain)\n this.own(plain, map)\n this.open.set(map, { live: map, root: plain, id: plain.id })\n return map\n }\n return this.toGenericLive(plain, scope)\n }\n\n private toGenericLive(plain: PlainElement, scope: Scope): Y.Map<unknown> {\n const map = xmlToGenericShell(plain)\n const inner = withBindings(scope, plain.bindings)\n const children = new Y.Array<LiveNode>()\n children.push(plain.children.map((child) => this.toLive(child, inner)))\n map.set('children', children)\n this.registerLive(plain.id, map)\n return map\n }\n\n /**\n * A live node that can be inserted into a parent (`scope` is in force there), or a part's `root`.\n * Anything not yet attached is built fresh; an attached node is copied, because a Yjs type cannot\n * have two parents.\n */\n attachable(id: string, scope: Scope = new Map(), root = false): LiveNode {\n return this.toLive(this.snapshot(id), scope, root)\n }\n}\n\nfunction xmlToGenericShell(plain: PlainElement): Y.Map<unknown> {\n const map = new Y.Map<unknown>()\n map.set('ns', plain.ns)\n map.set('local', plain.local)\n if (plain.prefix !== undefined) map.set('prefix', plain.prefix)\n const attrs = new Y.Array<AttrJson>()\n attrs.push(plain.attrs.map((a) => ({ ...a })))\n map.set('attrs', attrs)\n const bindings = new Y.Array<BindingJson>()\n bindings.push(plain.bindings.map((b) => ({ ...b })))\n map.set('bindings', bindings)\n return map\n}\n","/**\n * Apply core's canonical primitive journals to the Yjs mirror.\n *\n * One journal is one `TreePackageStore` transaction; its effects are applied in order inside one Yjs\n * transaction so peers receive a transaction as a single update. Anything that cannot be applied\n * faithfully throws a `JournalError`; the session turns that into a failed state rather than letting\n * the mirror drift from the local tree.\n */\nimport * as Y from 'yjs'\nimport type {\n CanonicalAttributeName,\n CanonicalPrimitiveEffect,\n CanonicalPrimitiveJournal,\n} from '@docx-editor.dev/core/collaboration/replication'\nimport type { AttrJson, BindingJson, RelationshipJson } from './encoding'\nimport { isCompact, scopeWithin } from './mirror'\nimport {\n attrsOf,\n bindingsOf,\n childrenOf,\n NodeRegistry,\n RegistryError,\n type LiveNode,\n type PlainElement,\n type PlainNode,\n} from './registry'\n\nexport class JournalError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'JournalError'\n }\n}\n\nexport interface JournalContext {\n /** Bytes of one binary package part, by the storage key a `putBinary` effect names. */\n binary(storageKey: string): Uint8Array | null\n}\n\nfunction sameAttr(a: AttrJson, qname: CanonicalAttributeName): boolean {\n return a.ns === qname.namespaceUri && a.local === qname.localName\n}\n\nfunction attrJson(qname: CanonicalAttributeName, value: string): AttrJson {\n const json: AttrJson = { ns: qname.namespaceUri, local: qname.localName, value }\n if (qname.prefix !== undefined) json.prefix = qname.prefix\n return json\n}\n\nfunction setAttribute(\n registry: NodeRegistry,\n id: string,\n qname: CanonicalAttributeName,\n value: string | null\n): void {\n const entry = registry.require(id)\n if ('plain' in entry) {\n const el = asPlainElement(entry.plain, id)\n const index = el.attrs.findIndex((a) => sameAttr(a, qname))\n if (value === null) {\n if (index >= 0) el.attrs.splice(index, 1)\n } else if (index >= 0) {\n el.attrs[index] = attrJson(qname, value)\n } else {\n el.attrs.push(attrJson(qname, value))\n }\n return\n }\n const attrs = attrsOf(asLiveElement(entry.live, id))\n const index = attrs.toArray().findIndex((a) => sameAttr(a, qname))\n if (index >= 0) attrs.delete(index, 1)\n if (value !== null) {\n if (index >= 0) attrs.insert(index, [attrJson(qname, value)])\n else attrs.push([attrJson(qname, value)])\n }\n}\n\nfunction setNamespaceBinding(\n registry: NodeRegistry,\n id: string,\n prefix: string,\n uri: string | null\n): void {\n const entry = registry.require(id)\n const binding: BindingJson | null = uri === null ? null : { prefix, ns: uri }\n if ('plain' in entry) {\n const el = asPlainElement(entry.plain, id)\n const index = el.bindings.findIndex((b) => b.prefix === prefix)\n if (index >= 0) el.bindings.splice(index, 1)\n if (binding) {\n if (index >= 0) el.bindings.splice(index, 0, binding)\n else el.bindings.push(binding)\n }\n return\n }\n const bindings = bindingsOf(asLiveElement(entry.live, id))\n const index = bindings.toArray().findIndex((b) => b.prefix === prefix)\n if (index >= 0) bindings.delete(index, 1)\n if (binding) {\n if (index >= 0) bindings.insert(index, [binding])\n else bindings.push([binding])\n }\n}\n\nfunction asLiveElement(node: LiveNode, id: string): Y.Map<unknown> {\n if (node instanceof Y.Text) throw new JournalError(`${id} is a text node, not an element`)\n return node\n}\n\nfunction asPlainElement(node: PlainNode, id: string): PlainElement {\n if (node.type === 'text') throw new JournalError(`${id} is a text node, not an element`)\n return node\n}\n\nfunction spliceText(\n registry: NodeRegistry,\n id: string,\n start: number,\n deleteCount: number,\n insert: string\n): void {\n const entry = registry.require(id)\n if ('plain' in entry) {\n const text = entry.plain\n if (text.type !== 'text') throw new JournalError(`${id} is not a text node`)\n text.value = text.value.slice(0, start) + insert + text.value.slice(start + deleteCount)\n return\n }\n const text = entry.live\n if (!(text instanceof Y.Text)) throw new JournalError(`${id} is not a text node`)\n if (start < 0 || start + deleteCount > text.length) {\n throw new JournalError(`text splice out of range on ${id}`)\n }\n if (deleteCount > 0) text.delete(start, deleteCount)\n if (insert.length > 0) text.insert(start, insert)\n}\n\n/** Detach the nodes a splice is about to remove, while their content can still be read. */\nfunction detachRemoved(\n registry: NodeRegistry,\n parent: Y.Array<LiveNode>,\n start: number,\n count: number\n): void {\n for (let i = start; i < start + count; i++) registry.detach(parent.get(i))\n}\n\nfunction spliceChildren(\n registry: NodeRegistry,\n parentId: string,\n start: number,\n deleteCount: number,\n childIds: readonly string[]\n): void {\n const parentEntry = registry.require(parentId)\n if ('plain' in parentEntry) {\n const parent = asPlainElement(parentEntry.plain, parentId)\n if (start < 0 || start + deleteCount > parent.children.length) {\n throw new JournalError(`child splice out of range on ${parentId}`)\n }\n const inserted = childIds.map((id) => registry.snapshot(id))\n parent.children.splice(start, deleteCount, ...inserted)\n registry.adopt(parent, inserted)\n return\n }\n const parent = asLiveElement(parentEntry.live, parentId)\n const children = childrenOf(parent)\n if (start < 0 || start + deleteCount > children.length) {\n throw new JournalError(`child splice out of range on ${parentId}`)\n }\n detachRemoved(registry, children, start, deleteCount)\n const scope = scopeWithin(parent)\n const inserted = childIds.map((id) => registry.attachable(id, scope))\n if (deleteCount > 0) children.delete(start, deleteCount)\n if (inserted.length > 0) children.insert(start, inserted)\n}\n\n/** Position of a live node inside its parent's child list. */\nfunction locate(\n registry: NodeRegistry,\n id: string,\n node: LiveNode\n): { children: Y.Array<LiveNode>; index: number } {\n const children = node.parent\n if (!(children instanceof Y.Array)) throw new JournalError(`${id} is not attached`)\n const index = (children as Y.Array<LiveNode>).toArray().indexOf(node)\n if (index < 0) throw new JournalError(`${id} is not in its parent`)\n void registry\n return { children: children as Y.Array<LiveNode>, index }\n}\n\nfunction moveNode(\n registry: NodeRegistry,\n id: string,\n destinationId: string,\n destinationIndex: number\n): void {\n const entry = registry.require(id)\n const live = 'live' in entry ? entry.live : registry.liveOfRoot(entry.plain)\n const copy = registry.snapshot(id)\n\n if (live) {\n const { children: source, index } = locate(registry, id, live)\n registry.detach(live)\n source.delete(index, 1)\n } else {\n // A node inside a rich paragraph: take it out of its parent in the open tree.\n const plain = 'plain' in entry ? entry.plain : undefined\n const where = plain && registry.locatePlain(plain)\n if (!where) throw new JournalError(`cannot move detached node ${id}`)\n where.parent.children.splice(where.index, 1)\n registry.touch(where.parent)\n }\n\n const destinationEntry = registry.require(destinationId)\n if ('plain' in destinationEntry) {\n const destination = asPlainElement(destinationEntry.plain, destinationId)\n destination.children.splice(destinationIndex, 0, copy)\n registry.adopt(destination, [copy])\n return\n }\n const destination = asLiveElement(destinationEntry.live, destinationId)\n childrenOf(destination).insert(destinationIndex, [\n registry.toLive(copy, scopeWithin(destination)),\n ])\n}\n\n/**\n * A node that keeps its id but changes what it is: core diffs a node against its new version under\n * the same id and puts the new descriptor when its name changed (rejecting a deletion turns its\n * `w:delText` back into `w:t`), then diffs its attributes and children against the node as it was.\n * So the node is renamed where it stands, keeping its attributes and children. Answers false when\n * it cannot be renamed in place (a text node, a paragraph held as rich text).\n */\nfunction renameNode(registry: NodeRegistry, id: string, qname: CanonicalAttributeName): boolean {\n const entry = registry.require(id)\n if ('plain' in entry) {\n const el = entry.plain\n if (el.type !== 'element') return false\n el.ns = qname.namespaceUri\n el.local = qname.localName\n if (qname.prefix === undefined) delete el.prefix\n else el.prefix = qname.prefix\n registry.touch(el)\n return true\n }\n const live = entry.live\n if (live instanceof Y.Text || isCompact(live)) return false\n if (live.get('ns') !== qname.namespaceUri) live.set('ns', qname.namespaceUri)\n if (live.get('local') !== qname.localName) live.set('local', qname.localName)\n if (qname.prefix === undefined) {\n if (live.has('prefix')) live.delete('prefix')\n } else if (live.get('prefix') !== qname.prefix) live.set('prefix', qname.prefix)\n return true\n}\n\nfunction putNode(\n registry: NodeRegistry,\n effect: Extract<CanonicalPrimitiveEffect, { kind: 'putNode' }>\n): void {\n const d = effect.descriptor\n if (\n d.kind !== 'textValue' &&\n registry.has(d.logicalId) &&\n renameNode(registry, d.logicalId, d.qname)\n )\n return\n if (d.kind === 'textValue') {\n registry.registerPlain({ type: 'text', id: d.logicalId, value: '' })\n return\n }\n const element: PlainElement = {\n type: 'element',\n id: d.logicalId,\n ns: d.qname.namespaceUri,\n local: d.qname.localName,\n attrs: [],\n bindings: [],\n children: [],\n }\n if (d.qname.prefix !== undefined) element.prefix = d.qname.prefix\n registry.registerPlain(element)\n}\n\nfunction rootFor(registry: NodeRegistry, id: string): Y.Map<unknown> {\n const entry = registry.require(id)\n const live =\n 'live' in entry && entry.live.parent === null\n ? entry.live\n : registry.attachable(id, new Map(), true)\n return asLiveElement(live, id)\n}\n\nfunction applyEffect(\n doc: Y.Doc,\n registry: NodeRegistry,\n effect: CanonicalPrimitiveEffect,\n context: JournalContext\n): void {\n switch (effect.kind) {\n case 'putNode':\n putNode(registry, effect)\n return\n case 'spliceText':\n spliceText(registry, effect.logicalId, effect.utf16Start, effect.deleteCount, effect.insert)\n return\n case 'setAttribute':\n setAttribute(registry, effect.logicalId, effect.qname, effect.value)\n return\n case 'setNamespaceBinding':\n setNamespaceBinding(registry, effect.logicalId, effect.prefix, effect.uri)\n return\n case 'spliceChildren':\n spliceChildren(\n registry,\n effect.parentLogicalId,\n effect.start,\n effect.deleteCount,\n effect.childLogicalIds\n )\n return\n case 'moveNode':\n moveNode(\n registry,\n effect.logicalId,\n effect.destinationParentLogicalId,\n effect.destinationIndex\n )\n return\n case 'putXmlPart':\n doc.getMap<Y.Map<unknown>>('parts').set(effect.name, rootFor(registry, effect.rootLogicalId))\n return\n case 'deleteXmlPart':\n doc.getMap('parts').delete(effect.name)\n return\n case 'putRelationship': {\n const rels = doc.getMap<Y.Map<RelationshipJson>>('rels')\n let byId = rels.get(effect.owner)\n if (!byId) {\n byId = new Y.Map<RelationshipJson>()\n rels.set(effect.owner, byId)\n }\n byId.set(effect.record.id, { ...effect.record })\n return\n }\n case 'deleteRelationship':\n doc.getMap<Y.Map<RelationshipJson>>('rels').get(effect.owner)?.delete(effect.relationshipId)\n return\n case 'putContentTypeOverride':\n doc.getMap<string>('ctOverrides').set(effect.partName.toLowerCase(), effect.mediaType)\n return\n case 'deleteContentTypeOverride':\n doc.getMap('ctOverrides').delete(effect.partName.toLowerCase())\n return\n case 'putBinary': {\n const bytes = context.binary(effect.descriptor.storageKey)\n if (!bytes) throw new JournalError(`binary ${effect.descriptor.storageKey} is not available`)\n doc.getMap<Uint8Array>('binaries').set(effect.descriptor.storageKey, bytes)\n return\n }\n case 'deleteBinary':\n doc.getMap('binaries').delete(effect.storageKey)\n return\n }\n}\n\n/** Apply one journal inside a single Yjs transaction carrying `origin`. */\nexport function applyJournal(\n doc: Y.Doc,\n registry: NodeRegistry,\n journal: CanonicalPrimitiveJournal,\n origin: unknown,\n context: JournalContext\n): void {\n try {\n doc.transact(() => {\n for (const effect of journal.effects) applyEffect(doc, registry, effect, context)\n registry.flushRich()\n }, origin)\n } catch (error) {\n if (error instanceof JournalError || error instanceof RegistryError) throw error\n throw new JournalError(error instanceof Error ? error.message : String(error))\n }\n}\n","/**\n * Binds one Yjs room to one local document port, in both directions, without a network.\n *\n * Local: every journal the port settles is applied to the mirror inside a Yjs transaction tagged with\n * `LOCAL_ORIGIN`, so peers receive it as one update and the undo manager can scope to it.\n *\n * Remote: any transaction that did not originate here (a provider, or the undo manager) is\n * materialised into a frozen package and published through `port.applyRemotePackage`, after which\n * the identity registry is rebuilt, because the store re-derives positional ids from that package.\n *\n * Ordering rule: local journals must reach the mirror before a remote update is integrated, since\n * their child indices are relative to the tree as it was. `beforeRemote` flushes them; a transport\n * calls it ahead of applying inbound data.\n *\n * A remote change is published as soon as it is integrated, never later: while the mirror is ahead\n * of the local tree, an edit the editor computes on that tree lands at stale offsets.\n */\nimport * as Y from 'yjs'\nimport { ORIGIN_IDS } from '@docx-editor.dev/core/store'\nimport type {\n CanonicalPrimitiveJournal,\n CollaborationDocumentPort,\n} from '@docx-editor.dev/core/collaboration/replication'\nimport { MaterializeCache, materialize, registerMirror, MaterializeError } from './encoding'\nimport { applyJournal, JournalError } from './journal'\nimport { NodeRegistry, RegistryError } from './registry'\n\nexport const LOCAL_ORIGIN = Symbol('arbi-coedit/local')\n\nexport type SyncFailure = 'journal' | 'materialize' | 'apply'\n\nexport interface MirrorSyncOptions {\n doc: Y.Doc\n port: CollaborationDocumentPort\n actorId: string\n /** Called once when the mirror and the local tree can no longer be kept identical. */\n onFailure?: (code: SyncFailure, detail: string) => void\n /** Called with each local journal just before it is applied to the mirror. */\n onLocalJournal?: (journal: CanonicalPrimitiveJournal) => void\n /**\n * Called just before a remote change is published to the port. The function it returns, if any,\n * is called once the port holds the new tree.\n */\n aroundRemote?: () => (() => void) | void\n}\n\nexport class MirrorSync {\n readonly doc: Y.Doc\n readonly registry = new NodeRegistry()\n private readonly cache: MaterializeCache\n private readonly port: CollaborationDocumentPort\n private readonly actorId: string\n private readonly onFailure?: (code: SyncFailure, detail: string) => void\n private readonly onLocalJournal?: (journal: CanonicalPrimitiveJournal) => void\n private readonly aroundRemote?: () => (() => void) | void\n private readonly disposers: (() => void)[] = []\n private operation = 0\n private applyingRemote = false\n private failed = false\n /** Parts whose node ids must be re-registered before the next local journal; true means all. */\n private staleParts: Set<string> | true | null = null\n\n constructor(options: MirrorSyncOptions) {\n this.doc = options.doc\n this.port = options.port\n this.actorId = options.actorId\n this.onFailure = options.onFailure\n this.onLocalJournal = options.onLocalJournal\n this.aroundRemote = options.aroundRemote\n registerMirror(this.doc, this.registry)\n this.cache = new MaterializeCache(this.doc)\n this.disposers.push(() => this.cache.destroy())\n\n this.disposers.push(\n this.port.observePrimitiveJournal((journal) => {\n if (this.failed || this.applyingRemote) return\n try {\n this.refreshRegistry()\n this.onLocalJournal?.(journal)\n applyJournal(this.doc, this.registry, journal, LOCAL_ORIGIN, {\n binary: (key) => this.port.binaryPart(key),\n })\n } catch (error) {\n this.fail('journal', error)\n }\n })\n )\n\n const onAfterTransaction = (transaction: Y.Transaction): void => {\n if (transaction.origin === LOCAL_ORIGIN || this.failed) return\n if (transaction.changed.size === 0 && transaction.changedParentTypes.size === 0) return\n this.publishRemote(transaction.origin)\n }\n this.doc.on('afterTransaction', onAfterTransaction)\n this.disposers.push(() => this.doc.off('afterTransaction', onAfterTransaction))\n }\n\n get hasFailed(): boolean {\n return this.failed\n }\n\n /** Mirror any journal still queued locally. Call before integrating inbound updates. */\n beforeRemote(): void {\n this.port.flushPendingJournals()\n }\n\n /** Make the local tree equal to the room: used when the editor opened an older snapshot of it. */\n adopt(): void {\n this.publishRemote(undefined)\n }\n\n /** Re-register node ids for parts a remote publication replaced; deferred until a local edit needs them. */\n private refreshRegistry(): void {\n if (this.staleParts === null) return\n registerMirror(this.doc, this.registry, this.staleParts === true ? undefined : this.staleParts)\n this.staleParts = null\n }\n\n private publishRemote(origin: unknown): void {\n if (this.failed) return\n const published = this.aroundRemote?.()\n this.applyingRemote = true\n const changed = this.cache.take()\n let ok = false\n try {\n const result = this.port.applyRemotePackage(materialize(this.doc, this.cache, changed), {\n // The editor's own origin for a peer's change: it carries the local caret only across those.\n origin: ORIGIN_IDS.mutationRemote,\n actorId: typeof origin === 'string' ? origin : this.actorId,\n operationId: `${this.actorId}:remote:${this.operation++}`,\n })\n if (!result.ok) throw new JournalError(result.reason)\n if (changed === null || this.staleParts === true) this.staleParts = true\n else this.staleParts = new Set([...(this.staleParts ?? []), ...changed])\n ok = true\n } catch (error) {\n this.cache.restore(changed)\n this.fail(error instanceof MaterializeError ? 'materialize' : 'apply', error)\n } finally {\n this.applyingRemote = false\n }\n if (ok) published?.()\n }\n\n private fail(code: SyncFailure, error: unknown): void {\n if (this.failed) return\n this.failed = true\n const detail =\n error instanceof JournalError ||\n error instanceof RegistryError ||\n error instanceof MaterializeError\n ? error.message\n : error instanceof Error\n ? error.message\n : String(error)\n this.onFailure?.(code, detail)\n }\n\n destroy(): void {\n for (const dispose of this.disposers.splice(0)) dispose()\n }\n}\n","/**\n * The collaboration session the editor attaches: status, own-edit undo, presence and selections,\n * on top of a Yjs room and the `MirrorSync` that keeps the room and the local document identical.\n *\n * It implements core's `EditorCollaborationSession` contract and nothing beyond it, so it can be\n * handed to `collaborationModule`-style hosts and to headless automation hosts alike. The transport\n * (Hocuspocus, or nothing at all in tests) tells it when the room is synced, dropped or rejected.\n */\nimport * as Y from 'yjs'\nimport type { Awareness } from 'y-protocols/awareness'\nimport {\n createCollaborationStatusTracker,\n safeParticipantColor,\n type CollaborationFailureCode,\n type CollaborationIdentity,\n type CollaborationLocalSelection,\n type CollaborationParticipant,\n type CollaborationRemoteSelection,\n type CollaborationRemoteSelectionAddress,\n type CollaborationSelectionAddress,\n type CollaborationSelectionMove,\n type CollaborationStatus,\n type CollaborationStatusSnapshot,\n type EditorCollaborationSession,\n} from '@docx-editor.dev/core/collaboration'\nimport {\n historyGroupOfJournal,\n mapOffsetAcrossText,\n type CollaborationDocumentPort,\n} from '@docx-editor.dev/core/collaboration/replication'\nimport { isBootstrapped, isReadableFormat, readFormat } from './encoding'\nimport { LOCAL_ORIGIN, MirrorSync, type SyncFailure } from './sync'\n\nconst MAX_TEXT = 128\n/** Undo steps are closed by gesture boundaries, never by a clock. */\nconst NEVER = 1000 * 60 * 60 * 24 * 365\n\nexport interface DocxCollaborationSessionOptions {\n doc: Y.Doc\n awareness: Awareness\n documentId: string\n identity: CollaborationIdentity\n /** Keep accepting edits while the transport is down; they merge on reconnect. */\n offlineEditing?: boolean\n}\n\nexport class CollaborationSessionError extends Error {\n readonly code: CollaborationFailureCode\n constructor(code: CollaborationFailureCode, message?: string) {\n super(message ?? code)\n this.name = 'CollaborationSessionError'\n this.code = code\n }\n}\n\nfunction validateIdentity(identity: CollaborationIdentity): CollaborationIdentity {\n const bad = (value: unknown): boolean =>\n typeof value !== 'string' || value.length === 0 || value.length > MAX_TEXT\n if (bad(identity.actorId) || bad(identity.name)) {\n throw new CollaborationSessionError('invalid-identity')\n }\n if (identity.color !== undefined && safeParticipantColor(identity.color) === undefined) {\n throw new CollaborationSessionError('invalid-identity-color')\n }\n return identity\n}\n\nfunction readIdentity(value: unknown): CollaborationIdentity | undefined {\n if (!value || typeof value !== 'object') return undefined\n const { actorId, name, color, role } = value as Record<string, unknown>\n if (typeof actorId !== 'string' || actorId.length === 0 || actorId.length > MAX_TEXT)\n return undefined\n if (typeof name !== 'string' || name.length === 0 || name.length > MAX_TEXT) return undefined\n return {\n actorId,\n name,\n ...(typeof color === 'string' && safeParticipantColor(color) ? { color } : {}),\n ...(role === 'human' || role === 'agent' ? { role } : {}),\n }\n}\n\ntype StatusListener = Parameters<EditorCollaborationSession['subscribeStatus']>[0]\n\nexport class DocxCollaborationSession implements EditorCollaborationSession {\n readonly documentId: string\n readonly sessionId: string\n readonly identity: CollaborationIdentity\n\n private readonly doc: Y.Doc\n private readonly awareness: Awareness\n private readonly offlineEditing: boolean\n private readonly tracker = createCollaborationStatusTracker('initializing')\n private readonly statusListeners = new Set<StatusListener>()\n private readonly participantListeners = new Set<\n (participants: readonly CollaborationParticipant[]) => void\n >()\n private readonly selectionListeners = new Set<\n (selections: readonly CollaborationRemoteSelection[]) => void\n >()\n private readonly undoManager: Y.UndoManager\n private sync: MirrorSync | undefined\n private port: CollaborationDocumentPort | undefined\n private lastGroup: symbol | undefined\n private participantsCache: readonly CollaborationParticipant[] = []\n private selectionsCache: readonly CollaborationRemoteSelection[] = []\n private selectionsKey = '[]'\n private baselineVector: string | undefined\n /** The selection the editor last published, carried across the remote changes since. */\n private carried: CarriedSelection | null = null\n private selectionMove: CollaborationSelectionMove | null = null\n private inputFlush: (() => void) | null = null\n private readonly disposers: (() => void)[] = []\n\n constructor(options: DocxCollaborationSessionOptions) {\n this.documentId = options.documentId\n this.identity = validateIdentity(options.identity)\n this.sessionId = `${options.identity.actorId}:${randomToken()}`\n this.doc = options.doc\n this.awareness = options.awareness\n this.offlineEditing = options.offlineEditing ?? false\n\n this.undoManager = new Y.UndoManager(\n [\n this.doc.getMap('parts'),\n this.doc.getMap('rels'),\n this.doc.getMap('ctOverrides'),\n this.doc.getMap('binaries'),\n ],\n { trackedOrigins: new Set([LOCAL_ORIGIN]), captureTimeout: NEVER }\n )\n\n this.awareness.setLocalStateField('user', this.identity)\n const onAwareness = (): void => {\n this.refreshParticipants()\n this.refreshSelections()\n }\n this.awareness.on('change', onAwareness)\n this.disposers.push(() => this.awareness.off('change', onAwareness))\n this.refreshParticipants()\n }\n\n // ── Status ───────────────────────────────────────────────────────────────\n\n status(): CollaborationStatus {\n return this.tracker.status()\n }\n\n statusSnapshot(): CollaborationStatusSnapshot {\n return this.tracker.snapshot()\n }\n\n subscribeStatus(listener: StatusListener): () => void {\n this.statusListeners.add(listener)\n return () => this.statusListeners.delete(listener)\n }\n\n private setStatus(\n status: CollaborationStatus,\n code?: CollaborationFailureCode,\n detail?: string\n ): void {\n if (this.tracker.status() === 'destroyed') return\n if (!this.tracker.set(status, code, detail)) return\n for (const listener of [...this.statusListeners]) listener(status, code, detail)\n }\n\n /** The room has synced and holds a document this build understands. */\n markReady(): void {\n if (!isBootstrapped(this.doc)) {\n this.setStatus('error', 'not-initialized')\n return\n }\n if (!isReadableFormat(readFormat(this.doc))) {\n this.setStatus('error', 'collaboration-format-mismatch', readFormat(this.doc))\n return\n }\n this.baselineVector = vectorKey(this.doc)\n this.setStatus('ready')\n }\n\n markDisconnected(): void {\n if (this.status() === 'ready') this.setStatus('disconnected', 'transport-disconnected')\n }\n\n markReconnected(): void {\n if (this.status() === 'disconnected') this.setStatus('ready')\n }\n\n markFailed(code: CollaborationFailureCode, detail?: string): void {\n this.setStatus('error', code, detail)\n }\n\n /** True once an editor has attached its document port. */\n get attached(): boolean {\n return this.port !== undefined\n }\n\n gateOperations(): CollaborationFailureCode | null {\n switch (this.status()) {\n case 'ready':\n return this.port ? null : 'collaboration-session-not-attached'\n case 'disconnected':\n return this.offlineEditing && this.port ? null : 'collaboration-session-not-ready'\n case 'destroyed':\n return 'collaboration-session-destroyed'\n default:\n return 'collaboration-session-not-ready'\n }\n }\n\n // ── Attachment ───────────────────────────────────────────────────────────\n\n attach(port: CollaborationDocumentPort): () => void {\n if (this.port) {\n this.markFailed('port-already-attached')\n return () => {}\n }\n if (port.documentId !== this.documentId) {\n this.markFailed('document-id-mismatch')\n return () => {}\n }\n this.port = port\n const sync = new MirrorSync({\n doc: this.doc,\n port,\n actorId: this.identity.actorId,\n aroundRemote: () => this.carrySelection(),\n onFailure: (code: SyncFailure, detail: string) => {\n this.markFailed(code === 'journal' ? 'local-mirror-failed' : 'remote-apply-failed', detail)\n },\n onLocalJournal: (journal) => {\n const group = historyGroupOfJournal(journal)\n if (group === undefined || group !== this.lastGroup) this.undoManager.stopCapturing()\n this.lastGroup = group\n },\n })\n this.sync = sync\n // The editor opened bytes written from the room as it was. If the room moved since, adopt it.\n if (this.baselineVector !== undefined && this.baselineVector !== vectorKey(this.doc)) {\n sync.adopt()\n }\n const onPortChange = port.subscribe(() => this.refreshSelections())\n return () => {\n onPortChange()\n sync.destroy()\n if (this.sync === sync) this.sync = undefined\n if (this.port === port) this.port = undefined\n }\n }\n\n /** Transport hook: call before integrating inbound Yjs data so queued local edits are mirrored first. */\n beforeRemote(): void {\n // Typing the editor still holds lands on the tree it was typed on, before the peer's change.\n this.inputFlush?.()\n this.sync?.beforeRemote()\n }\n\n /**\n * Bind the editor's pending-input flush (`PaginatedSurface.flushPendingInput`). The session writes\n * below the editor's input buffer, so it lands queued typing before a remote change and lays the\n * change out right after it: the editor carries its caret at that layout, and a keystroke before\n * it would otherwise use the caret from before the change. Returns the unbind function.\n */\n bindEditorInput(flush: () => void): () => void {\n this.inputFlush = flush\n return () => {\n if (this.inputFlush === flush) this.inputFlush = null\n }\n }\n\n // ── Undo ─────────────────────────────────────────────────────────────────\n\n canUndo(): boolean {\n return this.undoManager.undoStack.length > 0\n }\n\n canRedo(): boolean {\n return this.undoManager.redoStack.length > 0\n }\n\n undo(): boolean {\n this.flushPendingJournals()\n if (this.gateOperations() !== null || !this.canUndo()) return false\n this.undoManager.stopCapturing()\n this.undoManager.undo()\n return true\n }\n\n redo(): boolean {\n this.flushPendingJournals()\n if (this.gateOperations() !== null || !this.canRedo()) return false\n this.undoManager.stopCapturing()\n this.undoManager.redo()\n return true\n }\n\n // ── Presence ─────────────────────────────────────────────────────────────\n\n setLocalSelection(selection: CollaborationLocalSelection | null): void {\n this.carried = selection && selection.kind !== 'cells' ? { from: null, selection } : null\n this.selectionMove = null\n this.awareness.setLocalStateField('selection', selection)\n }\n\n /** Where the last remote change carried the local selection; see `carrySelection`. */\n remoteSelectionMove(): CollaborationSelectionMove | null {\n return this.selectionMove\n }\n\n /**\n * Called before a remote change reaches the port: notes the selection's paragraphs and their text,\n * and returns what carries it across the change once the port holds the new tree. The editor\n * takes the carried selection when a local edit was coalesced with the remote change, where it\n * cannot map its caret by the text alone. Several remote changes before the editor publishes its\n * selection again chain, all from the selection it published.\n */\n private carrySelection(): () => void {\n const port = this.port\n const carried = this.carried\n const settle = () => this.inputFlush?.()\n if (!port || !carried) return settle\n const before = (address: CollaborationSelectionAddress) => {\n const paragraph = port.paragraphByStableId(address.paragraphId)\n if (!paragraph) return null\n const offset = Math.min(address.offset, paragraph.text.length)\n return { nodeId: paragraph.nodeId, text: paragraph.text, offset }\n }\n const anchor = before(carried.selection.anchor)\n const head = before(carried.selection.head)\n if (!anchor || !head) {\n this.carried = null\n this.selectionMove = null\n return settle\n }\n const from = carried.from ?? {\n anchor: { nodeId: anchor.nodeId, offset: anchor.offset },\n head: { nodeId: head.nodeId, offset: head.offset },\n }\n return () => {\n const after = (\n address: CollaborationSelectionAddress,\n was: { text: string; offset: number }\n ) => {\n const paragraph = port.paragraphByStableId(address.paragraphId)\n if (!paragraph) return null\n const offset = mapOffsetAcrossText(was.offset, was.text, paragraph.text)\n return { paragraphId: address.paragraphId, nodeId: paragraph.nodeId, offset }\n }\n const nextAnchor = after(carried.selection.anchor, anchor)\n const nextHead = after(carried.selection.head, head)\n if (!nextAnchor || !nextHead) {\n this.carried = null\n this.selectionMove = null\n } else {\n this.carried = {\n from,\n selection: {\n ...carried.selection,\n anchor: { paragraphId: nextAnchor.paragraphId, offset: nextAnchor.offset },\n head: { paragraphId: nextHead.paragraphId, offset: nextHead.offset },\n },\n }\n this.selectionMove = {\n from,\n to: {\n anchor: { nodeId: nextAnchor.nodeId, offset: nextAnchor.offset },\n head: { nodeId: nextHead.nodeId, offset: nextHead.offset },\n },\n }\n }\n settle()\n }\n }\n\n participants(): readonly CollaborationParticipant[] {\n return this.participantsCache\n }\n\n subscribeParticipants(\n listener: (participants: readonly CollaborationParticipant[]) => void\n ): () => void {\n this.participantListeners.add(listener)\n return () => this.participantListeners.delete(listener)\n }\n\n remoteSelections(): readonly CollaborationRemoteSelection[] {\n return this.selectionsCache\n }\n\n subscribeRemoteSelections(\n listener: (selections: readonly CollaborationRemoteSelection[]) => void\n ): () => void {\n this.selectionListeners.add(listener)\n return () => this.selectionListeners.delete(listener)\n }\n\n private refreshParticipants(): void {\n const byActor = new Map<string, CollaborationParticipant>()\n for (const [clientId, state] of this.awareness.getStates()) {\n const identity = readIdentity((state as { user?: unknown }).user)\n if (!identity) continue\n const isLocal = clientId === this.awareness.clientID\n const existing = byActor.get(identity.actorId)\n byActor.set(identity.actorId, { ...identity, isLocal: isLocal || existing?.isLocal === true })\n }\n const next = [...byActor.values()].sort((a, b) => Number(b.isLocal) - Number(a.isLocal))\n const same =\n next.length === this.participantsCache.length &&\n next.every((p, i) => {\n const previous = this.participantsCache[i]\n return (\n p.actorId === previous.actorId &&\n p.name === previous.name &&\n p.color === previous.color &&\n p.isLocal === previous.isLocal\n )\n })\n if (same) return\n this.participantsCache = next\n for (const listener of [...this.participantListeners]) listener(next)\n }\n\n private refreshSelections(): void {\n const port = this.port\n const next: CollaborationRemoteSelection[] = []\n if (port) {\n for (const [clientId, state] of this.awareness.getStates()) {\n if (clientId === this.awareness.clientID) continue\n const record = state as { user?: unknown; selection?: CollaborationLocalSelection | null }\n const identity = readIdentity(record.user)\n const selection = record.selection\n if (!identity || !selection) continue\n const anchor = resolveAddress(port, selection.anchor)\n const head = resolveAddress(port, selection.head)\n if (!anchor || !head) continue\n next.push({\n actorId: identity.actorId,\n name: identity.name,\n ...(identity.color ? { color: identity.color } : {}),\n anchor,\n head,\n ...(selection.kind ? { kind: selection.kind } : {}),\n })\n }\n }\n const key = JSON.stringify(next)\n if (key === this.selectionsKey) return\n this.selectionsKey = key\n this.selectionsCache = next\n for (const listener of [...this.selectionListeners]) listener(next)\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────────────\n\n flushPendingJournals(): void {\n this.port?.flushPendingJournals()\n }\n\n destroy(): void {\n if (this.status() === 'destroyed') return\n this.flushPendingJournals()\n this.sync?.destroy()\n this.sync = undefined\n this.port = undefined\n this.inputFlush = null\n this.undoManager.destroy()\n this.awareness.setLocalState(null)\n for (const dispose of this.disposers.splice(0)) dispose()\n this.setStatus('destroyed')\n this.statusListeners.clear()\n this.participantListeners.clear()\n this.selectionListeners.clear()\n }\n}\n\ninterface CarriedSelection {\n /** The selection as the editor published it, in its node ids then; null until a change carried it. */\n from: CollaborationSelectionMove['from'] | null\n /** Where that selection stands now, in stable paragraph ids. */\n selection: CollaborationLocalSelection\n}\n\nfunction resolveAddress(\n port: CollaborationDocumentPort,\n address: { paragraphId: string; offset: number } | undefined\n): CollaborationRemoteSelectionAddress | undefined {\n if (!address || typeof address.paragraphId !== 'string' || !Number.isInteger(address.offset)) {\n return undefined\n }\n const paragraph = port.paragraphByStableId(address.paragraphId)\n if (!paragraph) return undefined\n return {\n paragraphId: paragraph.paragraphId,\n nodeId: paragraph.nodeId,\n offset: Math.max(0, Math.min(address.offset, paragraph.text.length)),\n }\n}\n\nfunction vectorKey(doc: Y.Doc): string {\n return Array.from(Y.encodeStateVector(doc)).join(',')\n}\n\n/** Unique per attachment. `crypto.randomUUID` is absent outside secure contexts, so fall back. */\nfunction randomToken(): string {\n if (typeof crypto.randomUUID === 'function') return crypto.randomUUID()\n const bytes = crypto.getRandomValues(new Uint8Array(16))\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')\n}\n","import { COLLAB_FORMAT } from './encoding'\n\nexport const COLLAB_PROTOCOL = 1\n\n/** What a client sends with its token so the server can refuse an incompatible build. */\nexport const DOCUMENT_COLLABORATION_VERSIONS = {\n format: COLLAB_FORMAT,\n protocol: COLLAB_PROTOCOL,\n} as const\n","/**\n * Server side of a collaboration room: seeding a room from DOCX bytes, reading it back out, checking\n * that a client speaks this room format, and a headless automation host that edits a live room.\n *\n * Nothing here knows about HTTP or Hocuspocus. The collaboration service owns transport, auth and\n * persistence and calls into these functions with a `Y.Doc`.\n */\nimport * as Y from 'yjs'\nimport { Awareness } from 'y-protocols/awareness'\nimport {\n createServerAutomationHost,\n type ServerAutomationHostOptions,\n} from '@docx-editor.dev/core/automation'\nimport type { CollaborationIdentity } from '@docx-editor.dev/core/collaboration'\nimport { createCollaborationDocumentPort } from '@docx-editor.dev/core/collaboration/replication'\nimport {\n headlessViewOfStore,\n ORIGIN_IDS,\n TreePackageStore,\n type PackageTransactResult,\n validateRasterHeader,\n type HeadlessDocumentView,\n type ImageDecodePort,\n type TreeDocOp,\n} from '@docx-editor.dev/core/store'\nimport {\n documentNumbering,\n documentStyleIds,\n fragmentPackage,\n paragraphRunsXml,\n readParagraphs,\n stylesUsed,\n type DocPoint,\n type OoxmlNodeLike,\n type ReferencesPort,\n} from './commands'\nimport type { Revision } from './template/track'\nimport {\n bootstrapFromBytes,\n COLLAB_FORMAT,\n isBootstrapped,\n isReadableFormat,\n MaterializeError,\n materialize,\n materializeBytes,\n readFormat,\n} from './encoding'\nimport { DocxCollaborationSession } from './session'\nimport { COLLAB_PROTOCOL } from './versions'\n\nexport { COLLAB_PROTOCOL, DOCUMENT_COLLABORATION_VERSIONS } from './versions'\n\nexport class CollaborationCompatibilityError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'CollaborationCompatibilityError'\n }\n}\n\nexport function assertCompatibleVersions(versions: unknown): void {\n const v = versions as { format?: unknown; protocol?: unknown } | null | undefined\n if (!v || v.format !== COLLAB_FORMAT || v.protocol !== COLLAB_PROTOCOL) {\n throw new CollaborationCompatibilityError(\n 'This editor build is not compatible with the collaboration server. Reload the page.'\n )\n }\n}\n\n/** Throws unless the room was written in the format this build reads. */\nexport function assertRoomFormat(doc: Y.Doc): void {\n if (!isBootstrapped(doc)) throw new CollaborationCompatibilityError('The room holds no document.')\n const format = readFormat(doc)\n if (!isReadableFormat(format)) {\n throw new CollaborationCompatibilityError(`Unsupported room format ${String(format)}.`)\n }\n}\n\n/**\n * DOCX bytes as the editor would save them. Saving stamps a `w14:paraId` on every paragraph that\n * lacks one; seeding from the stamped bytes puts those ids in the room, so every participant\n * addresses a paragraph by the same id instead of deriving its own from position.\n */\nexport function normalizeDocx(bytes: Uint8Array): Uint8Array {\n const opened = createServerAutomationHost(bytes)\n if (!opened.ok) throw new MaterializeError(`not a readable DOCX: ${opened.reason}`)\n try {\n const saved = opened.host.save()\n if (!saved.ok)\n throw new MaterializeError(`could not normalise the DOCX: ${saved.error.message}`)\n return saved.bytes\n } finally {\n opened.host.dispose()\n }\n}\n\n/** Seed an empty room from DOCX bytes. Throws `MaterializeError` if the bytes are not a DOCX. */\nexport function seedRoom(doc: Y.Doc, bytes: Uint8Array): void {\n if (isBootstrapped(doc)) throw new CollaborationCompatibilityError('The room is already seeded.')\n bootstrapFromBytes(doc, normalizeDocx(bytes))\n}\n\n/** The room as DOCX bytes. */\nexport function readRoom(doc: Y.Doc): Uint8Array {\n assertRoomFormat(doc)\n return materializeBytes(doc)\n}\n\nexport interface RoomAutomation {\n host: ReturnType<typeof expectHost>\n session: DocxCollaborationSession\n dispose(): void\n}\n\nfunction expectHost(result: ReturnType<typeof createServerAutomationHost>) {\n if (!result.ok) throw new MaterializeError(`room is not editable: ${result.reason}`)\n return result.host\n}\n\n/**\n * Open a headless automation host over a live room. Edits made through `host.execute` are mirrored\n * into `doc` exactly as a browser's are, so other participants see them and the room persists them.\n */\nexport function openRoomAutomation(options: {\n doc: Y.Doc\n documentId: string\n identity: CollaborationIdentity\n hostOptions?: Omit<ServerAutomationHostOptions, 'collaborationModel'>\n}): RoomAutomation {\n assertRoomFormat(options.doc)\n const awareness = new Awareness(options.doc)\n const session = new DocxCollaborationSession({\n doc: options.doc,\n awareness,\n documentId: options.documentId,\n identity: options.identity,\n })\n session.markReady()\n try {\n const host = expectHost(\n createServerAutomationHost(materializeBytes(options.doc), {\n ...options.hostOptions,\n collaborationModel: { session },\n })\n )\n return {\n host,\n session,\n dispose() {\n host.dispose()\n session.destroy()\n awareness.destroy()\n },\n }\n } catch (error) {\n session.destroy()\n awareness.destroy()\n throw error\n }\n}\n\n/** A package store attached to a live room: writes go through `store` and reach the room on `flush`. */\nexport interface RoomStore {\n store: TreePackageStore\n session: DocxCollaborationSession\n /**\n * One transaction as the agent (attributed, outside the store's own history) on the body, or on\n * another story (a note), mirrored into the room when it commits.\n */\n transact(\n build: Parameters<TreePackageStore['transact']>[1],\n scope?: Parameters<TreePackageStore['transact']>[0]\n ): PackageTransactResult\n /** Mirror the store's other committed writes (an image insert) into the room. */\n flush(): void\n /** The document as the store now holds it, for the shared readers (`@arbidocs/coedit/commands`). */\n view(): HeadlessDocumentView\n /** Image dimensions from the file header, for `store.insertImage` (no pixel decode on a server). */\n imageDecodePort: ImageDecodePort\n dispose(): void\n}\n\n/**\n * Open a package store over a live room, for the writes the automation protocol does not carry\n * (fragment paste, notes, tracked table and image inserts, whole paragraph properties). Its commits\n * are mirrored into `doc` exactly as a browser's are.\n */\nexport function openRoomStore(options: {\n doc: Y.Doc\n documentId: string\n identity: CollaborationIdentity\n}): RoomStore {\n assertRoomFormat(options.doc)\n const awareness = new Awareness(options.doc)\n const session = new DocxCollaborationSession({\n doc: options.doc,\n awareness,\n documentId: options.documentId,\n identity: options.identity,\n })\n session.markReady()\n try {\n const pkg = materialize(options.doc)\n const main = pkg.parts.get(pkg.mainDocumentPart)\n if (!main) throw new MaterializeError('The room has no main document part.')\n const store = new TreePackageStore(pkg, main)\n const port = createCollaborationDocumentPort(store, { documentId: options.documentId })\n session.attach(port)\n return {\n store,\n session,\n transact(build, scope = { kind: 'body' }) {\n const result = store.transact(scope, build, {\n origin: ORIGIN_IDS.mutationAgent,\n actorId: options.identity.actorId,\n recordsHistory: false,\n })\n if (result.ok) port.flushPendingJournals()\n return result\n },\n flush: () => port.flushPendingJournals(),\n view: () => headlessViewOfStore(store),\n imageDecodePort: {\n async decode(bytes, mime) {\n const header = validateRasterHeader(bytes, mime)\n if (!header) throw new Error('The image cannot be read.')\n return {\n pixelWidth: header.pixelWidth,\n pixelHeight: header.pixelHeight,\n dpiX: header.dpiX ?? 96,\n dpiY: header.dpiY ?? 96,\n }\n },\n },\n dispose() {\n session.destroy()\n awareness.destroy()\n },\n }\n } catch (error) {\n session.destroy()\n awareness.destroy()\n throw error\n }\n}\n\n/**\n * The defined-term and cross-reference commands' port (`@arbidocs/coedit/commands`) over a room\n * store: the same commands the editor's toolbar runs, landing in the room. A caret is just a\n * position here; pastes are fragment pastes, with a `revision` one tracked insertion by it.\n */\nexport function roomCommandsPort(\n room: RoomStore,\n { revision, actorId }: { revision?: Revision | null; actorId?: string } = {}\n): ReferencesPort {\n const view = () => room.view()\n const root = () => view().part().root as unknown as OoxmlNodeLike\n const numbering = () =>\n documentNumbering({\n root,\n stylesRoot: () => view().stylesRoot(),\n numberingRoot: () => view().numberingRoot(),\n settingsRoot: () => view().settingsRoot(),\n })\n let caret: DocPoint | null = null\n const at = () => {\n if (!caret) throw new Error('No position to write at.')\n return caret\n }\n const apply = (op: TreeDocOp) => {\n const result = room.transact((ctx) => {\n ctx.apply(op)\n })\n if (!result.ok) throw new Error(`The editor refused the change (${op.op}).`)\n }\n const find = (node: OoxmlNodeLike, id: string): OoxmlNodeLike | undefined => {\n if (node.id === id) return node\n for (const child of node.children ?? []) {\n const found = find(child, id)\n if (found) return found\n }\n return undefined\n }\n return {\n paragraphs: () => readParagraphs(root()),\n caret: () => caret,\n setCaret: (point) => {\n caret = point\n },\n deleteRange: (from, to) => {\n if (from.paragraphId !== to.paragraphId) throw new Error('A deletion stays in one paragraph.')\n apply({\n op: 'deleteText',\n paragraphId: from.paragraphId,\n start: from.offset,\n end: to.offset,\n ...(revision ? { revision } : {}),\n })\n },\n paste: (body, _text, covered, relationships) => {\n const point = at()\n const defined = documentStyleIds(view().stylesRoot() as OoxmlNodeLike | null)\n const styles = stylesUsed(body).filter((id) => !defined.has(id))\n const result = room.store.applyFragmentPaste(\n { kind: 'body' },\n {\n paragraphId: point.paragraphId,\n offset: point.offset,\n fragmentBytes: fragmentPackage(body, covered, { revision, relationships, styles }),\n lastMarkCovered: covered,\n actorId,\n }\n )\n if (result.ok) room.flush()\n return result.ok\n },\n splitParagraph: () => {\n const point = at()\n apply({ op: 'splitParagraph', paragraphId: point.paragraphId, offset: point.offset })\n const paragraphs = readParagraphs(root())\n const next = paragraphs[paragraphs.findIndex((p) => p.id === point.paragraphId) + 1]\n caret = next ? { paragraphId: next.id, offset: 0 } : point\n },\n typeText: (text) => {\n const point = at()\n apply({\n op: 'insertText',\n paragraphId: point.paragraphId,\n offset: point.offset,\n text,\n ...(revision ? { revision } : {}),\n })\n caret = { paragraphId: point.paragraphId, offset: point.offset + text.length }\n },\n listItems: () => numbering().listItems(),\n levelOf: (numId, ilvl) => numbering().levelOf(numId, ilvl),\n runsXml: (paragraphId) => {\n const node = find(root(), paragraphId)\n return node ? paragraphRunsXml(node) : null\n },\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/commands/read.ts","../src/commands/numbering.ts","../src/commands/ooxml.ts","../src/commands/references.ts","../src/template/xml.ts","../src/template/pkg.ts","../src/template/track.ts","../src/commands/fragment.ts","../src/rich.ts","../src/mirror.ts","../src/encoding.ts","../src/registry.ts","../src/journal.ts","../src/sync.ts","../src/session.ts","../src/versions.ts","../src/server.ts"],"names":["buildStyleCascadeTable","withNumberingStyleLinks","buildNumberingIndex","resolveStoryListItems","resolveNumberingLevel","zipSync","strToU8","readXml","serialize","strFromU8","unzipSync","attr","WML","isEl","el","Y","XML_NAMESPACE_URI","Y2","readOoxmlPart","validateExternalTarget","relsName","relsPartNameFor","contentTypesPartBytes","withContentTypeOverride","writeOoxmlPackage","readOoxmlPackage","Y3","index","Y4","text","parent","inserted","destination","ORIGIN_IDS","safeParticipantColor","createCollaborationStatusTracker","Y5","historyGroupOfJournal","mapOffsetAcrossText","same","Y6","createServerAutomationHost","awareness","Awareness","store","TreePackageStore","createCollaborationDocumentPort","headlessViewOfStore","validateRasterHeader"],"mappings":"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","file":"server.cjs","sourcesContent":["/**\n * The read side of the Word-editor commands: a document's paragraphs as the commands see them\n * (text in the engine's offset vocabulary, bookmarks, internal links, fields, note references),\n * read from the engine's OOXML tree. The same tree comes from a live editor\n * (`surface.session.part().root`) or from document bytes (`openHeadlessDocument`), so the toolbar\n * and ARBI's headless tools read a document the same way.\n */\n\n/** Character style of an inserted term: a dotted underline, so a defined term reads as one. */\nexport const DEFINED_TERM_STYLE = 'DefinedTerm'\n\n/** Character style of a cross-reference: a muted blue with a dotted underline (Word's name). */\nexport const CROSS_REFERENCE_STYLE = 'CrossReference'\n/** Character style of a cross-reference whose target is gone: its last text, flagged. */\nexport const BROKEN_CROSS_REFERENCE_STYLE = 'CrossReferenceBroken'\n\n/** A position: a paragraph (the engine's node id) and a UTF-16 offset into its text. */\nexport interface DocPoint {\n paragraphId: string\n offset: number\n}\n\n/** An internal link in a paragraph. */\nexport interface DocLink {\n anchor: string\n text: string\n /** Where its text starts in the paragraph's text. */\n offset?: number\n}\n\n/** A footnote or endnote reference: one character of the paragraph, as the engine counts it. */\nexport interface DocNote {\n offset: number\n kind: 'footnote' | 'endnote'\n /** `w:id` of the note. */\n id: string\n}\n\n/** One paragraph, in document order. */\nexport interface DocParagraph {\n id: string\n /** `w14:paraId`, the id that is the same in every replica of a collaboration room. */\n paraId?: string\n text: string\n /** Styled as a heading (a `Heading n` style or an outline level). */\n heading: boolean\n styleId?: string\n /** A paragraph of the body itself, not inside a table. */\n topLevel: boolean\n /** Names of the bookmarks that start in it. */\n bookmarks: string[]\n /** Its internal links (`w:hyperlink w:anchor`). */\n links: DocLink[]\n /** Its complex fields: where each sits (its one-character offset), its instruction and result. */\n fields?: DocField[]\n /** Its runs in a watched character style (a broken cross-reference's mark), with their text. */\n marks?: DocMark[]\n /** Its footnote and endnote references. */\n notes?: DocNote[]\n /** Its pending tracked insertions and deletions, in document order. */\n revisions?: DocRevision[]\n}\n\n/**\n * A pending tracked change in a paragraph. `text` leaves deleted text out, while the engine's\n * offsets (a {@link DocPoint}) count it: an insertion covers `length` characters of `text` from\n * `offset`; a deletion's `text` sits at `offset`, between the characters of `text` around it.\n */\nexport interface DocRevision {\n kind: 'insert' | 'delete'\n offset: number\n length: number\n author?: string\n /** A deletion's text. */\n text?: string\n}\n\n/**\n * Where a position in a paragraph's `text` is in the engine's offsets, which count pending\n * deleted text. `pastDeletions`: a position with deleted text right at it is placed after that\n * text rather than before it.\n */\nexport function engineOffset(\n paragraph: DocParagraph,\n offset: number,\n pastDeletions = false\n): number {\n let out = offset\n for (const r of paragraph.revisions ?? [])\n if (r.kind === 'delete' && (r.offset < offset || (pastDeletions && r.offset === offset)))\n out += r.length\n return out\n}\n\n/** A paragraph's length in the engine's offsets: its text and its pending deleted text. */\nexport const engineLength = (paragraph: DocParagraph) =>\n engineOffset(paragraph, paragraph.text.length, true)\n\n/** A stretch of a paragraph's text in a watched character style. */\nexport interface DocMark {\n styleId: string\n offset: number\n text: string\n}\n\n/** Character styles whose runs a paragraph read reports as marks. */\nexport const WATCHED_STYLES = new Set([BROKEN_CROSS_REFERENCE_STYLE])\n\n/** A complex field of a paragraph. */\nexport interface DocField {\n offset: number\n instruction: string\n result: string\n}\n\nexport type OoxmlNodeLike = {\n id: string\n kind: string\n localName?: string\n value?: string\n attributes?: readonly { localName: string; value: string }[]\n children?: readonly OoxmlNodeLike[]\n}\n\nconst attr = (node: OoxmlNodeLike, name: string) =>\n node.attributes?.find((a) => a.localName === name)?.value\n\n/** How a field (or a note reference) counts in a paragraph's text (the engine's model vocabulary). */\nexport const FIELD_ATOM = '\\uFFFC'\n\n/** A heading style id in any of the spellings Word localises it to (`Heading1`, `berschrift1`…). */\nconst HEADING_STYLE = /^(heading|berschrift|titre|t[ií]tulo|titolo|kop)\\s*\\d/i\n\n/** The paragraphs of a part's body, read from the engine's OOXML tree. */\nexport function readParagraphs(root: OoxmlNodeLike): DocParagraph[] {\n const out: DocParagraph[] = []\n const body = root.children?.find((n) => n.kind === 'body') ?? root\n const visit = (node: OoxmlNodeLike, topLevel: boolean, pending: string[]) => {\n for (const child of node.children ?? []) {\n if (child.kind === 'paragraph') {\n out.push(readParagraph(child, topLevel, pending.splice(0)))\n } else if (child.localName === 'bookmarkStart') {\n // A bookmark between paragraphs belongs to the next one.\n const name = attr(child, 'name')\n if (name) pending.push(name)\n } else if (\n child.localName === 'tbl' ||\n child.localName === 'tr' ||\n child.localName === 'tc'\n ) {\n visit(child, false, pending)\n } else if (child.localName === 'sdt' || child.localName === 'sdtContent') {\n visit(child, topLevel, pending)\n }\n }\n }\n visit(body, true, [])\n return out\n}\n\nfunction readParagraph(node: OoxmlNodeLike, topLevel: boolean, bookmarks: string[]): DocParagraph {\n let text = ''\n const links: DocLink[] = []\n let styleId: string | undefined\n let outline = false\n // A field reads as ONE character (U+FFFC), as the engine counts offsets: its instruction and\n // its cached result are not text of the paragraph.\n let fieldDepth = 0\n const marks: DocMark[] = []\n /** The watched style of the run being walked, if any. */\n let runStyle: string | undefined\n const fields: DocField[] = []\n const notes: DocNote[] = []\n const revisions: DocRevision[] = []\n let current: (DocField & { inResult: boolean }) | null = null\n const field = (c: OoxmlNodeLike) => {\n const type = attr(c, 'fldCharType')\n if (type === 'begin') {\n if (fieldDepth === 0) {\n current = { offset: text.length, instruction: '', result: '', inResult: false }\n text += FIELD_ATOM\n }\n fieldDepth++\n } else if (type === 'separate' && fieldDepth === 1 && current) current.inResult = true\n else if (type === 'end') {\n fieldDepth = Math.max(0, fieldDepth - 1)\n if (fieldDepth === 0 && current) {\n const { offset, instruction, result } = current\n fields.push({ offset, instruction: instruction.trim(), result })\n current = null\n }\n }\n }\n const walk = (n: OoxmlNodeLike, link?: DocLink) => {\n for (const c of n.children ?? []) {\n if (c.localName === 'fldChar') {\n field(c)\n continue\n }\n if (c.localName === 'fldSimple') {\n if (fieldDepth === 0) text += FIELD_ATOM\n continue\n }\n if (c.localName === 'instrText') {\n if (fieldDepth === 1 && current)\n (current as DocField).instruction += (c.children ?? []).map((t) => t.value ?? '').join('')\n continue\n }\n if (c.kind === 'paragraphProperties' || c.localName === 'pPr') {\n for (const p of c.children ?? []) {\n if (p.localName === 'pStyle') styleId = attr(p, 'val')\n if (p.localName === 'outlineLvl' && Number(attr(p, 'val')) < 9) outline = true\n }\n continue\n }\n if (c.localName === 'del') {\n // Deleted text is not part of the paragraph's text; where it sits is (see DocRevision).\n const deleted = deletedText(c)\n if (deleted && fieldDepth === 0)\n revisions.push({\n kind: 'delete',\n offset: text.length,\n length: deleted.length,\n author: attr(c, 'author'),\n text: deleted,\n })\n continue\n }\n if (c.localName === 'ins') {\n const start = text.length\n walk(c, link)\n if (text.length > start && fieldDepth === 0)\n revisions.push({\n kind: 'insert',\n offset: start,\n length: text.length - start,\n author: attr(c, 'author'),\n })\n continue\n }\n if (c.localName === 'delText' || c.localName === 'rPr') continue\n if (c.localName === 'r') {\n const rStyle = c.children\n ?.find((x) => x.localName === 'rPr')\n ?.children?.find((x) => x.localName === 'rStyle')\n const watched = rStyle && attr(rStyle, 'val')\n runStyle = watched && WATCHED_STYLES.has(watched) ? watched : undefined\n walk(c, link)\n runStyle = undefined\n continue\n }\n if (\n (c.localName === 'footnoteReference' || c.localName === 'endnoteReference') &&\n fieldDepth === 0\n ) {\n notes.push({\n offset: text.length,\n kind: c.localName === 'footnoteReference' ? 'footnote' : 'endnote',\n id: attr(c, 'id') ?? '',\n })\n text += FIELD_ATOM\n continue\n }\n if (c.localName === 'bookmarkStart') {\n const name = attr(c, 'name')\n if (name) bookmarks.push(name)\n continue\n }\n if (c.localName === 'hyperlink') {\n const anchor = attr(c, 'anchor')\n const next = anchor ? { anchor, text: '', offset: text.length } : undefined\n walk(c, next ?? link)\n if (next) links.push(next)\n continue\n }\n if (c.kind === 'textValue') {\n if (fieldDepth > 0) {\n const open = current as (DocField & { inResult: boolean }) | null\n if (fieldDepth === 1 && open?.inResult) open.result += c.value ?? ''\n continue\n }\n if (runStyle && c.value) {\n const last = marks[marks.length - 1]\n if (last && last.styleId === runStyle && last.offset + last.text.length === text.length)\n last.text += c.value\n else marks.push({ styleId: runStyle, offset: text.length, text: c.value })\n }\n text += c.value ?? ''\n if (link) link.text += c.value ?? ''\n continue\n }\n if (c.localName === 'tab' && fieldDepth === 0) text += '\\t'\n walk(c, link)\n }\n }\n walk(node)\n const paraId = attr(node, 'paraId')\n return {\n id: node.id,\n ...(paraId ? { paraId } : {}),\n text,\n heading: outline || (!!styleId && HEADING_STYLE.test(styleId)),\n styleId,\n topLevel,\n bookmarks,\n links,\n ...(fields.length ? { fields } : {}),\n ...(marks.length ? { marks } : {}),\n ...(notes.length ? { notes } : {}),\n ...(revisions.length ? { revisions } : {}),\n }\n}\n\n/** The text a tracked deletion removes (its `w:delText`; a deleted tab counts as one character). */\nfunction deletedText(node: OoxmlNodeLike): string {\n let out = ''\n for (const c of node.children ?? []) {\n if (c.localName === 'instrText') continue\n if (c.localName === 'delText') out += (c.children ?? []).map((t) => t.value ?? '').join('')\n else if (c.localName === 'tab') out += '\\t'\n else if (c.localName !== 'rPr') out += deletedText(c)\n }\n return out\n}\n\n/** Style id to style name (`Heading1` → `heading 1`), from a styles part's tree. */\nexport function styleNames(root: OoxmlNodeLike | null | undefined): Map<string, string> {\n const names = new Map<string, string>()\n for (const style of root?.children ?? []) {\n if (style.localName !== 'style') continue\n const id = attr(style, 'styleId')\n const name = style.children?.find((c) => c.localName === 'name')\n if (id) names.set(id, (name && attr(name, 'val')) || id)\n }\n return names\n}\n","/**\n * Cross-reference targets: the document's numbered paragraphs (clauses, sub-clauses, numbered\n * captions) and its headings, with the number Word's `REF \\r` shows for each.\n *\n * The number is what the editor computes for a `REF … \\r` field — and it has to be exactly that,\n * because the engine shows a field's live value only while the field's cached result matches what\n * it computes (otherwise it keeps the cached text for good). So this mirrors the engine: the\n * paragraph's own list level, preceded by each higher level whose number its level text does not\n * already show (`%1.%2` already shows level 1; `(%3)` does not show `2.1`), and one trailing\n * period dropped (`2.` reads `2`).\n */\n\nimport type { DocParagraph, OoxmlNodeLike } from './read'\nimport {\n buildNumberingIndex,\n buildStyleCascadeTable,\n resolveNumberingLevel,\n resolveStoryListItems,\n withNumberingStyleLinks,\n} from '@docx-editor.dev/core/layout'\n\n/** A paragraph's resolved list numbering (the engine's list item). */\nexport interface ListItemInfo {\n numId: string\n ilvl: number\n markerText: string\n numFmt: string\n}\n\n/** A list level's definition: its level text (`%1.%2`) and number format. */\nexport interface LevelInfo {\n lvlText: string\n numFmt: string\n}\n\nexport type LevelOf = (numId: string, ilvl: number) => LevelInfo | null\n\nconst numbers = (level: { numFmt: string; lvlText?: string; markerText?: string } | null) =>\n !!level &&\n level.numFmt !== 'bullet' &&\n level.numFmt !== 'none' &&\n (level.lvlText ?? level.markerText ?? '').length > 0\n\n/**\n * The number `REF \\r` shows for a paragraph, or null when it is not numbered. `order` is every\n * paragraph id in document order (for the markers of the levels above it).\n */\nexport function paragraphNumber(\n order: readonly string[],\n items: ReadonlyMap<string, ListItemInfo>,\n levelOf: LevelOf,\n paragraphId: string\n): string | null {\n const item = items.get(paragraphId)\n if (!item || !numbers(item)) return null\n const at = order.indexOf(paragraphId)\n /** The marker the nearest paragraph at `ilvl` of this list had, up to the target. */\n const markerAt = (ilvl: number): string | null => {\n if (ilvl === item.ilvl) return item.markerText\n for (let i = at - 1; i >= 0; i--) {\n const other = items.get(order[i])\n if (other && other.numId === item.numId && other.ilvl === ilvl) return other.markerText\n }\n return null\n }\n const chain: number[] = []\n const texts: string[] = []\n for (let u = item.ilvl; u >= 0; u--) {\n const level = levelOf(item.numId, u)\n if (!level || !numbers(level)) continue\n if (u !== item.ilvl && texts.some((t) => t.includes(`%${u + 1}`))) continue\n chain.push(u)\n texts.push(level.lvlText)\n }\n const value = chain\n .reverse()\n .map((u) => markerAt(u) ?? '')\n .join('')\n if (!value) return null\n return value.length > 1 && value.endsWith('.') ? value.slice(0, -1) : value\n}\n\n/** One place a cross-reference can point at. */\nexport interface CrossReferenceTarget {\n paragraphId: string\n /** A numbered paragraph (clause, sub-clause, caption) or an unnumbered heading. */\n kind: 'numbered' | 'heading'\n /** What `REF \\r` shows (`8.2`), or null for an unnumbered heading. */\n number: string | null\n /** The paragraph's list marker as painted (`8.2`, `(a)`), or empty. */\n marker: string\n /** The paragraph's text (without its marker). */\n text: string\n heading: boolean\n /** Its list level (0 for a top-level clause), or 0 for a heading. */\n level: number\n}\n\n/** Every numbered paragraph and every heading, in document order. */\nexport function listTargets(\n paragraphs: readonly DocParagraph[],\n items: ReadonlyMap<string, ListItemInfo>,\n levelOf: LevelOf\n): CrossReferenceTarget[] {\n const order = paragraphs.map((p) => p.id)\n const out: CrossReferenceTarget[] = []\n for (const p of paragraphs) {\n const text = p.text.replace(//g, '').trim()\n if (!text) continue\n const number = paragraphNumber(order, items, levelOf, p.id)\n const item = items.get(p.id)\n if (number !== null)\n out.push({\n paragraphId: p.id,\n kind: 'numbered',\n number,\n marker: item?.markerText ?? '',\n text,\n heading: p.heading,\n level: item?.ilvl ?? 0,\n })\n else if (p.heading)\n out.push({\n paragraphId: p.id,\n kind: 'heading',\n number: null,\n marker: '',\n text,\n heading: true,\n level: 0,\n })\n }\n return out\n}\n\n/** Targets whose number or text contains the query (case-insensitive). */\nexport function filterTargets(\n targets: readonly CrossReferenceTarget[],\n query: string\n): CrossReferenceTarget[] {\n const q = query.trim().toLowerCase()\n if (!q) return [...targets]\n return targets.filter(\n (t) => (t.number ?? '').toLowerCase().startsWith(q) || t.text.toLowerCase().includes(q)\n )\n}\n\n/** What the engine's numbering needs of a document: its parts' trees. */\nexport interface NumberingSource {\n /** The main document part's root. */\n root(): OoxmlNodeLike\n stylesRoot(): unknown\n numberingRoot(): unknown\n settingsRoot(): unknown\n}\n\n/** A document's list numbering as the engine resolves it. */\nexport interface DocumentNumbering {\n /** Each numbered paragraph's list item, by paragraph (node) id. */\n listItems(): ReadonlyMap<string, ListItemInfo>\n levelOf: LevelOf\n}\n\n/**\n * The numbering of a document, as the editor paints it: from a live editor's session or from a\n * headless document view alike.\n */\nexport function documentNumbering(source: NumberingSource): DocumentNumbering {\n type Index = ReturnType<typeof buildNumberingIndex>\n type Cascade = ReturnType<typeof buildStyleCascadeTable>\n let numbering: Index | undefined\n let cascade: Cascade | undefined\n const index = () => {\n if (!numbering) {\n cascade = buildStyleCascadeTable(\n source.stylesRoot() as Parameters<typeof buildStyleCascadeTable>[0],\n undefined,\n source.settingsRoot() as Parameters<typeof buildStyleCascadeTable>[2]\n )\n numbering = withNumberingStyleLinks(\n buildNumberingIndex(source.numberingRoot() as Parameters<typeof buildNumberingIndex>[0]),\n cascade\n )\n }\n return numbering\n }\n return {\n listItems: () => {\n const body = source.root().children?.find((n) => n.kind === 'body')\n const items = resolveStoryListItems(\n (body?.children ?? []) as unknown as Parameters<typeof resolveStoryListItems>[0],\n index(),\n cascade\n )\n const out = new Map<string, ListItemInfo>()\n for (const [id, item] of items)\n out.set(id, {\n numId: item.numId,\n ilvl: item.ilvl,\n markerText: item.markerText,\n numFmt: item.numFmt,\n })\n return out\n },\n levelOf: (numId, ilvl) => {\n const level = resolveNumberingLevel(index(), numId, ilvl)?.level\n return level ? { lvlText: level.lvlText, numFmt: level.numFmt } : null\n },\n }\n}\n","/**\n * The minimal WordprocessingML a command writes: escaped text, a `word/document.xml` and\n * `word/styles.xml` around it, and the `.docx` package that carries them (a paste fragment).\n */\n\nimport { strToU8, zipSync } from 'fflate'\n\nexport const W_NAMESPACES =\n 'xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"'\n\n// Text that is not allowed in XML 1.0 at all (control characters) is dropped, not escaped.\n// eslint-disable-next-line no-control-regex\nconst INVALID_XML = /[\\u0000-\\u0008\\u000B\\u000C\\u000E-\\u001F]/g\n\n/** Text as XML character data or an attribute value. */\nexport const esc = (text: string) =>\n text\n .replace(INVALID_XML, '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n\n/** A `word/document.xml` around body content (paragraphs, tables, then the section). */\nexport const documentXml = (body: string) =>\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:document ${W_NAMESPACES}><w:body>${body}</w:body></w:document>`\n\n/** `word/styles.xml` holding the given style definitions. */\nexport const stylesXml = (defaults: string, styles: string) =>\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<w:styles xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">${defaults}${styles}</w:styles>`\n\nconst CONTENT_TYPES = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\"><Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/><Default Extension=\"xml\" ContentType=\"application/xml\"/><Override PartName=\"/word/document.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.document.main+xml\"/><Override PartName=\"/word/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.wordprocessingml.styles+xml\"/><Override PartName=\"/docProps/core.xml\" ContentType=\"application/vnd.openxmlformats-package.core-properties+xml\"/></Types>`\n\nconst ROOT_RELS = `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"word/document.xml\"/><Relationship Id=\"rId2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\" Target=\"docProps/core.xml\"/></Relationships>`\n\n/** `word/_rels/document.xml.rels`: the styles part, then any further relationships given. */\nconst documentRels = (more = '') => `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\"><Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>${more}</Relationships>`\n\n/** A relationship to an external hyperlink target, for `w:hyperlink r:id`. */\nexport const hyperlinkRelationship = (id: string, url: string) =>\n `<Relationship Id=\"${esc(id)}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\" Target=\"${esc(url)}\" TargetMode=\"External\"/>`\n\nconst coreXml = (\n title: string,\n at: string\n) => `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n<cp:coreProperties xmlns:cp=\"http://schemas.openxmlformats.org/package/2006/metadata/core-properties\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"><dc:title>${esc(\n title\n)}</dc:title><dcterms:created xsi:type=\"dcterms:W3CDTF\">${at}</dcterms:created><dcterms:modified xsi:type=\"dcterms:W3CDTF\">${at}</dcterms:modified></cp:coreProperties>`\n\n/** The minimal `.docx` package: a document, its styles, and its title and time. */\nexport function docxPackage(parts: {\n document: string\n styles: string\n title: string\n /** ISO time; default now. */\n at?: string\n /** Further `word/document.xml` relationships (e.g. {@link hyperlinkRelationship}). */\n relationships?: string\n}): Uint8Array {\n const at = new Date(parts.at ?? Date.now()).toISOString().replace(/\\.\\d{3}Z$/, 'Z')\n return zipSync({\n '[Content_Types].xml': strToU8(CONTENT_TYPES),\n '_rels/.rels': strToU8(ROOT_RELS),\n 'docProps/core.xml': strToU8(coreXml(parts.title, at)),\n 'word/document.xml': strToU8(parts.document),\n 'word/styles.xml': strToU8(parts.styles),\n 'word/_rels/document.xml.rels': strToU8(documentRels(parts.relationships)),\n })\n}\n","/**\n * Cross-references, the way Word does them, and their status.\n *\n * Within the document: a hidden `_Ref…` bookmark on the target paragraph and a `REF` field at the\n * caret — `REF _Ref123 \\\\r \\\\h` for a numbered paragraph (Word's Cross-reference › Numbered item ›\n * Paragraph number), `REF _Ref123 \\\\h` for a heading's text. The field's cached result is the value\n * the editor computes, so it updates live when the clauses are renumbered, and Word updates it\n * with the document's other fields.\n *\n * To another document: a hyperlink with the reference text (\"SPA, clause 8.2\"), aimed at the app\n * address of that document's passage (so it works from Word too), with a screen tip saying so.\n *\n * Every cross-reference reads as current, stale (a clause renumbered, a heading reworded) or broken\n * (the target is gone).\n */\n\nimport {\n BROKEN_CROSS_REFERENCE_STYLE,\n CROSS_REFERENCE_STYLE,\n FIELD_ATOM,\n type DocParagraph,\n type DocPoint,\n type OoxmlNodeLike,\n} from './read'\nimport {\n paragraphNumber,\n type CrossReferenceTarget,\n type LevelOf,\n type ListItemInfo,\n} from './numbering'\nimport { esc, hyperlinkRelationship } from './ooxml'\nimport type { ReferencesPort } from './port'\n\n/** Prefix of Word's hidden cross-reference bookmarks. */\nexport const REF_BOOKMARK_PREFIX = '_Ref'\n\nexport type CrossReferenceMode = 'number' | 'text'\n\nconst REF_FIELD = /^REF\\s+(\\S+)((?:\\s+\\\\[A-Za-z*]+(?:\\s+MERGEFORMAT)?)*)\\s*$/i\n\n/** What reading cross-references needs of a document. */\nexport interface ReferencesReader {\n paragraphs(): DocParagraph[]\n /** Each numbered paragraph's list item, by paragraph id. */\n listItems(): ReadonlyMap<string, ListItemInfo>\n levelOf: LevelOf\n}\n\n/** One `REF` field to a `_Ref` bookmark. */\nexport interface CrossReference {\n paragraphId: string\n offset: number\n instruction: string\n bookmark: string\n mode: CrossReferenceMode\n /** The field's cached result (what it shows). */\n cached: string\n /** The paragraph the bookmark is in, or null when it is gone (the reference is broken). */\n target: string | null\n /** What the reference should show now, or null when that cannot be computed. */\n value: string | null\n}\n\n/** A `REF` field whose cached result no longer says what its target now is. */\nexport interface StaleReference {\n paragraphId: string\n offset: number\n instruction: string\n /** The current value, or null when the target is gone (the reference is broken). */\n value: string | null\n /** The field's cached result (what it last showed). */\n cached: string\n bookmark: string\n mode: CrossReferenceMode\n}\n\n/** A cross-reference whose target was deleted: its last text, marked in the Broken style. */\nexport interface BrokenReference {\n paragraphId: string\n offset: number\n text: string\n}\n\n/** Every cross-reference of the document, in document order. */\nexport function crossReferences(port: ReferencesReader): CrossReference[] {\n const paragraphs = port.paragraphs()\n if (!paragraphs.some((p) => p.fields?.length)) return []\n const items = port.listItems()\n const order = paragraphs.map((p) => p.id)\n const owner = new Map<string, string>()\n for (const p of paragraphs) for (const b of p.bookmarks) if (!owner.has(b)) owner.set(b, p.id)\n const out: CrossReference[] = []\n for (const p of paragraphs)\n for (const field of p.fields ?? []) {\n const match = REF_FIELD.exec(field.instruction)\n if (!match || !match[1].startsWith(REF_BOOKMARK_PREFIX)) continue\n const switches = match[2].toLowerCase()\n const mode: CrossReferenceMode = /\\\\[rwn]\\b/.test(switches) ? 'number' : 'text'\n const target = owner.get(match[1]) ?? null\n const value = !target\n ? null\n : mode === 'number'\n ? switches.includes('\\\\r')\n ? paragraphNumber(order, items, port.levelOf, target)\n : null\n : (paragraphs.find((x) => x.id === target)?.text ?? '').replace(//g, '').trim()\n out.push({\n paragraphId: p.id,\n offset: field.offset,\n instruction: field.instruction,\n bookmark: match[1],\n mode,\n cached: field.result,\n target,\n value,\n })\n }\n return out\n}\n\n/**\n * The cross-references whose cached result is out of date: a clause renumbered, a heading\n * reworded, or the target gone. The editor paints a field's live value only while its cached\n * result matches what it computes, so a stale cache shows the OLD number after the document is\n * reopened (and Word shows the cached result until its fields are updated).\n */\nexport function staleCrossReferences(port: ReferencesReader): StaleReference[] {\n return crossReferences(port)\n .filter((ref) => !ref.target || (ref.value && ref.value !== ref.cached.trim()))\n .map(({ paragraphId, offset, instruction, value, cached, bookmark, mode }) => ({\n paragraphId,\n offset,\n instruction,\n value,\n cached,\n bookmark,\n mode,\n }))\n}\n\n/** The broken cross-references marked in the document, in document order. */\nexport function brokenCrossReferences(\n port: Pick<ReferencesReader, 'paragraphs'>\n): BrokenReference[] {\n return port\n .paragraphs()\n .flatMap((p) =>\n (p.marks ?? [])\n .filter((m) => m.styleId === BROKEN_CROSS_REFERENCE_STYLE)\n .map((m) => ({ paragraphId: p.id, offset: m.offset, text: m.text }))\n )\n}\n\n/** A new `_Ref` bookmark name: Word's shape (`_Ref` and nine digits), not yet in the document. */\nexport function newRefBookmark(taken: ReadonlySet<string>, random: () => number = Math.random) {\n for (;;) {\n const name = `${REF_BOOKMARK_PREFIX}${String(Math.floor(random() * 9e8) + 1e8)}`\n if (!taken.has(name)) return name\n }\n}\n\nconst styled = (style?: string) => (style ? `<w:rPr><w:rStyle w:val=\"${style}\"/></w:rPr>` : '')\nconst run = (text: string, style?: string) =>\n `<w:r>${styled(style)}<w:t xml:space=\"preserve\">${esc(text)}</w:t></w:r>`\n\n/**\n * A complex `REF` field with its cached result, every run in the Cross Reference style (Word gives\n * an updated result the formatting of the field's first run).\n */\nexport function refFieldXml(instruction: string, cached: string): string {\n const r = (inner: string) => `<w:r>${styled(CROSS_REFERENCE_STYLE)}${inner}</w:r>`\n return `${r('<w:fldChar w:fldCharType=\"begin\"/>')}${r(\n `<w:instrText xml:space=\"preserve\"> ${esc(instruction)} </w:instrText>`\n )}${r('<w:fldChar w:fldCharType=\"separate\"/>')}${run(cached, CROSS_REFERENCE_STYLE)}${r(\n '<w:fldChar w:fldCharType=\"end\"/>'\n )}`\n}\n\n/** The screen tip of a reference to this document: \"Cross-reference to clause 2.2\". */\nexport const refTooltip = (value: string, mode: CrossReferenceMode) =>\n mode === 'number' ? `Cross-reference to clause ${value}` : `Cross-reference to “${value}”`\n\n/**\n * A reference to this document: the `REF` field inside a link to the same bookmark, which carries\n * the screen tip Word shows on hover (\"Cross-reference to clause 2.2\").\n */\nexport function crossReferenceXml(bookmark: string, mode: CrossReferenceMode, value: string) {\n return `<w:hyperlink w:anchor=\"${esc(bookmark)}\" w:tooltip=\"${esc(\n refTooltip(value, mode)\n )}\" w:history=\"1\">${refFieldXml(refInstruction(bookmark, mode), value)}</w:hyperlink>`\n}\n\n/** The field instruction for a target: its paragraph number, or its text. */\nexport const refInstruction = (bookmark: string, mode: CrossReferenceMode) =>\n mode === 'number' ? `REF ${bookmark} \\\\r \\\\h` : `REF ${bookmark} \\\\h`\n\n/** What the reference reads in the text. */\nexport const refResult = (target: CrossReferenceTarget, mode: CrossReferenceMode) =>\n mode === 'number' && target.number ? target.number : target.text\n\nconst allBookmarks = (port: ReferencesPort) =>\n new Set(port.paragraphs().flatMap((p) => p.bookmarks))\n\n/**\n * The `_Ref` bookmark a target carries: an existing one at the paragraph, else a new one. For a\n * paragraph number it is an empty bookmark at the paragraph's start (the number is the\n * paragraph's); for heading text it wraps the heading's runs (REF shows the bookmarked text).\n */\nexport function ensureTargetBookmark(\n port: ReferencesPort,\n target: CrossReferenceTarget,\n mode: CrossReferenceMode\n): string {\n const paragraph = port.paragraphs().find((p) => p.id === target.paragraphId)\n if (!paragraph) throw new Error('That clause is no longer in the document.')\n const existing = paragraph.bookmarks.find((b) => b.startsWith(REF_BOOKMARK_PREFIX))\n if (existing && mode === 'number') return existing\n const name = newRefBookmark(allBookmarks(port))\n const start = `<w:bookmarkStart w:id=\"0\" w:name=\"${name}\"/>`\n const end = '<w:bookmarkEnd w:id=\"0\"/>'\n if (mode === 'number') {\n port.setCaret({ paragraphId: paragraph.id, offset: 0 })\n if (!port.paste(`<w:p>${start}${end}</w:p>`, '', false))\n throw new Error('The cross-reference target could not be marked.')\n return name\n }\n const runs = port.runsXml(paragraph.id)\n if (!runs) throw new Error('This heading cannot be referred to by its text; use its number.')\n // The heading's text is replaced by the same runs inside the bookmark.\n port.deleteRange(\n { paragraphId: paragraph.id, offset: 0 },\n { paragraphId: paragraph.id, offset: paragraph.text.length }\n )\n if (!port.paste(`<w:p>${start}${runs}${end}</w:p>`, paragraph.text, false))\n throw new Error('The cross-reference target could not be marked.')\n return name\n}\n\n/**\n * Where to paste at `caret`. Right after a field the engine would paste INTO the field (its result\n * runs), so a space is typed first and the paste goes after it.\n */\nfunction pastePoint(port: ReferencesPort, caret: DocPoint): DocPoint {\n const paragraph = port.paragraphs().find((p) => p.id === caret.paragraphId)\n if (paragraph?.text[caret.offset - 1] !== FIELD_ATOM) return caret\n port.setCaret(caret)\n port.typeText(' ')\n return { paragraphId: caret.paragraphId, offset: caret.offset + 1 }\n}\n\n/**\n * Mark a cross-reference's target (see {@link ensureTargetBookmark}): what the reference will\n * address and read. A paragraph number falls back to the heading text when it has none. Done as a\n * direct edit even while suggesting — the bookmark is hidden, and a heading's text is put back as\n * it was — so rejecting the reference leaves the target as it was.\n */\nexport function markCrossReferenceTarget(\n port: ReferencesPort,\n target: CrossReferenceTarget,\n mode: CrossReferenceMode\n): { bookmark: string; mode: CrossReferenceMode; value: string } {\n if (mode === 'number' && !target.number) mode = 'text'\n const bookmark = ensureTargetBookmark(port, target, mode)\n return { bookmark, mode, value: refResult(target, mode) }\n}\n\n/**\n * Insert the `REF` field of a marked target at `caret`; the caret ends after it. With a port\n * whose pastes are tracked, the reference is one suggestion.\n */\nexport function insertCrossReferenceField(\n port: ReferencesPort,\n { bookmark, mode, value }: { bookmark: string; mode: CrossReferenceMode; value: string },\n caret: DocPoint\n): { bookmark: string } {\n caret = pastePoint(port, caret)\n port.setCaret(caret)\n if (!port.paste(`<w:p>${crossReferenceXml(bookmark, mode, value)}</w:p>`, value, false))\n throw new Error('The cross-reference could not be inserted.')\n // A field is one character of the paragraph.\n port.setCaret({ paragraphId: caret.paragraphId, offset: caret.offset + 1 })\n return { bookmark }\n}\n\n/** Insert a cross-reference to a target of this document at `caret`; the caret ends after it. */\nexport function insertCrossReference(\n port: ReferencesPort,\n target: CrossReferenceTarget,\n mode: CrossReferenceMode,\n caret: DocPoint\n): { bookmark: string } {\n return insertCrossReferenceField(port, markCrossReferenceTarget(port, target, mode), caret)\n}\n\n/** The screen tip of a reference to another document: \"Cross-reference: SPA, clause 8.2 — opens in ARBI\". */\nexport const documentReferenceTooltip = (text: string, appName = 'ARBI') =>\n `Cross-reference: ${text} — opens in ${appName}`\n\n/**\n * Insert a reference to another document's passage: the reference text in the Cross Reference\n * style, linked to the passage's (absolute) app address, at `caret`.\n */\nexport function insertDocumentReference(\n port: ReferencesPort,\n reference: { text: string; url: string; appName?: string },\n caret: DocPoint\n): void {\n const text = reference.text.trim()\n if (!text) throw new Error('Enter the reference text.')\n const tooltip = documentReferenceTooltip(text, reference.appName).slice(0, 255)\n caret = pastePoint(port, caret)\n port.setCaret(caret)\n const link = `<w:p><w:hyperlink r:id=\"rIdRef1\"${\n tooltip ? ` w:tooltip=\"${esc(tooltip)}\"` : ''\n } w:history=\"1\">${run(text, CROSS_REFERENCE_STYLE)}</w:hyperlink></w:p>`\n if (!port.paste(link, text, false, hyperlinkRelationship('rIdRef1', reference.url)))\n throw new Error('The reference could not be inserted.')\n port.setCaret({ paragraphId: caret.paragraphId, offset: caret.offset + text.length })\n}\n\nexport interface RefreshResult {\n /** References rewritten with their current number or text. */\n refreshed: number\n /** References whose target is gone, now (or already) marked broken. */\n broken: BrokenReference[]\n}\n\n/**\n * Bring every cross-reference up to date: a stale one is replaced by the same reference with its\n * current value (and screen tip); one whose target was deleted becomes its last text in the Cross\n * Reference Broken style — never Word's \"Error! Reference source not found.\" A field directly\n * after another field is left alone: a paste there would land inside the previous field.\n */\nexport function refreshCrossReferences(port: ReferencesPort): RefreshResult {\n const stale = staleCrossReferences(port).sort((a, b) =>\n a.paragraphId === b.paragraphId ? b.offset - a.offset : 0\n )\n let refreshed = 0\n for (const ref of stale) {\n const paragraph = port.paragraphs().find((p) => p.id === ref.paragraphId)\n if (!paragraph || paragraph.text[ref.offset - 1] === FIELD_ATOM) continue\n const at = { paragraphId: ref.paragraphId, offset: ref.offset }\n port.deleteRange(at, { paragraphId: ref.paragraphId, offset: ref.offset + 1 })\n port.setCaret(at)\n const text = ref.value ?? (ref.cached.trim() || ref.bookmark)\n const body =\n ref.value === null\n ? run(text, BROKEN_CROSS_REFERENCE_STYLE)\n : crossReferenceXml(ref.bookmark, ref.mode, ref.value)\n if (port.paste(`<w:p>${body}</w:p>`, text, false) && ref.value !== null) refreshed++\n }\n return { refreshed, broken: brokenCrossReferences(port) }\n}\n\ntype Attr = { localName: string; value: string; prefix?: string }\ntype Element = OoxmlNodeLike & { prefix?: string }\n\n/** Run content a heading may hold and still be rewritten as runs. */\nconst RUN_PARTS = new Set(['rPr', 't', 'tab', 'br', 'lastRenderedPageBreak'])\n/** Paragraph children that are not content (kept out of the rewrite). */\nconst SKIPPED = new Set(['pPr', 'bookmarkStart', 'bookmarkEnd', 'proofErr', 'permStart', 'permEnd'])\n\nfunction serialize(node: Element): string {\n if (node.kind === 'textValue') return esc(node.value ?? '')\n const name = `${node.prefix ?? 'w'}:${node.localName}`\n const attrs = ((node.attributes ?? []) as readonly Attr[])\n .map((a) => ` ${a.prefix ? `${a.prefix}:` : ''}${a.localName}=\"${esc(a.value)}\"`)\n .join('')\n const children = (node.children ?? []).map((c) => serialize(c as Element)).join('')\n return children ? `<${name}${attrs}>${children}</${name}>` : `<${name}${attrs}/>`\n}\n\n/** A paragraph's runs as XML (formatting kept), or null for anything but plain runs. */\nexport function paragraphRunsXml(paragraph: OoxmlNodeLike): string | null {\n const runs: string[] = []\n for (const child of (paragraph.children ?? []) as Element[]) {\n if (child.localName && SKIPPED.has(child.localName)) continue\n if (child.localName !== 'r') return null\n if ((child.children ?? []).some((c) => !c.localName || !RUN_PARTS.has(c.localName))) return null\n runs.push(serialize(child))\n }\n return runs.length ? runs.join('') : null\n}\n","/**\n * A small mutable XML tree over core's hardened reader (`readXml`: no DTDs or entities, bounded),\n * for rewriting WordprocessingML parts. Names are qualified as written (`w:style`); every part this\n * module edits is written by Word, LibreOffice or this engine with the conventional prefixes, and\n * `readPart` refuses a part whose `w` prefix is bound elsewhere rather than editing it blind.\n */\nimport { readXml } from '@docx-editor.dev/core/store'\n\nexport const W_NS = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'\nexport const R_NS = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'\n\nexport interface El {\n name: string\n attrs: Record<string, string>\n children: Node[]\n}\nexport type Node = El | string\n\nexport class TemplateError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'TemplateError'\n }\n}\n\n/** Parse one part. Text is decoded; comments and the declaration are dropped. */\nexport function parse(xml: string, part = 'part'): El {\n const read = readXml(xml, { maxBytes: 64 * 1024 * 1024, maxElements: 2_000_000 })\n if (!read.ok) throw new TemplateError(`${part} is not readable XML (${read.reason})`)\n const convert = (node: (typeof read.nodes)[number]): Node =>\n node.type === 'text'\n ? node.value\n : { name: node.name, attrs: { ...node.attributes }, children: node.children.map(convert) }\n const root = read.nodes.map(convert).find((n): n is El => typeof n !== 'string')\n if (!root) throw new TemplateError(`${part} has no root element`)\n const w = root.attrs['xmlns:w']\n if (w !== undefined && w !== W_NS) throw new TemplateError(`${part} binds w: to ${w}`)\n return root\n}\n\nconst escText = (s: string) => s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\nconst escAttr = (s: string) => escText(s).replace(/\"/g, '"')\n\nexport function serialize(root: El): string {\n const out: string[] = ['<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n']\n const walk = (node: Node) => {\n if (typeof node === 'string') return void out.push(escText(node))\n out.push('<', node.name)\n for (const [k, v] of Object.entries(node.attrs)) out.push(' ', k, '=\"', escAttr(v), '\"')\n if (node.children.length === 0) return void out.push('/>')\n out.push('>')\n node.children.forEach(walk)\n out.push('</', node.name, '>')\n }\n walk(root)\n return out.join('')\n}\n\nexport const el = (\n name: string,\n attrs: Record<string, string> = {},\n children: Node[] = []\n): El => ({\n name,\n attrs,\n children,\n})\nexport const isEl = (n: Node | undefined): n is El => typeof n === 'object' && n !== null\nexport const kids = (e: El, name?: string): El[] =>\n e.children.filter((c): c is El => isEl(c) && (name === undefined || c.name === name))\nexport const kid = (e: El | undefined, name: string): El | undefined =>\n e ? kids(e, name)[0] : undefined\n/** `w:val` of a child, e.g. `val(style, 'w:basedOn')`. */\nexport const val = (e: El | undefined, name: string): string | undefined =>\n kid(e, name)?.attrs['w:val']\n\n/** Every descendant element (depth-first, document order), the root included. */\nexport function* walk(e: El): Generator<El> {\n yield e\n for (const c of e.children) if (isEl(c)) yield* walk(c)\n}\n\nexport const clone = <T extends Node>(n: T): T =>\n (typeof n === 'string'\n ? n\n : { name: n.name, attrs: { ...n.attrs }, children: n.children.map(clone) }) as T\n\n/** Text of an element's `w:t` descendants. */\nexport const textOf = (e: El): string =>\n [...walk(e)]\n .filter((x) => x.name === 'w:t')\n .map((x) => x.children.filter((c): c is string => typeof c === 'string').join(''))\n .join('')\n","/**\n * A DOCX/DOTX as a map of part names to bytes, with the OPC plumbing a merge needs: content types,\n * relationships, and resolving a relationship's target to a part name.\n */\nimport { strFromU8, strToU8, unzipSync, zipSync } from 'fflate'\nimport { el, kids, parse, serialize, TemplateError, type El } from './xml'\n\nconst REL = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'\nexport const RT = {\n officeDocument: `${REL}/officeDocument`,\n styles: `${REL}/styles`,\n numbering: `${REL}/numbering`,\n theme: `${REL}/theme`,\n fontTable: `${REL}/fontTable`,\n settings: `${REL}/settings`,\n header: `${REL}/header`,\n footer: `${REL}/footer`,\n image: `${REL}/image`,\n hyperlink: `${REL}/hyperlink`,\n glossary: `${REL}/glossaryDocument`,\n attachedTemplate: `${REL}/attachedTemplate`,\n} as const\nconst WML = 'application/vnd.openxmlformats-officedocument.wordprocessingml'\nexport const CT = {\n document: `${WML}.document.main+xml`,\n template: `${WML}.template.main+xml`,\n macroDocument: 'application/vnd.ms-word.document.macroEnabled.main+xml',\n macroTemplate: 'application/vnd.ms-word.template.macroEnabledTemplate.main+xml',\n styles: `${WML}.styles+xml`,\n numbering: `${WML}.numbering+xml`,\n settings: `${WML}.settings+xml`,\n fontTable: `${WML}.fontTable+xml`,\n header: `${WML}.header+xml`,\n footer: `${WML}.footer+xml`,\n glossary: `${WML}.document.glossary+xml`,\n theme: 'application/vnd.openxmlformats-officedocument.theme+xml',\n rels: 'application/vnd.openxmlformats-package.relationships+xml',\n} as const\n\nexport interface Rel {\n id: string\n type: string\n target: string\n external: boolean\n}\n\n/** Part names are kept without the leading slash, as the zip stores them. */\nexport class Pkg {\n readonly files: Map<string, Uint8Array>\n private types: El\n\n constructor(files: Map<string, Uint8Array>) {\n this.files = files\n const ct = this.find('[Content_Types].xml')\n if (!ct) throw new TemplateError('not a Word package: no [Content_Types].xml')\n this.types = parse(strFromU8(files.get(ct)!), '[Content_Types].xml')\n }\n\n static read(bytes: Uint8Array): Pkg {\n let files: Record<string, Uint8Array>\n try {\n files = unzipSync(bytes)\n } catch {\n throw new TemplateError('not a Word package: not a zip')\n }\n return new Pkg(new Map(Object.entries(files).filter(([n]) => !n.endsWith('/'))))\n }\n\n write(): Uint8Array {\n this.files.set(\n this.find('[Content_Types].xml') ?? '[Content_Types].xml',\n strToU8(serialize(this.types))\n )\n return zipSync(Object.fromEntries(this.files), { level: 6 })\n }\n\n /** The stored name of a part, matched case-insensitively as OPC does. */\n find(name: string): string | undefined {\n const key = name.replace(/^\\//, '').toLowerCase()\n for (const n of this.files.keys()) if (n.toLowerCase() === key) return n\n return undefined\n }\n has(name: string) {\n return this.find(name) !== undefined\n }\n text(name: string): string | undefined {\n const n = this.find(name)\n return n === undefined ? undefined : strFromU8(this.files.get(n)!)\n }\n xml(name: string): El | undefined {\n const t = this.text(name)\n return t === undefined ? undefined : parse(t, name)\n }\n setXml(name: string, root: El, contentType?: string) {\n this.files.set(this.find(name) ?? name, strToU8(serialize(root)))\n if (contentType) this.setContentType(name, contentType)\n }\n setBytes(name: string, bytes: Uint8Array, contentType?: string) {\n this.files.set(this.find(name) ?? name, bytes)\n if (contentType) this.setContentType(name, contentType)\n }\n remove(name: string) {\n const n = this.find(name)\n if (n === undefined) return\n this.files.delete(n)\n this.types.children = this.types.children.filter(\n (c) =>\n !(\n typeof c !== 'string' &&\n c.name === 'Override' &&\n c.attrs.PartName.toLowerCase() === `/${n.toLowerCase()}`\n )\n )\n this.files.delete(relsName(n))\n }\n\n contentType(name: string): string | undefined {\n const part = `/${name.replace(/^\\//, '')}`.toLowerCase()\n const override = kids(this.types, 'Override').find(\n (o) => o.attrs.PartName.toLowerCase() === part\n )\n if (override) return override.attrs.ContentType\n const ext = part.slice(part.lastIndexOf('.') + 1)\n return kids(this.types, 'Default').find((d) => d.attrs.Extension.toLowerCase() === ext)?.attrs\n .ContentType\n }\n setContentType(name: string, type: string) {\n const part = `/${name.replace(/^\\//, '')}`\n const override = kids(this.types, 'Override').find(\n (o) => o.attrs.PartName.toLowerCase() === part.toLowerCase()\n )\n if (override) override.attrs.ContentType = type\n else this.types.children.push(el('Override', { PartName: part, ContentType: type }))\n }\n /** A `Default` for an extension (media), unless one exists. */\n ensureDefault(ext: string, type: string) {\n if (\n !kids(this.types, 'Default').some(\n (d) => d.attrs.Extension.toLowerCase() === ext.toLowerCase()\n )\n )\n this.types.children.unshift(el('Default', { Extension: ext, ContentType: type }))\n }\n\n rels(owner: string): Rel[] {\n const root = this.xml(relsName(owner))\n if (!root) return []\n return kids(root, 'Relationship').map((r) => ({\n id: r.attrs.Id,\n type: r.attrs.Type,\n target: r.attrs.Target,\n external: r.attrs.TargetMode === 'External',\n }))\n }\n setRels(owner: string, rels: Rel[]) {\n const root = el(\n 'Relationships',\n { xmlns: 'http://schemas.openxmlformats.org/package/2006/relationships' },\n rels.map((r) =>\n el('Relationship', {\n Id: r.id,\n Type: r.type,\n Target: r.target,\n ...(r.external ? { TargetMode: 'External' } : {}),\n })\n )\n )\n this.setXml(relsName(owner), root)\n }\n /** Add a relationship from `owner`; returns its new id. */\n addRel(owner: string, type: string, target: string, external = false): string {\n const rels = this.rels(owner)\n const id = freshId(new Set(rels.map((r) => r.id)), 'rIdT')\n rels.push({ id, type, target, external })\n this.setRels(owner, rels)\n return id\n }\n\n /** The part a relationship of `owner` points at (internal targets only). */\n target(owner: string, rel: Rel): string {\n return resolveTarget(owner, rel.target)\n }\n /** The first internal part of a relationship type from `owner`. */\n partOf(owner: string, type: string): string | undefined {\n const rel = this.rels(owner).find((r) => r.type === type && !r.external)\n return rel && this.find(this.target(owner, rel))\n }\n /** The main document part (`word/document.xml` by convention). */\n get main(): string {\n const main = this.partOf('', RT.officeDocument)\n if (!main) throw new TemplateError('not a Word package: no main document part')\n return main\n }\n}\n\n/** `word/document.xml` → `word/_rels/document.xml.rels`; '' (the package) → `_rels/.rels`. */\nfunction relsName(owner: string): string {\n const slash = owner.lastIndexOf('/')\n return `${owner.slice(0, slash + 1)}_rels/${owner.slice(slash + 1)}.rels`\n}\n\nfunction resolveTarget(owner: string, target: string): string {\n if (target.startsWith('/')) return target.slice(1)\n const base = owner\n .slice(0, owner.lastIndexOf('/') + 1)\n .split('/')\n .filter(Boolean)\n for (const seg of target.split('/')) {\n if (seg === '..') base.pop()\n else if (seg !== '.' && seg !== '') base.push(seg)\n }\n return base.join('/')\n}\n\n/** A target for `part` relative to `owner`'s folder. */\nexport function relativeTarget(owner: string, part: string): string {\n const from = owner.slice(0, owner.lastIndexOf('/') + 1)\n return part.startsWith(from) ? part.slice(from.length) : `/${part}`\n}\n\nfunction freshId(taken: ReadonlySet<string>, prefix: string): string {\n for (let i = 1; ; i++) if (!taken.has(`${prefix}${i}`)) return `${prefix}${i}`\n}\n\n/** An unused part name like `word/header3.xml` / `word/media/image2.png`. */\nexport function freshPartName(pkg: Pkg, folder: string, stem: string, ext: string): string {\n for (let i = 1; ; i++) {\n const name = `${folder}${stem}${i}.${ext}`\n if (!pkg.has(name)) return name\n }\n}\n","/**\n * A fragment package marked as one tracked insertion, so that pasting it while suggesting lands a\n * change to review rather than an untracked edit. The editor's paste keeps `w:ins` from a\n * fragment (renumbering its id), and accepting or rejecting the change takes the whole insertion.\n */\nimport { Pkg } from './pkg'\nimport { el, isEl, kid, type El } from './xml'\n\n/** Who made a tracked change and when (`w:author`, `w:date`). */\nexport interface Revision {\n author: string\n /** ISO 8601, seconds precision, e.g. `2026-10-19T09:30:00Z`. */\n date: string\n}\n\n/** Already tracked in the fragment: left as they are. */\nconst TRACKED = new Set(['w:ins', 'w:del', 'w:moveFrom', 'w:moveTo'])\n\n/**\n * The fragment with every run wrapped in `w:ins` and every new paragraph mark marked inserted. A\n * table row is marked inserted as a whole, its cells left as they are: the editor rejects an\n * inserted row whose content is tracked as well only partly. A run is not descended into, so a\n * text box goes in with its run. `covered`: the fragment's last paragraph mark is pasted too (a\n * block before the caret's paragraph); otherwise the last paragraph runs into the text after the\n * caret and its mark is not new.\n */\nexport function trackInsertion(\n fragment: Uint8Array,\n revision: Revision,\n covered: boolean\n): Uint8Array {\n const pkg = Pkg.read(fragment)\n const main = pkg.main\n const root = pkg.xml(main)\n const body = kid(root, 'w:body')\n if (!root || !body) return fragment\n const attrs = { 'w:id': '1', 'w:author': revision.author, 'w:date': revision.date }\n const lastParagraph = body.children.filter(isEl).findLast((c) => c.name === 'w:p')\n\n const visit = (node: El) => {\n node.children = node.children.map((child) => {\n if (!isEl(child)) return child\n if (child.name === 'w:r') return TRACKED.has(node.name) ? child : el('w:ins', attrs, [child])\n if (TRACKED.has(child.name)) return child\n if (child.name === 'w:tr') {\n markRow(child, attrs)\n return child\n }\n visit(child)\n if (child.name === 'w:p' && (covered || child !== lastParagraph)) markParagraph(child, attrs)\n return child\n })\n }\n visit(body)\n pkg.setXml(main, root)\n return pkg.write()\n}\n\n/** `w:pPr/w:rPr/w:ins`: the paragraph mark is inserted (`w:ins` comes first in `CT_ParaRPr`). */\nfunction markParagraph(p: El, attrs: Record<string, string>) {\n let pPr = kid(p, 'w:pPr')\n if (!pPr) p.children.unshift((pPr = el('w:pPr')))\n let rPr = kid(pPr, 'w:rPr')\n if (!rPr) {\n rPr = el('w:rPr')\n // Before `w:sectPr` and `w:pPrChange`, which close `CT_PPr`.\n const at = pPr.children.findIndex(\n (c) => isEl(c) && (c.name === 'w:sectPr' || c.name === 'w:pPrChange')\n )\n pPr.children.splice(at < 0 ? pPr.children.length : at, 0, rPr)\n }\n if (!kid(rPr, 'w:ins')) rPr.children.unshift(el('w:ins', attrs))\n}\n\n/** `w:trPr/w:ins`: the table row is inserted (after the row properties, before `w:trPrChange`). */\nfunction markRow(tr: El, attrs: Record<string, string>) {\n let trPr = kid(tr, 'w:trPr')\n if (!trPr) {\n trPr = el('w:trPr')\n const after = tr.children.findIndex((c) => isEl(c) && c.name === 'w:tblPrEx')\n tr.children.splice(after + 1, 0, trPr)\n }\n if (kid(trPr, 'w:ins')) return\n const at = trPr.children.findIndex((c) => isEl(c) && c.name === 'w:trPrChange')\n trPr.children.splice(at < 0 ? trPr.children.length : at, 0, el('w:ins', attrs))\n}\n","/**\n * Defined-term and cross-reference content as WordprocessingML, and the clipboard fragment (a small\n * `.docx` package) that carries it into a document. The engine has no \"insert bookmark\" command, but\n * its paste lands an embedded fragment with everything in it — `w:bookmarkStart`/`w:bookmarkEnd` and\n * `w:hyperlink w:anchor` included — freshening bookmark ids as it goes.\n */\n\nimport { docxPackage, documentXml, esc, stylesXml } from './ooxml'\nimport { trackInsertion, type Revision } from '../template/track'\nimport {\n BROKEN_CROSS_REFERENCE_STYLE,\n CROSS_REFERENCE_STYLE,\n DEFINED_TERM_STYLE,\n type OoxmlNodeLike,\n} from './read'\nimport type { ParsedDefinition } from './terms'\n\ntype Definition = Pick<ParsedDefinition, 'term' | 'rest'>\n\n/**\n * The character styles the inserted content uses. A paste brings a style the document does not\n * define; one it already defines (a house template's) is used as it is, so only the missing ones\n * go into a fragment (see {@link stylesUsed}).\n */\nexport const CHARACTER_STYLES: Record<string, string> = {\n [DEFINED_TERM_STYLE]: `<w:style w:type=\"character\" w:customStyle=\"1\" w:styleId=\"${DEFINED_TERM_STYLE}\"><w:name w:val=\"Defined Term\"/><w:rPr><w:u w:val=\"dotted\" w:color=\"7F7F7F\"/></w:rPr></w:style>`,\n [CROSS_REFERENCE_STYLE]: `<w:style w:type=\"character\" w:customStyle=\"1\" w:styleId=\"${CROSS_REFERENCE_STYLE}\"><w:name w:val=\"Cross Reference\"/><w:rPr><w:color w:val=\"1F4E79\"/><w:u w:val=\"dotted\" w:color=\"8EA9C1\"/></w:rPr></w:style>`,\n [BROKEN_CROSS_REFERENCE_STYLE]: `<w:style w:type=\"character\" w:customStyle=\"1\" w:styleId=\"${BROKEN_CROSS_REFERENCE_STYLE}\"><w:name w:val=\"Cross Reference Broken\"/><w:basedOn w:val=\"${CROSS_REFERENCE_STYLE}\"/><w:rPr><w:color w:val=\"C00000\"/><w:u w:val=\"wave\" w:color=\"C00000\"/></w:rPr></w:style>`,\n}\n\n/** The character styles a fragment's runs use (`w:rStyle`), as ids. */\nexport function stylesUsed(body: string): string[] {\n return [...new Set([...body.matchAll(/<w:rStyle w:val=\"([^\"]+)\"/g)].map((m) => m[1]))]\n}\n\n// No document defaults: the paste writes a fragment's defaults onto its runs as direct formatting,\n// and pasted terms and definitions should take the formatting of the document they land in.\nconst fragmentStyles = (ids: readonly string[]) =>\n stylesXml(\n '',\n `<w:style w:type=\"paragraph\" w:default=\"1\" w:styleId=\"Normal\"><w:name w:val=\"Normal\"/><w:qFormat/></w:style>${ids\n .map((id) => CHARACTER_STYLES[id] ?? '')\n .join('')}`\n )\n\nconst textRun = (text: string, props = '') =>\n `<w:r>${props ? `<w:rPr>${props}</w:rPr>` : ''}<w:t xml:space=\"preserve\">${esc(text)}</w:t></w:r>`\n\n/** What Word shows on hover over a term: its definition, as one line of at most 255 characters. */\nexport function definitionTooltip(definition: Definition): string {\n const line = `“${definition.term}”${definition.rest}`.replace(/\\s+/g, ' ').trim()\n return line.length > 255 ? `${line.slice(0, 254)}…` : line\n}\n\n/** The definition paragraph's text as the document shows it: `“Shares” means the issued shares.` */\nexport const definitionParagraphText = (definition: Definition) =>\n `“${definition.term}”${definition.rest}`\n\n/**\n * A definition paragraph: the quoted term in bold, bookmarked (`bookmark`), then the definition as\n * the fact writes it. `id` is the bookmark id inside the fragment; the paste renumbers it.\n */\nexport function definitionParagraphXml(definition: Definition, bookmark: string, id = 0): string {\n return `<w:p><w:bookmarkStart w:id=\"${id}\" w:name=\"${esc(bookmark)}\"/>${textRun('“')}${textRun(\n definition.term,\n '<w:b/>'\n )}${textRun('”')}<w:bookmarkEnd w:id=\"${id}\"/>${textRun(definition.rest)}</w:p>`\n}\n\n/** A heading paragraph: the document's own heading style when it has one, else bold text. */\nexport function headingParagraphXml(text: string, styleId?: string): string {\n return styleId\n ? `<w:p><w:pPr><w:pStyle w:val=\"${esc(styleId)}\"/></w:pPr>${textRun(text)}</w:p>`\n : `<w:p><w:pPr><w:keepNext/></w:pPr>${textRun(text, '<w:b/>')}</w:p>`\n}\n\n/** The term as an internal link to its definition's bookmark, with the definition as its tooltip. */\nexport function termLinkXml(term: string, bookmark: string, tooltip: string): string {\n return `<w:p><w:hyperlink w:anchor=\"${esc(bookmark)}\" w:tooltip=\"${esc(tooltip)}\" w:history=\"1\">${textRun(\n term,\n `<w:rStyle w:val=\"${DEFINED_TERM_STYLE}\"/>`\n )}</w:hyperlink></w:p>`\n}\n\n/**\n * The fragment package carrying `body` (paragraph XML). `covered` says the last paragraph mark is\n * part of it: the paste then ends with a whole paragraph (a block inserted before the caret's\n * paragraph) instead of running into the text after the caret (inline). With a `revision`, the\n * fragment is one tracked insertion by it.\n */\nexport function fragmentPackage(\n body: string,\n covered: boolean,\n {\n revision,\n relationships,\n styles = stylesUsed(body),\n }: {\n revision?: Revision | null\n /** Relationships the body refers to (a hyperlink's target). */\n relationships?: string\n /** The character styles to bring (default: every one the body uses). */\n styles?: readonly string[]\n } = {}\n): Uint8Array {\n const untracked = docxPackage({\n document: documentXml(body),\n styles: fragmentStyles(styles),\n title: 'Defined terms',\n relationships,\n })\n return revision ? trackInsertion(untracked, revision, covered) : untracked\n}\n\nconst attr = (node: OoxmlNodeLike, name: string) =>\n node.attributes?.find((a) => a.localName === name)?.value\n\n/** The style ids a document's styles part defines. */\nexport function documentStyleIds(root: OoxmlNodeLike | null | undefined): Set<string> {\n const ids = new Set<string>()\n for (const style of root?.children ?? [])\n if (style.localName === 'style') {\n const id = attr(style, 'styleId')\n if (id) ids.add(id)\n }\n return ids\n}\n","/**\n * Paragraph text as one rich-text string.\n *\n * Why: the OOXML tree splits a run whenever formatting or a tracked change starts in the middle of\n * it, and a tree CRDT can only express that as \"delete the suffix here, insert a copy there\". When\n * two people do it to the same run at once, both copies survive and the text is duplicated. Here a\n * paragraph's characters live in a single Y.Text and everything that used to split them (run\n * properties, tracked-change and hyperlink wrappers, the shape of a text element) is an attribute on\n * a range of it, so a split only moves a boundary and never moves a character.\n *\n * A unit is one UTF-16 code unit of text, or one embedded element (a tab, a break, a field\n * character, a drawing, a bookmark...). Its attributes say which run, which wrappers and which text\n * element it belongs to. `encodeParagraph` returns null for a paragraph this model cannot hold\n * exactly, and the caller then keeps that paragraph as a plain element tree.\n */\nimport type * as Y from 'yjs'\n\nexport const WML = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'\n\nexport interface XmlAttr {\n ns: string\n local: string\n prefix?: string\n value: string\n}\n\nexport interface XmlBinding {\n prefix: string\n ns: string\n}\n\n/** A plain element: the generic shape the mirror stores, with text nodes as strings. */\nexport interface XmlEl {\n ns: string\n local: string\n prefix?: string\n attrs: XmlAttr[]\n bindings: XmlBinding[]\n children: (XmlEl | string)[]\n /** Identity of a run or wrapper, so two neighbours with equal properties stay two elements. Not XML. */\n _id?: string\n}\n\n/** An element without its children, as carried in an attribute. */\ninterface ElDesc {\n ns: string\n local: string\n prefix?: string\n attrs: XmlAttr[]\n bindings: XmlBinding[]\n}\n\ninterface WrapperDesc extends ElDesc {\n /** Children that come before the inline content (an inline content control's properties). */\n head: XmlEl[]\n id: string\n}\n\ninterface UnitAttrs {\n /** The run's `w:rPr`, or null when it has none. */\n r: XmlEl | null\n /** The run element itself, without children. */\n ra: ElDesc | null\n /** Which run: stays the same when the run is split, so neighbours with equal properties never merge. */\n ri: string | null\n /** Wrappers around the run, outermost first. */\n w: WrapperDesc[]\n /** The text element this character sits in (`w:t`, `w:delText`, `w:instrText`). */\n tx: ElDesc | null\n /** 'a' for an atom placed directly in the paragraph or a wrapper, 'e' for an empty run. */\n k: 'a' | 'e' | null\n}\n\nexport interface Unit {\n /** One UTF-16 code unit, or an embedded element. */\n v: string | { x: XmlEl }\n a: UnitAttrs\n}\n\nexport interface EncodedParagraph {\n /** Children that precede the inline content: the paragraph properties. */\n head: XmlEl[]\n units: Unit[]\n}\n\nconst WRAPPERS = new Set([\n 'ins',\n 'del',\n 'moveFrom',\n 'moveTo',\n 'hyperlink',\n 'smartTag',\n 'fldSimple',\n 'customXml',\n 'dir',\n 'bdo',\n 'sdtContent',\n])\nconst TEXT_ELEMENTS = new Set(['t', 'delText', 'instrText'])\n\nconst isEl = (n: XmlEl | string): n is XmlEl => typeof n !== 'string'\nconst isWml = (el: XmlEl, local: string): boolean => el.ns === WML && el.local === local\n\nfunction describe(el: XmlEl): ElDesc {\n const desc: ElDesc = { ns: el.ns, local: el.local, attrs: el.attrs, bindings: el.bindings }\n if (el.prefix !== undefined) desc.prefix = el.prefix\n return desc\n}\n\nfunction withChildren(desc: ElDesc, children: (XmlEl | string)[], id?: string): XmlEl {\n const el: XmlEl = {\n ns: desc.ns,\n local: desc.local,\n attrs: desc.attrs,\n bindings: desc.bindings,\n children,\n }\n if (desc.prefix !== undefined) el.prefix = desc.prefix\n if (id !== undefined) el._id = id\n return el\n}\n\nlet counter = 0\n/** A fresh run or wrapper identity. */\nexport function newRunId(): string {\n counter += 1\n return `${Math.random().toString(36).slice(2, 8)}${counter.toString(36)}`\n}\n\nclass Unrepresentable extends Error {}\n\nfunction fail(): never {\n throw new Unrepresentable()\n}\n\nfunction encodeRun(run: XmlEl, wrappers: WrapperDesc[], out: Unit[]): void {\n const children = run.children\n let rPr: XmlEl | null = null\n let start = 0\n const first = children[0]\n if (first !== undefined && isEl(first) && isWml(first, 'rPr')) {\n rPr = first\n start = 1\n }\n const base = { r: rPr, ra: describe(run), ri: run._id ?? newRunId(), w: wrappers }\n let produced = false\n for (let i = start; i < children.length; i++) {\n const child = children[i]\n if (!isEl(child)) fail()\n const only = child.children[0]\n if (\n child.ns === WML &&\n TEXT_ELEMENTS.has(child.local) &&\n child.children.length === 1 &&\n typeof only === 'string' &&\n only.length > 0\n ) {\n const tx = describe(child)\n for (let c = 0; c < only.length; c++) out.push({ v: only[c], a: { ...base, tx, k: null } })\n } else {\n out.push({ v: { x: child }, a: { ...base, tx: null, k: null } })\n }\n produced = true\n }\n if (!produced)\n out.push({\n v: { x: { ns: WML, local: 'e', attrs: [], bindings: [], children: [] } },\n a: { ...base, tx: null, k: 'e' },\n })\n}\n\nfunction encodeInline(children: (XmlEl | string)[], wrappers: WrapperDesc[], out: Unit[]): void {\n for (const child of children) {\n if (!isEl(child)) fail()\n if (child.ns === WML && child.local === 'r') {\n encodeRun(child, wrappers, out)\n } else if (child.ns === WML && WRAPPERS.has(child.local)) {\n const before = out.length\n const desc: WrapperDesc = { ...describe(child), head: [], id: child._id ?? newRunId() }\n let ok = true\n const inner: Unit[] = []\n try {\n encodeInline(child.children, [...wrappers, desc], inner)\n } catch (error) {\n if (!(error instanceof Unrepresentable)) throw error\n ok = false\n }\n if (ok && inner.length > 0) out.push(...inner)\n else {\n out.length = before\n out.push(atom(child, wrappers))\n }\n } else if (child.ns === WML && child.local === 'sdt') {\n const last = child.children[child.children.length - 1]\n const head = child.children.slice(0, -1)\n if (last !== undefined && isEl(last) && isWml(last, 'sdtContent') && head.every(isEl)) {\n const before = out.length\n const sdt: WrapperDesc = {\n ...describe(child),\n head: head as XmlEl[],\n id: child._id ?? newRunId(),\n }\n const content: WrapperDesc = { ...describe(last), head: [], id: last._id ?? newRunId() }\n const inner: Unit[] = []\n let ok = true\n try {\n encodeInline(last.children, [...wrappers, sdt, content], inner)\n } catch (error) {\n if (!(error instanceof Unrepresentable)) throw error\n ok = false\n }\n if (ok && inner.length > 0) out.push(...inner)\n else {\n out.length = before\n out.push(atom(child, wrappers))\n }\n } else out.push(atom(child, wrappers))\n } else {\n out.push(atom(child, wrappers))\n }\n }\n}\n\nfunction atom(el: XmlEl, wrappers: WrapperDesc[]): Unit {\n return { v: { x: el }, a: { r: null, ra: null, ri: null, w: wrappers, tx: null, k: 'a' } }\n}\n\n/** Encode a paragraph's children, or null when the paragraph cannot be held exactly. */\nexport function encodeParagraph(children: (XmlEl | string)[]): EncodedParagraph | null {\n const head: XmlEl[] = []\n let start = 0\n const first = children[0]\n if (first !== undefined && isEl(first) && isWml(first, 'pPr')) {\n head.push(first)\n start = 1\n }\n const units: Unit[] = []\n try {\n encodeInline(children.slice(start), [], units)\n } catch (error) {\n if (error instanceof Unrepresentable) return null\n throw error\n }\n return { head, units }\n}\n\nconst same = (a: unknown, b: unknown): boolean => JSON.stringify(a) === JSON.stringify(b)\n\nfunction decodeRange(units: Unit[], from: number, to: number, depth: number): XmlEl[] {\n const out: XmlEl[] = []\n let i = from\n while (i < to) {\n const unit = units[i]\n const { w } = unit.a\n if (w.length > depth) {\n const wrapper = w[depth]\n let j = i + 1\n while (j < to && units[j].a.w.length > depth && same(units[j].a.w[depth], wrapper)) j++\n out.push(\n withChildren(wrapper, [...wrapper.head, ...decodeRange(units, i, j, depth + 1)], wrapper.id)\n )\n i = j\n } else if (unit.a.k === 'a') {\n out.push((unit.v as { x: XmlEl }).x)\n i++\n } else {\n let j = i + 1\n // An empty run stands alone, so it never merges into a neighbour with the same properties.\n while (\n unit.a.k !== 'e' &&\n j < to &&\n units[j].a.w.length === depth &&\n units[j].a.k !== 'a' &&\n units[j].a.k !== 'e' &&\n units[j].a.ri === unit.a.ri &&\n same(units[j].a.r, unit.a.r) &&\n same(units[j].a.ra, unit.a.ra)\n ) {\n j++\n }\n out.push(decodeRun(units, i, j))\n i = j\n }\n }\n return out\n}\n\nfunction decodeRun(units: Unit[], from: number, to: number): XmlEl {\n const { r, ra } = units[from].a\n const children: (XmlEl | string)[] = []\n if (r) children.push(r)\n let i = from\n while (i < to) {\n const unit = units[i]\n if (unit.a.k === 'e') {\n i++\n } else if (typeof unit.v === 'string') {\n let j = i + 1\n while (j < to && typeof units[j].v === 'string' && same(units[j].a.tx, unit.a.tx)) j++\n let text = ''\n for (let c = i; c < j; c++) text += units[c].v as string\n children.push(withChildren(unit.a.tx as ElDesc, [text]))\n i = j\n } else {\n children.push(unit.v.x)\n i++\n }\n }\n return withChildren(ra as ElDesc, children, units[from].a.ri ?? undefined)\n}\n\n/** The children a paragraph's units stand for, after its properties. */\nexport function decodeInline(units: Unit[]): XmlEl[] {\n return decodeRange(units, 0, units.length, 0)\n}\n\nexport function decodeParagraph(encoded: EncodedParagraph): (XmlEl | string)[] {\n return [...encoded.head, ...decodeInline(encoded.units)]\n}\n\n// ── Y.Text input and output ────────────────────────────────────────────────\n\nconst KEYS = ['r', 'ra', 'ri', 'w', 'tx', 'k'] as const\n\nfunction toAttributes(a: UnitAttrs): Record<string, unknown> {\n const out: Record<string, unknown> = {}\n for (const key of KEYS) {\n const value = a[key]\n if (value !== null && !(key === 'w' && (value as unknown[]).length === 0)) out[key] = value\n }\n return out\n}\n\nfunction fromAttributes(attributes: Record<string, unknown> | undefined): UnitAttrs {\n const a = attributes ?? {}\n return {\n r: (a.r as XmlEl | undefined) ?? null,\n ra: (a.ra as ElDesc | undefined) ?? null,\n ri: (a.ri as string | undefined) ?? null,\n w: (a.w as WrapperDesc[] | undefined) ?? [],\n tx: (a.tx as ElDesc | undefined) ?? null,\n k: (a.k as UnitAttrs['k'] | undefined) ?? null,\n }\n}\n\n/** The units a Y.Text currently holds. */\nexport function readUnits(text: Y.Text): Unit[] {\n const units: Unit[] = []\n for (const op of text.toDelta() as {\n insert: string | { x: XmlEl }\n attributes?: Record<string, unknown>\n }[]) {\n const a = fromAttributes(op.attributes)\n if (typeof op.insert === 'string') {\n for (let i = 0; i < op.insert.length; i++) units.push({ v: op.insert[i], a })\n } else {\n units.push({ v: op.insert, a })\n }\n }\n return units\n}\n\nconst valueKeyOf = (u: Unit): string => (typeof u.v === 'string' ? u.v : JSON.stringify(u.v))\nconst attrsKeyOf = (u: Unit): string => JSON.stringify(u.a)\n\ntype DeltaOp = {\n retain?: number\n delete?: number\n insert?: string | object\n attributes?: Record<string, unknown>\n}\n\nfunction attributeChange(from: UnitAttrs, to: UnitAttrs): Record<string, unknown> {\n const a = toAttributes(from)\n const b = toAttributes(to)\n const change: Record<string, unknown> = {}\n for (const key of KEYS) {\n if (JSON.stringify(a[key]) !== JSON.stringify(b[key])) change[key] = b[key] ?? null\n }\n return change\n}\n\nfunction pushRetain(delta: DeltaOp[], length: number, attributes?: Record<string, unknown>): void {\n if (length === 0) return\n const last = delta[delta.length - 1]\n const empty = !attributes || Object.keys(attributes).length === 0\n if (last && last.retain !== undefined && !last.attributes && empty) {\n last.retain += length\n return\n }\n delta.push(empty ? { retain: length } : { retain: length, attributes })\n}\n\n/** Retain `length` units, reformatting where the attributes of `previous` and `next` differ. */\nfunction reformat(\n delta: DeltaOp[],\n previous: Unit[],\n from: number,\n next: Unit[],\n to: number,\n length: number\n): void {\n let i = 0\n while (i < length) {\n const change = attributeChange(previous[from + i].a, next[to + i].a)\n const key = JSON.stringify(change)\n let j = i + 1\n while (\n j < length &&\n JSON.stringify(attributeChange(previous[from + j].a, next[to + j].a)) === key\n ) {\n j++\n }\n pushRetain(delta, j - i, change)\n i = j\n }\n}\n\n/**\n * Make `text` hold `next`, changing as little as possible. Characters are matched by value from both\n * ends, so what a person typed is the only thing inserted; matched characters whose attributes\n * changed (a run split, a tracked change started) are reformatted in place and never retyped. That is\n * what lets two people's edits of one paragraph merge instead of duplicating text.\n */\nexport function applyUnits(text: Y.Text, previous: Unit[], next: Unit[]): void {\n let start = 0\n const limit = Math.min(previous.length, next.length)\n while (start < limit && valueKeyOf(previous[start]) === valueKeyOf(next[start])) start++\n let endPrev = previous.length\n let endNext = next.length\n while (\n endPrev > start &&\n endNext > start &&\n valueKeyOf(previous[endPrev - 1]) === valueKeyOf(next[endNext - 1])\n ) {\n endPrev--\n endNext--\n }\n\n const delta: DeltaOp[] = []\n reformat(delta, previous, 0, next, 0, start)\n if (endPrev > start) delta.push({ delete: endPrev - start })\n let i = start\n while (i < endNext) {\n const unit = next[i]\n if (typeof unit.v !== 'string') {\n delta.push({ insert: unit.v, attributes: toAttributes(unit.a) })\n i++\n continue\n }\n let j = i + 1\n let chunk = unit.v\n const attributes = attrsKeyOf(unit)\n while (j < endNext && typeof next[j].v === 'string' && attrsKeyOf(next[j]) === attributes) {\n chunk += next[j].v as string\n j++\n }\n delta.push({ insert: chunk, attributes: toAttributes(unit.a) })\n i = j\n }\n reformat(delta, previous, endPrev, next, endNext, previous.length - endPrev)\n if (delta.every((op) => op.retain !== undefined && !op.attributes)) return\n text.applyDelta(delta, { sanitize: false })\n}\n\n/** Write units into an empty Y.Text. */\nexport function writeUnits(text: Y.Text, units: Unit[]): void {\n applyUnits(text, [], units)\n}\n","/**\n * Elements of the mirror, in both directions: plain `XmlEl` objects to Yjs types and back, and\n * `XmlEl` to XML text.\n *\n * Three forms:\n *\n * - A paragraph is held as a rich paragraph (see rich.ts) whenever it can be represented exactly:\n * its properties stay in `children`, and its inline content is the single Y.Text `inline`.\n * - An element with no editable text anywhere below it (a style, a numbering definition, a font, a\n * setting, a theme, paragraph or table properties, a section's setup) is packed: the map holds\n * its whole subtree as one XML string under `xml`. It is opened into a plain tree when an edit\n * touches it and written back whole, so concurrent edits to the same packed element are last\n * writer wins, while different elements (two styles) still merge. Held as a tree, every element,\n * attribute and namespace URI was its own CRDT item: a 350 KB styles part took 3.2 MB of room\n * state and over 100 MB of heap to load.\n * - Every other element (the body, a table, a cell, a footnote: the path to editable text) is a\n * generic map with a `children` array.\n */\nimport * as Y from 'yjs'\nimport { readXml, XML_NAMESPACE_URI } from '@docx-editor.dev/core/store'\nimport {\n decodeInline,\n encodeParagraph,\n readUnits,\n WML,\n writeUnits,\n type EncodedParagraph,\n type XmlAttr,\n type XmlBinding,\n type XmlEl,\n} from './rich'\n\nexport type LiveElement = Y.Map<unknown>\ntype LiveChild = LiveElement | Y.Text\n\nexport function isRichParagraph(map: Y.Map<unknown>): boolean {\n return map.has('inline')\n}\n\n/** Key of a packed element's XML. */\nconst PACKED = 'xml'\n\nexport function isPackedElement(map: Y.Map<unknown>): boolean {\n return map.has(PACKED)\n}\n\n/** A rich paragraph or a packed element: its inner nodes have no Yjs type of their own. */\nexport function isCompact(map: Y.Map<unknown>): boolean {\n return isRichParagraph(map) || isPackedElement(map)\n}\n\n/** Elements that carry or contain editable text: never packed, so typing merges character-wise. */\nconst TEXT_BEARING = new Set(['p', 't', 'delText', 'instrText', 'delInstrText'])\n\n/** Whether an element is held packed: nothing below it is a paragraph or a run's text. */\nexport function packable(xml: XmlEl): boolean {\n if (xml.ns === WML && TEXT_BEARING.has(xml.local)) return false\n return xml.children.every((c) => typeof c === 'string' || packable(c))\n}\n\n/** The packed form of an element. */\nfunction createPacked(xml: XmlEl, scope: Scope): LiveElement {\n const map = new Y.Map<unknown>()\n map.set(PACKED, serializeXml(xml, scope))\n return map\n}\n\n/** Rewrite a packed element when its content changed. */\nexport function repack(map: LiveElement, xml: XmlEl): void {\n const next = serializeXml(xml, scopeOf(map))\n if (map.get(PACKED) !== next) map.set(PACKED, next)\n}\n\n/** Namespace bindings in scope where `node` sits: those of every element above it. */\nexport function scopeOf(node: LiveElement): Map<string, string> {\n const chain: LiveElement[] = []\n let parent = node.parent\n while (parent instanceof Y.Array) {\n const owner = parent.parent\n if (!(owner instanceof Y.Map)) break\n chain.push(owner)\n parent = owner.parent\n }\n const scope = new Map<string, string>()\n for (const el of chain.reverse()) {\n for (const b of (el.get('bindings') as Y.Array<XmlBinding>).toArray()) scope.set(b.prefix, b.ns)\n }\n return scope\n}\n\n/** The scope inside `el`: what its children see. */\nexport function scopeWithin(el: LiveElement): Map<string, string> {\n const scope = scopeOf(el)\n if (!isPackedElement(el)) {\n for (const b of (el.get('bindings') as Y.Array<XmlBinding>).toArray()) scope.set(b.prefix, b.ns)\n }\n return scope\n}\n\nconst unpackLimits = { maxBytes: 64 * 1024 * 1024, maxElements: 2_000_000 }\n\n/** Parse a packed element's XML back into the generic form, resolving prefixes against `scope`. */\nfunction unpack(text: string, scope: Scope): XmlEl {\n const read = readXml(text, unpackLimits)\n if (!read.ok) throw new Error(`collab: a packed element is not readable XML (${read.reason})`)\n type Node = (typeof read.nodes)[number]\n const convert = (node: Extract<Node, { type: 'element' }>, outer: Scope): XmlEl => {\n const bindings: XmlBinding[] = []\n const named: [string, string][] = []\n for (const [name, value] of Object.entries(node.attributes)) {\n if (name === 'xmlns') bindings.push({ prefix: '', ns: value })\n else if (name.startsWith('xmlns:')) bindings.push({ prefix: name.slice(6), ns: value })\n else named.push([name, value])\n }\n const inner = new Map(outer)\n for (const b of bindings) inner.set(b.prefix, b.ns)\n const resolve = (prefix: string): string => {\n if (prefix === 'xml') return XML_NAMESPACE_URI\n const ns = inner.get(prefix)\n if (ns === undefined)\n throw new Error(`collab: prefix ${prefix} is not bound in a packed element`)\n return ns\n }\n const colon = node.name.indexOf(':')\n const xml: XmlEl = {\n ns: colon < 0 ? (inner.get('') ?? '') : resolve(node.name.slice(0, colon)),\n local: colon < 0 ? node.name : node.name.slice(colon + 1),\n attrs: named.map(([name, value]) => {\n const at = name.indexOf(':')\n if (at < 0) return { ns: '', local: name, value }\n const prefix = name.slice(0, at)\n return { ns: resolve(prefix), local: name.slice(at + 1), prefix, value }\n }),\n bindings,\n children: node.children.map((child) =>\n child.type === 'text' ? child.value : convert(child, inner)\n ),\n }\n if (colon >= 0) xml.prefix = node.name.slice(0, colon)\n return xml\n }\n const root = read.nodes.find((n) => n.type === 'element')\n if (!root || root.type !== 'element') throw new Error('collab: a packed element is empty')\n return convert(root, scope)\n}\n\nexport function isParagraphEl(el: { ns: string; local: string }): boolean {\n return el.ns === WML && el.local === 'p'\n}\n\nfunction fieldsOf(map: Y.Map<unknown>, xml: XmlEl): void {\n map.set('ns', xml.ns)\n map.set('local', xml.local)\n if (xml.prefix !== undefined) map.set('prefix', xml.prefix)\n const attrs = new Y.Array<XmlAttr>()\n attrs.push(xml.attrs.map((a) => ({ ...a })))\n map.set('attrs', attrs)\n const bindings = new Y.Array<XmlBinding>()\n bindings.push(xml.bindings.map((b) => ({ ...b })))\n map.set('bindings', bindings)\n}\n\nexport function newText(value: string): Y.Text {\n const text = new Y.Text()\n text.insert(0, value)\n return text\n}\n\n/** A rich paragraph: properties in `children`, inline content in `inline`. */\nexport function createRichParagraph(\n xml: XmlEl,\n encoded: EncodedParagraph,\n scope: Scope = new Map()\n): LiveElement {\n const map = new Y.Map<unknown>()\n fieldsOf(map, xml)\n const inner = withBindings(scope, xml.bindings)\n const children = new Y.Array<LiveChild>()\n children.push(encoded.head.map((el) => xmlToLive(el, inner)))\n map.set('children', children)\n const inline = new Y.Text()\n writeUnits(inline, encoded.units)\n map.set('inline', inline)\n return map\n}\n\nexport function withBindings(scope: Scope, bindings: readonly XmlBinding[]): Map<string, string> {\n const inner = new Map(scope)\n for (const b of bindings) inner.set(b.prefix, b.ns)\n return inner\n}\n\n/**\n * Build the Yjs form of an element sitting where `scope` is in force. A paragraph that cannot be\n * held as rich text is stored plainly; a part's `root` is never packed, so its children (styles,\n * numbering definitions, settings) stay separate items.\n */\nexport function xmlToLive(xml: XmlEl, scope: Scope = new Map(), root = false): LiveElement {\n if (isParagraphEl(xml)) {\n const encoded = encodeParagraph(xml.children)\n if (encoded) return createRichParagraph(xml, encoded, scope)\n }\n if (!root && packable(xml)) return createPacked(xml, scope)\n const map = new Y.Map<unknown>()\n fieldsOf(map, xml)\n const inner = withBindings(scope, xml.bindings)\n const children = new Y.Array<LiveChild>()\n children.push(xml.children.map((c) => (typeof c === 'string' ? newText(c) : xmlToLive(c, inner))))\n map.set('children', children)\n return map\n}\n\n/** Read an element back as plain data. */\nexport function liveToXml(map: LiveElement): XmlEl {\n if (isPackedElement(map)) return unpack(map.get(PACKED) as string, scopeOf(map))\n const prefix = map.get('prefix') as string | undefined\n const stored = (map.get('children') as Y.Array<LiveChild>)\n .toArray()\n .map((child) => (child instanceof Y.Text ? child.toString() : liveToXml(child)))\n const children: (XmlEl | string)[] = isRichParagraph(map)\n ? [...stored, ...decodeInline(readUnits(map.get('inline') as Y.Text))]\n : stored\n const xml: XmlEl = {\n ns: map.get('ns') as string,\n local: map.get('local') as string,\n attrs: (map.get('attrs') as Y.Array<XmlAttr>).toArray().map((a) => ({ ...a })),\n bindings: (map.get('bindings') as Y.Array<XmlBinding>).toArray().map((b) => ({ ...b })),\n children,\n }\n if (prefix !== undefined) xml.prefix = prefix\n return xml\n}\n\n// ── XML text ───────────────────────────────────────────────────────────────\n\nconst escapeText = (value: string): string =>\n value.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>')\n\nexport const escapeAttr = (value: string): string =>\n value\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/\\t/g, '	')\n .replace(/\\n/g, ' ')\n .replace(/\\r/g, ' ')\n\nconst qualified = (prefix: string | undefined, local: string): string =>\n prefix ? `${prefix}:${local}` : local\n\n/** Prefixes in scope for an element; innermost binding wins. */\nexport type Scope = ReadonlyMap<string, string>\n\n/** An element's start tag without its closing `>`, and the scope inside it. */\nfunction startTag(\n prefix: string | undefined,\n local: string,\n bindings: readonly XmlBinding[],\n attrs: readonly XmlAttr[],\n scope: Scope\n): [string, Scope] {\n const inScope = withBindings(scope, bindings)\n let out = `<${qualified(prefix, local)}`\n for (const b of bindings) {\n out +=\n b.prefix === '' ? ` xmlns=\"${escapeAttr(b.ns)}\"` : ` xmlns:${b.prefix}=\"${escapeAttr(b.ns)}\"`\n }\n for (const a of attrs) {\n let p = a.prefix\n if (a.ns !== '' && !p) {\n for (const [candidate, uri] of inScope) {\n if (candidate !== '' && uri === a.ns) {\n p = candidate\n break\n }\n }\n }\n out += ` ${qualified(p, a.local)}=\"${escapeAttr(a.value)}\"`\n }\n return [out, inScope]\n}\n\nexport function serializeXml(el: XmlEl, scope: Scope): string {\n const [out, inScope] = startTag(el.prefix, el.local, el.bindings, el.attrs, scope)\n if (el.children.length === 0) return `${out}/>`\n let body = ''\n for (const child of el.children) {\n body += typeof child === 'string' ? escapeText(child) : serializeXml(child, inScope)\n }\n return `${out}>${body}</${qualified(el.prefix, el.local)}>`\n}\n\n/** Serialise an element of the mirror. A packed element is its stored XML, never re-parsed. */\nexport function serializeLive(el: LiveElement, scope: Scope): string {\n if (isPackedElement(el)) return el.get(PACKED) as string\n const prefix = el.get('prefix') as string | undefined\n const local = el.get('local') as string\n const bindings = (el.get('bindings') as Y.Array<XmlBinding>).toArray()\n const attrs = (el.get('attrs') as Y.Array<XmlAttr>).toArray()\n const children = (el.get('children') as Y.Array<LiveChild>).toArray()\n const [out, inScope] = startTag(prefix, local, bindings, attrs, scope)\n\n const inline = isRichParagraph(el) ? decodeInline(readUnits(el.get('inline') as Y.Text)) : []\n if (children.length === 0 && inline.length === 0) return `${out}/>`\n let body = ''\n for (const child of children) {\n body += child instanceof Y.Text ? escapeText(child.toString()) : serializeLive(child, inScope)\n }\n for (const child of inline) body += serializeXml(child, inScope)\n return `${out}>${body}</${qualified(prefix, local)}>`\n}\n","/**\n * Yjs mirror of a canonical OOXML package.\n *\n * The mirror is deliberately generic: it stores XML (namespace, local name, prefix, attributes,\n * namespace bindings, children) and not core's typed node kinds. Materialising serialises the mirror\n * back to XML and lets core's own reader classify it, so the typed vocabulary never leaks into the\n * replicated state and a core upgrade cannot invalidate stored rooms.\n *\n * Layout of the Yjs document (all under the top level maps named below):\n *\n * meta Y.Map { format, mainDocumentPart }\n * parts Y.Map partName -> element\n * rels Y.Map ownerPart -> Y.Map(relId -> RelationshipJson), internal and external\n * alike; the `.rels` XML parts are regenerated from these, never mirrored\n * ctDefaults Y.Map extension -> mime\n * ctOverrides Y.Map case folded part name -> mime\n * binaries Y.Map partName -> Uint8Array (every non-XML part)\n *\n * element = Y.Map { ns, local, prefix?, attrs: Y.Array<AttrJson>, bindings: Y.Array<BindingJson>,\n * children: Y.Array<element | Y.Text> }\n * | Y.Map { ns, local, prefix?, attrs, bindings, children: head, inline: Y.Text } (rich paragraph)\n * | Y.Map { xml: string } (packed: an element with no editable text below it)\n * text = Y.Text (a text node is a Y.Text living in a children array)\n */\nimport * as Y from 'yjs'\nimport {\n readOoxmlPackage,\n readOoxmlPart,\n relsPartNameFor,\n validateExternalTarget,\n withContentTypeOverride,\n contentTypesPartBytes,\n writeOoxmlPackage,\n type OoxmlPackage,\n} from '@docx-editor.dev/core/store'\nimport { escapeAttr, serializeLive, xmlToLive, newText } from './mirror'\nimport type { XmlEl } from './rich'\nimport type { NodeRegistry } from './registry'\n\n/**\n * The room format: the only one this build reads and writes. `arbi-docx/2` holds elements without\n * editable text packed (see mirror.ts). A client and the collaboration server must run the same\n * format: the handshake refuses any other, and the collaboration service re-encodes a stored room of\n * an earlier format before serving it (`reencodeRoom`).\n */\nexport const COLLAB_FORMAT = 'arbi-docx/2'\n\nexport interface AttrJson {\n ns: string\n local: string\n prefix?: string\n value: string\n}\n\nexport interface BindingJson {\n prefix: string\n ns: string\n}\n\nexport interface RelationshipJson {\n ownerPart: string\n id: string\n type: string\n rawTarget: string\n targetMode: string\n order: number\n}\n\n/** Structural view of core's canonical node; only the fields the mirror carries. */\ninterface CanonicalElement {\n readonly kind: string\n readonly namespaceUri: string\n readonly localName: string\n readonly prefix?: string\n readonly namespaceBindings: readonly { prefix: string; namespaceUri: string }[]\n readonly attributes: readonly {\n namespaceUri: string\n localName: string\n prefix?: string\n value: string\n }[]\n readonly children: readonly (CanonicalElement | CanonicalText)[]\n}\n\ninterface CanonicalText {\n readonly kind: 'textValue'\n readonly value: string\n}\n\nfunction isText(node: CanonicalElement | CanonicalText): node is CanonicalText {\n return node.kind === 'textValue'\n}\n\nfunction canonicalToXml(node: CanonicalElement | CanonicalText): XmlEl | string {\n if (isText(node)) return node.value\n const xml: XmlEl = {\n ns: node.namespaceUri,\n local: node.localName,\n attrs: node.attributes.map((a) => {\n const json: AttrJson = { ns: a.namespaceUri, local: a.localName, value: a.value }\n if (a.prefix !== undefined) json.prefix = a.prefix\n return json\n }),\n bindings: node.namespaceBindings.map((b) => ({ prefix: b.prefix, ns: b.namespaceUri })),\n children: node.children.map(canonicalToXml),\n }\n if (node.prefix !== undefined) xml.prefix = node.prefix\n return xml\n}\n\n/** The Yjs form of a part's root element. */\nexport function encodeElement(el: CanonicalElement): Y.Map<unknown> {\n return xmlToLive(canonicalToXml(el) as XmlEl, new Map(), true)\n}\n\nexport function encodeText(value: string): Y.Text {\n return newText(value)\n}\n\n/** Seed an empty Yjs document from a loaded package. Call once, inside a transaction. */\nexport function bootstrap(doc: Y.Doc, pkg: OoxmlPackage): void {\n doc.transact(() => {\n const meta = doc.getMap('meta')\n meta.set('format', COLLAB_FORMAT)\n meta.set('mainDocumentPart', pkg.mainDocumentPart)\n\n const parts = doc.getMap<Y.Map<unknown>>('parts')\n for (const [name, part] of pkg.parts) {\n if (isRelsPart(name)) continue\n parts.set(name, encodeElement(part.root as unknown as CanonicalElement))\n }\n\n const binaries = doc.getMap<Uint8Array>('binaries')\n for (const [name, bytes] of pkg.partBytes) {\n if (!pkg.parts.has(name)) binaries.set(name, bytes)\n }\n\n const rels = doc.getMap<Y.Map<RelationshipJson>>('rels')\n for (const [owner, records] of pkg.relationships) {\n const byId = new Y.Map<RelationshipJson>()\n for (const r of records) {\n byId.set(r.id, {\n ownerPart: r.ownerPart,\n id: r.id,\n type: r.type,\n rawTarget: r.rawTarget,\n targetMode: r.targetMode as string,\n order: r.order,\n })\n }\n rels.set(owner, byId)\n }\n\n for (const e of pkg.externalTargets) {\n let byId = rels.get(e.ownerPart)\n if (!byId) {\n byId = new Y.Map<RelationshipJson>()\n rels.set(e.ownerPart, byId)\n }\n byId.set(e.id, {\n ownerPart: e.ownerPart,\n id: e.id,\n type: e.type,\n rawTarget: e.rawTarget,\n targetMode: 'External',\n order: byId.size,\n })\n }\n\n const ctDefaults = doc.getMap<string>('ctDefaults')\n for (const [ext, mime] of pkg.contentTypes.defaults) ctDefaults.set(ext, mime)\n const ctOverrides = doc.getMap<string>('ctOverrides')\n for (const [name, mime] of pkg.contentTypes.overrides) ctOverrides.set(name, mime)\n })\n}\n\nexport function isBootstrapped(doc: Y.Doc): boolean {\n return doc.getMap('meta').get('format') !== undefined\n}\n\nexport function readFormat(doc: Y.Doc): string | undefined {\n const format = doc.getMap('meta').get('format')\n return typeof format === 'string' ? format : undefined\n}\n\n// ── XML serialisation of the mirror ────────────────────────────────────────\n\nexport function serializePart(doc: Y.Doc, partName: string): string {\n const root = doc.getMap<Y.Map<unknown>>('parts').get(partName)\n if (!root) throw new Error(`collab: part ${partName} is not in the room`)\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n${serializeLive(root, new Map())}`\n}\n\n/** Override first, then the extension default, as the package's content type index resolves it. */\nexport function contentTypeOf(doc: Y.Doc, partName: string): string | undefined {\n const override = doc.getMap<string>('ctOverrides').get(partName.toLowerCase())\n if (override !== undefined) return override\n const dot = partName.lastIndexOf('.')\n if (dot < 0) return undefined\n return doc.getMap<string>('ctDefaults').get(partName.slice(dot + 1).toLowerCase())\n}\n\n/**\n * Register mirrored nodes under their positional ids. Run after bootstrap and after a remote apply.\n * Pass `only` to refresh just the parts that changed.\n */\nexport function registerMirror(\n doc: Y.Doc,\n registry: NodeRegistry,\n only?: ReadonlySet<string>\n): void {\n const parts = doc.getMap<Y.Map<unknown>>('parts')\n if (!only) {\n registry.clear()\n for (const [name, root] of parts) registry.registerTree(name, root)\n return\n }\n for (const name of only) {\n registry.dropPart(name)\n const root = parts.get(name)\n if (root) registry.registerTree(name, root)\n }\n}\n\n/**\n * Remembers each part's last materialised tree and which parts changed since, so a remote edit\n * re-reads only the part it touched. Unchanged parts keep the identical frozen object, which also\n * lets the local store reuse everything it already derived from them.\n */\nexport class MaterializeCache {\n readonly parts = new Map<\n string,\n OoxmlPackage['parts'] extends ReadonlyMap<string, infer P> ? P : never\n >()\n private dirty = new Set<string>()\n private everything = true\n private readonly stop: (() => void)[] = []\n\n constructor(doc: Y.Doc) {\n const parts = doc.getMap<Y.Map<unknown>>('parts')\n const onParts = (events: Y.YEvent<Y.AbstractType<unknown>>[]): void => {\n for (const event of events) {\n if (event.target === parts) {\n for (const key of (event as Y.YMapEvent<unknown>).keysChanged) this.dirty.add(key)\n } else if (typeof event.path[0] === 'string') this.dirty.add(event.path[0])\n }\n }\n parts.observeDeep(onParts)\n this.stop.push(() => parts.unobserveDeep(onParts))\n // A content type change can change how every part reads.\n for (const name of ['ctOverrides', 'ctDefaults']) {\n const map = doc.getMap(name)\n const onTypes = (): void => {\n this.everything = true\n }\n map.observe(onTypes)\n this.stop.push(() => map.unobserve(onTypes))\n }\n }\n\n /** Names to re-read, or null when everything must be. Clears the pending set. */\n take(): ReadonlySet<string> | null {\n const names = this.everything ? null : this.dirty\n this.dirty = new Set()\n this.everything = false\n return names\n }\n\n /** Mark parts changed again, for a materialisation that did not complete. */\n restore(names: ReadonlySet<string> | null): void {\n if (names === null) this.everything = true\n else for (const name of names) this.dirty.add(name)\n }\n\n destroy(): void {\n for (const stop of this.stop.splice(0)) stop()\n }\n}\n\nconst RELS_CONTENT_TYPE = 'application/vnd.openxmlformats-package.relationships+xml'\nconst RELS_NAMESPACE = 'http://schemas.openxmlformats.org/package/2006/relationships'\n\ninterface ExternalTargetRecord {\n ownerPart: string\n id: string\n type: string\n rawTarget: string\n sinkSafe: boolean\n}\n\nfunction isRelsPart(partName: string): boolean {\n return partName.endsWith('.rels')\n}\n\nfunction relationshipsXml(records: readonly RelationshipJson[]): string {\n const rows = records\n .map(\n (r) =>\n `<Relationship Id=\"${escapeAttr(r.id)}\" Type=\"${escapeAttr(r.type)}\" Target=\"${escapeAttr(r.rawTarget)}\"` +\n `${r.targetMode === 'External' ? ' TargetMode=\"External\"' : ''}/>`\n )\n .join('')\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n<Relationships xmlns=\"${RELS_NAMESPACE}\">${rows}</Relationships>`\n}\n\n// ── Materialisation ────────────────────────────────────────────────────────\n\nexport class MaterializeError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'MaterializeError'\n }\n}\n\n/** Build a frozen canonical package from the mirror. Throws MaterializeError on a corrupt room. */\nexport function materialize(\n doc: Y.Doc,\n cache?: MaterializeCache,\n changed: ReadonlySet<string> | null = null\n): OoxmlPackage {\n const meta = doc.getMap('meta')\n const main = meta.get('mainDocumentPart')\n if (typeof main !== 'string') throw new MaterializeError('room has no main document part')\n\n const parts = new Map<\n string,\n OoxmlPackage['parts'] extends ReadonlyMap<string, infer P> ? P : never\n >()\n for (const name of doc.getMap('parts').keys()) {\n if (isRelsPart(name)) continue\n const reusable = cache && changed && !changed.has(name) ? cache.parts.get(name) : undefined\n if (reusable) {\n parts.set(name, reusable)\n continue\n }\n const contentType = contentTypeOf(doc, name)\n if (contentType === undefined) throw new MaterializeError(`part ${name} has no content type`)\n const read = readOoxmlPart(serializePart(doc, name), { name, contentType })\n if (!read.ok) throw new MaterializeError(`part ${name} is not readable: ${read.reason}`)\n parts.set(name, read.part)\n }\n if (cache) {\n cache.parts.clear()\n for (const [name, part] of parts) if (!isRelsPart(name)) cache.parts.set(name, part)\n }\n\n const partBytes = new Map<string, Uint8Array>()\n for (const [name, bytes] of doc.getMap<Uint8Array>('binaries')) partBytes.set(name, bytes)\n\n // Relationship records are the authority; the `.rels` XML parts are rebuilt from them.\n const relationships = new Map<string, readonly RelationshipJson[]>()\n const externalTargets: ExternalTargetRecord[] = []\n for (const [owner, byId] of doc.getMap<Y.Map<RelationshipJson>>('rels')) {\n // Ties on `order` are broken by id so every peer writes the same bytes.\n const records = [...byId.values()].sort((a, b) => a.order - b.order || a.id.localeCompare(b.id))\n if (records.length === 0) continue\n const internal = records.filter((r) => r.targetMode !== 'External')\n if (internal.length > 0) relationships.set(owner, internal)\n for (const r of records) {\n if (r.targetMode !== 'External') continue\n externalTargets.push({\n ownerPart: r.ownerPart,\n id: r.id,\n type: r.type,\n rawTarget: r.rawTarget,\n sinkSafe: validateExternalTarget(r.rawTarget).ok,\n })\n }\n const relsName = relsPartNameFor(owner)\n const read = readOoxmlPart(relationshipsXml(records), {\n name: relsName,\n contentType: RELS_CONTENT_TYPE,\n })\n if (!read.ok)\n throw new MaterializeError(`relationships of ${owner} are not valid: ${read.reason}`)\n parts.set(relsName, read.part)\n }\n\n const contentTypes = {\n defaults: new Map(doc.getMap<string>('ctDefaults')),\n overrides: new Map(doc.getMap<string>('ctOverrides')),\n }\n\n return withMirroredOverrides({\n parts,\n partBytes,\n relationships,\n externalTargets,\n contentTypes,\n mainDocumentPart: main,\n } as unknown as OoxmlPackage)\n}\n\n/** Media a document embeds, by extension: what a picture part is when nothing declares it. */\nconst MEDIA_TYPES: Readonly<Record<string, string>> = {\n png: 'image/png',\n jpg: 'image/jpeg',\n jpeg: 'image/jpeg',\n gif: 'image/gif',\n bmp: 'image/bmp',\n tif: 'image/tiff',\n tiff: 'image/tiff',\n webp: 'image/webp',\n svg: 'image/svg+xml',\n emf: 'image/x-emf',\n wmf: 'image/x-wmf',\n}\n\n/**\n * Bring the `[Content_Types].xml` bytes in line with the mirrored overrides.\n *\n * The overrides are the authority, but the package also carries the content-types part itself as\n * bytes, which is what the writer emits. Core journals a new part's override (Insert footnote on a\n * document without notes creates `/word/footnotes.xml`) without re-journalling those bytes, so a\n * room would otherwise export the new part under the generic `application/xml` default — and Word\n * ignores a footnotes part it cannot recognise.\n *\n * An inserted picture is journalled as its bytes and relationship only: neither its override nor\n * the content-types bytes. A media part that nothing declares is given its type by extension, or\n * Word reports the whole file as unreadable.\n */\nfunction withMirroredOverrides(pkg: OoxmlPackage): OoxmlPackage {\n const bytes = contentTypesPartBytes(pkg)\n if (!bytes) return pkg\n const xml = new TextDecoder().decode(bytes.bytes)\n const declared = new Set(\n [...xml.matchAll(/PartName\\s*=\\s*[\"']([^\"']+)[\"']/gi)].map((m) => m[1].toLowerCase())\n )\n const defaults = new Set(\n [...xml.matchAll(/Extension\\s*=\\s*[\"']([^\"']+)[\"']/gi)].map((m) => m[1].toLowerCase())\n )\n let next = pkg\n for (const name of [...pkg.parts.keys(), ...pkg.partBytes.keys()]) {\n const key = name.toLowerCase()\n if (declared.has(key) || key === bytes.storageKey.toLowerCase()) continue\n const extension = key.slice(key.lastIndexOf('.') + 1)\n const type =\n pkg.contentTypes.overrides.get(key) ??\n (defaults.has(extension) ? undefined : MEDIA_TYPES[extension])\n if (type) {\n next = withContentTypeOverride(next, name, type, { forceOverride: true })\n declared.add(key)\n }\n }\n return next\n}\n\n/** Serialise the room as DOCX bytes. */\nexport function materializeBytes(doc: Y.Doc): Uint8Array {\n return writeOoxmlPackage(materialize(doc))\n}\n\n/** Load DOCX bytes and seed an empty room from them. */\nexport function bootstrapFromBytes(doc: Y.Doc, bytes: Uint8Array): OoxmlPackage {\n const result = readOoxmlPackage(bytes)\n if (!result.ok) throw new MaterializeError(`not a readable DOCX: ${result.reason}`)\n bootstrap(doc, result.package)\n return result.package\n}\n","/**\n * Identity registry between core's logical node ids and the Yjs mirror.\n *\n * A journal addresses nodes by logical id: an original node keeps its positional id from the moment\n * the package was opened, a node minted later gets `#new:N`. Ids never shift when siblings are\n * inserted or removed, so the registry maps an id to a live Yjs type by reference, and a remote edit\n * that moves positions cannot invalidate it.\n *\n * A Yjs type cannot be read before it is integrated and cannot be integrated twice. Nodes that are\n * under construction, detached, or about to move are therefore held as plain objects and converted\n * to Yjs types when they are attached to a live parent. `snapshot` is the live to plain direction.\n *\n * Rich paragraphs (see rich.ts) hold their runs as attributes on one Y.Text, and packed elements\n * (see mirror.ts) hold their subtree as one XML string, so their inner nodes have no Yjs type of\n * their own. The first effect that touches one opens it: it is read into a plain tree, the journal's\n * effects change that tree, and `flushRich` writes the result back (a minimal edit of the text, or\n * the packed element's new XML). The tree stays open, mirroring the editor's own, until a remote\n * change re-reads it.\n */\nimport * as Y from 'yjs'\nimport type { AttrJson, BindingJson } from './encoding'\nimport {\n createRichParagraph,\n isCompact,\n isPackedElement,\n isParagraphEl,\n liveToXml,\n packable,\n repack,\n scopeOf,\n scopeWithin,\n serializeLive,\n serializeXml,\n withBindings,\n xmlToLive,\n type Scope,\n} from './mirror'\nimport { applyUnits, encodeParagraph, newRunId, readUnits, WML, type XmlEl } from './rich'\n\nexport interface PlainElement {\n type: 'element'\n id: string\n ns: string\n local: string\n prefix?: string\n attrs: AttrJson[]\n bindings: BindingJson[]\n children: PlainNode[]\n /** Identity of a run or wrapper inside a rich paragraph. */\n rid?: string\n}\n\ninterface PlainText {\n type: 'text'\n id: string\n value: string\n}\n\nexport type PlainNode = PlainElement | PlainText\n\nexport type LiveNode = Y.Map<unknown> | Y.Text\n\nexport type RegistryEntry = { live: LiveNode } | { plain: PlainNode }\n\nexport class RegistryError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'RegistryError'\n }\n}\n\nexport function childrenOf(el: Y.Map<unknown>): Y.Array<LiveNode> {\n return el.get('children') as Y.Array<LiveNode>\n}\n\nexport function attrsOf(el: Y.Map<unknown>): Y.Array<AttrJson> {\n return el.get('attrs') as Y.Array<AttrJson>\n}\n\nexport function bindingsOf(el: Y.Map<unknown>): Y.Array<BindingJson> {\n return el.get('bindings') as Y.Array<BindingJson>\n}\n\n/** Elements that need an identity so neighbours with equal properties stay separate in a rich paragraph. */\nconst IDENTIFIED = new Set([\n 'r',\n 'ins',\n 'del',\n 'moveFrom',\n 'moveTo',\n 'hyperlink',\n 'smartTag',\n 'fldSimple',\n 'customXml',\n 'dir',\n 'bdo',\n 'sdt',\n 'sdtContent',\n])\n\nfunction plainToXml(node: PlainNode): XmlEl | string {\n if (node.type === 'text') return node.value\n const xml: XmlEl = {\n ns: node.ns,\n local: node.local,\n attrs: node.attrs.map((a) => ({ ...a })),\n bindings: node.bindings.map((b) => ({ ...b })),\n children: node.children.map(plainToXml),\n }\n if (node.prefix !== undefined) xml.prefix = node.prefix\n if (node.ns === WML && IDENTIFIED.has(node.local)) {\n node.rid ??= newRunId()\n xml._id = node.rid\n }\n return xml\n}\n\nfunction xmlToPlain(xml: XmlEl | string, id: string): PlainNode {\n if (typeof xml === 'string') return { type: 'text', id, value: xml }\n const plain: PlainElement = {\n type: 'element',\n id,\n ns: xml.ns,\n local: xml.local,\n attrs: xml.attrs.map((a) => ({ ...a })),\n bindings: xml.bindings.map((b) => ({ ...b })),\n children: xml.children.map((child, index) => xmlToPlain(child, `${id}.${index}`)),\n }\n if (xml.prefix !== undefined) plain.prefix = xml.prefix\n if (xml._id !== undefined) plain.rid = xml._id\n return plain\n}\n\ninterface OpenParagraph {\n live: Y.Map<unknown>\n root: PlainElement\n id: string\n}\n\nconst partOf = (id: string): string => id.slice(0, id.indexOf('#'))\n\nexport class NodeRegistry {\n private readonly entries = new Map<string, RegistryEntry>()\n /** Ids per part (the text before `#`), so one part can be dropped without scanning the rest. */\n private readonly byPart = new Map<string, Set<string>>()\n private readonly liveIds = new WeakMap<LiveNode, string>()\n private readonly open = new Map<Y.Map<unknown>, OpenParagraph>()\n private readonly ownerOf = new WeakMap<PlainNode, Y.Map<unknown>>()\n private readonly dirty = new Set<Y.Map<unknown>>()\n\n clear(): void {\n this.entries.clear()\n this.byPart.clear()\n this.open.clear()\n this.dirty.clear()\n }\n\n /** Forget every node of one part, live or detached. */\n dropPart(partName: string): void {\n for (const id of this.byPart.get(partName) ?? []) this.entries.delete(id)\n this.byPart.delete(partName)\n for (const [live, record] of this.open) {\n if (partOf(record.id) !== partName) continue\n this.open.delete(live)\n this.dirty.delete(live)\n }\n }\n\n private index(id: string): void {\n const part = partOf(id)\n let ids = this.byPart.get(part)\n if (!ids) this.byPart.set(part, (ids = new Set()))\n ids.add(id)\n }\n\n get(id: string): RegistryEntry | undefined {\n return this.entries.get(id)\n }\n\n /** Whether the id names a node, one inside a paragraph that is not open yet included. */\n has(id: string): boolean {\n return (this.entries.get(id) ?? this.resolveInsideParagraph(id)) !== undefined\n }\n\n require(id: string): RegistryEntry {\n let entry = this.entries.get(id) ?? this.resolveInsideParagraph(id)\n if (!entry) throw new RegistryError(`journal names unknown node ${id}`)\n if ('live' in entry && entry.live instanceof Y.Map && isCompact(entry.live)) {\n this.openParagraph(entry.live)\n entry = this.entries.get(id) as RegistryEntry\n }\n if ('plain' in entry) {\n const owner = this.ownerOf.get(entry.plain)\n if (owner) this.dirty.add(owner)\n }\n return entry\n }\n\n /** An id inside a paragraph that is not open yet: open the paragraph it belongs to. */\n private resolveInsideParagraph(id: string): RegistryEntry | undefined {\n const hash = id.indexOf('#')\n if (hash < 0 || id.startsWith('new:', hash + 1)) return undefined\n const path = id.slice(hash + 1).split('.')\n for (let length = path.length - 1; length >= 1; length--) {\n const ancestor = this.entries.get(id.slice(0, hash + 1) + path.slice(0, length).join('.'))\n if (!ancestor) continue\n if ('live' in ancestor && ancestor.live instanceof Y.Map && isCompact(ancestor.live)) {\n this.openParagraph(ancestor.live)\n return this.entries.get(id)\n }\n return undefined\n }\n return undefined\n }\n\n idOf(node: LiveNode): string | undefined {\n return this.liveIds.get(node)\n }\n\n isCurrentLive(id: string, node: LiveNode): boolean {\n const entry = this.entries.get(id)\n return entry !== undefined && 'live' in entry && entry.live === node\n }\n\n registerLive(id: string, node: LiveNode): void {\n this.entries.set(id, { live: node })\n this.liveIds.set(node, id)\n this.index(id)\n }\n\n registerPlain(node: PlainNode, keepNewer = false): void {\n // A journal may mint a node under the id of one that is being replaced. Opening a paragraph in the\n // middle of that journal must not put the replaced node back.\n const existing = this.entries.get(node.id)\n if (!(keepNewer && existing && 'plain' in existing)) {\n this.entries.set(node.id, { plain: node })\n this.index(node.id)\n }\n if (node.type === 'element')\n for (const child of node.children) this.registerPlain(child, keepNewer)\n }\n\n /**\n * Walk a mirror root and register every node under its positional id, `${part}#0` for the root and\n * `${parent}.${index}` below it. This is the id scheme core assigns when it reads a part. A rich\n * paragraph or a packed element is registered as one node; its inner nodes appear when it is opened.\n */\n registerTree(partName: string, root: Y.Map<unknown>): void {\n const walk = (node: LiveNode, id: string): void => {\n this.registerLive(id, node)\n if (node instanceof Y.Text) return\n if (isCompact(node)) return\n childrenOf(node).forEach((child, index) => walk(child, `${id}.${index}`))\n }\n walk(root, `${partName}#0`)\n }\n\n // ── Rich paragraphs ──────────────────────────────────────────────────────\n\n private own(node: PlainNode, live: Y.Map<unknown> | undefined): void {\n if (live) this.ownerOf.set(node, live)\n else this.ownerOf.delete(node)\n if (node.type === 'element') for (const child of node.children) this.own(child, live)\n }\n\n private openParagraph(live: Y.Map<unknown>): OpenParagraph {\n const existing = this.open.get(live)\n if (existing) return existing\n const id = this.liveIds.get(live)\n if (id === undefined) throw new RegistryError('paragraph has no registered id')\n const root = xmlToPlain(liveToXml(live), id) as PlainElement\n const record: OpenParagraph = { live, root, id }\n this.open.set(live, record)\n this.registerPlain(root, true)\n this.own(root, live)\n return record\n }\n\n /** The Yjs paragraph an open plain root stands for. */\n liveOfRoot(node: PlainNode): Y.Map<unknown> | undefined {\n const live = this.ownerOf.get(node)\n return live && this.open.get(live)?.root === node ? live : undefined\n }\n\n /** Parent and index of a node inside an open paragraph. */\n locatePlain(node: PlainNode): { parent: PlainElement; index: number } | undefined {\n const live = this.ownerOf.get(node)\n const record = live && this.open.get(live)\n if (!record) return undefined\n const search = (parent: PlainElement): { parent: PlainElement; index: number } | undefined => {\n const index = parent.children.indexOf(node)\n if (index >= 0) return { parent, index }\n for (const child of parent.children) {\n if (child.type === 'element') {\n const found = search(child)\n if (found) return found\n }\n }\n return undefined\n }\n return search(record.root)\n }\n\n /** Mark the paragraph a plain node belongs to as changed. */\n touch(node: PlainNode): void {\n const owner = this.ownerOf.get(node)\n if (owner) this.dirty.add(owner)\n }\n\n /** Nodes just placed under `parent` belong to the same paragraph as it, if any. */\n adopt(parent: PlainElement, children: readonly PlainNode[]): void {\n const owner = this.ownerOf.get(parent)\n for (const child of children) this.own(child, owner)\n if (owner) this.dirty.add(owner)\n }\n\n /** Write every changed open paragraph or packed element back into the mirror. Call at the end of a journal. */\n flushRich(): void {\n for (const live of [...this.dirty]) {\n this.dirty.delete(live)\n const record = this.open.get(live)\n if (record) this.writeBack(record)\n }\n }\n\n private writeBack(record: OpenParagraph): void {\n const { live, root } = record\n const xml = plainToXml(root) as XmlEl\n if (isPackedElement(live)) {\n // Gained a paragraph or run text: from now on it is a tree, so that text merges as usual.\n if (packable(xml)) repack(live, xml)\n else this.degrade(record)\n return\n }\n const encoded = encodeParagraph(xml.children)\n if (!encoded) {\n this.degrade(record)\n return\n }\n const attrs = attrsOf(live)\n if (JSON.stringify(attrs.toArray()) !== JSON.stringify(xml.attrs)) {\n attrs.delete(0, attrs.length)\n attrs.push(xml.attrs.map((a) => ({ ...a })))\n }\n const bindings = bindingsOf(live)\n if (JSON.stringify(bindings.toArray()) !== JSON.stringify(xml.bindings)) {\n bindings.delete(0, bindings.length)\n bindings.push(xml.bindings.map((b) => ({ ...b })))\n }\n const head = childrenOf(live)\n // Compared as XML: a packed property element reads back with prefixes resolved.\n const scope = scopeWithin(live)\n const stored = head\n .toArray()\n .map((child) => serializeLive(child as Y.Map<unknown>, scope))\n .join('')\n if (stored !== encoded.head.map((el) => serializeXml(el, scope)).join('')) {\n head.delete(0, head.length)\n head.push(encoded.head.map((el) => xmlToLive(el, scope)))\n }\n const inline = live.get('inline') as Y.Text\n applyUnits(inline, readUnits(inline), encoded.units)\n }\n\n /** The paragraph can no longer be held as rich text, or the element packed: store it as a tree. */\n private degrade(record: OpenParagraph): void {\n const parent = record.live.parent\n if (!(parent instanceof Y.Array))\n throw new RegistryError('a paragraph outside a parent cannot change form')\n const index = (parent as Y.Array<LiveNode>).toArray().indexOf(record.live)\n const generic = this.toGenericLive(record.root, scopeOf(record.live))\n this.open.delete(record.live)\n ;(parent as Y.Array<LiveNode>).delete(index, 1)\n ;(parent as Y.Array<LiveNode>).insert(index, [generic])\n }\n\n // ── Snapshots and conversion ─────────────────────────────────────────────\n\n /** Deep copy of a node into plain objects carrying the same ids. */\n snapshot(id: string): PlainNode {\n const entry = this.require(id)\n if ('plain' in entry) return entry.plain\n return this.snapshotLive(entry.live)\n }\n\n private snapshotLive(node: LiveNode): PlainNode {\n const id = this.liveIds.get(node)\n if (id === undefined) throw new RegistryError('live node has no registered id')\n if (node instanceof Y.Text) return { type: 'text', id, value: node.toString() }\n if (isCompact(node)) {\n return this.open.get(node)?.root ?? xmlToPlain(liveToXml(node), id)\n }\n const prefix = node.get('prefix') as string | undefined\n const plain: PlainElement = {\n type: 'element',\n id,\n ns: node.get('ns') as string,\n local: node.get('local') as string,\n attrs: attrsOf(node)\n .toArray()\n .map((a) => ({ ...a })),\n bindings: bindingsOf(node)\n .toArray()\n .map((b) => ({ ...b })),\n children: childrenOf(node).map((child) => this.snapshotLive(child)),\n }\n if (prefix !== undefined) plain.prefix = prefix\n return plain\n }\n\n /**\n * Replace the registry entries of a subtree with plain copies, if they still point at these exact\n * live nodes. A node that was already re-registered elsewhere (moved) is left alone.\n */\n detach(node: LiveNode): void {\n this.detachInto(node, this.snapshotLive(node))\n }\n\n private detachInto(node: LiveNode, plain: PlainNode): void {\n const id = this.liveIds.get(node)\n if (id !== undefined && this.isCurrentLive(id, node)) {\n this.entries.set(id, { plain })\n }\n if (node instanceof Y.Text || plain.type === 'text') return\n if (isCompact(node)) {\n // The paragraph or packed element is going away; its open tree, if any, is detached with it.\n this.open.delete(node)\n this.dirty.delete(node)\n return\n }\n const liveChildren = childrenOf(node).toArray()\n liveChildren.forEach((child, index) => this.detachInto(child, plain.children[index]))\n }\n\n /**\n * Build Yjs types for a plain subtree placed where `scope` is in force, and register every node as\n * live. A rich paragraph or packed element stays open on the plain tree, which is already current.\n * A part's `root` is never packed.\n */\n toLive(plain: PlainNode, scope: Scope = new Map(), root = false): LiveNode {\n if (plain.type === 'text') {\n const text = new Y.Text()\n text.insert(0, plain.value)\n this.registerLive(plain.id, text)\n return text\n }\n const xml = plainToXml(plain) as XmlEl\n let map: Y.Map<unknown> | undefined\n if (isParagraphEl(plain)) {\n const encoded = encodeParagraph(xml.children)\n if (encoded) map = createRichParagraph(xml, encoded, scope)\n }\n if (!map && !root && packable(xml)) map = xmlToLive(xml, scope)\n if (map) {\n this.liveIds.set(map, plain.id)\n this.registerPlain(plain)\n this.own(plain, map)\n this.open.set(map, { live: map, root: plain, id: plain.id })\n return map\n }\n return this.toGenericLive(plain, scope)\n }\n\n private toGenericLive(plain: PlainElement, scope: Scope): Y.Map<unknown> {\n const map = xmlToGenericShell(plain)\n const inner = withBindings(scope, plain.bindings)\n const children = new Y.Array<LiveNode>()\n children.push(plain.children.map((child) => this.toLive(child, inner)))\n map.set('children', children)\n this.registerLive(plain.id, map)\n return map\n }\n\n /**\n * A live node that can be inserted into a parent (`scope` is in force there), or a part's `root`.\n * Anything not yet attached is built fresh; an attached node is copied, because a Yjs type cannot\n * have two parents.\n */\n attachable(id: string, scope: Scope = new Map(), root = false): LiveNode {\n return this.toLive(this.snapshot(id), scope, root)\n }\n}\n\nfunction xmlToGenericShell(plain: PlainElement): Y.Map<unknown> {\n const map = new Y.Map<unknown>()\n map.set('ns', plain.ns)\n map.set('local', plain.local)\n if (plain.prefix !== undefined) map.set('prefix', plain.prefix)\n const attrs = new Y.Array<AttrJson>()\n attrs.push(plain.attrs.map((a) => ({ ...a })))\n map.set('attrs', attrs)\n const bindings = new Y.Array<BindingJson>()\n bindings.push(plain.bindings.map((b) => ({ ...b })))\n map.set('bindings', bindings)\n return map\n}\n","/**\n * Apply core's canonical primitive journals to the Yjs mirror.\n *\n * One journal is one `TreePackageStore` transaction; its effects are applied in order inside one Yjs\n * transaction so peers receive a transaction as a single update. Anything that cannot be applied\n * faithfully throws a `JournalError`; the session turns that into a failed state rather than letting\n * the mirror drift from the local tree.\n */\nimport * as Y from 'yjs'\nimport type {\n CanonicalAttributeName,\n CanonicalPrimitiveEffect,\n CanonicalPrimitiveJournal,\n} from '@docx-editor.dev/core/collaboration/replication'\nimport type { AttrJson, BindingJson, RelationshipJson } from './encoding'\nimport { isCompact, scopeWithin } from './mirror'\nimport {\n attrsOf,\n bindingsOf,\n childrenOf,\n NodeRegistry,\n RegistryError,\n type LiveNode,\n type PlainElement,\n type PlainNode,\n} from './registry'\n\nexport class JournalError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'JournalError'\n }\n}\n\nexport interface JournalContext {\n /** Bytes of one binary package part, by the storage key a `putBinary` effect names. */\n binary(storageKey: string): Uint8Array | null\n}\n\nfunction sameAttr(a: AttrJson, qname: CanonicalAttributeName): boolean {\n return a.ns === qname.namespaceUri && a.local === qname.localName\n}\n\nfunction attrJson(qname: CanonicalAttributeName, value: string): AttrJson {\n const json: AttrJson = { ns: qname.namespaceUri, local: qname.localName, value }\n if (qname.prefix !== undefined) json.prefix = qname.prefix\n return json\n}\n\nfunction setAttribute(\n registry: NodeRegistry,\n id: string,\n qname: CanonicalAttributeName,\n value: string | null\n): void {\n const entry = registry.require(id)\n if ('plain' in entry) {\n const el = asPlainElement(entry.plain, id)\n const index = el.attrs.findIndex((a) => sameAttr(a, qname))\n if (value === null) {\n if (index >= 0) el.attrs.splice(index, 1)\n } else if (index >= 0) {\n el.attrs[index] = attrJson(qname, value)\n } else {\n el.attrs.push(attrJson(qname, value))\n }\n return\n }\n const attrs = attrsOf(asLiveElement(entry.live, id))\n const index = attrs.toArray().findIndex((a) => sameAttr(a, qname))\n if (index >= 0) attrs.delete(index, 1)\n if (value !== null) {\n if (index >= 0) attrs.insert(index, [attrJson(qname, value)])\n else attrs.push([attrJson(qname, value)])\n }\n}\n\nfunction setNamespaceBinding(\n registry: NodeRegistry,\n id: string,\n prefix: string,\n uri: string | null\n): void {\n const entry = registry.require(id)\n const binding: BindingJson | null = uri === null ? null : { prefix, ns: uri }\n if ('plain' in entry) {\n const el = asPlainElement(entry.plain, id)\n const index = el.bindings.findIndex((b) => b.prefix === prefix)\n if (index >= 0) el.bindings.splice(index, 1)\n if (binding) {\n if (index >= 0) el.bindings.splice(index, 0, binding)\n else el.bindings.push(binding)\n }\n return\n }\n const bindings = bindingsOf(asLiveElement(entry.live, id))\n const index = bindings.toArray().findIndex((b) => b.prefix === prefix)\n if (index >= 0) bindings.delete(index, 1)\n if (binding) {\n if (index >= 0) bindings.insert(index, [binding])\n else bindings.push([binding])\n }\n}\n\nfunction asLiveElement(node: LiveNode, id: string): Y.Map<unknown> {\n if (node instanceof Y.Text) throw new JournalError(`${id} is a text node, not an element`)\n return node\n}\n\nfunction asPlainElement(node: PlainNode, id: string): PlainElement {\n if (node.type === 'text') throw new JournalError(`${id} is a text node, not an element`)\n return node\n}\n\nfunction spliceText(\n registry: NodeRegistry,\n id: string,\n start: number,\n deleteCount: number,\n insert: string\n): void {\n const entry = registry.require(id)\n if ('plain' in entry) {\n const text = entry.plain\n if (text.type !== 'text') throw new JournalError(`${id} is not a text node`)\n text.value = text.value.slice(0, start) + insert + text.value.slice(start + deleteCount)\n return\n }\n const text = entry.live\n if (!(text instanceof Y.Text)) throw new JournalError(`${id} is not a text node`)\n if (start < 0 || start + deleteCount > text.length) {\n throw new JournalError(`text splice out of range on ${id}`)\n }\n if (deleteCount > 0) text.delete(start, deleteCount)\n if (insert.length > 0) text.insert(start, insert)\n}\n\n/** Detach the nodes a splice is about to remove, while their content can still be read. */\nfunction detachRemoved(\n registry: NodeRegistry,\n parent: Y.Array<LiveNode>,\n start: number,\n count: number\n): void {\n for (let i = start; i < start + count; i++) registry.detach(parent.get(i))\n}\n\nfunction spliceChildren(\n registry: NodeRegistry,\n parentId: string,\n start: number,\n deleteCount: number,\n childIds: readonly string[]\n): void {\n const parentEntry = registry.require(parentId)\n if ('plain' in parentEntry) {\n const parent = asPlainElement(parentEntry.plain, parentId)\n if (start < 0 || start + deleteCount > parent.children.length) {\n throw new JournalError(`child splice out of range on ${parentId}`)\n }\n const inserted = childIds.map((id) => registry.snapshot(id))\n parent.children.splice(start, deleteCount, ...inserted)\n registry.adopt(parent, inserted)\n return\n }\n const parent = asLiveElement(parentEntry.live, parentId)\n const children = childrenOf(parent)\n if (start < 0 || start + deleteCount > children.length) {\n throw new JournalError(`child splice out of range on ${parentId}`)\n }\n detachRemoved(registry, children, start, deleteCount)\n const scope = scopeWithin(parent)\n const inserted = childIds.map((id) => registry.attachable(id, scope))\n if (deleteCount > 0) children.delete(start, deleteCount)\n if (inserted.length > 0) children.insert(start, inserted)\n}\n\n/** Position of a live node inside its parent's child list. */\nfunction locate(\n registry: NodeRegistry,\n id: string,\n node: LiveNode\n): { children: Y.Array<LiveNode>; index: number } {\n const children = node.parent\n if (!(children instanceof Y.Array)) throw new JournalError(`${id} is not attached`)\n const index = (children as Y.Array<LiveNode>).toArray().indexOf(node)\n if (index < 0) throw new JournalError(`${id} is not in its parent`)\n void registry\n return { children: children as Y.Array<LiveNode>, index }\n}\n\nfunction moveNode(\n registry: NodeRegistry,\n id: string,\n destinationId: string,\n destinationIndex: number\n): void {\n const entry = registry.require(id)\n const live = 'live' in entry ? entry.live : registry.liveOfRoot(entry.plain)\n const copy = registry.snapshot(id)\n\n if (live) {\n const { children: source, index } = locate(registry, id, live)\n registry.detach(live)\n source.delete(index, 1)\n } else {\n // A node inside a rich paragraph: take it out of its parent in the open tree.\n const plain = 'plain' in entry ? entry.plain : undefined\n const where = plain && registry.locatePlain(plain)\n if (!where) throw new JournalError(`cannot move detached node ${id}`)\n where.parent.children.splice(where.index, 1)\n registry.touch(where.parent)\n }\n\n const destinationEntry = registry.require(destinationId)\n if ('plain' in destinationEntry) {\n const destination = asPlainElement(destinationEntry.plain, destinationId)\n destination.children.splice(destinationIndex, 0, copy)\n registry.adopt(destination, [copy])\n return\n }\n const destination = asLiveElement(destinationEntry.live, destinationId)\n childrenOf(destination).insert(destinationIndex, [\n registry.toLive(copy, scopeWithin(destination)),\n ])\n}\n\n/**\n * A node that keeps its id but changes what it is: core diffs a node against its new version under\n * the same id and puts the new descriptor when its name changed (rejecting a deletion turns its\n * `w:delText` back into `w:t`), then diffs its attributes and children against the node as it was.\n * So the node is renamed where it stands, keeping its attributes and children. Answers false when\n * it cannot be renamed in place (a text node, a paragraph held as rich text).\n */\nfunction renameNode(registry: NodeRegistry, id: string, qname: CanonicalAttributeName): boolean {\n const entry = registry.require(id)\n if ('plain' in entry) {\n const el = entry.plain\n if (el.type !== 'element') return false\n el.ns = qname.namespaceUri\n el.local = qname.localName\n if (qname.prefix === undefined) delete el.prefix\n else el.prefix = qname.prefix\n registry.touch(el)\n return true\n }\n const live = entry.live\n if (live instanceof Y.Text || isCompact(live)) return false\n if (live.get('ns') !== qname.namespaceUri) live.set('ns', qname.namespaceUri)\n if (live.get('local') !== qname.localName) live.set('local', qname.localName)\n if (qname.prefix === undefined) {\n if (live.has('prefix')) live.delete('prefix')\n } else if (live.get('prefix') !== qname.prefix) live.set('prefix', qname.prefix)\n return true\n}\n\nfunction putNode(\n registry: NodeRegistry,\n effect: Extract<CanonicalPrimitiveEffect, { kind: 'putNode' }>\n): void {\n const d = effect.descriptor\n if (\n d.kind !== 'textValue' &&\n registry.has(d.logicalId) &&\n renameNode(registry, d.logicalId, d.qname)\n )\n return\n if (d.kind === 'textValue') {\n registry.registerPlain({ type: 'text', id: d.logicalId, value: '' })\n return\n }\n const element: PlainElement = {\n type: 'element',\n id: d.logicalId,\n ns: d.qname.namespaceUri,\n local: d.qname.localName,\n attrs: [],\n bindings: [],\n children: [],\n }\n if (d.qname.prefix !== undefined) element.prefix = d.qname.prefix\n registry.registerPlain(element)\n}\n\nfunction rootFor(registry: NodeRegistry, id: string): Y.Map<unknown> {\n const entry = registry.require(id)\n const live =\n 'live' in entry && entry.live.parent === null\n ? entry.live\n : registry.attachable(id, new Map(), true)\n return asLiveElement(live, id)\n}\n\nfunction applyEffect(\n doc: Y.Doc,\n registry: NodeRegistry,\n effect: CanonicalPrimitiveEffect,\n context: JournalContext\n): void {\n switch (effect.kind) {\n case 'putNode':\n putNode(registry, effect)\n return\n case 'spliceText':\n spliceText(registry, effect.logicalId, effect.utf16Start, effect.deleteCount, effect.insert)\n return\n case 'setAttribute':\n setAttribute(registry, effect.logicalId, effect.qname, effect.value)\n return\n case 'setNamespaceBinding':\n setNamespaceBinding(registry, effect.logicalId, effect.prefix, effect.uri)\n return\n case 'spliceChildren':\n spliceChildren(\n registry,\n effect.parentLogicalId,\n effect.start,\n effect.deleteCount,\n effect.childLogicalIds\n )\n return\n case 'moveNode':\n moveNode(\n registry,\n effect.logicalId,\n effect.destinationParentLogicalId,\n effect.destinationIndex\n )\n return\n case 'putXmlPart':\n doc.getMap<Y.Map<unknown>>('parts').set(effect.name, rootFor(registry, effect.rootLogicalId))\n return\n case 'deleteXmlPart':\n doc.getMap('parts').delete(effect.name)\n return\n case 'putRelationship': {\n const rels = doc.getMap<Y.Map<RelationshipJson>>('rels')\n let byId = rels.get(effect.owner)\n if (!byId) {\n byId = new Y.Map<RelationshipJson>()\n rels.set(effect.owner, byId)\n }\n byId.set(effect.record.id, { ...effect.record })\n return\n }\n case 'deleteRelationship':\n doc.getMap<Y.Map<RelationshipJson>>('rels').get(effect.owner)?.delete(effect.relationshipId)\n return\n case 'putContentTypeOverride':\n doc.getMap<string>('ctOverrides').set(effect.partName.toLowerCase(), effect.mediaType)\n return\n case 'deleteContentTypeOverride':\n doc.getMap('ctOverrides').delete(effect.partName.toLowerCase())\n return\n case 'putBinary': {\n const bytes = context.binary(effect.descriptor.storageKey)\n if (!bytes) throw new JournalError(`binary ${effect.descriptor.storageKey} is not available`)\n doc.getMap<Uint8Array>('binaries').set(effect.descriptor.storageKey, bytes)\n return\n }\n case 'deleteBinary':\n doc.getMap('binaries').delete(effect.storageKey)\n return\n }\n}\n\n/** Apply one journal inside a single Yjs transaction carrying `origin`. */\nexport function applyJournal(\n doc: Y.Doc,\n registry: NodeRegistry,\n journal: CanonicalPrimitiveJournal,\n origin: unknown,\n context: JournalContext\n): void {\n try {\n doc.transact(() => {\n for (const effect of journal.effects) applyEffect(doc, registry, effect, context)\n registry.flushRich()\n }, origin)\n } catch (error) {\n if (error instanceof JournalError || error instanceof RegistryError) throw error\n throw new JournalError(error instanceof Error ? error.message : String(error))\n }\n}\n","/**\n * Binds one Yjs room to one local document port, in both directions, without a network.\n *\n * Local: every journal the port settles is applied to the mirror inside a Yjs transaction tagged with\n * `LOCAL_ORIGIN`, so peers receive it as one update and the undo manager can scope to it.\n *\n * Remote: any transaction that did not originate here (a provider, or the undo manager) is\n * materialised into a frozen package and published through `port.applyRemotePackage`, after which\n * the identity registry is rebuilt, because the store re-derives positional ids from that package.\n *\n * Ordering rule: local journals must reach the mirror before a remote update is integrated, since\n * their child indices are relative to the tree as it was. `beforeRemote` flushes them; a transport\n * calls it ahead of applying inbound data.\n *\n * A remote change is published as soon as it is integrated, never later: while the mirror is ahead\n * of the local tree, an edit the editor computes on that tree lands at stale offsets.\n */\nimport * as Y from 'yjs'\nimport { ORIGIN_IDS } from '@docx-editor.dev/core/store'\nimport type {\n CanonicalPrimitiveJournal,\n CollaborationDocumentPort,\n} from '@docx-editor.dev/core/collaboration/replication'\nimport { MaterializeCache, materialize, registerMirror, MaterializeError } from './encoding'\nimport { applyJournal, JournalError } from './journal'\nimport { NodeRegistry, RegistryError } from './registry'\n\nexport const LOCAL_ORIGIN = Symbol('arbi-coedit/local')\n\nexport type SyncFailure = 'journal' | 'materialize' | 'apply'\n\nexport interface MirrorSyncOptions {\n doc: Y.Doc\n port: CollaborationDocumentPort\n actorId: string\n /** Called once when the mirror and the local tree can no longer be kept identical. */\n onFailure?: (code: SyncFailure, detail: string) => void\n /** Called with each local journal just before it is applied to the mirror. */\n onLocalJournal?: (journal: CanonicalPrimitiveJournal) => void\n /**\n * Called just before a remote change is published to the port. The function it returns, if any,\n * is called once the port holds the new tree.\n */\n aroundRemote?: () => (() => void) | void\n}\n\nexport class MirrorSync {\n readonly doc: Y.Doc\n readonly registry = new NodeRegistry()\n private readonly cache: MaterializeCache\n private readonly port: CollaborationDocumentPort\n private readonly actorId: string\n private readonly onFailure?: (code: SyncFailure, detail: string) => void\n private readonly onLocalJournal?: (journal: CanonicalPrimitiveJournal) => void\n private readonly aroundRemote?: () => (() => void) | void\n private readonly disposers: (() => void)[] = []\n private operation = 0\n private applyingRemote = false\n private failed = false\n /** Parts whose node ids must be re-registered before the next local journal; true means all. */\n private staleParts: Set<string> | true | null = null\n\n constructor(options: MirrorSyncOptions) {\n this.doc = options.doc\n this.port = options.port\n this.actorId = options.actorId\n this.onFailure = options.onFailure\n this.onLocalJournal = options.onLocalJournal\n this.aroundRemote = options.aroundRemote\n registerMirror(this.doc, this.registry)\n this.cache = new MaterializeCache(this.doc)\n this.disposers.push(() => this.cache.destroy())\n\n this.disposers.push(\n this.port.observePrimitiveJournal((journal) => {\n if (this.failed || this.applyingRemote) return\n try {\n this.refreshRegistry()\n this.onLocalJournal?.(journal)\n applyJournal(this.doc, this.registry, journal, LOCAL_ORIGIN, {\n binary: (key) => this.port.binaryPart(key),\n })\n } catch (error) {\n this.fail('journal', error)\n }\n })\n )\n\n const onAfterTransaction = (transaction: Y.Transaction): void => {\n if (transaction.origin === LOCAL_ORIGIN || this.failed) return\n if (transaction.changed.size === 0 && transaction.changedParentTypes.size === 0) return\n this.publishRemote(transaction.origin)\n }\n this.doc.on('afterTransaction', onAfterTransaction)\n this.disposers.push(() => this.doc.off('afterTransaction', onAfterTransaction))\n }\n\n get hasFailed(): boolean {\n return this.failed\n }\n\n /** Mirror any journal still queued locally. Call before integrating inbound updates. */\n beforeRemote(): void {\n this.port.flushPendingJournals()\n }\n\n /** Make the local tree equal to the room: used when the editor opened an older snapshot of it. */\n adopt(): void {\n this.publishRemote(undefined)\n }\n\n /** Re-register node ids for parts a remote publication replaced; deferred until a local edit needs them. */\n private refreshRegistry(): void {\n if (this.staleParts === null) return\n registerMirror(this.doc, this.registry, this.staleParts === true ? undefined : this.staleParts)\n this.staleParts = null\n }\n\n private publishRemote(origin: unknown): void {\n if (this.failed) return\n const published = this.aroundRemote?.()\n this.applyingRemote = true\n const changed = this.cache.take()\n let ok = false\n try {\n const result = this.port.applyRemotePackage(materialize(this.doc, this.cache, changed), {\n // The editor's own origin for a peer's change: it carries the local caret only across those.\n origin: ORIGIN_IDS.mutationRemote,\n actorId: typeof origin === 'string' ? origin : this.actorId,\n operationId: `${this.actorId}:remote:${this.operation++}`,\n })\n if (!result.ok) throw new JournalError(result.reason)\n if (changed === null || this.staleParts === true) this.staleParts = true\n else this.staleParts = new Set([...(this.staleParts ?? []), ...changed])\n ok = true\n } catch (error) {\n this.cache.restore(changed)\n this.fail(error instanceof MaterializeError ? 'materialize' : 'apply', error)\n } finally {\n this.applyingRemote = false\n }\n if (ok) published?.()\n }\n\n private fail(code: SyncFailure, error: unknown): void {\n if (this.failed) return\n this.failed = true\n const detail =\n error instanceof JournalError ||\n error instanceof RegistryError ||\n error instanceof MaterializeError\n ? error.message\n : error instanceof Error\n ? error.message\n : String(error)\n this.onFailure?.(code, detail)\n }\n\n destroy(): void {\n for (const dispose of this.disposers.splice(0)) dispose()\n }\n}\n","/**\n * The collaboration session the editor attaches: status, own-edit undo, presence and selections,\n * on top of a Yjs room and the `MirrorSync` that keeps the room and the local document identical.\n *\n * It implements core's `EditorCollaborationSession` contract and nothing beyond it, so it can be\n * handed to `collaborationModule`-style hosts and to headless automation hosts alike. The transport\n * (Hocuspocus, or nothing at all in tests) tells it when the room is synced, dropped or rejected.\n */\nimport * as Y from 'yjs'\nimport type { Awareness } from 'y-protocols/awareness'\nimport {\n createCollaborationStatusTracker,\n safeParticipantColor,\n type CollaborationFailureCode,\n type CollaborationIdentity,\n type CollaborationLocalSelection,\n type CollaborationParticipant,\n type CollaborationRemoteSelection,\n type CollaborationRemoteSelectionAddress,\n type CollaborationSelectionAddress,\n type CollaborationSelectionMove,\n type CollaborationStatus,\n type CollaborationStatusSnapshot,\n type EditorCollaborationSession,\n} from '@docx-editor.dev/core/collaboration'\nimport {\n historyGroupOfJournal,\n mapOffsetAcrossText,\n type CollaborationDocumentPort,\n} from '@docx-editor.dev/core/collaboration/replication'\nimport { COLLAB_FORMAT, isBootstrapped, readFormat } from './encoding'\nimport { LOCAL_ORIGIN, MirrorSync, type SyncFailure } from './sync'\n\nconst MAX_TEXT = 128\n/** Undo steps are closed by gesture boundaries, never by a clock. */\nconst NEVER = 1000 * 60 * 60 * 24 * 365\n\nexport interface DocxCollaborationSessionOptions {\n doc: Y.Doc\n awareness: Awareness\n documentId: string\n identity: CollaborationIdentity\n /** Keep accepting edits while the transport is down; they merge on reconnect. */\n offlineEditing?: boolean\n}\n\nexport class CollaborationSessionError extends Error {\n readonly code: CollaborationFailureCode\n constructor(code: CollaborationFailureCode, message?: string) {\n super(message ?? code)\n this.name = 'CollaborationSessionError'\n this.code = code\n }\n}\n\nfunction validateIdentity(identity: CollaborationIdentity): CollaborationIdentity {\n const bad = (value: unknown): boolean =>\n typeof value !== 'string' || value.length === 0 || value.length > MAX_TEXT\n if (bad(identity.actorId) || bad(identity.name)) {\n throw new CollaborationSessionError('invalid-identity')\n }\n if (identity.color !== undefined && safeParticipantColor(identity.color) === undefined) {\n throw new CollaborationSessionError('invalid-identity-color')\n }\n return identity\n}\n\nfunction readIdentity(value: unknown): CollaborationIdentity | undefined {\n if (!value || typeof value !== 'object') return undefined\n const { actorId, name, color, role } = value as Record<string, unknown>\n if (typeof actorId !== 'string' || actorId.length === 0 || actorId.length > MAX_TEXT)\n return undefined\n if (typeof name !== 'string' || name.length === 0 || name.length > MAX_TEXT) return undefined\n return {\n actorId,\n name,\n ...(typeof color === 'string' && safeParticipantColor(color) ? { color } : {}),\n ...(role === 'human' || role === 'agent' ? { role } : {}),\n }\n}\n\ntype StatusListener = Parameters<EditorCollaborationSession['subscribeStatus']>[0]\n\nexport class DocxCollaborationSession implements EditorCollaborationSession {\n readonly documentId: string\n readonly sessionId: string\n readonly identity: CollaborationIdentity\n\n private readonly doc: Y.Doc\n private readonly awareness: Awareness\n private readonly offlineEditing: boolean\n private readonly tracker = createCollaborationStatusTracker('initializing')\n private readonly statusListeners = new Set<StatusListener>()\n private readonly participantListeners = new Set<\n (participants: readonly CollaborationParticipant[]) => void\n >()\n private readonly selectionListeners = new Set<\n (selections: readonly CollaborationRemoteSelection[]) => void\n >()\n private readonly undoManager: Y.UndoManager\n private sync: MirrorSync | undefined\n private port: CollaborationDocumentPort | undefined\n private lastGroup: symbol | undefined\n private participantsCache: readonly CollaborationParticipant[] = []\n private selectionsCache: readonly CollaborationRemoteSelection[] = []\n private selectionsKey = '[]'\n private baselineVector: string | undefined\n /** The selection the editor last published, carried across the remote changes since. */\n private carried: CarriedSelection | null = null\n private selectionMove: CollaborationSelectionMove | null = null\n private inputFlush: (() => void) | null = null\n private readonly disposers: (() => void)[] = []\n\n constructor(options: DocxCollaborationSessionOptions) {\n this.documentId = options.documentId\n this.identity = validateIdentity(options.identity)\n this.sessionId = `${options.identity.actorId}:${randomToken()}`\n this.doc = options.doc\n this.awareness = options.awareness\n this.offlineEditing = options.offlineEditing ?? false\n\n this.undoManager = new Y.UndoManager(\n [\n this.doc.getMap('parts'),\n this.doc.getMap('rels'),\n this.doc.getMap('ctOverrides'),\n this.doc.getMap('binaries'),\n ],\n { trackedOrigins: new Set([LOCAL_ORIGIN]), captureTimeout: NEVER }\n )\n\n this.awareness.setLocalStateField('user', this.identity)\n const onAwareness = (): void => {\n this.refreshParticipants()\n this.refreshSelections()\n }\n this.awareness.on('change', onAwareness)\n this.disposers.push(() => this.awareness.off('change', onAwareness))\n this.refreshParticipants()\n }\n\n // ── Status ───────────────────────────────────────────────────────────────\n\n status(): CollaborationStatus {\n return this.tracker.status()\n }\n\n statusSnapshot(): CollaborationStatusSnapshot {\n return this.tracker.snapshot()\n }\n\n subscribeStatus(listener: StatusListener): () => void {\n this.statusListeners.add(listener)\n return () => this.statusListeners.delete(listener)\n }\n\n private setStatus(\n status: CollaborationStatus,\n code?: CollaborationFailureCode,\n detail?: string\n ): void {\n if (this.tracker.status() === 'destroyed') return\n if (!this.tracker.set(status, code, detail)) return\n for (const listener of [...this.statusListeners]) listener(status, code, detail)\n }\n\n /** The room has synced and holds a document this build understands. */\n markReady(): void {\n if (!isBootstrapped(this.doc)) {\n this.setStatus('error', 'not-initialized')\n return\n }\n if (readFormat(this.doc) !== COLLAB_FORMAT) {\n this.setStatus('error', 'collaboration-format-mismatch', readFormat(this.doc))\n return\n }\n this.baselineVector = vectorKey(this.doc)\n this.setStatus('ready')\n }\n\n markDisconnected(): void {\n if (this.status() === 'ready') this.setStatus('disconnected', 'transport-disconnected')\n }\n\n markReconnected(): void {\n if (this.status() === 'disconnected') this.setStatus('ready')\n }\n\n markFailed(code: CollaborationFailureCode, detail?: string): void {\n this.setStatus('error', code, detail)\n }\n\n /** True once an editor has attached its document port. */\n get attached(): boolean {\n return this.port !== undefined\n }\n\n gateOperations(): CollaborationFailureCode | null {\n switch (this.status()) {\n case 'ready':\n return this.port ? null : 'collaboration-session-not-attached'\n case 'disconnected':\n return this.offlineEditing && this.port ? null : 'collaboration-session-not-ready'\n case 'destroyed':\n return 'collaboration-session-destroyed'\n default:\n return 'collaboration-session-not-ready'\n }\n }\n\n // ── Attachment ───────────────────────────────────────────────────────────\n\n attach(port: CollaborationDocumentPort): () => void {\n if (this.port) {\n this.markFailed('port-already-attached')\n return () => {}\n }\n if (port.documentId !== this.documentId) {\n this.markFailed('document-id-mismatch')\n return () => {}\n }\n this.port = port\n const sync = new MirrorSync({\n doc: this.doc,\n port,\n actorId: this.identity.actorId,\n aroundRemote: () => this.carrySelection(),\n onFailure: (code: SyncFailure, detail: string) => {\n this.markFailed(code === 'journal' ? 'local-mirror-failed' : 'remote-apply-failed', detail)\n },\n onLocalJournal: (journal) => {\n const group = historyGroupOfJournal(journal)\n if (group === undefined || group !== this.lastGroup) this.undoManager.stopCapturing()\n this.lastGroup = group\n },\n })\n this.sync = sync\n // The editor opened bytes written from the room as it was. If the room moved since, adopt it.\n if (this.baselineVector !== undefined && this.baselineVector !== vectorKey(this.doc)) {\n sync.adopt()\n }\n const onPortChange = port.subscribe(() => this.refreshSelections())\n return () => {\n onPortChange()\n sync.destroy()\n if (this.sync === sync) this.sync = undefined\n if (this.port === port) this.port = undefined\n }\n }\n\n /** Transport hook: call before integrating inbound Yjs data so queued local edits are mirrored first. */\n beforeRemote(): void {\n // Typing the editor still holds lands on the tree it was typed on, before the peer's change.\n this.inputFlush?.()\n this.sync?.beforeRemote()\n }\n\n /**\n * Bind the editor's pending-input flush (`PaginatedSurface.flushPendingInput`). The session writes\n * below the editor's input buffer, so it lands queued typing before a remote change and lays the\n * change out right after it: the editor carries its caret at that layout, and a keystroke before\n * it would otherwise use the caret from before the change. Returns the unbind function.\n */\n bindEditorInput(flush: () => void): () => void {\n this.inputFlush = flush\n return () => {\n if (this.inputFlush === flush) this.inputFlush = null\n }\n }\n\n // ── Undo ─────────────────────────────────────────────────────────────────\n\n canUndo(): boolean {\n return this.undoManager.undoStack.length > 0\n }\n\n canRedo(): boolean {\n return this.undoManager.redoStack.length > 0\n }\n\n undo(): boolean {\n this.flushPendingJournals()\n if (this.gateOperations() !== null || !this.canUndo()) return false\n this.undoManager.stopCapturing()\n this.undoManager.undo()\n return true\n }\n\n redo(): boolean {\n this.flushPendingJournals()\n if (this.gateOperations() !== null || !this.canRedo()) return false\n this.undoManager.stopCapturing()\n this.undoManager.redo()\n return true\n }\n\n // ── Presence ─────────────────────────────────────────────────────────────\n\n setLocalSelection(selection: CollaborationLocalSelection | null): void {\n this.carried = selection && selection.kind !== 'cells' ? { from: null, selection } : null\n this.selectionMove = null\n this.awareness.setLocalStateField('selection', selection)\n }\n\n /** Where the last remote change carried the local selection; see `carrySelection`. */\n remoteSelectionMove(): CollaborationSelectionMove | null {\n return this.selectionMove\n }\n\n /**\n * Called before a remote change reaches the port: notes the selection's paragraphs and their text,\n * and returns what carries it across the change once the port holds the new tree. The editor\n * takes the carried selection when a local edit was coalesced with the remote change, where it\n * cannot map its caret by the text alone. Several remote changes before the editor publishes its\n * selection again chain, all from the selection it published.\n */\n private carrySelection(): () => void {\n const port = this.port\n const carried = this.carried\n const settle = () => this.inputFlush?.()\n if (!port || !carried) return settle\n const before = (address: CollaborationSelectionAddress) => {\n const paragraph = port.paragraphByStableId(address.paragraphId)\n if (!paragraph) return null\n const offset = Math.min(address.offset, paragraph.text.length)\n return { nodeId: paragraph.nodeId, text: paragraph.text, offset }\n }\n const anchor = before(carried.selection.anchor)\n const head = before(carried.selection.head)\n if (!anchor || !head) {\n this.carried = null\n this.selectionMove = null\n return settle\n }\n const from = carried.from ?? {\n anchor: { nodeId: anchor.nodeId, offset: anchor.offset },\n head: { nodeId: head.nodeId, offset: head.offset },\n }\n return () => {\n const after = (\n address: CollaborationSelectionAddress,\n was: { text: string; offset: number }\n ) => {\n const paragraph = port.paragraphByStableId(address.paragraphId)\n if (!paragraph) return null\n const offset = mapOffsetAcrossText(was.offset, was.text, paragraph.text)\n return { paragraphId: address.paragraphId, nodeId: paragraph.nodeId, offset }\n }\n const nextAnchor = after(carried.selection.anchor, anchor)\n const nextHead = after(carried.selection.head, head)\n if (!nextAnchor || !nextHead) {\n this.carried = null\n this.selectionMove = null\n } else {\n this.carried = {\n from,\n selection: {\n ...carried.selection,\n anchor: { paragraphId: nextAnchor.paragraphId, offset: nextAnchor.offset },\n head: { paragraphId: nextHead.paragraphId, offset: nextHead.offset },\n },\n }\n this.selectionMove = {\n from,\n to: {\n anchor: { nodeId: nextAnchor.nodeId, offset: nextAnchor.offset },\n head: { nodeId: nextHead.nodeId, offset: nextHead.offset },\n },\n }\n }\n settle()\n }\n }\n\n participants(): readonly CollaborationParticipant[] {\n return this.participantsCache\n }\n\n subscribeParticipants(\n listener: (participants: readonly CollaborationParticipant[]) => void\n ): () => void {\n this.participantListeners.add(listener)\n return () => this.participantListeners.delete(listener)\n }\n\n remoteSelections(): readonly CollaborationRemoteSelection[] {\n return this.selectionsCache\n }\n\n subscribeRemoteSelections(\n listener: (selections: readonly CollaborationRemoteSelection[]) => void\n ): () => void {\n this.selectionListeners.add(listener)\n return () => this.selectionListeners.delete(listener)\n }\n\n private refreshParticipants(): void {\n const byActor = new Map<string, CollaborationParticipant>()\n for (const [clientId, state] of this.awareness.getStates()) {\n const identity = readIdentity((state as { user?: unknown }).user)\n if (!identity) continue\n const isLocal = clientId === this.awareness.clientID\n const existing = byActor.get(identity.actorId)\n byActor.set(identity.actorId, { ...identity, isLocal: isLocal || existing?.isLocal === true })\n }\n const next = [...byActor.values()].sort((a, b) => Number(b.isLocal) - Number(a.isLocal))\n const same =\n next.length === this.participantsCache.length &&\n next.every((p, i) => {\n const previous = this.participantsCache[i]\n return (\n p.actorId === previous.actorId &&\n p.name === previous.name &&\n p.color === previous.color &&\n p.isLocal === previous.isLocal\n )\n })\n if (same) return\n this.participantsCache = next\n for (const listener of [...this.participantListeners]) listener(next)\n }\n\n private refreshSelections(): void {\n const port = this.port\n const next: CollaborationRemoteSelection[] = []\n if (port) {\n for (const [clientId, state] of this.awareness.getStates()) {\n if (clientId === this.awareness.clientID) continue\n const record = state as { user?: unknown; selection?: CollaborationLocalSelection | null }\n const identity = readIdentity(record.user)\n const selection = record.selection\n if (!identity || !selection) continue\n const anchor = resolveAddress(port, selection.anchor)\n const head = resolveAddress(port, selection.head)\n if (!anchor || !head) continue\n next.push({\n actorId: identity.actorId,\n name: identity.name,\n ...(identity.color ? { color: identity.color } : {}),\n anchor,\n head,\n ...(selection.kind ? { kind: selection.kind } : {}),\n })\n }\n }\n const key = JSON.stringify(next)\n if (key === this.selectionsKey) return\n this.selectionsKey = key\n this.selectionsCache = next\n for (const listener of [...this.selectionListeners]) listener(next)\n }\n\n // ── Lifecycle ────────────────────────────────────────────────────────────\n\n flushPendingJournals(): void {\n this.port?.flushPendingJournals()\n }\n\n destroy(): void {\n if (this.status() === 'destroyed') return\n this.flushPendingJournals()\n this.sync?.destroy()\n this.sync = undefined\n this.port = undefined\n this.inputFlush = null\n this.undoManager.destroy()\n this.awareness.setLocalState(null)\n for (const dispose of this.disposers.splice(0)) dispose()\n this.setStatus('destroyed')\n this.statusListeners.clear()\n this.participantListeners.clear()\n this.selectionListeners.clear()\n }\n}\n\ninterface CarriedSelection {\n /** The selection as the editor published it, in its node ids then; null until a change carried it. */\n from: CollaborationSelectionMove['from'] | null\n /** Where that selection stands now, in stable paragraph ids. */\n selection: CollaborationLocalSelection\n}\n\nfunction resolveAddress(\n port: CollaborationDocumentPort,\n address: { paragraphId: string; offset: number } | undefined\n): CollaborationRemoteSelectionAddress | undefined {\n if (!address || typeof address.paragraphId !== 'string' || !Number.isInteger(address.offset)) {\n return undefined\n }\n const paragraph = port.paragraphByStableId(address.paragraphId)\n if (!paragraph) return undefined\n return {\n paragraphId: paragraph.paragraphId,\n nodeId: paragraph.nodeId,\n offset: Math.max(0, Math.min(address.offset, paragraph.text.length)),\n }\n}\n\nfunction vectorKey(doc: Y.Doc): string {\n return Array.from(Y.encodeStateVector(doc)).join(',')\n}\n\n/** Unique per attachment. `crypto.randomUUID` is absent outside secure contexts, so fall back. */\nfunction randomToken(): string {\n if (typeof crypto.randomUUID === 'function') return crypto.randomUUID()\n const bytes = crypto.getRandomValues(new Uint8Array(16))\n return Array.from(bytes, (byte) => byte.toString(16).padStart(2, '0')).join('')\n}\n","import { COLLAB_FORMAT } from './encoding'\n\nexport const COLLAB_PROTOCOL = 1\n\n/** What a client sends with its token so the server can refuse an incompatible build. */\nexport const DOCUMENT_COLLABORATION_VERSIONS = {\n format: COLLAB_FORMAT,\n protocol: COLLAB_PROTOCOL,\n} as const\n\n/**\n * The reason a server refusing an incompatible client gives (Hocuspocus `permission-denied` reason):\n * this prefix and the server's own format.\n */\nexport const FORMAT_REFUSAL = 'collaboration-format:'\n\nconst formatNumber = (format: string): number => Number(format.split('/').pop())\n\n/**\n * A refusal because client and server run different room formats: whether the server is newer (the\n * page should reload to get the matching editor) or older (its update is still rolling out: retry).\n * Null for any other reason.\n */\nexport function formatRefusal(reason: string | undefined): { serverNewer: boolean } | null {\n if (!reason?.startsWith(FORMAT_REFUSAL)) return null\n const server = reason.slice(FORMAT_REFUSAL.length)\n return { serverNewer: formatNumber(server) > formatNumber(COLLAB_FORMAT) }\n}\n","/**\n * Server side of a collaboration room: seeding a room from DOCX bytes, reading it back out, checking\n * that a client speaks this room format, and a headless automation host that edits a live room.\n *\n * Nothing here knows about HTTP or Hocuspocus. The collaboration service owns transport, auth and\n * persistence and calls into these functions with a `Y.Doc`.\n */\nimport * as Y from 'yjs'\nimport { Awareness } from 'y-protocols/awareness'\nimport {\n createServerAutomationHost,\n type ServerAutomationHostOptions,\n} from '@docx-editor.dev/core/automation'\nimport type { CollaborationIdentity } from '@docx-editor.dev/core/collaboration'\nimport { createCollaborationDocumentPort } from '@docx-editor.dev/core/collaboration/replication'\nimport {\n headlessViewOfStore,\n ORIGIN_IDS,\n TreePackageStore,\n type PackageTransactResult,\n validateRasterHeader,\n type HeadlessDocumentView,\n type ImageDecodePort,\n type TreeDocOp,\n} from '@docx-editor.dev/core/store'\nimport {\n documentNumbering,\n documentStyleIds,\n fragmentPackage,\n paragraphRunsXml,\n readParagraphs,\n stylesUsed,\n type DocPoint,\n type OoxmlNodeLike,\n type ReferencesPort,\n} from './commands'\nimport type { Revision } from './template/track'\nimport {\n bootstrapFromBytes,\n COLLAB_FORMAT,\n isBootstrapped,\n MaterializeError,\n materialize,\n materializeBytes,\n readFormat,\n} from './encoding'\nimport { DocxCollaborationSession } from './session'\nimport { COLLAB_PROTOCOL, FORMAT_REFUSAL } from './versions'\n\nexport { COLLAB_PROTOCOL, DOCUMENT_COLLABORATION_VERSIONS, FORMAT_REFUSAL } from './versions'\n\nexport class CollaborationCompatibilityError extends Error {\n /** What Hocuspocus sends the refused client (`onAuthenticationFailed`'s reason). */\n readonly reason: string\n constructor(message: string, reason = 'permission-denied') {\n super(message)\n this.name = 'CollaborationCompatibilityError'\n this.reason = reason\n }\n}\n\n/**\n * Throws unless the client runs this build's room format and protocol. The refusal's `reason` names\n * this server's format (`formatRefusal` on the client), so the editor can reload into the matching\n * build, or wait for this server's update, instead of failing.\n */\nexport function assertCompatibleVersions(versions: unknown): void {\n const v = versions as { format?: unknown; protocol?: unknown } | null | undefined\n if (!v || v.format !== COLLAB_FORMAT || v.protocol !== COLLAB_PROTOCOL) {\n throw new CollaborationCompatibilityError(\n 'This editor build is not compatible with the collaboration server. Reload the page.',\n FORMAT_REFUSAL + COLLAB_FORMAT\n )\n }\n}\n\n/** Throws unless the room is in this build's format. */\nexport function assertRoomFormat(doc: Y.Doc): void {\n if (!isBootstrapped(doc)) throw new CollaborationCompatibilityError('The room holds no document.')\n const format = readFormat(doc)\n if (format !== COLLAB_FORMAT) {\n throw new CollaborationCompatibilityError(`Unsupported room format ${String(format)}.`)\n }\n}\n\n/**\n * A stored room state of an earlier room format, re-encoded in this one: its package is read out\n * (elements are read the same way whatever form an earlier format gave them) and seeded again, so\n * nothing the room held is lost. Throws `MaterializeError` when the state cannot be read.\n */\nexport function reencodeRoom(doc: Y.Doc, state: Uint8Array): void {\n if (isBootstrapped(doc)) throw new CollaborationCompatibilityError('The room is already seeded.')\n const stored = new Y.Doc()\n Y.applyUpdate(stored, state)\n try {\n if (!isBootstrapped(stored)) throw new MaterializeError('the stored state holds no document')\n bootstrapFromBytes(doc, materializeBytes(stored))\n } finally {\n stored.destroy()\n }\n}\n\n/**\n * DOCX bytes as the editor would save them. Saving stamps a `w14:paraId` on every paragraph that\n * lacks one; seeding from the stamped bytes puts those ids in the room, so every participant\n * addresses a paragraph by the same id instead of deriving its own from position.\n */\nexport function normalizeDocx(bytes: Uint8Array): Uint8Array {\n const opened = createServerAutomationHost(bytes)\n if (!opened.ok) throw new MaterializeError(`not a readable DOCX: ${opened.reason}`)\n try {\n const saved = opened.host.save()\n if (!saved.ok)\n throw new MaterializeError(`could not normalise the DOCX: ${saved.error.message}`)\n return saved.bytes\n } finally {\n opened.host.dispose()\n }\n}\n\n/** Seed an empty room from DOCX bytes. Throws `MaterializeError` if the bytes are not a DOCX. */\nexport function seedRoom(doc: Y.Doc, bytes: Uint8Array): void {\n if (isBootstrapped(doc)) throw new CollaborationCompatibilityError('The room is already seeded.')\n bootstrapFromBytes(doc, normalizeDocx(bytes))\n}\n\n/** The room as DOCX bytes. */\nexport function readRoom(doc: Y.Doc): Uint8Array {\n assertRoomFormat(doc)\n return materializeBytes(doc)\n}\n\nexport interface RoomAutomation {\n host: ReturnType<typeof expectHost>\n session: DocxCollaborationSession\n dispose(): void\n}\n\nfunction expectHost(result: ReturnType<typeof createServerAutomationHost>) {\n if (!result.ok) throw new MaterializeError(`room is not editable: ${result.reason}`)\n return result.host\n}\n\n/**\n * Open a headless automation host over a live room. Edits made through `host.execute` are mirrored\n * into `doc` exactly as a browser's are, so other participants see them and the room persists them.\n */\nexport function openRoomAutomation(options: {\n doc: Y.Doc\n documentId: string\n identity: CollaborationIdentity\n hostOptions?: Omit<ServerAutomationHostOptions, 'collaborationModel'>\n}): RoomAutomation {\n assertRoomFormat(options.doc)\n const awareness = new Awareness(options.doc)\n const session = new DocxCollaborationSession({\n doc: options.doc,\n awareness,\n documentId: options.documentId,\n identity: options.identity,\n })\n session.markReady()\n try {\n const host = expectHost(\n createServerAutomationHost(materializeBytes(options.doc), {\n ...options.hostOptions,\n collaborationModel: { session },\n })\n )\n return {\n host,\n session,\n dispose() {\n host.dispose()\n session.destroy()\n awareness.destroy()\n },\n }\n } catch (error) {\n session.destroy()\n awareness.destroy()\n throw error\n }\n}\n\n/** A package store attached to a live room: writes go through `store` and reach the room on `flush`. */\nexport interface RoomStore {\n store: TreePackageStore\n session: DocxCollaborationSession\n /**\n * One transaction as the agent (attributed, outside the store's own history) on the body, or on\n * another story (a note), mirrored into the room when it commits.\n */\n transact(\n build: Parameters<TreePackageStore['transact']>[1],\n scope?: Parameters<TreePackageStore['transact']>[0]\n ): PackageTransactResult\n /** Mirror the store's other committed writes (an image insert) into the room. */\n flush(): void\n /** The document as the store now holds it, for the shared readers (`@arbidocs/coedit/commands`). */\n view(): HeadlessDocumentView\n /** Image dimensions from the file header, for `store.insertImage` (no pixel decode on a server). */\n imageDecodePort: ImageDecodePort\n dispose(): void\n}\n\n/**\n * Open a package store over a live room, for the writes the automation protocol does not carry\n * (fragment paste, notes, tracked table and image inserts, whole paragraph properties). Its commits\n * are mirrored into `doc` exactly as a browser's are.\n */\nexport function openRoomStore(options: {\n doc: Y.Doc\n documentId: string\n identity: CollaborationIdentity\n}): RoomStore {\n assertRoomFormat(options.doc)\n const awareness = new Awareness(options.doc)\n const session = new DocxCollaborationSession({\n doc: options.doc,\n awareness,\n documentId: options.documentId,\n identity: options.identity,\n })\n session.markReady()\n try {\n const pkg = materialize(options.doc)\n const main = pkg.parts.get(pkg.mainDocumentPart)\n if (!main) throw new MaterializeError('The room has no main document part.')\n const store = new TreePackageStore(pkg, main)\n const port = createCollaborationDocumentPort(store, { documentId: options.documentId })\n session.attach(port)\n return {\n store,\n session,\n transact(build, scope = { kind: 'body' }) {\n const result = store.transact(scope, build, {\n origin: ORIGIN_IDS.mutationAgent,\n actorId: options.identity.actorId,\n recordsHistory: false,\n })\n if (result.ok) port.flushPendingJournals()\n return result\n },\n flush: () => port.flushPendingJournals(),\n view: () => headlessViewOfStore(store),\n imageDecodePort: {\n async decode(bytes, mime) {\n const header = validateRasterHeader(bytes, mime)\n if (!header) throw new Error('The image cannot be read.')\n return {\n pixelWidth: header.pixelWidth,\n pixelHeight: header.pixelHeight,\n dpiX: header.dpiX ?? 96,\n dpiY: header.dpiY ?? 96,\n }\n },\n },\n dispose() {\n session.destroy()\n awareness.destroy()\n },\n }\n } catch (error) {\n session.destroy()\n awareness.destroy()\n throw error\n }\n}\n\n/**\n * The defined-term and cross-reference commands' port (`@arbidocs/coedit/commands`) over a room\n * store: the same commands the editor's toolbar runs, landing in the room. A caret is just a\n * position here; pastes are fragment pastes, with a `revision` one tracked insertion by it.\n */\nexport function roomCommandsPort(\n room: RoomStore,\n { revision, actorId }: { revision?: Revision | null; actorId?: string } = {}\n): ReferencesPort {\n const view = () => room.view()\n const root = () => view().part().root as unknown as OoxmlNodeLike\n const numbering = () =>\n documentNumbering({\n root,\n stylesRoot: () => view().stylesRoot(),\n numberingRoot: () => view().numberingRoot(),\n settingsRoot: () => view().settingsRoot(),\n })\n let caret: DocPoint | null = null\n const at = () => {\n if (!caret) throw new Error('No position to write at.')\n return caret\n }\n const apply = (op: TreeDocOp) => {\n const result = room.transact((ctx) => {\n ctx.apply(op)\n })\n if (!result.ok) throw new Error(`The editor refused the change (${op.op}).`)\n }\n const find = (node: OoxmlNodeLike, id: string): OoxmlNodeLike | undefined => {\n if (node.id === id) return node\n for (const child of node.children ?? []) {\n const found = find(child, id)\n if (found) return found\n }\n return undefined\n }\n return {\n paragraphs: () => readParagraphs(root()),\n caret: () => caret,\n setCaret: (point) => {\n caret = point\n },\n deleteRange: (from, to) => {\n if (from.paragraphId !== to.paragraphId) throw new Error('A deletion stays in one paragraph.')\n apply({\n op: 'deleteText',\n paragraphId: from.paragraphId,\n start: from.offset,\n end: to.offset,\n ...(revision ? { revision } : {}),\n })\n },\n paste: (body, _text, covered, relationships) => {\n const point = at()\n const defined = documentStyleIds(view().stylesRoot() as OoxmlNodeLike | null)\n const styles = stylesUsed(body).filter((id) => !defined.has(id))\n const result = room.store.applyFragmentPaste(\n { kind: 'body' },\n {\n paragraphId: point.paragraphId,\n offset: point.offset,\n fragmentBytes: fragmentPackage(body, covered, { revision, relationships, styles }),\n lastMarkCovered: covered,\n actorId,\n }\n )\n if (result.ok) room.flush()\n return result.ok\n },\n splitParagraph: () => {\n const point = at()\n apply({ op: 'splitParagraph', paragraphId: point.paragraphId, offset: point.offset })\n const paragraphs = readParagraphs(root())\n const next = paragraphs[paragraphs.findIndex((p) => p.id === point.paragraphId) + 1]\n caret = next ? { paragraphId: next.id, offset: 0 } : point\n },\n typeText: (text) => {\n const point = at()\n apply({\n op: 'insertText',\n paragraphId: point.paragraphId,\n offset: point.offset,\n text,\n ...(revision ? { revision } : {}),\n })\n caret = { paragraphId: point.paragraphId, offset: point.offset + text.length }\n },\n listItems: () => numbering().listItems(),\n levelOf: (numId, ilvl) => numbering().levelOf(numId, ilvl),\n runsXml: (paragraphId) => {\n const node = find(root(), paragraphId)\n return node ? paragraphRunsXml(node) : null\n },\n }\n}\n"]}
|