@svgrid/enterprise 3.0.1 → 3.0.3

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 (445) hide show
  1. package/LICENSE +94 -24
  2. package/README.md +36 -4
  3. package/dist/SvAdvancedFilter.svelte +1 -1
  4. package/dist/SvAlertsManager.svelte +2 -1
  5. package/dist/SvBoard.svelte +2 -1
  6. package/dist/SvExportMenu.svelte +4 -1
  7. package/dist/SvExportMenu.svelte.d.ts +0 -13
  8. package/dist/SvExpressionEditor.svelte +3 -3
  9. package/dist/SvFormulaBar.svelte +680 -0
  10. package/dist/SvFormulaBar.svelte.d.ts +69 -0
  11. package/dist/SvGridAlerts.svelte +49 -9
  12. package/dist/SvGridBoard.svelte +13 -8
  13. package/dist/SvGridBulkEditDrawer.svelte +26 -2
  14. package/dist/SvGridEditPanel.svelte +3 -0
  15. package/dist/SvGridScheduler.svelte +69 -40
  16. package/dist/SvGridSelectionBar.svelte +10 -3
  17. package/dist/SvPivotDesigner.svelte +263 -54
  18. package/dist/SvPivotDesigner.svelte.d.ts +27 -20
  19. package/dist/SvRibbonIcon.svelte +46 -0
  20. package/dist/SvRibbonIcon.svelte.d.ts +17 -0
  21. package/dist/SvSchemaChart.svelte +4 -2
  22. package/dist/SvSheet.svelte +7914 -0
  23. package/dist/SvSheet.svelte.d.ts +215 -0
  24. package/dist/SvSheetChartSetup.svelte +151 -0
  25. package/dist/SvSheetChartSetup.svelte.d.ts +18 -0
  26. package/dist/SvSheetComment.svelte +283 -0
  27. package/dist/SvSheetComment.svelte.d.ts +22 -0
  28. package/dist/SvSheetConditionalFormat.svelte +159 -0
  29. package/dist/SvSheetConditionalFormat.svelte.d.ts +14 -0
  30. package/dist/SvSheetDataValidation.svelte +273 -0
  31. package/dist/SvSheetDataValidation.svelte.d.ts +14 -0
  32. package/dist/SvSheetEditRanges.svelte +217 -0
  33. package/dist/SvSheetEditRanges.svelte.d.ts +15 -0
  34. package/dist/SvSheetErrors.svelte +125 -0
  35. package/dist/SvSheetErrors.svelte.d.ts +20 -0
  36. package/dist/SvSheetEvaluate.svelte +133 -0
  37. package/dist/SvSheetEvaluate.svelte.d.ts +15 -0
  38. package/dist/SvSheetFilterMenu.svelte +320 -0
  39. package/dist/SvSheetFilterMenu.svelte.d.ts +22 -0
  40. package/dist/SvSheetFindReplace.svelte +132 -0
  41. package/dist/SvSheetFindReplace.svelte.d.ts +10 -0
  42. package/dist/SvSheetFormatCells.svelte +465 -0
  43. package/dist/SvSheetFormatCells.svelte.d.ts +17 -0
  44. package/dist/SvSheetGoalSeek.svelte +145 -0
  45. package/dist/SvSheetGoalSeek.svelte.d.ts +12 -0
  46. package/dist/SvSheetInsertFunction.svelte +149 -0
  47. package/dist/SvSheetInsertFunction.svelte.d.ts +8 -0
  48. package/dist/SvSheetIteration.svelte +81 -0
  49. package/dist/SvSheetIteration.svelte.d.ts +10 -0
  50. package/dist/SvSheetLink.svelte +99 -0
  51. package/dist/SvSheetLink.svelte.d.ts +17 -0
  52. package/dist/SvSheetListPicker.svelte +91 -0
  53. package/dist/SvSheetListPicker.svelte.d.ts +10 -0
  54. package/dist/SvSheetManageRules.svelte +187 -0
  55. package/dist/SvSheetManageRules.svelte.d.ts +16 -0
  56. package/dist/SvSheetNameManager.svelte +227 -0
  57. package/dist/SvSheetNameManager.svelte.d.ts +11 -0
  58. package/dist/SvSheetPageSetup.svelte +159 -0
  59. package/dist/SvSheetPageSetup.svelte.d.ts +13 -0
  60. package/dist/SvSheetPasteSpecial.svelte +107 -0
  61. package/dist/SvSheetPasteSpecial.svelte.d.ts +12 -0
  62. package/dist/SvSheetPivot.svelte +220 -0
  63. package/dist/SvSheetPivot.svelte.d.ts +21 -0
  64. package/dist/SvSheetProtectSheet.svelte +81 -0
  65. package/dist/SvSheetProtectSheet.svelte.d.ts +11 -0
  66. package/dist/SvSheetRemoveDuplicates.svelte +152 -0
  67. package/dist/SvSheetRemoveDuplicates.svelte.d.ts +12 -0
  68. package/dist/SvSheetRibbon.svelte +1254 -0
  69. package/dist/SvSheetRibbon.svelte.d.ts +34 -0
  70. package/dist/SvSheetSizeDialog.svelte +60 -0
  71. package/dist/SvSheetSizeDialog.svelte.d.ts +11 -0
  72. package/dist/SvSheetSort.svelte +218 -0
  73. package/dist/SvSheetSort.svelte.d.ts +28 -0
  74. package/dist/SvSheetSparklines.svelte +135 -0
  75. package/dist/SvSheetSparklines.svelte.d.ts +14 -0
  76. package/dist/SvSheetTable.svelte +160 -0
  77. package/dist/SvSheetTable.svelte.d.ts +24 -0
  78. package/dist/SvSheetTabs.svelte +571 -0
  79. package/dist/SvSheetTabs.svelte.d.ts +50 -0
  80. package/dist/SvSheetTabs.test-harness.svelte.d.ts +17 -0
  81. package/dist/SvSheetTabs.test-harness.svelte.js +22 -0
  82. package/dist/SvSheetTextToColumns.svelte +172 -0
  83. package/dist/SvSheetTextToColumns.svelte.d.ts +13 -0
  84. package/dist/SvSheetValidationAlert.svelte +85 -0
  85. package/dist/SvSheetValidationAlert.svelte.d.ts +15 -0
  86. package/dist/advanced-filter-enable.js +1 -1
  87. package/dist/alerts/alert-engine.d.ts +6 -0
  88. package/dist/alerts/alert-engine.js +21 -4
  89. package/dist/alerts/alert-formats.js +2 -0
  90. package/dist/alerts/alert-types.d.ts +1 -1
  91. package/dist/alerts.d.ts +1 -1
  92. package/dist/alerts.js +2 -2
  93. package/dist/board.js +2 -2
  94. package/dist/bulk-edit.d.ts +3 -1
  95. package/dist/bulk-edit.js +1 -1
  96. package/dist/cdn/svgrid-enterprise.svelte-external.js +43538 -6539
  97. package/dist/designer/assets/GridMenus-8gTNssgV.js +8 -0
  98. package/dist/designer/assets/SvChartMenu-BDoeqGz6.js +1 -0
  99. package/dist/designer/assets/SvChartMenu-BYO9cYdy.css +1 -0
  100. package/dist/designer/assets/SvDateRangeInput-BBRzrQeg.js +1 -0
  101. package/dist/designer/assets/SvDateTimePicker-DCPg7WGN.js +1 -0
  102. package/dist/designer/assets/SvGridCellEditor-DMoWJjEI.js +4 -0
  103. package/dist/designer/assets/SvGridChart-BgLuPO7I.css +1 -0
  104. package/dist/designer/assets/SvGridChart-Cy1ATrWh.js +3 -0
  105. package/dist/designer/assets/SvGridChartBuilder-08YWWeqY.css +1 -0
  106. package/dist/designer/assets/SvGridChartBuilder-eQ3mn0L9.js +1 -0
  107. package/dist/designer/assets/SvGridChartPanel-4Pc8y5yO.css +1 -0
  108. package/dist/designer/assets/SvGridChartPanel-CATdVc9X.js +4 -0
  109. package/dist/designer/assets/{SvGridChartView-DUc-1RUf.css → SvGridChartView-7msfnWZT.css} +1 -1
  110. package/dist/designer/assets/SvGridChartView-CmsZtCED.js +1 -0
  111. package/dist/designer/assets/SvGridDropdown-Cjz0H-fI.js +1 -0
  112. package/dist/designer/assets/SvListBox-BDS66lmZ.js +110 -0
  113. package/dist/designer/assets/SvMenuList-DJ47ba1h.css +1 -0
  114. package/dist/designer/assets/SvMenuList-Dgq2D5VN.js +1 -0
  115. package/dist/designer/assets/SvTabs-2mHC6oaz.js +1 -0
  116. package/dist/designer/assets/SvTabs-DKmwb5p1.css +1 -0
  117. package/dist/designer/assets/cell-formatting-BbubJTVz.js +1 -0
  118. package/dist/designer/assets/chart-Cn7MnNqA.js +1 -0
  119. package/dist/designer/assets/chart-export-B6bkQ3X8.js +11 -0
  120. package/dist/designer/assets/chart-export-pdf-BbA28-gt.js +11 -0
  121. package/dist/designer/assets/chart-panel-messages-Dz7PTIqT.js +1 -0
  122. package/dist/designer/assets/chart-summary-BD1qYB2R.js +1 -0
  123. package/dist/designer/assets/chart-trend-B8xr5LuD.js +1 -0
  124. package/dist/designer/assets/chart-validate-BMqM-qkF.js +1 -0
  125. package/dist/designer/assets/column-resize-BYDzR1Ve.js +1 -0
  126. package/dist/designer/assets/date-format-B8JbEtIG.js +1 -0
  127. package/dist/designer/assets/date-format-DKS-z0xS.css +1 -0
  128. package/dist/designer/assets/{dismissable-BO547MH9.js → dismissable-ChWRPkoa.js} +1 -1
  129. package/dist/designer/assets/editor-contract-Bpoa7A5g.js +1 -0
  130. package/dist/designer/assets/{export-format-D-eP4b2l.js → export-format-DGckmgKr.js} +1 -1
  131. package/dist/designer/assets/focus-trap-V2-6Fy9I.js +1 -0
  132. package/dist/designer/assets/{index-C_a9Cj8Y.js → index-D5bVbuzI.js} +318 -315
  133. package/dist/designer/assets/index-_JVFxt02.css +1 -0
  134. package/dist/designer/assets/list-option-BP_dWS66.js +1 -0
  135. package/dist/designer/assets/row-resize-BInFWCpr.js +1 -0
  136. package/dist/designer/assets/server-block-cache-CXJKkJpy.js +1 -0
  137. package/dist/designer/assets/src-CITpcm6b.js +1 -0
  138. package/dist/designer/assets/src-DUQ4xE3x.js +58 -0
  139. package/dist/designer/assets/validate-C3B8QKsM.js +1 -0
  140. package/dist/designer/index.html +29 -19
  141. package/dist/export-pdf.d.ts +164 -0
  142. package/dist/export-pdf.js +346 -15
  143. package/dist/export.js +25 -10
  144. package/dist/gantt/SvGridGantt.svelte +2890 -0
  145. package/dist/gantt/SvGridGantt.svelte.d.ts +30 -0
  146. package/dist/gantt/gantt-config.d.ts +73 -0
  147. package/dist/gantt/gantt-config.js +1 -0
  148. package/dist/gantt/gantt-critical-path.d.ts +67 -0
  149. package/dist/gantt/gantt-critical-path.js +207 -0
  150. package/dist/gantt/gantt-model.d.ts +257 -0
  151. package/dist/gantt/gantt-model.js +651 -0
  152. package/dist/gantt/gantt-resources.d.ts +59 -0
  153. package/dist/gantt/gantt-resources.js +71 -0
  154. package/dist/gantt/gantt.d.ts +7 -0
  155. package/dist/gantt/gantt.js +36 -0
  156. package/dist/gantt/index.d.ts +15 -0
  157. package/dist/gantt/index.js +22 -0
  158. package/dist/gantt/timeline-arrows.d.ts +102 -0
  159. package/dist/gantt/timeline-arrows.js +181 -0
  160. package/dist/import.d.ts +2 -2
  161. package/dist/import.js +1 -1
  162. package/dist/index.d.ts +93 -3
  163. package/dist/index.js +107 -3
  164. package/dist/install.js +13 -1
  165. package/dist/license-core.d.ts +17 -1
  166. package/dist/license-core.js +16 -5
  167. package/dist/license.d.ts +18 -2
  168. package/dist/license.js +71 -6
  169. package/dist/node/studio.js +203 -9
  170. package/dist/pivot-chart.d.ts +25 -1
  171. package/dist/pivot-chart.js +25 -69
  172. package/dist/pivot-enable.js +2 -2
  173. package/dist/scheduler-dependencies.d.ts +35 -0
  174. package/dist/scheduler-dependencies.js +36 -1
  175. package/dist/scheduler.js +2 -2
  176. package/dist/selection-bar.js +2 -2
  177. package/dist/server/SvGroupCell.svelte +213 -0
  178. package/dist/server/SvGroupCell.svelte.d.ts +62 -0
  179. package/dist/server/SvRowGroupPanel.svelte +322 -0
  180. package/dist/server/SvRowGroupPanel.svelte.d.ts +37 -0
  181. package/dist/server/enable.d.ts +17 -0
  182. package/dist/server/enable.js +49 -0
  183. package/dist/server/index.d.ts +22 -0
  184. package/dist/server/index.js +24 -0
  185. package/dist/server/messages.d.ts +45 -0
  186. package/dist/server/messages.js +35 -0
  187. package/dist/server/server-group-model.d.ts +104 -0
  188. package/dist/server/server-group-model.js +272 -0
  189. package/dist/server/server-pivot.d.ts +46 -0
  190. package/dist/server/server-pivot.js +57 -0
  191. package/dist/server/server-row-model.d.ts +547 -0
  192. package/dist/server/server-row-model.js +1551 -0
  193. package/dist/server/server-selection.d.ts +99 -0
  194. package/dist/server/server-selection.js +215 -0
  195. package/dist/server/svgrid-adapter.d.ts +155 -0
  196. package/dist/server/svgrid-adapter.js +202 -0
  197. package/dist/sheet/address.d.ts +43 -0
  198. package/dist/sheet/address.js +81 -0
  199. package/dist/sheet/ast.d.ts +138 -0
  200. package/dist/sheet/ast.js +70 -0
  201. package/dist/sheet/auto-filter.d.ts +120 -0
  202. package/dist/sheet/auto-filter.js +295 -0
  203. package/dist/sheet/autocomplete.d.ts +51 -0
  204. package/dist/sheet/autocomplete.js +248 -0
  205. package/dist/sheet/cell-images.d.ts +39 -0
  206. package/dist/sheet/cell-images.js +90 -0
  207. package/dist/sheet/cell-types.d.ts +58 -0
  208. package/dist/sheet/cell-types.js +96 -0
  209. package/dist/sheet/coerce.d.ts +71 -0
  210. package/dist/sheet/coerce.js +289 -0
  211. package/dist/sheet/commands.d.ts +89 -0
  212. package/dist/sheet/commands.js +230 -0
  213. package/dist/sheet/comments.d.ts +63 -0
  214. package/dist/sheet/comments.js +131 -0
  215. package/dist/sheet/conditional-formats.d.ts +167 -0
  216. package/dist/sheet/conditional-formats.js +341 -0
  217. package/dist/sheet/csv.d.ts +32 -0
  218. package/dist/sheet/csv.js +158 -0
  219. package/dist/sheet/culture.d.ts +87 -0
  220. package/dist/sheet/culture.js +247 -0
  221. package/dist/sheet/delta.d.ts +102 -0
  222. package/dist/sheet/delta.js +203 -0
  223. package/dist/sheet/deps.d.ts +104 -0
  224. package/dist/sheet/deps.js +274 -0
  225. package/dist/sheet/document.d.ts +252 -0
  226. package/dist/sheet/document.js +465 -0
  227. package/dist/sheet/edit-keys.d.ts +14 -0
  228. package/dist/sheet/edit-keys.js +40 -0
  229. package/dist/sheet/engine.d.ts +67 -0
  230. package/dist/sheet/engine.js +19 -0
  231. package/dist/sheet/entry.d.ts +35 -0
  232. package/dist/sheet/entry.js +226 -0
  233. package/dist/sheet/error-check.d.ts +49 -0
  234. package/dist/sheet/error-check.js +83 -0
  235. package/dist/sheet/evaluate-steps.d.ts +48 -0
  236. package/dist/sheet/evaluate-steps.js +196 -0
  237. package/dist/sheet/evaluate.d.ts +128 -0
  238. package/dist/sheet/evaluate.js +1049 -0
  239. package/dist/sheet/filter-files.d.ts +37 -0
  240. package/dist/sheet/filter-files.js +465 -0
  241. package/dist/sheet/find-replace.d.ts +62 -0
  242. package/dist/sheet/find-replace.js +152 -0
  243. package/dist/sheet/format-store.d.ts +114 -0
  244. package/dist/sheet/format-store.js +243 -0
  245. package/dist/sheet/freeze.d.ts +54 -0
  246. package/dist/sheet/freeze.js +58 -0
  247. package/dist/sheet/from-rows.d.ts +14 -0
  248. package/dist/sheet/from-rows.js +50 -0
  249. package/dist/sheet/function-catalog.d.ts +10 -0
  250. package/dist/sheet/function-catalog.js +385 -0
  251. package/dist/sheet/functions.d.ts +28 -0
  252. package/dist/sheet/functions.js +634 -0
  253. package/dist/sheet/goal-seek.d.ts +73 -0
  254. package/dist/sheet/goal-seek.js +153 -0
  255. package/dist/sheet/index.d.ts +80 -0
  256. package/dist/sheet/index.js +80 -0
  257. package/dist/sheet/links.d.ts +57 -0
  258. package/dist/sheet/links.js +174 -0
  259. package/dist/sheet/merges.d.ts +71 -0
  260. package/dist/sheet/merges.js +137 -0
  261. package/dist/sheet/messages.d.ts +778 -0
  262. package/dist/sheet/messages.js +806 -0
  263. package/dist/sheet/names.d.ts +31 -0
  264. package/dist/sheet/names.js +87 -0
  265. package/dist/sheet/navigate.d.ts +52 -0
  266. package/dist/sheet/navigate.js +135 -0
  267. package/dist/sheet/number-format.d.ts +110 -0
  268. package/dist/sheet/number-format.js +905 -0
  269. package/dist/sheet/objects.d.ts +106 -0
  270. package/dist/sheet/objects.js +149 -0
  271. package/dist/sheet/ods-document.d.ts +44 -0
  272. package/dist/sheet/ods-document.js +1275 -0
  273. package/dist/sheet/open-file.d.ts +26 -0
  274. package/dist/sheet/open-file.js +56 -0
  275. package/dist/sheet/outline.d.ts +82 -0
  276. package/dist/sheet/outline.js +228 -0
  277. package/dist/sheet/packs/array.d.ts +16 -0
  278. package/dist/sheet/packs/array.js +172 -0
  279. package/dist/sheet/packs/database.d.ts +42 -0
  280. package/dist/sheet/packs/database.js +142 -0
  281. package/dist/sheet/packs/engineering.d.ts +2 -0
  282. package/dist/sheet/packs/engineering.js +296 -0
  283. package/dist/sheet/packs/financial.d.ts +5 -0
  284. package/dist/sheet/packs/financial.js +220 -0
  285. package/dist/sheet/packs/math-stats.d.ts +2 -0
  286. package/dist/sheet/packs/math-stats.js +372 -0
  287. package/dist/sheet/packs/special.d.ts +44 -0
  288. package/dist/sheet/packs/special.js +187 -0
  289. package/dist/sheet/packs/stats-dist.d.ts +2 -0
  290. package/dist/sheet/packs/stats-dist.js +785 -0
  291. package/dist/sheet/packs/text-date.d.ts +2 -0
  292. package/dist/sheet/packs/text-date.js +332 -0
  293. package/dist/sheet/packs/trig.d.ts +2 -0
  294. package/dist/sheet/packs/trig.js +73 -0
  295. package/dist/sheet/page-setup.d.ts +73 -0
  296. package/dist/sheet/page-setup.js +73 -0
  297. package/dist/sheet/palette.d.ts +19 -0
  298. package/dist/sheet/palette.js +84 -0
  299. package/dist/sheet/parse.d.ts +13 -0
  300. package/dist/sheet/parse.js +140 -0
  301. package/dist/sheet/paste-special.d.ts +186 -0
  302. package/dist/sheet/paste-special.js +601 -0
  303. package/dist/sheet/pivot-range.d.ts +160 -0
  304. package/dist/sheet/pivot-range.js +333 -0
  305. package/dist/sheet/presence.d.ts +73 -0
  306. package/dist/sheet/presence.js +79 -0
  307. package/dist/sheet/print.d.ts +104 -0
  308. package/dist/sheet/print.js +169 -0
  309. package/dist/sheet/protection.d.ts +75 -0
  310. package/dist/sheet/protection.js +101 -0
  311. package/dist/sheet/rects.d.ts +45 -0
  312. package/dist/sheet/rects.js +112 -0
  313. package/dist/sheet/refs.d.ts +130 -0
  314. package/dist/sheet/refs.js +413 -0
  315. package/dist/sheet/ribbon-icons.d.ts +31 -0
  316. package/dist/sheet/ribbon-icons.js +536 -0
  317. package/dist/sheet/ribbon.d.ts +173 -0
  318. package/dist/sheet/ribbon.js +1054 -0
  319. package/dist/sheet/sheet-kinds.d.ts +74 -0
  320. package/dist/sheet/sheet-kinds.js +91 -0
  321. package/dist/sheet/shortcuts.d.ts +174 -0
  322. package/dist/sheet/shortcuts.js +674 -0
  323. package/dist/sheet/sort.d.ts +51 -0
  324. package/dist/sheet/sort.js +107 -0
  325. package/dist/sheet/sparklines.d.ts +111 -0
  326. package/dist/sheet/sparklines.js +204 -0
  327. package/dist/sheet/structure.d.ts +87 -0
  328. package/dist/sheet/structure.js +166 -0
  329. package/dist/sheet/table-styles.d.ts +74 -0
  330. package/dist/sheet/table-styles.js +152 -0
  331. package/dist/sheet/tables.d.ts +89 -0
  332. package/dist/sheet/tables.js +178 -0
  333. package/dist/sheet/tokenize.d.ts +71 -0
  334. package/dist/sheet/tokenize.js +355 -0
  335. package/dist/sheet/transforms.d.ts +76 -0
  336. package/dist/sheet/transforms.js +154 -0
  337. package/dist/sheet/validation.d.ts +108 -0
  338. package/dist/sheet/validation.js +278 -0
  339. package/dist/sheet/workbook.d.ts +217 -0
  340. package/dist/sheet/workbook.js +1120 -0
  341. package/dist/sheet/xls-cfb.d.ts +32 -0
  342. package/dist/sheet/xls-cfb.js +290 -0
  343. package/dist/sheet/xls-document.d.ts +10 -0
  344. package/dist/sheet/xls-document.js +1243 -0
  345. package/dist/sheet/xls-formula.d.ts +40 -0
  346. package/dist/sheet/xls-formula.js +569 -0
  347. package/dist/sheet/xlsx-document.d.ts +108 -0
  348. package/dist/sheet/xlsx-document.js +1849 -0
  349. package/dist/sheet/xlsx-drawing.d.ts +99 -0
  350. package/dist/sheet/xlsx-drawing.js +420 -0
  351. package/dist/sheet-enable.d.ts +6 -0
  352. package/dist/sheet-enable.js +45 -0
  353. package/dist/sheet-text.d.ts +7 -0
  354. package/dist/sheet-text.js +29 -0
  355. package/dist/sources/auth-supabase.js +2 -2
  356. package/dist/sources/realtime-supabase.js +2 -2
  357. package/dist/sources/rest.d.ts +6 -2
  358. package/dist/sources/rest.js +42 -7
  359. package/dist/sources/supabase.d.ts +10 -1
  360. package/dist/sources/supabase.js +73 -40
  361. package/dist/studio/emit-project.js +14 -1
  362. package/dist/studio/index.js +1 -1
  363. package/dist/studio/project.d.ts +11 -2
  364. package/dist/studio/project.js +5 -2
  365. package/dist/studio/ui-components.generated.js +170 -3
  366. package/dist/sveltekit/in-memory.d.ts +2 -2
  367. package/dist/sveltekit/in-memory.js +125 -4
  368. package/dist/sveltekit/index.d.ts +1 -1
  369. package/dist/sveltekit/index.js +1 -1
  370. package/dist/sveltekit/query-plan.d.ts +50 -4
  371. package/dist/sveltekit/query-plan.js +25 -3
  372. package/dist/sveltekit/sql-source.d.ts +6 -0
  373. package/dist/sveltekit/sql-source.js +34 -6
  374. package/dist/sveltekit/sql.d.ts +31 -0
  375. package/dist/sveltekit/sql.js +135 -25
  376. package/dist/sveltekit/transport.d.ts +10 -2
  377. package/dist/sveltekit/transport.js +30 -6
  378. package/dist/upgrade-prompt.d.ts +1 -1
  379. package/dist/version.d.ts +1 -1
  380. package/dist/version.js +1 -1
  381. package/dist/watermark.js +35 -2
  382. package/dist/wc/GridMenus-By9vPuq0.js +1088 -0
  383. package/dist/wc/SvChartMenu-CQNrQGT2.js +308 -0
  384. package/dist/wc/SvDateRangeInput-DR6m7bSM.js +199 -0
  385. package/dist/wc/SvDateTimePicker-D-vRnaMo.js +771 -0
  386. package/dist/wc/SvField-B_kurx_P.js +149 -0
  387. package/dist/wc/SvGrid.helpers-BdVDtjUm.js +135 -0
  388. package/dist/wc/SvGridCellEditor-Bnf1Kr5C.js +560 -0
  389. package/dist/wc/SvGridChart-BqUJh2pG.js +3572 -0
  390. package/dist/wc/SvGridChartBuilder-CGycC5cn.js +988 -0
  391. package/dist/wc/SvGridChartPanel-CRnizsHD.js +1746 -0
  392. package/dist/wc/SvGridChartView-D1pa_xMy.js +47 -0
  393. package/dist/wc/SvGridDropdown-45WsObLL.js +259 -0
  394. package/dist/wc/SvModal-DrfOYYyX.js +189 -0
  395. package/dist/wc/cell-formatting-CBfgahv1.js +86 -0
  396. package/dist/wc/chart-6OXlybVT.js +4341 -0
  397. package/dist/wc/chart-export-CeSADGfi.js +135 -0
  398. package/dist/wc/chart-export-pdf-BGko7MER.js +104 -0
  399. package/dist/wc/chart-summary-2m3ia1-n.js +137 -0
  400. package/dist/wc/chart-trend-CQOQtTMl.js +50 -0
  401. package/dist/wc/chart-validate-CD6ptiwg.js +180 -0
  402. package/dist/wc/client-DQIzjDBG.js +3064 -0
  403. package/dist/wc/column-resize-DUPgynvc.js +101 -0
  404. package/dist/wc/date-format-DS-z_h9v.js +1130 -0
  405. package/dist/wc/dismissable-CQ6XFXsk.js +45 -0
  406. package/dist/wc/editor-contract-peBDxir_.js +22 -0
  407. package/dist/wc/editor-registry-DxGKqcvx.js +24 -0
  408. package/dist/wc/focus-trap-Dbb2tJxb.js +65 -0
  409. package/dist/wc/list-option-DrRyivWp.js +82 -0
  410. package/dist/wc/popover-WsGlvtQv.js +69 -0
  411. package/dist/wc/positioning-BiKLfu1E.js +112 -0
  412. package/dist/wc/react.d.ts +41 -0
  413. package/dist/wc/react.js +90 -0
  414. package/dist/wc/rolldown-runtime-Dy4uBu1J.js +11 -0
  415. package/dist/wc/row-drag-touch-CycRR65n.js +93 -0
  416. package/dist/wc/row-resize-limG_N1z.js +111 -0
  417. package/dist/wc/sv-sheet-element.d.ts +97 -0
  418. package/dist/wc/sv-sheet-element.js +44213 -0
  419. package/dist/wc/svelte-virtualizer.svelte-CXtQy2TQ.js +530 -0
  420. package/dist/wc/validate-BqDthkNr.js +88 -0
  421. package/dist/wc/vue.d.ts +31 -0
  422. package/dist/wc/vue.js +75 -0
  423. package/package.json +36 -6
  424. package/dist/designer/assets/GridMenus-B1JtIN21.js +0 -8
  425. package/dist/designer/assets/SvDateRangeInput-CjO7nn_x.js +0 -1
  426. package/dist/designer/assets/SvDateTimePicker-ByBD_ov6.js +0 -1
  427. package/dist/designer/assets/SvField-YDLipR6O.css +0 -1
  428. package/dist/designer/assets/SvField-cj1PFNgZ.js +0 -1
  429. package/dist/designer/assets/SvGridCellEditor-0W1L2hJ1.js +0 -2
  430. package/dist/designer/assets/SvGridChart-DBOR4xcz.js +0 -2
  431. package/dist/designer/assets/SvGridChart-fkMWeh1J.css +0 -1
  432. package/dist/designer/assets/SvGridChartPanel-symrhNnR.js +0 -11
  433. package/dist/designer/assets/SvGridChartView-BmRxq6mU.js +0 -1
  434. package/dist/designer/assets/SvGridDropdown-Bb3HH2Aj.js +0 -1
  435. package/dist/designer/assets/SvListBox-1oUF6Iav.js +0 -110
  436. package/dist/designer/assets/cell-formatting-wr5wm7US.js +0 -1
  437. package/dist/designer/assets/chart-DXFganU8.js +0 -1
  438. package/dist/designer/assets/column-resize-C_inr5zT.js +0 -1
  439. package/dist/designer/assets/date-format-DGagAqRc.css +0 -1
  440. package/dist/designer/assets/date-format-onlYDsrY.js +0 -1
  441. package/dist/designer/assets/easing-zaypKrr0.js +0 -3
  442. package/dist/designer/assets/index-k2stW6L8.css +0 -1
  443. package/dist/designer/assets/row-resize-B0FWHcNr.js +0 -1
  444. package/dist/designer/assets/src-D9p27OGC.js +0 -58
  445. package/dist/designer/assets/validate-h-aslRV9.js +0 -1
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Formula lexer.
3
+ *
4
+ * The awkward part of spreadsheet lexing is that `A1`, `A1:B2`, `Sheet1!A1`,
5
+ * `'Price list'!A1:B2`, `SUM(` and `TRUE` all start life as the same run of
6
+ * letters and digits. Rather than guess, the lexer reads the whole word plus
7
+ * whatever qualifies it (a `!` before, a `:` after, a `(` after) and decides
8
+ * once, with all of it in hand.
9
+ *
10
+ * `$` is part of a word here and stays in the text handed to `parseA1`, which
11
+ * is what keeps absolute references absolute.
12
+ */
13
+ import { type CellRef } from './address.js';
14
+ import { type BinaryOp, type SheetError } from './ast.js';
15
+ export type TableRefToken = {
16
+ t: 'table';
17
+ table: string | null;
18
+ column: string | null;
19
+ columnTo?: string | null;
20
+ specifier: '#All' | '#Data' | '#Headers' | '#Totals' | '#ThisRow';
21
+ };
22
+ export type Token = TableRefToken | {
23
+ t: 'num';
24
+ v: number;
25
+ } | {
26
+ t: 'str';
27
+ v: string;
28
+ } | {
29
+ t: 'bool';
30
+ v: boolean;
31
+ } | {
32
+ t: 'err';
33
+ v: SheetError;
34
+ } | {
35
+ t: 'ref';
36
+ ref: CellRef;
37
+ }
38
+ /** The spilled-range operator `A1#`: the anchor a spill is read from. */
39
+ | {
40
+ t: 'spill';
41
+ ref: CellRef;
42
+ } | {
43
+ t: 'range';
44
+ from: CellRef;
45
+ to: CellRef;
46
+ }
47
+ /** A 3D reference `Sheet1:Sheet3!A1`: the cell or rectangle on every sheet
48
+ * in the tab range. `from`/`to` carry no sheet of their own. */
49
+ | {
50
+ t: 'range3d';
51
+ sheetFrom: string;
52
+ sheetTo: string;
53
+ from: CellRef;
54
+ to: CellRef;
55
+ } | {
56
+ t: 'name';
57
+ v: string;
58
+ } | {
59
+ t: 'fn';
60
+ v: string;
61
+ } | {
62
+ t: 'op';
63
+ v: BinaryOp;
64
+ } | {
65
+ t: 'lparen';
66
+ } | {
67
+ t: 'rparen';
68
+ } | {
69
+ t: 'comma';
70
+ };
71
+ export declare function tokenize(src: string): Token[];
@@ -0,0 +1,355 @@
1
+ /**
2
+ * Formula lexer.
3
+ *
4
+ * The awkward part of spreadsheet lexing is that `A1`, `A1:B2`, `Sheet1!A1`,
5
+ * `'Price list'!A1:B2`, `SUM(` and `TRUE` all start life as the same run of
6
+ * letters and digits. Rather than guess, the lexer reads the whole word plus
7
+ * whatever qualifies it (a `!` before, a `:` after, a `(` after) and decides
8
+ * once, with all of it in hand.
9
+ *
10
+ * `$` is part of a word here and stays in the text handed to `parseA1`, which
11
+ * is what keeps absolute references absolute.
12
+ */
13
+ import { parseA1 } from './address.js';
14
+ import { FormulaError } from './ast.js';
15
+ const WORD = /[A-Za-z0-9$_.]/;
16
+ const SPECIFIERS = {
17
+ '#all': '#All',
18
+ '#data': '#Data',
19
+ '#headers': '#Headers',
20
+ '#totals': '#Totals',
21
+ '#this row': '#ThisRow',
22
+ };
23
+ /** The error values a formula can name, longest first so #NUM! cannot win
24
+ * the prefix of a longer code. */
25
+ const ERROR_LITERAL = /^(#NULL!|#DIV\/0!|#VALUE!|#NAME\?|#NUM!|#N\/A|#REF!|#SPILL!|#CALC!|#CYCLE!)/i;
26
+ const TWO_CHAR_OPS = new Set(['<=', '>=', '<>']);
27
+ const ONE_CHAR_OPS = '+-*/^%&=<>';
28
+ export function tokenize(src) {
29
+ const out = [];
30
+ let i = 0;
31
+ /** Index of the next non-space character, without consuming anything. */
32
+ const skipSpace = () => {
33
+ let j = i;
34
+ while (j < src.length && /\s/.test(src[j]))
35
+ j += 1;
36
+ return j;
37
+ };
38
+ const readWord = () => {
39
+ const start = i;
40
+ while (i < src.length && WORD.test(src[i]))
41
+ i += 1;
42
+ return src.slice(start, i);
43
+ };
44
+ /**
45
+ * Read a structured reference's bracket, having just consumed the `[`.
46
+ *
47
+ * The grammar is small but irregular: `[Amount]` is a column, `[@Amount]`
48
+ * is this row of it, `[#Totals]` is a specifier, and
49
+ * `[[Qty]:[Amount]]` is a span whose inner brackets are part of the
50
+ * syntax rather than nesting. Reading it as balanced brackets and then
51
+ * picking the pieces apart handles all four without a special case each.
52
+ */
53
+ const readTableBracket = (table) => {
54
+ let depth = 1;
55
+ const start = i;
56
+ while (i < src.length && depth > 0) {
57
+ if (src[i] === '[')
58
+ depth += 1;
59
+ else if (src[i] === ']')
60
+ depth -= 1;
61
+ if (depth > 0)
62
+ i += 1;
63
+ }
64
+ if (depth !== 0)
65
+ throw new FormulaError('#PARSE!');
66
+ const body = src.slice(start, i);
67
+ i += 1; // past the closing ]
68
+ let specifier = '#Data';
69
+ let column = null;
70
+ let columnTo = null;
71
+ // Split on top-level commas, so [#Data],[Amount] arrives as two parts.
72
+ const parts = [];
73
+ let current = '';
74
+ let inner = 0;
75
+ for (const ch of body) {
76
+ if (ch === '[')
77
+ inner += 1;
78
+ else if (ch === ']')
79
+ inner -= 1;
80
+ if (ch === ',' && inner === 0) {
81
+ parts.push(current);
82
+ current = '';
83
+ continue;
84
+ }
85
+ current += ch;
86
+ }
87
+ parts.push(current);
88
+ for (const rawPart of parts) {
89
+ let part = rawPart.trim();
90
+ if (part === '')
91
+ continue;
92
+ if (part.startsWith('@')) {
93
+ specifier = '#ThisRow';
94
+ part = part.slice(1).trim();
95
+ if (part === '')
96
+ continue;
97
+ }
98
+ const known = SPECIFIERS[part.toLowerCase()];
99
+ if (known) {
100
+ specifier = known;
101
+ continue;
102
+ }
103
+ // A span: [Qty]:[Amount]
104
+ const span = /^\[([^\]]*)\]\s*:\s*\[([^\]]*)\]$/.exec(part);
105
+ if (span) {
106
+ column = span[1].trim();
107
+ columnTo = span[2].trim();
108
+ continue;
109
+ }
110
+ // A single bracketed part, which is how a name containing a space or a
111
+ // comma is written - and also how a specifier arrives inside a
112
+ // multi-part reference like [[#Headers],[Amount]], so unwrap FIRST
113
+ // and re-check before assuming it names a column.
114
+ const wrapped = /^\[([^\]]*)\]$/.exec(part);
115
+ const unwrapped = (wrapped ? wrapped[1] : part).trim();
116
+ const inner = SPECIFIERS[unwrapped.toLowerCase()];
117
+ if (inner) {
118
+ specifier = inner;
119
+ continue;
120
+ }
121
+ if (unwrapped.startsWith('@')) {
122
+ specifier = '#ThisRow';
123
+ const rest = unwrapped.slice(1).trim();
124
+ if (rest !== '')
125
+ column = rest;
126
+ continue;
127
+ }
128
+ column = unwrapped;
129
+ }
130
+ return columnTo === null
131
+ ? { t: 'table', table, column, specifier }
132
+ : { t: 'table', table, column, columnTo, specifier };
133
+ };
134
+ /** Turn a word (and possibly `:word` after it) into a ref, range or name. */
135
+ const pushWord = (word, sheet) => {
136
+ const left = parseA1(word, sheet);
137
+ // Excel accepts whitespace around the range colon: `SUM(A1 : B2)`. Look
138
+ // past it before deciding this is a lone reference, or that formula comes
139
+ // back unparseable.
140
+ const afterSpace = skipSpace();
141
+ if (src[afterSpace] === ':') {
142
+ i = afterSpace + 1;
143
+ while (i < src.length && /\s/.test(src[i]))
144
+ i += 1;
145
+ const rightWord = readWord();
146
+ const right = parseA1(rightWord, sheet);
147
+ if (!left || !right)
148
+ throw new FormulaError('#PARSE!');
149
+ out.push({ t: 'range', from: left, to: right });
150
+ return;
151
+ }
152
+ if (!left)
153
+ throw new FormulaError('#PARSE!');
154
+ // A word with no row is a whole-column reference (`A:A` written as `A`),
155
+ // which is a range from row 0 to the end of the sheet.
156
+ if (left.row === null) {
157
+ // A bare word on a sheet-qualified ref is still a column. Unqualified,
158
+ // it could be a defined name - the parser decides using `name` tokens,
159
+ // so only emit a column range when the text looks like one.
160
+ if (sheet !== null) {
161
+ out.push({ t: 'range', from: { ...left, row: 0 }, to: { ...left, row: null } });
162
+ return;
163
+ }
164
+ out.push({ t: 'name', v: word });
165
+ return;
166
+ }
167
+ // `A1#` is the spilled-range operator: the `#` binds to the reference
168
+ // right before it, with no space between, and names the whole array the
169
+ // cell anchors. A `#` that starts an error literal is handled elsewhere;
170
+ // one sitting immediately after a cell is only ever this.
171
+ if (src[i] === '#') {
172
+ i += 1;
173
+ out.push({ t: 'spill', ref: left });
174
+ return;
175
+ }
176
+ out.push({ t: 'ref', ref: left });
177
+ };
178
+ while (i < src.length) {
179
+ const ch = src[i];
180
+ if (/\s/.test(ch)) {
181
+ i += 1;
182
+ continue;
183
+ }
184
+ if (ch === '(') {
185
+ out.push({ t: 'lparen' });
186
+ i += 1;
187
+ continue;
188
+ }
189
+ if (ch === ')') {
190
+ out.push({ t: 'rparen' });
191
+ i += 1;
192
+ continue;
193
+ }
194
+ if (ch === ',') {
195
+ out.push({ t: 'comma' });
196
+ i += 1;
197
+ continue;
198
+ }
199
+ // String literal. Excel escapes a quote by doubling it.
200
+ if (ch === '"') {
201
+ i += 1;
202
+ let value = '';
203
+ for (;;) {
204
+ if (i >= src.length)
205
+ throw new FormulaError('#PARSE!');
206
+ if (src[i] === '"') {
207
+ if (src[i + 1] === '"') {
208
+ value += '"';
209
+ i += 2;
210
+ continue;
211
+ }
212
+ i += 1;
213
+ break;
214
+ }
215
+ value += src[i];
216
+ i += 1;
217
+ }
218
+ out.push({ t: 'str', v: value });
219
+ continue;
220
+ }
221
+ // Quoted sheet name: 'Price list'!A1
222
+ if (ch === "'") {
223
+ i += 1;
224
+ let sheet = '';
225
+ for (;;) {
226
+ if (i >= src.length)
227
+ throw new FormulaError('#PARSE!');
228
+ if (src[i] === "'") {
229
+ if (src[i + 1] === "'") {
230
+ sheet += "'";
231
+ i += 2;
232
+ continue;
233
+ }
234
+ i += 1;
235
+ break;
236
+ }
237
+ sheet += src[i];
238
+ i += 1;
239
+ }
240
+ if (src[i] !== '!')
241
+ throw new FormulaError('#PARSE!');
242
+ i += 1;
243
+ pushWord(readWord(), sheet);
244
+ continue;
245
+ }
246
+ if (/[0-9]/.test(ch) || (ch === '.' && /[0-9]/.test(src[i + 1] ?? ''))) {
247
+ const start = i;
248
+ while (i < src.length && /[0-9.]/.test(src[i]))
249
+ i += 1;
250
+ // Scientific notation: 1e5, 2.5E-3.
251
+ if ((src[i] === 'e' || src[i] === 'E') && /[0-9+-]/.test(src[i + 1] ?? '')) {
252
+ i += 1;
253
+ if (src[i] === '+' || src[i] === '-')
254
+ i += 1;
255
+ while (i < src.length && /[0-9]/.test(src[i]))
256
+ i += 1;
257
+ }
258
+ const n = Number(src.slice(start, i));
259
+ if (!Number.isFinite(n))
260
+ throw new FormulaError('#PARSE!');
261
+ out.push({ t: 'num', v: n });
262
+ continue;
263
+ }
264
+ if (/[A-Za-z$_]/.test(ch)) {
265
+ const word = readWord();
266
+ const upper = word.toUpperCase();
267
+ // A 3D reference: Sheet1:Sheet3!A1, the same cell on every sheet in the
268
+ // tab range. The `!` after the second name is what tells it apart from
269
+ // an ordinary A1:B2 range, so on anything else this backtracks.
270
+ if (src[i] === ':') {
271
+ const save = i;
272
+ i += 1;
273
+ const second = readWord();
274
+ if (second !== '' && src[i] === '!') {
275
+ i += 1;
276
+ const from = parseA1(readWord(), null);
277
+ if (!from || from.row === null)
278
+ throw new FormulaError('#PARSE!');
279
+ let to = from;
280
+ if (src[i] === ':') {
281
+ i += 1;
282
+ const right = parseA1(readWord(), null);
283
+ if (!right || right.row === null)
284
+ throw new FormulaError('#PARSE!');
285
+ to = right;
286
+ }
287
+ out.push({ t: 'range3d', sheetFrom: word, sheetTo: second, from, to });
288
+ continue;
289
+ }
290
+ i = save;
291
+ }
292
+ // Unquoted sheet name: Orders!A1
293
+ if (src[i] === '!') {
294
+ i += 1;
295
+ pushWord(readWord(), word);
296
+ continue;
297
+ }
298
+ // A word followed by `[` is a table: Orders[Amount].
299
+ if (src[i] === '[') {
300
+ i += 1;
301
+ out.push(readTableBracket(word));
302
+ continue;
303
+ }
304
+ // A word followed by `(` is a call, whatever else it might look like -
305
+ // TRUE and FALSE included, since Excel has TRUE() and FALSE() as
306
+ // functions and that is how LibreOffice writes a boolean cell.
307
+ if (src[skipSpace()] === '(') {
308
+ out.push({ t: 'fn', v: upper });
309
+ continue;
310
+ }
311
+ if (upper === 'TRUE') {
312
+ out.push({ t: 'bool', v: true });
313
+ continue;
314
+ }
315
+ if (upper === 'FALSE') {
316
+ out.push({ t: 'bool', v: false });
317
+ continue;
318
+ }
319
+ pushWord(word, null);
320
+ continue;
321
+ }
322
+ // An error written into the formula: =#N/A, =IFERROR(A1, #REF!). Excel
323
+ // reads one as a value, and a file can carry an error cell as a formula
324
+ // that is nothing else.
325
+ if (ch === '#') {
326
+ const code = ERROR_LITERAL.exec(src.slice(i));
327
+ if (code) {
328
+ out.push({ t: 'err', v: code[0].toUpperCase() });
329
+ i += code[0].length;
330
+ continue;
331
+ }
332
+ throw new FormulaError('#PARSE!');
333
+ }
334
+ // A bare `[` is the unqualified form, which only means something in a
335
+ // formula sitting inside a table: [@Amount].
336
+ if (ch === '[') {
337
+ i += 1;
338
+ out.push(readTableBracket(null));
339
+ continue;
340
+ }
341
+ const two = src.slice(i, i + 2);
342
+ if (TWO_CHAR_OPS.has(two)) {
343
+ out.push({ t: 'op', v: two });
344
+ i += 2;
345
+ continue;
346
+ }
347
+ if (ONE_CHAR_OPS.includes(ch)) {
348
+ out.push({ t: 'op', v: ch });
349
+ i += 1;
350
+ continue;
351
+ }
352
+ throw new FormulaError('#PARSE!');
353
+ }
354
+ return out;
355
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Text to Columns and Remove Duplicates: the two one-shot transforms an Excel
3
+ * user reaches for on arriving data, before any formula work starts.
4
+ *
5
+ * Both are pure functions over cell text rather than commands that reach into
6
+ * a grid, because both are things a consumer may want to run from a button, a
7
+ * menu, a paste handler or a test, and none of those want a keystroke.
8
+ */
9
+ export type SplitOptions = {
10
+ /**
11
+ * Split on these strings. Excel's dialog offers tab, semicolon, comma, space
12
+ * and "other"; passing several splits on any of them.
13
+ */
14
+ delimiters?: ReadonlyArray<string>;
15
+ /** Treat runs of delimiters as one. Excel's "treat consecutive delimiters as
16
+ * one" checkbox, and what you want for space-separated text. */
17
+ collapse?: boolean;
18
+ /** Text inside these is not split, and the quotes come off. */
19
+ quote?: string;
20
+ /** Trim surrounding whitespace from each field. */
21
+ trim?: boolean;
22
+ /** Stop after this many fields, leaving the rest in the last one. Excel has
23
+ * no equivalent; it is here because "name: free text with: colons" is the
24
+ * common real case. */
25
+ limit?: number;
26
+ };
27
+ /**
28
+ * Split one string into fields.
29
+ *
30
+ * A scan rather than `String.split`, because a quoted field may contain a
31
+ * delimiter and a doubled quote is an escaped one. Splitting first and
32
+ * repairing afterwards is how CSV parsers get subtly wrong.
33
+ */
34
+ export declare function splitText(text: string, options?: SplitOptions): string[];
35
+ /**
36
+ * Split a column of text into a grid, padded so every row is the same width.
37
+ *
38
+ * Padding matters: writing a ragged result into a grid leaves whatever was
39
+ * already in the cell, so a row that split into two fields would keep stale
40
+ * text in the third column.
41
+ */
42
+ export declare function textToColumns(column: ReadonlyArray<string>, options?: SplitOptions): {
43
+ rows: string[][];
44
+ width: number;
45
+ };
46
+ /** Guess which delimiter a column uses, the way Excel's wizard previews one. */
47
+ export declare function guessDelimiter(column: ReadonlyArray<string>, candidates?: ReadonlyArray<string>): string | null;
48
+ export type DuplicateOptions = {
49
+ /** Column indexes that decide identity. Default: every column given. */
50
+ columns?: ReadonlyArray<number>;
51
+ /** Compare case-sensitively. Excel's Remove Duplicates is case
52
+ * INSENSITIVE, which surprises people, so that is the default here too. */
53
+ matchCase?: boolean;
54
+ /** Keep the last of each group rather than the first. */
55
+ keep?: 'first' | 'last';
56
+ };
57
+ export type DuplicateReport = {
58
+ /** Indexes into the input, in order, of the rows to keep. */
59
+ keep: number[];
60
+ /** Indexes of the rows that duplicate another. */
61
+ remove: number[];
62
+ };
63
+ /**
64
+ * Which rows are duplicates.
65
+ *
66
+ * Reports rather than removes, so the caller decides what removal means for
67
+ * its data structure, and so a UI can say "3 duplicates found, 5 unique values
68
+ * remain" before anything is written. That message is most of what Excel's
69
+ * dialog does.
70
+ */
71
+ export declare function findDuplicates(rows: ReadonlyArray<ReadonlyArray<unknown>>, options?: DuplicateOptions): DuplicateReport;
72
+ /** The rows that survive, in their original order, and how many went. */
73
+ export declare function removeDuplicates<T>(rows: ReadonlyArray<T>, toCells: (row: T) => ReadonlyArray<unknown>, options?: DuplicateOptions): {
74
+ rows: T[];
75
+ removed: number;
76
+ };
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Text to Columns and Remove Duplicates: the two one-shot transforms an Excel
3
+ * user reaches for on arriving data, before any formula work starts.
4
+ *
5
+ * Both are pure functions over cell text rather than commands that reach into
6
+ * a grid, because both are things a consumer may want to run from a button, a
7
+ * menu, a paste handler or a test, and none of those want a keystroke.
8
+ */
9
+ const DEFAULTS = {
10
+ delimiters: [','],
11
+ collapse: false,
12
+ quote: '"',
13
+ trim: false,
14
+ };
15
+ /**
16
+ * Split one string into fields.
17
+ *
18
+ * A scan rather than `String.split`, because a quoted field may contain a
19
+ * delimiter and a doubled quote is an escaped one. Splitting first and
20
+ * repairing afterwards is how CSV parsers get subtly wrong.
21
+ */
22
+ export function splitText(text, options = {}) {
23
+ const { delimiters, collapse, quote, trim } = { ...DEFAULTS, ...options };
24
+ const limit = options.limit;
25
+ // Longest first, so ", " wins over "," when both are offered.
26
+ const seps = [...delimiters].filter((d) => d !== '').sort((a, b) => b.length - a.length);
27
+ if (seps.length === 0)
28
+ return [text];
29
+ const out = [];
30
+ let current = '';
31
+ let inQuote = false;
32
+ let i = 0;
33
+ const push = () => {
34
+ out.push(trim ? current.trim() : current);
35
+ current = '';
36
+ };
37
+ while (i < text.length) {
38
+ const ch = text[i];
39
+ if (quote && ch === quote) {
40
+ if (inQuote && text[i + 1] === quote) {
41
+ current += quote;
42
+ i += 2;
43
+ continue;
44
+ }
45
+ inQuote = !inQuote;
46
+ i += 1;
47
+ continue;
48
+ }
49
+ if (!inQuote && (limit === undefined || out.length < limit - 1)) {
50
+ const hit = seps.find((sep) => text.startsWith(sep, i));
51
+ if (hit) {
52
+ push();
53
+ i += hit.length;
54
+ if (collapse) {
55
+ // Swallow the run that follows, so "a b" on a space delimiter
56
+ // gives two fields rather than four.
57
+ for (;;) {
58
+ const more = seps.find((sep) => text.startsWith(sep, i));
59
+ if (!more)
60
+ break;
61
+ i += more.length;
62
+ }
63
+ }
64
+ continue;
65
+ }
66
+ }
67
+ current += ch;
68
+ i += 1;
69
+ }
70
+ push();
71
+ return out;
72
+ }
73
+ /**
74
+ * Split a column of text into a grid, padded so every row is the same width.
75
+ *
76
+ * Padding matters: writing a ragged result into a grid leaves whatever was
77
+ * already in the cell, so a row that split into two fields would keep stale
78
+ * text in the third column.
79
+ */
80
+ export function textToColumns(column, options = {}) {
81
+ const rows = column.map((text) => splitText(text, options));
82
+ const width = rows.reduce((max, row) => Math.max(max, row.length), 0);
83
+ for (const row of rows) {
84
+ while (row.length < width)
85
+ row.push('');
86
+ }
87
+ return { rows, width };
88
+ }
89
+ /** Guess which delimiter a column uses, the way Excel's wizard previews one. */
90
+ export function guessDelimiter(column, candidates = ['\t', ';', ',', '|', ' ']) {
91
+ let best = null;
92
+ for (const sep of candidates) {
93
+ // A good delimiter appears in most rows AND the same number of times in
94
+ // each. A comma in one row out of fifty is prose, not structure.
95
+ const counts = column.map((text) => text.split(sep).length - 1);
96
+ const present = counts.filter((n) => n > 0).length;
97
+ if (present === 0)
98
+ continue;
99
+ const first = counts.find((n) => n > 0) ?? 0;
100
+ const consistent = counts.every((n) => n === 0 || n === first);
101
+ const score = present * (consistent ? 2 : 1);
102
+ if (!best || score > best.score)
103
+ best = { sep, score };
104
+ }
105
+ return best ? best.sep : null;
106
+ }
107
+ /**
108
+ * Which rows are duplicates.
109
+ *
110
+ * Reports rather than removes, so the caller decides what removal means for
111
+ * its data structure, and so a UI can say "3 duplicates found, 5 unique values
112
+ * remain" before anything is written. That message is most of what Excel's
113
+ * dialog does.
114
+ */
115
+ export function findDuplicates(rows, options = {}) {
116
+ const keepWhich = options.keep ?? 'first';
117
+ const matchCase = options.matchCase ?? false;
118
+ const keyOf = (row) => {
119
+ const cols = options.columns ?? row.map((_v, i) => i);
120
+ return cols
121
+ .map((c) => {
122
+ const v = row[c];
123
+ const text = v === null || v === undefined ? '' : String(v);
124
+ return matchCase ? text : text.toLowerCase();
125
+ })
126
+ // A separator a cell cannot contain. Joining on a space would make
127
+ // ["a", "b"] and ["a b"] the same row.
128
+ .join('\u0000');
129
+ };
130
+ const seen = new Map();
131
+ for (let i = 0; i < rows.length; i += 1) {
132
+ const key = keyOf(rows[i]);
133
+ if (!seen.has(key) || keepWhich === 'last')
134
+ seen.set(key, i);
135
+ }
136
+ const kept = new Set(seen.values());
137
+ const keep = [];
138
+ const remove = [];
139
+ for (let i = 0; i < rows.length; i += 1) {
140
+ if (kept.has(i))
141
+ keep.push(i);
142
+ else
143
+ remove.push(i);
144
+ }
145
+ return { keep, remove };
146
+ }
147
+ /** The rows that survive, in their original order, and how many went. */
148
+ export function removeDuplicates(rows, toCells, options = {}) {
149
+ const report = findDuplicates(rows.map(toCells), options);
150
+ return {
151
+ rows: report.keep.map((i) => rows[i]),
152
+ removed: report.remove.length,
153
+ };
154
+ }