@sheetxl/sdk 0.8.0-beta.11 → 0.8.0-beta.12

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 (191) hide show
  1. package/browser/esm/{BpgskG1Er_lGQ_yS.mjs → -Jx-jNHmtIQQfLvK.mjs} +1 -1
  2. package/browser/esm/{BLoUBId2xZpXAK_H.mjs → 2WuhYrIpYmOR5H73.mjs} +15 -15
  3. package/browser/esm/{Ctjb0SsxV4K4MMqG.mjs → 2mIwPy2D2JUX-9wx.mjs} +2 -2
  4. package/browser/esm/{CkxWugaJFjDGZNZ-.mjs → B3wf5vZCsWfWsDbj.mjs} +1 -1
  5. package/browser/esm/{BjkCiv5Jz6WYKZeu.mjs → BIHrHjRGWVlJglcp.mjs} +2 -2
  6. package/browser/esm/{BtvLTTfSBdAKplVG.mjs → BTFBedJMRWGvZyCE.mjs} +1 -1
  7. package/browser/esm/{C4MqfLn9Dm-l3OIk.mjs → BdCJNawfifyPupCP.mjs} +1 -1
  8. package/browser/esm/{CV5EGEjG5_-CPpP0.mjs → Bg5Di9GLNAkbqQ1P.mjs} +3 -3
  9. package/browser/esm/{C2VbEI_XVAoseAwa.mjs → BnC4-27Igwb8oDf2.mjs} +2 -2
  10. package/browser/esm/{CQYjO777cmAznUzK.mjs → Bt8_m94tBdks209L.mjs} +1 -1
  11. package/browser/esm/{C16ycKja6zG0crV_.mjs → BudSIfXBAsTxvu-K.mjs} +17836 -15712
  12. package/browser/esm/{DvAaxH6z_tGvrRzl.mjs → C9u8FUewte5ugUjH.mjs} +686 -686
  13. package/browser/esm/{DEiPS3Dr-s4fPbVZ.mjs → CBYMTDzMf1Vh7pkw.mjs} +1 -1
  14. package/browser/esm/{Dyq_ivuHvlXLwPCl.mjs → CNdjyofiRu6CYOrr.mjs} +1106 -1102
  15. package/browser/esm/{PcHFjNzQsE54POri.mjs → CRkYR-siY2C994KV.mjs} +1 -1
  16. package/browser/esm/{C5E6zSGAALWf61n4.mjs → CTe2qfmIUEad6FJv.mjs} +2 -2
  17. package/browser/esm/{BoV6zPBnfqCBCqZ7.mjs → CUzYuYTTGsChC_kZ.mjs} +3841 -3148
  18. package/browser/esm/CdEO8CEee6lEhabA.mjs +117 -0
  19. package/browser/esm/{S2dNNx1a5ydRnARM.mjs → CfRqiPDg6RBTg1EN.mjs} +2 -2
  20. package/browser/esm/{ClbvFbFzFzXLBKNN.mjs → CndRBvVfQUJIYRRj.mjs} +50 -50
  21. package/browser/esm/{BnG31I6Oj_HEtSPS.mjs → CwOPLXU3-9ZHGyOT.mjs} +1 -1
  22. package/browser/esm/{CHU6iu_WGlm7fLET.mjs → Cxjxk0ncRKx80I-w.mjs} +1 -1
  23. package/browser/esm/D2RZh0O9neOsyLAE.mjs +281 -0
  24. package/browser/esm/{BkBhLS0l6z8sxI6D.mjs → D64dM68B1pKYFzdP.mjs} +2 -2
  25. package/browser/esm/{BVDiOXGMc5_FMGfy.mjs → D9xNz46kAfXMZzp4.mjs} +2 -2
  26. package/browser/esm/{zlLuW405RSguy4Kn.mjs → DK899HhWX1HINMC1.mjs} +53 -53
  27. package/browser/esm/{B7aUIvgUjncMMD_i.mjs → DPhGQLNGmDZwODwJ.mjs} +5 -4
  28. package/browser/esm/{gssVX_FH1XFN-twD.mjs → DVroRnhi-5IDXNgM.mjs} +1 -1
  29. package/{node/esm/CZICGK_ss0HoGHCP.mjs → browser/esm/DZiivy0NmO1Vnyzk.mjs} +2 -2
  30. package/browser/esm/{ClPfI4lODvCece29.mjs → DgrAuRD2qr2DvFeJ.mjs} +61 -61
  31. package/browser/esm/{CU3DmJ-YnVVrC1_k.mjs → DobHLF6VjHr7Xi40.mjs} +1 -1
  32. package/browser/esm/{CaB7J-xgfKO2uAkG.mjs → DwZCT7DZiiXoTweg.mjs} +2 -2
  33. package/browser/esm/{BMyDRQ716j79h_bH.mjs → DwwR3O2sEZApPSTF.mjs} +6 -6
  34. package/browser/esm/{DLLE0FZNsKxbBzRn.mjs → Tah7cnFb_HNZdLtj.mjs} +45 -45
  35. package/browser/esm/{Dlmig06rIo7cInRk.mjs → fXWUMDhZ5yMSO629.mjs} +1 -1
  36. package/browser/esm/{DWNzqw7DUKwoxjri.mjs → hCQJcmIzPDxDEv2q.mjs} +2 -2
  37. package/browser/esm/index.mjs +679 -542
  38. package/browser/esm/{BFagR2JeWs74iAG3.mjs → qO-ujUrgq6H3TQix.mjs} +1 -1
  39. package/browser/esm/w6Jea0TiclPrYZ2M.mjs +1703 -0
  40. package/browser/esm/yuhcOYw6SHQ-RCm3.mjs +114 -0
  41. package/node/esm/-TA0MneBDKdGhsib.mjs +8668 -0
  42. package/node/esm/{B21JjOLghRoDOrkx.mjs → B-HUPAcqvK0eeeCz.mjs} +1 -1
  43. package/node/esm/{DNRhGK-8Tr9xcRyc.mjs → BL2iiEoqxDEV2Xrg.mjs} +3 -3
  44. package/node/esm/{D1TKBVmoKGAXf37B.mjs → BNXLOEddJ6O9gYws.mjs} +2 -2
  45. package/node/esm/{BrCKGFRsX_ezFJ4B.mjs → BSvOluusoDM4z_dx.mjs} +15 -15
  46. package/node/esm/{BIwObuhTJYf0jpUa.mjs → BskP3b8vUoIOGLY6.mjs} +2 -2
  47. package/node/esm/{2Kihw_-5lVTEnwMa.mjs → Btw4148Ot8ifhNc1.mjs} +1 -1
  48. package/node/esm/{BqiexuA89caYnAPz.mjs → C14-R6tifRh7pc0p.mjs} +1 -1
  49. package/node/esm/{DUTskXCXref-IJnI.mjs → C99zzq8DImQXi4BQ.mjs} +47 -47
  50. package/node/esm/{D8zEN-6ZdDqDvTxM.mjs → CBuEu5Jk-LfaDy-H.mjs} +61 -61
  51. package/node/esm/{yavzZOiZW_EjG9lE.mjs → CG-qBU5BAaVz7e-P.mjs} +1 -1
  52. package/node/esm/CPI58duc0j0a-HpJ.mjs +115 -0
  53. package/node/esm/{CCN5vD410obwdz38.mjs → CRt3vXe6YmXzqk3H.mjs} +15 -14
  54. package/node/esm/{CzXT00vrQa1_gvW9.mjs → C_aL7CGS1lrNn1Ng.mjs} +1 -1
  55. package/node/esm/{CZiqiay42tFTrLI4.mjs → C_xf5Bz30VqiJjXn.mjs} +1 -1
  56. package/node/esm/{BIRq1kT7lLRzns9t.mjs → CiIymQN6aJCul62g.mjs} +9 -9
  57. package/node/esm/{CNCNJNg890KdgkWh.mjs → Ci_zLYmCD7e-C79O.mjs} +1 -1
  58. package/{browser/esm/D5np__Jb1euAyaLw.mjs → node/esm/CkRYLed8Mmn3giNg.mjs} +2 -2
  59. package/node/esm/D3ptRKzASqBut1DE.mjs +117 -0
  60. package/node/esm/{cGwrLA1RCE-WhJ7w.mjs → D4ROK9UwDpS6jO3Z.mjs} +1 -1
  61. package/node/esm/{mFiBSM7XgBHV9AY7.mjs → D8hO07ToAibIuniw.mjs} +1535 -1531
  62. package/node/esm/{CDHdgJXH2vS71WMc.mjs → DUTmDHbFbhLDT4F3.mjs} +1 -1
  63. package/node/esm/{CGp6VZL-gZa9Uezx.mjs → DV5CU37aEbFbWFL0.mjs} +1 -1
  64. package/node/esm/{De2IONBxQhz-Qbyh.mjs → DdoiuKg9BKubtF1V.mjs} +1 -1
  65. package/node/esm/{Db0v7zXNnyjBIjjI.mjs → DggQ23jKMpwhENfa.mjs} +2 -2
  66. package/node/esm/{CwePQwTILHHjGDkZ.mjs → DhS6yWjrrSNIJMsn.mjs} +204 -204
  67. package/node/esm/{D_t5AUxSm7_icjzq.mjs → DhTya_mhmN53vskv.mjs} +1 -1
  68. package/node/esm/{DOU54VsOjG-m-NyQ.mjs → Dn1M7YWi25DeeYUb.mjs} +1 -1
  69. package/node/esm/{DkwIPzKc3UwdUIfM.mjs → DrCf6ITcBhVOFpRj.mjs} +6 -6
  70. package/node/esm/{D2KBymQJd1XhpeQD.mjs → DxazKtROyaI51dWl.mjs} +1 -1
  71. package/node/esm/{D6e2z7eZpxOJXHc7.mjs → Q_S1g46ZOTrdhTae.mjs} +1 -1
  72. package/node/esm/{OVfaSb506tNSIvbv.mjs → Vocy-I9dKzZMr0Ct.mjs} +19038 -16822
  73. package/node/esm/ZXPFcsT2zrALCZux.mjs +289 -0
  74. package/node/esm/{857CIBgQgGpnqrXk.mjs → eimUGjiIP-b8HiM6.mjs} +55 -55
  75. package/node/esm/{Bbf1Pm9Gk7YpLTvg.mjs → icn2nX5Z8e_3mNAv.mjs} +1 -1
  76. package/node/esm/index.mjs +740 -603
  77. package/node/esm/{Ct3h15sCus4Tgt6M.mjs → lGJ42sHqg5if2bba.mjs} +624 -616
  78. package/node/esm/{CdJHUJSBRHZoryPe.mjs → pYtP7wPyS96NQyXS.mjs} +59 -59
  79. package/package.json +6 -6
  80. package/resources/locales/de/model.msg.json +8 -2
  81. package/resources/locales/en/model.msg.json +9 -2
  82. package/types/scripting-api.json +10619 -10446
  83. package/types/scripting-enums.json +20 -1
  84. package/types/scripting.d.ts +1233 -296
  85. package/types/src/{sheet → anomalies}/_Anomalies.d.ts +3 -3
  86. package/types/src/anomalies/_FocusTable.d.ts +11 -0
  87. package/types/src/{sheet/_AnomalyFormulaChecks.d.ts → anomalies/_FormulaChecks.d.ts} +10 -2
  88. package/types/src/{sheet/_AnomalyLabelChecks.d.ts → anomalies/_LabelChecks.d.ts} +1 -1
  89. package/types/src/anomalies/_LiteralChecks.d.ts +35 -0
  90. package/types/src/anomalies/_SeriesChecks.d.ts +13 -0
  91. package/types/src/calculation/Calculation.d.ts +47 -9
  92. package/types/src/calculation/ExternalBookBindings.d.ts +2 -3
  93. package/types/src/calculation/ICalculation.d.ts +96 -9
  94. package/types/src/calculation/NamedFormulaCollection.d.ts +104 -8
  95. package/types/src/calculation/_CloneBoundary.d.ts +1 -1
  96. package/types/src/calculation/compiler/ASTTypes.d.ts +6 -2
  97. package/types/src/calculation/compiler/Types.d.ts +8 -0
  98. package/types/src/calculation/engine/CalcBackend.d.ts +104 -6
  99. package/types/src/calculation/executor/CalcExecutor.d.ts +73 -22
  100. package/types/src/calculation/executor/CalcExecutorUtils.d.ts +17 -1
  101. package/types/src/calculation/executor/_WhatIf.d.ts +50 -0
  102. package/types/src/calculation/formula/FormulaBlock.d.ts +4 -3
  103. package/types/src/calculation/formula/IFormulaBlock.d.ts +5 -0
  104. package/types/src/calculation/functions/_DataTableFunction.d.ts +14 -0
  105. package/types/src/calculation/grid/CalcGrid.d.ts +4 -6
  106. package/types/src/calculation/grid/CalcGridBackend.d.ts +5 -27
  107. package/types/src/calculation/grid/CalcGridProxy.d.ts +0 -2
  108. package/types/src/calculation/grid/CalcGridUtils.d.ts +4 -2
  109. package/types/src/calculation/grid/ICalcGrid.d.ts +16 -12
  110. package/types/src/calculation/grid/_CalcRequest.d.ts +17 -5
  111. package/types/src/calculation/spatial/FormulaSpatialValue.d.ts +2 -0
  112. package/types/src/calculation/spatial/SpillEntry.d.ts +16 -2
  113. package/types/src/calculation/state/CalcNode.d.ts +0 -1
  114. package/types/src/calculation/state/CalcScope.d.ts +29 -0
  115. package/types/src/calculation/state/CalcState.d.ts +26 -4
  116. package/types/src/calculation/state/CalculationContext.d.ts +28 -1
  117. package/types/src/calculation/state/DeferredCalls.d.ts +260 -0
  118. package/types/src/calculation/state/IContextContainer.d.ts +20 -0
  119. package/types/src/calculation/state/_PendingOverlayGrid.d.ts +6 -0
  120. package/types/src/calculation/state/_WhatIfLayer.d.ts +91 -0
  121. package/types/src/cell/ICell.d.ts +53 -34
  122. package/types/src/cellControl/CellControl.d.ts +67 -0
  123. package/types/src/cellControl/CellControlCollection.d.ts +29 -0
  124. package/types/src/cellControl/CellControlRegistry.d.ts +47 -0
  125. package/types/src/cellControl/ICellControl.d.ts +99 -0
  126. package/types/src/cellControl/ICellControlCollection.d.ts +67 -0
  127. package/types/src/cellControl/index.d.ts +4 -0
  128. package/types/src/cellRange/ICellRange.d.ts +207 -59
  129. package/types/src/cellRange/ICellRanges.d.ts +4 -3
  130. package/types/src/chart/layout/ChartLayout.d.ts +5 -1
  131. package/types/src/chart/resolve/_Resolve.d.ts +10 -0
  132. package/types/src/chart/resolve/_ResolvedChart.d.ts +5 -2
  133. package/types/src/collections/ISparseGrid.d.ts +11 -2
  134. package/types/src/collections/MixedTypedArrayList.d.ts +8 -2
  135. package/types/src/collections/SparseGrid.d.ts +3 -8
  136. package/types/src/condition/AnchoredConditional.d.ts +2 -2
  137. package/types/src/externalBook/IExternalBook.d.ts +3 -4
  138. package/types/src/fetch/Fetcher.d.ts +15 -0
  139. package/types/src/fetch/IFetcher.d.ts +47 -0
  140. package/types/src/fetch/_WorkbookFetch.d.ts +43 -0
  141. package/types/src/fetch/index.d.ts +3 -0
  142. package/types/src/fill/PaintUtils.d.ts +3 -1
  143. package/types/src/hyperlink/IHyperlink.d.ts +10 -0
  144. package/types/src/hyperlink/_Hyperlink.d.ts +4 -1
  145. package/types/src/index.d.ts +2 -1
  146. package/types/src/named/INamedCollection.d.ts +36 -0
  147. package/types/src/named/NamedCollection.d.ts +18 -0
  148. package/types/src/primitives/AsyncValue.d.ts +58 -0
  149. package/types/src/resource/IResource.d.ts +9 -0
  150. package/types/src/resource/IResourceCollection.d.ts +4 -0
  151. package/types/src/resource/Resource.d.ts +2 -0
  152. package/types/src/resource/_AddResource.d.ts +13 -0
  153. package/types/src/richData/CellImage.d.ts +95 -0
  154. package/types/src/richData/Hyperlink.d.ts +49 -0
  155. package/types/src/richData/IRichDataCollection.d.ts +76 -0
  156. package/types/src/richData/IRichDataKind.d.ts +55 -11
  157. package/types/src/richData/RichArray.d.ts +42 -0
  158. package/types/src/richData/RichDataCollection.d.ts +23 -0
  159. package/types/src/richData/RichDataRegistry.d.ts +46 -14
  160. package/types/src/richData/RichDataValues.d.ts +20 -0
  161. package/types/src/richData/RichRecord.d.ts +68 -0
  162. package/types/src/richData/RichText.d.ts +5 -5
  163. package/types/src/richData/index.d.ts +6 -0
  164. package/types/src/scripting/FunctionArguments.d.ts +17 -1
  165. package/types/src/scripting/FunctionCollection.d.ts +8 -0
  166. package/types/src/scripting/Scripts.d.ts +10 -0
  167. package/types/src/scripting/TypedFunction.d.ts +2 -0
  168. package/types/src/sheet/ICellContainerOptions.d.ts +6 -0
  169. package/types/src/sheet/IWorksheet.d.ts +24 -17
  170. package/types/src/sheet/SheetCell.d.ts +17 -1
  171. package/types/src/sheet/SheetRange.d.ts +8 -2
  172. package/types/src/sheet/SheetRanges.d.ts +2 -2
  173. package/types/src/sheet/Worksheet.d.ts +110 -56
  174. package/types/src/sheet/_ListenerAnchor.d.ts +7 -1
  175. package/types/src/sheet/_ScalarListFactory.d.ts +54 -6
  176. package/types/src/sheet/_SheetMutations.d.ts +4 -1
  177. package/types/src/sheet/_SheetStateTypes.d.ts +23 -11
  178. package/types/src/workbook/IWorkbook.d.ts +40 -1
  179. package/types/src/workbook/Workbook.d.ts +25 -3
  180. package/types/src/workbook/WorkbookRanges.d.ts +1 -1
  181. package/browser/esm/BGOFfpxr2jPIdqmV.mjs +0 -40
  182. package/browser/esm/f1IoRb7tEb0QmCSt.mjs +0 -110
  183. package/browser/esm/nvU0ClAbf0g94YBK.mjs +0 -1695
  184. package/node/esm/B084DssTcdBheTp_.mjs +0 -7966
  185. package/node/esm/Df1bL6VFvrqIdSLB.mjs +0 -40
  186. package/node/esm/DrTZbfemSLq2mseG.mjs +0 -111
  187. package/types/src/dataTable/DataTable.d.ts +0 -67
  188. package/types/src/dataTable/DataTableCollection.d.ts +0 -19
  189. package/types/src/dataTable/IDataTable.d.ts +0 -99
  190. package/types/src/dataTable/IDataTableCollection.d.ts +0 -18
  191. package/types/src/dataTable/index.d.ts +0 -6
@@ -3,9 +3,9 @@ import { ICell } from '../cell';
3
3
  import { ISpatialMap, ISpatialQuery } from '../collections';
4
4
  import { ICellStyle, IStyleCollection } from '../style';
5
5
  import { IProperties } from '../type';
6
- import { IWorksheet } from './IWorksheet';
7
- import { IgnoredErrors } from './_IgnoredErrors';
8
- import { CellKind } from './_Kinds';
6
+ import { IWorksheet } from '../sheet/IWorksheet';
7
+ import { IgnoredErrors } from '../sheet/_IgnoredErrors';
8
+ import { CellKind } from '../sheet/_Kinds';
9
9
  /**
10
10
  * The findings at a cell, interned per map: equal findings are one object, in rank order, so a
11
11
  * region's payload identity is its content and the fragments of one finding regroup.
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Per focus, the share of a class of finding's regions that held a planted defect of that kind on the
3
+ * SpreadsheetBench v2 Debugging inputs, and `prior`, the kind's rate over every region. A class is
4
+ * `check/evidence key/repeats` (`ICellRange.AnomalyFocus`).
5
+ * @internal
6
+ */
7
+ export declare const ANOMALY_FOCUS_TABLE: Readonly<Record<string, {
8
+ readonly prior: number;
9
+ readonly classes: Readonly<Record<string, number>>;
10
+ }>>;
11
+ //# sourceMappingURL=_FocusTable.d.ts.map
@@ -1,7 +1,7 @@
1
1
  import { IRange } from '@sheetxl/primitives';
2
2
  import { ICalculation } from '../calculation';
3
3
  import { SpatialMap } from '../collections';
4
- import { IWorksheet } from './IWorksheet';
4
+ import { IWorksheet } from '../sheet/IWorksheet';
5
5
  import { AnomalySource, FormulaRegion, RoleSource, _Findings } from './_Anomalies';
6
6
  type Node = ICalculation.FormulaNode;
7
7
  type Rect = IRange.Coords;
@@ -53,6 +53,14 @@ export declare function checkLookupShape(source: AnomalySource, regions: readonl
53
53
  * a converter wrapped as unknown (`_XLUDF.`, `'udf'`).
54
54
  */
55
55
  export declare function checkExternalReference(source: AnomalySource, regions: readonly FormulaRegion[], findings: _Findings): void;
56
+ /**
57
+ * `errorConstant`: a formula that is only an error value — `=#DIV/0!`, `=#REF!`. Nobody types
58
+ * one; it is what a converter leaves when it drops the formula that computed the error. When the
59
+ * block sits against a data table (`=TABLE(…)`) that spills less than the block covers,
60
+ * `dataTable` names the table's anchor and `extent` the rectangle the two cover together: the
61
+ * table's results were replaced by constants.
62
+ */
63
+ export declare function checkErrorConstant(source: AnomalySource, regions: readonly FormulaRegion[], findings: _Findings): void;
56
64
  /** One term of a sum: a reference, added (`1`) or taken away (`-1`). */
57
65
  export interface Leaf {
58
66
  readonly node: Node;
@@ -122,4 +130,4 @@ export interface Resolved {
122
130
  /** Where a cell or range reference lands when its formula sits at `at`; `null` for anything else. @internal */
123
131
  export declare function resolve(node: Node, at: At, own: string): Resolved | null;
124
132
  export {};
125
- //# sourceMappingURL=_AnomalyFormulaChecks.d.ts.map
133
+ //# sourceMappingURL=_FormulaChecks.d.ts.map
@@ -18,4 +18,4 @@ export declare function checkKeyLabelMismatch(source: AnomalySource, regions: re
18
18
  * other sign — `=-'Debt'!C20` where two other links read `='Debt'!D20`, `='Debt'!E20`.
19
19
  */
20
20
  export declare function checkSignVsSiblings(source: AnomalySource, regions: readonly FormulaRegion[], findings: _Findings): void;
21
- //# sourceMappingURL=_AnomalyLabelChecks.d.ts.map
21
+ //# sourceMappingURL=_LabelChecks.d.ts.map
@@ -0,0 +1,35 @@
1
+ import { AnomalySource, FormulaRegion, _Findings } from './_Anomalies';
2
+ /**
3
+ * `literalMatchesInput`: a number typed into a formula that equals a typed number on the sheet no
4
+ * formula reads — `=(-0.595*J19)` with `0.595` in J52, which nothing reads. The reference the
5
+ * literal replaced is what left the input unread, so an unread input is the signal; a literal
6
+ * matching an input something still reads is the formula's own constant.
7
+ *
8
+ * Small counts, calendar periods and powers of ten never fire (`isConventional`). The nearest
9
+ * occurrence is the evidence, with its label when it has one, and `matches`, the places the value
10
+ * is typed, scales the rank down: a value typed all over a data block is a weak witness.
11
+ */
12
+ export declare function checkLiteralMatchesInput(source: AnomalySource, regions: readonly FormulaRegion[], findings: _Findings): void;
13
+ /**
14
+ * `constantFrequency`: every constant a formula types — a number, a string, a boolean — as a
15
+ * finding of its own, with how often the workbook types it. A model's conventions are typed many
16
+ * times (`/365` in every days line, `"Total"` in every lookup); a value typed once, or a unit typed
17
+ * in two rows where the workbook types another in twenty, is the exception to read first. The
18
+ * count is the second pass's: it adds `uses` and `of` and divides the rank by `uses`, so nothing is
19
+ * cut and a convention lists last. A number keys without its sign, so `-0.595` and `0.595` are one
20
+ * constant.
21
+ */
22
+ export declare function checkConstantFrequency(source: AnomalySource, regions: readonly FormulaRegion[], findings: _Findings): void;
23
+ /**
24
+ * `twinBlockDivergence`: twin formulas that differ in a typed number — the formulas on the sheet
25
+ * with the same shape once references, literals and signs are set aside. `($D136/100)` in one
26
+ * tranche where the next has `($D145/10000)`; `*(1/360)` beside `*(1/365)`. Every side of a
27
+ * divergence fires, naming the other side's value and a twin that carries it: two planted rows can
28
+ * outvote the one that is right, and which literal the business meant is the reader's call. The
29
+ * side fewer twins carry ranks higher, by `twins / (twins + its own count)`.
30
+ *
31
+ * Only a unit pair compares (`isUnitPair`). A position whose values are spread with no plurality
32
+ * carries no convention and says nothing.
33
+ */
34
+ export declare function checkTwinBlockDivergence(source: AnomalySource, regions: readonly FormulaRegion[], findings: _Findings): void;
35
+ //# sourceMappingURL=_LiteralChecks.d.ts.map
@@ -0,0 +1,13 @@
1
+ import { AnomalySource, _Findings } from './_Anomalies';
2
+ /**
3
+ * `scaleOutlier`: a typed percent a hundred times or more off the typical value of the sheet's
4
+ * typed percents — `30` in a percent cell where the others are around `0.4`: a 30% rate typed as a
5
+ * whole number, which shows as 3000%. The typical value is the median of the sheet's typed
6
+ * percents; `times`, the power of ten the value is off by, is the evidence, with the median and
7
+ * how many numbers it is taken over.
8
+ *
9
+ * Read for percents only today: a percent has a scale the format states, so a value off it is a
10
+ * unit fact rather than a large line item.
11
+ */
12
+ export declare function checkScaleOutlier(source: AnomalySource, findings: _Findings): void;
13
+ //# sourceMappingURL=_SeriesChecks.d.ts.map
@@ -1,9 +1,10 @@
1
- import { IRange, IRuntime, Scalar } from '@sheetxl/primitives';
1
+ import { IRange, IFunction, IRuntime, Scalar } from '@sheetxl/primitives';
2
2
  import { IListener } from '../listener';
3
3
  import { FunctionProvider } from '@sheetxl/scripting';
4
4
  import { AbstractModel, IModel } from '../model';
5
5
  import { ITransaction } from '../transaction';
6
6
  import { IStringCollection } from '../string';
7
+ import { IResourceCollection } from '../resource';
7
8
  import { IFunctionCollection } from '../scripting';
8
9
  import { INamed, INamedCollection } from '../named';
9
10
  import { ICellRange, ICellRanges } from '../cellRange';
@@ -44,6 +45,7 @@ export declare class Calculation extends AbstractModel<AbstractModel.State, ICal
44
45
  protected _engineModule: typeof import('./engine') | null;
45
46
  protected _planCache: 'off' | 'assert' | 'on' | null;
46
47
  protected _getActiveCell: () => IRange.CellCoords | null;
48
+ protected _startFunctions: (() => Promise<readonly IFunction[]>) | null;
47
49
  protected _getRange: (address: ICellRange.Address, options?: ICellRange.GetRangeOptions) => ICellRange;
48
50
  protected _getRanges: (address: ICellRanges.Address, options?: ICellRange.GetRangeOptions) => ICellRanges;
49
51
  /** The current handle of every formula host's grid, by grid id. */
@@ -363,6 +365,14 @@ export declare class Calculation extends AbstractModel<AbstractModel.State, ICal
363
365
  * read returns the raw text instead (`use-signs.test.ts`).
364
366
  */
365
367
  protected _drainPending(priorityOnly?: boolean): Promise<void>;
368
+ /** @inheritdoc ICalculation.getPendingCount */
369
+ getPendingCount(): number;
370
+ /** @inheritdoc ICalculation.whenPendingDone */
371
+ whenPendingDone(options?: {
372
+ timeout?: number;
373
+ }): Promise<boolean>;
374
+ /** @inheritdoc ICalculation.cancelAsync */
375
+ cancelAsync(options?: ICalculation.CancelOptions): Promise<ICalculation.Status>;
366
376
  /** @inheritdoc ICalculation.calculate */
367
377
  calculate(options?: ICalculation.CalculateOptions | boolean): Promise<ICalculation.Status>;
368
378
  /**
@@ -372,10 +382,14 @@ export declare class Calculation extends AbstractModel<AbstractModel.State, ICal
372
382
  * successful one (the tail simply fell off the end), and two call sites cast the result
373
383
  * to `Status` to satisfy {@link ICalculation.calculate}.
374
384
  */
375
- protected _calculate(options?: ICalculation.CalculateOptions, gridId?: string): Promise<ICalculation.Status>;
385
+ protected _calculate(options?: ICalculation.CalculateOptions, gridId?: string, settle?: boolean): Promise<ICalculation.Status>;
376
386
  /** A pass, counted while it runs: what the calculation state reads as a pass in flight. */
377
- protected _calculateNow(options?: ICalculation.CalculateOptions, gridId?: string): Promise<ICalculation.Status>;
378
- protected _runCalculation(options?: ICalculation.CalculateOptions, gridId?: string): Promise<ICalculation.Status>;
387
+ protected _calculateNow(options?: ICalculation.CalculateOptions, gridId?: string, settle?: boolean): Promise<ICalculation.Status>;
388
+ /**
389
+ * @param settle The settle pass (DESIGN-ASYNC §4.5): seeded from what a settle marked only;
390
+ * volatiles and the dirty set are left for the pass that owes them.
391
+ */
392
+ protected _runCalculation(options?: ICalculation.CalculateOptions, gridId?: string, settle?: boolean): Promise<ICalculation.Status>;
379
393
  /**
380
394
  * The model commit the last pass recalculated for, `null` before the first: what a sheet
381
395
  * realizing the pass's results amends them into.
@@ -520,13 +534,17 @@ export declare class Calculation extends AbstractModel<AbstractModel.State, ICal
520
534
  * @internal
521
535
  */
522
536
  _tableChanged(table: ITable, removed: boolean): void;
523
- /** A name written, as {@link _tableChanged} tells a table. */
524
- protected _nameWritten(written: NamedFormulaCollection.NamesWritten): void;
537
+ /** Names written, as {@link _tableChanged} tells a table: one message for a batch. */
538
+ protected _nameWritten(written: readonly NamedFormulaCollection.NamesWritten[]): void;
539
+ /** {@link _sendSymbolChanges} for one change. */
540
+ protected _sendSymbolChange<T>(kind: 'tables' | 'names', id: string, entry: T | null, same: (a: T | null | undefined, b: T | null) => boolean): void;
525
541
  /**
526
- * One change to a replica, as a message: sent to a `Starting` engine as it is (the channel holds
527
- * it in order), and to a `Running` one only when the replica does not already say so.
542
+ * Changes to a replica, as messages: sent to a `Starting` engine as they are (the channel holds
543
+ * them in order), and to a `Running` one only where the replica does not already say so, as ONE
544
+ * message - the replica is rebuilt and reconciled once per message, over every symbol, so a batch
545
+ * told a symbol at a time costs the square of its size.
528
546
  */
529
- protected _sendSymbolChange<T>(kind: 'tables' | 'names', id: string, entry: T | null, same: (a: T | null | undefined, b: T | null) => boolean): void;
547
+ protected _sendSymbolChanges<T>(kind: 'tables' | 'names', changes: readonly (readonly [string, T | null])[], same: (a: T | null | undefined, b: T | null) => boolean): void;
530
548
  /**
531
549
  * While `Starting`: per kind, the held symbol message a new symbol of that kind joins, and the
532
550
  * ids every message of the start has told. Dropped with the channel - see {@link _sendSymbolChange}.
@@ -729,6 +747,8 @@ export declare namespace Calculation {
729
747
  authoredAt: IRange.CellCoords;
730
748
  /** Each cell of the block is its own 1x1 array-entered formula. See {@link ICalculation.EvaluateOptions.arrayFirstCell}. */
731
749
  arrayFirstCell?: boolean;
750
+ /** How long to wait for the cells' async calls. See {@link ICalculation.EvaluateOptions.timeout}. */
751
+ timeout?: number;
732
752
  }
733
753
  /** See {@link Calculation._createFormulaHost}. */
734
754
  interface FormulaHostOptions {
@@ -789,6 +809,15 @@ export declare namespace Calculation {
789
809
  * @see {@link FunctionProvider}
790
810
  */
791
811
  functions?: readonly FunctionProvider[];
812
+ /**
813
+ * Custom functions to register at every start, ahead of the first pass: a workbook's script
814
+ * functions, so a formula calling one calculates on load rather than answering `#NAME?`.
815
+ *
816
+ * @remarks
817
+ * Asked once per start, alongside loading the engine. A function the registry refuses (a
818
+ * built-in's name) is reported and skipped; the start goes on with the rest.
819
+ */
820
+ startFunctions?: () => Promise<readonly IFunction[]>;
792
821
  /**
793
822
  * Returns the active cell — the current selection anchor — with its sheet id as `scope`.
794
823
  * Supplies the default scope for temporary / named-formula resolution, and the default
@@ -846,6 +875,15 @@ export declare namespace Calculation {
846
875
  getSheetIndex?: (sheetName?: string) => number;
847
876
  getSheetCount?: () => number;
848
877
  strings?: IStringCollection;
878
+ /**
879
+ * The workbook's binary resources (image bytes), for rich values a formula makes.
880
+ */
881
+ resources?: IResourceCollection;
882
+ /**
883
+ * The workbook's fetch, for async functions (`IFormulaContext.IBatchContext.fetch`). Omitted,
884
+ * the global `fetch`.
885
+ */
886
+ fetch?: (input: string, init?: RequestInit) => Promise<Response>;
849
887
  /**
850
888
  * Whether to perform iterative calculations when there are circular dependencies.
851
889
  *
@@ -1,5 +1,4 @@
1
1
  import { Scalar } from '@sheetxl/primitives';
2
- import { ICell } from '../cell';
3
2
  import { Tuple } from '../collections';
4
3
  import { IExternalBookCollection } from '../externalBook';
5
4
  import { CalcGridBackend, FormulaHost } from './grid';
@@ -87,11 +86,11 @@ export declare class ExternalBookBindings {
87
86
  * column-major scalar tuples a `CalcGridBackend` loads.
88
87
  *
89
88
  * @remarks
90
- * `ICell.JSON`'s untyped arm is a bare primitive, and the cache's strings are LITERAL (never a
89
+ * `Scalar.JSON`'s untyped arm is a bare primitive, and the cache's strings are LITERAL (never a
91
90
  * string-table index — the part inlines them, design doc §1). The typed arm carries an error by
92
91
  * code. `null` when the cache holds nothing.
93
92
  */
94
- export declare function cacheToGridTuples(data: Tuple.GridTuple<ICell.JSON> | null | undefined): Tuple.GridTuple<Scalar> | null;
93
+ export declare function cacheToGridTuples(data: Tuple.GridTuple<Scalar.JSON> | null | undefined): Tuple.GridTuple<Scalar> | null;
95
94
  export declare namespace ExternalBookBindings {
96
95
  interface ConstructorOptions {
97
96
  /** The collection to mirror — read fresh on every {@link ExternalBookBindings.sync}. */
@@ -19,7 +19,9 @@ export interface ICalculation extends IModel {
19
19
  * @returns A promise that will be resolved when the calculation is completed.
20
20
  *
21
21
  * @remarks
22
- * For async functions this will return before they are completed.
22
+ * For async functions this will return before they are completed. An async function is called
23
+ * again unless its call is still running; what it fetches is answered
24
+ * from the workbook's cache unless {@link ICalculation.CalculateOptions.external} is set.
23
25
  */
24
26
  calculate(options?: boolean | ICalculation.CalculateOptions): Promise<ICalculation.Status>;
25
27
  /**
@@ -38,7 +40,7 @@ export interface ICalculation extends IModel {
38
40
  /**
39
41
  * Resolves once the engine is running and idle: its calculation state is
40
42
  * {@link ICalculation.CalculationState.Done}, or {@link ICalculation.CalculationState.Pending} in
41
- * manual mode.
43
+ * manual mode (and, under `AutomaticExceptTables`, with only data tables out of date).
42
44
  *
43
45
  * @remarks
44
46
  * * After it, every answer the engine owes has landed: a formula written before it reads as
@@ -46,14 +48,46 @@ export interface ICalculation extends IModel {
46
48
  * * Manual mode does not wait for a recalculation nobody has asked for; call {@link calculate}.
47
49
  * * Waits for what consumers derive from the results too ({@link waitUntil}): a conditional
48
50
  * format reads as painted after it, including one a read just asked to evaluate.
49
- * * A streaming or async function's result in flight is not waited for: its cell reads as the
50
- * current value until the result arrives.
51
+ * * An async function's result in flight is not waited for: its cell reads as what the
52
+ * function returned until the result arrives.
51
53
  * * Starts the engine if it is {@link ICalculation.Status.Off}. An engine in
52
54
  * {@link ICalculation.Status.Error} is not started; {@link start} tries again.
53
55
  *
54
56
  * @param options Pass `{ full: true }` to recalculate every grid rather than only the dirty ones.
55
57
  */
56
58
  ready(options?: ICalculation.CalculateOptions): Promise<ICalculation.Status>;
59
+ /**
60
+ * How many async function calls are waiting for an answer.
61
+ */
62
+ getPendingCount(): number;
63
+ /**
64
+ * Resolves once no async function call is pending ({@link getPendingCount} is `0`) and every
65
+ * answer has been calculated into the workbook — Excel's `CalculateUntilAsyncQueriesDone`.
66
+ *
67
+ * @param options `timeout` in milliseconds; 30 seconds when absent.
68
+ * @returns `true` when nothing is pending; `false` when the timeout came first.
69
+ *
70
+ * @remarks
71
+ * * An answer that makes a formula ask a new question (one call's answer is another's input)
72
+ * is waited for too.
73
+ * * {@link ready} is the engine's own readiness and does not wait for answers.
74
+ */
75
+ whenPendingDone(options?: {
76
+ timeout?: number;
77
+ }): Promise<boolean>;
78
+ /**
79
+ * Stops waiting for async function calls — Excel's *Cancel Refresh*: each pending
80
+ * call the options cover is closed, and the function is told (its `onCancel`).
81
+ *
82
+ * @param options Which calls; every call when absent.
83
+ * @returns A promise that resolves once the cells have been recalculated.
84
+ *
85
+ * @remarks
86
+ * * A cell keeps what it showed — its last answer, or the value its function returned while it
87
+ * waited — and is no longer pending. An answer that arrives later is dropped.
88
+ * * A recalculation of a cancelled cell calls its function again.
89
+ */
90
+ cancelAsync(options?: ICalculation.CancelOptions): Promise<ICalculation.Status>;
57
91
  /**
58
92
  * Counts `work` that a consumer derives from the engine's results as calculation in flight
59
93
  * until it settles: {@link ready} waits for it, and {@link getCalculationState} reads
@@ -1042,6 +1076,14 @@ export declare namespace ICalculation {
1042
1076
  * Use {@link ICalculation.FormulaToken.evalIndex} to discover valid indices.
1043
1077
  */
1044
1078
  evalIndex?: number;
1079
+ /**
1080
+ * How long to wait, in milliseconds, for the answers of async functions the formula calls:
1081
+ * the evaluation resolves once each has answered, and
1082
+ * answers a `#TIMEOUT!` error naming the call it waited on when the time runs out.
1083
+ *
1084
+ * @defaultValue `30000`
1085
+ */
1086
+ timeout?: number;
1045
1087
  /**
1046
1088
  * Temporary range of values to use for this evaluation.
1047
1089
  *
@@ -1174,6 +1216,15 @@ export declare namespace ICalculation {
1174
1216
  * Called when the calculation state has changed - see {@link ICalculation.getCalculationState}.
1175
1217
  */
1176
1218
  onCalculationStateChange?(source: ICalculation): void;
1219
+ /**
1220
+ * Called when the number of async function calls waiting for an answer may have changed — see
1221
+ * {@link ICalculation.getPendingCount}.
1222
+ *
1223
+ * @remarks
1224
+ * Called when calls are made, when answers are applied, and on a cancel or a stop: answers
1225
+ * arriving together are one call.
1226
+ */
1227
+ onPendingChange?(source: ICalculation): void;
1177
1228
  /**
1178
1229
  * Called when a calculation is completed.
1179
1230
  */
@@ -1242,7 +1293,8 @@ export declare namespace ICalculation {
1242
1293
  readonly Calculating: "calculating";
1243
1294
  /**
1244
1295
  * Changes have been made that need a recalculation, and none will run until one is asked for:
1245
- * manual mode between an edit and {@link ICalculation.calculate}.
1296
+ * manual mode between an edit and {@link ICalculation.calculate}, or the `TABLE` data tables an
1297
+ * edit left out of date under `AutomaticExceptTables`.
1246
1298
  */
1247
1299
  readonly Pending: "pending";
1248
1300
  };
@@ -1313,14 +1365,16 @@ export declare namespace ICalculation {
1313
1365
  */
1314
1366
  readonly Stale: "stale";
1315
1367
  /**
1316
- * The value is being calculated asynchronously, typically because the function used returned a Promise.
1317
- * All dependent values will also be in the Pending state. If the promise returns an error or times out, the value will be an error value.
1368
+ * The cell's own function asked for its result later (`FormulaContext.defer`) and it has not
1369
+ * arrived: the cell shows what the function returned meanwhile, and its dependents calculate
1370
+ * from that and read as {@link Waiting}. A failed call answers an error value.
1318
1371
  */
1319
1372
  readonly Pending: "pending";
1320
1373
  /**
1321
- * The value is up-to-date, but the underlying data source is streaming live updates.
1374
+ * The value was calculated from a pending value — a precedent whose function has not answered —
1375
+ * and will be calculated again when it does.
1322
1376
  */
1323
- readonly Streaming: "streaming";
1377
+ readonly Waiting: "waiting";
1324
1378
  };
1325
1379
  type ResultStatus = typeof ResultStatus[keyof typeof ResultStatus];
1326
1380
  /**
@@ -1358,6 +1412,39 @@ export declare namespace ICalculation {
1358
1412
  * live in other sheets, and a named formula's body lives in a virtual grid of its own.
1359
1413
  */
1360
1414
  scope?: string;
1415
+ /**
1416
+ * If `true`, what the calculation reads from outside the workbook is read from the source
1417
+ * again rather than from the workbook's cache — Excel's *Data › Refresh All*: what the async
1418
+ * functions it calls fetch, and, for a calculation that is neither {@link range} nor
1419
+ * {@link scope}, every external book (`IExternalBookCollection.refreshAll`).
1420
+ *
1421
+ * @remarks
1422
+ * * Which functions are called is the calculation's own choice, as without it: pass
1423
+ * {@link full} for every formula. A call still running is left be.
1424
+ * * The calculation resolves without waiting for the new answers or the external books.
1425
+ *
1426
+ * @example Refresh All
1427
+ * ```ts
1428
+ * await workbook.getCalculation().calculate({ full: true, external: true });
1429
+ * ```
1430
+ *
1431
+ * @defaultValue `false`
1432
+ */
1433
+ external?: boolean;
1434
+ }
1435
+ /**
1436
+ * Options for {@link ICalculation.cancelAsync}.
1437
+ */
1438
+ interface CancelOptions {
1439
+ /**
1440
+ * Only the calls of the formulas in this range are cancelled.
1441
+ */
1442
+ range?: ICellRange.Address;
1443
+ /**
1444
+ * Only the calls of the formulas on this sheet, by name, are cancelled. Ignored when
1445
+ * {@link range} is set.
1446
+ */
1447
+ scope?: string;
1361
1448
  }
1362
1449
  interface JSON {
1363
1450
  /**
@@ -3,9 +3,9 @@ import { ITransaction } from '../transaction';
3
3
  import { IListener } from '../listener';
4
4
  import { ICellRange, ICellRanges } from '../cellRange';
5
5
  import { NamedNodeInfo, ReferenceCoords } from './Types';
6
- import { INamed } from '../named';
6
+ import { INamed, INamedCollection } from '../named';
7
7
  import { ITypes, AbstractCollection } from '../type';
8
- import { FormulaHost } from './grid';
8
+ import { FormulaHost, ICalcGrid } from './grid';
9
9
  import { Formula, IFormulaBlockView } from './formula';
10
10
  import { ICalculation } from './ICalculation';
11
11
  import { INamedFormulasCollection } from './INamedFormulasCollection';
@@ -75,6 +75,8 @@ export declare class NamedFormulaCollection extends AbstractCollection<ICalculat
75
75
  */
76
76
  private _nameIndex;
77
77
  constructor(options?: NamedFormulaCollection.ConstructorOptions);
78
+ /** Loaded names some write has given a state of their own - see {@link NamedFormula._writeNamedState}. */
79
+ private _written;
78
80
  /**
79
81
  * Hydrates from `IWorkbook.JSON.names`. A malformed entry is warned and skipped rather than
80
82
  * failing the whole load — one bad name must not cost the workbook every other name.
@@ -157,6 +159,27 @@ export declare class NamedFormulaCollection extends AbstractCollection<ICalculat
157
159
  * text and is left alone. Items of another source are not this collection's and are skipped.
158
160
  */
159
161
  prepareRanges(items: readonly INamed[]): void;
162
+ /**
163
+ * {@inheritDoc NamedCollection.Source.removeUnused}
164
+ *
165
+ * @remarks
166
+ * A name that has not compiled has no compiled reader - a formula that reads a name binds it - so
167
+ * only the compiled ones are asked of the engine. What the engine cannot see is a reader that has
168
+ * not compiled either: a kept name whose definition spells a candidate keeps it, and whatever that
169
+ * one spells in turn. By spelling, so lenient - a name wrongly kept costs nothing, one wrongly
170
+ * removed breaks the name that read it.
171
+ *
172
+ * A LAMBDA is called, not bound, so it is never removed; nor is a built-in name (`_xlnm.`),
173
+ * which the sheet reads rather than any formula.
174
+ */
175
+ removeUnused(options: INamedCollection.RemoveUnusedOptions & {
176
+ scope?: string;
177
+ }): Promise<number>;
178
+ /**
179
+ * Deletes `items` as ONE operation: each item's own writes, then a single rewrite of the set.
180
+ * Deleted one at a time, each removal copies the set, and a legacy file's names are thousands.
181
+ */
182
+ protected _removeMany(items: readonly NamedFormula[]): void;
160
183
  /**
161
184
  * Compiles the loaded names among `items` that have not compiled, as ONE operation.
162
185
  *
@@ -306,6 +329,8 @@ export declare class NamedFormulaCollection extends AbstractCollection<ICalculat
306
329
  */
307
330
  _addNamesWrittenListener(listeners: IListener.Callbacks<NamedFormulaCollection, NamedFormulaCollection.NamesWrittenEvents>): IListener.Remove;
308
331
  protected _notifyNamesWritten(item: NamedFormula, removed: boolean): void;
332
+ /** {@link _notifyNamesWritten} for a batch, told as one. */
333
+ protected _notifyManyWritten(items: readonly NamedFormula[], removed: boolean): void;
309
334
  /**
310
335
  * Every name as {@link _addNamesWrittenListener} tells one: what a listener starts from.
311
336
  * @internal
@@ -331,7 +356,7 @@ export declare namespace NamedFormulaCollection {
331
356
  }
332
357
  /** See {@link NamedFormulaCollection._addNamesWrittenListener}. */
333
358
  interface NamesWrittenEvents {
334
- onNamesWritten?(source: NamedFormulaCollection, written: NamesWritten): void;
359
+ onNamesWritten?(source: NamedFormulaCollection, written: readonly NamesWritten[]): void;
335
360
  }
336
361
  interface ConstructorOptions {
337
362
  /**
@@ -396,6 +421,12 @@ export declare namespace NamedFormulaCollection {
396
421
  recompileNamed(nameId: string): void;
397
422
  /** The root of the name's compiled body, or `null` while it has none. */
398
423
  getBodyNode(nameId: string): ICalculation.FormulaNode | null;
424
+ /**
425
+ * The name's precedents or dependents, cells in calc currency and names, as the engine walks
426
+ * them - asked by the name's id, so a name that has not compiled is asked without compiling it.
427
+ * Nothing while the engine is `Off`.
428
+ */
429
+ getNameGraph(nameId: string, kind: 'precedents' | 'dependents', direct: boolean): Promise<ICalcGrid.GraphNeighbors>;
399
430
  /**
400
431
  * Runs `batch` with the grids it makes collected into one write of the engine's registry, under
401
432
  * one clone key - see `CalcBackend._collectingGrids`. Without it each grid is its own write,
@@ -457,7 +488,10 @@ interface NamedFormulaWireOptions {
457
488
  * supplied is implemented here against the transaction store the item already holds.
458
489
  */
459
490
  declare class NamedFormula extends Formula implements ICalculation.INamedFormula, INamed<string> {
460
- /** Transactional state — see the field docs on `_transactions`. */
491
+ /**
492
+ * Transactional state — see the field docs on `_transactions`. A loaded name nothing has written
493
+ * reads what the file said, as does one an undo took back past its first write.
494
+ */
461
495
  private _getNamedState;
462
496
  private readonly _id;
463
497
  /**
@@ -465,7 +499,19 @@ declare class NamedFormula extends Formula implements ICalculation.INamedFormula
465
499
  * mutation is undoable.
466
500
  */
467
501
  private readonly _transactions;
468
- private readonly _stateId;
502
+ /**
503
+ * `null` for a loaded name until its first write: every commit copies the store's snapshot, and a
504
+ * legacy file's tens of thousands of names were nearly all of it. See {@link _writeNamedState}.
505
+ */
506
+ private _stateId;
507
+ /** What a loaded name's file said: its state until written, and again when undone past that write. */
508
+ private readonly _loaded;
509
+ /** Tells the collection a loaded name has a state now, so it hears an undo that removes it. */
510
+ private readonly _noteWritten;
511
+ /** Whether the collection lists this item now — a loaded name's deletion when it has no state. */
512
+ private readonly _isListed;
513
+ /** {@link _loaded}, deleted. */
514
+ private _loadedDeleted;
469
515
  private readonly _deleteFromCollection;
470
516
  private readonly _wire;
471
517
  /** Refuses a rename that would collide with a sibling — see {@link setName}. */
@@ -484,6 +530,11 @@ declare class NamedFormula extends Formula implements ICalculation.INamedFormula
484
530
  private readonly _notifyCollection;
485
531
  /** The collection's {@link NamedFormulaCollection._addNamesWrittenListener}, for a rename. */
486
532
  private readonly _notifyNameWritten;
533
+ /**
534
+ * Made on the first `addListeners`. Every emitter on the shared store is told of every commit, and
535
+ * a legacy file's tens of thousands of names nothing listens to made each commit pay for all of
536
+ * them. Until it exists there is nobody to notify.
537
+ */
487
538
  private _emitter;
488
539
  private _transactionsRemoveListener;
489
540
  private _closed;
@@ -528,8 +579,48 @@ declare class NamedFormula extends Formula implements ICalculation.INamedFormula
528
579
  * `undefined` (no grid, or nothing compiled at its origin) is the pre-wire state, which every
529
580
  * accessor below already has a fallback for.
530
581
  */
582
+ /** Hears this name's own state: made with the item, or by a loaded name's first write. */
583
+ private _listenToState;
584
+ /**
585
+ * Whether an undo has taken this loaded name back past its first write: it has a state id, and
586
+ * the snapshot the store is at does not hold it.
587
+ * @internal
588
+ */
589
+ _isStateAbsent(): boolean;
590
+ /**
591
+ * An undo/redo repointed the store.
592
+ * @internal
593
+ */
594
+ _onRestoreOrRevert(): void;
595
+ /**
596
+ * {@link delete}'s own writes, inside an operation the collection holds — its removal from the
597
+ * set is the caller's, made once for many.
598
+ *
599
+ * @remarks
600
+ * A loaded name nothing has written writes no state: not being listed is its deletion (see
601
+ * {@link _getNamedState}), so deleting a legacy file's thousands of names adds nothing to every
602
+ * later commit's snapshot.
603
+ * @internal
604
+ */
605
+ _deleteWithin(trans: ITransaction): void;
606
+ /**
607
+ * Adds every identifier this name's definition spells, lowercased, to `into` — nothing for a
608
+ * literal, which reads no name.
609
+ * @internal
610
+ */
611
+ _addSpelledNames(into: Set<string>): void;
612
+ /**
613
+ * Writes this item's state in `trans`.
614
+ *
615
+ * @remarks
616
+ * A loaded name has no state until this runs: it is made here, inside the write, so the commit
617
+ * before the write has none and an undo past it reads {@link _loaded} again. Whenever the
618
+ * snapshot holds no state - the first write, or one after such an undo - the write carries the
619
+ * whole of it, since an update merges onto what the store holds.
620
+ */
621
+ private _writeNamedState;
531
622
  protected get _block(): IFormulaBlockView;
532
- constructor(coords: IRange.CellCoords | null, options: INamedFormulasCollection.AddOptions, deleteFromCollection: () => void, wire: NamedFormulaWireOptions | null, gridId?: string | null, checkRename?: (nextName: string) => void, transactions?: ITransaction.IStore, isReadOnly?: (() => boolean) | null, resolveSheetScope?: (stableId: string) => string | null, notifyCollection?: () => void, notifyNameWritten?: () => void, lazy?: boolean);
623
+ constructor(coords: IRange.CellCoords | null, options: INamedFormulasCollection.AddOptions, deleteFromCollection: () => void, wire: NamedFormulaWireOptions | null, gridId?: string | null, checkRename?: (nextName: string) => void, transactions?: ITransaction.IStore, isReadOnly?: (() => boolean) | null, resolveSheetScope?: (stableId: string) => string | null, notifyCollection?: () => void, notifyNameWritten?: () => void, lazy?: boolean, noteWritten?: () => void, isListed?: () => boolean);
533
624
  /**
534
625
  * Writes this name's body, which binds it to the region its expression designates once the
535
626
  * engine answers.
@@ -811,10 +902,15 @@ declare class NamedFormula extends Formula implements ICalculation.INamedFormula
811
902
  getPrecedents(): Promise<ICellRanges | null>;
812
903
  /**
813
904
  * The precedents or dependents of this NAME — cells and names, ONE answer — as the engine walks
814
- * them over its body's grid (see `CalcGridBackend._nameGraphNow` for the walk: the symbol edges
815
- * names ride on, and the cell graph between them).
905
+ * them (see `CalcBackend._nameGraphNow` for the walk: the symbol edges names ride on, and the
906
+ * cell graph between them).
816
907
  *
817
908
  * @remarks
909
+ * Only the precedents read the body, so only they compile it, and a literal has none. The
910
+ * dependents are asked by id and never compile: a formula that reads this name bound it when it
911
+ * compiled, so a name still waiting for its first use has no compiled reader to find — and a
912
+ * report asking every name of a legacy file must not compile thousands of them to learn that.
913
+ *
818
914
  * What is left here is the translation out of calc currency: a cell on no addressable sheet
819
915
  * drops, and the rest are reduced to regions, not a list of blocks - two formulas naming this
820
916
  * name in adjacent cells are one range, and the deep walk can reach one block down two paths.
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * The clone boundary: a test mode that treats the model/engine crossing as if it were a wire
3
- * (DESIGN-CALC-SERVICE §11, goal G1, plan step 6).
3
+ * (DESIGN-CALC-SERVICE §11, goal G1).
4
4
  *
5
5
  * @remarks
6
6
  * Every request into a grid and every {@link ICalcGrid.Results} out of one passes through here.
@@ -235,10 +235,14 @@ export interface NamedNode extends ASTNode<typeof TokenType.Named, NamedReferenc
235
235
  }
236
236
  export interface FunctionNode extends ASTNode<typeof TokenType.Function, any> {
237
237
  /**
238
- * Re use this as a cache for built-in static functions.
239
- *
238
+ * The function this call resolved to.
240
239
  */
241
240
  cacheFn?: IFunction;
241
+ /**
242
+ * The registry stamp `cacheFn` resolved under, for a custom function; `undefined` for a built-in,
243
+ * which never changes.
244
+ */
245
+ cacheFnStamp?: number;
242
246
  }
243
247
  export type ParenNode = ASTNode<typeof TokenType.Paren>;
244
248
  /**