ooxml-core 0.8.0 → 0.10.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.
Files changed (316) hide show
  1. package/README.md +21 -13
  2. package/dist/chart/blank-display.d.ts +37 -0
  3. package/dist/chart/blank-display.d.ts.map +1 -0
  4. package/dist/chart/box-stats.d.ts +28 -0
  5. package/dist/chart/box-stats.d.ts.map +1 -0
  6. package/dist/chart/index.cjs +229 -0
  7. package/dist/chart/index.d.ts +6 -0
  8. package/dist/chart/index.d.ts.map +1 -0
  9. package/dist/chart/index.mjs +220 -0
  10. package/dist/chart/regression.d.ts +40 -0
  11. package/dist/chart/regression.d.ts.map +1 -0
  12. package/dist/chart/stacked-series.d.ts +39 -0
  13. package/dist/chart/stacked-series.d.ts.map +1 -0
  14. package/dist/crypto/aes-ecb.d.ts +13 -0
  15. package/dist/crypto/aes-ecb.d.ts.map +1 -0
  16. package/dist/crypto/decrypt.d.ts +63 -0
  17. package/dist/crypto/decrypt.d.ts.map +1 -0
  18. package/dist/crypto/detect.d.ts +56 -0
  19. package/dist/crypto/detect.d.ts.map +1 -0
  20. package/dist/crypto/encrypt.d.ts +27 -0
  21. package/dist/crypto/encrypt.d.ts.map +1 -0
  22. package/dist/crypto/encryption-info-write.d.ts +46 -0
  23. package/dist/crypto/encryption-info-write.d.ts.map +1 -0
  24. package/dist/crypto/encryption-info.d.ts +22 -0
  25. package/dist/crypto/encryption-info.d.ts.map +1 -0
  26. package/dist/crypto/errors.d.ts +39 -0
  27. package/dist/crypto/errors.d.ts.map +1 -0
  28. package/dist/crypto/index.cjs +1805 -0
  29. package/dist/crypto/index.d.ts +26 -0
  30. package/dist/crypto/index.d.ts.map +1 -0
  31. package/dist/crypto/index.mjs +1774 -0
  32. package/dist/crypto/key-derivation.d.ts +73 -0
  33. package/dist/crypto/key-derivation.d.ts.map +1 -0
  34. package/dist/crypto/types.d.ts +104 -0
  35. package/dist/crypto/types.d.ts.map +1 -0
  36. package/dist/docx/embedded.cjs +2 -0
  37. package/dist/docx/embedded.mjs +2 -0
  38. package/dist/docx/index.cjs +2 -0
  39. package/dist/docx/index.mjs +2 -0
  40. package/dist/docx/load/detect.d.ts +14 -2
  41. package/dist/docx/load/detect.d.ts.map +1 -1
  42. package/dist/docx/load/index.cjs +8995 -7728
  43. package/dist/docx/load/index.d.ts +3 -1
  44. package/dist/docx/load/index.d.ts.map +1 -1
  45. package/dist/docx/load/index.mjs +8990 -7729
  46. package/dist/docx/load/legacy-doc.d.ts.map +1 -1
  47. package/dist/geometry/index.cjs +192 -0
  48. package/dist/geometry/index.d.ts +1 -0
  49. package/dist/geometry/index.d.ts.map +1 -1
  50. package/dist/geometry/index.mjs +192 -1
  51. package/dist/geometry/svg-path-curves.d.ts +11 -0
  52. package/dist/geometry/svg-path-curves.d.ts.map +1 -0
  53. package/dist/geometry/svg-path-flatten.d.ts +26 -0
  54. package/dist/geometry/svg-path-flatten.d.ts.map +1 -0
  55. package/dist/geometry/svg-path-types.d.ts +6 -0
  56. package/dist/geometry/svg-path-types.d.ts.map +1 -0
  57. package/dist/index.cjs +1303 -22
  58. package/dist/index.d.ts +2 -0
  59. package/dist/index.d.ts.map +1 -1
  60. package/dist/index.mjs +1302 -23
  61. package/dist/opc/index.cjs +797 -1
  62. package/dist/opc/index.d.ts +2 -0
  63. package/dist/opc/index.d.ts.map +1 -1
  64. package/dist/opc/index.mjs +784 -3
  65. package/dist/opc/properties/app.d.ts +10 -0
  66. package/dist/opc/properties/app.d.ts.map +1 -0
  67. package/dist/opc/properties/core.d.ts +13 -0
  68. package/dist/opc/properties/core.d.ts.map +1 -0
  69. package/dist/opc/properties/custom.d.ts +15 -0
  70. package/dist/opc/properties/custom.d.ts.map +1 -0
  71. package/dist/opc/properties/index.d.ts +5 -0
  72. package/dist/opc/properties/index.d.ts.map +1 -0
  73. package/dist/opc/properties/types.d.ts +114 -0
  74. package/dist/opc/properties/types.d.ts.map +1 -0
  75. package/dist/opc/relationship-types.d.ts +1 -0
  76. package/dist/opc/relationship-types.d.ts.map +1 -1
  77. package/dist/opc/safe-href.d.ts +34 -0
  78. package/dist/opc/safe-href.d.ts.map +1 -1
  79. package/dist/opc/signature/constants.d.ts +42 -0
  80. package/dist/opc/signature/constants.d.ts.map +1 -0
  81. package/dist/opc/signature/detection.d.ts +97 -0
  82. package/dist/opc/signature/detection.d.ts.map +1 -0
  83. package/dist/opc/signature/digest.d.ts +16 -0
  84. package/dist/opc/signature/digest.d.ts.map +1 -0
  85. package/dist/opc/signature/index.d.ts +8 -0
  86. package/dist/opc/signature/index.d.ts.map +1 -0
  87. package/dist/opc/signature/inspection-status.d.ts +24 -0
  88. package/dist/opc/signature/inspection-status.d.ts.map +1 -0
  89. package/dist/opc/signature/reference-utils.d.ts +12 -0
  90. package/dist/opc/signature/reference-utils.d.ts.map +1 -0
  91. package/dist/opc/signature/types.d.ts +90 -0
  92. package/dist/opc/signature/types.d.ts.map +1 -0
  93. package/dist/opc/signature/xml-utils.d.ts +35 -0
  94. package/dist/opc/signature/xml-utils.d.ts.map +1 -0
  95. package/dist/pptx/chunks/{index-CojJtI77.d.ts → index-BWUBPGgv.d.ts} +9 -11
  96. package/dist/pptx/chunks/index-BWUBPGgv.d.ts.map +1 -0
  97. package/dist/pptx/chunks/{signature-inspection-status-Bh2oap7B.d.ts → inspection-status-B2E-jSpG.d.ts} +8 -8
  98. package/dist/pptx/chunks/inspection-status-B2E-jSpG.d.ts.map +1 -0
  99. package/dist/pptx/cli/index.cjs +1409 -895
  100. package/dist/pptx/cli/index.mjs +1409 -895
  101. package/dist/pptx/converter/index.d.ts +1 -1
  102. package/dist/pptx/index.cjs +1933 -1391
  103. package/dist/pptx/index.d.ts +20 -67
  104. package/dist/pptx/index.d.ts.map +1 -1
  105. package/dist/pptx/index.mjs +1933 -1391
  106. package/dist/pptx/signature-node/index.cjs +5 -5
  107. package/dist/pptx/signature-node/index.d.ts +1 -1
  108. package/dist/pptx/signature-node/index.mjs +5 -5
  109. package/dist/text/index.cjs +122 -0
  110. package/dist/text/index.d.ts +3 -0
  111. package/dist/text/index.d.ts.map +1 -0
  112. package/dist/text/index.mjs +117 -0
  113. package/dist/text/unicode-script-detection.d.ts +54 -0
  114. package/dist/text/unicode-script-detection.d.ts.map +1 -0
  115. package/dist/visio/edit-master-index.d.ts +10 -0
  116. package/dist/visio/edit-master-index.d.ts.map +1 -0
  117. package/dist/visio/edit-master-scope.d.ts +7 -0
  118. package/dist/visio/edit-master-scope.d.ts.map +1 -0
  119. package/dist/visio/edit-scope.d.ts.map +1 -1
  120. package/dist/visio/formula-arithmetic.d.ts +8 -0
  121. package/dist/visio/formula-arithmetic.d.ts.map +1 -0
  122. package/dist/visio/formula-evaluate.d.ts.map +1 -1
  123. package/dist/visio/formula-master.d.ts +13 -0
  124. package/dist/visio/formula-master.d.ts.map +1 -0
  125. package/dist/visio/formula-numeric-functions.d.ts +8 -0
  126. package/dist/visio/formula-numeric-functions.d.ts.map +1 -0
  127. package/dist/visio/formula.d.ts +1 -1
  128. package/dist/visio/formula.d.ts.map +1 -1
  129. package/dist/visio/index.cjs +540 -61
  130. package/dist/visio/index.mjs +540 -61
  131. package/dist/xlsx/edit/annotations.d.ts +5 -1
  132. package/dist/xlsx/edit/annotations.d.ts.map +1 -1
  133. package/dist/xlsx/edit/cell-values.d.ts +7 -2
  134. package/dist/xlsx/edit/cell-values.d.ts.map +1 -1
  135. package/dist/xlsx/edit/clipboard.d.ts.map +1 -1
  136. package/dist/xlsx/edit/doc-properties.d.ts +14 -0
  137. package/dist/xlsx/edit/doc-properties.d.ts.map +1 -0
  138. package/dist/xlsx/edit/fill-series.d.ts.map +1 -1
  139. package/dist/xlsx/edit/find.d.ts +2 -1
  140. package/dist/xlsx/edit/find.d.ts.map +1 -1
  141. package/dist/xlsx/edit/format-lines.d.ts +22 -0
  142. package/dist/xlsx/edit/format-lines.d.ts.map +1 -0
  143. package/dist/xlsx/edit/format.d.ts +2 -1
  144. package/dist/xlsx/edit/format.d.ts.map +1 -1
  145. package/dist/xlsx/edit/history-refs.d.ts +51 -0
  146. package/dist/xlsx/edit/history-refs.d.ts.map +1 -0
  147. package/dist/xlsx/edit/history.d.ts +40 -5
  148. package/dist/xlsx/edit/history.d.ts.map +1 -1
  149. package/dist/xlsx/edit/index.d.ts +3 -0
  150. package/dist/xlsx/edit/index.d.ts.map +1 -1
  151. package/dist/xlsx/edit/input-text.d.ts +13 -0
  152. package/dist/xlsx/edit/input-text.d.ts.map +1 -0
  153. package/dist/xlsx/edit/merge.d.ts +10 -2
  154. package/dist/xlsx/edit/merge.d.ts.map +1 -1
  155. package/dist/xlsx/edit/session.d.ts.map +1 -1
  156. package/dist/xlsx/edit/sheets.d.ts.map +1 -1
  157. package/dist/xlsx/edit/shift-formulas.d.ts +2 -1
  158. package/dist/xlsx/edit/shift-formulas.d.ts.map +1 -1
  159. package/dist/xlsx/edit/shift-preserved.d.ts +17 -0
  160. package/dist/xlsx/edit/shift-preserved.d.ts.map +1 -0
  161. package/dist/xlsx/edit/shift-sheet.d.ts +2 -2
  162. package/dist/xlsx/edit/shift-sheet.d.ts.map +1 -1
  163. package/dist/xlsx/edit/structure.d.ts.map +1 -1
  164. package/dist/xlsx/edit/types.d.ts +7 -0
  165. package/dist/xlsx/edit/types.d.ts.map +1 -1
  166. package/dist/xlsx/edit/validation-list.d.ts +24 -0
  167. package/dist/xlsx/edit/validation-list.d.ts.map +1 -0
  168. package/dist/xlsx/edit/validation.d.ts +2 -1
  169. package/dist/xlsx/edit/validation.d.ts.map +1 -1
  170. package/dist/xlsx/formula/area-index.d.ts +18 -0
  171. package/dist/xlsx/formula/area-index.d.ts.map +1 -0
  172. package/dist/xlsx/formula/array-context.d.ts.map +1 -1
  173. package/dist/xlsx/formula/ast.d.ts +5 -1
  174. package/dist/xlsx/formula/ast.d.ts.map +1 -1
  175. package/dist/xlsx/formula/call.d.ts.map +1 -1
  176. package/dist/xlsx/formula/coerce.d.ts.map +1 -1
  177. package/dist/xlsx/formula/context.d.ts +5 -0
  178. package/dist/xlsx/formula/context.d.ts.map +1 -1
  179. package/dist/xlsx/formula/date-serial.d.ts +11 -4
  180. package/dist/xlsx/formula/date-serial.d.ts.map +1 -1
  181. package/dist/xlsx/formula/engine-core.d.ts +6 -0
  182. package/dist/xlsx/formula/engine-core.d.ts.map +1 -1
  183. package/dist/xlsx/formula/engine-host.d.ts +35 -3
  184. package/dist/xlsx/formula/engine-host.d.ts.map +1 -1
  185. package/dist/xlsx/formula/engine-util.d.ts.map +1 -1
  186. package/dist/xlsx/formula/engine.d.ts.map +1 -1
  187. package/dist/xlsx/formula/evaluator.d.ts.map +1 -1
  188. package/dist/xlsx/formula/functions/array-shape.d.ts.map +1 -1
  189. package/dist/xlsx/formula/functions/array.d.ts.map +1 -1
  190. package/dist/xlsx/formula/functions/criteria-index.d.ts +12 -0
  191. package/dist/xlsx/formula/functions/criteria-index.d.ts.map +1 -0
  192. package/dist/xlsx/formula/functions/criteria.d.ts +24 -16
  193. package/dist/xlsx/formula/functions/criteria.d.ts.map +1 -1
  194. package/dist/xlsx/formula/functions/date-calc.d.ts +4 -0
  195. package/dist/xlsx/formula/functions/date-calc.d.ts.map +1 -1
  196. package/dist/xlsx/formula/functions/depreciation.d.ts.map +1 -1
  197. package/dist/xlsx/formula/functions/financial.d.ts.map +1 -1
  198. package/dist/xlsx/formula/functions/helpers.d.ts.map +1 -1
  199. package/dist/xlsx/formula/functions/logical.d.ts.map +1 -1
  200. package/dist/xlsx/formula/functions/lookup-core.d.ts +14 -2
  201. package/dist/xlsx/formula/functions/lookup-core.d.ts.map +1 -1
  202. package/dist/xlsx/formula/functions/lookup.d.ts.map +1 -1
  203. package/dist/xlsx/formula/functions/math-mod.d.ts +8 -0
  204. package/dist/xlsx/formula/functions/math-mod.d.ts.map +1 -0
  205. package/dist/xlsx/formula/functions/math-sum.d.ts.map +1 -1
  206. package/dist/xlsx/formula/functions/math.d.ts.map +1 -1
  207. package/dist/xlsx/formula/functions/statistical-count.d.ts.map +1 -1
  208. package/dist/xlsx/formula/functions/statistical.d.ts.map +1 -1
  209. package/dist/xlsx/formula/functions/stats-core.d.ts +6 -0
  210. package/dist/xlsx/formula/functions/stats-core.d.ts.map +1 -1
  211. package/dist/xlsx/formula/functions/text-case.d.ts +14 -0
  212. package/dist/xlsx/formula/functions/text-case.d.ts.map +1 -0
  213. package/dist/xlsx/formula/functions/text.d.ts.map +1 -1
  214. package/dist/xlsx/formula/functions/workdays.d.ts.map +1 -1
  215. package/dist/xlsx/formula/graph-index.d.ts +15 -0
  216. package/dist/xlsx/formula/graph-index.d.ts.map +1 -0
  217. package/dist/xlsx/formula/graph.d.ts +13 -18
  218. package/dist/xlsx/formula/graph.d.ts.map +1 -1
  219. package/dist/xlsx/formula/operators.d.ts +9 -0
  220. package/dist/xlsx/formula/operators.d.ts.map +1 -1
  221. package/dist/xlsx/formula/parser.d.ts +2 -0
  222. package/dist/xlsx/formula/parser.d.ts.map +1 -1
  223. package/dist/xlsx/formula/references.d.ts +4 -1
  224. package/dist/xlsx/formula/references.d.ts.map +1 -1
  225. package/dist/xlsx/formula/text-number.d.ts.map +1 -1
  226. package/dist/xlsx/formula/transform.d.ts.map +1 -1
  227. package/dist/xlsx/formula/values.d.ts +44 -3
  228. package/dist/xlsx/formula/values.d.ts.map +1 -1
  229. package/dist/xlsx/index.cjs +4698 -1322
  230. package/dist/xlsx/index.mjs +4688 -1323
  231. package/dist/xlsx/layout/anchors.d.ts +47 -0
  232. package/dist/xlsx/layout/anchors.d.ts.map +1 -0
  233. package/dist/xlsx/layout/cf-evaluator.d.ts +1 -2
  234. package/dist/xlsx/layout/cf-evaluator.d.ts.map +1 -1
  235. package/dist/xlsx/layout/cf-helpers.d.ts +8 -1
  236. package/dist/xlsx/layout/cf-helpers.d.ts.map +1 -1
  237. package/dist/xlsx/layout/index.d.ts +1 -0
  238. package/dist/xlsx/layout/index.d.ts.map +1 -1
  239. package/dist/xlsx/load/csv.d.ts +24 -3
  240. package/dist/xlsx/load/csv.d.ts.map +1 -1
  241. package/dist/xlsx/load/detect.d.ts +39 -7
  242. package/dist/xlsx/load/detect.d.ts.map +1 -1
  243. package/dist/xlsx/load/errors.d.ts +10 -0
  244. package/dist/xlsx/load/errors.d.ts.map +1 -0
  245. package/dist/xlsx/load/index.cjs +16220 -12163
  246. package/dist/xlsx/load/index.d.ts +5 -2
  247. package/dist/xlsx/load/index.d.ts.map +1 -1
  248. package/dist/xlsx/load/index.mjs +16213 -12164
  249. package/dist/xlsx/load/text-decode.d.ts +7 -0
  250. package/dist/xlsx/load/text-decode.d.ts.map +1 -0
  251. package/dist/xlsx/model.d.ts +121 -17
  252. package/dist/xlsx/model.d.ts.map +1 -1
  253. package/dist/xlsx/numfmt/date.d.ts +7 -0
  254. package/dist/xlsx/numfmt/date.d.ts.map +1 -1
  255. package/dist/xlsx/numfmt/format.d.ts.map +1 -1
  256. package/dist/xlsx/numfmt/fraction.d.ts +5 -1
  257. package/dist/xlsx/numfmt/fraction.d.ts.map +1 -1
  258. package/dist/xlsx/numfmt/input-date.d.ts.map +1 -1
  259. package/dist/xlsx/numfmt/input.d.ts.map +1 -1
  260. package/dist/xlsx/numfmt/number.d.ts.map +1 -1
  261. package/dist/xlsx/read/conditional.d.ts.map +1 -1
  262. package/dist/xlsx/read/drawing.d.ts +2 -2
  263. package/dist/xlsx/read/drawing.d.ts.map +1 -1
  264. package/dist/xlsx/read/load.d.ts.map +1 -1
  265. package/dist/xlsx/read/package.d.ts +18 -2
  266. package/dist/xlsx/read/package.d.ts.map +1 -1
  267. package/dist/xlsx/read/sheet-data.d.ts.map +1 -1
  268. package/dist/xlsx/read/sheet-props.d.ts +15 -1
  269. package/dist/xlsx/read/sheet-props.d.ts.map +1 -1
  270. package/dist/xlsx/read/smart-art.d.ts +12 -0
  271. package/dist/xlsx/read/smart-art.d.ts.map +1 -0
  272. package/dist/xlsx/read/styles.d.ts.map +1 -1
  273. package/dist/xlsx/read/workbook-part.d.ts +5 -2
  274. package/dist/xlsx/read/workbook-part.d.ts.map +1 -1
  275. package/dist/xlsx/read/worksheet.d.ts.map +1 -1
  276. package/dist/xlsx/write/attr-merge.d.ts +10 -0
  277. package/dist/xlsx/write/attr-merge.d.ts.map +1 -0
  278. package/dist/xlsx/write/carried-refs.d.ts +61 -0
  279. package/dist/xlsx/write/carried-refs.d.ts.map +1 -0
  280. package/dist/xlsx/write/comments.d.ts +12 -2
  281. package/dist/xlsx/write/comments.d.ts.map +1 -1
  282. package/dist/xlsx/write/conditional.d.ts.map +1 -1
  283. package/dist/xlsx/write/doc-props.d.ts +30 -0
  284. package/dist/xlsx/write/doc-props.d.ts.map +1 -0
  285. package/dist/xlsx/write/drawing.d.ts +5 -0
  286. package/dist/xlsx/write/drawing.d.ts.map +1 -1
  287. package/dist/xlsx/write/metadata.d.ts +23 -0
  288. package/dist/xlsx/write/metadata.d.ts.map +1 -0
  289. package/dist/xlsx/write/package-writer.d.ts +6 -0
  290. package/dist/xlsx/write/package-writer.d.ts.map +1 -1
  291. package/dist/xlsx/write/page-setup.d.ts +8 -0
  292. package/dist/xlsx/write/page-setup.d.ts.map +1 -0
  293. package/dist/xlsx/write/save.d.ts.map +1 -1
  294. package/dist/xlsx/write/sheet-data.d.ts +8 -0
  295. package/dist/xlsx/write/sheet-data.d.ts.map +1 -1
  296. package/dist/xlsx/write/sheet-parts.d.ts +6 -0
  297. package/dist/xlsx/write/sheet-parts.d.ts.map +1 -1
  298. package/dist/xlsx/write/sheet-props.d.ts +0 -6
  299. package/dist/xlsx/write/sheet-props.d.ts.map +1 -1
  300. package/dist/xlsx/write/styles.d.ts.map +1 -1
  301. package/dist/xlsx/write/table-patch.d.ts +12 -0
  302. package/dist/xlsx/write/table-patch.d.ts.map +1 -0
  303. package/dist/xlsx/write/tables.d.ts +9 -0
  304. package/dist/xlsx/write/tables.d.ts.map +1 -1
  305. package/dist/xlsx/write/vml-ids.d.ts +29 -0
  306. package/dist/xlsx/write/vml-ids.d.ts.map +1 -0
  307. package/dist/xlsx/write/workbook-part.d.ts +1 -4
  308. package/dist/xlsx/write/workbook-part.d.ts.map +1 -1
  309. package/dist/xlsx/write/worksheet.d.ts.map +1 -1
  310. package/dist/xml/index.cjs +4 -0
  311. package/dist/xml/index.mjs +4 -0
  312. package/dist/xml/namespaces.d.ts +4 -0
  313. package/dist/xml/namespaces.d.ts.map +1 -1
  314. package/package.json +16 -1
  315. package/dist/pptx/chunks/index-CojJtI77.d.ts.map +0 -1
  316. package/dist/pptx/chunks/signature-inspection-status-Bh2oap7B.d.ts.map +0 -1
package/README.md CHANGED
@@ -35,22 +35,30 @@ import { parseXml } from 'ooxml-core/xml'; // one area
35
35
  import { xml, opc } from 'ooxml-core'; // or by namespace (shared building blocks)
36
36
  ```
37
37
 
38
- | Area | What it is |
39
- | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
40
- | `xml` | The shared XML model: strict DOM parsing and serialization, namespaces, namespace-aware helpers. |
41
- | `opc` | Open Packaging Conventions: relationships, content types, part paths, zip helpers, safe hyperlinks. |
42
- | `units` | Branded EMU, twip and point types, constants and conversions. |
43
- | `color` | Hex, RGB, HSL and linear colour primitives, OOXML percent and angle parsing. |
44
- | `geometry` | DrawingML preset shapes, connection sites, clip paths, callouts and boolean shape operations. |
45
- | `diagram` | SmartArt (DiagramML), format-neutral: data model, layout/colour/quick-style parts, the cached `dsp:drawing` shape tree, relationship resolution and a loader. Used by `docx`; `pptx` re-imports its parsers. |
46
- | `digest` | Synchronous pure-TypeScript SHA-1, SHA-256, SHA-384 and SHA-512, ECMA-376 digest name normalisation (`SHA-512`, `SHA512`, `sha_512`, ...) and the agile password hash Office protection elements store (`hashPassword`, `verifyPasswordHash`). No Web Crypto, so it works on `http://`. Used by `xlsx` sheet and workbook protection. |
47
- | `collab` | Format-neutral real-time collaboration on Yjs: session and provider lifecycle, awareness/presence, transport-neutral sync (WebSocket, in-memory, any byte channel), update codecs, ordering helpers, asset sync and the product adapter seam. See `docs/collab-area.md`. |
48
- | `docx` | WordprocessingML: model, parser, preserving serializer, editing, validation. Also `/docx/embedded`. `/docx/layout` is the DOM-free pagination engine (an approximation of Word, not parity) and `/docx/load` detects and loads DOCX and legacy .doc (ole2 inlined). |
49
- | `pptx` | PresentationML: model, parser, serializer, editing, charts, SmartArt, converters, CLI, signatures. Subpaths `/pptx/converter`, `/pptx/cli`, `/pptx/signature-node`. |
50
- | `xlsx` | SpreadsheetML: workbook model, `.xlsx`/`.xlsm` reader and preserving writer, formula engine (dependency graph, dynamic arrays, 380+ functions), Excel number formats, editing commands with undo, and the DOM-free grid layout (sizes, colours, conditional formats, charts as SVG). `/xlsx/load` detects and loads `.xlsx`, `.xlsm`, legacy `.xls` (ole2 inlined) and CSV. An approximation of Excel, not parity. |
38
+ | Area | What it is |
39
+ | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
40
+ | `xml` | The shared XML model: strict DOM parsing and serialization, namespaces, namespace-aware helpers. |
41
+ | `opc` | Open Packaging Conventions: relationships, content types, part paths, zip helpers, the hyperlink safety policy (`hyperlinkPolicy`) and document properties (core, app and custom, `opc/properties`) and digital signatures (`signature`: detection, the parts a writer strips, XML-DSig parsing and digest checks; the Node verifier is `/pptx/signature-node`). |
42
+ | `units` | Branded EMU, twip and point types, constants and conversions. |
43
+ | `color` | Hex, RGB, HSL and linear colour primitives, OOXML percent and angle parsing. |
44
+ | `geometry` | DrawingML preset shapes, connection sites, clip paths, callouts and boolean shape operations. |
45
+ | `diagram` | SmartArt (DiagramML), format-neutral: data model, layout/colour/quick-style parts, the cached `dsp:drawing` shape tree, relationship resolution and a loader. Used by `docx`; `pptx` re-imports its parsers. |
46
+ | `digest` | Synchronous pure-TypeScript SHA-1, SHA-256, SHA-384 and SHA-512, ECMA-376 digest name normalisation (`SHA-512`, `SHA512`, `sha_512`, ...) and the agile password hash Office protection elements store (`hashPassword`, `verifyPasswordHash`). No Web Crypto, so it works on `http://`. Used by `xlsx` sheet and workbook protection. |
47
+ | `crypto` | ECMA-376 package encryption ([MS-OFFCRYPTO]) for every format: `decryptOoxmlPackage`, `encryptOoxmlPackage` (agile AES-256/SHA-512 by default, or Standard), `isEncryptedOoxmlPackage`, and typed errors with a `code` (`password-required`, `incorrect-password`, `data-integrity`). The compound-file container comes from ole2 (inlined); not in the root entry. |
48
+ | `collab` | Format-neutral real-time collaboration on Yjs: session and provider lifecycle, awareness/presence, transport-neutral sync (WebSocket, in-memory, any byte channel), update codecs, ordering helpers, asset sync and the product adapter seam. See `docs/collab-area.md`. |
49
+ | `docx` | WordprocessingML: model, parser, preserving serializer, editing, validation. Also `/docx/embedded`. `/docx/layout` is the DOM-free pagination engine (an approximation of Word, not parity) and `/docx/load` detects and loads DOCX (also password-protected, `{ password }`) and legacy .doc (ole2 inlined). |
50
+ | `pptx` | PresentationML: model, parser, serializer, editing, charts, SmartArt, converters, CLI, signatures. Subpaths `/pptx/converter`, `/pptx/cli`, `/pptx/signature-node`. |
51
+ | `xlsx` | SpreadsheetML: workbook model, `.xlsx`/`.xlsm` reader and preserving writer, formula engine (dependency graph, dynamic arrays, 380+ functions), Excel number formats, editing commands with undo, and the DOM-free grid layout (sizes, colours, conditional formats, charts as SVG, drawing anchors). SmartArt is shown from the cached drawing (not re-laid out) and kept verbatim on save. `/xlsx/load` detects and loads `.xlsx`, `.xlsm` (also password-protected: `loadWorkbook(bytes, { password })`, `saveWorkbook(workbook, 'xlsx', { password })`), legacy `.xls` (ole2 inlined) and CSV, and refuses `.xlsb` with a typed error. Digital signatures are detected and reported, never kept on save. An approximation of Excel, not parity. |
51
52
 
52
53
  Legacy binary formats (`.doc`, `.xls`, `.ppt`) and the compound-file container live in the sibling package [`ole2`](https://github.com/ChristopherVR/ole2); this package never contains binary codecs, and `ole2` never contains modern OOXML.
53
54
 
55
+ The `chart` subpath provides shared chart data calculations (regression, quartiles,
56
+ blank values and stacked series). The `text` subpath provides script-category
57
+ segmentation primitives. These areas are DOM-free and do not import a product model.
58
+ SVG curve flattening is available from `geometry`. See the
59
+ [PowerPoint reuse audit](docs/pptx-shared-logic-audit.md) for extraction evidence
60
+ and remaining candidates.
61
+
54
62
  ## Install
55
63
 
56
64
  ```bash
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Blank-value display resolution for `c:dispBlanksAs`.
3
+ *
4
+ * A chart series carries an optional `blanks` mask (from core) marking category
5
+ * slots whose numeric cache point was absent. This module turns that mask into
6
+ * per-point render instructions per the chart's `c:dispBlanksAs` mode:
7
+ *
8
+ * - `gap` - the blank point is omitted and the line breaks around it.
9
+ * - `zero` - the blank point plots as `0` (its placeholder value).
10
+ * - `span` - the blank is linearly interpolated from its nearest real neighbours.
11
+ *
12
+ * When the mode is unset the output preserves existing behaviour exactly (all
13
+ * points visible, placeholder `0` values), so charts without an explicit
14
+ * `c:dispBlanksAs` render unchanged.
15
+ *
16
+ * @module chart-blank-display
17
+ */
18
+ /** Values of `c:dispBlanksAs`. */
19
+ export type DispBlanksAs = 'gap' | 'zero' | 'span';
20
+ /** Per-point render instructions after applying a blank mode. */
21
+ export interface BlankDisplay {
22
+ /** Effective values (interpolated for `span`; `0` placeholder otherwise). */
23
+ values: number[];
24
+ /** Whether each point is drawn. `false` only for blanks under `gap`. */
25
+ visible: boolean[];
26
+ }
27
+ /**
28
+ * Resolve display values + visibility for a series given its blank mask and mode.
29
+ *
30
+ * @param values - Effective values aligned to display order (blanks carry `0`).
31
+ * @param blanks - Blank mask aligned index-for-index with `values`.
32
+ * @param mode - `c:dispBlanksAs` mode; `undefined` preserves existing behaviour.
33
+ */
34
+ export declare function resolveBlankDisplay(values: ReadonlyArray<number>, blanks: ReadonlyArray<boolean> | undefined, mode: DispBlanksAs | undefined): BlankDisplay;
35
+ /** Contiguous runs of visible indices, used to break a line at gaps. */
36
+ export declare function visibleRuns(visible: ReadonlyArray<boolean>): number[][];
37
+ //# sourceMappingURL=blank-display.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blank-display.d.ts","sourceRoot":"","sources":["../../src/chart/blank-display.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,kCAAkC;AAClC,MAAM,MAAM,YAAY,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,CAAC;AAEnD,iEAAiE;AACjE,MAAM,WAAW,YAAY;IAC5B,6EAA6E;IAC7E,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,wEAAwE;IACxE,OAAO,EAAE,OAAO,EAAE,CAAC;CACnB;AA+BD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAClC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,MAAM,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,SAAS,EAC1C,IAAI,EAAE,YAAY,GAAG,SAAS,GAC5B,YAAY,CAad;AAED,wEAAwE;AACxE,wBAAgB,WAAW,CAAC,OAAO,EAAE,aAAa,CAAC,OAAO,CAAC,GAAG,MAAM,EAAE,EAAE,CAevE"}
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Row indexes sharing each unique category label, in first-appearance order.
3
+ *
4
+ * A `cx:boxWhisker` chart's raw data repeats its category label once per
5
+ * underlying observation (COM-verified against `charts-com.pptx` slide 32 /
6
+ * `chartEx7.xml`: `Category 1` appears on 9 consecutive rows, `Category 2` on
7
+ * 7, `Category 3` on 6), because every row IS one observation, not one
8
+ * category. A box's quartiles must be computed from the observations that
9
+ * share its category label, not from one value per row.
10
+ */
11
+ export interface CategoryRowGroups {
12
+ /** Unique category labels, in first-appearance (authoring) order. */
13
+ uniqueCategories: string[];
14
+ /** Every raw row index whose category label equals the map key. */
15
+ rowIndexesByCategory: ReadonlyMap<string, number[]>;
16
+ }
17
+ /** Group raw (possibly repeated) category labels by unique text. */
18
+ export declare function groupRowsByCategory(rawCategories: ReadonlyArray<string>): CategoryRowGroups;
19
+ export interface BoxStats {
20
+ min: number;
21
+ q1: number;
22
+ median: number;
23
+ q3: number;
24
+ max: number;
25
+ }
26
+ /** Compute quartiles, preserving the legacy floor-index result when method is absent. */
27
+ export declare function computeBoxStats(values: ReadonlyArray<number>, method?: 'inclusive' | 'exclusive'): BoxStats | undefined;
28
+ //# sourceMappingURL=box-stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"box-stats.d.ts","sourceRoot":"","sources":["../../src/chart/box-stats.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,MAAM,WAAW,iBAAiB;IACjC,qEAAqE;IACrE,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,mEAAmE;IACnE,oBAAoB,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;CACpD;AAED,oEAAoE;AACpE,wBAAgB,mBAAmB,CAAC,aAAa,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,iBAAiB,CAc3F;AAED,MAAM,WAAW,QAAQ;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;CACZ;AAeD,yFAAyF;AACzF,wBAAgB,eAAe,CAC9B,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC,EAC7B,MAAM,CAAC,EAAE,WAAW,GAAG,WAAW,GAChC,QAAQ,GAAG,SAAS,CAqBtB"}
@@ -0,0 +1,229 @@
1
+ 'use strict';
2
+
3
+ // src/chart/regression.ts
4
+ function computeLinearRegression(xVals, yVals) {
5
+ const n = xVals.length;
6
+ if (n < 2) {
7
+ return { slope: 0, intercept: 0, rSquared: 0 };
8
+ }
9
+ let sumX = 0;
10
+ let sumY = 0;
11
+ let sumXY = 0;
12
+ let sumXX = 0;
13
+ for (let i = 0; i < n; i++) {
14
+ sumX += xVals[i];
15
+ sumY += yVals[i];
16
+ sumXY += xVals[i] * yVals[i];
17
+ sumXX += xVals[i] * xVals[i];
18
+ }
19
+ const denom = n * sumXX - sumX * sumX;
20
+ if (Math.abs(denom) < 1e-12) {
21
+ return { slope: 0, intercept: sumY / n, rSquared: 0 };
22
+ }
23
+ const slope = (n * sumXY - sumX * sumY) / denom;
24
+ const intercept = (sumY - slope * sumX) / n;
25
+ const ssRes = yVals.reduce((s, y, i) => s + (y - (slope * xVals[i] + intercept)) ** 2, 0);
26
+ const meanY = sumY / n;
27
+ const ssTot = yVals.reduce((s, y) => s + (y - meanY) ** 2, 0);
28
+ const rSquared = ssTot > 0 ? 1 - ssRes / ssTot : 0;
29
+ return { slope, intercept, rSquared };
30
+ }
31
+ function fitPolynomial(xVals, yVals, order) {
32
+ const n = xVals.length;
33
+ const m = order + 1;
34
+ const matrix = Array.from({ length: m }, () => Array(m + 1).fill(0));
35
+ for (let i = 0; i < m; i++) {
36
+ for (let j = 0; j < m; j++) {
37
+ let sum2 = 0;
38
+ for (let k = 0; k < n; k++) {
39
+ sum2 += xVals[k] ** (i + j);
40
+ }
41
+ matrix[i][j] = sum2;
42
+ }
43
+ let sum = 0;
44
+ for (let k = 0; k < n; k++) {
45
+ sum += yVals[k] * xVals[k] ** i;
46
+ }
47
+ matrix[i][m] = sum;
48
+ }
49
+ for (let i = 0; i < m; i++) {
50
+ let maxRow = i;
51
+ for (let k = i + 1; k < m; k++) {
52
+ if (Math.abs(matrix[k][i]) > Math.abs(matrix[maxRow][i])) {
53
+ maxRow = k;
54
+ }
55
+ }
56
+ [matrix[i], matrix[maxRow]] = [matrix[maxRow], matrix[i]];
57
+ const pivot = matrix[i][i];
58
+ if (Math.abs(pivot) < 1e-12) {
59
+ continue;
60
+ }
61
+ for (let j = i; j <= m; j++) {
62
+ matrix[i][j] = matrix[i][j] / pivot;
63
+ }
64
+ for (let k = 0; k < m; k++) {
65
+ if (k === i) {
66
+ continue;
67
+ }
68
+ const factor = matrix[k][i];
69
+ for (let j = i; j <= m; j++) {
70
+ matrix[k][j] = matrix[k][j] - factor * matrix[i][j];
71
+ }
72
+ }
73
+ }
74
+ return matrix.map((row) => row[m]);
75
+ }
76
+ function computeRSquared(xVals, yVals, evalFn) {
77
+ const n = xVals.length;
78
+ if (n === 0) {
79
+ return 0;
80
+ }
81
+ const meanY = yVals.reduce((s, y) => s + y, 0) / n;
82
+ let ssRes = 0;
83
+ let ssTot = 0;
84
+ for (let i = 0; i < n; i++) {
85
+ ssRes += (yVals[i] - evalFn(xVals[i])) ** 2;
86
+ ssTot += (yVals[i] - meanY) ** 2;
87
+ }
88
+ return ssTot > 0 ? 1 - ssRes / ssTot : 0;
89
+ }
90
+
91
+ // src/chart/box-stats.ts
92
+ function groupRowsByCategory(rawCategories) {
93
+ const uniqueCategories = [];
94
+ const rowIndexesByCategory = /* @__PURE__ */ new Map();
95
+ rawCategories.forEach((rawLabel, rowIndex) => {
96
+ const label = rawLabel ?? "";
97
+ let rows = rowIndexesByCategory.get(label);
98
+ if (!rows) {
99
+ rows = [];
100
+ rowIndexesByCategory.set(label, rows);
101
+ uniqueCategories.push(label);
102
+ }
103
+ rows.push(rowIndex);
104
+ });
105
+ return { uniqueCategories, rowIndexesByCategory };
106
+ }
107
+ function percentile(sorted, p, method) {
108
+ const rank = method === "inclusive" ? (sorted.length - 1) * p : (sorted.length + 1) * p - 1;
109
+ const clamped = Math.max(0, Math.min(rank, sorted.length - 1));
110
+ const lower = Math.floor(clamped);
111
+ const upper = Math.ceil(clamped);
112
+ const fraction = clamped - lower;
113
+ return sorted[lower] + (sorted[upper] - sorted[lower]) * fraction;
114
+ }
115
+ function computeBoxStats(values, method) {
116
+ if (values.length < 2) {
117
+ return void 0;
118
+ }
119
+ const sorted = [...values].sort((a, b) => a - b);
120
+ if (!method) {
121
+ return {
122
+ min: sorted[0],
123
+ q1: sorted[Math.floor(sorted.length * 0.25)],
124
+ median: sorted[Math.floor(sorted.length * 0.5)],
125
+ q3: sorted[Math.floor(sorted.length * 0.75)],
126
+ max: sorted[sorted.length - 1]
127
+ };
128
+ }
129
+ return {
130
+ min: sorted[0],
131
+ q1: percentile(sorted, 0.25, method),
132
+ median: percentile(sorted, 0.5, method),
133
+ q3: percentile(sorted, 0.75, method),
134
+ max: sorted[sorted.length - 1]
135
+ };
136
+ }
137
+
138
+ // src/chart/blank-display.ts
139
+ function interpolate(values, blank) {
140
+ const out = [...values];
141
+ for (let i = 0; i < out.length; i++) {
142
+ if (!blank[i]) {
143
+ continue;
144
+ }
145
+ let prev = i - 1;
146
+ while (prev >= 0 && blank[prev]) {
147
+ prev--;
148
+ }
149
+ let next = i + 1;
150
+ while (next < out.length && blank[next]) {
151
+ next++;
152
+ }
153
+ const hasPrev = prev >= 0;
154
+ const hasNext = next < out.length;
155
+ if (hasPrev && hasNext) {
156
+ const t = (i - prev) / (next - prev);
157
+ out[i] = values[prev] + (values[next] - values[prev]) * t;
158
+ } else if (hasPrev) {
159
+ out[i] = values[prev];
160
+ } else if (hasNext) {
161
+ out[i] = values[next];
162
+ }
163
+ }
164
+ return out;
165
+ }
166
+ function resolveBlankDisplay(values, blanks, mode) {
167
+ const visible = values.map(() => true);
168
+ if (!blanks || !blanks.some(Boolean) || mode === void 0 || mode === "zero") {
169
+ return { values: [...values], visible };
170
+ }
171
+ if (mode === "span") {
172
+ return { values: interpolate(values, blanks), visible };
173
+ }
174
+ return {
175
+ values: [...values],
176
+ visible: values.map((_v, i) => !blanks[i])
177
+ };
178
+ }
179
+ function visibleRuns(visible) {
180
+ const runs = [];
181
+ let current = [];
182
+ for (let i = 0; i < visible.length; i++) {
183
+ if (visible[i]) {
184
+ current.push(i);
185
+ } else if (current.length > 0) {
186
+ runs.push(current);
187
+ current = [];
188
+ }
189
+ }
190
+ if (current.length > 0) {
191
+ runs.push(current);
192
+ }
193
+ return runs;
194
+ }
195
+
196
+ // src/chart/stacked-series.ts
197
+ function categoryAbsTotals(seriesValues, catCount) {
198
+ return Array.from(
199
+ { length: catCount },
200
+ (_, ci) => seriesValues.reduce((sum, values) => sum + Math.abs(values[ci] ?? 0), 0)
201
+ );
202
+ }
203
+ function computeStackedSeriesPlots(seriesValues, catCount, percent) {
204
+ const totals = percent ? categoryAbsTotals(seriesValues, catCount) : void 0, posRunning = new Array(catCount).fill(0), negRunning = new Array(catCount).fill(0);
205
+ return seriesValues.map((values) => {
206
+ const cumulative = [], base = [], own = [];
207
+ for (let ci = 0; ci < catCount; ci++) {
208
+ const raw = values[ci] ?? 0, total = totals?.[ci] ?? 0, val = percent ? total > 0 ? raw / total * 100 : 0 : raw, isNeg = val < 0, from = isNeg ? negRunning[ci] : posRunning[ci], to = from + val;
209
+ base.push(from);
210
+ cumulative.push(to);
211
+ own.push(val);
212
+ if (isNeg) {
213
+ negRunning[ci] = to;
214
+ } else {
215
+ posRunning[ci] = to;
216
+ }
217
+ }
218
+ return { cumulative, base, own };
219
+ });
220
+ }
221
+
222
+ exports.computeBoxStats = computeBoxStats;
223
+ exports.computeLinearRegression = computeLinearRegression;
224
+ exports.computeRSquared = computeRSquared;
225
+ exports.computeStackedSeriesPlots = computeStackedSeriesPlots;
226
+ exports.fitPolynomial = fitPolynomial;
227
+ exports.groupRowsByCategory = groupRowsByCategory;
228
+ exports.resolveBlankDisplay = resolveBlankDisplay;
229
+ exports.visibleRuns = visibleRuns;
@@ -0,0 +1,6 @@
1
+ /** Format-neutral, DOM-free chart data algorithms shared by Office formats. */
2
+ export * from './regression.js';
3
+ export * from './box-stats.js';
4
+ export * from './blank-display.js';
5
+ export * from './stacked-series.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chart/index.ts"],"names":[],"mappings":"AAAA,+EAA+E;AAC/E,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,oBAAoB,CAAC;AACnC,cAAc,qBAAqB,CAAC"}
@@ -0,0 +1,220 @@
1
+ // src/chart/regression.ts
2
+ function computeLinearRegression(xVals, yVals) {
3
+ const n = xVals.length;
4
+ if (n < 2) {
5
+ return { slope: 0, intercept: 0, rSquared: 0 };
6
+ }
7
+ let sumX = 0;
8
+ let sumY = 0;
9
+ let sumXY = 0;
10
+ let sumXX = 0;
11
+ for (let i = 0; i < n; i++) {
12
+ sumX += xVals[i];
13
+ sumY += yVals[i];
14
+ sumXY += xVals[i] * yVals[i];
15
+ sumXX += xVals[i] * xVals[i];
16
+ }
17
+ const denom = n * sumXX - sumX * sumX;
18
+ if (Math.abs(denom) < 1e-12) {
19
+ return { slope: 0, intercept: sumY / n, rSquared: 0 };
20
+ }
21
+ const slope = (n * sumXY - sumX * sumY) / denom;
22
+ const intercept = (sumY - slope * sumX) / n;
23
+ const ssRes = yVals.reduce((s, y, i) => s + (y - (slope * xVals[i] + intercept)) ** 2, 0);
24
+ const meanY = sumY / n;
25
+ const ssTot = yVals.reduce((s, y) => s + (y - meanY) ** 2, 0);
26
+ const rSquared = ssTot > 0 ? 1 - ssRes / ssTot : 0;
27
+ return { slope, intercept, rSquared };
28
+ }
29
+ function fitPolynomial(xVals, yVals, order) {
30
+ const n = xVals.length;
31
+ const m = order + 1;
32
+ const matrix = Array.from({ length: m }, () => Array(m + 1).fill(0));
33
+ for (let i = 0; i < m; i++) {
34
+ for (let j = 0; j < m; j++) {
35
+ let sum2 = 0;
36
+ for (let k = 0; k < n; k++) {
37
+ sum2 += xVals[k] ** (i + j);
38
+ }
39
+ matrix[i][j] = sum2;
40
+ }
41
+ let sum = 0;
42
+ for (let k = 0; k < n; k++) {
43
+ sum += yVals[k] * xVals[k] ** i;
44
+ }
45
+ matrix[i][m] = sum;
46
+ }
47
+ for (let i = 0; i < m; i++) {
48
+ let maxRow = i;
49
+ for (let k = i + 1; k < m; k++) {
50
+ if (Math.abs(matrix[k][i]) > Math.abs(matrix[maxRow][i])) {
51
+ maxRow = k;
52
+ }
53
+ }
54
+ [matrix[i], matrix[maxRow]] = [matrix[maxRow], matrix[i]];
55
+ const pivot = matrix[i][i];
56
+ if (Math.abs(pivot) < 1e-12) {
57
+ continue;
58
+ }
59
+ for (let j = i; j <= m; j++) {
60
+ matrix[i][j] = matrix[i][j] / pivot;
61
+ }
62
+ for (let k = 0; k < m; k++) {
63
+ if (k === i) {
64
+ continue;
65
+ }
66
+ const factor = matrix[k][i];
67
+ for (let j = i; j <= m; j++) {
68
+ matrix[k][j] = matrix[k][j] - factor * matrix[i][j];
69
+ }
70
+ }
71
+ }
72
+ return matrix.map((row) => row[m]);
73
+ }
74
+ function computeRSquared(xVals, yVals, evalFn) {
75
+ const n = xVals.length;
76
+ if (n === 0) {
77
+ return 0;
78
+ }
79
+ const meanY = yVals.reduce((s, y) => s + y, 0) / n;
80
+ let ssRes = 0;
81
+ let ssTot = 0;
82
+ for (let i = 0; i < n; i++) {
83
+ ssRes += (yVals[i] - evalFn(xVals[i])) ** 2;
84
+ ssTot += (yVals[i] - meanY) ** 2;
85
+ }
86
+ return ssTot > 0 ? 1 - ssRes / ssTot : 0;
87
+ }
88
+
89
+ // src/chart/box-stats.ts
90
+ function groupRowsByCategory(rawCategories) {
91
+ const uniqueCategories = [];
92
+ const rowIndexesByCategory = /* @__PURE__ */ new Map();
93
+ rawCategories.forEach((rawLabel, rowIndex) => {
94
+ const label = rawLabel ?? "";
95
+ let rows = rowIndexesByCategory.get(label);
96
+ if (!rows) {
97
+ rows = [];
98
+ rowIndexesByCategory.set(label, rows);
99
+ uniqueCategories.push(label);
100
+ }
101
+ rows.push(rowIndex);
102
+ });
103
+ return { uniqueCategories, rowIndexesByCategory };
104
+ }
105
+ function percentile(sorted, p, method) {
106
+ const rank = method === "inclusive" ? (sorted.length - 1) * p : (sorted.length + 1) * p - 1;
107
+ const clamped = Math.max(0, Math.min(rank, sorted.length - 1));
108
+ const lower = Math.floor(clamped);
109
+ const upper = Math.ceil(clamped);
110
+ const fraction = clamped - lower;
111
+ return sorted[lower] + (sorted[upper] - sorted[lower]) * fraction;
112
+ }
113
+ function computeBoxStats(values, method) {
114
+ if (values.length < 2) {
115
+ return void 0;
116
+ }
117
+ const sorted = [...values].sort((a, b) => a - b);
118
+ if (!method) {
119
+ return {
120
+ min: sorted[0],
121
+ q1: sorted[Math.floor(sorted.length * 0.25)],
122
+ median: sorted[Math.floor(sorted.length * 0.5)],
123
+ q3: sorted[Math.floor(sorted.length * 0.75)],
124
+ max: sorted[sorted.length - 1]
125
+ };
126
+ }
127
+ return {
128
+ min: sorted[0],
129
+ q1: percentile(sorted, 0.25, method),
130
+ median: percentile(sorted, 0.5, method),
131
+ q3: percentile(sorted, 0.75, method),
132
+ max: sorted[sorted.length - 1]
133
+ };
134
+ }
135
+
136
+ // src/chart/blank-display.ts
137
+ function interpolate(values, blank) {
138
+ const out = [...values];
139
+ for (let i = 0; i < out.length; i++) {
140
+ if (!blank[i]) {
141
+ continue;
142
+ }
143
+ let prev = i - 1;
144
+ while (prev >= 0 && blank[prev]) {
145
+ prev--;
146
+ }
147
+ let next = i + 1;
148
+ while (next < out.length && blank[next]) {
149
+ next++;
150
+ }
151
+ const hasPrev = prev >= 0;
152
+ const hasNext = next < out.length;
153
+ if (hasPrev && hasNext) {
154
+ const t = (i - prev) / (next - prev);
155
+ out[i] = values[prev] + (values[next] - values[prev]) * t;
156
+ } else if (hasPrev) {
157
+ out[i] = values[prev];
158
+ } else if (hasNext) {
159
+ out[i] = values[next];
160
+ }
161
+ }
162
+ return out;
163
+ }
164
+ function resolveBlankDisplay(values, blanks, mode) {
165
+ const visible = values.map(() => true);
166
+ if (!blanks || !blanks.some(Boolean) || mode === void 0 || mode === "zero") {
167
+ return { values: [...values], visible };
168
+ }
169
+ if (mode === "span") {
170
+ return { values: interpolate(values, blanks), visible };
171
+ }
172
+ return {
173
+ values: [...values],
174
+ visible: values.map((_v, i) => !blanks[i])
175
+ };
176
+ }
177
+ function visibleRuns(visible) {
178
+ const runs = [];
179
+ let current = [];
180
+ for (let i = 0; i < visible.length; i++) {
181
+ if (visible[i]) {
182
+ current.push(i);
183
+ } else if (current.length > 0) {
184
+ runs.push(current);
185
+ current = [];
186
+ }
187
+ }
188
+ if (current.length > 0) {
189
+ runs.push(current);
190
+ }
191
+ return runs;
192
+ }
193
+
194
+ // src/chart/stacked-series.ts
195
+ function categoryAbsTotals(seriesValues, catCount) {
196
+ return Array.from(
197
+ { length: catCount },
198
+ (_, ci) => seriesValues.reduce((sum, values) => sum + Math.abs(values[ci] ?? 0), 0)
199
+ );
200
+ }
201
+ function computeStackedSeriesPlots(seriesValues, catCount, percent) {
202
+ const totals = percent ? categoryAbsTotals(seriesValues, catCount) : void 0, posRunning = new Array(catCount).fill(0), negRunning = new Array(catCount).fill(0);
203
+ return seriesValues.map((values) => {
204
+ const cumulative = [], base = [], own = [];
205
+ for (let ci = 0; ci < catCount; ci++) {
206
+ const raw = values[ci] ?? 0, total = totals?.[ci] ?? 0, val = percent ? total > 0 ? raw / total * 100 : 0 : raw, isNeg = val < 0, from = isNeg ? negRunning[ci] : posRunning[ci], to = from + val;
207
+ base.push(from);
208
+ cumulative.push(to);
209
+ own.push(val);
210
+ if (isNeg) {
211
+ negRunning[ci] = to;
212
+ } else {
213
+ posRunning[ci] = to;
214
+ }
215
+ }
216
+ return { cumulative, base, own };
217
+ });
218
+ }
219
+
220
+ export { computeBoxStats, computeLinearRegression, computeRSquared, computeStackedSeriesPlots, fitPolynomial, groupRowsByCategory, resolveBlankDisplay, visibleRuns };
@@ -0,0 +1,40 @@
1
+ /**
2
+ * chart-overlays-regression.ts: least-squares regression / polynomial-fit
3
+ * math for chart trendlines. Split out of chart-overlays.ts to keep that
4
+ * module under the repo's file-size guideline.
5
+ *
6
+ * Ported / adapted from:
7
+ * packages/react/src/viewer/utils/chart-trendlines.tsx (regression engine)
8
+ * packages/shared/src/render/chart-trendlines.ts (shared port)
9
+ *
10
+ * @module chart-overlays-regression
11
+ */
12
+ /** Result of an ordinary least-squares linear regression. */
13
+ export interface LinearFit {
14
+ slope: number;
15
+ intercept: number;
16
+ rSquared: number;
17
+ }
18
+ /**
19
+ * Ordinary least-squares linear regression of `yVals` on `xVals`.
20
+ * Returns all zeros for fewer than 2 points. A near-zero denominator
21
+ * (constant-x data) gives slope=0, intercept=mean(y), rSquared=0.
22
+ * Input arrays are finite paired observations of equal length.
23
+ *
24
+ * Mirrors `computeLinearRegression` in chart-trendlines.tsx (React) and
25
+ * chart-trendlines.ts (shared).
26
+ */
27
+ export declare function computeLinearRegression(xVals: number[], yVals: number[]): LinearFit;
28
+ /**
29
+ * Fit polynomial coefficients (ascending order: [a0, a1, ..., a_order]) via
30
+ * Gaussian elimination on the normal equations.
31
+ * Input arrays are finite paired observations; order is a nonnegative integer.
32
+ * Mirrors `fitPolynomial` in chart-trendlines.tsx (React).
33
+ */
34
+ export declare function fitPolynomial(xVals: number[], yVals: number[], order: number): number[];
35
+ /**
36
+ * Coefficient of determination (R-squared) of an arbitrary fit function
37
+ * against data. Mirrors `computeRSquared` in chart-trendlines.tsx (React).
38
+ */
39
+ export declare function computeRSquared(xVals: number[], yVals: number[], evalFn: (x: number) => number): number;
40
+ //# sourceMappingURL=regression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regression.d.ts","sourceRoot":"","sources":["../../src/chart/regression.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,6DAA6D;AAC7D,MAAM,WAAW,SAAS;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CACjB;AAED;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,CA+BnF;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CA+CvF;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC9B,KAAK,EAAE,MAAM,EAAE,EACf,KAAK,EAAE,MAAM,EAAE,EACf,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,GAC3B,MAAM,CAaR"}