@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.
Files changed (381) hide show
  1. package/package.json +65 -96
  2. package/src/README.md +85 -0
  3. package/src/api/README.md +26 -0
  4. package/src/api/public-types.ts +1952 -0
  5. package/src/api/session-state.ts +62 -0
  6. package/src/compare/diff-engine.ts +623 -0
  7. package/src/compare/export-redlines.ts +280 -0
  8. package/src/compare/index.ts +25 -0
  9. package/src/compare/snapshot.ts +97 -0
  10. package/src/component-inventory.md +99 -0
  11. package/src/core/README.md +10 -0
  12. package/src/core/commands/README.md +3 -0
  13. package/{dist/chunk-TJBP2K4T.js → src/core/commands/formatting-commands.ts} +536 -196
  14. package/src/core/commands/image-commands.ts +373 -0
  15. package/src/core/commands/index.ts +1879 -0
  16. package/src/core/commands/list-commands.ts +565 -0
  17. package/src/core/commands/paragraph-layout-commands.ts +339 -0
  18. package/src/core/commands/review-commands.ts +108 -0
  19. package/{dist/core/commands/section-layout-commands.cjs → src/core/commands/section-layout-commands.ts} +340 -137
  20. package/src/core/commands/structural-helpers.ts +309 -0
  21. package/{dist/core/commands/style-commands.cjs → src/core/commands/style-commands.ts} +113 -65
  22. package/src/core/commands/table-structure-commands.ts +854 -0
  23. package/{dist/chunk-UZXBISGO.js → src/core/commands/text-commands.ts} +142 -86
  24. package/src/core/schema/README.md +3 -0
  25. package/src/core/schema/text-schema.ts +516 -0
  26. package/src/core/search/search-text.ts +357 -0
  27. package/src/core/selection/README.md +3 -0
  28. package/src/core/selection/mapping.ts +289 -0
  29. package/src/core/selection/review-anchors.ts +183 -0
  30. package/src/core/state/README.md +3 -0
  31. package/src/core/state/editor-state.ts +892 -0
  32. package/src/core/state/text-transaction.ts +869 -0
  33. package/src/formats/xlsx/io/parse-shared-strings.ts +41 -0
  34. package/src/formats/xlsx/io/parse-sheet.ts +459 -0
  35. package/src/formats/xlsx/io/parse-styles.ts +59 -0
  36. package/src/formats/xlsx/io/parse-workbook.ts +75 -0
  37. package/src/formats/xlsx/io/serialize-shared-strings.ts +72 -0
  38. package/src/formats/xlsx/io/serialize-sheet.ts +333 -0
  39. package/src/formats/xlsx/io/serialize-styles.ts +98 -0
  40. package/src/formats/xlsx/io/serialize-workbook.ts +429 -0
  41. package/src/formats/xlsx/io/xlsx-session.ts +314 -0
  42. package/src/formats/xlsx/model/cell.ts +189 -0
  43. package/src/formats/xlsx/model/sheet.ts +326 -0
  44. package/src/formats/xlsx/model/styles.ts +118 -0
  45. package/src/formats/xlsx/model/workbook.ts +453 -0
  46. package/src/formats/xlsx/runtime/cell-commands.ts +567 -0
  47. package/src/formats/xlsx/runtime/sheet-commands.ts +206 -0
  48. package/src/formats/xlsx/runtime/workbook-runtime.ts +177 -0
  49. package/src/formats/xlsx/runtime/workbook-transaction.ts +822 -0
  50. package/src/index.ts +142 -0
  51. package/src/io/README.md +10 -0
  52. package/src/io/docx-session.ts +3175 -0
  53. package/src/io/export/README.md +3 -0
  54. package/src/io/export/export-session.ts +220 -0
  55. package/src/io/export/minimal-docx.ts +115 -0
  56. package/src/io/export/reattach-preserved-parts.ts +54 -0
  57. package/src/io/export/serialize-comments.ts +947 -0
  58. package/src/io/export/serialize-footnotes.ts +394 -0
  59. package/src/io/export/serialize-headers-footers.ts +368 -0
  60. package/src/io/export/serialize-main-document.ts +1342 -0
  61. package/src/io/export/serialize-numbering.ts +218 -0
  62. package/src/io/export/serialize-revisions.ts +389 -0
  63. package/src/io/export/serialize-runtime-revisions.ts +463 -0
  64. package/src/io/export/serialize-tables.ts +174 -0
  65. package/src/io/export/split-review-boundaries.ts +356 -0
  66. package/src/io/export/split-story-blocks-for-runtime-revisions.ts +252 -0
  67. package/src/io/export/table-properties-xml.ts +318 -0
  68. package/src/io/normalize/README.md +3 -0
  69. package/src/io/normalize/normalize-text.ts +670 -0
  70. package/src/io/ooxml/README.md +3 -0
  71. package/src/io/ooxml/highlight-colors.ts +39 -0
  72. package/src/io/ooxml/numbering-sentinels.ts +44 -0
  73. package/src/io/ooxml/parse-comments.ts +852 -0
  74. package/src/io/ooxml/parse-complex-content.ts +287 -0
  75. package/src/io/ooxml/parse-fields.ts +834 -0
  76. package/src/io/ooxml/parse-footnotes.ts +952 -0
  77. package/src/io/ooxml/parse-headers-footers.ts +1212 -0
  78. package/src/io/ooxml/parse-inline-media.ts +461 -0
  79. package/src/io/ooxml/parse-main-document.ts +2947 -0
  80. package/src/io/ooxml/parse-numbering.ts +747 -0
  81. package/src/io/ooxml/parse-revisions.ts +1045 -0
  82. package/src/io/ooxml/parse-settings.ts +184 -0
  83. package/src/io/ooxml/parse-shapes.ts +296 -0
  84. package/src/io/ooxml/parse-styles.ts +639 -0
  85. package/src/io/ooxml/parse-tables.ts +627 -0
  86. package/src/io/ooxml/parse-theme.ts +346 -0
  87. package/src/io/ooxml/part-manifest.ts +136 -0
  88. package/src/io/ooxml/revision-boundaries.ts +475 -0
  89. package/src/io/ooxml/workflow-payload.ts +544 -0
  90. package/src/io/opc/README.md +3 -0
  91. package/src/io/opc/corrupt-package.ts +166 -0
  92. package/src/io/opc/docx-package.ts +74 -0
  93. package/src/io/opc/package-reader.ts +325 -0
  94. package/src/io/opc/package-writer.ts +273 -0
  95. package/src/io/source-package-provenance.ts +241 -0
  96. package/{dist/chunk-RMH72RZI.js → src/legal/bookmarks.ts} +130 -44
  97. package/src/legal/cross-references.ts +414 -0
  98. package/src/legal/defined-terms.ts +203 -0
  99. package/src/legal/index.ts +32 -0
  100. package/src/legal/signature-blocks.ts +259 -0
  101. package/src/model/README.md +3 -0
  102. package/src/model/canonical-document.ts +2722 -0
  103. package/src/model/cds-1.0.0.ts +212 -0
  104. package/src/model/snapshot.ts +760 -0
  105. package/src/preservation/README.md +3 -0
  106. package/src/preservation/markup-compatibility.ts +48 -0
  107. package/src/preservation/opaque-fragment-store.ts +89 -0
  108. package/src/preservation/opaque-region.ts +233 -0
  109. package/src/preservation/package-preservation.ts +113 -0
  110. package/src/preservation/preserved-part-manifest.ts +56 -0
  111. package/src/preservation/relationship-retention.ts +57 -0
  112. package/src/preservation/store.ts +255 -0
  113. package/src/review/README.md +16 -0
  114. package/src/review/store/README.md +3 -0
  115. package/src/review/store/comment-anchors.ts +70 -0
  116. package/src/review/store/comment-remapping.ts +154 -0
  117. package/src/review/store/comment-store.ts +349 -0
  118. package/src/review/store/comment-thread.ts +109 -0
  119. package/src/review/store/revision-actions.ts +423 -0
  120. package/src/review/store/revision-store.ts +323 -0
  121. package/src/review/store/revision-types.ts +182 -0
  122. package/src/review/store/runtime-comment-store.ts +43 -0
  123. package/src/runtime/README.md +3 -0
  124. package/src/runtime/ai-action-policy.ts +764 -0
  125. package/src/runtime/context-analytics.ts +824 -0
  126. package/src/runtime/document-layout.ts +332 -0
  127. package/src/runtime/document-locations.ts +521 -0
  128. package/src/runtime/document-navigation.ts +616 -0
  129. package/src/runtime/document-outline.ts +440 -0
  130. package/src/runtime/document-runtime.ts +4055 -0
  131. package/src/runtime/document-search.ts +145 -0
  132. package/src/runtime/event-refresh-hints.ts +137 -0
  133. package/src/runtime/numbering-prefix.ts +244 -0
  134. package/src/runtime/page-layout-estimation.ts +305 -0
  135. package/src/runtime/read-only-diagnostics-runtime.ts +241 -0
  136. package/src/runtime/resolved-numbering-geometry.ts +293 -0
  137. package/src/runtime/review-runtime.ts +44 -0
  138. package/src/runtime/revision-runtime.ts +107 -0
  139. package/src/runtime/session-capabilities.ts +192 -0
  140. package/src/runtime/story-context.ts +164 -0
  141. package/src/runtime/story-targeting.ts +162 -0
  142. package/src/runtime/suggestions-snapshot.ts +137 -0
  143. package/src/runtime/surface-projection.ts +1553 -0
  144. package/src/runtime/table-commands.ts +173 -0
  145. package/src/runtime/table-schema.ts +309 -0
  146. package/src/runtime/table-style-resolver.ts +409 -0
  147. package/src/runtime/view-state.ts +493 -0
  148. package/src/runtime/virtualized-rendering.ts +258 -0
  149. package/src/runtime/workflow-markup.ts +393 -0
  150. package/src/ui/README.md +30 -0
  151. package/src/ui/WordReviewEditor.tsx +5268 -0
  152. package/src/ui/browser-export.ts +52 -0
  153. package/src/ui/comments/README.md +3 -0
  154. package/src/ui/compatibility/README.md +3 -0
  155. package/src/ui/editor-command-bag.ts +127 -0
  156. package/src/ui/editor-runtime-boundary.ts +1558 -0
  157. package/src/ui/editor-shell-view.tsx +144 -0
  158. package/src/ui/editor-surface/README.md +3 -0
  159. package/src/ui/editor-surface-controller.tsx +66 -0
  160. package/src/ui/headless/comment-decoration-model.ts +124 -0
  161. package/src/ui/headless/preserve-editor-selection.ts +5 -0
  162. package/src/ui/headless/revision-decoration-model.ts +128 -0
  163. package/src/ui/headless/selection-helpers.ts +54 -0
  164. package/src/ui/headless/selection-tool-context.ts +19 -0
  165. package/src/ui/headless/selection-tool-resolver.ts +752 -0
  166. package/src/ui/headless/selection-tool-types.ts +129 -0
  167. package/src/ui/headless/selection-toolbar-model.ts +11 -0
  168. package/src/ui/headless/use-editor-keyboard.ts +103 -0
  169. package/src/ui/review/README.md +3 -0
  170. package/src/ui/runtime-shortcut-dispatch.ts +365 -0
  171. package/src/ui/runtime-snapshot-selectors.ts +197 -0
  172. package/src/ui/shared/revision-filters.ts +31 -0
  173. package/src/ui/status/README.md +3 -0
  174. package/src/ui/theme/README.md +3 -0
  175. package/src/ui/toolbar/README.md +3 -0
  176. package/src/ui/workflow-surface-blocked-rails.ts +94 -0
  177. package/src/ui-tailwind/chrome/chrome-preset-model.ts +107 -0
  178. package/src/ui-tailwind/chrome/chrome-preset-toolbar.tsx +15 -0
  179. package/src/ui-tailwind/chrome/review-queue-bar.tsx +97 -0
  180. package/src/ui-tailwind/chrome/tw-alert-banner.tsx +64 -0
  181. package/src/ui-tailwind/chrome/tw-context-analytics-summary.tsx +122 -0
  182. package/src/ui-tailwind/chrome/tw-image-context-toolbar.tsx +121 -0
  183. package/src/ui-tailwind/chrome/tw-layout-panel.tsx +114 -0
  184. package/src/ui-tailwind/chrome/tw-object-context-toolbar.tsx +30 -0
  185. package/src/ui-tailwind/chrome/tw-page-ruler.tsx +365 -0
  186. package/src/ui-tailwind/chrome/tw-selection-tool-blocked.tsx +23 -0
  187. package/src/ui-tailwind/chrome/tw-selection-tool-comment.tsx +35 -0
  188. package/src/ui-tailwind/chrome/tw-selection-tool-formatting.tsx +37 -0
  189. package/src/ui-tailwind/chrome/tw-selection-tool-host.tsx +298 -0
  190. package/src/ui-tailwind/chrome/tw-selection-tool-structure.tsx +116 -0
  191. package/src/ui-tailwind/chrome/tw-selection-tool-suggestion.tsx +29 -0
  192. package/src/ui-tailwind/chrome/tw-selection-tool-workflow.tsx +27 -0
  193. package/src/ui-tailwind/chrome/tw-selection-toolbar.tsx +186 -0
  194. package/src/ui-tailwind/chrome/tw-suggestion-card.tsx +139 -0
  195. package/src/ui-tailwind/chrome/tw-table-context-toolbar.tsx +200 -0
  196. package/src/ui-tailwind/chrome/tw-unsaved-modal.tsx +58 -0
  197. package/src/ui-tailwind/chrome/use-before-unload.ts +20 -0
  198. package/src/ui-tailwind/editor-surface/perf-probe.ts +179 -0
  199. package/src/ui-tailwind/editor-surface/pm-command-bridge.ts +189 -0
  200. package/src/ui-tailwind/editor-surface/pm-contextual-ui.ts +31 -0
  201. package/src/ui-tailwind/editor-surface/pm-decorations.ts +411 -0
  202. package/src/ui-tailwind/editor-surface/pm-position-map.ts +123 -0
  203. package/src/ui-tailwind/editor-surface/pm-schema.ts +927 -0
  204. package/src/ui-tailwind/editor-surface/pm-state-from-snapshot.ts +567 -0
  205. package/src/ui-tailwind/editor-surface/search-plugin.ts +168 -0
  206. package/src/ui-tailwind/editor-surface/surface-build-keys.ts +65 -0
  207. package/src/ui-tailwind/editor-surface/tw-caret.tsx +12 -0
  208. package/src/ui-tailwind/editor-surface/tw-editor-surface.tsx +150 -0
  209. package/src/ui-tailwind/editor-surface/tw-inline-token.tsx +129 -0
  210. package/src/ui-tailwind/editor-surface/tw-opaque-block.tsx +58 -0
  211. package/src/ui-tailwind/editor-surface/tw-paragraph-block.tsx +151 -0
  212. package/src/ui-tailwind/editor-surface/tw-prosemirror-surface.tsx +1047 -0
  213. package/src/ui-tailwind/editor-surface/tw-segment-view.tsx +111 -0
  214. package/src/ui-tailwind/editor-surface/tw-table-node-view.tsx +503 -0
  215. package/src/ui-tailwind/index.ts +62 -0
  216. package/src/ui-tailwind/page-chrome-model.ts +27 -0
  217. package/src/ui-tailwind/review/tw-comment-sidebar.tsx +406 -0
  218. package/src/ui-tailwind/review/tw-health-panel.tsx +149 -0
  219. package/src/ui-tailwind/review/tw-review-rail.tsx +122 -0
  220. package/src/ui-tailwind/review/tw-revision-sidebar.tsx +164 -0
  221. package/src/ui-tailwind/status/tw-status-bar.tsx +65 -0
  222. package/{dist → src}/ui-tailwind/theme/editor-theme.css +58 -40
  223. package/src/ui-tailwind/toolbar/tw-toolbar-icon-button.tsx +52 -0
  224. package/src/ui-tailwind/toolbar/tw-toolbar.tsx +1133 -0
  225. package/src/ui-tailwind/tw-review-workspace.tsx +1460 -0
  226. package/src/validation/README.md +3 -0
  227. package/src/validation/compatibility-engine.ts +878 -0
  228. package/src/validation/compatibility-report.ts +161 -0
  229. package/src/validation/diagnostics.ts +204 -0
  230. package/src/validation/docx-comment-proof.ts +720 -0
  231. package/src/validation/import-diagnostics.ts +128 -0
  232. package/src/validation/low-priority-word-surfaces.ts +373 -0
  233. package/dist/canonical-document-BLEbzL2J.d.cts +0 -844
  234. package/dist/canonical-document-BLEbzL2J.d.ts +0 -844
  235. package/dist/chunk-2FJS5GZM.js +0 -763
  236. package/dist/chunk-2FJS5GZM.js.map +0 -1
  237. package/dist/chunk-2OQBZS3F.js +0 -446
  238. package/dist/chunk-2OQBZS3F.js.map +0 -1
  239. package/dist/chunk-2S7W4KFO.js +0 -127
  240. package/dist/chunk-2S7W4KFO.js.map +0 -1
  241. package/dist/chunk-2TG72QSW.js +0 -3874
  242. package/dist/chunk-2TG72QSW.js.map +0 -1
  243. package/dist/chunk-36QNIZBO.js +0 -532
  244. package/dist/chunk-36QNIZBO.js.map +0 -1
  245. package/dist/chunk-4AQOYAW4.js +0 -3069
  246. package/dist/chunk-4AQOYAW4.js.map +0 -1
  247. package/dist/chunk-4D5EWJ3P.js +0 -77
  248. package/dist/chunk-4D5EWJ3P.js.map +0 -1
  249. package/dist/chunk-5FN54NDH.js +0 -2257
  250. package/dist/chunk-5FN54NDH.js.map +0 -1
  251. package/dist/chunk-BOYGQYRQ.js +0 -7306
  252. package/dist/chunk-BOYGQYRQ.js.map +0 -1
  253. package/dist/chunk-CN3XMECL.js +0 -212
  254. package/dist/chunk-CN3XMECL.js.map +0 -1
  255. package/dist/chunk-EBI3BX6U.js +0 -164
  256. package/dist/chunk-EBI3BX6U.js.map +0 -1
  257. package/dist/chunk-EILUG3VB.js +0 -1275
  258. package/dist/chunk-EILUG3VB.js.map +0 -1
  259. package/dist/chunk-FUDY333O.js +0 -70
  260. package/dist/chunk-FUDY333O.js.map +0 -1
  261. package/dist/chunk-GBVOWFIK.js +0 -1237
  262. package/dist/chunk-GBVOWFIK.js.map +0 -1
  263. package/dist/chunk-H4TQ3H3Y.js +0 -262
  264. package/dist/chunk-H4TQ3H3Y.js.map +0 -1
  265. package/dist/chunk-JGB3IXZO.js +0 -189
  266. package/dist/chunk-JGB3IXZO.js.map +0 -1
  267. package/dist/chunk-KD2QRQPY.js +0 -4342
  268. package/dist/chunk-KD2QRQPY.js.map +0 -1
  269. package/dist/chunk-KLMXQVYK.js +0 -369
  270. package/dist/chunk-KLMXQVYK.js.map +0 -1
  271. package/dist/chunk-KZUG5KFQ.js +0 -214
  272. package/dist/chunk-KZUG5KFQ.js.map +0 -1
  273. package/dist/chunk-QDAQ4CJU.js +0 -345
  274. package/dist/chunk-QDAQ4CJU.js.map +0 -1
  275. package/dist/chunk-RMH72RZI.js.map +0 -1
  276. package/dist/chunk-SWKWQZXM.js +0 -117
  277. package/dist/chunk-SWKWQZXM.js.map +0 -1
  278. package/dist/chunk-TJBP2K4T.js.map +0 -1
  279. package/dist/chunk-TLCEAQDQ.js +0 -542
  280. package/dist/chunk-TLCEAQDQ.js.map +0 -1
  281. package/dist/chunk-UZXBISGO.js.map +0 -1
  282. package/dist/chunk-WGBAKP3Q.js +0 -3220
  283. package/dist/chunk-WGBAKP3Q.js.map +0 -1
  284. package/dist/compare/index.cjs +0 -5475
  285. package/dist/compare/index.cjs.map +0 -1
  286. package/dist/compare/index.d.cts +0 -114
  287. package/dist/compare/index.d.ts +0 -114
  288. package/dist/compare/index.js +0 -731
  289. package/dist/compare/index.js.map +0 -1
  290. package/dist/core/commands/formatting-commands.cjs +0 -828
  291. package/dist/core/commands/formatting-commands.cjs.map +0 -1
  292. package/dist/core/commands/formatting-commands.d.cts +0 -63
  293. package/dist/core/commands/formatting-commands.d.ts +0 -63
  294. package/dist/core/commands/formatting-commands.js +0 -37
  295. package/dist/core/commands/formatting-commands.js.map +0 -1
  296. package/dist/core/commands/image-commands.cjs +0 -2023
  297. package/dist/core/commands/image-commands.cjs.map +0 -1
  298. package/dist/core/commands/image-commands.d.cts +0 -58
  299. package/dist/core/commands/image-commands.d.ts +0 -58
  300. package/dist/core/commands/image-commands.js +0 -18
  301. package/dist/core/commands/image-commands.js.map +0 -1
  302. package/dist/core/commands/section-layout-commands.cjs.map +0 -1
  303. package/dist/core/commands/section-layout-commands.d.cts +0 -62
  304. package/dist/core/commands/section-layout-commands.d.ts +0 -62
  305. package/dist/core/commands/section-layout-commands.js +0 -21
  306. package/dist/core/commands/section-layout-commands.js.map +0 -1
  307. package/dist/core/commands/style-commands.cjs.map +0 -1
  308. package/dist/core/commands/style-commands.d.cts +0 -13
  309. package/dist/core/commands/style-commands.d.ts +0 -13
  310. package/dist/core/commands/style-commands.js +0 -9
  311. package/dist/core/commands/style-commands.js.map +0 -1
  312. package/dist/core/commands/table-structure-commands.cjs +0 -1883
  313. package/dist/core/commands/table-structure-commands.cjs.map +0 -1
  314. package/dist/core/commands/table-structure-commands.d.cts +0 -59
  315. package/dist/core/commands/table-structure-commands.d.ts +0 -59
  316. package/dist/core/commands/table-structure-commands.js +0 -12
  317. package/dist/core/commands/table-structure-commands.js.map +0 -1
  318. package/dist/core/commands/text-commands.cjs +0 -2391
  319. package/dist/core/commands/text-commands.cjs.map +0 -1
  320. package/dist/core/commands/text-commands.d.cts +0 -24
  321. package/dist/core/commands/text-commands.d.ts +0 -24
  322. package/dist/core/commands/text-commands.js +0 -28
  323. package/dist/core/commands/text-commands.js.map +0 -1
  324. package/dist/core/selection/mapping.cjs +0 -200
  325. package/dist/core/selection/mapping.cjs.map +0 -1
  326. package/dist/core/selection/mapping.d.cts +0 -2
  327. package/dist/core/selection/mapping.d.ts +0 -2
  328. package/dist/core/selection/mapping.js +0 -31
  329. package/dist/core/selection/mapping.js.map +0 -1
  330. package/dist/core/state/editor-state.cjs +0 -2278
  331. package/dist/core/state/editor-state.cjs.map +0 -1
  332. package/dist/core/state/editor-state.d.cts +0 -2
  333. package/dist/core/state/editor-state.d.ts +0 -2
  334. package/dist/core/state/editor-state.js +0 -26
  335. package/dist/core/state/editor-state.js.map +0 -1
  336. package/dist/index.cjs +0 -38553
  337. package/dist/index.cjs.map +0 -1
  338. package/dist/index.d.cts +0 -15
  339. package/dist/index.d.ts +0 -15
  340. package/dist/index.js +0 -7856
  341. package/dist/index.js.map +0 -1
  342. package/dist/io/docx-session.cjs +0 -16236
  343. package/dist/io/docx-session.cjs.map +0 -1
  344. package/dist/io/docx-session.d.cts +0 -21
  345. package/dist/io/docx-session.d.ts +0 -21
  346. package/dist/io/docx-session.js +0 -18
  347. package/dist/io/docx-session.js.map +0 -1
  348. package/dist/legal/index.cjs +0 -3900
  349. package/dist/legal/index.cjs.map +0 -1
  350. package/dist/legal/index.d.cts +0 -86
  351. package/dist/legal/index.d.ts +0 -86
  352. package/dist/legal/index.js +0 -616
  353. package/dist/legal/index.js.map +0 -1
  354. package/dist/public-types-7ZL_94cz.d.ts +0 -1573
  355. package/dist/public-types-CeMaDueh.d.cts +0 -1573
  356. package/dist/public-types.cjs +0 -19
  357. package/dist/public-types.cjs.map +0 -1
  358. package/dist/public-types.d.cts +0 -2
  359. package/dist/public-types.d.ts +0 -2
  360. package/dist/public-types.js +0 -1
  361. package/dist/public-types.js.map +0 -1
  362. package/dist/runtime/document-runtime.cjs +0 -11140
  363. package/dist/runtime/document-runtime.cjs.map +0 -1
  364. package/dist/runtime/document-runtime.d.cts +0 -231
  365. package/dist/runtime/document-runtime.d.ts +0 -231
  366. package/dist/runtime/document-runtime.js +0 -21
  367. package/dist/runtime/document-runtime.js.map +0 -1
  368. package/dist/structural-helpers-CilgOVhh.d.cts +0 -10
  369. package/dist/structural-helpers-q0Gd-eBN.d.ts +0 -10
  370. package/dist/ui-tailwind/editor-surface/search-plugin.cjs +0 -313
  371. package/dist/ui-tailwind/editor-surface/search-plugin.cjs.map +0 -1
  372. package/dist/ui-tailwind/editor-surface/search-plugin.d.cts +0 -67
  373. package/dist/ui-tailwind/editor-surface/search-plugin.d.ts +0 -67
  374. package/dist/ui-tailwind/editor-surface/search-plugin.js +0 -23
  375. package/dist/ui-tailwind/editor-surface/search-plugin.js.map +0 -1
  376. package/dist/ui-tailwind/index.cjs +0 -4833
  377. package/dist/ui-tailwind/index.cjs.map +0 -1
  378. package/dist/ui-tailwind/index.d.cts +0 -617
  379. package/dist/ui-tailwind/index.d.ts +0 -617
  380. package/dist/ui-tailwind/index.js +0 -575
  381. package/dist/ui-tailwind/index.js.map +0 -1
@@ -0,0 +1,822 @@
1
+ import { parseCellKey, type CellKey, type FormulaCell } from "../model/cell.ts";
2
+ import type { CanonicalSheet, MergeRange } from "../model/sheet.ts";
3
+ import type { CanonicalWorkbook, NamedItem } from "../model/workbook.ts";
4
+ import { getSheet, listSheets, workbookFromJson, workbookToJson } from "../model/workbook.ts";
5
+
6
+ export interface WorkbookCellRef {
7
+ row: number;
8
+ col: number;
9
+ }
10
+
11
+ export interface WorkbookRange {
12
+ startRow: number;
13
+ startCol: number;
14
+ endRow: number;
15
+ endCol: number;
16
+ }
17
+
18
+ export type WorkbookSelectionMode = "cell" | "row" | "column" | "sheet";
19
+
20
+ export interface WorkbookSelection {
21
+ mode: WorkbookSelectionMode;
22
+ sheetId?: string;
23
+ activeCell?: WorkbookCellRef;
24
+ range?: WorkbookRange;
25
+ }
26
+
27
+ export type WorkbookTransactionOperation =
28
+ | { type: "cell-set"; sheetId: string; row: number; col: number }
29
+ | { type: "row-insert"; sheetId: string; index: number; count: number }
30
+ | { type: "row-delete"; sheetId: string; index: number; count: number }
31
+ | { type: "column-insert"; sheetId: string; index: number; count: number }
32
+ | { type: "column-delete"; sheetId: string; index: number; count: number }
33
+ | { type: "merge-add"; sheetId: string; range: WorkbookRange }
34
+ | { type: "merge-remove"; sheetId: string; range: WorkbookRange }
35
+ | { type: "sheet-add"; sheetId: string; index: number; name: string }
36
+ | { type: "sheet-remove"; sheetId: string; index: number; name: string; fallbackSheetId?: string }
37
+ | { type: "sheet-rename"; sheetId: string; beforeName: string; afterName: string }
38
+ | { type: "sheet-reorder"; sheetId: string; fromIndex: number; toIndex: number }
39
+ | { type: "formula-remap"; ownerSheetId: string; row: number; col: number; before: string; after: string }
40
+ | { type: "named-item-remap"; name: string; before: string; after: string };
41
+
42
+ export interface WorkbookTransactionMapping {
43
+ operations: WorkbookTransactionOperation[];
44
+ }
45
+
46
+ export interface WorkbookTransaction {
47
+ nextWorkbook: CanonicalWorkbook;
48
+ nextSelection: WorkbookSelection;
49
+ mapping: WorkbookTransactionMapping;
50
+ inverseMapping: WorkbookTransactionMapping;
51
+ historyBoundary: "push" | "skip";
52
+ label: string;
53
+ }
54
+
55
+ interface ParsedA1CellRef {
56
+ col: number;
57
+ row: number;
58
+ colAbsolute: boolean;
59
+ rowAbsolute: boolean;
60
+ }
61
+
62
+ interface ParsedFormulaToken {
63
+ sheetName?: string;
64
+ sheetQuoted: boolean;
65
+ start: ParsedA1CellRef;
66
+ end?: ParsedA1CellRef;
67
+ }
68
+
69
+ interface InsertAxisMutation {
70
+ axis: "row" | "col";
71
+ kind: "insert";
72
+ index: number;
73
+ count: number;
74
+ }
75
+
76
+ interface DeleteAxisMutation {
77
+ axis: "row" | "col";
78
+ kind: "delete";
79
+ index: number;
80
+ count: number;
81
+ }
82
+
83
+ interface RenameSheetMutation {
84
+ kind: "rename-sheet";
85
+ beforeName: string;
86
+ afterName: string;
87
+ }
88
+
89
+ interface RemoveSheetMutation {
90
+ kind: "remove-sheet";
91
+ removedName: string;
92
+ }
93
+
94
+ type FormulaMutation =
95
+ | InsertAxisMutation
96
+ | DeleteAxisMutation
97
+ | RenameSheetMutation
98
+ | RemoveSheetMutation;
99
+
100
+ const SHEET_PREFIX_PATTERN =
101
+ "(?:'(?:[^']|'')+'|[A-Za-z_][A-Za-z0-9_.]*)!";
102
+ const CELL_REFERENCE_PATTERN = "\\$?[A-Z]{1,3}\\$?[1-9][0-9]*";
103
+ const RANGE_REFERENCE_PATTERN =
104
+ `${CELL_REFERENCE_PATTERN}(?::${CELL_REFERENCE_PATTERN})?`;
105
+ const FORMULA_REFERENCE_PATTERN = new RegExp(
106
+ String.raw`(?<![A-Za-z0-9_.$])(?:${SHEET_PREFIX_PATTERN})?${RANGE_REFERENCE_PATTERN}(?![A-Za-z0-9_])`,
107
+ "g",
108
+ );
109
+ const SIMPLE_SHEET_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_.]*$/;
110
+
111
+ export function createEmptyWorkbookMapping(): WorkbookTransactionMapping {
112
+ return { operations: [] };
113
+ }
114
+
115
+ export function createWorkbookTransaction(
116
+ nextWorkbook: CanonicalWorkbook,
117
+ nextSelection: WorkbookSelection,
118
+ mapping: WorkbookTransactionMapping,
119
+ label: string,
120
+ ): WorkbookTransaction {
121
+ return {
122
+ nextWorkbook,
123
+ nextSelection,
124
+ mapping,
125
+ inverseMapping: {
126
+ operations: [...mapping.operations].reverse().map(invertOperation),
127
+ },
128
+ historyBoundary: "push",
129
+ label,
130
+ };
131
+ }
132
+
133
+ export function cloneWorkbook(workbook: CanonicalWorkbook): CanonicalWorkbook {
134
+ return workbookFromJson(workbookToJson(workbook));
135
+ }
136
+
137
+ export function createWorkbookSelection(
138
+ sheetId?: string,
139
+ row = 0,
140
+ col = 0,
141
+ mode: WorkbookSelectionMode = "cell",
142
+ ): WorkbookSelection {
143
+ if (!sheetId) {
144
+ return { mode: "sheet" };
145
+ }
146
+
147
+ const activeCell = { row: Math.max(0, row), col: Math.max(0, col) };
148
+ return {
149
+ mode,
150
+ sheetId,
151
+ activeCell,
152
+ range: {
153
+ startRow: activeCell.row,
154
+ startCol: activeCell.col,
155
+ endRow: activeCell.row,
156
+ endCol: activeCell.col,
157
+ },
158
+ };
159
+ }
160
+
161
+ export function getDefaultSelection(workbook: CanonicalWorkbook): WorkbookSelection {
162
+ const firstSheetId = workbook.sheetOrder[0];
163
+ return createWorkbookSelection(firstSheetId);
164
+ }
165
+
166
+ export function normalizeWorkbookSelection(
167
+ workbook: CanonicalWorkbook,
168
+ selection?: WorkbookSelection,
169
+ ): WorkbookSelection {
170
+ if (workbook.sheetOrder.length === 0) {
171
+ return { mode: "sheet" };
172
+ }
173
+
174
+ const sheetId = selection?.sheetId && workbook.sheets.has(selection.sheetId)
175
+ ? selection.sheetId
176
+ : workbook.sheetOrder[0];
177
+ const activeCell = selection?.activeCell ?? { row: 0, col: 0 };
178
+ const range = selection?.range
179
+ ? normalizeRange(selection.range)
180
+ : {
181
+ startRow: activeCell.row,
182
+ startCol: activeCell.col,
183
+ endRow: activeCell.row,
184
+ endCol: activeCell.col,
185
+ };
186
+
187
+ return {
188
+ mode: selection?.mode ?? "cell",
189
+ sheetId,
190
+ activeCell: {
191
+ row: Math.max(0, activeCell.row),
192
+ col: Math.max(0, activeCell.col),
193
+ },
194
+ range,
195
+ };
196
+ }
197
+
198
+ export function mapSelectionThroughMapping(
199
+ selection: WorkbookSelection,
200
+ mapping: WorkbookTransactionMapping,
201
+ ): WorkbookSelection {
202
+ let nextSelection: WorkbookSelection = cloneSelection(selection);
203
+
204
+ for (const operation of mapping.operations) {
205
+ nextSelection = mapSelectionThroughOperation(nextSelection, operation);
206
+ }
207
+
208
+ return nextSelection;
209
+ }
210
+
211
+ export function normalizeRange(range: WorkbookRange): WorkbookRange {
212
+ return {
213
+ startRow: Math.min(range.startRow, range.endRow),
214
+ startCol: Math.min(range.startCol, range.endCol),
215
+ endRow: Math.max(range.startRow, range.endRow),
216
+ endCol: Math.max(range.startCol, range.endCol),
217
+ };
218
+ }
219
+
220
+ export function rangesIntersect(left: WorkbookRange, right: WorkbookRange): boolean {
221
+ const a = normalizeRange(left);
222
+ const b = normalizeRange(right);
223
+ return !(
224
+ a.endRow < b.startRow ||
225
+ b.endRow < a.startRow ||
226
+ a.endCol < b.startCol ||
227
+ b.endCol < a.startCol
228
+ );
229
+ }
230
+
231
+ export function rangeContainsCell(range: WorkbookRange, cell: WorkbookCellRef): boolean {
232
+ const normalized = normalizeRange(range);
233
+ return (
234
+ cell.row >= normalized.startRow &&
235
+ cell.row <= normalized.endRow &&
236
+ cell.col >= normalized.startCol &&
237
+ cell.col <= normalized.endCol
238
+ );
239
+ }
240
+
241
+ export function remapFormulasForMutation(
242
+ workbook: CanonicalWorkbook,
243
+ targetSheetId: string,
244
+ mutation: FormulaMutation,
245
+ mapping: WorkbookTransactionMapping,
246
+ ): void {
247
+ const targetSheetName = getSheet(workbook, targetSheetId)?.name;
248
+ if (!targetSheetName) {
249
+ return;
250
+ }
251
+
252
+ for (const sheet of listSheets(workbook)) {
253
+ for (const [key, value] of sheet.cells) {
254
+ if (value.kind !== "formula") {
255
+ continue;
256
+ }
257
+
258
+ const rewritten = rewriteFormulaReferences(
259
+ value.formula,
260
+ sheet.name,
261
+ targetSheetName,
262
+ mutation,
263
+ );
264
+ if (!rewritten.changed) {
265
+ continue;
266
+ }
267
+
268
+ sheet.cells.set(key, {
269
+ ...value,
270
+ formula: rewritten.formula,
271
+ referenceTokens: extractFormulaReferenceTokens(rewritten.formula),
272
+ } satisfies FormulaCell);
273
+
274
+ const address = parseCellKey(key);
275
+ mapping.operations.push({
276
+ type: "formula-remap",
277
+ ownerSheetId: sheet.sheetId,
278
+ row: address.row,
279
+ col: address.col,
280
+ before: value.formula,
281
+ after: rewritten.formula,
282
+ });
283
+ }
284
+ }
285
+
286
+ workbook.namedItems = workbook.namedItems
287
+ .map((item) => remapNamedItemForMutation(item, workbook, targetSheetName, mutation, mapping))
288
+ .filter((item): item is NamedItem => item !== null);
289
+ }
290
+
291
+ export function getRequiredSheet(workbook: CanonicalWorkbook, sheetId: string): CanonicalSheet {
292
+ const sheet = workbook.sheets.get(sheetId);
293
+ if (!sheet) {
294
+ throw new Error(`Sheet not found: ${sheetId}`);
295
+ }
296
+ return sheet;
297
+ }
298
+
299
+ export function cloneSelection(selection: WorkbookSelection): WorkbookSelection {
300
+ return {
301
+ mode: selection.mode,
302
+ sheetId: selection.sheetId,
303
+ activeCell: selection.activeCell ? { ...selection.activeCell } : undefined,
304
+ range: selection.range ? { ...selection.range } : undefined,
305
+ };
306
+ }
307
+
308
+ export function mergeRangeToWorkbookRange(range: MergeRange): WorkbookRange {
309
+ return {
310
+ startRow: range.startRow,
311
+ startCol: range.startCol,
312
+ endRow: range.endRow,
313
+ endCol: range.endCol,
314
+ };
315
+ }
316
+
317
+ export function workbookRangeToMergeRange(range: WorkbookRange): MergeRange {
318
+ const normalized = normalizeRange(range);
319
+ return {
320
+ startRow: normalized.startRow,
321
+ startCol: normalized.startCol,
322
+ endRow: normalized.endRow,
323
+ endCol: normalized.endCol,
324
+ };
325
+ }
326
+
327
+ export function replaceSheetCells(
328
+ sheet: CanonicalSheet,
329
+ cells: Map<CellKey, CanonicalSheet["cells"] extends Map<CellKey, infer TValue> ? TValue : never>,
330
+ ): void {
331
+ sheet.cells = cells as CanonicalSheet["cells"];
332
+ }
333
+
334
+ export function replaceSheetRowProps(
335
+ sheet: CanonicalSheet,
336
+ rowProps: CanonicalSheet["rowProps"],
337
+ ): void {
338
+ sheet.rowProps = rowProps;
339
+ }
340
+
341
+ export function replaceSheetColProps(
342
+ sheet: CanonicalSheet,
343
+ colProps: CanonicalSheet["colProps"],
344
+ ): void {
345
+ sheet.colProps = colProps;
346
+ }
347
+
348
+ export function replaceSheetMerges(
349
+ sheet: CanonicalSheet,
350
+ merges: MergeRange[],
351
+ ): void {
352
+ sheet.merges = merges;
353
+ }
354
+
355
+ export function extractFormulaReferenceTokens(formula: string): string[] {
356
+ const maskedFormula = maskQuotedFormulaStrings(formula);
357
+ const tokens: string[] = [];
358
+ const seen = new Set<string>();
359
+
360
+ for (const match of maskedFormula.matchAll(FORMULA_REFERENCE_PATTERN)) {
361
+ const index = match.index ?? -1;
362
+ if (index < 0) {
363
+ continue;
364
+ }
365
+ const token = formula.slice(index, index + match[0].length);
366
+ if (seen.has(token)) {
367
+ continue;
368
+ }
369
+ seen.add(token);
370
+ tokens.push(token);
371
+ }
372
+
373
+ return tokens;
374
+ }
375
+
376
+ function invertOperation(operation: WorkbookTransactionOperation): WorkbookTransactionOperation {
377
+ switch (operation.type) {
378
+ case "cell-set":
379
+ return operation;
380
+ case "row-insert":
381
+ return { type: "row-delete", sheetId: operation.sheetId, index: operation.index, count: operation.count };
382
+ case "row-delete":
383
+ return { type: "row-insert", sheetId: operation.sheetId, index: operation.index, count: operation.count };
384
+ case "column-insert":
385
+ return { type: "column-delete", sheetId: operation.sheetId, index: operation.index, count: operation.count };
386
+ case "column-delete":
387
+ return { type: "column-insert", sheetId: operation.sheetId, index: operation.index, count: operation.count };
388
+ case "merge-add":
389
+ return { type: "merge-remove", sheetId: operation.sheetId, range: operation.range };
390
+ case "merge-remove":
391
+ return { type: "merge-add", sheetId: operation.sheetId, range: operation.range };
392
+ case "sheet-add":
393
+ return {
394
+ type: "sheet-remove",
395
+ sheetId: operation.sheetId,
396
+ index: operation.index,
397
+ name: operation.name,
398
+ };
399
+ case "sheet-remove":
400
+ return {
401
+ type: "sheet-add",
402
+ sheetId: operation.sheetId,
403
+ index: operation.index,
404
+ name: operation.name,
405
+ };
406
+ case "sheet-rename":
407
+ return {
408
+ type: "sheet-rename",
409
+ sheetId: operation.sheetId,
410
+ beforeName: operation.afterName,
411
+ afterName: operation.beforeName,
412
+ };
413
+ case "sheet-reorder":
414
+ return {
415
+ type: "sheet-reorder",
416
+ sheetId: operation.sheetId,
417
+ fromIndex: operation.toIndex,
418
+ toIndex: operation.fromIndex,
419
+ };
420
+ case "formula-remap":
421
+ return {
422
+ type: "formula-remap",
423
+ ownerSheetId: operation.ownerSheetId,
424
+ row: operation.row,
425
+ col: operation.col,
426
+ before: operation.after,
427
+ after: operation.before,
428
+ };
429
+ case "named-item-remap":
430
+ return {
431
+ type: "named-item-remap",
432
+ name: operation.name,
433
+ before: operation.after,
434
+ after: operation.before,
435
+ };
436
+ }
437
+ }
438
+
439
+ function mapSelectionThroughOperation(
440
+ selection: WorkbookSelection,
441
+ operation: WorkbookTransactionOperation,
442
+ ): WorkbookSelection {
443
+ const nextSelection = cloneSelection(selection);
444
+
445
+ switch (operation.type) {
446
+ case "sheet-remove":
447
+ if (nextSelection.sheetId === operation.sheetId) {
448
+ if (!operation.fallbackSheetId) {
449
+ return { mode: "sheet" };
450
+ }
451
+ nextSelection.sheetId = operation.fallbackSheetId;
452
+ }
453
+ return nextSelection;
454
+ case "row-insert":
455
+ case "row-delete":
456
+ if (nextSelection.sheetId !== operation.sheetId) {
457
+ return nextSelection;
458
+ }
459
+ if (nextSelection.activeCell) {
460
+ nextSelection.activeCell.row = mapIndexThroughOperation(nextSelection.activeCell.row, operation);
461
+ }
462
+ if (nextSelection.range) {
463
+ nextSelection.range.startRow = mapIndexThroughOperation(nextSelection.range.startRow, operation);
464
+ nextSelection.range.endRow = mapIndexThroughOperation(nextSelection.range.endRow, operation);
465
+ nextSelection.range = normalizeRange(nextSelection.range);
466
+ }
467
+ return nextSelection;
468
+ case "column-insert":
469
+ case "column-delete":
470
+ if (nextSelection.sheetId !== operation.sheetId) {
471
+ return nextSelection;
472
+ }
473
+ if (nextSelection.activeCell) {
474
+ nextSelection.activeCell.col = mapIndexThroughOperation(nextSelection.activeCell.col, operation);
475
+ }
476
+ if (nextSelection.range) {
477
+ nextSelection.range.startCol = mapIndexThroughOperation(nextSelection.range.startCol, operation);
478
+ nextSelection.range.endCol = mapIndexThroughOperation(nextSelection.range.endCol, operation);
479
+ nextSelection.range = normalizeRange(nextSelection.range);
480
+ }
481
+ return nextSelection;
482
+ default:
483
+ return nextSelection;
484
+ }
485
+ }
486
+
487
+ function mapIndexThroughOperation(
488
+ value: number,
489
+ operation:
490
+ | Extract<WorkbookTransactionOperation, { type: "row-insert" | "row-delete" }>
491
+ | Extract<WorkbookTransactionOperation, { type: "column-insert" | "column-delete" }>,
492
+ ): number {
493
+ if (operation.type === "row-insert" || operation.type === "column-insert") {
494
+ return value >= operation.index ? value + operation.count : value;
495
+ }
496
+
497
+ const deleteEnd = operation.index + operation.count - 1;
498
+ if (value < operation.index) {
499
+ return value;
500
+ }
501
+ if (value <= deleteEnd) {
502
+ return operation.index;
503
+ }
504
+ return value - operation.count;
505
+ }
506
+
507
+ function remapNamedItemForMutation(
508
+ item: NamedItem,
509
+ workbook: CanonicalWorkbook,
510
+ targetSheetName: string,
511
+ mutation: FormulaMutation,
512
+ mapping: WorkbookTransactionMapping,
513
+ ): NamedItem | null {
514
+ if (mutation.kind === "remove-sheet" && item.localSheetId === findSheetIdByName(workbook, mutation.removedName)) {
515
+ return null;
516
+ }
517
+
518
+ const ownerSheetName = item.localSheetId ? workbook.sheets.get(item.localSheetId)?.name : undefined;
519
+ const rewritten = rewriteFormulaReferences(
520
+ item.refersTo,
521
+ ownerSheetName,
522
+ targetSheetName,
523
+ mutation,
524
+ );
525
+ if (!rewritten.changed) {
526
+ return item;
527
+ }
528
+
529
+ mapping.operations.push({
530
+ type: "named-item-remap",
531
+ name: item.name,
532
+ before: item.refersTo,
533
+ after: rewritten.formula,
534
+ });
535
+
536
+ return {
537
+ ...item,
538
+ refersTo: rewritten.formula,
539
+ };
540
+ }
541
+
542
+ function findSheetIdByName(workbook: CanonicalWorkbook, name: string): string | undefined {
543
+ for (const sheet of workbook.sheets.values()) {
544
+ if (sheet.name === name) {
545
+ return sheet.sheetId;
546
+ }
547
+ }
548
+ return undefined;
549
+ }
550
+
551
+ function rewriteFormulaReferences(
552
+ formula: string,
553
+ ownerSheetName: string | undefined,
554
+ targetSheetName: string,
555
+ mutation: FormulaMutation,
556
+ ): { formula: string; changed: boolean } {
557
+ const maskedFormula = maskQuotedFormulaStrings(formula);
558
+ const matches = [...maskedFormula.matchAll(FORMULA_REFERENCE_PATTERN)];
559
+ if (matches.length === 0) {
560
+ return { formula, changed: false };
561
+ }
562
+
563
+ let changed = false;
564
+ let lastIndex = 0;
565
+ let output = "";
566
+
567
+ for (const match of matches) {
568
+ const index = match.index ?? -1;
569
+ if (index < 0) {
570
+ continue;
571
+ }
572
+
573
+ const originalToken = formula.slice(index, index + match[0].length);
574
+ const nextToken = rewriteFormulaToken(
575
+ originalToken,
576
+ ownerSheetName,
577
+ targetSheetName,
578
+ mutation,
579
+ );
580
+
581
+ output += formula.slice(lastIndex, index);
582
+ output += nextToken;
583
+ lastIndex = index + originalToken.length;
584
+ changed = changed || nextToken !== originalToken;
585
+ }
586
+
587
+ if (!changed) {
588
+ return { formula, changed: false };
589
+ }
590
+
591
+ output += formula.slice(lastIndex);
592
+ return { formula: output, changed: true };
593
+ }
594
+
595
+ function rewriteFormulaToken(
596
+ token: string,
597
+ ownerSheetName: string | undefined,
598
+ targetSheetName: string,
599
+ mutation: FormulaMutation,
600
+ ): string {
601
+ const parsed = parseFormulaToken(token);
602
+ if (!parsed) {
603
+ return token;
604
+ }
605
+
606
+ if (mutation.kind === "rename-sheet") {
607
+ if (parsed.sheetName !== mutation.beforeName) {
608
+ return token;
609
+ }
610
+
611
+ return formatFormulaToken({
612
+ ...parsed,
613
+ sheetName: mutation.afterName,
614
+ sheetQuoted: parsed.sheetQuoted || !SIMPLE_SHEET_NAME_PATTERN.test(mutation.afterName),
615
+ });
616
+ }
617
+
618
+ if (mutation.kind === "remove-sheet") {
619
+ return parsed.sheetName === mutation.removedName ? "#REF!" : token;
620
+ }
621
+
622
+ const tokenSheetName = parsed.sheetName ?? ownerSheetName;
623
+ if (tokenSheetName !== targetSheetName) {
624
+ return token;
625
+ }
626
+
627
+ const rowRange = mutation.axis === "row"
628
+ ? remapInterval(parsed.start.row, parsed.end?.row ?? parsed.start.row, mutation)
629
+ : { valid: true, start: parsed.start.row, end: parsed.end?.row ?? parsed.start.row };
630
+ const colRange = mutation.axis === "col"
631
+ ? remapInterval(parsed.start.col, parsed.end?.col ?? parsed.start.col, mutation)
632
+ : { valid: true, start: parsed.start.col, end: parsed.end?.col ?? parsed.start.col };
633
+
634
+ if (!rowRange.valid || !colRange.valid) {
635
+ return "#REF!";
636
+ }
637
+
638
+ const nextToken: ParsedFormulaToken = {
639
+ sheetName: parsed.sheetName,
640
+ sheetQuoted: parsed.sheetQuoted,
641
+ start: {
642
+ ...parsed.start,
643
+ row: rowRange.start,
644
+ col: colRange.start,
645
+ },
646
+ ...(parsed.end
647
+ ? {
648
+ end: {
649
+ ...parsed.end,
650
+ row: rowRange.end,
651
+ col: colRange.end,
652
+ },
653
+ }
654
+ : {}),
655
+ };
656
+
657
+ return formatFormulaToken(nextToken);
658
+ }
659
+
660
+ function remapInterval(
661
+ start: number,
662
+ end: number,
663
+ mutation: InsertAxisMutation | DeleteAxisMutation,
664
+ ): { valid: boolean; start: number; end: number } {
665
+ if (mutation.kind === "insert") {
666
+ if (mutation.index <= start) {
667
+ return {
668
+ valid: true,
669
+ start: start + mutation.count,
670
+ end: end + mutation.count,
671
+ };
672
+ }
673
+ if (mutation.index <= end) {
674
+ return {
675
+ valid: true,
676
+ start,
677
+ end: end + mutation.count,
678
+ };
679
+ }
680
+ return { valid: true, start, end };
681
+ }
682
+
683
+ const deleteStart = mutation.index;
684
+ const deleteEnd = mutation.index + mutation.count - 1;
685
+ const overlapStart = Math.max(start, deleteStart);
686
+ const overlapEnd = Math.min(end, deleteEnd);
687
+ if (overlapStart <= overlapEnd && overlapEnd - overlapStart + 1 >= end - start + 1) {
688
+ return { valid: false, start, end };
689
+ }
690
+
691
+ let nextStart = start;
692
+ let nextEnd = end;
693
+ if (start >= deleteStart && start <= deleteEnd) {
694
+ nextStart = deleteStart;
695
+ } else if (start > deleteEnd) {
696
+ nextStart = start - mutation.count;
697
+ }
698
+
699
+ if (end >= deleteStart && end <= deleteEnd) {
700
+ nextEnd = deleteStart - 1;
701
+ } else if (end > deleteEnd) {
702
+ nextEnd = end - mutation.count;
703
+ }
704
+
705
+ if (nextEnd < nextStart) {
706
+ nextEnd = nextStart;
707
+ }
708
+
709
+ return {
710
+ valid: true,
711
+ start: nextStart,
712
+ end: nextEnd,
713
+ };
714
+ }
715
+
716
+ function parseFormulaToken(token: string): ParsedFormulaToken | null {
717
+ const match = /^(?:(('(?:[^']|'')+'|[A-Za-z_][A-Za-z0-9_.]*)!)?(\$?[A-Z]{1,3}\$?[1-9][0-9]*)(?::(\$?[A-Z]{1,3}\$?[1-9][0-9]*))?)$/.exec(token);
718
+ if (!match) {
719
+ return null;
720
+ }
721
+
722
+ const sheetRaw = match[2];
723
+ const sheetName = sheetRaw
724
+ ? sheetRaw.startsWith("'")
725
+ ? sheetRaw.slice(1, -1).replace(/''/g, "'")
726
+ : sheetRaw
727
+ : undefined;
728
+ const start = parseA1CellRef(match[3] ?? "");
729
+ const end = match[4] ? parseA1CellRef(match[4]) : undefined;
730
+ if (!start || (match[4] && !end)) {
731
+ return null;
732
+ }
733
+
734
+ return {
735
+ sheetName,
736
+ sheetQuoted: sheetRaw ? sheetRaw.startsWith("'") : false,
737
+ start,
738
+ ...(end ? { end } : {}),
739
+ };
740
+ }
741
+
742
+ function parseA1CellRef(ref: string): ParsedA1CellRef | null {
743
+ const match = /^(\$?)([A-Z]{1,3})(\$?)([1-9][0-9]*)$/.exec(ref);
744
+ if (!match) {
745
+ return null;
746
+ }
747
+
748
+ return {
749
+ colAbsolute: match[1] === "$",
750
+ col: parseColumnLetters(match[2]),
751
+ rowAbsolute: match[3] === "$",
752
+ row: Number.parseInt(match[4] ?? "1", 10) - 1,
753
+ };
754
+ }
755
+
756
+ function formatFormulaToken(token: ParsedFormulaToken): string {
757
+ const sheetPrefix = token.sheetName
758
+ ? `${formatSheetName(token.sheetName, token.sheetQuoted)}!`
759
+ : "";
760
+ const start = formatA1CellRef(token.start);
761
+ if (!token.end || (token.start.row === token.end.row && token.start.col === token.end.col)) {
762
+ return `${sheetPrefix}${start}`;
763
+ }
764
+ return `${sheetPrefix}${start}:${formatA1CellRef(token.end)}`;
765
+ }
766
+
767
+ function formatA1CellRef(ref: ParsedA1CellRef): string {
768
+ return `${ref.colAbsolute ? "$" : ""}${formatColumnLetters(ref.col)}${ref.rowAbsolute ? "$" : ""}${ref.row + 1}`;
769
+ }
770
+
771
+ function formatSheetName(name: string, forceQuote: boolean): string {
772
+ if (!forceQuote && SIMPLE_SHEET_NAME_PATTERN.test(name)) {
773
+ return name;
774
+ }
775
+ return `'${name.replace(/'/g, "''")}'`;
776
+ }
777
+
778
+ function parseColumnLetters(letters: string): number {
779
+ let value = 0;
780
+ for (const char of letters) {
781
+ value = value * 26 + (char.charCodeAt(0) - 64);
782
+ }
783
+ return value - 1;
784
+ }
785
+
786
+ function formatColumnLetters(value: number): string {
787
+ let next = value + 1;
788
+ let output = "";
789
+
790
+ while (next > 0) {
791
+ const remainder = (next - 1) % 26;
792
+ output = String.fromCharCode(65 + remainder) + output;
793
+ next = Math.floor((next - 1) / 26);
794
+ }
795
+
796
+ return output;
797
+ }
798
+
799
+ function maskQuotedFormulaStrings(formula: string): string {
800
+ let output = "";
801
+ let inString = false;
802
+
803
+ for (let index = 0; index < formula.length; index += 1) {
804
+ const char = formula[index];
805
+ const next = formula[index + 1];
806
+
807
+ if (char === "\"") {
808
+ output += char;
809
+ if (inString && next === "\"") {
810
+ output += " ";
811
+ index += 1;
812
+ continue;
813
+ }
814
+ inString = !inString;
815
+ continue;
816
+ }
817
+
818
+ output += inString ? " " : char;
819
+ }
820
+
821
+ return output;
822
+ }