@stll/folio-core 0.25.5 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -215,7 +215,7 @@ function serializeParagraphPropertyChange(change) {
215
215
  */
216
216
  function serializeHyperlink(hyperlink) {
217
217
  const attrs = [];
218
- if (hyperlink.rId) attrs.push(`r:id="${hyperlink.rId}"`);
218
+ if (hyperlink.rId) attrs.push(`r:id="${escapeXml(hyperlink.rId)}"`);
219
219
  if (hyperlink.anchor) attrs.push(`w:anchor="${escapeXml(hyperlink.anchor)}"`);
220
220
  if (hyperlink.tooltip) attrs.push(`w:tooltip="${escapeXml(hyperlink.tooltip)}"`);
221
221
  if (hyperlink.target) attrs.push(`w:tgtFrame="${escapeXml(hyperlink.target)}"`);
@@ -338,7 +338,7 @@ function serializeWrap(wrap) {
338
338
  function serializePicGraphic(image, sharedId) {
339
339
  const cx = image.size.width;
340
340
  const cy = image.size.height;
341
- const rId = image.rId || "rId1";
341
+ const rId = escapeXml(image.rId || "rId1");
342
342
  const id = sharedId;
343
343
  const name = image.filename || `image${id}`;
344
344
  let xfrmAttrs = "";
@@ -3,8 +3,8 @@ import { serializeBorder } from "./borderSerializer.js";
3
3
  import { escapeXml, intAttr } from "./xmlUtils.js";
4
4
  import { normalizeRevisionId } from "@stll/docx-core/model";
5
5
  //#region src/docx/serializer/sectionPropertiesSerializer.ts
6
- const serializeHeaderReference = (ref) => `<w:headerReference w:type="${ref.type}" r:id="${ref.rId}"/>`;
7
- const serializeFooterReference = (ref) => `<w:footerReference w:type="${ref.type}" r:id="${ref.rId}"/>`;
6
+ const serializeHeaderReference = (ref) => `<w:headerReference w:type="${ref.type}" r:id="${escapeXml(ref.rId)}"/>`;
7
+ const serializeFooterReference = (ref) => `<w:footerReference w:type="${ref.type}" r:id="${escapeXml(ref.rId)}"/>`;
8
8
  function serializeFootnoteProperties(props) {
9
9
  if (!props) return "";
10
10
  const parts = [];
@@ -178,7 +178,7 @@ function serializeSectionProperties(props) {
178
178
  serializeOnOffElement(props.noEndnote, "noEndnote"),
179
179
  serializeOnOffElement(props.rtlGutter, "rtlGutter")
180
180
  ]) if (xml) parts.push(xml);
181
- if (props.printerSettingsRelationshipId) parts.push(`<w:printerSettings r:id="${props.printerSettingsRelationshipId}"/>`);
181
+ if (props.printerSettingsRelationshipId) parts.push(`<w:printerSettings r:id="${escapeXml(props.printerSettingsRelationshipId)}"/>`);
182
182
  for (const change of props.propertyChanges ?? []) parts.push(serializeSectionPropertyChange(change));
183
183
  const unserializedChildNames = getUnserializedSectionPropertyChildNames(props);
184
184
  if (unserializedChildNames && unserializedChildNames.length > 0) return "";
@@ -37,6 +37,11 @@ type CreateBilingualDocumentOptions = {
37
37
  targetStyleSuffix: string;
38
38
  /** Table borders; legal practice is usually `"none"`. Default `"none"`. */
39
39
  borders?: BilingualBorders;
40
+ /**
41
+ * Paragraph handles exposed by Folio's canonical AI-edit snapshot for the
42
+ * source DOCX. Only these paragraphs may become translation rows.
43
+ */
44
+ editableParagraphIds: ReadonlySet<string>;
40
45
  };
41
46
  type CreateBilingualDocumentResult = {
42
47
  document: document_d_exports.Document;
@@ -52,11 +57,11 @@ declare class InvalidBilingualDocumentOptionsError extends InvalidBilingualDocum
52
57
  declare function createBilingualDocument(source: document_d_exports.Document, options: CreateBilingualDocumentOptions): CreateBilingualDocumentResult;
53
58
  /**
54
59
  * Re-derive the row manifest from a document produced by
55
- * {@link createBilingualDocument}. Detection is structural: a top-level table
56
- * whose rows are all either a left | right pair of single-paragraph cells or
57
- * one cell spanning both columns. Rows are returned in document order; the
58
- * right paragraph's `paraId` is the row handle, as at creation.
60
+ * {@link createBilingualDocument}. A dedicated table-style discriminator keeps
61
+ * ordinary two-column source tables from being mistaken for bilingual output;
62
+ * the expected row structure is validated as a second check. Rows are returned
63
+ * in document order; the right paragraph's `paraId` is the row handle.
59
64
  */
60
- declare function readBilingualDocument(document: document_d_exports.Document): BilingualRow[];
65
+ declare function readBilingualDocument(document: document_d_exports.Document, editableParagraphIds: ReadonlySet<string>): BilingualRow[];
61
66
  //#endregion
62
67
  export { BilingualBorders, BilingualParagraphRef, BilingualRow, BilingualRowKind, BilingualTableParagraphRef, CreateBilingualDocumentOptions, CreateBilingualDocumentResult, InvalidBilingualDocumentOptionsError, createBilingualDocument, readBilingualDocument };
@@ -17,13 +17,17 @@ import { TaggedError } from "better-result";
17
17
  * and the break paragraph stays between the tables. A source table (parties,
18
18
  * signature block) is kept once, in a row spanning both columns: it is signed
19
19
  * and read once, and its labels are translated inline rather than duplicated.
20
+ * Structural-only paragraphs are also kept once between tables; they have no
21
+ * independently editable text for a translation row to address.
20
22
  */
21
23
  const STYLE_SUFFIX_PATTERN = /^[A-Za-z0-9-]+$/u;
22
24
  var InvalidBilingualDocumentOptionsError = class extends TaggedError("InvalidBilingualDocumentOptionsError") {};
25
+ var UneditableBilingualManifestError = class extends TaggedError("UneditableBilingualManifestError") {};
23
26
  const FULL_WIDTH_PCT = 5e3;
24
27
  const HALF_WIDTH_PCT = 2500;
25
28
  const A4_TEXT_WIDTH_TWIPS = 9072;
26
29
  const ROW_ID_NAMESPACE = "folio-bilingual";
30
+ const BILINGUAL_TABLE_STYLE_ID = "FolioBilingualTranslation";
27
31
  const GRID_BORDER = {
28
32
  style: "single",
29
33
  size: 4,
@@ -96,6 +100,11 @@ function createBilingualDocument(source, options) {
96
100
  }
97
101
  if (block.type === "paragraph") {
98
102
  if (isEmptyParagraph(block)) continue;
103
+ if (block.paraId === void 0 || !options.editableParagraphIds.has(block.paraId)) {
104
+ flushSection();
105
+ content.push(block);
106
+ continue;
107
+ }
99
108
  const { copy, ref } = copyParagraph(block);
100
109
  rows.push({
101
110
  kind: classifyParagraph(block, styleById),
@@ -105,10 +114,15 @@ function createBilingualDocument(source, options) {
105
114
  sectionRows.push(buildRow(block, copy));
106
115
  continue;
107
116
  }
108
- const paragraphs = collectTableParagraphs(block).map((paragraph) => ({
117
+ const paragraphs = collectTableParagraphs(block).filter((paragraph) => paragraph.paraId !== void 0 && options.editableParagraphIds.has(paragraph.paraId)).map((paragraph) => ({
109
118
  paraId: paragraph.paraId,
110
119
  sourceText: getParagraphText(paragraph)
111
120
  }));
121
+ if (paragraphs.length === 0) {
122
+ flushSection();
123
+ content.push(block);
124
+ continue;
125
+ }
112
126
  rows.push({
113
127
  kind: "table",
114
128
  rowId: paragraphs.at(0)?.paraId ?? tableRowHandle(rows.length),
@@ -152,7 +166,7 @@ const flattenBlocks = (content) => {
152
166
  };
153
167
  const isEmptyParagraph = (paragraph) => {
154
168
  if (getParagraphText(paragraph).trim().length > 0) return false;
155
- return paragraph.content.every((item) => item.type === "run" && item.content.every((part) => part.type === "text"));
169
+ return paragraph.content.every((item) => item.type === "run" && item.formatting?.hidden !== true && item.content.every((part) => part.type === "text"));
156
170
  };
157
171
  /** Heading style families across Word UI languages (en, cs/sk, de, fr, pl). */
158
172
  const HEADING_STYLE_PATTERN = /heading|nadpis|berschrift|titre|nag[łl]/iu;
@@ -391,6 +405,7 @@ const buildTable = (rows, borders, textWidth) => ({
391
405
  value: FULL_WIDTH_PCT,
392
406
  type: "pct"
393
407
  },
408
+ styleId: BILINGUAL_TABLE_STYLE_ID,
394
409
  layout: "fixed",
395
410
  borders: TABLE_BORDERS[borders],
396
411
  look: {
@@ -453,21 +468,22 @@ const createParaIdMinter = (taken) => {
453
468
  };
454
469
  /**
455
470
  * Re-derive the row manifest from a document produced by
456
- * {@link createBilingualDocument}. Detection is structural: a top-level table
457
- * whose rows are all either a left | right pair of single-paragraph cells or
458
- * one cell spanning both columns. Rows are returned in document order; the
459
- * right paragraph's `paraId` is the row handle, as at creation.
471
+ * {@link createBilingualDocument}. A dedicated table-style discriminator keeps
472
+ * ordinary two-column source tables from being mistaken for bilingual output;
473
+ * the expected row structure is validated as a second check. Rows are returned
474
+ * in document order; the right paragraph's `paraId` is the row handle.
460
475
  */
461
- function readBilingualDocument(document) {
476
+ function readBilingualDocument(document, editableParagraphIds) {
462
477
  const styleById = new Map((document.package.styles?.styles ?? []).map((style) => [style.styleId, style]));
463
478
  const rows = [];
479
+ let missingHandleCount = 0;
464
480
  for (const block of flattenBlocks(document.package.document.content)) {
465
481
  if (block.type !== "table" || !isBilingualTable(block)) continue;
466
482
  for (const row of block.rows) {
467
483
  const [left, right] = row.cells;
468
484
  if (!left) continue;
469
485
  if (!right) {
470
- const paragraphs = left.content.filter((item) => item.type === "table").flatMap(collectTableParagraphs).map((paragraph) => ({
486
+ const paragraphs = left.content.filter((item) => item.type === "table").flatMap(collectTableParagraphs).filter((paragraph) => paragraph.paraId !== void 0 && editableParagraphIds.has(paragraph.paraId)).map((paragraph) => ({
471
487
  paraId: paragraph.paraId,
472
488
  sourceText: getParagraphText(paragraph)
473
489
  }));
@@ -480,7 +496,16 @@ function readBilingualDocument(document) {
480
496
  }
481
497
  const source = left.content.at(0);
482
498
  const target = right.content.at(0);
483
- if (source?.type !== "paragraph" || target?.type !== "paragraph" || !target.paraId) continue;
499
+ if (source?.type !== "paragraph" || target?.type !== "paragraph") continue;
500
+ if (target.paraId === void 0) {
501
+ missingHandleCount += 1;
502
+ continue;
503
+ }
504
+ const sourceMissing = source.paraId === void 0 || !editableParagraphIds.has(source.paraId);
505
+ const targetMissing = !editableParagraphIds.has(target.paraId);
506
+ if (sourceMissing) missingHandleCount += 1;
507
+ if (targetMissing) missingHandleCount += 1;
508
+ if (sourceMissing || targetMissing) continue;
484
509
  rows.push({
485
510
  kind: classifyParagraph(source, styleById),
486
511
  rowId: target.paraId,
@@ -490,9 +515,14 @@ function readBilingualDocument(document) {
490
515
  });
491
516
  }
492
517
  }
518
+ if (missingHandleCount > 0) throw new UneditableBilingualManifestError({
519
+ message: "Bilingual manifest contains handles absent from the Folio AI-edit snapshot.",
520
+ missingHandleCount
521
+ });
493
522
  return rows;
494
523
  }
495
524
  const isBilingualTable = (table) => {
525
+ if (table.formatting?.styleId !== BILINGUAL_TABLE_STYLE_ID) return false;
496
526
  let pairs = 0;
497
527
  for (const row of table.rows) {
498
528
  const cells = row.cells;
@@ -1,5 +1,6 @@
1
1
  import { BilingualRow, CreateBilingualDocumentOptions } from "./createBilingualDocument.js";
2
2
  //#region src/docx/server/createBilingualDocx.d.ts
3
+ type CreateBilingualDocxOptions = Omit<CreateBilingualDocumentOptions, "editableParagraphIds">;
3
4
  type CreateBilingualDocxResult = {
4
5
  buffer: ArrayBuffer;
5
6
  rows: BilingualRow[];
@@ -12,8 +13,8 @@ type CreateBilingualDocxResult = {
12
13
  * as a two-column table, and repack onto the original package so theme, fonts,
13
14
  * media, headers and footers carry over untouched.
14
15
  */
15
- declare function createBilingualDocx(input: ArrayBuffer | Uint8Array, options: CreateBilingualDocumentOptions): Promise<CreateBilingualDocxResult>;
16
+ declare function createBilingualDocx(input: ArrayBuffer | Uint8Array, options: CreateBilingualDocxOptions): Promise<CreateBilingualDocxResult>;
16
17
  /** Bytes-in form of {@link readBilingualDocument}. */
17
18
  declare function readBilingualDocx(input: ArrayBuffer | Uint8Array): Promise<BilingualRow[]>;
18
19
  //#endregion
19
- export { CreateBilingualDocxResult, createBilingualDocx, readBilingualDocx };
20
+ export { CreateBilingualDocxOptions, CreateBilingualDocxResult, createBilingualDocx, readBilingualDocx };
@@ -1,3 +1,5 @@
1
+ import { FolioDocxReviewer } from "../../ai-edits/headless.js";
2
+ import { toArrayBuffer } from "../../utils/docxInput.js";
1
3
  import { ensureParaIds } from "../ensureParaIds.js";
2
4
  import { parseDocx } from "../parser.js";
3
5
  import { createDocx } from "../rezip.js";
@@ -11,16 +13,23 @@ import { createBilingualDocument, readBilingualDocument } from "./createBilingua
11
13
  * media, headers and footers carry over untouched.
12
14
  */
13
15
  async function createBilingualDocx(input, options) {
14
- const { document, rows, warnings } = createBilingualDocument(await parseDocx((await ensureParaIds(input)).docx, { preloadFonts: false }), options);
16
+ const stampedBuffer = await toArrayBuffer((await ensureParaIds(input)).docx);
17
+ const editableParagraphIds = new Set((await FolioDocxReviewer.fromBuffer(stampedBuffer)).snapshot().blocks.map(({ id }) => id));
18
+ const { document, warnings } = createBilingualDocument(await parseDocx(stampedBuffer, { preloadFonts: false }), {
19
+ ...options,
20
+ editableParagraphIds
21
+ });
22
+ const buffer = await createDocx(document);
15
23
  return {
16
- buffer: await createDocx(document),
17
- rows,
24
+ buffer,
25
+ rows: await readBilingualDocx(buffer),
18
26
  warnings
19
27
  };
20
28
  }
21
29
  /** Bytes-in form of {@link readBilingualDocument}. */
22
30
  async function readBilingualDocx(input) {
23
- return readBilingualDocument(await parseDocx(input, { preloadFonts: false }));
31
+ const buffer = await toArrayBuffer(input);
32
+ return readBilingualDocument(await parseDocx(buffer, { preloadFonts: false }), new Set((await FolioDocxReviewer.fromBuffer(buffer)).snapshot().blocks.map(({ id }) => id)));
24
33
  }
25
34
  //#endregion
26
35
  export { createBilingualDocx, readBilingualDocx };
@@ -147,7 +147,7 @@ async function unzipDocx(buffer, options = {}) {
147
147
  if (lowerPath.endsWith(".xml") || lowerPath.endsWith(".rels")) {
148
148
  assertEntrySize(path, declaredSize, limits.maxXmlBytes);
149
149
  if (options.extractAllXml === false && !shouldExtractXmlPart(lowerPath)) continue;
150
- extractionTasks.push(file.async("text").then((xmlContent) => {
150
+ extractionTasks.push(() => file.async("text").then((xmlContent) => {
151
151
  assertExtractedSize(path, xmlContent.length, limits.maxXmlBytes);
152
152
  return {
153
153
  type: "xml",
@@ -163,7 +163,7 @@ async function unzipDocx(buffer, options = {}) {
163
163
  content.warnings.push(`Skipped oversized media file: ${path}; original entry preserved for round-trip.`);
164
164
  continue;
165
165
  }
166
- extractionTasks.push(file.async("arraybuffer").then((binaryContent) => {
166
+ extractionTasks.push(() => file.async("arraybuffer").then((binaryContent) => {
167
167
  if (binaryContent.byteLength > limits.maxMediaBytes) {
168
168
  content.warnings.push(`Skipped oversized media file: ${path}; original entry preserved for round-trip.`);
169
169
  return null;
@@ -178,7 +178,7 @@ async function unzipDocx(buffer, options = {}) {
178
178
  }));
179
179
  } else if (lowerPath.startsWith("word/fonts/")) {
180
180
  if (isEntryTooLarge(declaredSize, limits.maxFontBytes)) continue;
181
- extractionTasks.push(file.async("arraybuffer").then((binaryContent) => {
181
+ extractionTasks.push(() => file.async("arraybuffer").then((binaryContent) => {
182
182
  if (binaryContent.byteLength > limits.maxFontBytes) return null;
183
183
  return {
184
184
  type: "font",
@@ -188,7 +188,7 @@ async function unzipDocx(buffer, options = {}) {
188
188
  }));
189
189
  }
190
190
  }
191
- for (const extracted of await Promise.all(extractionTasks)) {
191
+ for (const extracted of await Promise.all(extractionTasks.map((extract) => extract()))) {
192
192
  if (!extracted) continue;
193
193
  if (extracted.type === "xml") {
194
194
  assignXmlContent(content, extracted);
package/dist/redline.js CHANGED
@@ -3,6 +3,7 @@ import { createFolioAITextRangeHandle } from "./ai-edits/snapshot.js";
3
3
  import "./document-operations.js";
4
4
  import { pairFolioDocumentStories } from "./document-stories.js";
5
5
  import { resolveFolioDocumentPrivacyTransforms, rewriteDocxMetadataPrivacy } from "./docx/metadataPrivacy.js";
6
+ import { GenerateRedlineDocxOperationLimitError } from "./redlineOperationLimit.js";
6
7
  import { alignFolioBlocks } from "./version-comparison.js";
7
8
  import { TaggedError, panic } from "better-result";
8
9
  //#region src/redline.ts
@@ -71,11 +72,14 @@ const formattingSegments = (baseBlock, revisedBlock) => {
71
72
  if (hasInlineFormatting(formatting)) {
72
73
  const previous = segments.at(-1);
73
74
  if (previous && previous.endOffset === textOffset && sameInlineFormatting(previous.formatting, formatting)) previous.endOffset += length;
74
- else segments.push({
75
- startOffset: textOffset,
76
- endOffset: textOffset + length,
77
- formatting
78
- });
75
+ else {
76
+ if (segments.length >= 1e4) throw new GenerateRedlineDocxOperationLimitError({ message: "The document comparison exceeds the generated operation limit." });
77
+ segments.push({
78
+ startOffset: textOffset,
79
+ endOffset: textOffset + length,
80
+ formatting
81
+ });
82
+ }
79
83
  }
80
84
  textOffset += length;
81
85
  baseRunOffset += length;
@@ -199,7 +203,10 @@ const generateRedlineDocx = async (base, revised, options = {}) => {
199
203
  const skipped = [];
200
204
  const unprocessedStories = [];
201
205
  let operationSequence = 0;
202
- const nextOperationId = () => `redline-${++operationSequence}`;
206
+ const nextOperationId = () => {
207
+ if (operationSequence >= 1e4) throw new GenerateRedlineDocxOperationLimitError({ message: "The document comparison exceeds the generated operation limit." });
208
+ return `redline-${++operationSequence}`;
209
+ };
203
210
  for (const pair of pairFolioDocumentStories(baseStories, revisedStories)) {
204
211
  if (!pair.baseStory) {
205
212
  unprocessedStories.push({
@@ -0,0 +1,8 @@
1
+ //#region src/redlineOperationLimit.d.ts
2
+ declare const MAX_GENERATED_REDLINE_OPERATIONS = 10000;
3
+ declare const GenerateRedlineDocxOperationLimitError_base: import("better-result").TaggedErrorClass<"GenerateRedlineDocxOperationLimitError">;
4
+ declare class GenerateRedlineDocxOperationLimitError extends GenerateRedlineDocxOperationLimitError_base<{
5
+ message: string;
6
+ }> {}
7
+ //#endregion
8
+ export { GenerateRedlineDocxOperationLimitError, MAX_GENERATED_REDLINE_OPERATIONS };
@@ -0,0 +1,6 @@
1
+ import { TaggedError } from "better-result";
2
+ //#region src/redlineOperationLimit.ts
3
+ const MAX_GENERATED_REDLINE_OPERATIONS = 1e4;
4
+ var GenerateRedlineDocxOperationLimitError = class extends TaggedError("GenerateRedlineDocxOperationLimitError") {};
5
+ //#endregion
6
+ export { GenerateRedlineDocxOperationLimitError, MAX_GENERATED_REDLINE_OPERATIONS };
package/dist/server.d.ts CHANGED
@@ -20,10 +20,10 @@ import { FOLIO_DOCX_CONFORMANCE_CHECKS, FOLIO_DOCX_CONFORMANCE_ISSUE_CODES, FOLI
20
20
  import { ApplyDocxXmlPatchProposalArgs, FOLIO_DOCX_XML_PATCH_APPLICATION_PROFILE, FOLIO_DOCX_XML_PATCH_APPLICATION_VERSION, FolioDocxXmlPatchApplication, FolioDocxXmlPatchApplicationError, FolioDocxXmlPatchApplicationReceipt, UnsupportedFolioDocxXmlPatchApplicationProfileError, applyDocxXmlPatchProposal } from "./docx/server/applyDocxXmlPatchProposal.js";
21
21
  import { HEADING_LEVELS, HeadingLevel, InvalidFolioReportBuilderOptionsError, TableCellSpec, bookmark, createTableOfContentsField, endnote, heading, hyperlink, pageBreak, paragraph, run, table } from "./docx/server/build.js";
22
22
  import { BilingualBorders, BilingualParagraphRef, BilingualRow, BilingualRowKind, BilingualTableParagraphRef, CreateBilingualDocumentOptions, CreateBilingualDocumentResult, InvalidBilingualDocumentOptionsError, createBilingualDocument, readBilingualDocument } from "./docx/server/createBilingualDocument.js";
23
- import { CreateBilingualDocxResult, createBilingualDocx, readBilingualDocx } from "./docx/server/createBilingualDocx.js";
23
+ import { CreateBilingualDocxOptions, CreateBilingualDocxResult, createBilingualDocx, readBilingualDocx } from "./docx/server/createBilingualDocx.js";
24
24
  import { docxToMarkdown } from "./docx/server/docxToMarkdown.js";
25
25
  import { DocxParagraphSource, DocxTableRowKind, DocxTableRowPosition, ExtractedDocxParagraph, ExtractedDocxTableCell, ExtractedDocxTableCellParagraph, ExtractedDocxText, extractDocxText } from "./docx/server/extractDocxText.js";
26
26
  import { FOLIO_DOCX_PACKAGE_INSPECTION_DEFAULTS, FOLIO_DOCX_PACKAGE_INSPECTION_ERROR_CODES, FOLIO_DOCX_PACKAGE_INSPECTION_VERSION, FolioDocxInspectedXmlPart, FolioDocxPackageInspection, FolioDocxPackageInspectionError, FolioDocxPackageInspectionErrorCode, FolioDocxPackageInspectionLimits, FolioDocxPackagePart, FolioDocxPackagePartKind, InspectDocxPackageOptions, inspectDocxPackage } from "./docx/server/inspectDocxPackage.js";
27
27
  import { GenerateRedlineDocxOptions, GenerateRedlineDocxResult, GenerateRedlineUnprocessedStory, InvalidGenerateRedlineDocxOptionsError, generateRedlineDocx } from "./redline.js";
28
28
  import { FOLIO_VERSION_COMPARISON_PRIVACY_TRANSFORMS, FOLIO_VERSION_COMPARISON_SCOPES, FolioBlockDiff, FolioCompareDocxVersionsOptions, FolioDocumentMetadataValue, FolioFormatProperty, FolioMetadataDiff, FolioStoryDiff, FolioVersionBlockHandle, FolioVersionComparisonPrivacyTransform, FolioVersionComparisonScope, FolioVersionDiff, FolioVersionDiffPrivacyOptions, FolioVersionDiffPrivacyReport, FolioVersionDiffSegment, FolioVersionDiffSummaryCounts, InvalidFolioVersionComparisonOptionsError, applyFolioVersionDiffPrivacy, compareDocxVersions, isFolioVersionComparisonPrivacyTransform, isFolioVersionComparisonScope } from "./version-comparison.js";
29
- export { type ApplyDocxXmlPatchProposalArgs, type ApplyFolioAIEditsToBufferOptions, type ApplyFolioAIEditsToBufferResult, type BilingualBorders, type BilingualParagraphRef, type BilingualRow, type BilingualRowKind, type BilingualTableParagraphRef, type CreateBilingualDocumentOptions, type CreateBilingualDocumentResult, type CreateBilingualDocxResult, type CreateCommentReplyInput, type CreateEmptyDocumentOptions, DOCUMENT_PRESET_VERSION, DOCUMENT_STYLE_SET_VERSION, type DeriveBlockIdInput, type DocumentPreset, type DocumentStyleCatalog, type DocumentStyleCatalogEntry, type DocumentStyleSet, DocxArchiveError, type DocxArchiveOptions, type DocxParagraphSource, type DocxTableRowKind, type DocxTableRowPosition, EnsureParaIdsError, type EnsureParaIdsOptions, type EnsureParaIdsResult, type EvaluateDocxXmlPatchProposalArgs, type ExtractDocumentStyleSetOptions, type ExtractedDocxParagraph, type ExtractedDocxTableCell, type ExtractedDocxTableCellParagraph, type ExtractedDocxText, FOLIO_DOCUMENT_METADATA_PROPERTIES, FOLIO_DOCUMENT_OPERATION_BATCH_MODES, FOLIO_DOCUMENT_OPERATION_CONTRACT_VERSION, FOLIO_DOCUMENT_OPERATION_MODES, FOLIO_DOCUMENT_OPERATION_MODES_BY_TYPE, FOLIO_DOCUMENT_OPERATION_PRECONDITIONS, FOLIO_DOCUMENT_OPERATION_STORIES, FOLIO_DOCUMENT_OPERATION_TYPES, FOLIO_DOCUMENT_PRIVACY_TRANSFORMS, FOLIO_DOCX_CONFORMANCE_CHECKS, FOLIO_DOCX_CONFORMANCE_ISSUE_CODES, FOLIO_DOCX_CONFORMANCE_PROFILE, FOLIO_DOCX_CONFORMANCE_REPORT_VERSION, FOLIO_DOCX_PACKAGE_INSPECTION_DEFAULTS, FOLIO_DOCX_PACKAGE_INSPECTION_ERROR_CODES, FOLIO_DOCX_PACKAGE_INSPECTION_VERSION, FOLIO_DOCX_XML_PATCH_APPLICATION_PROFILE, FOLIO_DOCX_XML_PATCH_APPLICATION_VERSION, FOLIO_DOCX_XML_PATCH_PROPOSAL_DEFAULTS, FOLIO_DOCX_XML_PATCH_PROPOSAL_ISSUE_CODES, FOLIO_DOCX_XML_PATCH_PROPOSAL_PROFILE, FOLIO_DOCX_XML_PATCH_PROPOSAL_VERSION, FOLIO_RESOLVED_REVIEWED_VIEWS, FOLIO_REVIEWED_VIEWS, FOLIO_VERSION_COMPARISON_PRIVACY_TRANSFORMS, FOLIO_VERSION_COMPARISON_SCOPES, type FolioAIBlock, type FolioAIBlockAnchor, type FolioAIBlockKind, type FolioAIBlockPreviewRun, type FolioAIComment, type FolioAIEditApplyMode, type FolioAIEditApplyResult, type FolioAIEditOperation, type FolioAIEditPrecondition, type FolioAIEditSnapshot, type FolioAIInlineFormatting, type FolioAITextRangeHandle, type FolioApplyDocumentOperationsOptions, type FolioApplyDocumentOperationsToStoryOptions, type FolioApplyOperationsOptions, type FolioBlockDiff, type FolioBlockId, type FolioCompareDocxVersionsOptions, type FolioDocumentMetadataProperty, type FolioDocumentMetadataValue, type FolioDocumentNavigationTarget, type FolioDocumentOperation, type FolioDocumentOperationAffectedTarget, type FolioDocumentOperationBatch, type FolioDocumentOperationCapabilities, type FolioDocumentOperationIssue, type FolioDocumentOperationMode, type FolioDocumentOperationPrecondition, type FolioDocumentOperationReceipt, type FolioDocumentOperationRecovery, type FolioDocumentOperationResult, type FolioDocumentOperationStatus, type FolioDocumentOperationStory, type FolioDocumentOperationType, type FolioDocumentOperationUndoFailureReason, type FolioDocumentOperationUndoHandle, type FolioDocumentOperationUndoResult, type FolioDocumentOutline, type FolioDocumentOutlineEntry, FolioDocumentPrivacyArchiveError, type FolioDocumentPrivacyOptions, type FolioDocumentPrivacyReport, type FolioDocumentPrivacyTransform, type FolioDocumentSection, type FolioDocumentSectionHandle, type FolioDocumentSectionReadResult, type FolioDocumentStory, type FolioDocumentStoryHandle, FolioDocumentStoryNotFoundError, type FolioDocxConformanceCheck, type FolioDocxConformanceCheckId, type FolioDocxConformanceCheckStatus, type FolioDocxConformanceIssue, type FolioDocxConformanceIssueCode, type FolioDocxConformanceReport, type FolioDocxConformanceStatus, type FolioDocxInspectedXmlPart, type FolioDocxPackageInspection, FolioDocxPackageInspectionError, type FolioDocxPackageInspectionErrorCode, type FolioDocxPackageInspectionLimits, type FolioDocxPackagePart, type FolioDocxPackagePartKind, type FolioDocxPreparedXmlReplacement, FolioDocxReviewer, type FolioDocxReviewerOptions, type FolioDocxXmlPatchApplication, FolioDocxXmlPatchApplicationError, type FolioDocxXmlPatchApplicationReceipt, type FolioDocxXmlPatchProposal, type FolioDocxXmlPatchProposalEvaluation, type FolioDocxXmlPatchProposalIssue, type FolioDocxXmlPatchProposalIssueCode, type FolioDocxXmlPatchProposalLimits, type FolioDocxXmlReplacement, type FolioEditableDocumentStoryHandle, type FolioFormatProperty, type FolioMetadataDiff, type FolioReadReviewedStoryOptions, type FolioResolveReviewedStoryOptions, type FolioResolvedReviewedView, type FolioReviewChange, type FolioReviewChangeFilter, type FolioReviewChangeKind, type FolioReviewComment, type FolioReviewCommentFilter, type FolioReviewCommentReply, type FolioReviewReplyInput, type FolioReviewedStory, type FolioReviewedView, type FolioStoryDiff, type FolioVersionBlockHandle, type FolioVersionComparisonPrivacyTransform, type FolioVersionComparisonScope, type FolioVersionDiff, type FolioVersionDiffPrivacyOptions, type FolioVersionDiffPrivacyReport, type FolioVersionDiffSegment, type FolioVersionDiffSummaryCounts, type GenerateRedlineDocxOptions, type GenerateRedlineDocxResult, type GenerateRedlineUnprocessedStory, HEADING_LEVELS, type HeadingLevel, type InspectDocxPackageOptions, InvalidBilingualDocumentOptionsError, InvalidFolioDocumentOperationBatchError, InvalidFolioDocumentPrivacyOptionsError, InvalidFolioDocxXmlPatchProposalError, InvalidFolioDocxXmlPatchProposalOptionsError, InvalidFolioReportBuilderOptionsError, InvalidFolioVersionComparisonOptionsError, InvalidGenerateRedlineDocxOptionsError, type ParseOptions, type RewriteDocxMetadataPrivacyResult, STELLA_STYLE_SET_NAME, type TableCellSpec, UnsupportedFolioDocumentOperationVersionError, UnsupportedFolioDocxXmlPatchApplicationProfileError, UnsupportedFolioReviewedViewError, type ValidateDocxConformanceOptions, applyDocxXmlPatchProposal, applyFolioAIEditsToBuffer, applyFolioVersionDiffPrivacy, assertSupportedFolioDocumentOperationVersion, bookmark, compareDocxVersions, createBilingualDocument, createBilingualDocx, createDocx, createEmptyDocument, createFolioAITextRangeHandle, createStellaStyleDocumentPreset, createStellaStyleSet, createTableOfContentsField, deriveBlockId, docxToMarkdown, endnote, ensureParaIds, evaluateDocxXmlPatchProposal, extractDocumentStyleSet, extractDocumentStyleSetFromDocx, extractDocxText, generateRedlineDocx, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioDocumentOutline, getFolioParaIdFromBlockId, hashFolioAIBlockText, heading, hyperlink, inspectDocumentStyles, inspectDocumentStylesFromDocx, inspectDocxPackage, isFolioBlockId, isFolioDocumentOperationModeSupported, isFolioDocumentPrivacyTransform, isFolioResolvedReviewedView, isFolioReviewedView, isFolioVersionComparisonPrivacyTransform, isFolioVersionComparisonScope, isSequentialFolioBlockId, isSupportedFolioDocumentOperationVersion, normalizeFolioAIBlockText, pageBreak, paragraph, parseDocx, parseFolioDocumentOperationBatch, parseFolioDocxXmlPatchProposal, readBilingualDocument, readBilingualDocx, readFolioDocumentSection, replyToComment, rewriteDocxMetadataPrivacy, run, table, validateDocxConformance };
29
+ export { type ApplyDocxXmlPatchProposalArgs, type ApplyFolioAIEditsToBufferOptions, type ApplyFolioAIEditsToBufferResult, type BilingualBorders, type BilingualParagraphRef, type BilingualRow, type BilingualRowKind, type BilingualTableParagraphRef, type CreateBilingualDocumentOptions, type CreateBilingualDocumentResult, type CreateBilingualDocxOptions, type CreateBilingualDocxResult, type CreateCommentReplyInput, type CreateEmptyDocumentOptions, DOCUMENT_PRESET_VERSION, DOCUMENT_STYLE_SET_VERSION, type DeriveBlockIdInput, type DocumentPreset, type DocumentStyleCatalog, type DocumentStyleCatalogEntry, type DocumentStyleSet, DocxArchiveError, type DocxArchiveOptions, type DocxParagraphSource, type DocxTableRowKind, type DocxTableRowPosition, EnsureParaIdsError, type EnsureParaIdsOptions, type EnsureParaIdsResult, type EvaluateDocxXmlPatchProposalArgs, type ExtractDocumentStyleSetOptions, type ExtractedDocxParagraph, type ExtractedDocxTableCell, type ExtractedDocxTableCellParagraph, type ExtractedDocxText, FOLIO_DOCUMENT_METADATA_PROPERTIES, FOLIO_DOCUMENT_OPERATION_BATCH_MODES, FOLIO_DOCUMENT_OPERATION_CONTRACT_VERSION, FOLIO_DOCUMENT_OPERATION_MODES, FOLIO_DOCUMENT_OPERATION_MODES_BY_TYPE, FOLIO_DOCUMENT_OPERATION_PRECONDITIONS, FOLIO_DOCUMENT_OPERATION_STORIES, FOLIO_DOCUMENT_OPERATION_TYPES, FOLIO_DOCUMENT_PRIVACY_TRANSFORMS, FOLIO_DOCX_CONFORMANCE_CHECKS, FOLIO_DOCX_CONFORMANCE_ISSUE_CODES, FOLIO_DOCX_CONFORMANCE_PROFILE, FOLIO_DOCX_CONFORMANCE_REPORT_VERSION, FOLIO_DOCX_PACKAGE_INSPECTION_DEFAULTS, FOLIO_DOCX_PACKAGE_INSPECTION_ERROR_CODES, FOLIO_DOCX_PACKAGE_INSPECTION_VERSION, FOLIO_DOCX_XML_PATCH_APPLICATION_PROFILE, FOLIO_DOCX_XML_PATCH_APPLICATION_VERSION, FOLIO_DOCX_XML_PATCH_PROPOSAL_DEFAULTS, FOLIO_DOCX_XML_PATCH_PROPOSAL_ISSUE_CODES, FOLIO_DOCX_XML_PATCH_PROPOSAL_PROFILE, FOLIO_DOCX_XML_PATCH_PROPOSAL_VERSION, FOLIO_RESOLVED_REVIEWED_VIEWS, FOLIO_REVIEWED_VIEWS, FOLIO_VERSION_COMPARISON_PRIVACY_TRANSFORMS, FOLIO_VERSION_COMPARISON_SCOPES, type FolioAIBlock, type FolioAIBlockAnchor, type FolioAIBlockKind, type FolioAIBlockPreviewRun, type FolioAIComment, type FolioAIEditApplyMode, type FolioAIEditApplyResult, type FolioAIEditOperation, type FolioAIEditPrecondition, type FolioAIEditSnapshot, type FolioAIInlineFormatting, type FolioAITextRangeHandle, type FolioApplyDocumentOperationsOptions, type FolioApplyDocumentOperationsToStoryOptions, type FolioApplyOperationsOptions, type FolioBlockDiff, type FolioBlockId, type FolioCompareDocxVersionsOptions, type FolioDocumentMetadataProperty, type FolioDocumentMetadataValue, type FolioDocumentNavigationTarget, type FolioDocumentOperation, type FolioDocumentOperationAffectedTarget, type FolioDocumentOperationBatch, type FolioDocumentOperationCapabilities, type FolioDocumentOperationIssue, type FolioDocumentOperationMode, type FolioDocumentOperationPrecondition, type FolioDocumentOperationReceipt, type FolioDocumentOperationRecovery, type FolioDocumentOperationResult, type FolioDocumentOperationStatus, type FolioDocumentOperationStory, type FolioDocumentOperationType, type FolioDocumentOperationUndoFailureReason, type FolioDocumentOperationUndoHandle, type FolioDocumentOperationUndoResult, type FolioDocumentOutline, type FolioDocumentOutlineEntry, FolioDocumentPrivacyArchiveError, type FolioDocumentPrivacyOptions, type FolioDocumentPrivacyReport, type FolioDocumentPrivacyTransform, type FolioDocumentSection, type FolioDocumentSectionHandle, type FolioDocumentSectionReadResult, type FolioDocumentStory, type FolioDocumentStoryHandle, FolioDocumentStoryNotFoundError, type FolioDocxConformanceCheck, type FolioDocxConformanceCheckId, type FolioDocxConformanceCheckStatus, type FolioDocxConformanceIssue, type FolioDocxConformanceIssueCode, type FolioDocxConformanceReport, type FolioDocxConformanceStatus, type FolioDocxInspectedXmlPart, type FolioDocxPackageInspection, FolioDocxPackageInspectionError, type FolioDocxPackageInspectionErrorCode, type FolioDocxPackageInspectionLimits, type FolioDocxPackagePart, type FolioDocxPackagePartKind, type FolioDocxPreparedXmlReplacement, FolioDocxReviewer, type FolioDocxReviewerOptions, type FolioDocxXmlPatchApplication, FolioDocxXmlPatchApplicationError, type FolioDocxXmlPatchApplicationReceipt, type FolioDocxXmlPatchProposal, type FolioDocxXmlPatchProposalEvaluation, type FolioDocxXmlPatchProposalIssue, type FolioDocxXmlPatchProposalIssueCode, type FolioDocxXmlPatchProposalLimits, type FolioDocxXmlReplacement, type FolioEditableDocumentStoryHandle, type FolioFormatProperty, type FolioMetadataDiff, type FolioReadReviewedStoryOptions, type FolioResolveReviewedStoryOptions, type FolioResolvedReviewedView, type FolioReviewChange, type FolioReviewChangeFilter, type FolioReviewChangeKind, type FolioReviewComment, type FolioReviewCommentFilter, type FolioReviewCommentReply, type FolioReviewReplyInput, type FolioReviewedStory, type FolioReviewedView, type FolioStoryDiff, type FolioVersionBlockHandle, type FolioVersionComparisonPrivacyTransform, type FolioVersionComparisonScope, type FolioVersionDiff, type FolioVersionDiffPrivacyOptions, type FolioVersionDiffPrivacyReport, type FolioVersionDiffSegment, type FolioVersionDiffSummaryCounts, type GenerateRedlineDocxOptions, type GenerateRedlineDocxResult, type GenerateRedlineUnprocessedStory, HEADING_LEVELS, type HeadingLevel, type InspectDocxPackageOptions, InvalidBilingualDocumentOptionsError, InvalidFolioDocumentOperationBatchError, InvalidFolioDocumentPrivacyOptionsError, InvalidFolioDocxXmlPatchProposalError, InvalidFolioDocxXmlPatchProposalOptionsError, InvalidFolioReportBuilderOptionsError, InvalidFolioVersionComparisonOptionsError, InvalidGenerateRedlineDocxOptionsError, type ParseOptions, type RewriteDocxMetadataPrivacyResult, STELLA_STYLE_SET_NAME, type TableCellSpec, UnsupportedFolioDocumentOperationVersionError, UnsupportedFolioDocxXmlPatchApplicationProfileError, UnsupportedFolioReviewedViewError, type ValidateDocxConformanceOptions, applyDocxXmlPatchProposal, applyFolioAIEditsToBuffer, applyFolioVersionDiffPrivacy, assertSupportedFolioDocumentOperationVersion, bookmark, compareDocxVersions, createBilingualDocument, createBilingualDocx, createDocx, createEmptyDocument, createFolioAITextRangeHandle, createStellaStyleDocumentPreset, createStellaStyleSet, createTableOfContentsField, deriveBlockId, docxToMarkdown, endnote, ensureParaIds, evaluateDocxXmlPatchProposal, extractDocumentStyleSet, extractDocumentStyleSetFromDocx, extractDocxText, generateRedlineDocx, getFolioDocumentOperationCapabilities, getFolioDocumentOperationIssues, getFolioDocumentOperationReceipts, getFolioDocumentOutline, getFolioParaIdFromBlockId, hashFolioAIBlockText, heading, hyperlink, inspectDocumentStyles, inspectDocumentStylesFromDocx, inspectDocxPackage, isFolioBlockId, isFolioDocumentOperationModeSupported, isFolioDocumentPrivacyTransform, isFolioResolvedReviewedView, isFolioReviewedView, isFolioVersionComparisonPrivacyTransform, isFolioVersionComparisonScope, isSequentialFolioBlockId, isSupportedFolioDocumentOperationVersion, normalizeFolioAIBlockText, pageBreak, paragraph, parseDocx, parseFolioDocumentOperationBatch, parseFolioDocxXmlPatchProposal, readBilingualDocument, readBilingualDocx, readFolioDocumentSection, replyToComment, rewriteDocxMetadataPrivacy, run, table, validateDocxConformance };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stll/folio-core",
3
- "version": "0.25.5",
3
+ "version": "0.26.0",
4
4
  "description": "Headless, framework-neutral core of folio: the OOXML (.docx) parser, document model, ProseMirror integration, and page-layout engine. No React.",
5
5
  "keywords": [
6
6
  "document-model",