@beyondwork/docx-react-component 1.0.29 → 1.0.30
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/package.json +65 -96
- package/src/README.md +85 -0
- package/src/api/README.md +26 -0
- package/src/api/public-types.ts +1952 -0
- package/src/api/session-state.ts +62 -0
- package/src/compare/diff-engine.ts +623 -0
- package/src/compare/export-redlines.ts +280 -0
- package/src/compare/index.ts +25 -0
- package/src/compare/snapshot.ts +97 -0
- package/src/component-inventory.md +99 -0
- package/src/core/README.md +10 -0
- package/src/core/commands/README.md +3 -0
- package/{dist/chunk-TJBP2K4T.js → src/core/commands/formatting-commands.ts} +536 -196
- package/src/core/commands/image-commands.ts +373 -0
- package/src/core/commands/index.ts +1879 -0
- package/src/core/commands/list-commands.ts +565 -0
- package/src/core/commands/paragraph-layout-commands.ts +339 -0
- package/src/core/commands/review-commands.ts +108 -0
- package/{dist/core/commands/section-layout-commands.cjs → src/core/commands/section-layout-commands.ts} +340 -137
- package/src/core/commands/structural-helpers.ts +309 -0
- package/{dist/core/commands/style-commands.cjs → src/core/commands/style-commands.ts} +113 -65
- package/src/core/commands/table-structure-commands.ts +854 -0
- package/{dist/chunk-UZXBISGO.js → src/core/commands/text-commands.ts} +142 -86
- package/src/core/schema/README.md +3 -0
- package/src/core/schema/text-schema.ts +516 -0
- package/src/core/search/search-text.ts +357 -0
- package/src/core/selection/README.md +3 -0
- package/src/core/selection/mapping.ts +289 -0
- package/src/core/selection/review-anchors.ts +183 -0
- package/src/core/state/README.md +3 -0
- package/src/core/state/editor-state.ts +892 -0
- package/src/core/state/text-transaction.ts +869 -0
- package/src/formats/xlsx/io/parse-shared-strings.ts +41 -0
- package/src/formats/xlsx/io/parse-sheet.ts +459 -0
- package/src/formats/xlsx/io/parse-styles.ts +59 -0
- package/src/formats/xlsx/io/parse-workbook.ts +75 -0
- package/src/formats/xlsx/io/serialize-shared-strings.ts +72 -0
- package/src/formats/xlsx/io/serialize-sheet.ts +333 -0
- package/src/formats/xlsx/io/serialize-styles.ts +98 -0
- package/src/formats/xlsx/io/serialize-workbook.ts +429 -0
- package/src/formats/xlsx/io/xlsx-session.ts +314 -0
- package/src/formats/xlsx/model/cell.ts +189 -0
- package/src/formats/xlsx/model/sheet.ts +326 -0
- package/src/formats/xlsx/model/styles.ts +118 -0
- package/src/formats/xlsx/model/workbook.ts +453 -0
- package/src/formats/xlsx/runtime/cell-commands.ts +567 -0
- package/src/formats/xlsx/runtime/sheet-commands.ts +206 -0
- package/src/formats/xlsx/runtime/workbook-runtime.ts +177 -0
- package/src/formats/xlsx/runtime/workbook-transaction.ts +822 -0
- package/src/index.ts +142 -0
- package/src/io/README.md +10 -0
- package/src/io/docx-session.ts +3175 -0
- package/src/io/export/README.md +3 -0
- package/src/io/export/export-session.ts +220 -0
- package/src/io/export/minimal-docx.ts +115 -0
- package/src/io/export/reattach-preserved-parts.ts +54 -0
- package/src/io/export/serialize-comments.ts +947 -0
- package/src/io/export/serialize-footnotes.ts +394 -0
- package/src/io/export/serialize-headers-footers.ts +368 -0
- package/src/io/export/serialize-main-document.ts +1342 -0
- package/src/io/export/serialize-numbering.ts +218 -0
- package/src/io/export/serialize-revisions.ts +389 -0
- package/src/io/export/serialize-runtime-revisions.ts +463 -0
- package/src/io/export/serialize-tables.ts +174 -0
- package/src/io/export/split-review-boundaries.ts +356 -0
- package/src/io/export/split-story-blocks-for-runtime-revisions.ts +252 -0
- package/src/io/export/table-properties-xml.ts +318 -0
- package/src/io/normalize/README.md +3 -0
- package/src/io/normalize/normalize-text.ts +670 -0
- package/src/io/ooxml/README.md +3 -0
- package/src/io/ooxml/highlight-colors.ts +39 -0
- package/src/io/ooxml/numbering-sentinels.ts +44 -0
- package/src/io/ooxml/parse-comments.ts +852 -0
- package/src/io/ooxml/parse-complex-content.ts +287 -0
- package/src/io/ooxml/parse-fields.ts +834 -0
- package/src/io/ooxml/parse-footnotes.ts +952 -0
- package/src/io/ooxml/parse-headers-footers.ts +1212 -0
- package/src/io/ooxml/parse-inline-media.ts +461 -0
- package/src/io/ooxml/parse-main-document.ts +2947 -0
- package/src/io/ooxml/parse-numbering.ts +747 -0
- package/src/io/ooxml/parse-revisions.ts +1045 -0
- package/src/io/ooxml/parse-settings.ts +184 -0
- package/src/io/ooxml/parse-shapes.ts +296 -0
- package/src/io/ooxml/parse-styles.ts +639 -0
- package/src/io/ooxml/parse-tables.ts +627 -0
- package/src/io/ooxml/parse-theme.ts +346 -0
- package/src/io/ooxml/part-manifest.ts +136 -0
- package/src/io/ooxml/revision-boundaries.ts +475 -0
- package/src/io/ooxml/workflow-payload.ts +544 -0
- package/src/io/opc/README.md +3 -0
- package/src/io/opc/corrupt-package.ts +166 -0
- package/src/io/opc/docx-package.ts +74 -0
- package/src/io/opc/package-reader.ts +325 -0
- package/src/io/opc/package-writer.ts +273 -0
- package/src/io/source-package-provenance.ts +241 -0
- package/{dist/chunk-RMH72RZI.js → src/legal/bookmarks.ts} +130 -44
- package/src/legal/cross-references.ts +414 -0
- package/src/legal/defined-terms.ts +203 -0
- package/src/legal/index.ts +32 -0
- package/src/legal/signature-blocks.ts +259 -0
- package/src/model/README.md +3 -0
- package/src/model/canonical-document.ts +2722 -0
- package/src/model/cds-1.0.0.ts +212 -0
- package/src/model/snapshot.ts +760 -0
- package/src/preservation/README.md +3 -0
- package/src/preservation/markup-compatibility.ts +48 -0
- package/src/preservation/opaque-fragment-store.ts +89 -0
- package/src/preservation/opaque-region.ts +233 -0
- package/src/preservation/package-preservation.ts +113 -0
- package/src/preservation/preserved-part-manifest.ts +56 -0
- package/src/preservation/relationship-retention.ts +57 -0
- package/src/preservation/store.ts +255 -0
- package/src/review/README.md +16 -0
- package/src/review/store/README.md +3 -0
- package/src/review/store/comment-anchors.ts +70 -0
- package/src/review/store/comment-remapping.ts +154 -0
- package/src/review/store/comment-store.ts +349 -0
- package/src/review/store/comment-thread.ts +109 -0
- package/src/review/store/revision-actions.ts +423 -0
- package/src/review/store/revision-store.ts +323 -0
- package/src/review/store/revision-types.ts +182 -0
- package/src/review/store/runtime-comment-store.ts +43 -0
- package/src/runtime/README.md +3 -0
- package/src/runtime/ai-action-policy.ts +764 -0
- package/src/runtime/context-analytics.ts +824 -0
- package/src/runtime/document-layout.ts +332 -0
- package/src/runtime/document-locations.ts +521 -0
- package/src/runtime/document-navigation.ts +616 -0
- package/src/runtime/document-outline.ts +440 -0
- package/src/runtime/document-runtime.ts +4055 -0
- package/src/runtime/document-search.ts +145 -0
- package/src/runtime/event-refresh-hints.ts +137 -0
- package/src/runtime/numbering-prefix.ts +244 -0
- package/src/runtime/page-layout-estimation.ts +305 -0
- package/src/runtime/read-only-diagnostics-runtime.ts +241 -0
- package/src/runtime/resolved-numbering-geometry.ts +293 -0
- package/src/runtime/review-runtime.ts +44 -0
- package/src/runtime/revision-runtime.ts +107 -0
- package/src/runtime/session-capabilities.ts +192 -0
- package/src/runtime/story-context.ts +164 -0
- package/src/runtime/story-targeting.ts +162 -0
- package/src/runtime/suggestions-snapshot.ts +137 -0
- package/src/runtime/surface-projection.ts +1553 -0
- package/src/runtime/table-commands.ts +173 -0
- package/src/runtime/table-schema.ts +309 -0
- package/src/runtime/table-style-resolver.ts +409 -0
- package/src/runtime/view-state.ts +493 -0
- package/src/runtime/virtualized-rendering.ts +258 -0
- package/src/runtime/workflow-markup.ts +393 -0
- package/src/ui/README.md +30 -0
- package/src/ui/WordReviewEditor.tsx +5268 -0
- package/src/ui/browser-export.ts +52 -0
- package/src/ui/comments/README.md +3 -0
- package/src/ui/compatibility/README.md +3 -0
- package/src/ui/editor-command-bag.ts +127 -0
- package/src/ui/editor-runtime-boundary.ts +1558 -0
- package/src/ui/editor-shell-view.tsx +144 -0
- package/src/ui/editor-surface/README.md +3 -0
- package/src/ui/editor-surface-controller.tsx +66 -0
- package/src/ui/headless/comment-decoration-model.ts +124 -0
- package/src/ui/headless/preserve-editor-selection.ts +5 -0
- package/src/ui/headless/revision-decoration-model.ts +128 -0
- package/src/ui/headless/selection-helpers.ts +54 -0
- package/src/ui/headless/selection-tool-context.ts +19 -0
- package/src/ui/headless/selection-tool-resolver.ts +752 -0
- package/src/ui/headless/selection-tool-types.ts +129 -0
- package/src/ui/headless/selection-toolbar-model.ts +11 -0
- package/src/ui/headless/use-editor-keyboard.ts +103 -0
- package/src/ui/review/README.md +3 -0
- package/src/ui/runtime-shortcut-dispatch.ts +365 -0
- package/src/ui/runtime-snapshot-selectors.ts +197 -0
- package/src/ui/shared/revision-filters.ts +31 -0
- package/src/ui/status/README.md +3 -0
- package/src/ui/theme/README.md +3 -0
- package/src/ui/toolbar/README.md +3 -0
- package/src/ui/workflow-surface-blocked-rails.ts +94 -0
- package/src/ui-tailwind/chrome/chrome-preset-model.ts +107 -0
- package/src/ui-tailwind/chrome/chrome-preset-toolbar.tsx +15 -0
- package/src/ui-tailwind/chrome/review-queue-bar.tsx +97 -0
- package/src/ui-tailwind/chrome/tw-alert-banner.tsx +64 -0
- package/src/ui-tailwind/chrome/tw-context-analytics-summary.tsx +122 -0
- package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +121 -0
- package/src/ui-tailwind/chrome/tw-layout-panel.tsx +114 -0
- package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +30 -0
- package/src/ui-tailwind/chrome/tw-page-ruler.tsx +365 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-blocked.tsx +23 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-comment.tsx +35 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-formatting.tsx +37 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +298 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-structure.tsx +116 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-suggestion.tsx +29 -0
- package/src/ui-tailwind/chrome/tw-selection-tool-workflow.tsx +27 -0
- package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +186 -0
- package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +139 -0
- package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +200 -0
- package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +58 -0
- package/src/ui-tailwind/chrome/use-before-unload.ts +20 -0
- package/src/ui-tailwind/editor-surface/perf-probe.ts +179 -0
- package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +189 -0
- package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +31 -0
- package/src/ui-tailwind/editor-surface/pm-decorations.ts +411 -0
- package/src/ui-tailwind/editor-surface/pm-position-map.ts +123 -0
- package/src/ui-tailwind/editor-surface/pm-schema.ts +927 -0
- package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +567 -0
- package/src/ui-tailwind/editor-surface/search-plugin.ts +168 -0
- package/src/ui-tailwind/editor-surface/surface-build-keys.ts +65 -0
- package/src/ui-tailwind/editor-surface/tw-caret.tsx +12 -0
- package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +150 -0
- package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +129 -0
- package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +58 -0
- package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +151 -0
- package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +1047 -0
- package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +111 -0
- package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +503 -0
- package/src/ui-tailwind/index.ts +62 -0
- package/src/ui-tailwind/page-chrome-model.ts +27 -0
- package/src/ui-tailwind/review/tw-comment-sidebar.tsx +406 -0
- package/src/ui-tailwind/review/tw-health-panel.tsx +149 -0
- package/src/ui-tailwind/review/tw-review-rail.tsx +122 -0
- package/src/ui-tailwind/review/tw-revision-sidebar.tsx +164 -0
- package/src/ui-tailwind/status/tw-status-bar.tsx +65 -0
- package/{dist → src}/ui-tailwind/theme/editor-theme.css +58 -40
- package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +52 -0
- package/src/ui-tailwind/toolbar/tw-toolbar.tsx +1133 -0
- package/src/ui-tailwind/tw-review-workspace.tsx +1460 -0
- package/src/validation/README.md +3 -0
- package/src/validation/compatibility-engine.ts +878 -0
- package/src/validation/compatibility-report.ts +161 -0
- package/src/validation/diagnostics.ts +204 -0
- package/src/validation/docx-comment-proof.ts +720 -0
- package/src/validation/import-diagnostics.ts +128 -0
- package/src/validation/low-priority-word-surfaces.ts +373 -0
- package/dist/canonical-document-BLEbzL2J.d.cts +0 -844
- package/dist/canonical-document-BLEbzL2J.d.ts +0 -844
- package/dist/chunk-2FJS5GZM.js +0 -763
- package/dist/chunk-2FJS5GZM.js.map +0 -1
- package/dist/chunk-2OQBZS3F.js +0 -446
- package/dist/chunk-2OQBZS3F.js.map +0 -1
- package/dist/chunk-2S7W4KFO.js +0 -127
- package/dist/chunk-2S7W4KFO.js.map +0 -1
- package/dist/chunk-2TG72QSW.js +0 -3874
- package/dist/chunk-2TG72QSW.js.map +0 -1
- package/dist/chunk-36QNIZBO.js +0 -532
- package/dist/chunk-36QNIZBO.js.map +0 -1
- package/dist/chunk-4AQOYAW4.js +0 -3069
- package/dist/chunk-4AQOYAW4.js.map +0 -1
- package/dist/chunk-4D5EWJ3P.js +0 -77
- package/dist/chunk-4D5EWJ3P.js.map +0 -1
- package/dist/chunk-5FN54NDH.js +0 -2257
- package/dist/chunk-5FN54NDH.js.map +0 -1
- package/dist/chunk-BOYGQYRQ.js +0 -7306
- package/dist/chunk-BOYGQYRQ.js.map +0 -1
- package/dist/chunk-CN3XMECL.js +0 -212
- package/dist/chunk-CN3XMECL.js.map +0 -1
- package/dist/chunk-EBI3BX6U.js +0 -164
- package/dist/chunk-EBI3BX6U.js.map +0 -1
- package/dist/chunk-EILUG3VB.js +0 -1275
- package/dist/chunk-EILUG3VB.js.map +0 -1
- package/dist/chunk-FUDY333O.js +0 -70
- package/dist/chunk-FUDY333O.js.map +0 -1
- package/dist/chunk-GBVOWFIK.js +0 -1237
- package/dist/chunk-GBVOWFIK.js.map +0 -1
- package/dist/chunk-H4TQ3H3Y.js +0 -262
- package/dist/chunk-H4TQ3H3Y.js.map +0 -1
- package/dist/chunk-JGB3IXZO.js +0 -189
- package/dist/chunk-JGB3IXZO.js.map +0 -1
- package/dist/chunk-KD2QRQPY.js +0 -4342
- package/dist/chunk-KD2QRQPY.js.map +0 -1
- package/dist/chunk-KLMXQVYK.js +0 -369
- package/dist/chunk-KLMXQVYK.js.map +0 -1
- package/dist/chunk-KZUG5KFQ.js +0 -214
- package/dist/chunk-KZUG5KFQ.js.map +0 -1
- package/dist/chunk-QDAQ4CJU.js +0 -345
- package/dist/chunk-QDAQ4CJU.js.map +0 -1
- package/dist/chunk-RMH72RZI.js.map +0 -1
- package/dist/chunk-SWKWQZXM.js +0 -117
- package/dist/chunk-SWKWQZXM.js.map +0 -1
- package/dist/chunk-TJBP2K4T.js.map +0 -1
- package/dist/chunk-TLCEAQDQ.js +0 -542
- package/dist/chunk-TLCEAQDQ.js.map +0 -1
- package/dist/chunk-UZXBISGO.js.map +0 -1
- package/dist/chunk-WGBAKP3Q.js +0 -3220
- package/dist/chunk-WGBAKP3Q.js.map +0 -1
- package/dist/compare/index.cjs +0 -5475
- package/dist/compare/index.cjs.map +0 -1
- package/dist/compare/index.d.cts +0 -114
- package/dist/compare/index.d.ts +0 -114
- package/dist/compare/index.js +0 -731
- package/dist/compare/index.js.map +0 -1
- package/dist/core/commands/formatting-commands.cjs +0 -828
- package/dist/core/commands/formatting-commands.cjs.map +0 -1
- package/dist/core/commands/formatting-commands.d.cts +0 -63
- package/dist/core/commands/formatting-commands.d.ts +0 -63
- package/dist/core/commands/formatting-commands.js +0 -37
- package/dist/core/commands/formatting-commands.js.map +0 -1
- package/dist/core/commands/image-commands.cjs +0 -2023
- package/dist/core/commands/image-commands.cjs.map +0 -1
- package/dist/core/commands/image-commands.d.cts +0 -58
- package/dist/core/commands/image-commands.d.ts +0 -58
- package/dist/core/commands/image-commands.js +0 -18
- package/dist/core/commands/image-commands.js.map +0 -1
- package/dist/core/commands/section-layout-commands.cjs.map +0 -1
- package/dist/core/commands/section-layout-commands.d.cts +0 -62
- package/dist/core/commands/section-layout-commands.d.ts +0 -62
- package/dist/core/commands/section-layout-commands.js +0 -21
- package/dist/core/commands/section-layout-commands.js.map +0 -1
- package/dist/core/commands/style-commands.cjs.map +0 -1
- package/dist/core/commands/style-commands.d.cts +0 -13
- package/dist/core/commands/style-commands.d.ts +0 -13
- package/dist/core/commands/style-commands.js +0 -9
- package/dist/core/commands/style-commands.js.map +0 -1
- package/dist/core/commands/table-structure-commands.cjs +0 -1883
- package/dist/core/commands/table-structure-commands.cjs.map +0 -1
- package/dist/core/commands/table-structure-commands.d.cts +0 -59
- package/dist/core/commands/table-structure-commands.d.ts +0 -59
- package/dist/core/commands/table-structure-commands.js +0 -12
- package/dist/core/commands/table-structure-commands.js.map +0 -1
- package/dist/core/commands/text-commands.cjs +0 -2391
- package/dist/core/commands/text-commands.cjs.map +0 -1
- package/dist/core/commands/text-commands.d.cts +0 -24
- package/dist/core/commands/text-commands.d.ts +0 -24
- package/dist/core/commands/text-commands.js +0 -28
- package/dist/core/commands/text-commands.js.map +0 -1
- package/dist/core/selection/mapping.cjs +0 -200
- package/dist/core/selection/mapping.cjs.map +0 -1
- package/dist/core/selection/mapping.d.cts +0 -2
- package/dist/core/selection/mapping.d.ts +0 -2
- package/dist/core/selection/mapping.js +0 -31
- package/dist/core/selection/mapping.js.map +0 -1
- package/dist/core/state/editor-state.cjs +0 -2278
- package/dist/core/state/editor-state.cjs.map +0 -1
- package/dist/core/state/editor-state.d.cts +0 -2
- package/dist/core/state/editor-state.d.ts +0 -2
- package/dist/core/state/editor-state.js +0 -26
- package/dist/core/state/editor-state.js.map +0 -1
- package/dist/index.cjs +0 -38553
- package/dist/index.cjs.map +0 -1
- package/dist/index.d.cts +0 -15
- package/dist/index.d.ts +0 -15
- package/dist/index.js +0 -7856
- package/dist/index.js.map +0 -1
- package/dist/io/docx-session.cjs +0 -16236
- package/dist/io/docx-session.cjs.map +0 -1
- package/dist/io/docx-session.d.cts +0 -21
- package/dist/io/docx-session.d.ts +0 -21
- package/dist/io/docx-session.js +0 -18
- package/dist/io/docx-session.js.map +0 -1
- package/dist/legal/index.cjs +0 -3900
- package/dist/legal/index.cjs.map +0 -1
- package/dist/legal/index.d.cts +0 -86
- package/dist/legal/index.d.ts +0 -86
- package/dist/legal/index.js +0 -616
- package/dist/legal/index.js.map +0 -1
- package/dist/public-types-7ZL_94cz.d.ts +0 -1573
- package/dist/public-types-CeMaDueh.d.cts +0 -1573
- package/dist/public-types.cjs +0 -19
- package/dist/public-types.cjs.map +0 -1
- package/dist/public-types.d.cts +0 -2
- package/dist/public-types.d.ts +0 -2
- package/dist/public-types.js +0 -1
- package/dist/public-types.js.map +0 -1
- package/dist/runtime/document-runtime.cjs +0 -11140
- package/dist/runtime/document-runtime.cjs.map +0 -1
- package/dist/runtime/document-runtime.d.cts +0 -231
- package/dist/runtime/document-runtime.d.ts +0 -231
- package/dist/runtime/document-runtime.js +0 -21
- package/dist/runtime/document-runtime.js.map +0 -1
- package/dist/structural-helpers-CilgOVhh.d.cts +0 -10
- package/dist/structural-helpers-q0Gd-eBN.d.ts +0 -10
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs +0 -313
- package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +0 -1
- package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +0 -67
- package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +0 -67
- package/dist/ui-tailwind/editor-surface/search-plugin.js +0 -23
- package/dist/ui-tailwind/editor-surface/search-plugin.js.map +0 -1
- package/dist/ui-tailwind/index.cjs +0 -4833
- package/dist/ui-tailwind/index.cjs.map +0 -1
- package/dist/ui-tailwind/index.d.cts +0 -617
- package/dist/ui-tailwind/index.d.ts +0 -617
- package/dist/ui-tailwind/index.js +0 -575
- package/dist/ui-tailwind/index.js.map +0 -1
|
@@ -0,0 +1,255 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
BlockNode,
|
|
3
|
+
DocRange,
|
|
4
|
+
OpaqueFragmentRecord,
|
|
5
|
+
PreservationStore,
|
|
6
|
+
PreservedPackagePart,
|
|
7
|
+
} from "../model/canonical-document.ts";
|
|
8
|
+
|
|
9
|
+
export interface OpaqueFragmentDescriptor {
|
|
10
|
+
featureKey:
|
|
11
|
+
| "sections"
|
|
12
|
+
| "tables"
|
|
13
|
+
| "headers-footers"
|
|
14
|
+
| "fields"
|
|
15
|
+
| "content-controls"
|
|
16
|
+
| "custom-xml"
|
|
17
|
+
| "alt-chunk"
|
|
18
|
+
| "embedded-objects"
|
|
19
|
+
| "alternate-content"
|
|
20
|
+
| "unknown-ooxml";
|
|
21
|
+
label: string;
|
|
22
|
+
detail: string;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const BLOCKED_IMPORT_FEATURE_KEYS = new Set<OpaqueFragmentDescriptor["featureKey"]>([
|
|
26
|
+
"alt-chunk",
|
|
27
|
+
"custom-xml",
|
|
28
|
+
]);
|
|
29
|
+
|
|
30
|
+
export function createPreservationStore(
|
|
31
|
+
seed?: Partial<PreservationStore>,
|
|
32
|
+
): PreservationStore {
|
|
33
|
+
return {
|
|
34
|
+
opaqueFragments: { ...(seed?.opaqueFragments ?? {}) },
|
|
35
|
+
packageParts: { ...(seed?.packageParts ?? {}) },
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export function getOpaqueFragment(
|
|
40
|
+
store: PreservationStore,
|
|
41
|
+
fragmentId: string,
|
|
42
|
+
): OpaqueFragmentRecord | undefined {
|
|
43
|
+
return normalizeOpaqueFragmentMap(store)[fragmentId];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function listOpaqueFragments(
|
|
47
|
+
store: PreservationStore,
|
|
48
|
+
): OpaqueFragmentRecord[] {
|
|
49
|
+
return Object.values(normalizeOpaqueFragmentMap(store)).sort((left, right) => {
|
|
50
|
+
return (
|
|
51
|
+
left.lastKnownRange.from - right.lastKnownRange.from ||
|
|
52
|
+
left.fragmentId.localeCompare(right.fragmentId)
|
|
53
|
+
);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export function listPreservedPackageParts(
|
|
58
|
+
store: PreservationStore,
|
|
59
|
+
): PreservedPackagePart[] {
|
|
60
|
+
return Object.values(normalizePackagePartMap(store)).sort((left, right) =>
|
|
61
|
+
left.packagePartName.localeCompare(right.packagePartName),
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export function findOpaqueFragmentsIntersectingRange(
|
|
66
|
+
store: PreservationStore,
|
|
67
|
+
range: DocRange,
|
|
68
|
+
): OpaqueFragmentRecord[] {
|
|
69
|
+
return listOpaqueFragments(store).filter((fragment) =>
|
|
70
|
+
rangesIntersect(fragment.lastKnownRange, range),
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export function describeOpaqueFragment(
|
|
75
|
+
fragment: OpaqueFragmentRecord,
|
|
76
|
+
): OpaqueFragmentDescriptor {
|
|
77
|
+
const xml = fragment.payloadReference;
|
|
78
|
+
const detail = createDetail(fragment);
|
|
79
|
+
|
|
80
|
+
if (/\b(?:w:)?sectPr\b/u.test(xml)) {
|
|
81
|
+
return {
|
|
82
|
+
featureKey: "sections",
|
|
83
|
+
label: "Section properties",
|
|
84
|
+
detail,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (/\b(?:w:)?tbl\b/u.test(xml)) {
|
|
89
|
+
return {
|
|
90
|
+
featureKey: "tables",
|
|
91
|
+
label: "Preserved table structure",
|
|
92
|
+
detail,
|
|
93
|
+
};
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if (/\b(?:w:)?hdr\b|\b(?:w:)?ftr\b/u.test(xml)) {
|
|
97
|
+
return {
|
|
98
|
+
featureKey: "headers-footers",
|
|
99
|
+
label: "Header or footer content",
|
|
100
|
+
detail,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
if (/\b(?:w:)?fldSimple\b|\b(?:w:)?fldChar\b|\b(?:w:)?instrText\b/u.test(xml)) {
|
|
105
|
+
return {
|
|
106
|
+
featureKey: "fields",
|
|
107
|
+
label: "Word field content",
|
|
108
|
+
detail,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
if (/\b(?:w:)?sdt\b/u.test(xml)) {
|
|
113
|
+
return {
|
|
114
|
+
featureKey: "content-controls",
|
|
115
|
+
label: "Content control",
|
|
116
|
+
detail,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (/\b(?:w:)?customXml\b/u.test(xml)) {
|
|
121
|
+
return {
|
|
122
|
+
featureKey: "custom-xml",
|
|
123
|
+
label: "Custom XML wrapper",
|
|
124
|
+
detail,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
if (/\b(?:w:)?altChunk\b/u.test(xml)) {
|
|
129
|
+
return {
|
|
130
|
+
featureKey: "alt-chunk",
|
|
131
|
+
label: "AltChunk import",
|
|
132
|
+
detail,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (/\b(?:w:)?object\b|\b(?:o:)?OLEObject\b/u.test(xml)) {
|
|
137
|
+
const isOleObject = /\b(?:o:)?OLEObject\b/u.test(xml);
|
|
138
|
+
const label = isOleObject ? "OLE embedded object" : "Embedded object";
|
|
139
|
+
return {
|
|
140
|
+
featureKey: "embedded-objects",
|
|
141
|
+
label,
|
|
142
|
+
detail: `${detail} Preserve-only embedded object retained for export and Word reopen.`,
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (/\b(?:mc:)?AlternateContent\b/u.test(xml)) {
|
|
147
|
+
return {
|
|
148
|
+
featureKey: "alternate-content",
|
|
149
|
+
label: "Markup compatibility block",
|
|
150
|
+
detail,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
return {
|
|
155
|
+
featureKey: "unknown-ooxml",
|
|
156
|
+
label: "Unsupported OOXML fragment",
|
|
157
|
+
detail,
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export function describeStructuredWrapperBlock(
|
|
162
|
+
block: BlockNode,
|
|
163
|
+
): OpaqueFragmentDescriptor | null {
|
|
164
|
+
if (block.type === "sdt") {
|
|
165
|
+
if (isTocContentControl(block)) {
|
|
166
|
+
return {
|
|
167
|
+
featureKey: "content-controls",
|
|
168
|
+
label: "TOC content control",
|
|
169
|
+
detail: "TOC content control remains a wrapper-heavy template structure and read-only.",
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
if (block.properties.sdtType === "docPartObj") {
|
|
173
|
+
return {
|
|
174
|
+
featureKey: "content-controls",
|
|
175
|
+
label: "Template content control",
|
|
176
|
+
detail: "Template content control remains a wrapper-heavy document part and read-only.",
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (block.type === "custom_xml") {
|
|
182
|
+
const descriptor = [block.element, block.uri].filter(Boolean).join(" ");
|
|
183
|
+
return {
|
|
184
|
+
featureKey: "custom-xml",
|
|
185
|
+
label: "Custom XML wrapper",
|
|
186
|
+
detail: descriptor.length > 0
|
|
187
|
+
? `Custom XML wrapper ${descriptor} remains package-backed and read-only.`
|
|
188
|
+
: "Custom XML wrapper remains package-backed and read-only.",
|
|
189
|
+
};
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (block.type === "alt_chunk") {
|
|
193
|
+
return {
|
|
194
|
+
featureKey: "alt-chunk",
|
|
195
|
+
label: "AltChunk import",
|
|
196
|
+
detail: `AltChunk import remains package-backed and blocked through relationship ${block.relationshipId}.`,
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
export function isBlockedImportFeatureKey(
|
|
204
|
+
featureKey: OpaqueFragmentDescriptor["featureKey"],
|
|
205
|
+
): boolean {
|
|
206
|
+
return BLOCKED_IMPORT_FEATURE_KEYS.has(featureKey);
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
function createDetail(fragment: OpaqueFragmentRecord): string {
|
|
210
|
+
const detail = [
|
|
211
|
+
`Preserved whole-unit from ${fragment.lastKnownRange.from}-${fragment.lastKnownRange.to}.`,
|
|
212
|
+
fragment.packagePartName ? `Part ${fragment.packagePartName}.` : null,
|
|
213
|
+
fragment.relationshipId ? `Relationship ${fragment.relationshipId}.` : null,
|
|
214
|
+
]
|
|
215
|
+
.filter(Boolean)
|
|
216
|
+
.join(" ");
|
|
217
|
+
|
|
218
|
+
return detail.length > 0
|
|
219
|
+
? detail
|
|
220
|
+
: "Preserved whole-unit to keep unsupported OOXML intact.";
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
function isTocContentControl(block: Extract<BlockNode, { type: "sdt" }>): boolean {
|
|
224
|
+
const searchText = [
|
|
225
|
+
block.properties.alias,
|
|
226
|
+
block.properties.tag,
|
|
227
|
+
block.properties.sdtType,
|
|
228
|
+
block.properties.propertiesXml,
|
|
229
|
+
]
|
|
230
|
+
.filter(Boolean)
|
|
231
|
+
.join(" ")
|
|
232
|
+
.toLowerCase();
|
|
233
|
+
|
|
234
|
+
return searchText.includes("table of contents") || /\btoc\b/u.test(searchText);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
function rangesIntersect(left: DocRange, right: DocRange): boolean {
|
|
238
|
+
return left.from < right.to && right.from < left.to;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
function normalizeOpaqueFragmentMap(
|
|
242
|
+
store: PreservationStore,
|
|
243
|
+
): Record<string, OpaqueFragmentRecord> {
|
|
244
|
+
return store && typeof store === "object" && store.opaqueFragments && typeof store.opaqueFragments === "object"
|
|
245
|
+
? (store.opaqueFragments as Record<string, OpaqueFragmentRecord>)
|
|
246
|
+
: {};
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
function normalizePackagePartMap(
|
|
250
|
+
store: PreservationStore,
|
|
251
|
+
): Record<string, PreservedPackagePart> {
|
|
252
|
+
return store && typeof store === "object" && store.packageParts && typeof store.packageParts === "object"
|
|
253
|
+
? (store.packageParts as Record<string, PreservedPackagePart>)
|
|
254
|
+
: {};
|
|
255
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
# Review
|
|
2
|
+
|
|
3
|
+
Comments, anchors, revisions, remap helpers, and accept/reject behavior belong here.
|
|
4
|
+
|
|
5
|
+
Frozen Wave 1 contract:
|
|
6
|
+
|
|
7
|
+
- comments and revisions live in the canonical `review` store, not in the content tree
|
|
8
|
+
- review anchors use canonical position ranges or detached-anchor payloads, never DOM paths
|
|
9
|
+
- all review mutations flow through runtime commands and transactions
|
|
10
|
+
- detached comments or revisions remain addressable with reason metadata; they are not silently dropped
|
|
11
|
+
- v1 authoring is limited to single-paragraph comments, thread replies, tracked insertions, tracked deletions, and accept/reject flows
|
|
12
|
+
- preserve-only review structures such as multi-paragraph editable comment ranges, tracked moves, and structural list/table revisions stay locked and warning-backed
|
|
13
|
+
|
|
14
|
+
Key subdirectories:
|
|
15
|
+
|
|
16
|
+
- `store/`
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createNodeAnchor,
|
|
3
|
+
createRangeAnchor,
|
|
4
|
+
mapAnchor,
|
|
5
|
+
normalizeRange,
|
|
6
|
+
type Assoc,
|
|
7
|
+
type BoundaryAssoc,
|
|
8
|
+
type DocRange,
|
|
9
|
+
type EditorAnchorProjection,
|
|
10
|
+
type TransactionMapping,
|
|
11
|
+
} from "../../core/selection/mapping.ts";
|
|
12
|
+
|
|
13
|
+
export type CommentAnchor = EditorAnchorProjection;
|
|
14
|
+
export type CommentAnchorState = "active" | "detached";
|
|
15
|
+
|
|
16
|
+
export interface CommentAnchorSummary {
|
|
17
|
+
anchor: CommentAnchor;
|
|
18
|
+
state: CommentAnchorState;
|
|
19
|
+
range: DocRange;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function createCommentRangeAnchor(
|
|
23
|
+
from: number,
|
|
24
|
+
to = from,
|
|
25
|
+
assoc?: BoundaryAssoc,
|
|
26
|
+
): CommentAnchor {
|
|
27
|
+
return createRangeAnchor(from, to, assoc);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function createCommentNodeAnchor(at: number, assoc?: Assoc): CommentAnchor {
|
|
31
|
+
return createNodeAnchor(at, assoc);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function remapCommentAnchor(
|
|
35
|
+
anchor: CommentAnchor,
|
|
36
|
+
mapping: TransactionMapping,
|
|
37
|
+
): CommentAnchor {
|
|
38
|
+
return mapAnchor(anchor, mapping);
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export function isDetachedCommentAnchor(anchor: CommentAnchor): boolean {
|
|
42
|
+
return anchor.kind === "detached";
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function summarizeCommentAnchor(anchor: CommentAnchor): CommentAnchorSummary {
|
|
46
|
+
if (anchor.kind === "range") {
|
|
47
|
+
return {
|
|
48
|
+
anchor,
|
|
49
|
+
state: "active",
|
|
50
|
+
range: normalizeRange(anchor.range),
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (anchor.kind === "node") {
|
|
55
|
+
return {
|
|
56
|
+
anchor,
|
|
57
|
+
state: "active",
|
|
58
|
+
range: {
|
|
59
|
+
from: anchor.at,
|
|
60
|
+
to: anchor.at,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
return {
|
|
66
|
+
anchor,
|
|
67
|
+
state: "detached",
|
|
68
|
+
range: normalizeRange(anchor.lastKnownRange),
|
|
69
|
+
};
|
|
70
|
+
}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import type { CommentThreadRecord, EditorWarning } from "../../core/state/editor-state.ts";
|
|
2
|
+
import {
|
|
3
|
+
detachReviewAnchor,
|
|
4
|
+
getAnchorRange,
|
|
5
|
+
mapReviewAnchor,
|
|
6
|
+
mappingTouchesAnchorContent,
|
|
7
|
+
rangeStaysWithinSingleParagraph,
|
|
8
|
+
type ReviewAnchor,
|
|
9
|
+
} from "../../core/selection/review-anchors.ts";
|
|
10
|
+
import type { TransactionMapping } from "../../core/selection/mapping.ts";
|
|
11
|
+
|
|
12
|
+
export interface RemapCommentThreadsOptions {
|
|
13
|
+
comments: Record<string, CommentThreadRecord>;
|
|
14
|
+
mapping: TransactionMapping;
|
|
15
|
+
nextContent: unknown;
|
|
16
|
+
existingWarnings?: EditorWarning[];
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export interface RemapCommentThreadsResult {
|
|
20
|
+
comments: Record<string, CommentThreadRecord>;
|
|
21
|
+
warnings: EditorWarning[];
|
|
22
|
+
detachedCommentIds: string[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function remapCommentThreads(
|
|
26
|
+
options: RemapCommentThreadsOptions,
|
|
27
|
+
): RemapCommentThreadsResult {
|
|
28
|
+
const comments = Object.fromEntries(
|
|
29
|
+
Object.entries(options.comments).map(([commentId, comment]) => [
|
|
30
|
+
commentId,
|
|
31
|
+
remapCommentThread(comment, options.mapping, options.nextContent),
|
|
32
|
+
]),
|
|
33
|
+
);
|
|
34
|
+
const detachedCommentIds = Object.values(comments)
|
|
35
|
+
.filter((comment) => comment.anchor.kind === "detached")
|
|
36
|
+
.map((comment) => comment.commentId);
|
|
37
|
+
|
|
38
|
+
return {
|
|
39
|
+
comments,
|
|
40
|
+
warnings: mergeDetachedAnchorWarnings(comments, options.existingWarnings ?? []),
|
|
41
|
+
detachedCommentIds,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export function remapCommentThread(
|
|
46
|
+
comment: CommentThreadRecord,
|
|
47
|
+
mapping: TransactionMapping,
|
|
48
|
+
nextContent: unknown,
|
|
49
|
+
): CommentThreadRecord {
|
|
50
|
+
if (comment.anchor.kind === "detached") {
|
|
51
|
+
return comment;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const mappedAnchor = mapReviewAnchor(comment.anchor, mapping);
|
|
55
|
+
const anchor = normalizeCommentAnchor(comment.anchor, mappedAnchor, mapping, nextContent);
|
|
56
|
+
|
|
57
|
+
return {
|
|
58
|
+
...comment,
|
|
59
|
+
anchor,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function normalizeCommentAnchor(
|
|
64
|
+
previousAnchor: ReviewAnchor,
|
|
65
|
+
mappedAnchor: ReviewAnchor,
|
|
66
|
+
mapping: TransactionMapping,
|
|
67
|
+
nextContent: unknown,
|
|
68
|
+
): ReviewAnchor {
|
|
69
|
+
if (mappedAnchor.kind === "detached") {
|
|
70
|
+
return mappedAnchor;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const previousRange = getAnchorRange(previousAnchor);
|
|
74
|
+
const mappedRange = getAnchorRange(mappedAnchor);
|
|
75
|
+
|
|
76
|
+
if (
|
|
77
|
+
previousAnchor.kind === "range" &&
|
|
78
|
+
previousRange.from < previousRange.to &&
|
|
79
|
+
mappedAnchor.kind === "range" &&
|
|
80
|
+
mappedRange.from === mappedRange.to &&
|
|
81
|
+
mappingTouchesAnchorContent(previousAnchor, mapping)
|
|
82
|
+
) {
|
|
83
|
+
return detachReviewAnchor(previousRange, detachReason(mapping));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
if (
|
|
87
|
+
mappedAnchor.kind === "range" &&
|
|
88
|
+
!rangeStaysWithinSingleParagraph(nextContent, mappedAnchor.range)
|
|
89
|
+
) {
|
|
90
|
+
return detachReviewAnchor(previousRange, "invalidatedByStructureChange");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
return mappedAnchor;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function detachReason(
|
|
97
|
+
mapping: TransactionMapping,
|
|
98
|
+
): "deleted" | "invalidatedByStructureChange" {
|
|
99
|
+
return mapping.metadata?.invalidatesStructures
|
|
100
|
+
? "invalidatedByStructureChange"
|
|
101
|
+
: "deleted";
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
function mergeDetachedAnchorWarnings(
|
|
105
|
+
comments: Record<string, CommentThreadRecord>,
|
|
106
|
+
existingWarnings: EditorWarning[],
|
|
107
|
+
): EditorWarning[] {
|
|
108
|
+
const retainedWarnings = existingWarnings.filter(
|
|
109
|
+
(warning) =>
|
|
110
|
+
warning.code !== "comment_anchor_detached" ||
|
|
111
|
+
!warning.details ||
|
|
112
|
+
typeof warning.details.commentId !== "string" ||
|
|
113
|
+
comments[warning.details.commentId]?.anchor.kind === "detached",
|
|
114
|
+
);
|
|
115
|
+
|
|
116
|
+
const knownDetachedIds = new Set(
|
|
117
|
+
retainedWarnings
|
|
118
|
+
.filter((warning) => warning.code === "comment_anchor_detached")
|
|
119
|
+
.map((warning) =>
|
|
120
|
+
typeof warning.details?.commentId === "string"
|
|
121
|
+
? warning.details.commentId
|
|
122
|
+
: undefined,
|
|
123
|
+
)
|
|
124
|
+
.filter((value): value is string => Boolean(value)),
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
const detachedWarnings = Object.values(comments)
|
|
128
|
+
.filter(
|
|
129
|
+
(comment) =>
|
|
130
|
+
comment.anchor.kind === "detached" && !knownDetachedIds.has(comment.commentId),
|
|
131
|
+
)
|
|
132
|
+
.map((comment) => createDetachedCommentWarning(comment));
|
|
133
|
+
|
|
134
|
+
return [...retainedWarnings, ...detachedWarnings];
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function createDetachedCommentWarning(
|
|
138
|
+
comment: CommentThreadRecord,
|
|
139
|
+
): EditorWarning {
|
|
140
|
+
const anchor = comment.anchor.kind === "detached" ? comment.anchor : undefined;
|
|
141
|
+
|
|
142
|
+
return {
|
|
143
|
+
warningId: `warning:comment-anchor-detached:${comment.commentId}`,
|
|
144
|
+
code: "comment_anchor_detached",
|
|
145
|
+
severity: "warning",
|
|
146
|
+
message: `Comment ${comment.commentId} detached after edit remapping.`,
|
|
147
|
+
source: "review",
|
|
148
|
+
affectedAnchor: anchor,
|
|
149
|
+
details: {
|
|
150
|
+
commentId: comment.commentId,
|
|
151
|
+
reason: anchor?.reason,
|
|
152
|
+
},
|
|
153
|
+
};
|
|
154
|
+
}
|