@sheetxl/query 0.8.0-beta.1 → 0.8.0-beta.10

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 (38) hide show
  1. package/browser/esm/index.mjs +3359 -1112
  2. package/node/esm/index.mjs +3637 -1352
  3. package/package.json +6 -7
  4. package/types/src/Tool.d.ts +38 -0
  5. package/types/src/api/apiTool.d.ts +22 -0
  6. package/types/src/api/index.d.ts +4 -0
  7. package/types/src/api/lookupApi.d.ts +163 -0
  8. package/types/src/api/renderApi.d.ts +13 -0
  9. package/types/src/encode/encodeCell.d.ts +9 -7
  10. package/types/src/grep/GrepTypes.d.ts +88 -42
  11. package/types/src/grep/grep.d.ts +4 -1
  12. package/types/src/index.d.ts +9 -0
  13. package/types/src/markdown/appendDependencies.d.ts +106 -0
  14. package/types/src/markdown/appendPivotTables.d.ts +22 -0
  15. package/types/src/markdown/appendSections.d.ts +42 -104
  16. package/types/src/markdown/describeChart.d.ts +72 -0
  17. package/types/src/markdown/describeHistogram.d.ts +186 -0
  18. package/types/src/markdown/describeRegionPayload.d.ts +4 -4
  19. package/types/src/markdown/describeRule.d.ts +5 -5
  20. package/types/src/markdown/describeShape.d.ts +41 -0
  21. package/types/src/markdown/describeStyle.d.ts +7 -7
  22. package/types/src/markdown/findLabels.d.ts +26 -0
  23. package/types/src/markdown/index.d.ts +4 -0
  24. package/types/src/markdown/profileRegion.d.ts +56 -1
  25. package/types/src/markdown/registry.d.ts +11 -2
  26. package/types/src/markdown/renderCell.d.ts +14 -11
  27. package/types/src/markdown/renderCellRange.d.ts +3 -2
  28. package/types/src/markdown/renderModules.d.ts +55 -0
  29. package/types/src/markdown/renderMovable.d.ts +83 -14
  30. package/types/src/markdown/renderNames.d.ts +2 -2
  31. package/types/src/markdown/renderProtection.d.ts +81 -0
  32. package/types/src/markdown/renderRecords.d.ts +8 -0
  33. package/types/src/markdown/renderRegions.d.ts +1 -0
  34. package/types/src/markdown/renderSheet.d.ts +6 -7
  35. package/types/src/markdown/renderStyle.d.ts +2 -2
  36. package/types/src/markdown/renderTable.d.ts +11 -3
  37. package/types/src/markdown/renderWorkbook.d.ts +33 -26
  38. package/browser/cjs/index.cjs +0 -26
@@ -1,4 +1,4 @@
1
- import { IStyle } from '@sheetxl/sdk';
1
+ import { ICellStyle } from '@sheetxl/sdk';
2
2
  /**
3
3
  * Renders a style report: the named style it derives from, plus its direct overrides.
4
4
  *
@@ -8,5 +8,5 @@ import { IStyle } from '@sheetxl/sdk';
8
8
  * the style model grows. No direct properties means the style is entirely inherited; the
9
9
  * report says so instead of enumerating absence (the closed-world contract).
10
10
  */
11
- export declare function renderStyle(style: IStyle): string;
11
+ export declare function renderStyle(style: ICellStyle): string;
12
12
  //# sourceMappingURL=renderStyle.d.ts.map
@@ -1,10 +1,18 @@
1
1
  import { ITable } from '@sheetxl/sdk';
2
2
  import { MarkdownBuilder } from './MarkdownBuilder';
3
3
  /**
4
- * Appends one table's details — shared by the sheet report's Tables section and the standalone
5
- * table report, so the two can never describe a table differently.
4
+ * `## Tables (981 cells · 1 table)` over one `B3:J111 109×9 tblNOI` row per table, its facts
5
+ * indented beneath it.
6
+ *
7
+ * @remarks
8
+ * **The one section a table has.** A table is both a feature partition and a sheet object, and
9
+ * printing it as each said the same thing twice under two headings a letter apart. The row is the
10
+ * partition's — address, size, payload, the form every region listing uses — and the heading
11
+ * carries its two counts, so nothing the partition said is lost.
12
+ *
13
+ * @param cells The cells of `tables` inside the report's scope.
6
14
  */
7
- export declare function appendTableDetails(md: MarkdownBuilder, table: ITable): void;
15
+ export declare function appendTables(md: MarkdownBuilder, tables: readonly ITable[], cells: number): void;
8
16
  /**
9
17
  * Renders a table report.
10
18
  */
@@ -1,43 +1,50 @@
1
1
  import { IWorkbook } from '@sheetxl/sdk';
2
- import { AppendFeatureOptions, AppendNamesOptions } from './appendSections';
2
+ import { AppendNamesOptions } from './appendSections';
3
+ import { RenderModulesOptions } from './renderModules';
3
4
  /**
4
5
  * Options for {@link renderWorkbook}.
5
6
  */
6
- export interface RenderWorkbookOptions extends AppendFeatureOptions, Pick<AppendNamesOptions, 'maxNames'> {
7
- /**
8
- * Cap on sheets expanded into per-sheet sections below the roster; the rest stay roster-only
9
- * and the report says how to render one in full.
10
- *
11
- * @defaultValue 8
12
- */
13
- maxSheets?: number;
7
+ export interface RenderWorkbookOptions extends Pick<AppendNamesOptions, 'maxNames'>, Pick<RenderModulesOptions, 'maxModules'> {
14
8
  }
15
9
  /**
16
- * Renders a markdown summary of a workbook: identity, the sheet roster, what is broken, and each
17
- * sheet's structure.
10
+ * Renders a markdown summary of a workbook: identity, a summary per sheet, what is broken, names
11
+ * and code.
18
12
  *
19
13
  * @remarks
20
14
  * **The workbook report's job is routing** — *which sheet do I go to, and is anything broken?*
21
- * Every line earns its place against that, which is why the roster is a table of routing facts
22
- * (used range, cell/formula/error counts) rather than a list of names, and why errors get a
23
- * section at this altitude: a broken book must not read clean.
24
- *
25
- * **Below the roster, each sheet's own sections render inline** — the same `Type`/partition/
26
- * object sections a sheet report carries, one heading level down, through the same functions so
27
- * the two can never disagree. One shape at every size; scale is absorbed by caps, not by a mode
28
- * switch: on a small book the first call answers structure outright, on a large one every capped
29
- * list states its overflow and the recovery (`maxSheets` sheets expanded, {@link
30
- * MAX_REGIONS_PER_SHEET} regions per feature and {@link MAX_PROFILED_PER_SHEET} profiled —
31
- * tighter than a sheet report's own defaults, because here they share the budget with the whole
32
- * book). Like the sheet report, the expansion carries no `Values` section — that one is
33
- * {@link renderCellRange}'s. A contentful profile is computed shape, bounded by blocks × series
34
- * rather than by cells.
15
+ * Every line earns its place against that, and a broken book must not read clean.
16
+ *
17
+ * **One short summary per sheet, one line per layer.** Content, formulas and styles each have
18
+ * their own extent, so a single `Used` column could only report the widest of them — a column
19
+ * style running to XFC made a 33-row model read as sixteen thousand columns. Each layer line
20
+ * carries its extent and its counts: blocks against cells is the fragmentation signal, formula
21
+ * regions and distinct formulas say how many ideas the model has, and distinct fonts and formats
22
+ * say whether the styling is a convention. A layer that is empty has no line. The structure
23
+ * behind each line is the sheet report's, and the `content` line carries that sheet's call
24
+ * (`wb.getSheet("Sales") lists the blocks`): a reader routes by copying an address off the roster,
25
+ * so the call to the fuller report sits on the line the address is read from. **Twins** — sheets
26
+ * whose formula partitions are identical, where the audit is the diff between them — are named on
27
+ * the sheet.
28
+ *
29
+ * Every sheet is summarized: an agent asked about a sixty-sheet book needs sixty summaries, and
30
+ * there is no cheaper call that gives them. Labels and extents align across sheets, so reading
31
+ * down still compares them.
35
32
  *
36
33
  * Two kinds of broken, kept apart deliberately: an **error** is a successfully calculated error
37
34
  * VALUE (`#DIV/0!` from `=1/0` — the `Error` kind), a **calc failure** is the engine failing to
38
35
  * evaluate at all (mostly circular references — `CalcError`). A book with zero of one and three
39
36
  * of the other is still badly broken, so each gets its own section and neither hides the other.
40
37
  *
38
+ * **Tables, pivot tables and the floating layer each get a line, by type** — `tables`, `charts`,
39
+ * `shapes` — the same names their sections carry on the sheet's report, so a line here is the
40
+ * heading to look for there.
41
+ *
42
+ * **What the author wrote on a sheet is quoted under it.** Text on a shape is a note to the reader
43
+ * — what a block means, which cell to change — and this is the report every reader runs first, so
44
+ * the `shapes` line says how many carry text and the first few follow it, located and
45
+ * unparaphrased. Under the sheet rather than in a section of the book's: a note is about the sheet
46
+ * it sits on, and that is where a reader deciding whether to open the sheet will see it.
47
+ *
41
48
  * Sheet ids are a session concept, not a document concept, and are not stable across runs — they
42
49
  * do not appear here. Hidden sheets are marked inline where they exist rather than summarized in
43
50
  * an always-zero count line: a hidden sheet with data is a classic miss, and the mark is what
@@ -46,5 +53,5 @@ export interface RenderWorkbookOptions extends AppendFeatureOptions, Pick<Append
46
53
  * Pure rendering — the agent-priming preamble the pre-migration SDK report carried
47
54
  * (`PROMPT_STRING`) belongs to the host that primes the agent, not to the report.
48
55
  */
49
- export declare function renderWorkbook(workbook: IWorkbook, options?: RenderWorkbookOptions): string;
56
+ export declare function renderWorkbook(workbook: IWorkbook, options?: RenderWorkbookOptions): Promise<string>;
50
57
  //# sourceMappingURL=renderWorkbook.d.ts.map
@@ -1,26 +0,0 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});let e=require("@sheetxl/sdk");var t;(t||={}).Mode={Display:`display`,Value:`value`};function n(e){return Number.isFinite(e)?function(e){let t=e.indexOf(`e`);if(t===-1)return e;let n=e.substring(t+2);return`${e.substring(0,t)}E${e[t+1]}${n.length<2?`0`+n:n}`}(String(Number(e.toPrecision(15)))):String(e)}function r(t,r){if(!Number.isFinite(t))return String(t);if(!r||r===`General`)return n(t);try{let i=e.NumberFormat.getEngine().format(r,t)?.text;return i?i.trim():n(t)}catch{return n(t)}}function i(e,n){let r=n===t.Mode.Value,i=e.getText({hideStringPrefix:!0,useFormattingCategory:r});return i?{match:i,display:e.getText({useFormattingCategory:r})}:null}function a(t){if(t==null)return null;if(typeof t==`string`)return{match:t,display:`'${t}`};if(typeof t==`boolean`){let e=t?`TRUE`:`FALSE`;return{match:e,display:e}}if(typeof t==`number`){let e=n(t);return{match:e,display:e}}if(e.FormulaError.isError(t)){let e=t.getLabel();return{match:e,display:e}}let r=t.toString();return{match:r,display:r}}var o=[`display`,`value`,`raw`,`formula`,`hyperlink`,`numberFormat`],s=[`display`,`value`,`formula`],c=e=>e.getVisibility()===`visible`,l=(e,t,n)=>{let r=e.getSheets().getItems({visibility:`veryHidden`}),i=t?.trim();if(!i)return r.filter(e=>n||c(e)).map(e=>({sheet:e,address:null}));let a=/^'(.*)'!(.+)$/.exec(i)??/^([^!]+)!(.+)$/.exec(i);if(a){let[,e,t]=a,n=r.find(t=>t.getName()===e);if(!n)throw Error(`Sheet not found: ${e}`);return[{sheet:n,address:t}]}let o=r.find(e=>e.getName()===i);if(o)return[{sheet:o,address:null}];if(/[*?]/.test(i)){let e=(e=>{let t=e.replace(/[.*+?^${}()|[\]\\]/g,e=>e===`*`?`.*`:e===`?`?`.`:`\\${e}`);return RegExp(`^${t}$`)})(i),t=r.filter(t=>e.test(t.getName())&&(n||c(t)));if(t.length===0)throw Error(`No sheets match ${JSON.stringify(i)}. Sheets: ${r.map(e=>e.getName()).join(`, `)}`);return t.map(e=>({sheet:e,address:null}))}let s=r.filter(e=>n||c(e));try{s[0]?.getRange(i)}catch{throw Error(`Unknown scope ${JSON.stringify(i)}: not a sheet name or a range. Sheets: ${r.map(e=>e.getName()).join(`, `)}`)}return s.map(e=>({sheet:e,address:i}))},u=(e,n)=>{switch(n){case`display`:return i(e,t.Mode.Display);case`value`:return i(e,t.Mode.Value);case`raw`:return a(e.getValue());case`formula`:{let t=e.getFormulaText();return t?{match:`=${t}`,display:`=${t}`}:null}case`hyperlink`:{let t=e.getHyperlink()?.getAddress()??null;return t?{match:t,display:t}:null}case`numberFormat`:{let t=e.getStyle().getNumberFormat();return t&&t!==`General`?{match:t,display:t}:null}default:return null}},d=[`hyperlink`,`numberFormat`],f=(e,t,n)=>{let r=null,i=e=>({range:`${t}!${e.getRange().toString()}`,table:e.getName()});return{resolve(a,o){let s=(e=>e.getTable())(a);if(e===`table`)return s?i(s):void 0;if(r===null){r=[];for(let e of n.getRegions()){let n=e.getCoords();n.rowStart===n.rowEnd&&n.colStart===n.colEnd||r.push({coords:n,address:`${t}!${e.toString()}`})}}let c=r.find(({coords:e})=>o.rowIndex>=e.rowStart&&o.rowIndex<=e.rowEnd&&o.colIndex>=e.colStart&&o.colIndex<=e.colEnd);return c?{range:c.address,...s?{table:s.getName()}:{}}:s?i(s):void 0}}};async function p(e,t){if(!t.pattern)throw Error(`grep requires a pattern`);let n=t.fields?.length?t.fields:s,r=t.output??`content`,i=t.maxCount??200,a=!0===t.invert,o=!0===t.hidden,c=(e=>{if(e===void 0||!1===e)return null;if(!0===e)return`contentful`;if(e===`contentful`||e===`table`)return e;throw Error(`Invalid context ${JSON.stringify(e)}: expected 'contentful' or 'table'. Context is the enclosing block, not a line count — a grid has no ±N lines.`)})(t.context),p=(e=>{let t=e.fixedStrings?(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`))(e.pattern):e.pattern;e.word&&(t=`(?<!\\w)(?:${t})(?!\\w)`);let n=e.ignoreCase?`iu`:`u`;try{return new RegExp(t,n)}catch{try{return new RegExp(t,n.replace(`u`,``))}catch(t){throw Error(`Invalid regex ${JSON.stringify(e.pattern)}: ${t instanceof Error?t.message:String(t)}. Use fixedStrings (-F) to search for the literal text.`)}}})(t),m=l(e,t.scope,o),h=!n.some(e=>d.includes(e)),g=n.includes(`display`)&&n.includes(`value`),_=r===`content`||r===`addresses`,v=[],y=[],b=0,x=0,S=!1;for(let{sheet:e,address:t}of m){if(S)continue;let s=e.getName();x++,await e.getCalculation().ready();let l=t===null?e.getUsedRange():e.getRange(t);if(!l)continue;let d=c&&r===`content`?f(c,s,l):null,m=0;l.forEach((e,t)=>{if(h&&e==null)return;let o=t.getCell(),c=[],l,f=null;for(let e of n){let t=u(o,e);if(e===`display`&&(l=t?.match??null),t!==null&&(e!==`value`||!g||(l===void 0&&(l=u(o,`display`)?.match??null),t.match!==l))&&(f===null&&(f={field:e,text:t.display}),p.test(t.match)&&(c.push({field:e,text:t.display}),r===`addresses`&&!a)))break}if(!(a?c.length>0||f===null:c.length===0)){if(i>0&&b>=i)return S=!0,{break:!0};if(b++,m++,_){let e=a?[f]:r===`addresses`?c.slice(0,1):c,n=d?.resolve(o,t.getCoords()),i=t.getAddress();for(let t of e)v.push({sheet:s,address:i,field:t.field,text:t.text,...n?{context:n}:{}})}}},o?void 0:{ignoreHidden:!0}),m>0&&y.push({sheet:s,cells:m})}return{pattern:t.pattern,fields:n,scope:t.scope?.trim()||`workbook`,matches:v,cellCount:b,sheets:y,sheetsSearched:x,sheetsMatched:y.length,truncated:S,output:r}}var m=e=>{let t=e.replace(/\s+/g,` `).trim();return t.length>120?`${t.slice(0,119)}…`:t},h=(e,t,n,r)=>{let i=t.map(e=>r?`${e.sheet}!${e.address}`:e.address),a=Math.max(...i.map(e=>e.length)),o=Math.max(...t.map(e=>e.field.length));for(let r=0;r<t.length;r++){let s=t[r];e.push(`${n}${i[r].padEnd(a)} ${s.field.padEnd(o)} ${m(s.text)}`)}};function g(e){let{pattern:t,fields:n,scope:r,matches:i,cellCount:a,sheetsSearched:o,sheetsMatched:s}=e,c=[`grep "${t}" · ${r} · fields ${n.join(`,`)} · ${a} ${a===1?`cell`:`cells`} in ${s} of ${o} ${o===1?`sheet`:`sheets`}`];if(e.output===`count`)for(let t of e.sheets)c.push(` ${t.sheet}: ${t.cells}`);else if(e.output===`sheets`){for(let t of e.sheets)c.push(` ${t.sheet}`);e.sheets.length===0&&c.push(` no matches`)}else if(i.length===0)c.push(` no matches`);else if(e.output===`addresses`)for(let e of i)c.push(` ${e.sheet}!${e.address}`);else{let e=[],t=new Map;for(let n of i){let r=n.context?.range??``,i=t.get(r);i||(i={key:r,heading:n.context?n.context.table?`${n.context.range} · ${n.context.table}`:n.context.range:null,rows:[]},t.set(r,i),e.push(i)),i.rows.push(n)}for(let t of e)t.heading?(c.push(` ${t.heading}`),h(c,t.rows,` `,!1)):h(c,t.rows,` `,!0)}return e.truncated&&c.push(` …truncated at ${a} ${a===1?`cell`:`cells`} · narrow the pattern, or scope the search to one sheet or range`),c.join(`
2
- `)}var _={name:`grep`,description:`Search cell contents by pattern across a workbook. Returns grid-anchored matches, each tagged with the cell layer it matched. Selection by attribute (fills, formats, features) is the regions read, not grep.`,params:[{name:`pattern`,type:`string`,description:`The regular expression to search for (literal with fixedStrings).`,required:!0,positional:0},{name:`fields`,type:`enum[]`,values:o,defaultValue:s,description:`Cell layers to search: display (number format applied), value (as the formula bar shows it; duplicate of display suppressed per cell), raw (the stored scalar — dates as serials), formula, hyperlink, numberFormat (the format code, e.g. "0.00%").`},{name:`fixedStrings`,type:`boolean`,alias:`F`,defaultValue:!1,description:`Treat the pattern as a literal string, not a regular expression.`},{name:`ignoreCase`,type:`boolean`,alias:`i`,defaultValue:!1,description:`Case-insensitive matching.`},{name:`word`,type:`boolean`,alias:`w`,defaultValue:!1,description:`Require the match to fall on word boundaries (text edges count as edges).`},{name:`invert`,type:`boolean`,alias:`v`,defaultValue:!1,description:`Report cells where no requested field matched. Only cells with text in a requested field are considered — blanks are not findings.`},{name:`scope`,type:`string`,description:`Where to search: a sheet name (globs allowed: "Q*"), a sheet-qualified range (Sheet1!A1:D9), or a bare range applied to every sheet. Defaults to every used range.`},{name:`hidden`,type:`boolean`,defaultValue:!1,description:`Search hidden rows, columns and sheets, which are excluded by default. Naming a hidden sheet in scope always searches it.`},{name:`context`,type:`enum`,values:[`contentful`,`table`],alias:`C`,valueOptional:!0,description:`Annotate and group matches by the block they sit in: contentful (the uniform data region; bare -C means this) or table (enclosing table only). Not a line count — a grid has no ±N lines.`},{name:`maxCount`,type:`number`,alias:`m`,defaultValue:200,description:`Stop after this many matching cells (0 = unlimited). Truncation is always reported, and only when a further match actually exists.`},{name:`output`,type:`enum`,values:[`content`,`addresses`,`count`,`sheets`],defaultValue:`content`,description:`What to return: content (address, layer and text), addresses (one per matched cell), count (per sheet), or sheets (names with a match).`}],run:p,render:g},v=(e,t)=>e<=t+3?e:t,y=e=>{if(!e)return null;let t=String(e.toHex?.()??``);if(!t)return e.toString();let n=/^#FF/i.test(t)&&t.length===9?`#${t.slice(3)}`:t,r=e.toString();if(!r)return n;let i=r.toLowerCase().replace(/^#/,``);return i===n.slice(1).toLowerCase()||i===t.slice(1).toLowerCase()?n:`${n} (${r.replace(/\d+\.\d{4,}/g,e=>String(parseFloat(Number(e).toFixed(2))))})`},b=t=>{let n=t.getFill(),r=n.getType();if(r===e.IFill.Type.None)return null;if(r===e.IFill.Type.Pattern){let t=n,r=t.getPatternType();if(r===e.IFill.BuiltInSheetPattern.None)return null;let i=y(t.getForeground());if(r===e.IFill.BuiltInSheetPattern.Solid)return i?`solid ${i}`:`solid`;let a=y(t.getBackground());return[`${r} pattern`,i,a?`on ${a}`:null].filter(Boolean).join(` `)}let i=y(n.getColor?.());return i?`${r} ${i}`:r},x=e=>{let t=C(e);return t.length>0?t.join(` · `):null},S=new Set([`top`,`left`,`bottom`,`right`]),C=e=>{let t=e.getBorder(),n=[[`top`,t.getTop()],[`left`,t.getLeft()],[`bottom`,t.getBottom()],[`right`,t.getRight()],[`horizontal`,t.getHorizontal()],[`vertical`,t.getVertical()],[`diagonalUp`,t.getDiagonalUp()],[`diagonalDown`,t.getDiagonalDown()]],r=new Map;for(let[e,t]of n){let n=t?.getStyle?.();if(!n||n===`none`)continue;let i=y(t?.getColor?.()),a=i?`${n} ${i}`:n,o=r.get(a);o?o.push(e):r.set(a,[e])}let i=[];for(let[e,t]of r){let n=t.length===4&&t.every(e=>S.has(e));i.push(`${n?`outline`:t.join(`+`)} ${e}`)}return i},w=e=>{let t=e.getNumberFormat();return t&&t!==`General`?t:null},T=(e,t)=>{let n=e.getAlignment(),r=t.getAlignment(),i=[];return n.getHorizontal()!==r.getHorizontal()&&i.push(`h ${n.getHorizontal()}`),n.getVertical()!==r.getVertical()&&i.push(`v ${n.getVertical()}`),n.getOverflow()!==r.getOverflow()&&i.push(n.getOverflow()),n.getIndent()!==r.getIndent()&&i.push(`indent ${n.getIndent()}`),n.getRotation()!==r.getRotation()&&i.push(`rotation ${n.getRotation()}`),i.length>0?i.join(` · `):null},E=(e,t)=>{let n=e.getFont(),r=t.getFont(),i=[];n.getBold()!==r.getBold()&&i.push(n.getBold()?`bold`:`not bold`),n.getItalic()!==r.getItalic()&&i.push(n.getItalic()?`italic`:`not italic`),n.getUnderline()!==r.getUnderline()&&i.push(`underline ${n.getUnderline()}`),n.getStrike()!==r.getStrike()&&i.push(n.getStrike()?`strike`:`not strike`),n.getSize()!==r.getSize()&&i.push(`${n.getSize()}pt`),n.getFamily()!==r.getFamily()&&i.push(n.getFamily());let a=y(n.getColor());return a!==y(r.getColor())&&i.push(a??`no color`),i.length>0?i.join(` · `):null},D=(e,t)=>e.length>t?`${e.slice(0,t-1)}…`:e,O=e=>{if(!e)return null;if(typeof e!=`string`)return y(e);let t=e.replace(/^#/,``);return/^[0-9a-f]{6}$/i.test(t)||/^[0-9a-f]{8}$/i.test(t)?`#${(t.length===8&&/^ff/i.test(t)?t.slice(2):t).toUpperCase()}`:e},k=t=>{if(!t)return null;let n=[],r=(t=>{if(!t)return null;if(typeof t==`string`)return O(t);let n=t.type;if(n===e.IFill.Type.None)return null;if(n===e.IFill.Type.Gradient)return`gradient`;let r=t,i=O(r.foreground??t.color??r.background),a=r.patternType;return[a&&a!==e.IFill.BuiltInSheetPattern.Solid?`${a} pattern`:null,i].filter(Boolean).join(` `)||null})(t.fill);r&&n.push(`fill ${r}`);let i=t.font;if(i){let t=[];(i.weight===void 0?!0===i.bold:i.weight>=600)&&t.push(`bold`),(i.style===void 0?!0===i.italic:i.style===e.IFont.Style.Italic)&&t.push(`italic`),i.strike&&t.push(`strike`),i.underline&&i.underline!==e.IFont.UnderlineStyle.None&&t.push(`underline ${i.underline}`);let r=i.color===`auto`?null:O(i.color);r&&t.push(`text ${r}`),t.length>0&&n.push(t.join(` `))}if(t.numberFormat!==void 0&&t.numberFormat!==null){let e=typeof t.numberFormat==`number`?`numFmt ${t.numberFormat}`:String(t.numberFormat);e&&n.push(e)}return t.border&&n.push(`border`),t.alignment&&n.push(`alignment`),n.length>0?n.join(` · `):null},ee=t=>{let n=t.type??e.IConditionalFormat.ColorStopType.Num,r=t.value,i=r==null||r===``?n:`${n} ${r}`,a=O(t.color);return a?`${i} ${a}`:i},te=t=>{let n=t.type;if(t.type===e.IConditionalFormat.ScaleType.DataBar){let e=O(t.color);e&&(n+=` ${e}`)}else t.type===e.IConditionalFormat.ScaleType.IconSet&&(t.iconSet&&(n+=` ${t.iconSet}`),t.reverse&&(n+=` reversed`),t.icon?.length&&(n+=` custom icons`));let r=(t.stops??[]).map(ee).join(` → `);return r?`${n} · ${r}`:n},ne=`(no rule)`,re=e=>{let t=e.getScale(),n=[];if(t)n.push(te(t));else{n.push(e.getCondition()?.toString()||ne);let t=k(e.getStyle());t&&n.push(`→ ${t}`)}return e.isStopIfTrue()&&n.push(`· stop if true`),D(n.join(` `),90)},ie=e=>{let t=[e.getCondition()?.toString()||ne],n=e.getAlertStyle();return n&&t.push(n),e.isIncludeBlanks()&&t.push(`blanks allowed`),e.isHideDropdown()&&t.push(`no dropdown`),D(t.join(` · `),90)},ae=t=>{if(t?.getOperator()?.getName()!==e.ICondition.BuiltInOperatorNames.InSet)return null;let n=t.getParam()?.items;if(!n)return null;if(typeof n==`string`)return n;let r=n.slice(0,20).map(e=>a(e)?.match??``),i=n.length-r.length;return i>0?`${r.join(`, `)}, +${i} more`:r.join(`, `)},A=(e,t)=>{if(e.length===0)return null;let n=e.slice(0,3).map(t),r=e.length-n.length;return r>0?`${n.join(` | `)} | +${r} more`:n.join(` | `)},j=e.ICellRange.Feature;function M(e,n){let r=n?.maxSeries??24,a=n?.maxProfileCells??2e4,o=n?.maxCategories??3,s=e.getRowCount(),c=e.getColumnCount();if(s===1&&c===1)return{shape:`cell`,summary:`cell · ${i(e.getCell(),t.Mode.Display)?.display??`(blank)`}`,series:[]};let l=e.getRange(),u=l.getCoords(),d=s>=c;if(s===1||c===1)return{shape:`list`,summary:`list · ${ce(l,o)}`,series:[]};let f=function(e,t){let n=e.getRange(),r=n.getCoords(),i=e.getCell().getTable();if(i){let e=i.getColumns().map(e=>e.getName());return{present:!0,inside:!0,note:`table "${i.getName()}"`,names:t?e:null}}let a=t?r.rowStart+1:r.colStart+1,o=N(t?n.getRangeAt(a,r.colStart,r.rowEnd,r.colEnd):n.getRangeAt(r.rowStart,a,r.rowEnd,r.colEnd)),s=t?n.getRangeAt(r.rowStart,r.colStart,r.rowStart,r.colEnd):n.getRangeAt(r.rowStart,r.colStart,r.rowEnd,r.colStart);if(N(s)&&!o)return{present:!0,inside:!0,note:`header `+(t?`row ${r.rowStart+1}`:`column ${me(r.colStart)}`),names:oe(s,e,t)};let c=(t?r.rowStart:r.colStart)-1;if(c>=0&&!N(n)){let i=t?n.getRangeAt(c,r.colStart,c,r.colEnd):n.getRangeAt(r.rowStart,c,r.rowEnd,c);if(N(i))return{present:!0,inside:!1,note:`header ${t?`row ${c+1}`:`column ${me(c)}`} (above this block)`,names:oe(i,e,t)}}return{present:!1,inside:!1,note:`no header detected`,names:null}}(e,d),p=d?c:s,m=d?``:` · by row`,h=f.present&&f.inside,g=d&&h?u.rowStart+1:u.rowStart,_=!d&&h?u.colStart+1:u.colStart,v=u.rowEnd-g+1,y=u.colEnd-_+1,b=v*y>a,x=b&&d?Math.max(1,Math.floor(a/Math.max(1,y))):v,S=b&&!d?Math.max(1,Math.floor(a/Math.max(1,v))):y,C=Math.min(u.rowEnd,g+x-1),w=Math.min(u.colEnd,_+S-1),T=Math.min(p,r),E=[],D=[];for(let t=0;t<T;t++){let n=d?l.getRangeAt(g,u.colStart+t,C,u.colStart+t):l.getRangeAt(u.rowStart+t,_,u.rowStart+t,w);E.push(se(e,d,t,f.names)),D.push(ce(n,o))}let O=E.length?Math.max(...E.map(e=>e.length)):0,k=E.map((e,t)=>`${e.padEnd(O)} ${D[t]}`);p>T&&k.push(`…${p-T} more ${d?`columns`:`rows`} not profiled · read them with getStats()`);let ee=[f.present?`table${m}`:`block${m}`,f.note];return b&&ee.push(`profiled from the first ${d?`${x} rows`:`${S} columns`} of ${d?v:y}`),{shape:f.present?`table`:`block`,summary:ee.filter(Boolean).join(` · `),series:k}}function N(t){let n=t.getStats({onError:`ignore`}),r=n.getCount();return r>0&&(n.getTypedCounts()[e.ScalarType.String]??0)===r}function oe(e,n,r){let a=n.getRange().getCoords(),o=e.getCoords(),s=r?a.colEnd-a.colStart+1:a.rowEnd-a.rowStart+1,c=[];for(let n=0;n<s;n++){let s=r?e.getRangeAt(o.rowStart,a.colStart+n).getCell():e.getRangeAt(a.rowStart+n,o.colStart).getCell();c.push(i(s,t.Mode.Display)?.match??``)}return c}function se(e,t,n,r){let i=e.getRange().getCoords(),a=t?me(i.colStart+n):String(i.rowStart+n+1),o=r?.[n];return o?`${a} ${o}`:a}function ce(t,n=3){let r=t.getStats({onError:`ignore`}),i=r.getTypedCounts(),a=r.getCount(),o=r.getSize(),s=o-a;if(a===0)return`${o} cells, all blank`;let c=t.getCounts([j.Formula])[j.Formula]??0,l=ue(t),u=i[e.ScalarType.Number]??0,d=i[e.ScalarType.String]??0,f=i[e.ScalarType.Error]??0,p=[String(a)],m=!1;if(c===a){let e=[...t.getRegions(j.Formula)];if(e.length===1){let t=e[0].getCell().getFormulaText();p.push(`formula`,t?`=${t}`:`(uniform)`)}else p.push(`formula`,`${e.length} distinct`)}else if(l===a)p.push(`date`,de(r,t));else if(u===a)p.push(`number`,de(r,t),...fe(r,t));else if(d===a)p.push(`text`,pe(r,n));else{let t=[u?`number ${u}`:null,d?`text ${d}`:null,i[e.ScalarType.Boolean]?`boolean ${i[e.ScalarType.Boolean]}`:null,f?`error ${f}`:null].filter(Boolean);p.push(`mixed`,t.join(` · `)),m=!0}let h=[f>0&&!m?`error ${f}`:null,s>0?`${s} blank`:null,c>0&&c!==a?`${c} formula`:null].filter(Boolean),g=p.filter(Boolean).join(` `);return h.length?`${g} · ${h.join(` · `)}`:g}function le(t,n=3){let r=t.getStats({onError:`ignore`}),i=r.getTypedCounts(),a=[],o=i[e.ScalarType.Number]??0;if(o>0){let e=[de(r,t),...fe(r,t)].filter(Boolean);a.push(`Number: ${o} ${e.join(` `)}`.trimEnd())}let s=i[e.ScalarType.String]??0;if(s>0){let e=pe(r,n,e=>typeof e==`string`);a.push(`String: ${s} ${e}`.trimEnd())}let c=i[e.ScalarType.Boolean]??0;if(c>0){let e=pe(r,n,e=>typeof e==`boolean`);a.push(`Boolean: ${c} ${e}`.trimEnd())}return a}function ue(t){let n=0;return t.forEach((t,r)=>{r.getInteropType()===e.InteropScalarType.Date&&n++}),n}function de(e,t){let n=e.getAggregates({onError:`ignore`});if(n.min===null||n.max===null)return``;let i=t.getStyle().getNumberFormat(),a=r(n.min,i),o=r(n.max,i);return a===o?a:`${a} … ${o}`}function fe(e,t){let n=e.getAggregates({onError:`ignore`}),i=t.getStyle().getNumberFormat(),a=[];return n.sum!==null&&a.push(`Σ ${r(n.sum,i)}`),n.average!==null&&a.push(`x̄ ${r(n.average,i)}`),a}function pe(e,t,n){let r=e.getFrequencies(n?{filterFn:n}:void 0),i=r.getUniqueCount();if(i===0)return``;if(i===r.getTotalCount())return`${i} distinct, no repeats`;let a=Array.from(r.getValueCounts()).slice(0,t);return`${i} unique (${a.map(([e,t])=>`${e} ${t}`).join(` · `)}${i>a.length?` · …`:``})`}function me(e){let t=e,n=``;do n=String.fromCharCode(65+t%26)+n,t=Math.floor(t/26)-1;while(t>=0);return n}var P=e.ICellRange.Feature,F=e=>e.getRange().getStyle(),he=e=>i(e.getCell(),t.Mode.Display)?.display??null;function ge(e,t){switch(e){case P.Formula:return e=>{let t=e.getCell().getFormulaText();return t?`=${t}`:null};case P.Error:return he;case P.CalcError:return e=>{let t=he(e)??``,n=e.getCell().getFormulaText();return(n?`${t} =${n}`:t).trim()||null};case P.Merge:return he;case P.Comments:return e=>{let t=e.getCell().getComments()?.content;if(typeof t!=`string`)return null;let n=t.replace(/\s+/g,` `).trim();return n?n.length>60?`${n.slice(0,59)}…`:n:null};case P.Spills:return e=>e.getCell().getSpill()?.getValuesRange().toString()??null;case P.Hyperlink:return e=>e.getCell().getHyperlink()?.getAddress()??null;case P.Table:return e=>e.getCell().getTable()?.getName()??null;case P.Fill:return e=>b(F(e));case P.Border:return e=>x(F(e));case P.NumberFormat:return e=>w(F(e));case P.Alignment:return t?e=>T(F(e),t):void 0;case P.Font:return t?e=>E(F(e),t):void 0;case P.Conditionals:return e=>A(e.getRange().getConditionalFormats(),re);case P.DataValidations:return e=>A(e.getRange().getDataValidations(),ie);case P.Contentful:return e=>le(e.getRange()).join(` `)||null;default:return}}function _e(e,t){let n=e.map(e=>ge(e,t)).filter(e=>!!e);if(n.length!==0)return n.length===1?n[0]:e=>{let t=n.map(t=>t(e)).filter(Boolean);return t.length>0?t.join(` `):null}}var I=class{constructor(){this._lines=[],this._headingOffset=0}setHeadingOffset(e){return this._headingOffset=e,this}_heading(e,t){return this._lines.push(`${`#`.repeat(Math.min(6,e+this._headingOffset))} ${t}`),this}h1(e){return this._heading(1,e)}h2(e){return this._heading(2,e)}h3(e){return this._heading(3,e)}text(e){return this._lines.push(e),this}blank(){return this._lines.push(``),this}bullet(e){return typeof e==`string`?this._lines.push(`- ${e}`):e.forEach(e=>this._lines.push(`- ${e}`)),this}fact(e){return typeof e==`string`?this._lines.push(` ${e}`):e.forEach(e=>this._lines.push(` ${e}`)),this}bold(e){return`**${e}**`}codespan(e){return`\`${e}\``}code(e,t=``){return`\`\`\`${t}\n${e}\n\`\`\``}beginFrame(e){return new ve(this,e)}_addLines(e){this._lines.push(...e)}toLines(){return[...this._lines]}},ve=class{constructor(e,t){this._parent=e,this._headers=t,this._indexWidth=0,this._rows=[],this._colWidths=t.map(e=>e.length)}addRow(e,t){let n=e.map(e=>typeof e==`string`?{text:e}:e);return n.forEach((e,t)=>{this._colWidths[t]=Math.max(this._colWidths[t]??0,e.text.length)}),t!==void 0&&(this._indexWidth=Math.max(this._indexWidth,t.length)),this._rows.push({index:t,cells:n}),this}endFrame(){return this._parent._addLines(this._renderLines()),this._parent}_columnAlignment(e){let t=0,n=0;for(let r of this._rows){let i=r.cells[e];i&&i.text&&(n++,i.alignment===`right`&&t++)}return n>0&&2*t>=n?`right`:void 0}_renderLines(){let e=this._indexWidth>0?` `.repeat(this._indexWidth):``,t=this._colWidths.map((e,t)=>this._columnAlignment(t)),n=[];if(this._headers.some(e=>e.length>0)){let r=this._headers.map((e,n)=>ye(e,this._colWidths[n],t[n])).join(` `);n.push(`${e}${e?` `:``}${r}`.trimEnd())}for(let e of this._rows){let t=e.cells.map((e,t)=>ye(e.text,this._colWidths[t],e.alignment)).join(` `),r=this._indexWidth>0?(e.index??``).padStart(this._indexWidth)+` `:``;n.push(`${r}${t}`.trimEnd())}return n}},ye=(e,t,n)=>{if(e.length>=t)return e;let r=t-e.length;return n===`right`?e.padStart(t):n===`center`?` `.repeat(Math.floor(r/2))+e+` `.repeat(Math.ceil(r/2)):e.padEnd(t)};function be(e,t,n){let r=v(t.length,n?.maxRegions??200),i=t.length>r?t.slice(0,r):t,a=i.length<t.length;if(i.length===0)return void e.text(`None`);let o=i.map(e=>e.toString()),s=Math.max(...o.map(e=>e.length)),c=i.map(e=>`${e.getRowCount()}×${e.getColumnCount()}`),l=Math.max(...c.map(e=>e.length)),u=n?.profile?n?.maxProfiled??12:0;for(let t=0;t<i.length;t++){let r=i[t],a=n?.payload?.(r),d=r.isClipped()?` ✂ clipped at the query edge — the block continues`:``,f=` ${o[t].padEnd(s)} ${c[t].padEnd(l)}`;if(t<u){let t=M(r,n);e.text(`${f} ${t.summary}${d}`);for(let n of t.series)e.text(` ${n}`);continue}e.text(a?`${f} ${a}${d}`:`${f}${d}`.trimEnd())}if(u>0&&i.length>u&&e.text(` …${i.length-u} more regions listed but not profiled · profile one with getRange().getStats(), or loop them in code`),a){let i=n?.recovery??`narrow the range, or loop the regions in code — this listing is a report, not the query`;e.text(` …truncated at ${r} of ${t.length} regions · ${i}`)}}function xe(t,n){let r=[...t],i=t.getFeatures(),a=i.join(`, `),o=i.length===1&&i[0]===e.ICellRange.Feature.Contentful,s=t.getRange().getSheet().getWorkbook()?.getStyles().getNormal()??null,c=new I;return c.h1(`Regions — ${a} (${r.length})`),be(c,r,{...n,profile:o,payload:o?void 0:_e(i,s)}),c.toLines().join(`
3
- `).trimEnd()}function Se(e,t){let n=t.getRange();e.text(`Name: ${t.getName()}`);let r=t.getDescription();r&&e.text(`Description: ${r}`);let i=n.getRowCount(),a=n.getColumnCount();e.text(`Location: ${n.toString()}, ${i} row${i===1?``:`s`} x ${a} column${a===1?``:`s`}`);let o=t.getColumns().map(e=>e.getName());e.text(`Columns (${o.length}): ${o.join(`, `)}`),e.text(`Headers: `+(t.isShowHeaders()?`shown`:`hidden`)),e.text(`Totals: `+(t.isShowTotals()?`shown`:`hidden`))}function Ce(e){let t=new I;return t.h1(`Table — ${e.getName()}`),t.text(`Sheet: ${z(e.getRange().getSheet().getName())}`),t.blank(),Se(t,e),t.toLines().join(`
4
- `).trimEnd()}var L=e.ICellRange.Feature,we=[L.Error,L.CalcError,L.Contentful,L.Formula,L.Spills,L.Merge,L.Table,L.AutoTable,L.Hyperlink,L.Comments,L.Unlock,L.NumberFormat,L.Font,L.Fill,L.Border,L.Alignment,L.Conditionals,L.DataValidations],Te=new Map(Object.entries(L).map(([e,t])=>[t,e])),Ee=e=>Te.get(e)??e;function De(e){let t=new Map(Object.values(L).map(e=>[e.toLowerCase(),e])),n=[];for(let r of e.split(`,`)){let e=r.trim();if(!e)continue;let i=t.get(e.toLowerCase());if(!i)throw Error(`Unknown feature '${e}'. Features: ${Object.values(L).join(`, `)}.`);n.push(i)}return n}var R=e=>`${e.toString()}, ${e.getRowCount()}×${e.getColumnCount()}`,z=t=>e.AddressUtils.sheetNameToString(t)??`Untitled`,Oe=e=>`wb.getSheet(${JSON.stringify(e.getSheet().getName())})`,B=e=>(e=>{if(!e.includes(`$`))return e;let t=``,n=!1;for(let r of e){if(r===`'`)n=!n;else if(r===`$`&&!n)continue;t+=r}return t})(e.getAddress()),V=e=>{let t=B(e);return t.includes(`!`)?t:`${z(e.getSheet().getName())}!${t}`},H=e=>{let t=e.toString();return`${t.includes(`!`)?t:`${z(e.getSheet().getName())}!${t}`}, ${e.getRowCount()}×${e.getColumnCount()}`};function U(t,n){let r=n.getStats({onError:`ignore`}),i=r.getTypedCounts(),a=ue(n),o=[[`Error`,i[e.ScalarType.Error]??0],[`Number`,i[e.ScalarType.Number]??0],[`String`,i[e.ScalarType.String]??0],[`Date`,a],[`Boolean`,i[e.ScalarType.Boolean]??0],[`RichData`,i[e.ScalarType.RichData]??0]].filter(([,e])=>e>0),s=r.getCount();t.h2(`Kind (${s} cell${s===1?``:`s`} · ${o.length} kind${o.length===1?``:`s`})`);for(let[e,n]of o)t.fact(`${e}: ${n}`);o.length===0&&t.fact(`None`),t.blank()}function ke(e,t,n){let r=t.getSheet().getWorkbook()?.getStyles().getNormal()??null,i=n?.features===void 0?null:new Set(typeof n.features==`string`?[n.features]:n.features),a=we.filter(e=>!i||i.has(e));if(a.length===0)return;let o=t.getCounts(a);for(let i of a){let a=[...t.getRegions(i)];if(a.length===0)continue;let s=!!n?.profile&&i===L.Contentful;e.h2(`${Ee(i)} (${Ae(a.length,o[i])})`),be(e,a,{maxRegions:n?.maxRegions,maxProfiled:n?.maxProfiled,profile:s,payload:s?void 0:ge(i,r),recovery:`${Oe(t)}.getRegions(${JSON.stringify(i)}) lists all ${a.length}`}),e.blank()}}var Ae=(e,t)=>`${t} cell${t===1?``:`s`} · ${e} region${e===1?``:`s`}`,je=(e,t)=>e.length>t?`${e.slice(0,t-1)}…`:e,Me=e=>e.isIFormula?e:null,W=e=>{let t=e.getScope();return t?`${z(t)}!${e.getName()}`:e.getName()},Ne=e=>{let t=e.getAddress();return t.includes(`!`)?t:`${z(e.getSheet().getName())}!${t}`};function Pe(e){let t=Me(e),n;return n=t?`=`+t.getExpression():e.getRanges?.()?.getAddress()??``,t?.isVolatile()&&(n+=` (volatile)`),n.trim()}var Fe=new Set([e.FormulaError.Code.Ref,e.FormulaError.Code.Name]),Ie=t=>{let n=t.value,r=e.FormulaError.isError(n)?n:n?.error;return r&&Fe.has(r.getCode())?r.getCode()===e.FormulaError.Code.Name?`#NAME?`:`#REF!`:null},Le=new Set,Re=e=>{let t=e.value;return typeof t==`object`&&t?.name?t.name:e.text??``};function ze(e){let t=null;for(let n=0;n<e.length;n++){let r=e[n];if(r.type!==`named`||!r.context)continue;let i=r.context.name?.toUpperCase();if(i!==`LAMBDA`&&(i!==`LET`||r.context.argIndex%2!=0))continue;let a=n+1;for(;a<e.length&&e[a].type===`whitespace`;)a++;if(e[a]?.type!==`separator`)continue;let o=Re(r).toLowerCase();o&&(t??=new Set).add(o)}return t??Le}function G(e,t,n){if(t.length===0)return;let r=new Set;for(let e of n?.symbols??t)r.add(e.getName().toLowerCase());let i=new Map,a=new Set;for(let e of t)i.set(e.getId(),e),e.getScope()&&a.add(e.getName().toLowerCase());let o=t.map(e=>{let t=function(e,t){let n=Me(e),r=[];if(n){let e=n.getTokens(),i=null,a=null;for(let n of e){if(n.type===`error`){a??=Ie(n);continue}if(n.type!==`named`)continue;let o=Re(n);o&&!t.has(o.toLowerCase())&&(i??=ze(e),i.has(o.toLowerCase())||r.includes(o)||r.push(o))}if(a||r.length>0)return{broken:!0,missing:r,error:r.length>0?`#NAME?: ${r.join(`, `)}`:a};if(!n.isReferenceOnly())return{broken:!1,missing:r,error:``}}let i=null;try{i=e.getRanges?.()??null}catch{return{broken:!0,missing:r,error:`#REF!`}}let a=!i||i.isInvalidAny();return{broken:a,missing:r,error:a?`#REF!`:``}}(e,r),n=Me(e),o=n?function(e,t){let n=e.getDirectDependents(),r=0,i=[],a=new Set,o=[];if(n){let e=n.getCoords(),s=n.getCount();for(let c=0;c<s;c++){let s=n.at(c);if(s.isINamedRange){let e=s;if(a.has(e.getId()))continue;a.add(e.getId());let n=t.get(e.getId());i.push(n?W(n):e.getName())}else{let t=e[c];r+=(t.rowEnd-t.rowStart+1)*(t.colEnd-t.colStart+1),o.push(Ne(s))}}}let s=r+i.length;if(s===0)return{text:`unused`,weight:s};let c=[...i,...o],l=[],u=0;for(let e=0;e<c.length;e++){let t=(l.length>0?2:0)+c[e].length;if(l.length>0&&u+t>60)break;l.push(l.length===0?je(c[e],60):c[e]),u+=t}let d=c.length-l.length,f=d>0?`, +${d} more`:``;return{text:`${s} · ${l.join(`, `)}${f}`,weight:s}}(n,i):null;o?.weight===0&&!e.getScope()&&a.has(e.getName().toLowerCase())&&(o={...o,text:`unused · shadowed`});let s=e.getComment()??``,c=W(e);return{name:c,refersTo:Pe(e),dependents:o,hidden:e.isHidden(),comment:je(s,60),broken:t.broken,error:t.error,sortKey:c.toLowerCase().replace(/'/g,``)}}),s=(e,t)=>{let n=(t.dependents?.weight??0)-(e.dependents?.weight??0);return n===0?e.sortKey.localeCompare(t.sortKey):n},c=[...o.filter(e=>e.broken).sort(s),...o.filter(e=>!e.broken).sort(s)],l=v(c.length,n?.maxNames??200),u=c.length>l?c.slice(0,l):c,d=u.filter(e=>e.broken),f=u.filter(e=>!e.broken);e.h2(`${n?.heading??`Names`} (${o.length})`);let p=(t,n)=>{let r=t.some(e=>e.hidden),i=t.some(e=>e.comment.length>0),a=t.some(e=>e.dependents!==null),o=[`Name`,`Refers To`];n&&o.push(`Error`),a&&o.push(`Dependents`),r&&o.push(`Hidden`),i&&o.push(`Comment`);let s=e.beginFrame(o);for(let e of t){let t=[{text:e.name},{text:e.refersTo}];n&&t.push({text:e.error}),a&&t.push({text:e.dependents?.text??``}),r&&t.push({text:e.hidden?`hidden`:``}),i&&t.push({text:e.comment}),s.addRow(t)}s.endFrame()};if(d.length>0){let t=c.reduce((e,t)=>e+ +!!t.broken,0);e.text(`${t} ${t===1?`does`:`do`} not resolve:`),p(d,!0),e.blank()}if(f.length>0&&p(f,!1),u.length<o.length){let t=n?.recovery??`getByName('Name') renders one in full`;e.text(` …and ${o.length-u.length} more · ${t}`)}e.blank()}function K(e,t,n){Ve(e,`Precedents`,t,`precedents`,n),Ve(e,`Dependents`,t,`dependents`,n)}function Be(e){let t=e.isINamedRange?e.getId():null;if(t)return`name:${t}`;let n=e.getCoords();return`${e.getSheet()?.getName()??``}!${n.rowStart},${n.colStart},${n.rowEnd},${n.colEnd}`}function Ve(e,t,n,r,i){let a=i?.maxDepth??3,o=i?.maxNodes??50,s=[],c=new Set,l=new Set,u=!1,d=!1,f=!1,p=(e,t)=>{let n=(e=>r===`precedents`?e.getDirectPrecedents():e.getDirectDependents())(e);if(n&&n.length!==0)if(t>a)u=!0;else for(let e=0;e<n.length;e++){if(s.length>=o)return void(d=!0);let r=n.at(e),{address:i,sheet:a,isName:u}=He(r),m=` `.repeat(t),h=Be(r),g={indent:m,sheet:a,isName:u,label:`${m}${i}`};l.has(h)?(s.push({...g,detail:`↺ circular`}),f=!0):c.has(h)?s.push({...g,detail:`↑ shown above`}):(c.add(h),l.add(h),s.push({...g,detail:Ue(r)}),p(r,t+1),l.delete(h))}};if(p(n,0),s.length===0)return;let m=s.filter(e=>!e.isName);if(m.length>0&&m.some(e=>e.sheet!==m[0].sheet))for(let e of s)e.isName||(e.label=`${e.indent}${e.sheet}!${e.label.slice(e.indent.length)}`);e.h2(t);let h=Math.max(...s.map(e=>e.label.length));for(let t of s)e.text(` ${t.label.padEnd(h)} ${t.detail}`.trimEnd());f&&e.text(` ↺ circular reference — the chain returns to a cell already on this branch`);let g=r===`precedents`?`getPrecedents()`:`getDependents()`;if(u&&e.text(` …deeper levels not walked · ${g} is the whole reach, flat`),d){let t=r===`precedents`?`getDirectPrecedents()`:`getDirectDependents()`;e.text(` …truncated at ${o} nodes · re-root on one node and walk it — its ${t}`)}e.blank()}function He(e){let t=e.getSheet()?.getName()??``;if(e.isINamedRange)return{address:e.getName(),sheet:t,isName:!0};let n=e.getAddress(),r=n.lastIndexOf(`!`);return{address:r>=0&&r<n.length-1?n.slice(r+1):n,sheet:t,isName:!1}}function Ue(e){if(e.isINamedRange){let t=e.getRanges();return t?`name → ${t.getAddress()}`:`name`}if(e.isSingleCell()){let n=e.getCell(),r=i(n,t.Mode.Display),a=n.getFormulaText(),o=r?r.display:`(empty)`;return a?`${o} =${a}`:o}let n=`${e.getRowCount()}×${e.getColumnCount()}`,r=[...e.getRegions(L.Formula)];if(r.length===1&&r[0].getRange().isEqual(e)){let e=r[0].getCell().getFormulaText();if(e)return`${n} =${e}`}return n}function We(e,t,n){let r=n.getCoords().min,i=[],a=0,o=0;if(n.forEachSpan((e,t)=>{let s=t.getCoords();if(o++,a+=s.max-s.min+1,i.length>=100)return;let c=n.at(s.min-r).getText(),l=n.at(s.max-r).getText();i.push({address:`${c}:${l}`,count:s.max-s.min+1})},{visibility:`hidden`,includeEmpty:!0}),a===0)return;e.h2(`${t} (${a})`);let s=Math.max(...i.map(e=>e.address.length));for(let t of i)e.text(` ${t.address.padEnd(s)} ${t.count}`);o>i.length&&e.text(` …and ${o-i.length} more`),e.blank()}function Ge(e,t,n,r){if(n.length===0)return;let i=n.length>50?n.slice(0,50):n,a=i.map(e=>({address:je(B(e.getRanges()),40),rule:r(e)}));e.h2(`${t} (${n.length})`);let o=Math.max(...a.map(e=>e.address.length));for(let t of a)e.text(` ${t.address.padEnd(o)} ${t.rule}`.trimEnd());i.length<n.length&&e.text(` …and ${n.length-i.length} more`),e.blank()}function q(e,t){let n=t.getSheet(),r=t.getCoords(),i=n.getName(),a=[];for(let e of n.getNames().getItems({type:`formula`,includeHidden:!0})??[]){let t=null;try{t=e.getRanges?.()??null}catch{}t?t.getCoords().some(e=>{return(!e.scope||e.scope===i)&&(n=e,(t=r).rowStart<=n.rowEnd&&n.rowStart<=t.rowEnd&&t.colStart<=n.colEnd&&n.colStart<=t.colEnd);var t,n})&&a.push(e):e.getScope()===i&&a.push(e)}G(e,a,{symbols:n.getWorkbook()?.getNames().getItems({includeHidden:!0})??n.getNames().getItems({includeHidden:!0})??[]});let o=t.getColumnHeaders(),s=t.getRowHeaders();We(e,`Hidden Columns`,o),We(e,`Hidden Rows`,s);let c=t.getTables();c.length>0&&(e.h2(`Tables`),c.forEach((t,n)=>{n>0&&e.blank(),Se(e,t)}),e.blank())}var Ke={features:e=>De(e),mode:(e,n)=>function(e,t,n){let r=new Map(Object.values(n).map(e=>[e.toLowerCase(),e])).get(e.trim().toLowerCase());if(!r)throw Error(`Unknown ${t} '${e}'. Values: ${Object.values(n).join(`, `)}.`);return r}(e,n,t.Mode)},qe=Object.keys(Ke);function Je(e,n){e=e.getSheet().getRange(e.getCoords()).getCell();let r=new I;return r.h1(`Cell — ${z(e.getSheet().getName())}!${e.getAddress()}`),r.blank(),function(e,n){let r=i(n,t.Mode.Display),a=i(n,t.Mode.Value),o=n.getFormulaText(),s=e.toLines().length;(r||o)&&(e.fact(`Type: ${n.getType()}`),r&&e.fact(`Display: ${r.display}`),a&&a.match!==r?.match&&e.fact(`Value: ${a.display}`),o&&e.fact(`Formula: ${e.codespan(`=${o}`)}`));let c=n.getHyperlink();c&&e.fact(`Hyperlink: ${c.getAddress()}`);let l=n.getSpans(),u=!n.isTopLeft();if(u||l.height>1||l.width>1){let t=n.getRange().toString();e.fact(`Merge: ${t} · ${l.height}×${l.width}`),u&&e.fact(`Merge Anchor: false — this cell is covered; the value lives at the top-left`)}let d=n.getSpill();d&&e.fact(`Spill: ${d.toString()}`),n.isSpillOverflow()&&e.fact(`Spill Overflow: true — the anchor formula is elsewhere`);let f=n.getTable();f&&e.fact(`Table: ${f.getName()}`);let p=n.getErrors();p.length>0&&e.fact(`Errors: ${p.join(`; `)}`);let m=n.getWarnings();m.length>0&&e.fact(`Warnings: ${m.join(`; `)}`),e.toLines().length>s&&e.blank()}(r,e),function(e,t){let n=t.getStyle(),r=t.getSheet().getWorkbook()?.getStyles().getNormal()??null,i=w(n),a=r?E(n,r):null,o=b(n),s=C(n),c=r?T(n,r):null,l=n.getNamed().getName();if(l!==(r?.getNamed().getName()??`Normal`)||i||a||o||c||s.length!==0){if(e.h2(`Style`),e.fact(`Named: ${l}`),i&&e.fact(`Number Format: ${i}`),a&&e.fact(`Font: ${a}`),o&&e.fact(`Fill: ${o}`),s.length===1)e.fact(`Border: ${s[0]}`);else if(s.length>1){e.fact(`Border:`);for(let t of s)e.fact(` ${t}`)}c&&e.fact(`Alignment: ${c}`),e.blank()}}(r,e),K(r,e,n),r.toLines().join(`
5
- `).trimEnd()}var Ye=new Set([`picture`]),Xe=e=>e.replace(/[\r\n]+/g,` `).trim(),Ze=e=>{switch(e.getType()){case`chart`:{let t=[],n=e.getChartType?.();n&&n!==`unknown`&&t.push(n);let r=e.getChartTitle?.();return r&&t.push(`"${r}"`),t.length>0?t.join(` · `):null}case`picture`:return e.getResource?.()?.getName()||null;default:return null}},Qe=e=>{let t=e.getContent(),n=[],r=Ze(t);r&&n.push(r);let i=e.getDescription();i&&n.push(Xe(i));let a=e.getName()||`(unnamed)`,o=n.length>0?`${a} — ${n.join(` · `)}`:a;return c=90,((s=o).length>c?`${s.slice(0,c-1)}…`:s)+(e.isHidden()?` (hidden)`:``);var s,c};function $e(e,t){if(t.length===0)return;let n=t.length>50?t.slice(0,50):t,r=n.map(e=>({address:e.getRange().toString(),type:e.getContent().getType(),summary:Qe(e)}));e.h2(`Movables (${t.length})`);let i=Math.max(...r.map(e=>e.address.length)),a=Math.max(...r.map(e=>e.type.length));for(let t of r)e.text(` ${t.address.padEnd(i)} ${t.type.padEnd(a)} ${t.summary}`.trimEnd());n.length<t.length&&e.text(` …and ${t.length-n.length} more`);let o=[...new Set(r.map(e=>e.type).filter(e=>!Ye.has(e)))];o.length>0&&e.text(` Not drawn: ${o.join(`, `)} — SheetXL shows a labeled placeholder for these in the UI.`),e.blank()}function et(t){let n=new I,r=t.getRange(),i=t.getContent(),a=i.getType();n.h1(`Movable — ${H(r)}`),n.blank(),n.fact(`Name: ${t.getName()||`(unnamed)`}`),n.fact(`Type: ${a}`);let o=Ze(i);o&&n.fact(`Content: ${o}`);let s=t.getDescription();s&&n.fact(`Alt Text: ${Xe(s)}`),n.fact(`Anchor: ${R(r)}, ${(t=>{switch(t){case e.IAnchored.Type.Absolute:return`absolute — stays put when rows or columns move`;case e.IAnchored.Type.OneCell:return`oneCell — moves with the cells, keeps its size`;default:return`twoCell — moves and resizes with the cells`}})(t.getAnchorType?.())}`),n.fact(`Bounds: ${(e=>{let t=e.getBounds();if(!t)return`not laid out`;let n=e=>Math.round(e);return`${n(t.width)}×${n(t.height)} px at (${n(t.x)}, ${n(t.y)})`})(t)}`),t.isHidden()&&n.fact(`Hidden: true — this object is not visible in the UI`);let c=t.getRotation();return c!==0&&n.fact(`Rotation: ${c}°`),n.fact(`Z-Order: ${t.getZIndex()}`),n.fact(`Display: ${(e=>Ye.has(e)?`drawn`:`placeholder — SheetXL frames the ${e} at this position but does not draw its content`)(a)}`),n.blank(),n.text(`Sheet: ${z(r.getSheet().getName())}`),n.toLines().join(`
6
- `).trimEnd()}function tt(n,r){let a=new I;a.h1(`Cell Range — ${H(n)}`),a.blank(),U(a,n),function(e,t,n){if(!1===n?.profile||t.isSingleCell()||!t.isContentful())return;let r=M({getRowCount:()=>t.getRowCount(),getColumnCount:()=>t.getColumnCount(),getCell:()=>t.getCell(),getRange:()=>t},n);e.h2(`Profile`),e.text(r.summary);for(let t of r.series)e.text(` ${t}`);e.blank()}(a,n,r);let o=function(e,n,r){let a=r?.mode??t.Mode.Display,o=r?.maxCells??1e3,{rowStart:s,colStart:c}=n.getCoords(),l=n.getRowHeaders(),u=n.getColumnHeaders(),d=new Map,f=[],p=0,m=!1;n.forEach((e,t)=>{if(p>=o)return m=!0,{break:!0};let n=t.getCell(),r=n.getFormulaText(),s=i(n,a);if(!s&&!r)return;let c={text:(s?.display??``).replace(/\|/g,`\\|`).replace(/[\r\n]+/g,` `),alignment:n.getRenderHorizontalAlignment()},l=n.getSpill();l&&f.push({address:n.getAddress(),valuesRange:l.getValuesRange().toString()});let{rowIndex:u,colIndex:h}=t.getCoords(),g=d.get(u);g||(g=new Map,d.set(u,g)),g.set(h,c),p++});let h=Array.from(d.keys()).sort((e,t)=>e-t),g=new Set;d.forEach(e=>e.forEach((e,t)=>g.add(t)));let _=Array.from(g).sort((e,t)=>e-t);if(h.length===0)return{spills:f};let v=n.getIntersect({rowStart:h[0],rowEnd:h[h.length-1],colStart:_[0],colEnd:_[_.length-1]}),y=`${p} cell${p===1?``:`s`}`,b=v.toString()!==n.toString();e.h2(`Values (${b?`${R(v)} · `:``}${y})`);let x=e.beginFrame(_.map(e=>u.at(e-c).getText()));for(let e of h){let t=d.get(e);x.addRow(_.map(e=>t?.get(e)??{text:``}),l.at(e-s).getText())}return x.endFrame(),m&&e.text(`…truncated at ${o} cells · narrow the address, or summarize the whole range with getStats()`),e.blank(),{spills:f}}(a,n,r);return function(t,n,r){let i=[];for(let t of n.getRegions(e.ICellRange.Feature.Formula)){let e=t.getCell().getFormulaText();if(e&&(i.push({address:t.getAddress(),size:`${t.getRowCount()}×${t.getColumnCount()}`,formula:`=${e}`}),i.length>=(r?.maxRegions??100)))break}if(i.length===0)return;t.h2(`Formulas`);let a=Math.max(...i.map(e=>e.address.length)),o=Math.max(...i.map(e=>e.size.length));for(let e of i)t.text(` ${e.address.padEnd(a)} ${e.size.padEnd(o)} ${e.formula}`);t.blank()}(a,n,r),function(e,t){if(t.length===0)return;e.h2(`Spills`);let n=Math.max(...t.map(e=>e.address.length));for(let{address:r,valuesRange:i}of t)e.text(` ${r.padEnd(n)} ${i}`);e.blank()}(a,o.spills),q(a,n),$e(a,n.getMovables()),Ge(a,`Conditional Formats`,n.getConditionalFormats(),re),Ge(a,`Data Validations`,n.getDataValidations(),ie),K(a,n,r),a.toLines().join(`
7
- `).trimEnd()}function nt(e){let t=new I,n=e.getRanges();t.h1(`Conditional Format — ${V(n)}`),t.blank(),t.fact(`Order: ${e.getIndex()+1}`);let r=e.getScale();if(r)t.fact(`Rule: ${te(r)}`);else{let n=e.getCondition();t.fact(`Rule: ${n?.toString()||`none — this rule tests nothing`}`);let r=k(e.getStyle());r&&t.fact(`Format: ${r}`)}return e.isStopIfTrue()&&t.fact(`Stop If True: true — later rules are not evaluated where this one matches`),t.fact(`Cells: ${n.size}`),t.toLines().join(`
8
- `).trimEnd()}function rt(e){let t=new I;t.h1(`Counts`);let n=!1;for(let[r,i]of Object.entries(e))i>0&&(t.fact(`${r}: ${i}`),n=!0);return n||t.fact(`None`),t.toLines().join(`
9
- `).trimEnd()}function it(t){let n=new I,r=t.getRanges();n.h1(`Data Validation — ${V(r)}`),n.blank();let i=t.getCondition();n.fact(`Rule: ${i?.toString()||`none — anything is accepted here`}`);let a=ae(i);a&&n.fact(`Allowed: ${a}`),n.fact(`Blanks: `+(t.isIncludeBlanks()?`allowed`:`rejected`));let o=t.getAlertStyle();if(n.fact(`Alert: ${o}${o===e.IDataValidation.AlertStyle.Stop?` — the entry is refused`:` — the entry is accepted anyway`}`),t.isShowAlertMessage()){let e=at(t.getAlertTitle(),t.getAlertMessage());e&&n.fact(`Alert Message: ${e}`)}if(t.isShowPromptMessage()){let e=at(t.getPromptTitle(),t.getPromptMessage());e&&n.fact(`Prompt: ${e}`)}return t.isHideDropdown()&&n.fact(`Dropdown: hidden`),n.fact(`Cells: ${r.size}`),n.toLines().join(`
10
- `).trimEnd()}var at=(e,t)=>{let n=[e?.trim(),t?.trim()].filter(Boolean);return n.length>0?n.join(` — `):null},ot=`function`,st=`named`,ct=`tableReference`,lt=`tableColumn`,ut=`externalReference`,dt=[[`isReferenceOnly`,`reference-only`],[`isVolatile`,`volatile`]],ft=(e,t)=>e?` (${z(e)}!${t})`:``;function pt(e,t,n,r){if(e===`external`)return`another workbook — not resolvable from here`;if(!n)return``;switch(e){case`function`:{let e=n.getCalculation().getFunctions().getByName(t);return e?e.isBuiltIn()?`built-in`:`custom`:`unknown — evaluates to #NAME?`}case`named`:return function(e,t){let n=t.getNames(),r=n.getByName(e)??n.getByName(e,!0);if(r){let e=ft(r.getScope(),r.getName()),t=r.getRanges?.();return!t||t.isInvalid()?`defined name — reference does not resolve${e}`:`${t.toString()}${e}`}let i=t.getCalculation().getNamedFormulas().getByName(e);return i?`=${i.getExpression()}${ft(i.getScope(),i.getName())}`:`unknown — evaluates to #NAME?`}(t,n);case`table`:{let e=n.getTables().getByName(t)??n.getWorkbook()?.getSheets().getItems().map(e=>e.getTables().getByName(t)).find(Boolean)??null;return e?((e,t)=>{let n=e.getSheet(),r=e.toString();return!n||t&&n.getName()===t.getName()||r.includes(`!`)?r:`${z(n.getName())}!${r}`})(e.getRange(),n):`unknown — evaluates to #NAME?`}case`column`:{if(!r)return`column of the enclosing table`;let e=n.getTables().getByName(r);if(!e)return`column of ${r}`;let i=t.replace(/^\[|\]$/g,``).trim();return e.getColumns().find(e=>e.getName()===i)?`${r} column`:`no such column in ${r} — evaluates to #REF!`}}return``}async function mt(e,t){let n=t?.maxTokens??200,r=new I,i=(e=>e.isINamed?e:null)(e);if(r.h1(i?`Name — ${W(i)}`:`Formula`),r.text(r.codespan(`=`+e.getExpression())),r.blank(),i){i.isHidden()&&r.fact(`Hidden: true — not offered in the UI; formulas resolve it normally`);let e=i.getComment();e&&r.fact(`Comment: ${e}`);let t=i.getRanges?.();r.fact(`Refers to: ${t?t.getAddress():`no range — this name holds an expression`}`)}await async function(e,t){let n;try{n=await t.evaluate()}catch(t){e.fact(`Value: did not evaluate — ${t?.message??String(t)}`);return}if((r=n)&&typeof r==`object`&&!0===r.isIRange)return void e.fact(`Value: spills ${n.getRowCount()}×${n.getColumnCount()} — an array result`);var r;let i=a(n);e.fact(`Value: ${i?i.display:`(empty)`}`)}(r,e),r.fact(`Status: ${e.getCalculationStatus()}`),e.isValid()||r.fact(`Valid: false — the text did not parse as a complete expression`);let o=dt.filter(([t])=>e[t]()).map(([,e])=>e);o.length>0&&r.fact(`Flags: ${o.join(` · `)}`),r.blank();let s=e.getReferences(),c=t?.context??s?.getSheet()??null,l=function(e,t){let n=new Map,r=null;for(let i of e){let e=i.text?.trim();if(!e)continue;let a;switch(i.type){case ot:a=`function`;break;case st:a=`named`;break;case ct:a=`table`,r=e;break;case lt:a=`column`;break;case ut:a=`external`;break;default:continue}let o=`${a}${e.toLowerCase()}`,s=n.get(o);s?s.uses++:n.set(o,{kind:a,text:e,uses:1,resolution:pt(a,e,t,r)})}return[...n.values()]}(e.getTokens(),c);if(l.length>0){r.h2(`Symbols (${l.length})`);let e=r.beginFrame([`Kind`,`Symbol`,`Uses`,`Resolves to`]);for(let t of l)e.addRow([t.kind,t.text,String(t.uses),t.resolution]);e.endFrame(),c||r.text("…no sheet context — pass `context` to resolve these"),r.blank()}if(r.h2(`References`),s&&s.length!==0)for(let e=0;e<s.length;e++)r.text(` ${String(e).padStart(2)} ${s.at(e).getAddress()}`);else r.text(`None`);r.blank(),i&&function(e,t){t.getDirectDependents()||(e.h2(`Dependents (0)`),e.text(` None — no formula references this name`),e.blank()),K(e,t)}(r,i);let u=e.getTokens();if(r.h2(`Tokens`),u.length===0)r.text(`None`);else{let e=u.length>n?u.slice(0,n):u,t=r.beginFrame([`#`,`Type`,`Text`,`Enclosing`,`Arg`]);for(let n=0;n<e.length;n++){let r=e[n],i=r.context;t.addRow([{text:String(n),alignment:`right`},r.type??``,r.text??``,i?.name??``,i&&i.argIndex>=0?String(i.argIndex):``])}t.endFrame(),e.length<u.length&&r.text(`…truncated at ${e.length} of ${u.length} tokens · search getTokens() directly`)}return r.toLines().join(`
11
- `).trimEnd()}var ht=[[`formula`,`Names`],[`table`,`Tables`]];function gt(e,t){let n=new I,r=e.getItems({includeHidden:!0})??[];if(n.h1(`Names — ${r.length} item${r.length===1?``:`s`}`),n.blank(),r.length===0)return n.text(`None`),n.toLines().join(`
12
- `).trimEnd();let i=new Set(ht.map(([e])=>e));for(let[e,i]of ht)G(n,r.filter(t=>t.getType()===e),{...t,heading:i,symbols:r});let a=r.filter(e=>!i.has(e.getType())),o=[...new Set(a.map(e=>e.getType()))].sort();for(let e of o)G(n,a.filter(t=>t.getType()===e),{...t,heading:e,symbols:r});return n.toLines().join(`
13
- `).trimEnd()}var J=e=>{if(!e||typeof e!=`object`||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null};function Y(e,t){let n=t?.maxCells??1e3,r=Array.isArray(e)?e:[e],i=new I;if(i.h1(`Records`),i.text(`Count: ${r.length}`),i.blank(),r.length===0)return i.text(`None`),i.toLines().join(`
14
- `).trimEnd();let a=e=>{let t=[],n=new Set;for(let r of e)for(let e of Object.keys(r??{}))n.has(e)||(n.add(e),t.push(e));return t},o=Math.max(1,a(r).length),s=v(r.length,Math.max(1,Math.floor(n/o))),c=r.length>s?r.slice(0,s):r,l=c.length===r.length?a(r):a(c);if(l.length===0)return i.text(`No fields`),i.toLines().join(`
15
- `).trimEnd();let u=i.beginFrame(l);for(let e of c)u.addRow(l.map(t=>_t(e?.[t])));return u.endFrame(),c.length<r.length&&i.text(`…truncated at ${c.length} of ${r.length} records · filter, sort or aggregate the array in the expression`),i.toLines().join(`
16
- `).trimEnd()}var _t=e=>{if(e==null)return{text:``};if(typeof e==`function`)return{text:`[Function]`};if(typeof e==`bigint`||typeof e==`symbol`)return{text:X(String(e))};if(typeof e==`object`){if(e instanceof Date)return{text:e.toISOString()};let t=e;if(!0===t.isFormulaError||!0===t.isIRichData)return{text:X(vt(e))};if(J(e)||Array.isArray(e)){let t;try{t=JSON.stringify(e)??String(e)}catch{t=`[circular]`}return{text:X(t)}}return{text:X(String(e))}}let t=X(vt(e).replace(/[\r\n]+/g,` `));return typeof e==`number`?{text:t,alignment:`right`}:{text:t}},vt=e=>{try{return a(e)?.match??String(e)}catch{return String(e)}},X=e=>e.length>80?`${e.slice(0,79)}…`:e;function yt(e,t){let n=e.length,r=v(n,t?.maxRanges??100),i=Math.min(n,r),a=[];for(let t=0;t<i;t++){let n=e.at(t);a.push({...He(n),detail:Ue(n)})}let o=a.filter(e=>!e.isName),s=o.length>0&&o.some(e=>e.sheet!==o[0].sheet),c=o.length>0?o[0].sheet:e.getSheet()?.getName(),l=new I,u=a.length>0&&!s&&!!c;if(l.h1(u?`Ranges — ${z(c)} (${n})`:`Ranges (${n})`),a.length===0)return l.text(`none`),l.toLines().join(`
17
- `).trimEnd();let d=a.map(e=>s&&!e.isName?`${z(e.sheet)}!${e.address}`:e.address),f=Math.max(...d.map(e=>e.length));for(let e=0;e<a.length;e++)l.text(` ${d[e].padEnd(f)} ${a[e].detail}`.trimEnd());return i<n&&l.text(` …and ${n-i} more · loop the collection in code to see them all`),l.toLines().join(`
18
- `).trimEnd()}function bt(t,n){let r=new I,i=t.getSelectedRange(),a=t.getUsedRange();r.h1(`Sheet — ${z(t.getName())}${function(t){let n=t.getWorkbook(),r=``;n&&n.getSelectedSheet()?.getId()===t.getId()&&(r+=` (selected)`);let i=t.getVisibility();return i===e.ISheet.Visibility.Hidden?r+=` (hidden)`:i===e.ISheet.Visibility.VeryHidden&&(r+=` (very hidden)`),r}(t)}`),r.text(`Used: ${a?R(a):`empty`}`),r.text(`Selection: ${R(i)}`),r.blank();let o=a??i;return U(r,o),ke(r,o,{profile:!0,...n}),q(r,o),$e(r,t.getMovables().getItems()),r.toLines().join(`
19
- `).trimEnd()}var xt=[[`numericalCount`,`Numbers`],[`sum`,`Sum`],[`min`,`Min`],[`max`,`Max`],[`average`,`Average`],[`stdDev`,`StdDev`]];function St(t){let r=new I;r.h1(`Stats`);let i=t.getTypedCounts();r.fact(`Cells: ${t.getSize()}`),r.fact(`Values: ${t.getCount()}`);let a=i[e.ScalarType.Error]??0;a>0&&r.fact(`Errors: ${a}`);let o=t.getAggregates({onError:`ignore`});for(let[e,t]of xt){let i=o[e];i!=null&&r.fact(`${t}: ${n(i)}`)}let s=[];for(let[t,n]of Object.entries(i))t!==e.ScalarType.Null&&n&&s.push(`${t.charAt(0).toUpperCase()}${t.slice(1)}: ${n}`);return s.length>0&&(r.blank(),r.h2(`Type`),r.fact(s)),r.toLines().join(`
20
- `).trimEnd()}function Ct(e){let t=new I;t.h1(`Style`),t.text(`Named: ${e.getNamed().getName()}`),t.blank();let n=e.toJSON(),r=n?Object.entries(n).filter(([,e])=>e!==void 0):[];if(r.length===0)t.fact(`No direct styling (inherits the named style)`);else for(let[e,n]of r)t.fact(`${e}: ${t.codespan(typeof n==`string`?n:JSON.stringify(n))}`);return t.toLines().join(`
21
- `).trimEnd()}function wt(e,t){let n=t?.maxCells??1e3,r=Tt(e)?e.getValues():e,i=r.length,a=r.reduce((e,t)=>Math.max(e,t?.length??0),0),o=new I;if(o.h1(`Values`),o.text(`Size: ${i}×${a}`),o.blank(),i===0||a===0)return o.text(`None`),o.toLines().join(`
22
- `).trimEnd();let s=v(i,Math.max(1,Math.floor(n/a))),c=i>s?r.slice(0,s):r,l=o.beginFrame(Array(a).fill(``));for(let e of c)l.addRow(Array.from({length:a},(t,n)=>Et(e?.[n])));return l.endFrame(),c.length<i&&o.text(`…truncated at ${c.length} of ${i} rows · slice or aggregate in the expression before returning it`),o.toLines().join(`
23
- `).trimEnd()}var Tt=e=>!!e&&typeof e==`object`&&!0===e.isIRange,Et=e=>{if(e==null)return{text:``};let t=(a(e)?.display??``).replace(/[\r\n]+/g,` `);return typeof e==`number`?{text:t,alignment:`right`}:{text:t}},Z=e.ICellRange.Feature;function Dt(t,n){let r=new I;r.h1(`Workbook — ${t.getName()??`Untitled`}`),r.text(`Locale: ${t.getRuntime().getLocale()}`),r.blank();let i=t.getSheets().getItems({visibility:e.ISheet.Visibility.VeryHidden}),a=t.getSelectedSheet(),o=[];for(let e of i){let t=e.getUsedRange();o.push({sheet:e,label:Ot(e,e.getId()===a.getId()),used:t?.toString()??`empty`,counts:t?.getCounts([Z.Contentful,Z.Formula,Z.Error,Z.CalcError,Z.Circular])??null})}let s=o;if(o.length>50){s=o.slice(0,50);let e=o.find(e=>e.sheet.getId()===a.getId());e&&!s.includes(e)&&(s[s.length-1]=e)}r.h2(`Sheets (${o.length})`);let c=r.beginFrame([`Sheet`,`Used`,`Cells`,`Formulas`,`Errors`]);for(let e of s)c.addRow([{text:e.label},{text:e.used},{text:String(e.counts?.[Z.Contentful]??0),alignment:`right`},{text:String(e.counts?.[Z.Formula]??0),alignment:`right`},{text:String(e.counts?.[Z.Error]??0),alignment:`right`}]);if(o.length>1){let e=e=>o.reduce((t,n)=>t+(n.counts?.[e]??0),0);c.addRow([{text:`Total`},{text:``},{text:String(e(Z.Contentful)),alignment:`right`},{text:String(e(Z.Formula)),alignment:`right`},{text:String(e(Z.Error)),alignment:`right`}])}c.endFrame(),s.length<o.length&&r.text(` …and ${o.length-s.length} more sheets · the totals include them · wb.getSheets().getItems() lists all`),r.blank(),kt(r,`Errors`,o,Z.Error),kt(r,`Calc Failures`,o,Z.CalcError),kt(r,`Circular References`,o,Z.Circular),G(r,t.getNames().getItems({type:`formula`,includeHidden:!0})??[],{maxNames:n?.maxNames??30,recovery:`wb.getNames() renders the full view`,symbols:t.getNames().getItems({includeHidden:!0})??[]});let l=n?.maxSheets??8,u=o.filter(e=>e.sheet.getUsedRange()!==null),d=u.slice(0,l),f=u.find(e=>e.sheet.getId()===a.getId());f&&!d.includes(f)&&(d[d.length-1]=f),r.setHeadingOffset(1);for(let e of d){let t=e.sheet.getUsedRange();t&&(r.h1(`Sheet — ${e.label}`),U(r,t),ke(r,t,{features:n?.features,maxRegions:n?.maxRegions??25,profile:!0,maxProfiled:n?.maxProfiled??4}),q(r,t))}return r.setHeadingOffset(0),d.length<u.length&&r.text(`…and ${u.length-d.length} more sheets not expanded · a sheet report (\`wb.getSheet('Name')\`) renders one in full`),r.toLines().join(`
24
- `).trimEnd()}function Ot(t,n){let r=t.getVisibility(),i=``;return n&&(i+=` (selected)`),r===e.ISheet.Visibility.Hidden?i+=` (hidden)`:r===e.ISheet.Visibility.VeryHidden&&(i+=` (very hidden)`),`${z(t.getName())}${i}`}function kt(e,t,n,r){let i=n.reduce((e,t)=>e+(t.counts?.[r]??0),0);if(i===0)return;let a=[],o=0;for(let e of n){if(!e.counts?.[r])continue;let t=e.sheet.getUsedRange();if(!t)continue;let n=z(e.sheet.getName());for(let e of t.getRegions(r))o++,a.length>=20||a.push({address:`${n}!${e.toString()}`,size:`${e.getRowCount()}×${e.getColumnCount()}`,payload:At(e)})}e.h2(`${t} (${i})`);let s=Math.max(0,...a.map(e=>e.address.length)),c=Math.max(0,...a.map(e=>e.size.length));for(let t of a)e.text(` ${t.address.padEnd(s)} ${t.size.padEnd(c)} ${t.payload}`.trimEnd());o>a.length&&e.text(` …and ${o-a.length} more · getRegions('${r}') on a sheet's used range lists the rest`),e.blank()}function At(e){let n=e.getCell(),r=i(n,t.Mode.Display)?.display??``,a=n.getFormulaText();return a?`${r} =${a}`.trim():r}var Q=(e,t)=>!!e&&typeof e==`object`&&!0===e[t],jt=[{kind:`workbook`,is:e=>Q(e,`isIWorkbook`),render:(e,t)=>Dt(e,t)},{kind:`sheet`,is:e=>Q(e,`isISheet`),render:(e,t)=>bt(e,t)},{kind:`cell`,is:e=>Q(e,`isICell`),render:(e,t)=>Je(e,t)},{kind:`names`,is:e=>Q(e,`isINamedCollection`),render:(e,t)=>gt(e,t)},{kind:`formula`,is:e=>Q(e,`isIFormula`),render:(e,t)=>mt(e,t)},{kind:`table`,is:e=>Q(e,`isITable`),render:e=>Ce(e)},{kind:`movable`,is:e=>Q(e,`isIMovable`),render:e=>et(e)},{kind:`conditionalFormat`,is:e=>Q(e,`isIConditionalFormat`),render:e=>nt(e)},{kind:`dataValidation`,is:e=>Q(e,`isIDataValidation`),render:e=>it(e)},{kind:`stats`,is:e=>Q(e,`isIRangeStats`),render:e=>St(e)},{kind:`counts`,is:e=>Q(e,`isICellRangeCounts`),render:e=>rt(e)},{kind:`style`,is:e=>Q(e,`isIStyle`),render:e=>Ct(e)},{kind:`regions`,is:e=>Q(e,`isICellRegions`),render:(e,t)=>xe(e,t)},{kind:`cellRange`,is:e=>Q(e,`isICellRange`),render:(e,t)=>tt(e,t)},{kind:`ranges`,is:e=>Q(e,`isICellRanges`),render:(e,t)=>yt(e,t)},{kind:`range`,is:e=>Q(e,`isIRange`),render:(e,t)=>wt(e,t)},{kind:`values`,is:e=>Array.isArray(e)&&e.length>0&&e.every(e=>Array.isArray(e)),render:(e,t)=>wt(e,t)},{kind:`records`,is:e=>Array.isArray(e)&&e.length>0&&e.every(J),render:(e,t)=>Y(e,t)},{kind:`record`,is:e=>J(e),render:(e,t)=>Y(e,t)},{kind:`items`,is:e=>Array.isArray(e)&&e.length>0&&e.every(e=>!!$(e)),render:async(e,t)=>{let n=e.length>20?e.slice(0,20):e,r=[];for(let e of n)r.push(await $(e).render(e,t));return n.length<e.length&&r.push(`…and ${e.length-n.length} more · render one at a time to see them`),r.join(`
25
-
26
- `)}}],Mt=class extends Error{constructor(e){super(e),this.name=`NoRendererError`}};function $(e){for(let t of jt)if(t.is(e))return t;return null}async function Nt(e,t,n){await e?.getCalculation().ready();let r=$(t),i=t;if(!r&&i&&typeof i==`object`&&!Array.isArray(i)&&typeof i[Symbol.iterator]==`function`){let e=[];for(let t of i)if(e.push(t),e.length>=1e3)break;i=e,r=$(i)}if(!r)throw new Mt(`No markdown renderer for this value. Renderable kinds: ${jt.map(e=>e.kind).join(`, `)}.`);return r.render(i,n)}var Pt=[_];Object.defineProperty(exports,"CellEncoding",{enumerable:!0,get:function(){return t}}),exports.GREP_FIELDS=o,exports.GREP_FIELDS_DEFAULT=s,exports.GrepField={Display:`display`,Value:`value`,Raw:`raw`,Formula:`formula`,Hyperlink:`hyperlink`,NumberFormat:`numberFormat`},exports.MarkdownBuilder=I,exports.MarkdownFrameSection=ve,exports.NoRendererError=Mt,exports.RENDERERS=jt,exports.RENDER_OPTION_KEYS=qe,exports.REPORTED_FEATURES=we,exports.TOOLS=Pt,exports.appendDependencies=K,exports.appendKinds=U,exports.appendMovables=$e,exports.appendNames=G,exports.appendRegionList=be,exports.appendRegions=ke,exports.appendRules=Ge,exports.appendSheetObjects=q,exports.appendTableDetails=Se,exports.countDates=ue,exports.describeAlignment=T,exports.describeAllowedValues=ae,exports.describeBorder=x,exports.describeBorderParts=C,exports.describeColor=y,exports.describeConditionalFormat=re,exports.describeDataValidation=ie,exports.describeExtent=R,exports.describeFill=b,exports.describeFont=E,exports.describeNode=Ue,exports.describeNodeLabel=He,exports.describeNumberFormat=w,exports.describeQualifiedExtent=H,exports.describeQualifiedName=W,exports.describeQualifiedRanges=V,exports.describeRanges=B,exports.describeRuleStyle=k,exports.describeRules=A,exports.describeScale=te,exports.describeSheetCall=Oe,exports.describeSheetName=z,exports.encodeCell=i,exports.encodeFormattedNumber=r,exports.encodeNumber=n,exports.encodeScalar=a,exports.grep=p,exports.grepTool=_,exports.isPlainRecord=J,exports.parseFeatures=De,exports.parseRenderOptions=function(e){let t={};for(let[n,r]of Object.entries(e)){let e=Ke[n];if(!e)throw Error(`Unknown report option '${n}'. Options: ${qe.join(`, `)}.`);t[n]=e(r,n)}return t},exports.profileKinds=le,exports.profileRegion=M,exports.regionPayload=ge,exports.regionPayloads=_e,exports.renderCell=Je,exports.renderCellRange=tt,exports.renderConditionalFormat=nt,exports.renderCounts=rt,exports.renderDataValidation=it,exports.renderFormula=mt,exports.renderGrep=g,exports.renderMarkdown=Nt,exports.renderMovable=et,exports.renderNames=gt,exports.renderRanges=yt,exports.renderRecords=Y,exports.renderRegions=xe,exports.renderResult=async function(e,t,n){if(t===void 0)return{text:void 0,rendered:!0};if(typeof t==`string`)return{text:t,rendered:!0};if(typeof t==`object`&&t)try{return{text:await Nt(e,t,n),rendered:!0}}catch(e){if(!(e instanceof Mt))throw e}return function(e){if(e===null)return{text:`null`,rendered:!0};switch(typeof e){case`number`:case`boolean`:return{text:a(e)?.display??String(e),rendered:!0};case`bigint`:case`symbol`:return{text:String(e),rendered:!0};case`function`:return{text:`[Function]`,rendered:!0}}let t=e;if(!0===t.isFormulaError||!0===t.isIRichData)return{text:a(e)?.display??``,rendered:!0};let n;try{n=String(e)}catch{n=`[object Object]`}return{text:n,rendered:!1}}(t)},exports.renderSheet=bt,exports.renderStats=St,exports.renderStyle=Ct,exports.renderTable=Ce,exports.renderValues=wt,exports.renderWorkbook=Dt,exports.resolveRenderer=$;