@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,295 @@
1
+ /**
2
+ * Excel's AutoFilter: arrows on the header row of a region, each opening a
3
+ * menu of the column's values to tick and untick, or a condition (equals,
4
+ * greater than, contains, between...), and the rows that fail fold away.
5
+ * The rows are hidden through the grid's collapsed rows, kept apart from
6
+ * the rows the user hid by hand so Unhide and the saved document see
7
+ * only those.
8
+ *
9
+ * This module is the pure part: the state, the values a column offers,
10
+ * which rows a state hides, and how the state moves with an insert or
11
+ * delete. Conditions run through the grid's own Excel-filter compiler, so
12
+ * the operator semantics are the ones the grid's filter row has.
13
+ */
14
+ import { compileExcelFilter } from '@svgrid/grid/filtering';
15
+ import { isError } from './ast.js';
16
+ import { shiftRect, lineShift } from './rects.js';
17
+ import { dateValue } from './validation.js';
18
+ /** The operators that compare as numbers; the rest compare the display text. */
19
+ const NUMERIC_OPS = new Set(['greaterThan', 'lessThan', 'between']);
20
+ /**
21
+ * The values a column offers, each once with its count: numbers first
22
+ * in order, then text A to Z, the blanks last. `rowVisible` leaves out the
23
+ * rows other columns' filters hide, as Excel's list does.
24
+ */
25
+ export function distinctValues(state, col, valueAt, displayAt, rowVisible = () => true) {
26
+ const seen = new Map();
27
+ for (let r = state.range[0] + 1; r <= state.range[2]; r += 1) {
28
+ if (!rowVisible(r))
29
+ continue;
30
+ const text = displayAt(r, col);
31
+ const v = valueAt(r, col);
32
+ const entry = seen.get(text);
33
+ if (entry) {
34
+ entry.count += 1;
35
+ continue;
36
+ }
37
+ seen.set(text, { text, count: 1, numeric: typeof v === 'number' && Number.isFinite(v) ? v : null });
38
+ }
39
+ return [...seen.values()].sort((a, b) => {
40
+ if (a.text === '')
41
+ return 1;
42
+ if (b.text === '')
43
+ return -1;
44
+ if (a.numeric !== null && b.numeric !== null)
45
+ return a.numeric - b.numeric;
46
+ if (a.numeric !== null)
47
+ return -1;
48
+ if (b.numeric !== null)
49
+ return 1;
50
+ return a.text.localeCompare(b.text, undefined, { sensitivity: 'base' });
51
+ });
52
+ }
53
+ function passesCondition(cond, value, display) {
54
+ const test = compileExcelFilter({ id: 'f', operator: cond.op, value: cond.value, valueTo: cond.valueTo });
55
+ if (NUMERIC_OPS.has(cond.op)) {
56
+ if (typeof value !== 'number' || !Number.isFinite(value))
57
+ return false;
58
+ return test(value);
59
+ }
60
+ if (cond.op === 'isBlank' || cond.op === 'isNotBlank')
61
+ return test(display === '' ? null : display);
62
+ return test(isError(value) ? value.error : display);
63
+ }
64
+ const DAY_MS = 86400000;
65
+ const dayStart = (d) => Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate());
66
+ /**
67
+ * The first and last day of a period, as UTC day-start milliseconds,
68
+ * counted from `today`. Weeks run Sunday to Saturday; quarters are the
69
+ * calendar's. The typed periods read `value` and `valueTo`.
70
+ */
71
+ export function datePeriodBounds(filter, today = new Date()) {
72
+ const t = dayStart(today);
73
+ const y = today.getUTCFullYear();
74
+ const m = today.getUTCMonth();
75
+ const q = Math.floor(m / 3);
76
+ const sunday = t - today.getUTCDay() * DAY_MS;
77
+ const month = (yy, mm) => [Date.UTC(yy, mm, 1), Date.UTC(yy, mm + 1, 0)];
78
+ const quarter = (yy, qq) => [Date.UTC(yy, qq * 3, 1), Date.UTC(yy, qq * 3 + 3, 0)];
79
+ const typed = (text) => {
80
+ if (!text)
81
+ return null;
82
+ const ms = dateValue(text.trim());
83
+ return ms === null ? null : dayStart(new Date(ms));
84
+ };
85
+ switch (filter.period) {
86
+ case 'today': return [t, t];
87
+ case 'yesterday': return [t - DAY_MS, t - DAY_MS];
88
+ case 'tomorrow': return [t + DAY_MS, t + DAY_MS];
89
+ case 'thisWeek': return [sunday, sunday + 6 * DAY_MS];
90
+ case 'lastWeek': return [sunday - 7 * DAY_MS, sunday - DAY_MS];
91
+ case 'nextWeek': return [sunday + 7 * DAY_MS, sunday + 13 * DAY_MS];
92
+ case 'thisMonth': return month(y, m);
93
+ case 'lastMonth': return month(y, m - 1);
94
+ case 'nextMonth': return month(y, m + 1);
95
+ case 'thisQuarter': return quarter(y, q);
96
+ case 'lastQuarter': return q === 0 ? quarter(y - 1, 3) : quarter(y, q - 1);
97
+ case 'nextQuarter': return q === 3 ? quarter(y + 1, 0) : quarter(y, q + 1);
98
+ case 'thisYear': return [Date.UTC(y, 0, 1), Date.UTC(y, 11, 31)];
99
+ case 'lastYear': return [Date.UTC(y - 1, 0, 1), Date.UTC(y - 1, 11, 31)];
100
+ case 'nextYear': return [Date.UTC(y + 1, 0, 1), Date.UTC(y + 1, 11, 31)];
101
+ case 'yearToDate': return [Date.UTC(y, 0, 1), t];
102
+ case 'equals': {
103
+ const d = typed(filter.value);
104
+ return d === null ? null : [d, d];
105
+ }
106
+ case 'before': {
107
+ const d = typed(filter.value);
108
+ return d === null ? null : [-Infinity, d - DAY_MS];
109
+ }
110
+ case 'after': {
111
+ const d = typed(filter.value);
112
+ return d === null ? null : [d + DAY_MS, Infinity];
113
+ }
114
+ case 'between': {
115
+ const a = typed(filter.value);
116
+ const b = typed(filter.valueTo);
117
+ return a === null || b === null ? null : [Math.min(a, b), Math.max(a, b)];
118
+ }
119
+ }
120
+ }
121
+ const sameFill = (a, b) => (a ?? '').trim().toLowerCase() === (b ?? '').trim().toLowerCase();
122
+ /**
123
+ * Whether a row passes one column's filter. A Top 10 filter needs the
124
+ * whole column to know its threshold, which `hiddenRowsFor` works out and
125
+ * passes as `topPasses`; on its own the filter passes everything.
126
+ */
127
+ export function passesFilter(filter, value, display, extra = {}) {
128
+ switch (filter.kind) {
129
+ case 'values': return filter.included ? filter.included.includes(display) : !filter.excluded.includes(display);
130
+ case 'date': {
131
+ const bounds = datePeriodBounds(filter, extra.today);
132
+ if (!bounds)
133
+ return true;
134
+ const ms = dateValue(value);
135
+ if (ms === null)
136
+ return false;
137
+ const day = dayStart(new Date(ms));
138
+ return day >= bounds[0] && day <= bounds[1];
139
+ }
140
+ case 'color': return sameFill(extra.fill ?? null, filter.fill);
141
+ case 'top': return extra.topPasses ? extra.topPasses(value) : true;
142
+ default: {
143
+ const first = passesCondition(filter.first, value, display);
144
+ if (!filter.second)
145
+ return first;
146
+ const second = passesCondition(filter.second, value, display);
147
+ return filter.join === 'or' ? first || second : first && second;
148
+ }
149
+ }
150
+ }
151
+ /** The test a Top 10 filter applies once the column's numbers are known:
152
+ * the values at or past the threshold, counted over the whole region as
153
+ * Excel counts them, whatever the other columns hide. */
154
+ function topPassesFor(filter, numbers) {
155
+ if (!numbers.length)
156
+ return () => false;
157
+ const sorted = numbers.slice().sort((a, b) => (filter.top ? b - a : a - b));
158
+ const count = filter.percent ? Math.round((filter.count / 100) * sorted.length) : filter.count;
159
+ const keep = Math.max(0, Math.min(sorted.length, Math.trunc(count)));
160
+ if (keep === 0)
161
+ return () => false;
162
+ const threshold = sorted[keep - 1];
163
+ return (value) => typeof value === 'number' && Number.isFinite(value) && (filter.top ? value >= threshold : value <= threshold);
164
+ }
165
+ /**
166
+ * The rows the state hides: every row of the region under the header
167
+ * that fails a column's filter. Blanks past the region's edge are not in
168
+ * it, as Excel's region is what was filtered.
169
+ */
170
+ export function hiddenRowsFor(state, valueAt, displayAt, ctx = {}) {
171
+ const out = new Set();
172
+ if (!state)
173
+ return out;
174
+ const columns = Object.entries(state.filters).map(([c, f]) => [Number(c), f]);
175
+ if (!columns.length)
176
+ return out;
177
+ const tops = new Map();
178
+ for (const [c, filter] of columns) {
179
+ if (filter.kind !== 'top')
180
+ continue;
181
+ const numbers = [];
182
+ for (let r = state.range[0] + 1; r <= state.range[2]; r += 1) {
183
+ const v = valueAt(r, c);
184
+ if (typeof v === 'number' && Number.isFinite(v))
185
+ numbers.push(v);
186
+ }
187
+ tops.set(c, topPassesFor(filter, numbers));
188
+ }
189
+ for (let r = state.range[0] + 1; r <= state.range[2]; r += 1) {
190
+ for (const [c, filter] of columns) {
191
+ const extra = {
192
+ today: ctx.today,
193
+ fill: filter.kind === 'color' ? ctx.fillAt?.(r, c) ?? null : undefined,
194
+ topPasses: tops.get(c),
195
+ };
196
+ if (!passesFilter(filter, valueAt(r, c), displayAt(r, c), extra)) {
197
+ out.add(r);
198
+ break;
199
+ }
200
+ }
201
+ }
202
+ return out;
203
+ }
204
+ /** The fills a column's cells carry, each once, first seen first; null
205
+ * stands for the cells with none. Excel's Filter by Color list. */
206
+ export function distinctFills(state, col, fillAt) {
207
+ const seen = [];
208
+ for (let r = state.range[0] + 1; r <= state.range[2]; r += 1) {
209
+ const fill = fillAt(r, col);
210
+ const key = fill ? fill.trim().toLowerCase() : null;
211
+ if (!seen.some((f) => sameFill(f, key)))
212
+ seen.push(key);
213
+ }
214
+ return seen;
215
+ }
216
+ /** Whether a column reads as dates: every cell with something in it holds one. */
217
+ export function isDateColumn(values) {
218
+ const filled = values.filter((v) => v.text !== '');
219
+ return filled.length > 0 && filled.every((v) => v.numeric === null && dateValue(v.text) !== null);
220
+ }
221
+ /** Whether any column is filtered. */
222
+ export function isFiltering(state) {
223
+ return !!state && Object.keys(state.filters).length > 0;
224
+ }
225
+ /** The state with one column's filter set, or cleared with null. */
226
+ export function withColumnFilter(state, col, filter) {
227
+ const filters = { ...state.filters };
228
+ if (filter === null)
229
+ delete filters[col];
230
+ else
231
+ filters[col] = filter;
232
+ return { range: state.range, filters };
233
+ }
234
+ /** A values filter from the ticked list, or null when everything is ticked. */
235
+ export function valuesFilter(all, ticked) {
236
+ const excluded = all.filter((text) => !ticked.has(text));
237
+ return excluded.length ? { kind: 'values', excluded } : null;
238
+ }
239
+ /** The state after an insert or delete: the region moves, the filters follow their columns. */
240
+ export function shiftAutoFilter(state, edit) {
241
+ if (!state)
242
+ return null;
243
+ const range = shiftRect(state.range, edit);
244
+ if (!range)
245
+ return null;
246
+ if (edit.kind === 'insertRows' || edit.kind === 'deleteRows')
247
+ return { range, filters: { ...state.filters } };
248
+ const shift = lineShift(edit);
249
+ const filters = {};
250
+ for (const [c, f] of Object.entries(state.filters)) {
251
+ const next = shift(Number(c));
252
+ if (next !== null)
253
+ filters[next] = f;
254
+ }
255
+ return { range, filters };
256
+ }
257
+ const OP_WORDS = {
258
+ equals: 'equals', notEquals: 'does not equal', greaterThan: 'is greater than', lessThan: 'is less than',
259
+ between: 'is between', contains: 'contains', notContains: 'does not contain', startsWith: 'begins with',
260
+ endsWith: 'ends with', isBlank: 'is blank', isNotBlank: 'is not blank',
261
+ };
262
+ const PERIOD_WORDS = {
263
+ equals: 'equals', before: 'is before', after: 'is after', between: 'is between',
264
+ tomorrow: 'tomorrow', today: 'today', yesterday: 'yesterday',
265
+ nextWeek: 'next week', thisWeek: 'this week', lastWeek: 'last week',
266
+ nextMonth: 'next month', thisMonth: 'this month', lastMonth: 'last month',
267
+ nextQuarter: 'next quarter', thisQuarter: 'this quarter', lastQuarter: 'last quarter',
268
+ nextYear: 'next year', thisYear: 'this year', lastYear: 'last year', yearToDate: 'year to date',
269
+ };
270
+ /** A filter in words, for the menu's heading. */
271
+ export function describeFilter(filter) {
272
+ if (filter.kind === 'values' && filter.included)
273
+ return filter.included.length === 1 ? '1 value shown' : `${filter.included.length} values shown`;
274
+ if (filter.kind === 'values')
275
+ return filter.excluded.length === 1 ? '1 value hidden' : `${filter.excluded.length} values hidden`;
276
+ if (filter.kind === 'date') {
277
+ const word = PERIOD_WORDS[filter.period];
278
+ if (filter.period === 'between')
279
+ return `${word} ${filter.value ?? ''} and ${filter.valueTo ?? ''}`;
280
+ if (filter.period === 'equals' || filter.period === 'before' || filter.period === 'after')
281
+ return `${word} ${filter.value ?? ''}`;
282
+ return word;
283
+ }
284
+ if (filter.kind === 'color')
285
+ return filter.fill ? `filled ${filter.fill}` : 'no fill';
286
+ if (filter.kind === 'top')
287
+ return `${filter.top ? 'top' : 'bottom'} ${filter.count}${filter.percent ? ' percent' : ''}`;
288
+ const one = (c) => {
289
+ const word = OP_WORDS[c.op] ?? c.op;
290
+ if (c.op === 'isBlank' || c.op === 'isNotBlank')
291
+ return word;
292
+ return c.op === 'between' ? `${word} ${c.value ?? ''} and ${c.valueTo ?? ''}` : `${word} ${c.value ?? ''}`;
293
+ };
294
+ return filter.second ? `${one(filter.first)} ${filter.join ?? 'and'} ${one(filter.second)}` : one(filter.first);
295
+ }
@@ -0,0 +1,51 @@
1
+ export type FunctionSuggestion = {
2
+ name: string;
3
+ /** Where the partial name starts, so accepting can splice it out. */
4
+ start: number;
5
+ /** Where the caret is, i.e. where the partial name ends. */
6
+ end: number;
7
+ };
8
+ /**
9
+ * The evaluator dispatches these itself, so they are not in the table.
10
+ *
11
+ * Exported because `function-catalog.ts` needs the same list: it kept a
12
+ * copy of its own, the copy fell behind this one, and Insert Function
13
+ * quietly stopped listing LET, LAMBDA, the lambda helpers and SUBTOTAL
14
+ * even though it carried written descriptions for them. One list now.
15
+ */
16
+ export declare const EVALUATOR_NAMES: string[];
17
+ /** Signature hints, for the ones whose argument order is not obvious. */
18
+ export declare const SIGNATURES: Record<string, string>;
19
+ /**
20
+ * The word being typed immediately before the caret, if it could be a function
21
+ * name. Returns null when the caret is not in a formula, or sits somewhere a
22
+ * function name cannot start (inside a string, or right after a reference).
23
+ */
24
+ export declare function partialAt(text: string, caret: number): {
25
+ word: string;
26
+ start: number;
27
+ } | null;
28
+ /**
29
+ * Function names matching what is being typed.
30
+ *
31
+ * Prefix matches first, then anything merely containing the text, so typing
32
+ * "look" still finds VLOOKUP. Within each group, SHORTER names rank first:
33
+ * alphabetical order puts SUBSTITUTE above SUM for "SU", which is exactly
34
+ * backwards from what someone typing two letters wants.
35
+ */
36
+ export declare function suggestFunctions(text: string, caret: number, limit?: number): FunctionSuggestion[];
37
+ /** Splice an accepted suggestion in, leaving the caret inside the parens. */
38
+ export declare function applySuggestion(text: string, suggestion: FunctionSuggestion): {
39
+ text: string;
40
+ caret: number;
41
+ };
42
+ /**
43
+ * Close the parentheses a formula left open, the way Excel corrects
44
+ * "=SUM(A1:A3" to "=SUM(A1:A3)" when it is entered. Quoted text is skipped,
45
+ * so a ")" inside a string neither closes nor needs closing. Text that is
46
+ * not a formula, or has more closers than openers, is returned as it is:
47
+ * that one is an error the engine should report, not paper over.
48
+ */
49
+ export declare function balanceParens(text: string): string;
50
+ /** The signature hint for whatever call the caret is inside, if any. */
51
+ export declare function signatureAt(text: string, caret: number): string | null;
@@ -0,0 +1,248 @@
1
+ /**
2
+ * Formula-bar autocomplete, kept out of the component so the interesting part
3
+ * is testable without mounting anything.
4
+ *
5
+ * The job is narrow: given the text in the bar and where the caret is, work out
6
+ * whether the user is partway through typing a function name, and if so which
7
+ * ones match. Everything else (arrow keys, accepting a suggestion) is a list
8
+ * with an index, which the component owns.
9
+ */
10
+ import { FUNCTIONS } from './functions.js';
11
+ import { ARRAY_FUNCTIONS } from './packs/array.js';
12
+ /**
13
+ * The evaluator dispatches these itself, so they are not in the table.
14
+ *
15
+ * Exported because `function-catalog.ts` needs the same list: it kept a
16
+ * copy of its own, the copy fell behind this one, and Insert Function
17
+ * quietly stopped listing LET, LAMBDA, the lambda helpers and SUBTOTAL
18
+ * even though it carried written descriptions for them. One list now.
19
+ */
20
+ export const EVALUATOR_NAMES = ['IF', 'IFS', 'IFERROR', 'IFNA', 'SWITCH', 'ISERROR', 'ISERR', 'ISNA', 'ROW', 'COLUMN', 'ADDRESS', 'OFFSET', 'INDIRECT', 'SUBTOTAL',
21
+ // LET, LAMBDA and the helpers that take one: the evaluator answers these
22
+ // itself, since a lambda is an AST rather than a value.
23
+ 'LET', 'LAMBDA', 'MAP', 'BYROW', 'BYCOL', 'REDUCE', 'SCAN', 'MAKEARRAY'];
24
+ const NAMES = [...new Set([...Object.keys(FUNCTIONS), ...Object.keys(ARRAY_FUNCTIONS), ...EVALUATOR_NAMES])].sort();
25
+ /** Signature hints, for the ones whose argument order is not obvious. */
26
+ export const SIGNATURES = {
27
+ LET: 'LET(name, value, ..., calculation)',
28
+ LAMBDA: 'LAMBDA(parameter, ..., calculation)',
29
+ MAP: 'MAP(array, ..., lambda)',
30
+ BYROW: 'BYROW(array, lambda)',
31
+ BYCOL: 'BYCOL(array, lambda)',
32
+ REDUCE: 'REDUCE(initial, array, lambda)',
33
+ SCAN: 'SCAN(initial, array, lambda)',
34
+ MAKEARRAY: 'MAKEARRAY(rows, columns, lambda)',
35
+ VLOOKUP: 'VLOOKUP(lookup, table, colIndex, [rangeLookup])',
36
+ HLOOKUP: 'HLOOKUP(lookup, table, rowIndex, [rangeLookup])',
37
+ XLOOKUP: 'XLOOKUP(lookup, haystack, results, [ifMissing], [matchMode], [searchMode])',
38
+ INDEX: 'INDEX(range, row, [col])',
39
+ MATCH: 'MATCH(lookup, range, [mode])',
40
+ SUMIF: 'SUMIF(range, criterion, [sumRange])',
41
+ SUMIFS: 'SUMIFS(sumRange, range, criterion, ...)',
42
+ SUBTOTAL: 'SUBTOTAL(code, range, ...)',
43
+ TRUE: 'TRUE()',
44
+ FALSE: 'FALSE()',
45
+ COUNTIF: 'COUNTIF(range, criterion)',
46
+ COUNTIFS: 'COUNTIFS(range, criterion, ...)',
47
+ AVERAGEIF: 'AVERAGEIF(range, criterion, [avgRange])',
48
+ IF: 'IF(condition, then, else)',
49
+ IFS: 'IFS(condition, value, ...)',
50
+ IFERROR: 'IFERROR(value, fallback)',
51
+ SWITCH: 'SWITCH(subject, case, value, ..., [default])',
52
+ ROUND: 'ROUND(number, digits)',
53
+ TEXT: 'TEXT(number, pattern)',
54
+ TEXTJOIN: 'TEXTJOIN(separator, skipEmpty, ...)',
55
+ SUBSTITUTE: 'SUBSTITUTE(text, find, replace)',
56
+ MID: 'MID(text, start, length)',
57
+ DATE: 'DATE(year, month, day)',
58
+ EOMONTH: 'EOMONTH(date, months)',
59
+ PMT: 'PMT(rate, nper, pv, [fv], [type])',
60
+ IPMT: 'IPMT(rate, per, nper, pv, [fv], [type])',
61
+ PPMT: 'PPMT(rate, per, nper, pv, [fv], [type])',
62
+ PV: 'PV(rate, nper, pmt, [fv], [type])',
63
+ FV: 'FV(rate, nper, pmt, [pv], [type])',
64
+ NPER: 'NPER(rate, pmt, pv, [fv], [type])',
65
+ RATE: 'RATE(nper, pmt, pv, [fv], [type], [guess])',
66
+ NPV: 'NPV(rate, value1, ...)',
67
+ IRR: 'IRR(values, [guess])',
68
+ SLN: 'SLN(cost, salvage, life)',
69
+ SUMPRODUCT: 'SUMPRODUCT(array1, [array2], ...)',
70
+ CEILING: 'CEILING(number, significance)',
71
+ 'CEILING.MATH': 'CEILING.MATH(number, [significance], [mode])',
72
+ FLOOR: 'FLOOR(number, significance)',
73
+ 'FLOOR.MATH': 'FLOOR.MATH(number, [significance], [mode])',
74
+ MROUND: 'MROUND(number, multiple)',
75
+ TRUNC: 'TRUNC(number, [digits])',
76
+ LOG: 'LOG(number, [base])',
77
+ RANDBETWEEN: 'RANDBETWEEN(bottom, top)',
78
+ QUOTIENT: 'QUOTIENT(numerator, denominator)',
79
+ LARGE: 'LARGE(range, k)',
80
+ SMALL: 'SMALL(range, k)',
81
+ PERCENTILE: 'PERCENTILE(range, k)',
82
+ 'PERCENTILE.INC': 'PERCENTILE.INC(range, k)',
83
+ 'PERCENTILE.EXC': 'PERCENTILE.EXC(range, k)',
84
+ QUARTILE: 'QUARTILE(range, quart)',
85
+ 'QUARTILE.INC': 'QUARTILE.INC(range, quart)',
86
+ 'QUARTILE.EXC': 'QUARTILE.EXC(range, quart)',
87
+ AVERAGEIFS: 'AVERAGEIFS(avgRange, range, criterion, ...)',
88
+ MAXIFS: 'MAXIFS(maxRange, range, criterion, ...)',
89
+ MINIFS: 'MINIFS(minRange, range, criterion, ...)',
90
+ CORREL: 'CORREL(range1, range2)',
91
+ SLOPE: 'SLOPE(known_ys, known_xs)',
92
+ INTERCEPT: 'INTERCEPT(known_ys, known_xs)',
93
+ FORECAST: 'FORECAST(x, known_ys, known_xs)',
94
+ 'FORECAST.LINEAR': 'FORECAST.LINEAR(x, known_ys, known_xs)',
95
+ REPT: 'REPT(text, count)',
96
+ IMAGE: 'IMAGE(source, [alt_text])',
97
+ NUMBERVALUE: 'NUMBERVALUE(text, [decimal_separator], [group_separator])',
98
+ REPLACE: 'REPLACE(old_text, start, count, new_text)',
99
+ EXACT: 'EXACT(text1, text2)',
100
+ WEEKDAY: 'WEEKDAY(date, [type])',
101
+ EDATE: 'EDATE(date, months)',
102
+ NETWORKDAYS: 'NETWORKDAYS(start_date, end_date, [holidays])',
103
+ WORKDAY: 'WORKDAY(start_date, days, [holidays])',
104
+ WEEKNUM: 'WEEKNUM(date, [type])',
105
+ TIME: 'TIME(hour, minute, second)',
106
+ YEARFRAC: 'YEARFRAC(start_date, end_date, [basis])',
107
+ NA: 'NA()',
108
+ CHOOSE: 'CHOOSE(index, value1, ...)',
109
+ ROW: 'ROW([reference])',
110
+ COLUMN: 'COLUMN([reference])',
111
+ ADDRESS: 'ADDRESS(row, column, [abs], [a1], [sheet])',
112
+ OFFSET: 'OFFSET(reference, rows, cols, [height], [width])',
113
+ INDIRECT: 'INDIRECT(text, [a1])',
114
+ FILTER: 'FILTER(array, include, [if_empty])',
115
+ UNIQUE: 'UNIQUE(array, [by_col], [exactly_once])',
116
+ SORT: 'SORT(array, [sort_index], [sort_order], [by_col])',
117
+ SORTBY: 'SORTBY(array, by_array1, [sort_order1], ...)',
118
+ SEQUENCE: 'SEQUENCE(rows, [columns], [start], [step])',
119
+ TRANSPOSE: 'TRANSPOSE(array)',
120
+ TEXTSPLIT: 'TEXTSPLIT(text, col_delimiter, [row_delimiter], [ignore_empty])',
121
+ };
122
+ /**
123
+ * The word being typed immediately before the caret, if it could be a function
124
+ * name. Returns null when the caret is not in a formula, or sits somewhere a
125
+ * function name cannot start (inside a string, or right after a reference).
126
+ */
127
+ export function partialAt(text, caret) {
128
+ if (!text.startsWith('='))
129
+ return null;
130
+ const upto = text.slice(0, caret);
131
+ // Inside a string literal there is nothing to suggest. Count unescaped
132
+ // quotes: an odd number means the caret is inside one.
133
+ let quotes = 0;
134
+ for (let i = 0; i < upto.length; i += 1) {
135
+ if (upto[i] === '"') {
136
+ if (upto[i + 1] === '"') {
137
+ i += 1;
138
+ continue;
139
+ }
140
+ quotes += 1;
141
+ }
142
+ }
143
+ if (quotes % 2 === 1)
144
+ return null;
145
+ const m = /([A-Za-z][A-Za-z0-9.]*)$/.exec(upto);
146
+ if (!m)
147
+ return null;
148
+ const word = m[1];
149
+ const start = caret - word.length;
150
+ // A word followed by digits is a cell reference being typed, not a function.
151
+ if (/\d$/.test(word))
152
+ return null;
153
+ return { word, start };
154
+ }
155
+ /**
156
+ * Function names matching what is being typed.
157
+ *
158
+ * Prefix matches first, then anything merely containing the text, so typing
159
+ * "look" still finds VLOOKUP. Within each group, SHORTER names rank first:
160
+ * alphabetical order puts SUBSTITUTE above SUM for "SU", which is exactly
161
+ * backwards from what someone typing two letters wants.
162
+ */
163
+ export function suggestFunctions(text, caret, limit = 8) {
164
+ const partial = partialAt(text, caret);
165
+ if (!partial || partial.word.length < 1)
166
+ return [];
167
+ const upper = partial.word.toUpperCase();
168
+ const prefix = [];
169
+ const contains = [];
170
+ for (const name of NAMES) {
171
+ if (name === upper)
172
+ continue;
173
+ if (name.startsWith(upper))
174
+ prefix.push(name);
175
+ else if (name.includes(upper))
176
+ contains.push(name);
177
+ }
178
+ const byCloseness = (a, b) => a.length - b.length || a.localeCompare(b);
179
+ return [...prefix.sort(byCloseness), ...contains.sort(byCloseness)]
180
+ .slice(0, limit)
181
+ .map((name) => ({ name, start: partial.start, end: caret }));
182
+ }
183
+ /** Splice an accepted suggestion in, leaving the caret inside the parens. */
184
+ export function applySuggestion(text, suggestion) {
185
+ const before = text.slice(0, suggestion.start);
186
+ const after = text.slice(suggestion.end);
187
+ // Do not double up a parenthesis the user already typed.
188
+ const needsParen = !after.startsWith('(');
189
+ // Only the OPENING parenthesis, as Excel inserts it. Inserting the pair
190
+ // put the caret between them, and everyone who then typed the arguments
191
+ // finished with a ")" of their own and got =SUM(A1:A3)) and #PARSE!.
192
+ // The closing one is supplied at commit by `balanceParens` when it is
193
+ // still missing, which is what Excel does too.
194
+ const inserted = needsParen ? `${suggestion.name}(` : suggestion.name;
195
+ return {
196
+ text: before + inserted + after,
197
+ caret: before.length + inserted.length,
198
+ };
199
+ }
200
+ /**
201
+ * Close the parentheses a formula left open, the way Excel corrects
202
+ * "=SUM(A1:A3" to "=SUM(A1:A3)" when it is entered. Quoted text is skipped,
203
+ * so a ")" inside a string neither closes nor needs closing. Text that is
204
+ * not a formula, or has more closers than openers, is returned as it is:
205
+ * that one is an error the engine should report, not paper over.
206
+ */
207
+ export function balanceParens(text) {
208
+ if (!text.startsWith('='))
209
+ return text;
210
+ let depth = 0;
211
+ let inString = false;
212
+ for (const ch of text) {
213
+ if (ch === '"')
214
+ inString = !inString;
215
+ else if (!inString && ch === '(')
216
+ depth += 1;
217
+ else if (!inString && ch === ')')
218
+ depth -= 1;
219
+ }
220
+ return depth > 0 ? text + ')'.repeat(depth) : text;
221
+ }
222
+ /** The signature hint for whatever call the caret is inside, if any. */
223
+ export function signatureAt(text, caret) {
224
+ if (!text.startsWith('='))
225
+ return null;
226
+ const upto = text.slice(0, caret);
227
+ // Walk back looking for an unclosed '(' and read the name before it.
228
+ let depth = 0;
229
+ for (let i = upto.length - 1; i >= 0; i -= 1) {
230
+ const ch = upto[i];
231
+ if (ch === ')') {
232
+ depth += 1;
233
+ continue;
234
+ }
235
+ if (ch === '(') {
236
+ if (depth > 0) {
237
+ depth -= 1;
238
+ continue;
239
+ }
240
+ const name = /([A-Za-z][A-Za-z0-9.]*)$/.exec(upto.slice(0, i))?.[1];
241
+ if (!name)
242
+ return null;
243
+ const upper = name.toUpperCase();
244
+ return SIGNATURES[upper] ?? (upper in FUNCTIONS ? `${upper}(...)` : null);
245
+ }
246
+ }
247
+ return null;
248
+ }
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Excel's `IMAGE` function: a picture IN a cell rather than floating over
3
+ * it.
4
+ *
5
+ * The difference is the whole point. A picture object hangs from a cell and
6
+ * covers whatever is under it; an `IMAGE` cell IS the picture, so it sorts
7
+ * with its row, filters with it, copies as a formula and moves when the
8
+ * cells move, with nothing to keep in step. A catalogue with a thumbnail
9
+ * column wants this one.
10
+ *
11
+ * The function answers with the source, which is what makes `=IMAGE(A2)`
12
+ * read like any other formula: the value is text, `ISTEXT` says so, and a
13
+ * cell that reads it gets the address rather than a picture it cannot use.
14
+ * Drawing it is the shell's part, and this is what the shell reads to know
15
+ * a cell is one.
16
+ */
17
+ /** The arguments of a top-level `=IMAGE(...)`, as written. */
18
+ export type ImageCall = {
19
+ /** The source expression: a quoted URL, a reference, a formula. */
20
+ source: string;
21
+ /** The alt text expression, when the call gives one. */
22
+ alt?: string;
23
+ };
24
+ /**
25
+ * The call's arguments when a formula IS one `IMAGE(...)` call, or null.
26
+ *
27
+ * Read off the text rather than the parsed tree on purpose: this runs for
28
+ * every cell that paints, and a scan is cheaper than a parse. A formula
29
+ * that merely CONTAINS an IMAGE call (`=IF(A1, IMAGE(B1), "")`) is not one,
30
+ * because its value is not a picture in every case.
31
+ */
32
+ export declare function imageCall(text: string): ImageCall | null;
33
+ /**
34
+ * Whether a source is one a browser will load. A `data:` URL and an
35
+ * ordinary web address are; anything else (a file path, a `javascript:`
36
+ * scheme) is not, and a cell showing it as text says more than a broken
37
+ * image would.
38
+ */
39
+ export declare function isDrawableImageSource(source: string): boolean;