@ricsam/excel-to-formula-engine 0.1.0 → 0.1.1

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.
package/dist/index.cjs CHANGED
@@ -961,12 +961,14 @@ function getSupportedFunctions() {
961
961
  return supportedFunctionNames;
962
962
  }
963
963
  var XLFN_PREFIX = /_xlfn\.(_xlws\.)?/g;
964
- var IMPLICIT_INTERSECTION = /(?<![\w$"'\]])@(?=[A-Za-z_\\])/g;
964
+ var IMPLICIT_INTERSECTION = /(?<![\w$"'\]\[])@(?=[A-Za-z_\\])/g;
965
+ var THIS_ROW_REFERENCE = /(?:'((?:[^']|'')+)'|([A-Za-z_\\][\w.\\]*))?\[\[#This ?Row\],\s*\[([^\]]*)\](?:\s*:\s*\[([^\]]*)\])?\]/gi;
965
966
  function translateFormula(rawFormula, options = {}) {
966
967
  const diagnostics = [];
967
968
  let body = rawFormula.startsWith("=") ? rawFormula.slice(1) : rawFormula;
968
969
  body = body.replace(XLFN_PREFIX, "");
969
970
  body = body.replace(IMPLICIT_INTERSECTION, "");
971
+ body = contractThisRowReferences(body, options.containingTableName);
970
972
  for (const name of findUnsupportedFunctions(body)) {
971
973
  diagnostics.push({
972
974
  severity: "warning",
@@ -1079,6 +1081,22 @@ function columnIndexToLabel2(index) {
1079
1081
  }
1080
1082
  return label;
1081
1083
  }
1084
+ function contractThisRowReferences(formulaBody, containingTableName) {
1085
+ return formulaBody.replace(THIS_ROW_REFERENCE, (whole, quotedTable, bareTable, startCol, endCol) => {
1086
+ const tableName = quotedTable ? String(quotedTable).replace(/''/g, "'") : bareTable ? String(bareTable) : undefined;
1087
+ const columns = endCol === undefined ? `[${startCol}]` : `[${startCol}]:[${endCol}]`;
1088
+ const isPlainSingleColumn = endCol === undefined && /^[^[\]@#'"]+$/.test(String(startCol));
1089
+ const reference = isPlainSingleColumn ? `@${startCol}` : `@${columns}`;
1090
+ if (tableName && containingTableName && tableName.toLowerCase() === containingTableName.toLowerCase()) {
1091
+ return `[${reference}]`;
1092
+ }
1093
+ if (!tableName) {
1094
+ return `[${reference}]`;
1095
+ }
1096
+ const quoted = quotedTable ? `'${String(quotedTable)}'` : tableName;
1097
+ return `${quoted}[${reference}]`;
1098
+ });
1099
+ }
1082
1100
 
1083
1101
  // src/translate/conditional-format.ts
1084
1102
  var import_formula_engine2 = require("@ricsam/formula-engine");
@@ -1309,6 +1327,9 @@ async function convertWorkbook(source, options = {}) {
1309
1327
  for (const entry of selected) {
1310
1328
  const worksheet = parseWorksheet(pkg, entry.partPath, sharedStrings);
1311
1329
  importedSheetNames.add(entry.name);
1330
+ const sheetTables = importTables ? parseTables(pkg, entry.partPath) : [];
1331
+ const tableRanges = sheetTables.map((table) => ({ name: table.displayName, range: parseA1Range(table.ref) })).filter((entryTable) => entryTable.range !== undefined);
1332
+ const tableAt = (colIndex, rowIndex) => tableRanges.find(({ range }) => colIndex >= range.start.colIndex && colIndex <= range.end.colIndex && rowIndex >= range.start.rowIndex && rowIndex <= range.end.rowIndex)?.name;
1312
1333
  const content = new Map;
1313
1334
  const cellMetadata = new Map;
1314
1335
  const styleGroups = new Map;
@@ -1318,7 +1339,8 @@ async function convertWorkbook(source, options = {}) {
1318
1339
  convertDates,
1319
1340
  date1904,
1320
1341
  sheetName: entry.name,
1321
- diagnostics
1342
+ diagnostics,
1343
+ containingTableName: tableAt(cell.colIndex, cell.rowIndex)
1322
1344
  });
1323
1345
  if (value !== undefined) {
1324
1346
  content.set(cell.reference, value);
@@ -1373,7 +1395,7 @@ async function convertWorkbook(source, options = {}) {
1373
1395
  }
1374
1396
  }
1375
1397
  if (importTables) {
1376
- for (const table of parseTables(pkg, entry.partPath)) {
1398
+ for (const table of sheetTables) {
1377
1399
  const converted = convertTable(table, entry.name, diagnostics);
1378
1400
  if (converted) {
1379
1401
  tables.push(converted);
@@ -1423,7 +1445,8 @@ function cellValue(cell, format, context) {
1423
1445
  const body = cell.formulaOffset ? offsetFormulaReferences(cell.formula, cell.formulaOffset.cols, cell.formulaOffset.rows) : cell.formula;
1424
1446
  const translated = translateFormula(body, {
1425
1447
  sheetName: context.sheetName,
1426
- cellReference: cell.reference
1448
+ cellReference: cell.reference,
1449
+ containingTableName: context.containingTableName
1427
1450
  });
1428
1451
  context.diagnostics.push(...translated.diagnostics);
1429
1452
  return translated.formula;
@@ -1585,4 +1608,4 @@ function withFileName(source, options) {
1585
1608
  return name ? { ...options, fileName: name } : { ...options };
1586
1609
  }
1587
1610
 
1588
- //# debugId=C50C41CAFB8A948064756E2164756E21
1611
+ //# debugId=B8C6694D236575E064756E2164756E21
@@ -7,13 +7,13 @@
7
7
  "/**\n * Parses one xl/worksheets/sheetN.xml part.\n *\n * Cell values in Excel are typed by the `t` attribute and stored in `<v>`, with\n * formulas alongside in `<f>`. Shared formulas are stored once on the group's\n * master cell and re-derived here for every other member.\n */\n\nimport {\n asArray,\n attr,\n boolAttr,\n numAttr,\n textOf,\n type XlsxPackage,\n type XmlNode,\n} from \"./package\";\nimport { parseA1, toA1 } from \"../a1\";\n\nexport type CellKind =\n | \"number\"\n | \"string\"\n | \"boolean\"\n | \"error\"\n | \"date\"\n | \"empty\";\n\nexport interface RawCell {\n reference: string;\n colIndex: number;\n rowIndex: number;\n kind: CellKind;\n /** Literal value, before date conversion. */\n value: string | number | boolean | undefined;\n /** Excel formula text without the leading `=`, when the cell has one. */\n formula?: string;\n /**\n * How far this cell sits from the master cell of its shared-formula group.\n * The formula's relative references are shifted by this much at translation\n * time. Absent or zero for an ordinary formula.\n */\n formulaOffset?: { cols: number; rows: number };\n /** Index into the style table's `formats`. */\n styleIndex?: number;\n}\n\nexport interface RawConditionalFormat {\n /** Ranges the rule applies to, as written in the file (`\"A1:B10 D1:D5\"`). */\n ranges: string[];\n type: string;\n operator?: string;\n /** Rule formulas, in the order Excel stores them. */\n formulas: string[];\n text?: string;\n /** Index into the style table's `differentialFormats`. */\n dxfId?: number;\n priority: number;\n /** Colour-scale stops, for `colorScale` rules. */\n colorScale?: {\n cfvo: { type: string; val?: string }[];\n colors: (string | undefined)[];\n };\n /** Present for `top10` rules. */\n rank?: number;\n bottom?: boolean;\n percent?: boolean;\n stopIfTrue?: boolean;\n}\n\nexport interface RawWorksheet {\n cells: RawCell[];\n merges: string[];\n columnWidths: Record<number, number>;\n rowHeights: Record<number, number>;\n frozen?: { rows: number; cols: number };\n conditionalFormats: RawConditionalFormat[];\n /** Hyperlink targets keyed by A1 reference. */\n hyperlinks: Record<string, string>;\n}\n\nexport function parseWorksheet(\n pkg: XlsxPackage,\n partPath: string,\n sharedStrings: string[]\n): RawWorksheet {\n const root = pkg.xml(partPath);\n const worksheet = root?.[\"worksheet\"] as XmlNode | undefined;\n const result: RawWorksheet = {\n cells: [],\n merges: [],\n columnWidths: {},\n rowHeights: {},\n conditionalFormats: [],\n hyperlinks: {},\n };\n if (!worksheet) {\n return result;\n }\n\n parseCells(worksheet, sharedStrings, result);\n parseColumns(worksheet, result);\n parsePanes(worksheet, result);\n parseMerges(worksheet, result);\n parseConditionalFormats(worksheet, result);\n parseHyperlinks(pkg, partPath, worksheet, result);\n\n return result;\n}\n\n/** Master formula of a shared-formula group, keyed by the group's `si`. */\ninterface SharedFormula {\n formula: string;\n colIndex: number;\n rowIndex: number;\n}\n\ninterface CellFormula {\n formula: string;\n offset?: { cols: number; rows: number };\n}\n\nfunction parseCells(\n worksheet: XmlNode,\n sharedStrings: string[],\n result: RawWorksheet\n): void {\n const sheetData = worksheet[\"sheetData\"] as XmlNode | undefined;\n const shared = new Map<string, SharedFormula>();\n\n for (const rawRow of asArray(sheetData?.[\"row\"])) {\n const row = rawRow as XmlNode;\n const rowNumber = numAttr(row, \"r\");\n const height = numAttr(row, \"ht\");\n if (rowNumber !== undefined && height !== undefined) {\n result.rowHeights[rowNumber - 1] = height;\n }\n\n for (const rawCell of asArray(row[\"c\"])) {\n const cell = rawCell as XmlNode;\n const reference = attr(cell, \"r\");\n if (!reference) {\n continue;\n }\n const address = parseA1(reference);\n if (!address) {\n continue;\n }\n\n const styleIndex = numAttr(cell, \"s\");\n const type = attr(cell, \"t\") ?? \"n\";\n const formula = readFormula(cell, address, shared);\n const { kind, value } = readValue(cell, type, sharedStrings);\n\n if (kind === \"empty\" && formula === undefined && styleIndex === undefined) {\n continue;\n }\n\n result.cells.push({\n reference,\n colIndex: address.colIndex,\n rowIndex: address.rowIndex,\n kind,\n value,\n formula: formula?.formula,\n formulaOffset: formula?.offset,\n styleIndex,\n });\n }\n }\n}\n\nfunction readFormula(\n cell: XmlNode,\n address: { colIndex: number; rowIndex: number },\n shared: Map<string, SharedFormula>\n): CellFormula | undefined {\n const node = cell[\"f\"];\n if (node === undefined || node === null) {\n return undefined;\n }\n\n const body = textOf(node);\n const type = attr(node, \"t\");\n const si = attr(node, \"si\");\n\n if (type === \"shared\" && si !== undefined) {\n if (body) {\n // The master cell of the group carries the formula text.\n shared.set(si, {\n formula: body,\n colIndex: address.colIndex,\n rowIndex: address.rowIndex,\n });\n return { formula: body };\n }\n const master = shared.get(si);\n if (!master) {\n return undefined;\n }\n // Members store no text of their own: they reuse the master's formula with\n // its relative references shifted by the distance between the two cells.\n return {\n formula: master.formula,\n offset: {\n cols: address.colIndex - master.colIndex,\n rows: address.rowIndex - master.rowIndex,\n },\n };\n }\n\n // Array formulas (\"array\"/\"dataTable\") carry their text on the anchor cell.\n return body ? { formula: body } : undefined;\n}\n\nfunction readValue(\n cell: XmlNode,\n type: string,\n sharedStrings: string[]\n): { kind: CellKind; value: string | number | boolean | undefined } {\n // Inline strings live in <is>, everything else in <v>.\n if (type === \"inlineStr\") {\n const inline = cell[\"is\"];\n return { kind: \"string\", value: readRichText(inline) };\n }\n\n const raw = cell[\"v\"];\n if (raw === undefined || raw === null) {\n return { kind: \"empty\", value: undefined };\n }\n const text = textOf(raw);\n\n switch (type) {\n case \"s\": {\n const index = Number.parseInt(text, 10);\n return { kind: \"string\", value: sharedStrings[index] ?? \"\" };\n }\n case \"str\":\n // A formula that returned text.\n return { kind: \"string\", value: text };\n case \"b\":\n return { kind: \"boolean\", value: text === \"1\" };\n case \"e\":\n return { kind: \"error\", value: text };\n case \"d\":\n // ISO 8601 date, used by strict OOXML.\n return { kind: \"date\", value: text };\n default: {\n const parsed = Number(text);\n return Number.isFinite(parsed)\n ? { kind: \"number\", value: parsed }\n : { kind: \"string\", value: text };\n }\n }\n}\n\n/** Flatten a rich-text run container into plain text. */\nexport function readRichText(node: unknown): string {\n if (node === undefined || node === null) {\n return \"\";\n }\n if (typeof node === \"string\") {\n return node;\n }\n const record = node as XmlNode;\n const runs = asArray(record[\"r\"]);\n if (runs.length > 0) {\n return runs.map((run) => textOf((run as XmlNode)[\"t\"])).join(\"\");\n }\n if (record[\"t\"] !== undefined) {\n return textOf(record[\"t\"]);\n }\n return textOf(record);\n}\n\nfunction parseColumns(worksheet: XmlNode, result: RawWorksheet): void {\n for (const rawCol of asArray(\n (worksheet[\"cols\"] as XmlNode | undefined)?.[\"col\"]\n )) {\n const col = rawCol as XmlNode;\n const min = numAttr(col, \"min\");\n const max = numAttr(col, \"max\");\n const width = numAttr(col, \"width\");\n if (min === undefined || max === undefined || width === undefined) {\n continue;\n }\n // A run can legitimately span to Excel's last column; recording every index\n // would be wasteful, so very wide runs are skipped.\n if (max - min > 1024) {\n continue;\n }\n for (let index = min; index <= max; index++) {\n result.columnWidths[index - 1] = width;\n }\n }\n}\n\nfunction parsePanes(worksheet: XmlNode, result: RawWorksheet): void {\n const sheetViews = worksheet[\"sheetViews\"] as XmlNode | undefined;\n const sheetView = asArray(sheetViews?.[\"sheetView\"])[0] as XmlNode | undefined;\n const pane = sheetView?.[\"pane\"] as XmlNode | undefined;\n if (!pane) {\n return;\n }\n if (attr(pane, \"state\") !== \"frozen\") {\n return;\n }\n result.frozen = {\n cols: numAttr(pane, \"xSplit\") ?? 0,\n rows: numAttr(pane, \"ySplit\") ?? 0,\n };\n}\n\nfunction parseMerges(worksheet: XmlNode, result: RawWorksheet): void {\n for (const merge of asArray(\n (worksheet[\"mergeCells\"] as XmlNode | undefined)?.[\"mergeCell\"]\n )) {\n const ref = attr(merge, \"ref\");\n if (ref) {\n result.merges.push(ref);\n }\n }\n}\n\nfunction parseConditionalFormats(\n worksheet: XmlNode,\n result: RawWorksheet\n): void {\n for (const rawBlock of asArray(worksheet[\"conditionalFormatting\"])) {\n const block = rawBlock as XmlNode;\n const sqref = attr(block, \"sqref\");\n if (!sqref) {\n continue;\n }\n const ranges = sqref.split(/\\s+/).filter(Boolean);\n\n for (const rawRule of asArray(block[\"cfRule\"])) {\n const rule = rawRule as XmlNode;\n const type = attr(rule, \"type\");\n if (!type) {\n continue;\n }\n\n const colorScaleNode = rule[\"colorScale\"] as XmlNode | undefined;\n\n result.conditionalFormats.push({\n ranges,\n type,\n operator: attr(rule, \"operator\"),\n formulas: asArray(rule[\"formula\"]).map((formula) => textOf(formula)),\n text: attr(rule, \"text\"),\n dxfId: numAttr(rule, \"dxfId\"),\n priority: numAttr(rule, \"priority\") ?? 0,\n rank: numAttr(rule, \"rank\"),\n bottom: boolAttr(rule, \"bottom\"),\n percent: boolAttr(rule, \"percent\"),\n stopIfTrue: boolAttr(rule, \"stopIfTrue\"),\n colorScale: colorScaleNode\n ? {\n cfvo: asArray(colorScaleNode[\"cfvo\"]).map((cfvo) => ({\n type: attr(cfvo, \"type\") ?? \"min\",\n val: attr(cfvo, \"val\"),\n })),\n colors: asArray(colorScaleNode[\"color\"]).map((color) =>\n attr(color, \"rgb\")\n ),\n }\n : undefined,\n });\n }\n }\n}\n\nfunction parseHyperlinks(\n pkg: XlsxPackage,\n partPath: string,\n worksheet: XmlNode,\n result: RawWorksheet\n): void {\n const links = asArray(\n (worksheet[\"hyperlinks\"] as XmlNode | undefined)?.[\"hyperlink\"]\n );\n if (links.length === 0) {\n return;\n }\n\n const relationships = readRelationships(pkg, partPath);\n\n for (const rawLink of links) {\n const link = rawLink as XmlNode;\n const ref = attr(link, \"ref\");\n if (!ref) {\n continue;\n }\n const id = attr(link, \"r:id\") ?? attr(link, \"id\");\n const location = attr(link, \"location\");\n const target = id ? relationships.get(id) : undefined;\n const href = target\n ? location\n ? `${target}#${location}`\n : target\n : location;\n if (!href) {\n continue;\n }\n\n // A hyperlink can cover a range; record it for the range's top-left cell.\n const start = parseA1(ref.split(\":\")[0] ?? ref);\n if (start) {\n result.hyperlinks[toA1(start)] = href;\n }\n }\n}\n\nexport function readRelationships(\n pkg: XlsxPackage,\n partPath: string\n): Map<string, string> {\n const slash = partPath.lastIndexOf(\"/\");\n const dir = slash === -1 ? \"\" : partPath.slice(0, slash);\n const file = slash === -1 ? partPath : partPath.slice(slash + 1);\n const relsPath = `${dir}/_rels/${file}.rels`;\n\n const map = new Map<string, string>();\n const root = pkg.xml(relsPath);\n const container = root?.[\"Relationships\"] as XmlNode | undefined;\n if (!container) {\n return map;\n }\n for (const relationship of asArray(container[\"Relationship\"])) {\n const id = attr(relationship, \"Id\");\n const target = attr(relationship, \"Target\");\n if (id && target) {\n map.set(id, target);\n }\n }\n return map;\n}\n",
8
8
  "/**\n * Parses the workbook-level parts: the sheet list, defined names, the shared\n * string table, and table definitions.\n */\n\nimport {\n asArray,\n attr,\n numAttr,\n type XlsxPackage,\n type XmlNode,\n} from \"./package\";\nimport { readRelationships, readRichText } from \"./worksheet\";\n\nexport interface SheetEntry {\n name: string;\n /** Zip path of the worksheet part. */\n partPath: string;\n /** `visible`, `hidden` or `veryHidden`. */\n state: string;\n}\n\nexport interface DefinedName {\n name: string;\n /** Formula text as stored, e.g. `\"Sheet1!$A$1:$B$5\"`. */\n formula: string;\n /**\n * Index of the sheet this name is scoped to, or undefined for a\n * workbook-scoped name.\n */\n localSheetId?: number;\n hidden: boolean;\n}\n\nexport interface RawTable {\n name: string;\n displayName: string;\n /** Range in A1 notation, including the header and totals rows. */\n ref: string;\n headerRowCount: number;\n totalsRowCount: number;\n columnNames: string[];\n}\n\n/** Read the shared string table, flattening rich text to plain text. */\nexport function parseSharedStrings(pkg: XlsxPackage): string[] {\n const root = pkg.xml(\"xl/sharedStrings.xml\");\n const sst = root?.[\"sst\"] as XmlNode | undefined;\n if (!sst) {\n return [];\n }\n return asArray(sst[\"si\"]).map((entry) => readRichText(entry));\n}\n\nexport function parseWorkbook(pkg: XlsxPackage): {\n sheets: SheetEntry[];\n definedNames: DefinedName[];\n /** True when the file uses the 1904 date system rather than 1900. */\n date1904: boolean;\n} {\n const root = pkg.xml(\"xl/workbook.xml\");\n const workbook = root?.[\"workbook\"] as XmlNode | undefined;\n if (!workbook) {\n return { sheets: [], definedNames: [], date1904: false };\n }\n\n const relationships = readRelationships(pkg, \"xl/workbook.xml\");\n\n const sheets: SheetEntry[] = [];\n for (const rawSheet of asArray(\n (workbook[\"sheets\"] as XmlNode | undefined)?.[\"sheet\"]\n )) {\n const sheet = rawSheet as XmlNode;\n const name = attr(sheet, \"name\");\n const id = attr(sheet, \"r:id\") ?? attr(sheet, \"id\");\n if (!name || !id) {\n continue;\n }\n const target = relationships.get(id);\n if (!target) {\n continue;\n }\n sheets.push({\n name,\n partPath: resolvePart(target),\n state: attr(sheet, \"state\") ?? \"visible\",\n });\n }\n\n const definedNames: DefinedName[] = [];\n for (const rawName of asArray(\n (workbook[\"definedNames\"] as XmlNode | undefined)?.[\"definedName\"]\n )) {\n const node = rawName as XmlNode;\n const name = attr(node, \"name\");\n if (!name) {\n continue;\n }\n definedNames.push({\n name,\n formula: textContent(node),\n localSheetId: numAttr(node, \"localSheetId\"),\n hidden: attr(node, \"hidden\") === \"1\",\n });\n }\n\n const pr = workbook[\"workbookPr\"];\n const date1904 =\n attr(pr, \"date1904\") === \"1\" || attr(pr, \"date1904\") === \"true\";\n\n return { sheets, definedNames, date1904 };\n}\n\n/** Table parts referenced by one worksheet. */\nexport function parseTables(\n pkg: XlsxPackage,\n worksheetPartPath: string\n): RawTable[] {\n const relationships = readRelationships(pkg, worksheetPartPath);\n const tables: RawTable[] = [];\n\n for (const target of relationships.values()) {\n if (!target.includes(\"tables/\")) {\n continue;\n }\n const partPath = resolvePart(target, worksheetPartPath);\n const root = pkg.xml(partPath);\n const table = root?.[\"table\"] as XmlNode | undefined;\n if (!table) {\n continue;\n }\n\n const ref = attr(table, \"ref\");\n const name = attr(table, \"name\") ?? attr(table, \"displayName\");\n if (!ref || !name) {\n continue;\n }\n\n tables.push({\n name,\n displayName: attr(table, \"displayName\") ?? name,\n ref,\n // Absent headerRowCount means one header row, per the schema default.\n headerRowCount: numAttr(table, \"headerRowCount\") ?? 1,\n totalsRowCount: numAttr(table, \"totalsRowCount\") ?? 0,\n columnNames: asArray(\n (table[\"tableColumns\"] as XmlNode | undefined)?.[\"tableColumn\"]\n ).map((column) => attr(column, \"name\") ?? \"\"),\n });\n }\n\n return tables;\n}\n\nfunction textContent(node: XmlNode): string {\n const value = node[\"#text\"];\n if (value === undefined || value === null) {\n return \"\";\n }\n return String(value);\n}\n\n/**\n * Resolve a relationship target against the part that declared it.\n *\n * Targets are usually relative (`worksheets/sheet1.xml` from `xl/workbook.xml`)\n * but may be absolute (`/xl/worksheets/sheet1.xml`).\n */\nfunction resolvePart(target: string, fromPart = \"xl/workbook.xml\"): string {\n if (target.startsWith(\"/\")) {\n return target.slice(1);\n }\n\n const slash = fromPart.lastIndexOf(\"/\");\n const baseDir = slash === -1 ? \"\" : fromPart.slice(0, slash);\n const segments = baseDir ? baseDir.split(\"/\") : [];\n\n for (const segment of target.split(\"/\")) {\n if (segment === \".\" || segment === \"\") {\n continue;\n }\n if (segment === \"..\") {\n segments.pop();\n continue;\n }\n segments.push(segment);\n }\n\n return segments.join(\"/\");\n}\n",
9
9
  "/**\n * Parses xl/styles.xml into the subset of formatting the engine can express.\n *\n * Excel's style model is indirect: a cell carries an index into `cellXfs`, and\n * each `xf` points at a font, fill, border and number format. This flattens\n * that into one record per `xf`.\n */\n\nimport type { CellStyle } from \"@ricsam/formula-engine\";\nimport { asArray, attr, boolAttr, numAttr, type XlsxPackage, type XmlNode } from \"./package\";\n\nexport interface ExcelFormat {\n style: CellStyle;\n /** Number format code, e.g. `\"0.00%\"` or `\"yyyy-mm-dd\"`. */\n numberFormat?: string;\n /** True when the number format renders a date or a time. */\n isDateFormat: boolean;\n}\n\nexport interface StyleTable {\n formats: ExcelFormat[];\n /** Differential formats, referenced by conditional formatting rules. */\n differentialFormats: CellStyle[];\n}\n\n/**\n * Number format ids Excel defines implicitly. Only the date/time ones matter\n * here: everything else is carried through as a metadata string.\n */\nconst BUILTIN_FORMATS: Record<number, string> = {\n 0: \"General\",\n 1: \"0\",\n 2: \"0.00\",\n 3: \"#,##0\",\n 4: \"#,##0.00\",\n 9: \"0%\",\n 10: \"0.00%\",\n 11: \"0.00E+00\",\n 12: \"# ?/?\",\n 13: \"# ??/??\",\n 14: \"mm-dd-yy\",\n 15: \"d-mmm-yy\",\n 16: \"d-mmm\",\n 17: \"mmm-yy\",\n 18: \"h:mm AM/PM\",\n 19: \"h:mm:ss AM/PM\",\n 20: \"h:mm\",\n 21: \"h:mm:ss\",\n 22: \"m/d/yy h:mm\",\n 37: \"#,##0 ;(#,##0)\",\n 38: \"#,##0 ;[Red](#,##0)\",\n 39: \"#,##0.00;(#,##0.00)\",\n 40: \"#,##0.00;[Red](#,##0.00)\",\n 45: \"mm:ss\",\n 46: \"[h]:mm:ss\",\n 47: \"mmss.0\",\n 48: \"##0.0E+0\",\n 49: \"@\",\n};\n\nconst BUILTIN_DATE_FORMAT_IDS = new Set([\n 14, 15, 16, 17, 18, 19, 20, 21, 22, 45, 46, 47,\n]);\n\nexport function parseStyles(pkg: XlsxPackage): StyleTable {\n const root = pkg.xml(\"xl/styles.xml\");\n const styleSheet = root?.[\"styleSheet\"] as XmlNode | undefined;\n if (!styleSheet) {\n return { formats: [], differentialFormats: [] };\n }\n\n const theme = parseThemeColors(pkg);\n const indexedColors = parseIndexedColors(styleSheet);\n\n const numberFormats = new Map<number, string>();\n for (const numFmt of asArray(\n (styleSheet[\"numFmts\"] as XmlNode | undefined)?.[\"numFmt\"]\n )) {\n const id = numAttr(numFmt, \"numFmtId\");\n const code = attr(numFmt, \"formatCode\");\n if (id !== undefined && code !== undefined) {\n numberFormats.set(id, code);\n }\n }\n\n const fonts = asArray((styleSheet[\"fonts\"] as XmlNode | undefined)?.[\"font\"]);\n const fills = asArray((styleSheet[\"fills\"] as XmlNode | undefined)?.[\"fill\"]);\n const borders = asArray(\n (styleSheet[\"borders\"] as XmlNode | undefined)?.[\"border\"]\n );\n\n const cellXfs = asArray(\n (styleSheet[\"cellXfs\"] as XmlNode | undefined)?.[\"xf\"]\n );\n\n const formats: ExcelFormat[] = cellXfs.map((rawXf) => {\n const xf = rawXf as XmlNode;\n const style: CellStyle = {};\n\n if (boolAttr(xf, \"applyFont\", true)) {\n const font = fonts[numAttr(xf, \"fontId\") ?? -1];\n if (font) {\n applyFont(style, font as XmlNode, theme, indexedColors);\n }\n }\n\n if (boolAttr(xf, \"applyFill\", true)) {\n const fill = fills[numAttr(xf, \"fillId\") ?? -1];\n if (fill) {\n applyFill(style, fill as XmlNode, theme, indexedColors);\n }\n }\n\n if (boolAttr(xf, \"applyBorder\", true)) {\n const border = borders[numAttr(xf, \"borderId\") ?? -1];\n if (border) {\n applyBorder(style, border as XmlNode, theme, indexedColors);\n }\n }\n\n if (boolAttr(xf, \"applyAlignment\", true)) {\n const alignment = xf[\"alignment\"];\n if (alignment && boolAttr(alignment, \"wrapText\")) {\n style.wrapText = true;\n }\n }\n\n const numFmtId = numAttr(xf, \"numFmtId\") ?? 0;\n const numberFormat = numberFormats.get(numFmtId) ?? BUILTIN_FORMATS[numFmtId];\n\n return {\n style,\n numberFormat: numberFormat === \"General\" ? undefined : numberFormat,\n isDateFormat: isDateFormat(numFmtId, numberFormat),\n };\n });\n\n const differentialFormats = asArray(\n (styleSheet[\"dxfs\"] as XmlNode | undefined)?.[\"dxf\"]\n ).map((dxf) => {\n const style: CellStyle = {};\n const node = dxf as XmlNode;\n if (node[\"font\"]) {\n applyFont(style, node[\"font\"] as XmlNode, theme, indexedColors);\n }\n if (node[\"fill\"]) {\n applyFill(style, node[\"fill\"] as XmlNode, theme, indexedColors);\n }\n if (node[\"border\"]) {\n applyBorder(style, node[\"border\"] as XmlNode, theme, indexedColors);\n }\n return style;\n });\n\n return { formats, differentialFormats };\n}\n\nfunction applyFont(\n style: CellStyle,\n font: XmlNode,\n theme: string[],\n indexedColors: string[]\n): void {\n if (font[\"b\"] !== undefined && isOn(font[\"b\"])) {\n style.bold = true;\n }\n if (font[\"i\"] !== undefined && isOn(font[\"i\"])) {\n style.italic = true;\n }\n if (font[\"u\"] !== undefined && isOn(font[\"u\"])) {\n style.underline = true;\n }\n const size = numAttr(font[\"sz\"], \"val\");\n if (size !== undefined) {\n // Excel stores font size in points; the engine's fontSize is in pixels.\n style.fontSize = Math.round(size * (96 / 72));\n }\n const color = resolveColor(font[\"color\"], theme, indexedColors);\n if (color) {\n style.color = color;\n }\n}\n\nfunction applyFill(\n style: CellStyle,\n fill: XmlNode,\n theme: string[],\n indexedColors: string[]\n): void {\n const pattern = fill[\"patternFill\"] as XmlNode | undefined;\n if (!pattern) {\n return;\n }\n const patternType = attr(pattern, \"patternType\");\n if (patternType === \"none\" || patternType === undefined) {\n return;\n }\n // For a solid fill Excel puts the visible colour in fgColor, not bgColor.\n const color =\n resolveColor(pattern[\"fgColor\"], theme, indexedColors) ??\n resolveColor(pattern[\"bgColor\"], theme, indexedColors);\n if (color) {\n style.backgroundColor = color;\n }\n}\n\nconst BORDER_SIDES = [\"top\", \"right\", \"bottom\", \"left\"] as const;\n\nfunction applyBorder(\n style: CellStyle,\n border: XmlNode,\n theme: string[],\n indexedColors: string[]\n): void {\n const sides: NonNullable<CellStyle[\"borderSides\"]> = {};\n let color: string | undefined;\n let any = false;\n\n for (const side of BORDER_SIDES) {\n const node = border[side] as XmlNode | undefined;\n const borderStyle = node ? attr(node, \"style\") : undefined;\n if (!node || borderStyle === undefined || borderStyle === \"none\") {\n continue;\n }\n sides[side] = true;\n any = true;\n color ??= resolveColor(node[\"color\"], theme, indexedColors);\n }\n\n if (any) {\n style.borderSides = sides;\n // The engine has one border colour per cell, so the first side's colour\n // stands in for all of them.\n style.borderColor = color ?? \"#000000\";\n }\n}\n\nfunction isOn(node: unknown): boolean {\n // <b/> means bold; <b val=\"0\"/> means not bold.\n const val = attr(node, \"val\");\n return val === undefined || val === \"1\" || val.toLowerCase() === \"true\";\n}\n\nfunction isDateFormat(numFmtId: number, code: string | undefined): boolean {\n if (BUILTIN_DATE_FORMAT_IDS.has(numFmtId)) {\n return true;\n }\n if (!code) {\n return false;\n }\n // Strip literal text and colour/condition sections before looking for date\n // tokens, so that \"0.00\" with a [Red] section is not read as a date.\n const stripped = code\n .replace(/\\[[^\\]]*\\]/g, \"\")\n .replace(/\"[^\"]*\"/g, \"\")\n .replace(/\\\\./g, \"\");\n return /[dmyhs]/i.test(stripped) && !/^[^dmyhs]*$/i.test(stripped);\n}\n\n/** Convert an Excel colour node to a `#rrggbb` string. */\nfunction resolveColor(\n node: unknown,\n theme: string[],\n indexedColors: string[]\n): string | undefined {\n if (!node || typeof node !== \"object\") {\n return undefined;\n }\n\n const rgb = attr(node, \"rgb\");\n if (rgb) {\n return applyTint(argbToHex(rgb), numAttr(node, \"tint\"));\n }\n\n const themeIndex = numAttr(node, \"theme\");\n if (themeIndex !== undefined) {\n const base = theme[themeIndex];\n if (base) {\n return applyTint(base, numAttr(node, \"tint\"));\n }\n }\n\n const indexed = numAttr(node, \"indexed\");\n if (indexed !== undefined) {\n const base = indexedColors[indexed];\n if (base) {\n return applyTint(base, numAttr(node, \"tint\"));\n }\n }\n\n return undefined;\n}\n\n/** Excel writes colours as AARRGGBB; the alpha channel is dropped. */\nfunction argbToHex(argb: string): string {\n const value = argb.replace(/^#/, \"\");\n const rgb = value.length === 8 ? value.slice(2) : value;\n return `#${rgb.toLowerCase()}`;\n}\n\n/**\n * Excel lightens or darkens a base colour by a tint in [-1, 1]. Negative tints\n * darken, positive tints lighten toward white.\n */\nfunction applyTint(hex: string, tint: number | undefined): string {\n if (!tint) {\n return hex;\n }\n const value = hex.replace(\"#\", \"\");\n const channels = [0, 2, 4].map((offset) =>\n Number.parseInt(value.slice(offset, offset + 2), 16)\n );\n const tinted = channels.map((channel) => {\n const next =\n tint < 0 ? channel * (1 + tint) : channel * (1 - tint) + 255 * tint;\n return Math.max(0, Math.min(255, Math.round(next)));\n });\n return `#${tinted.map((c) => c.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\n/** Theme colours, in the order conditional formats and styles index them. */\nfunction parseThemeColors(pkg: XlsxPackage): string[] {\n const themePath = pkg\n .list(\"xl/theme/\")\n .find((path) => path.endsWith(\".xml\"));\n if (!themePath) {\n return [];\n }\n const text = pkg.text(themePath);\n if (!text) {\n return [];\n }\n\n const scheme = /<a:clrScheme[\\s\\S]*?<\\/a:clrScheme>/.exec(text)?.[0];\n if (!scheme) {\n return [];\n }\n\n const colors: string[] = [];\n const entry =\n /<a:(dk1|lt1|dk2|lt2|accent[1-6]|hlink|folHlink)>([\\s\\S]*?)<\\/a:\\1>/g;\n let match: RegExpExecArray | null;\n while ((match = entry.exec(scheme)) !== null) {\n const body = match[2] ?? \"\";\n const srgb = /<a:srgbClr val=\"([0-9A-Fa-f]{6})\"/.exec(body)?.[1];\n const sys = /<a:sysClr[^>]*lastClr=\"([0-9A-Fa-f]{6})\"/.exec(body)?.[1];\n colors.push(`#${(srgb ?? sys ?? \"000000\").toLowerCase()}`);\n }\n\n // Excel's theme index order swaps the first two pairs relative to the file.\n if (colors.length >= 4) {\n const [dk1, lt1, dk2, lt2, ...rest] = colors;\n return [lt1!, dk1!, lt2!, dk2!, ...rest];\n }\n return colors;\n}\n\nfunction parseIndexedColors(styleSheet: XmlNode): string[] {\n const colors = asArray(\n (\n (styleSheet[\"colors\"] as XmlNode | undefined)?.[\"indexedColors\"] as\n | XmlNode\n | undefined\n )?.[\"rgbColor\"]\n );\n if (colors.length > 0) {\n return colors.map((color) => argbToHex(attr(color, \"rgb\") ?? \"FF000000\"));\n }\n return DEFAULT_INDEXED_COLORS;\n}\n\n/** Excel's legacy 56-colour palette, used when a file omits its own. */\nconst DEFAULT_INDEXED_COLORS: string[] = [\n \"#000000\", \"#ffffff\", \"#ff0000\", \"#00ff00\", \"#0000ff\", \"#ffff00\", \"#ff00ff\",\n \"#00ffff\", \"#000000\", \"#ffffff\", \"#ff0000\", \"#00ff00\", \"#0000ff\", \"#ffff00\",\n \"#ff00ff\", \"#00ffff\", \"#800000\", \"#008000\", \"#000080\", \"#808000\", \"#800080\",\n \"#008080\", \"#c0c0c0\", \"#808080\", \"#9999ff\", \"#993366\", \"#ffffcc\", \"#ccffff\",\n \"#660066\", \"#ff8080\", \"#0066cc\", \"#ccccff\", \"#000080\", \"#ff00ff\", \"#ffff00\",\n \"#00ffff\", \"#800080\", \"#800000\", \"#008080\", \"#0000ff\", \"#00ccff\", \"#ccffff\",\n \"#ccffcc\", \"#ffff99\", \"#99ccff\", \"#ff99cc\", \"#cc99ff\", \"#ffcc99\", \"#3366ff\",\n \"#33cccc\", \"#99cc00\", \"#ffcc00\", \"#ff9900\", \"#ff6600\", \"#666699\", \"#969696\",\n \"#003366\", \"#339966\", \"#003300\", \"#333300\", \"#993300\", \"#993366\", \"#333399\",\n \"#333333\",\n];\n",
10
- "/**\n * Translates an Excel formula into engine formula text.\n *\n * Excel and the engine share almost all of their syntax — A1 references, sheet\n * and workbook qualifiers, structured table references, array literals and the\n * operator set all carry over unchanged. Translation therefore rewrites the few\n * constructs that genuinely differ and reports, rather than rewrites, anything\n * the engine cannot evaluate. Formulas using unsupported functions are kept\n * verbatim so the original intent stays visible in the cell.\n */\n\nimport { getFormulaFunctionCatalog } from \"@ricsam/formula-engine\";\nimport type { Diagnostic } from \"../types\";\n\n/** Uppercase names of every function the engine implements, including aliases. */\nlet supportedFunctionNames: Set<string> | undefined;\n\nfunction getSupportedFunctions(): Set<string> {\n if (!supportedFunctionNames) {\n const names = new Set<string>();\n for (const descriptor of getFormulaFunctionCatalog()) {\n names.add(descriptor.name.toUpperCase());\n for (const alias of descriptor.aliases ?? []) {\n names.add(alias.toUpperCase());\n }\n }\n supportedFunctionNames = names;\n }\n return supportedFunctionNames;\n}\n\n/**\n * Excel writes newer functions with a `_xlfn.` prefix (and `_xlfn._xlws.` for\n * worksheet-scoped ones) when they postdate the file format. The prefix is a\n * storage detail, never part of the user-visible formula.\n */\nconst XLFN_PREFIX = /_xlfn\\.(_xlws\\.)?/g;\n\n/**\n * `@` marks implicit intersection in files written by dynamic-array Excel. The\n * engine has no implicit-intersection operator, so it is dropped: for a single\n * -valued reference the behaviour is identical.\n */\nconst IMPLICIT_INTERSECTION = /(?<![\\w$\"'\\]])@(?=[A-Za-z_\\\\])/g;\n\nexport interface TranslateFormulaOptions {\n sheetName?: string;\n cellReference?: string;\n}\n\nexport interface TranslatedFormula {\n /** Engine formula text, including the leading `=`. */\n formula: string;\n diagnostics: Diagnostic[];\n}\n\nexport function translateFormula(\n rawFormula: string,\n options: TranslateFormulaOptions = {}\n): TranslatedFormula {\n const diagnostics: Diagnostic[] = [];\n let body = rawFormula.startsWith(\"=\") ? rawFormula.slice(1) : rawFormula;\n\n body = body.replace(XLFN_PREFIX, \"\");\n body = body.replace(IMPLICIT_INTERSECTION, \"\");\n\n for (const name of findUnsupportedFunctions(body)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"unsupported-function\",\n message:\n `The engine does not implement ${name}(). The formula was imported ` +\n `unchanged and will evaluate to an error.`,\n sheetName: options.sheetName,\n cellReference: options.cellReference,\n source: rawFormula,\n });\n }\n\n return { formula: `=${body}`, diagnostics };\n}\n\n/**\n * Find function calls in a formula whose names the engine does not implement.\n *\n * This scans outside of string literals and skips identifiers that are not\n * followed by `(`, so table columns (`Table[Amount]`) and named expressions are\n * not mistaken for calls.\n */\nexport function findUnsupportedFunctions(formulaBody: string): string[] {\n const supported = getSupportedFunctions();\n const found = new Set<string>();\n\n let inString = false;\n let identifier = \"\";\n\n for (let i = 0; i < formulaBody.length; i++) {\n const char = formulaBody[i]!;\n\n if (inString) {\n if (char === '\"') {\n // A doubled quote is an escaped quote inside the literal.\n if (formulaBody[i + 1] === '\"') {\n i++;\n } else {\n inString = false;\n }\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n identifier = \"\";\n continue;\n }\n\n if (/[A-Za-z0-9_.]/.test(char)) {\n identifier += char;\n continue;\n }\n\n if (char === \"(\" && identifier.length > 0) {\n const name = identifier.toUpperCase();\n // A trailing sheet qualifier (Sheet1!SUM) cannot occur, but a decimal\n // number can end up in `identifier`; require a letter first.\n if (/^[A-Z_][A-Z0-9_.]*$/.test(name) && !supported.has(name)) {\n found.add(name);\n }\n }\n\n identifier = \"\";\n }\n\n return Array.from(found);\n}\n\n/**\n * Expand a shared formula.\n *\n * Excel stores one formula for a group of cells and expects readers to offset\n * its relative references for every other cell in the group. Absolute parts\n * (`$A$1`) stay put.\n */\nexport function offsetFormulaReferences(\n formulaBody: string,\n deltaCols: number,\n deltaRows: number\n): string {\n if (deltaCols === 0 && deltaRows === 0) {\n return formulaBody;\n }\n\n // Matches an optional sheet/workbook qualifier followed by a cell reference,\n // so that the qualifier is preserved while the reference is shifted.\n const reference =\n /(\\$?)([A-Za-z]{1,3})(\\$?)(\\d{1,7})(?![\\w(])/g;\n\n let result = \"\";\n let lastIndex = 0;\n let inString = false;\n\n for (let i = 0; i < formulaBody.length; i++) {\n if (formulaBody[i] === '\"') {\n if (inString && formulaBody[i + 1] === '\"') {\n i++;\n continue;\n }\n inString = !inString;\n }\n if (inString) {\n continue;\n }\n\n reference.lastIndex = i;\n const match = reference.exec(formulaBody);\n if (!match || match.index !== i) {\n continue;\n }\n\n const [whole, colAbs, colLabel, rowAbs, rowDigits] = match;\n // Skip anything that is part of a longer identifier, e.g. the \"A1\" in\n // \"MYA1NAME\" or a function name. A \"!\" before the reference is a sheet\n // qualifier, whose reference still shifts, and a \"$\" is the reference's own\n // absolute marker.\n const before = i > 0 ? formulaBody[i - 1]! : \"\";\n if (/[A-Za-z0-9_.]/.test(before)) {\n continue;\n }\n\n result += formulaBody.slice(lastIndex, i);\n result += shiftReference(\n colAbs!,\n colLabel!,\n rowAbs!,\n rowDigits!,\n deltaCols,\n deltaRows\n );\n lastIndex = i + whole!.length;\n i = lastIndex - 1;\n }\n\n result += formulaBody.slice(lastIndex);\n return result;\n}\n\nfunction shiftReference(\n colAbs: string,\n colLabel: string,\n rowAbs: string,\n rowDigits: string,\n deltaCols: number,\n deltaRows: number\n): string {\n const colIndex = columnLabelToIndex(colLabel);\n const rowIndex = Number.parseInt(rowDigits, 10) - 1;\n\n const newColIndex = colAbs ? colIndex : colIndex + deltaCols;\n const newRowIndex = rowAbs ? rowIndex : rowIndex + deltaRows;\n\n if (newColIndex < 0 || newRowIndex < 0) {\n return \"#REF!\";\n }\n\n return `${colAbs}${columnIndexToLabel(newColIndex)}${rowAbs}${newRowIndex + 1}`;\n}\n\nfunction columnLabelToIndex(label: string): number {\n let index = 0;\n for (let i = 0; i < label.length; i++) {\n index = index * 26 + (label.toUpperCase().charCodeAt(i) - 64);\n }\n return index - 1;\n}\n\nfunction columnIndexToLabel(index: number): string {\n let label = \"\";\n let remaining = index + 1;\n while (remaining > 0) {\n const rest = (remaining - 1) % 26;\n label = String.fromCharCode(65 + rest) + label;\n remaining = Math.floor((remaining - rest) / 26);\n }\n return label;\n}\n",
10
+ "/**\n * Translates an Excel formula into engine formula text.\n *\n * Excel and the engine share almost all of their syntax — A1 references, sheet\n * and workbook qualifiers, structured table references, array literals and the\n * operator set all carry over unchanged. Translation therefore rewrites the few\n * constructs that genuinely differ and reports, rather than rewrites, anything\n * the engine cannot evaluate. Formulas using unsupported functions are kept\n * verbatim so the original intent stays visible in the cell.\n */\n\nimport { getFormulaFunctionCatalog } from \"@ricsam/formula-engine\";\nimport type { Diagnostic } from \"../types\";\n\n/** Uppercase names of every function the engine implements, including aliases. */\nlet supportedFunctionNames: Set<string> | undefined;\n\nfunction getSupportedFunctions(): Set<string> {\n if (!supportedFunctionNames) {\n const names = new Set<string>();\n for (const descriptor of getFormulaFunctionCatalog()) {\n names.add(descriptor.name.toUpperCase());\n for (const alias of descriptor.aliases ?? []) {\n names.add(alias.toUpperCase());\n }\n }\n supportedFunctionNames = names;\n }\n return supportedFunctionNames;\n}\n\n/**\n * Excel writes newer functions with a `_xlfn.` prefix (and `_xlfn._xlws.` for\n * worksheet-scoped ones) when they postdate the file format. The prefix is a\n * storage detail, never part of the user-visible formula.\n */\nconst XLFN_PREFIX = /_xlfn\\.(_xlws\\.)?/g;\n\n/**\n * `@` marks implicit intersection in files written by dynamic-array Excel. The\n * engine has no implicit-intersection operator, so it is dropped: for a\n * single-valued reference the behaviour is identical.\n *\n * `[` is excluded from what may precede it, because `[@Column]` is not an\n * implicit intersection at all — it is a structured reference to the current\n * row. Stripping that `@` turns `Table[@Amount]` into `Table[Amount]`, which is\n * the whole column: a formula that still evaluates, and quietly gives the wrong\n * number.\n */\nconst IMPLICIT_INTERSECTION = /(?<![\\w$\"'\\]\\[])@(?=[A-Za-z_\\\\])/g;\n\n/**\n * Rewrite Excel's stored current-row selector into the `@` form.\n *\n * Excel stores `Table[[#This Row],[Column]]` in the file but only ever *shows*\n * `[@Column]` in its formula bar — the `@` shorthand is newer than the file\n * format, so the fully-qualified selector is what gets written for compatibility.\n * The engine reads the shorthand and not the selector, so this rewrite is what\n * makes a calculated column work at all. It also happens to put back the exact\n * text the author typed, which is the form they will expect to see.\n *\n * Both the spaced spelling Excel writes and the unspaced one some writers emit\n * are handled, as is the `[ColA]:[ColB]` span form.\n */\nconst THIS_ROW_REFERENCE =\n /(?:'((?:[^']|'')+)'|([A-Za-z_\\\\][\\w.\\\\]*))?\\[\\[#This ?Row\\],\\s*\\[([^\\]]*)\\](?:\\s*:\\s*\\[([^\\]]*)\\])?\\]/gi;\n\nexport interface TranslateFormulaOptions {\n sheetName?: string;\n cellReference?: string;\n /**\n * The table the formula's own cell sits inside, when it sits inside one.\n *\n * Excel drops the table name from a current-row reference that points at the\n * table the formula is already in, so `[@Payload]` is what the author sees.\n * Supplying it here reproduces that, and leaving it out keeps the name — which\n * is still correct, just more verbose than Excel would be.\n */\n containingTableName?: string;\n}\n\nexport interface TranslatedFormula {\n /** Engine formula text, including the leading `=`. */\n formula: string;\n diagnostics: Diagnostic[];\n}\n\nexport function translateFormula(\n rawFormula: string,\n options: TranslateFormulaOptions = {}\n): TranslatedFormula {\n const diagnostics: Diagnostic[] = [];\n let body = rawFormula.startsWith(\"=\") ? rawFormula.slice(1) : rawFormula;\n\n body = body.replace(XLFN_PREFIX, \"\");\n body = body.replace(IMPLICIT_INTERSECTION, \"\");\n body = contractThisRowReferences(body, options.containingTableName);\n\n for (const name of findUnsupportedFunctions(body)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"unsupported-function\",\n message:\n `The engine does not implement ${name}(). The formula was imported ` +\n `unchanged and will evaluate to an error.`,\n sheetName: options.sheetName,\n cellReference: options.cellReference,\n source: rawFormula,\n });\n }\n\n return { formula: `=${body}`, diagnostics };\n}\n\n/**\n * Find function calls in a formula whose names the engine does not implement.\n *\n * This scans outside of string literals and skips identifiers that are not\n * followed by `(`, so table columns (`Table[Amount]`) and named expressions are\n * not mistaken for calls.\n */\nexport function findUnsupportedFunctions(formulaBody: string): string[] {\n const supported = getSupportedFunctions();\n const found = new Set<string>();\n\n let inString = false;\n let identifier = \"\";\n\n for (let i = 0; i < formulaBody.length; i++) {\n const char = formulaBody[i]!;\n\n if (inString) {\n if (char === '\"') {\n // A doubled quote is an escaped quote inside the literal.\n if (formulaBody[i + 1] === '\"') {\n i++;\n } else {\n inString = false;\n }\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n identifier = \"\";\n continue;\n }\n\n if (/[A-Za-z0-9_.]/.test(char)) {\n identifier += char;\n continue;\n }\n\n if (char === \"(\" && identifier.length > 0) {\n const name = identifier.toUpperCase();\n // A trailing sheet qualifier (Sheet1!SUM) cannot occur, but a decimal\n // number can end up in `identifier`; require a letter first.\n if (/^[A-Z_][A-Z0-9_.]*$/.test(name) && !supported.has(name)) {\n found.add(name);\n }\n }\n\n identifier = \"\";\n }\n\n return Array.from(found);\n}\n\n/**\n * Expand a shared formula.\n *\n * Excel stores one formula for a group of cells and expects readers to offset\n * its relative references for every other cell in the group. Absolute parts\n * (`$A$1`) stay put.\n */\nexport function offsetFormulaReferences(\n formulaBody: string,\n deltaCols: number,\n deltaRows: number\n): string {\n if (deltaCols === 0 && deltaRows === 0) {\n return formulaBody;\n }\n\n // Matches an optional sheet/workbook qualifier followed by a cell reference,\n // so that the qualifier is preserved while the reference is shifted.\n const reference =\n /(\\$?)([A-Za-z]{1,3})(\\$?)(\\d{1,7})(?![\\w(])/g;\n\n let result = \"\";\n let lastIndex = 0;\n let inString = false;\n\n for (let i = 0; i < formulaBody.length; i++) {\n if (formulaBody[i] === '\"') {\n if (inString && formulaBody[i + 1] === '\"') {\n i++;\n continue;\n }\n inString = !inString;\n }\n if (inString) {\n continue;\n }\n\n reference.lastIndex = i;\n const match = reference.exec(formulaBody);\n if (!match || match.index !== i) {\n continue;\n }\n\n const [whole, colAbs, colLabel, rowAbs, rowDigits] = match;\n // Skip anything that is part of a longer identifier, e.g. the \"A1\" in\n // \"MYA1NAME\" or a function name. A \"!\" before the reference is a sheet\n // qualifier, whose reference still shifts, and a \"$\" is the reference's own\n // absolute marker.\n const before = i > 0 ? formulaBody[i - 1]! : \"\";\n if (/[A-Za-z0-9_.]/.test(before)) {\n continue;\n }\n\n result += formulaBody.slice(lastIndex, i);\n result += shiftReference(\n colAbs!,\n colLabel!,\n rowAbs!,\n rowDigits!,\n deltaCols,\n deltaRows\n );\n lastIndex = i + whole!.length;\n i = lastIndex - 1;\n }\n\n result += formulaBody.slice(lastIndex);\n return result;\n}\n\nfunction shiftReference(\n colAbs: string,\n colLabel: string,\n rowAbs: string,\n rowDigits: string,\n deltaCols: number,\n deltaRows: number\n): string {\n const colIndex = columnLabelToIndex(colLabel);\n const rowIndex = Number.parseInt(rowDigits, 10) - 1;\n\n const newColIndex = colAbs ? colIndex : colIndex + deltaCols;\n const newRowIndex = rowAbs ? rowIndex : rowIndex + deltaRows;\n\n if (newColIndex < 0 || newRowIndex < 0) {\n return \"#REF!\";\n }\n\n return `${colAbs}${columnIndexToLabel(newColIndex)}${rowAbs}${newRowIndex + 1}`;\n}\n\nfunction columnLabelToIndex(label: string): number {\n let index = 0;\n for (let i = 0; i < label.length; i++) {\n index = index * 26 + (label.toUpperCase().charCodeAt(i) - 64);\n }\n return index - 1;\n}\n\nfunction columnIndexToLabel(index: number): string {\n let label = \"\";\n let remaining = index + 1;\n while (remaining > 0) {\n const rest = (remaining - 1) % 26;\n label = String.fromCharCode(65 + rest) + label;\n remaining = Math.floor((remaining - rest) / 26);\n }\n return label;\n}\n\n/**\n * `Table[[#This Row],[Col]]` → `Table[@Col]`, or `[@Col]` when the formula is\n * already inside that table.\n */\nexport function contractThisRowReferences(\n formulaBody: string,\n containingTableName?: string\n): string {\n return formulaBody.replace(\n THIS_ROW_REFERENCE,\n (whole, quotedTable, bareTable, startCol, endCol) => {\n const tableName: string | undefined = quotedTable\n ? String(quotedTable).replace(/''/g, \"'\")\n : bareTable\n ? String(bareTable)\n : undefined;\n\n // A column name can contain characters that would not survive being\n // written bare, so the bracketed form is kept whenever it is a span or\n // the name is not a plain identifier.\n const columns =\n endCol === undefined\n ? `[${startCol}]`\n : `[${startCol}]:[${endCol}]`;\n\n const isPlainSingleColumn =\n endCol === undefined && /^[^[\\]@#'\"]+$/.test(String(startCol));\n\n const reference = isPlainSingleColumn ? `@${startCol}` : `@${columns}`;\n\n // Excel itself drops the table name when the formula lives in that table.\n if (\n tableName &&\n containingTableName &&\n tableName.toLowerCase() === containingTableName.toLowerCase()\n ) {\n return `[${reference}]`;\n }\n if (!tableName) {\n return `[${reference}]`;\n }\n const quoted = quotedTable ? `'${String(quotedTable)}'` : tableName;\n return `${quoted}[${reference}]`;\n }\n );\n}\n",
11
11
  "/**\n * Translates Excel conditional formatting into engine conditional styles.\n *\n * The engine offers two kinds of rule: a formula rule, which paints a cell one\n * colour when a formula is true, and a gradient rule, which interpolates\n * between two colour stops. Excel's rule catalogue is much larger, so this maps\n * what fits and reports the rest.\n *\n * Excel writes each rule's condition relative to the top-left cell of the range\n * it applies to, which is exactly the convention the engine's formula rules use,\n * so conditions carry over without rebasing.\n */\n\nimport {\n hexToLch,\n type ConditionalStyle,\n type LCHColor,\n type StyleCondition,\n} from \"@ricsam/formula-engine\";\nimport type { RawConditionalFormat } from \"../xlsx/worksheet\";\nimport type { Diagnostic } from \"../types\";\nimport type { WorkbookDataArea } from \"@ricsam/formula-engine\";\nimport { rangeReferenceToSpreadsheetRange } from \"../a1\";\nimport { translateFormula } from \"./formula\";\n\nexport interface TranslatedConditionalFormat {\n areas: WorkbookDataArea[];\n condition: StyleCondition;\n}\n\nexport interface TranslateConditionalFormatOptions {\n sheetName: string;\n /** Differential formats from styles.xml, indexed by `dxfId`. */\n differentialFormats: { backgroundColor?: string; color?: string }[];\n}\n\nexport function translateConditionalFormat(\n rule: RawConditionalFormat,\n options: TranslateConditionalFormatOptions\n): { result?: TranslatedConditionalFormat; diagnostics: Diagnostic[] } {\n const diagnostics: Diagnostic[] = [];\n\n const areas: WorkbookDataArea[] = [];\n for (const reference of rule.ranges) {\n const range = rangeReferenceToSpreadsheetRange(reference);\n if (range) {\n areas.push({ sheetName: options.sheetName, range });\n }\n }\n if (areas.length === 0) {\n return { diagnostics };\n }\n\n const anchor = rule.ranges[0]?.split(\":\")[0]?.replace(/\\$/g, \"\") ?? \"A1\";\n\n if (rule.type === \"colorScale\") {\n return translateColorScale(rule, areas, options, diagnostics);\n }\n\n const condition = buildFormulaCondition(rule, anchor, options, diagnostics);\n if (!condition) {\n return { diagnostics };\n }\n\n return { result: { areas, condition }, diagnostics };\n}\n\nfunction buildFormulaCondition(\n rule: RawConditionalFormat,\n anchor: string,\n options: TranslateConditionalFormatOptions,\n diagnostics: Diagnostic[]\n): StyleCondition | undefined {\n const color = ruleColor(rule, options);\n if (!color) {\n diagnostics.push({\n severity: \"warning\",\n code: \"unsupported-conditional-format\",\n message:\n `A ${rule.type} rule was skipped because its format has no fill or ` +\n `font colour the engine can apply.`,\n sheetName: options.sheetName,\n });\n return undefined;\n }\n\n const expression = buildExpression(rule, anchor, options, diagnostics);\n if (!expression) {\n return undefined;\n }\n\n const translated = translateFormula(expression, {\n sheetName: options.sheetName,\n cellReference: anchor,\n });\n diagnostics.push(...translated.diagnostics);\n\n return { type: \"formula\", formula: translated.formula, color };\n}\n\n/**\n * Build the boolean expression for a rule, in terms of the range's anchor cell.\n */\nfunction buildExpression(\n rule: RawConditionalFormat,\n anchor: string,\n options: TranslateConditionalFormatOptions,\n diagnostics: Diagnostic[]\n): string | undefined {\n const [first, second] = rule.formulas;\n\n switch (rule.type) {\n case \"expression\":\n return first ? `=${first}` : undefined;\n\n case \"cellIs\":\n return cellIsExpression(rule.operator, anchor, first, second);\n\n case \"containsText\":\n return rule.text === undefined\n ? undefined\n : `=IFERROR(FIND(${quote(rule.text)},${anchor})>0,FALSE)`;\n\n case \"notContainsText\":\n return rule.text === undefined\n ? undefined\n : `=IFERROR(FIND(${quote(rule.text)},${anchor})>0,FALSE)=FALSE`;\n\n case \"beginsWith\":\n return rule.text === undefined\n ? undefined\n : `=EXACT(LEFT(${anchor},${rule.text.length}),${quote(rule.text)})`;\n\n case \"endsWith\":\n return rule.text === undefined\n ? undefined\n : `=EXACT(RIGHT(${anchor},${rule.text.length}),${quote(rule.text)})`;\n\n case \"containsBlanks\":\n return `=LEN(${anchor})=0`;\n\n case \"notContainsBlanks\":\n return `=LEN(${anchor})>0`;\n\n default:\n diagnostics.push({\n severity: \"warning\",\n code: \"unsupported-conditional-format\",\n message:\n `The engine cannot express a \"${rule.type}\" conditional formatting ` +\n `rule, so it was skipped.`,\n sheetName: options.sheetName,\n });\n return undefined;\n }\n}\n\nfunction cellIsExpression(\n operator: string | undefined,\n anchor: string,\n first: string | undefined,\n second: string | undefined\n): string | undefined {\n if (first === undefined) {\n return undefined;\n }\n\n switch (operator) {\n case \"equal\":\n return `=${anchor}=${first}`;\n case \"notEqual\":\n return `=${anchor}<>${first}`;\n case \"greaterThan\":\n return `=${anchor}>${first}`;\n case \"greaterThanOrEqual\":\n return `=${anchor}>=${first}`;\n case \"lessThan\":\n return `=${anchor}<${first}`;\n case \"lessThanOrEqual\":\n return `=${anchor}<=${first}`;\n case \"between\":\n return second === undefined\n ? undefined\n : `=AND(${anchor}>=${first},${anchor}<=${second})`;\n case \"notBetween\":\n return second === undefined\n ? undefined\n : `=OR(${anchor}<${first},${anchor}>${second})`;\n default:\n return undefined;\n }\n}\n\nfunction translateColorScale(\n rule: RawConditionalFormat,\n areas: WorkbookDataArea[],\n options: TranslateConditionalFormatOptions,\n diagnostics: Diagnostic[]\n): { result?: TranslatedConditionalFormat; diagnostics: Diagnostic[] } {\n const scale = rule.colorScale;\n if (!scale || scale.cfvo.length < 2 || scale.colors.length < 2) {\n return { diagnostics };\n }\n\n if (scale.cfvo.length > 2) {\n diagnostics.push({\n severity: \"info\",\n code: \"unsupported-conditional-format\",\n message:\n \"A three-colour scale was imported as a two-colour gradient between \" +\n \"its lowest and highest stops; the midpoint colour was dropped.\",\n sheetName: options.sheetName,\n });\n }\n\n const firstStop = scale.cfvo[0]!;\n const lastStop = scale.cfvo[scale.cfvo.length - 1]!;\n const firstColor = toLch(scale.colors[0]);\n const lastColor = toLch(scale.colors[scale.colors.length - 1]);\n\n if (!firstColor || !lastColor) {\n return { diagnostics };\n }\n\n const min =\n firstStop.type === \"num\" && firstStop.val !== undefined\n ? ({\n type: \"number\" as const,\n color: firstColor,\n valueFormula: `=${firstStop.val}`,\n })\n : ({ type: \"lowest_value\" as const, color: firstColor });\n\n const max =\n lastStop.type === \"num\" && lastStop.val !== undefined\n ? ({\n type: \"number\" as const,\n color: lastColor,\n valueFormula: `=${lastStop.val}`,\n })\n : ({ type: \"highest_value\" as const, color: lastColor });\n\n if (\n (firstStop.type !== \"num\" && firstStop.type !== \"min\") ||\n (lastStop.type !== \"num\" && lastStop.type !== \"max\")\n ) {\n diagnostics.push({\n severity: \"info\",\n code: \"unsupported-conditional-format\",\n message:\n `A colour scale using \"${firstStop.type}\"/\"${lastStop.type}\" stops was ` +\n \"imported as a gradient across the range's own lowest and highest \" +\n \"values.\",\n sheetName: options.sheetName,\n });\n }\n\n return {\n result: { areas, condition: { type: \"gradient\", min, max } },\n diagnostics,\n };\n}\n\n/**\n * The colour a rule paints. The engine's formula rule takes a single colour, so\n * a differential format's fill wins over its font colour.\n */\nfunction ruleColor(\n rule: RawConditionalFormat,\n options: TranslateConditionalFormatOptions\n): LCHColor | undefined {\n if (rule.dxfId === undefined) {\n return undefined;\n }\n const format = options.differentialFormats[rule.dxfId];\n if (!format) {\n return undefined;\n }\n const hex = format.backgroundColor ?? format.color;\n return hex ? hexToLch(hex) : undefined;\n}\n\nfunction toLch(argb: string | undefined): LCHColor | undefined {\n if (!argb) {\n return undefined;\n }\n const value = argb.replace(/^#/, \"\");\n const rgb = value.length === 8 ? value.slice(2) : value;\n if (!/^[0-9A-Fa-f]{6}$/.test(rgb)) {\n return undefined;\n }\n return hexToLch(`#${rgb.toLowerCase()}`);\n}\n\nfunction quote(text: string): string {\n return `\"${text.replace(/\"/g, '\"\"')}\"`;\n}\n\nexport type { ConditionalStyle };\n",
12
12
  "/**\n * Excel date handling.\n *\n * Excel stores dates as a serial number of days since an epoch, and the engine\n * has no date type. A date-formatted number would therefore display as a bare\n * serial (45000), so it is converted to an ISO 8601 string instead, which is\n * both readable and sortable.\n */\n\n/** Milliseconds in one day. */\nconst DAY_MS = 86_400_000;\n\n/**\n * Excel's 1900 date system has a deliberate bug: it treats 1900 as a leap year,\n * so serial 60 is the non-existent 1900-02-29 and every serial after it is one\n * day ahead of the true date. Serials above 60 are therefore offset by an epoch\n * of 1899-12-30 rather than 1899-12-31.\n */\nconst EPOCH_1900_UTC = Date.UTC(1899, 11, 30);\nconst EPOCH_1904_UTC = Date.UTC(1904, 0, 1);\n\nexport function excelSerialToIso(serial: number, date1904 = false): string {\n if (!Number.isFinite(serial)) {\n return String(serial);\n }\n\n const epoch = date1904 ? EPOCH_1904_UTC : EPOCH_1900_UTC;\n\n // In the 1900 system serials 1-59 map to Jan 1 - Feb 28 1900 and need the\n // extra day that the leap-year bug adds back for later serials.\n const adjusted =\n !date1904 && serial < 60 && serial >= 1 ? serial + 1 : serial;\n\n const wholeDays = Math.floor(adjusted);\n const fraction = adjusted - wholeDays;\n const ms = epoch + wholeDays * DAY_MS + Math.round(fraction * DAY_MS);\n const date = new Date(ms);\n\n if (Number.isNaN(date.getTime())) {\n return String(serial);\n }\n\n const iso = date.toISOString();\n\n // A whole serial is a date with no time component; Excel represents a\n // time-only value as a fraction below 1.\n if (fraction === 0) {\n return iso.slice(0, 10);\n }\n if (wholeDays === 0) {\n return iso.slice(11, 19);\n }\n return iso.slice(0, 19).replace(\"T\", \" \");\n}\n",
13
- "/**\n * The conversion pipeline: an .xlsx package in, `WorkbookData` out.\n */\n\nimport type {\n SerializedCellValue,\n WorkbookDataCellStyle,\n WorkbookDataConditionalStyle,\n WorkbookDataNamedExpression,\n WorkbookDataSheet,\n WorkbookDataTable,\n} from \"@ricsam/formula-engine\";\nimport { readXlsxPackage } from \"./xlsx/package\";\nimport {\n parseSharedStrings,\n parseTables,\n parseWorkbook,\n type RawTable,\n} from \"./xlsx/workbook\";\nimport { parseWorksheet, type RawCell } from \"./xlsx/worksheet\";\nimport { parseStyles, type ExcelFormat } from \"./xlsx/styles\";\nimport { offsetFormulaReferences, translateFormula } from \"./translate/formula\";\nimport { translateConditionalFormat } from \"./translate/conditional-format\";\nimport { excelSerialToIso } from \"./translate/dates\";\nimport {\n parseA1Range,\n rangeReferenceToSpreadsheetRange,\n toA1,\n toSpreadsheetRange,\n} from \"./a1\";\nimport type {\n ConvertOptions,\n ConvertResult,\n Diagnostic,\n ExcelCellMetadata,\n ExcelSheetMetadata,\n ExcelWorkbookData,\n} from \"./types\";\n\n/**\n * Excel's built-in defined names. They configure print areas and filters rather\n * than naming a value, so importing them as named expressions would be noise.\n */\nconst BUILTIN_DEFINED_NAMES = new Set([\n \"_xlnm.print_area\",\n \"_xlnm.print_titles\",\n \"_xlnm._filterdatabase\",\n \"_xlnm.criteria\",\n \"_xlnm.extract\",\n \"_xlnm.database\",\n \"_xlnm.sheet_title\",\n]);\n\nexport async function convertWorkbook(\n source: Blob | ArrayBuffer | Uint8Array,\n options: ConvertOptions = {}\n): Promise<ConvertResult> {\n const {\n styles: importStyles = true,\n conditionalFormatting: importConditionalFormatting = true,\n tables: importTables = true,\n definedNames: importDefinedNames = true,\n cellMetadata: importCellMetadata = true,\n convertDates = true,\n } = options;\n\n const diagnostics: Diagnostic[] = [];\n const pkg = await readXlsxPackage(source);\n\n const sharedStrings = parseSharedStrings(pkg);\n const { sheets: sheetEntries, definedNames, date1904 } = parseWorkbook(pkg);\n const styleTable = parseStyles(pkg);\n\n const selected = options.sheets\n ? sheetEntries.filter((entry) => options.sheets!.includes(entry.name))\n : sheetEntries;\n\n const sheets: WorkbookDataSheet<ExcelCellMetadata, ExcelSheetMetadata>[] = [];\n const tables: WorkbookDataTable[] = [];\n const cellStyles: WorkbookDataCellStyle[] = [];\n const conditionalStyles: WorkbookDataConditionalStyle[] = [];\n const importedSheetNames = new Set<string>();\n\n for (const entry of selected) {\n const worksheet = parseWorksheet(pkg, entry.partPath, sharedStrings);\n importedSheetNames.add(entry.name);\n\n const content = new Map<string, SerializedCellValue>();\n const cellMetadata = new Map<string, ExcelCellMetadata>();\n // Cells sharing one style are collected so each distinct style becomes a\n // single engine rule over many areas rather than one rule per cell.\n const styleGroups = new Map<number, RawCell[]>();\n\n for (const cell of worksheet.cells) {\n const format =\n cell.styleIndex === undefined\n ? undefined\n : styleTable.formats[cell.styleIndex];\n\n const value = cellValue(cell, format, {\n convertDates,\n date1904,\n sheetName: entry.name,\n diagnostics,\n });\n if (value !== undefined) {\n content.set(cell.reference, value);\n }\n\n if (importStyles && cell.styleIndex !== undefined && format) {\n if (Object.keys(format.style).length > 0) {\n const group = styleGroups.get(cell.styleIndex);\n if (group) {\n group.push(cell);\n } else {\n styleGroups.set(cell.styleIndex, [cell]);\n }\n }\n }\n\n if (importCellMetadata) {\n const metadata: ExcelCellMetadata = {};\n if (format?.numberFormat) {\n metadata.numberFormat = format.numberFormat;\n }\n const hyperlink = worksheet.hyperlinks[cell.reference];\n if (hyperlink) {\n metadata.hyperlink = hyperlink;\n }\n if (Object.keys(metadata).length > 0) {\n cellMetadata.set(cell.reference, metadata);\n }\n }\n }\n\n if (importStyles) {\n for (const [styleIndex, cells] of styleGroups) {\n const format = styleTable.formats[styleIndex];\n if (!format) {\n continue;\n }\n cellStyles.push({\n areas: coalesceCellsIntoAreas(entry.name, cells),\n style: format.style,\n });\n }\n }\n\n if (importConditionalFormatting) {\n // Excel evaluates the lowest priority number last, so it wins. The engine\n // applies later rules on top, so rules are emitted in reverse priority.\n const ordered = [...worksheet.conditionalFormats].sort(\n (a, b) => b.priority - a.priority\n );\n for (const rule of ordered) {\n const { result, diagnostics: ruleDiagnostics } =\n translateConditionalFormat(rule, {\n sheetName: entry.name,\n differentialFormats: styleTable.differentialFormats,\n });\n diagnostics.push(...ruleDiagnostics);\n if (result) {\n conditionalStyles.push(result);\n }\n }\n }\n\n if (importTables) {\n for (const table of parseTables(pkg, entry.partPath)) {\n const converted = convertTable(table, entry.name, diagnostics);\n if (converted) {\n tables.push(converted);\n }\n }\n }\n\n const sheetMetadata: ExcelSheetMetadata = {};\n if (Object.keys(worksheet.columnWidths).length > 0) {\n sheetMetadata.columnWidths = worksheet.columnWidths;\n }\n if (Object.keys(worksheet.rowHeights).length > 0) {\n sheetMetadata.rowHeights = worksheet.rowHeights;\n }\n if (worksheet.merges.length > 0) {\n sheetMetadata.merges = worksheet.merges;\n }\n if (worksheet.frozen) {\n sheetMetadata.frozen = worksheet.frozen;\n }\n if (entry.state !== \"visible\") {\n sheetMetadata.visible = false;\n }\n\n sheets.push({\n name: entry.name,\n content,\n cellMetadata: cellMetadata.size > 0 ? cellMetadata : undefined,\n sheetMetadata:\n Object.keys(sheetMetadata).length > 0 ? sheetMetadata : undefined,\n });\n }\n\n const namedExpressions = importDefinedNames\n ? convertDefinedNames(\n definedNames,\n sheetEntries.map((entry) => entry.name),\n importedSheetNames,\n diagnostics\n )\n : [];\n\n const data: ExcelWorkbookData = {\n sheets,\n tables: tables.length > 0 ? tables : undefined,\n namedExpressions:\n namedExpressions.length > 0 ? namedExpressions : undefined,\n cellStyles: cellStyles.length > 0 ? cellStyles : undefined,\n conditionalStyles:\n conditionalStyles.length > 0 ? conditionalStyles : undefined,\n workbookMetadata: {\n fileName: options.fileName,\n sheetOrder: sheetEntries.map((entry) => entry.name),\n diagnostics: diagnostics.length > 0 ? diagnostics : undefined,\n },\n };\n\n return { data, diagnostics };\n}\n\ninterface CellValueContext {\n convertDates: boolean;\n date1904: boolean;\n sheetName: string;\n diagnostics: Diagnostic[];\n}\n\n/**\n * The engine stores a cell as a formula string, a literal, or nothing. A cell\n * with a formula keeps the formula: Excel's cached result is discarded, because\n * the engine recalculates.\n */\nfunction cellValue(\n cell: RawCell,\n format: ExcelFormat | undefined,\n context: CellValueContext\n): SerializedCellValue {\n if (cell.formula !== undefined) {\n const body = cell.formulaOffset\n ? offsetFormulaReferences(\n cell.formula,\n cell.formulaOffset.cols,\n cell.formulaOffset.rows\n )\n : cell.formula;\n\n const translated = translateFormula(body, {\n sheetName: context.sheetName,\n cellReference: cell.reference,\n });\n context.diagnostics.push(...translated.diagnostics);\n return translated.formula;\n }\n\n switch (cell.kind) {\n case \"number\": {\n const value = cell.value as number;\n if (context.convertDates && format?.isDateFormat) {\n return excelSerialToIso(value, context.date1904);\n }\n return value;\n }\n case \"boolean\":\n return cell.value as boolean;\n case \"string\":\n return cell.value as string;\n case \"date\":\n return cell.value as string;\n case \"error\":\n // Excel's own error text is valid engine cell content.\n return cell.value as string;\n case \"empty\":\n return undefined;\n }\n}\n\nfunction convertTable(\n table: RawTable,\n sheetName: string,\n diagnostics: Diagnostic[]\n): WorkbookDataTable | undefined {\n const parsed = parseA1Range(table.ref);\n if (!parsed) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message: `Table \"${table.displayName}\" has an unreadable range (${table.ref}).`,\n sheetName,\n });\n return undefined;\n }\n\n if (table.headerRowCount === 0) {\n // The engine requires a header row, since structured references name it.\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message:\n `Table \"${table.displayName}\" has no header row, which the engine ` +\n `requires for structured references, so it was skipped.`,\n sheetName,\n });\n return undefined;\n }\n\n const numCols = parsed.end.colIndex - parsed.start.colIndex + 1;\n const dataRows =\n parsed.end.rowIndex -\n parsed.start.rowIndex +\n 1 -\n table.headerRowCount -\n table.totalsRowCount;\n\n if (numCols <= 0 || dataRows < 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message: `Table \"${table.displayName}\" has an empty range (${table.ref}).`,\n sheetName,\n });\n return undefined;\n }\n\n return {\n name: table.displayName,\n sheetName,\n start: toA1(parsed.start),\n numRows: { type: \"number\", value: dataRows },\n numCols,\n };\n}\n\nfunction convertDefinedNames(\n definedNames: { name: string; formula: string; localSheetId?: number; hidden: boolean }[],\n sheetNames: string[],\n importedSheetNames: Set<string>,\n diagnostics: Diagnostic[]\n): WorkbookDataNamedExpression[] {\n const result: WorkbookDataNamedExpression[] = [];\n\n for (const definedName of definedNames) {\n if (BUILTIN_DEFINED_NAMES.has(definedName.name.toLowerCase())) {\n continue;\n }\n if (definedName.hidden || definedName.formula.trim() === \"\") {\n continue;\n }\n if (definedName.formula.includes(\"#REF!\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-defined-name\",\n message: `Defined name \"${definedName.name}\" refers to a deleted range.`,\n source: definedName.formula,\n });\n continue;\n }\n\n const sheetName =\n definedName.localSheetId === undefined\n ? undefined\n : sheetNames[definedName.localSheetId];\n\n if (sheetName !== undefined && !importedSheetNames.has(sheetName)) {\n continue;\n }\n\n // Named expressions are stored as a formula body with no leading \"=\".\n const translated = translateFormula(definedName.formula);\n diagnostics.push(...translated.diagnostics);\n\n result.push({\n name: definedName.name,\n expression: translated.formula.slice(1),\n sheetName,\n });\n }\n\n return result;\n}\n\n/**\n * Turn a set of cells sharing one style into as few rectangular areas as\n * possible.\n *\n * Excel's style model is per-cell, but the engine's is per-area, so emitting\n * one area per cell would produce enormous rule lists on real workbooks. Cells\n * are merged into horizontal runs, then adjacent identical runs are merged\n * vertically into blocks.\n */\nexport function coalesceCellsIntoAreas(\n sheetName: string,\n cells: { colIndex: number; rowIndex: number }[]\n): { sheetName: string; range: ReturnType<typeof toSpreadsheetRange> }[] {\n const byRow = new Map<number, number[]>();\n for (const cell of cells) {\n const row = byRow.get(cell.rowIndex);\n if (row) {\n row.push(cell.colIndex);\n } else {\n byRow.set(cell.rowIndex, [cell.colIndex]);\n }\n }\n\n interface Run {\n rowIndex: number;\n startCol: number;\n endCol: number;\n }\n\n const runs: Run[] = [];\n for (const [rowIndex, columns] of byRow) {\n columns.sort((a, b) => a - b);\n let startCol = columns[0]!;\n let previous = startCol;\n for (let i = 1; i < columns.length; i++) {\n const current = columns[i]!;\n if (current === previous + 1) {\n previous = current;\n continue;\n }\n runs.push({ rowIndex, startCol, endCol: previous });\n startCol = current;\n previous = current;\n }\n runs.push({ rowIndex, startCol, endCol: previous });\n }\n\n // Merge runs with identical column spans in consecutive rows into blocks.\n runs.sort((a, b) =>\n a.startCol - b.startCol || a.endCol - b.endCol || a.rowIndex - b.rowIndex\n );\n\n const areas: { sheetName: string; range: ReturnType<typeof toSpreadsheetRange> }[] = [];\n let index = 0;\n while (index < runs.length) {\n const first = runs[index]!;\n let lastRow = first.rowIndex;\n let next = index + 1;\n while (\n next < runs.length &&\n runs[next]!.startCol === first.startCol &&\n runs[next]!.endCol === first.endCol &&\n runs[next]!.rowIndex === lastRow + 1\n ) {\n lastRow = runs[next]!.rowIndex;\n next++;\n }\n\n areas.push({\n sheetName,\n range: toSpreadsheetRange({\n start: { colIndex: first.startCol, rowIndex: first.rowIndex },\n end: { colIndex: first.endCol, rowIndex: lastRow },\n }),\n });\n index = next;\n }\n\n return areas;\n}\n\nexport { rangeReferenceToSpreadsheetRange };\n",
13
+ "/**\n * The conversion pipeline: an .xlsx package in, `WorkbookData` out.\n */\n\nimport type {\n SerializedCellValue,\n WorkbookDataCellStyle,\n WorkbookDataConditionalStyle,\n WorkbookDataNamedExpression,\n WorkbookDataSheet,\n WorkbookDataTable,\n} from \"@ricsam/formula-engine\";\nimport { readXlsxPackage } from \"./xlsx/package\";\nimport {\n parseSharedStrings,\n parseTables,\n parseWorkbook,\n type RawTable,\n} from \"./xlsx/workbook\";\nimport { parseWorksheet, type RawCell } from \"./xlsx/worksheet\";\nimport { parseStyles, type ExcelFormat } from \"./xlsx/styles\";\nimport { offsetFormulaReferences, translateFormula } from \"./translate/formula\";\nimport { translateConditionalFormat } from \"./translate/conditional-format\";\nimport { excelSerialToIso } from \"./translate/dates\";\nimport {\n parseA1Range,\n rangeReferenceToSpreadsheetRange,\n toA1,\n toSpreadsheetRange,\n type ParsedRange,\n} from \"./a1\";\nimport type {\n ConvertOptions,\n ConvertResult,\n Diagnostic,\n ExcelCellMetadata,\n ExcelSheetMetadata,\n ExcelWorkbookData,\n} from \"./types\";\n\n/**\n * Excel's built-in defined names. They configure print areas and filters rather\n * than naming a value, so importing them as named expressions would be noise.\n */\nconst BUILTIN_DEFINED_NAMES = new Set([\n \"_xlnm.print_area\",\n \"_xlnm.print_titles\",\n \"_xlnm._filterdatabase\",\n \"_xlnm.criteria\",\n \"_xlnm.extract\",\n \"_xlnm.database\",\n \"_xlnm.sheet_title\",\n]);\n\nexport async function convertWorkbook(\n source: Blob | ArrayBuffer | Uint8Array,\n options: ConvertOptions = {}\n): Promise<ConvertResult> {\n const {\n styles: importStyles = true,\n conditionalFormatting: importConditionalFormatting = true,\n tables: importTables = true,\n definedNames: importDefinedNames = true,\n cellMetadata: importCellMetadata = true,\n convertDates = true,\n } = options;\n\n const diagnostics: Diagnostic[] = [];\n const pkg = await readXlsxPackage(source);\n\n const sharedStrings = parseSharedStrings(pkg);\n const { sheets: sheetEntries, definedNames, date1904 } = parseWorkbook(pkg);\n const styleTable = parseStyles(pkg);\n\n const selected = options.sheets\n ? sheetEntries.filter((entry) => options.sheets!.includes(entry.name))\n : sheetEntries;\n\n const sheets: WorkbookDataSheet<ExcelCellMetadata, ExcelSheetMetadata>[] = [];\n const tables: WorkbookDataTable[] = [];\n const cellStyles: WorkbookDataCellStyle[] = [];\n const conditionalStyles: WorkbookDataConditionalStyle[] = [];\n const importedSheetNames = new Set<string>();\n\n for (const entry of selected) {\n const worksheet = parseWorksheet(pkg, entry.partPath, sharedStrings);\n importedSheetNames.add(entry.name);\n\n /*\n Tables are read before the cells are, because a formula's translation\n depends on whether its own cell sits inside one: Excel stores a calculated\n column's reference as `Table[[#This Row],[Col]]` and displays it as\n `[@Col]`, and reproducing that needs to know which table \"this row\" is in.\n */\n const sheetTables = importTables ? parseTables(pkg, entry.partPath) : [];\n const tableRanges = sheetTables\n .map((table) => ({ name: table.displayName, range: parseA1Range(table.ref) }))\n .filter(\n (entryTable): entryTable is { name: string; range: ParsedRange } =>\n entryTable.range !== undefined\n );\n\n /** The table a cell sits inside, or undefined when it sits in none. */\n const tableAt = (colIndex: number, rowIndex: number): string | undefined =>\n tableRanges.find(\n ({ range }) =>\n colIndex >= range.start.colIndex &&\n colIndex <= range.end.colIndex &&\n rowIndex >= range.start.rowIndex &&\n rowIndex <= range.end.rowIndex\n )?.name;\n\n const content = new Map<string, SerializedCellValue>();\n const cellMetadata = new Map<string, ExcelCellMetadata>();\n // Cells sharing one style are collected so each distinct style becomes a\n // single engine rule over many areas rather than one rule per cell.\n const styleGroups = new Map<number, RawCell[]>();\n\n for (const cell of worksheet.cells) {\n const format =\n cell.styleIndex === undefined\n ? undefined\n : styleTable.formats[cell.styleIndex];\n\n const value = cellValue(cell, format, {\n convertDates,\n date1904,\n sheetName: entry.name,\n diagnostics,\n containingTableName: tableAt(cell.colIndex, cell.rowIndex),\n });\n if (value !== undefined) {\n content.set(cell.reference, value);\n }\n\n if (importStyles && cell.styleIndex !== undefined && format) {\n if (Object.keys(format.style).length > 0) {\n const group = styleGroups.get(cell.styleIndex);\n if (group) {\n group.push(cell);\n } else {\n styleGroups.set(cell.styleIndex, [cell]);\n }\n }\n }\n\n if (importCellMetadata) {\n const metadata: ExcelCellMetadata = {};\n if (format?.numberFormat) {\n metadata.numberFormat = format.numberFormat;\n }\n const hyperlink = worksheet.hyperlinks[cell.reference];\n if (hyperlink) {\n metadata.hyperlink = hyperlink;\n }\n if (Object.keys(metadata).length > 0) {\n cellMetadata.set(cell.reference, metadata);\n }\n }\n }\n\n if (importStyles) {\n for (const [styleIndex, cells] of styleGroups) {\n const format = styleTable.formats[styleIndex];\n if (!format) {\n continue;\n }\n cellStyles.push({\n areas: coalesceCellsIntoAreas(entry.name, cells),\n style: format.style,\n });\n }\n }\n\n if (importConditionalFormatting) {\n // Excel evaluates the lowest priority number last, so it wins. The engine\n // applies later rules on top, so rules are emitted in reverse priority.\n const ordered = [...worksheet.conditionalFormats].sort(\n (a, b) => b.priority - a.priority\n );\n for (const rule of ordered) {\n const { result, diagnostics: ruleDiagnostics } =\n translateConditionalFormat(rule, {\n sheetName: entry.name,\n differentialFormats: styleTable.differentialFormats,\n });\n diagnostics.push(...ruleDiagnostics);\n if (result) {\n conditionalStyles.push(result);\n }\n }\n }\n\n if (importTables) {\n for (const table of sheetTables) {\n const converted = convertTable(table, entry.name, diagnostics);\n if (converted) {\n tables.push(converted);\n }\n }\n }\n\n const sheetMetadata: ExcelSheetMetadata = {};\n if (Object.keys(worksheet.columnWidths).length > 0) {\n sheetMetadata.columnWidths = worksheet.columnWidths;\n }\n if (Object.keys(worksheet.rowHeights).length > 0) {\n sheetMetadata.rowHeights = worksheet.rowHeights;\n }\n if (worksheet.merges.length > 0) {\n sheetMetadata.merges = worksheet.merges;\n }\n if (worksheet.frozen) {\n sheetMetadata.frozen = worksheet.frozen;\n }\n if (entry.state !== \"visible\") {\n sheetMetadata.visible = false;\n }\n\n sheets.push({\n name: entry.name,\n content,\n cellMetadata: cellMetadata.size > 0 ? cellMetadata : undefined,\n sheetMetadata:\n Object.keys(sheetMetadata).length > 0 ? sheetMetadata : undefined,\n });\n }\n\n const namedExpressions = importDefinedNames\n ? convertDefinedNames(\n definedNames,\n sheetEntries.map((entry) => entry.name),\n importedSheetNames,\n diagnostics\n )\n : [];\n\n const data: ExcelWorkbookData = {\n sheets,\n tables: tables.length > 0 ? tables : undefined,\n namedExpressions:\n namedExpressions.length > 0 ? namedExpressions : undefined,\n cellStyles: cellStyles.length > 0 ? cellStyles : undefined,\n conditionalStyles:\n conditionalStyles.length > 0 ? conditionalStyles : undefined,\n workbookMetadata: {\n fileName: options.fileName,\n sheetOrder: sheetEntries.map((entry) => entry.name),\n diagnostics: diagnostics.length > 0 ? diagnostics : undefined,\n },\n };\n\n return { data, diagnostics };\n}\n\ninterface CellValueContext {\n convertDates: boolean;\n date1904: boolean;\n sheetName: string;\n diagnostics: Diagnostic[];\n /** The table this cell sits inside, when it sits inside one. */\n containingTableName?: string;\n}\n\n/**\n * The engine stores a cell as a formula string, a literal, or nothing. A cell\n * with a formula keeps the formula: Excel's cached result is discarded, because\n * the engine recalculates.\n */\nfunction cellValue(\n cell: RawCell,\n format: ExcelFormat | undefined,\n context: CellValueContext\n): SerializedCellValue {\n if (cell.formula !== undefined) {\n const body = cell.formulaOffset\n ? offsetFormulaReferences(\n cell.formula,\n cell.formulaOffset.cols,\n cell.formulaOffset.rows\n )\n : cell.formula;\n\n const translated = translateFormula(body, {\n sheetName: context.sheetName,\n cellReference: cell.reference,\n containingTableName: context.containingTableName,\n });\n context.diagnostics.push(...translated.diagnostics);\n return translated.formula;\n }\n\n switch (cell.kind) {\n case \"number\": {\n const value = cell.value as number;\n if (context.convertDates && format?.isDateFormat) {\n return excelSerialToIso(value, context.date1904);\n }\n return value;\n }\n case \"boolean\":\n return cell.value as boolean;\n case \"string\":\n return cell.value as string;\n case \"date\":\n return cell.value as string;\n case \"error\":\n // Excel's own error text is valid engine cell content.\n return cell.value as string;\n case \"empty\":\n return undefined;\n }\n}\n\nfunction convertTable(\n table: RawTable,\n sheetName: string,\n diagnostics: Diagnostic[]\n): WorkbookDataTable | undefined {\n const parsed = parseA1Range(table.ref);\n if (!parsed) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message: `Table \"${table.displayName}\" has an unreadable range (${table.ref}).`,\n sheetName,\n });\n return undefined;\n }\n\n if (table.headerRowCount === 0) {\n // The engine requires a header row, since structured references name it.\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message:\n `Table \"${table.displayName}\" has no header row, which the engine ` +\n `requires for structured references, so it was skipped.`,\n sheetName,\n });\n return undefined;\n }\n\n const numCols = parsed.end.colIndex - parsed.start.colIndex + 1;\n const dataRows =\n parsed.end.rowIndex -\n parsed.start.rowIndex +\n 1 -\n table.headerRowCount -\n table.totalsRowCount;\n\n if (numCols <= 0 || dataRows < 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message: `Table \"${table.displayName}\" has an empty range (${table.ref}).`,\n sheetName,\n });\n return undefined;\n }\n\n return {\n name: table.displayName,\n sheetName,\n start: toA1(parsed.start),\n numRows: { type: \"number\", value: dataRows },\n numCols,\n };\n}\n\nfunction convertDefinedNames(\n definedNames: { name: string; formula: string; localSheetId?: number; hidden: boolean }[],\n sheetNames: string[],\n importedSheetNames: Set<string>,\n diagnostics: Diagnostic[]\n): WorkbookDataNamedExpression[] {\n const result: WorkbookDataNamedExpression[] = [];\n\n for (const definedName of definedNames) {\n if (BUILTIN_DEFINED_NAMES.has(definedName.name.toLowerCase())) {\n continue;\n }\n if (definedName.hidden || definedName.formula.trim() === \"\") {\n continue;\n }\n if (definedName.formula.includes(\"#REF!\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-defined-name\",\n message: `Defined name \"${definedName.name}\" refers to a deleted range.`,\n source: definedName.formula,\n });\n continue;\n }\n\n const sheetName =\n definedName.localSheetId === undefined\n ? undefined\n : sheetNames[definedName.localSheetId];\n\n if (sheetName !== undefined && !importedSheetNames.has(sheetName)) {\n continue;\n }\n\n // Named expressions are stored as a formula body with no leading \"=\".\n const translated = translateFormula(definedName.formula);\n diagnostics.push(...translated.diagnostics);\n\n result.push({\n name: definedName.name,\n expression: translated.formula.slice(1),\n sheetName,\n });\n }\n\n return result;\n}\n\n/**\n * Turn a set of cells sharing one style into as few rectangular areas as\n * possible.\n *\n * Excel's style model is per-cell, but the engine's is per-area, so emitting\n * one area per cell would produce enormous rule lists on real workbooks. Cells\n * are merged into horizontal runs, then adjacent identical runs are merged\n * vertically into blocks.\n */\nexport function coalesceCellsIntoAreas(\n sheetName: string,\n cells: { colIndex: number; rowIndex: number }[]\n): { sheetName: string; range: ReturnType<typeof toSpreadsheetRange> }[] {\n const byRow = new Map<number, number[]>();\n for (const cell of cells) {\n const row = byRow.get(cell.rowIndex);\n if (row) {\n row.push(cell.colIndex);\n } else {\n byRow.set(cell.rowIndex, [cell.colIndex]);\n }\n }\n\n interface Run {\n rowIndex: number;\n startCol: number;\n endCol: number;\n }\n\n const runs: Run[] = [];\n for (const [rowIndex, columns] of byRow) {\n columns.sort((a, b) => a - b);\n let startCol = columns[0]!;\n let previous = startCol;\n for (let i = 1; i < columns.length; i++) {\n const current = columns[i]!;\n if (current === previous + 1) {\n previous = current;\n continue;\n }\n runs.push({ rowIndex, startCol, endCol: previous });\n startCol = current;\n previous = current;\n }\n runs.push({ rowIndex, startCol, endCol: previous });\n }\n\n // Merge runs with identical column spans in consecutive rows into blocks.\n runs.sort((a, b) =>\n a.startCol - b.startCol || a.endCol - b.endCol || a.rowIndex - b.rowIndex\n );\n\n const areas: { sheetName: string; range: ReturnType<typeof toSpreadsheetRange> }[] = [];\n let index = 0;\n while (index < runs.length) {\n const first = runs[index]!;\n let lastRow = first.rowIndex;\n let next = index + 1;\n while (\n next < runs.length &&\n runs[next]!.startCol === first.startCol &&\n runs[next]!.endCol === first.endCol &&\n runs[next]!.rowIndex === lastRow + 1\n ) {\n lastRow = runs[next]!.rowIndex;\n next++;\n }\n\n areas.push({\n sheetName,\n range: toSpreadsheetRange({\n start: { colIndex: first.startCol, rowIndex: first.rowIndex },\n end: { colIndex: first.endCol, rowIndex: lastRow },\n }),\n });\n index = next;\n }\n\n return areas;\n}\n\nexport { rangeReferenceToSpreadsheetRange };\n",
14
14
  "/**\n * excel-to-formula-engine\n *\n * Converts an Excel .xlsx file into `WorkbookData` for `@ricsam/formula-engine`,\n * in the browser and in Node/Bun.\n *\n * ```ts\n * const data = await excelToFormulaEngine(blob);\n * engine.addWorkbook({ workbookName: \"Budget\", data });\n * ```\n */\n\nimport { convertWorkbook } from \"./src/convert\";\nimport type {\n ConvertOptions,\n ConvertResult,\n ExcelWorkbookData,\n} from \"./src/types\";\n\n/**\n * Convert an Excel file into engine `WorkbookData`.\n *\n * Accepts a `Blob` or `File` from a file input, or raw bytes. The result is\n * ready to hand to `FormulaEngine.addWorkbook`.\n *\n * Anything that could not be translated is reported in\n * `data.workbookMetadata.diagnostics`; use {@link excelToFormulaEngineDetailed}\n * when you want the diagnostics alongside the data instead.\n *\n * @throws when the input is not a readable .xlsx package.\n */\nexport async function excelToFormulaEngine(\n source: Blob | ArrayBuffer | Uint8Array,\n options?: ConvertOptions\n): Promise<ExcelWorkbookData> {\n const { data } = await convertWorkbook(source, withFileName(source, options));\n return data;\n}\n\n/**\n * Convert an Excel file, returning the data and the translation diagnostics as\n * separate values.\n */\nexport async function excelToFormulaEngineDetailed(\n source: Blob | ArrayBuffer | Uint8Array,\n options?: ConvertOptions\n): Promise<ConvertResult> {\n return convertWorkbook(source, withFileName(source, options));\n}\n\n/** Pick up the name from a `File` so it lands in workbook metadata. */\nfunction withFileName(\n source: Blob | ArrayBuffer | Uint8Array,\n options: ConvertOptions | undefined\n): ConvertOptions {\n if (options?.fileName !== undefined) {\n return options;\n }\n const name =\n typeof File !== \"undefined\" && source instanceof File\n ? source.name\n : undefined;\n return name ? { ...options, fileName: name } : { ...options };\n}\n\nexport { convertWorkbook };\n\nexport type {\n ConvertOptions,\n ConvertResult,\n Diagnostic,\n DiagnosticCode,\n DiagnosticSeverity,\n ExcelCellMetadata,\n ExcelSheetMetadata,\n ExcelWorkbookData,\n ExcelWorkbookMetadata,\n} from \"./src/types\";\n\nexport {\n findUnsupportedFunctions,\n offsetFormulaReferences,\n translateFormula,\n} from \"./src/translate/formula\";\n\nexport { excelSerialToIso } from \"./src/translate/dates\";\n\nexport {\n columnIndexToLabel,\n columnLabelToIndex,\n parseA1,\n parseA1Range,\n toA1,\n} from \"./src/a1\";\n"
15
15
  ],
16
- "mappings": "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",
17
- "debugId": "C50C41CAFB8A948064756E2164756E21",
16
+ "mappings": "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",
17
+ "debugId": "B8C6694D236575E064756E2164756E21",
18
18
  "names": []
19
19
  }
package/dist/index.mjs CHANGED
@@ -905,12 +905,14 @@ function getSupportedFunctions() {
905
905
  return supportedFunctionNames;
906
906
  }
907
907
  var XLFN_PREFIX = /_xlfn\.(_xlws\.)?/g;
908
- var IMPLICIT_INTERSECTION = /(?<![\w$"'\]])@(?=[A-Za-z_\\])/g;
908
+ var IMPLICIT_INTERSECTION = /(?<![\w$"'\]\[])@(?=[A-Za-z_\\])/g;
909
+ var THIS_ROW_REFERENCE = /(?:'((?:[^']|'')+)'|([A-Za-z_\\][\w.\\]*))?\[\[#This ?Row\],\s*\[([^\]]*)\](?:\s*:\s*\[([^\]]*)\])?\]/gi;
909
910
  function translateFormula(rawFormula, options = {}) {
910
911
  const diagnostics = [];
911
912
  let body = rawFormula.startsWith("=") ? rawFormula.slice(1) : rawFormula;
912
913
  body = body.replace(XLFN_PREFIX, "");
913
914
  body = body.replace(IMPLICIT_INTERSECTION, "");
915
+ body = contractThisRowReferences(body, options.containingTableName);
914
916
  for (const name of findUnsupportedFunctions(body)) {
915
917
  diagnostics.push({
916
918
  severity: "warning",
@@ -1023,6 +1025,22 @@ function columnIndexToLabel2(index) {
1023
1025
  }
1024
1026
  return label;
1025
1027
  }
1028
+ function contractThisRowReferences(formulaBody, containingTableName) {
1029
+ return formulaBody.replace(THIS_ROW_REFERENCE, (whole, quotedTable, bareTable, startCol, endCol) => {
1030
+ const tableName = quotedTable ? String(quotedTable).replace(/''/g, "'") : bareTable ? String(bareTable) : undefined;
1031
+ const columns = endCol === undefined ? `[${startCol}]` : `[${startCol}]:[${endCol}]`;
1032
+ const isPlainSingleColumn = endCol === undefined && /^[^[\]@#'"]+$/.test(String(startCol));
1033
+ const reference = isPlainSingleColumn ? `@${startCol}` : `@${columns}`;
1034
+ if (tableName && containingTableName && tableName.toLowerCase() === containingTableName.toLowerCase()) {
1035
+ return `[${reference}]`;
1036
+ }
1037
+ if (!tableName) {
1038
+ return `[${reference}]`;
1039
+ }
1040
+ const quoted = quotedTable ? `'${String(quotedTable)}'` : tableName;
1041
+ return `${quoted}[${reference}]`;
1042
+ });
1043
+ }
1026
1044
 
1027
1045
  // src/translate/conditional-format.ts
1028
1046
  import {
@@ -1255,6 +1273,9 @@ async function convertWorkbook(source, options = {}) {
1255
1273
  for (const entry of selected) {
1256
1274
  const worksheet = parseWorksheet(pkg, entry.partPath, sharedStrings);
1257
1275
  importedSheetNames.add(entry.name);
1276
+ const sheetTables = importTables ? parseTables(pkg, entry.partPath) : [];
1277
+ const tableRanges = sheetTables.map((table) => ({ name: table.displayName, range: parseA1Range(table.ref) })).filter((entryTable) => entryTable.range !== undefined);
1278
+ const tableAt = (colIndex, rowIndex) => tableRanges.find(({ range }) => colIndex >= range.start.colIndex && colIndex <= range.end.colIndex && rowIndex >= range.start.rowIndex && rowIndex <= range.end.rowIndex)?.name;
1258
1279
  const content = new Map;
1259
1280
  const cellMetadata = new Map;
1260
1281
  const styleGroups = new Map;
@@ -1264,7 +1285,8 @@ async function convertWorkbook(source, options = {}) {
1264
1285
  convertDates,
1265
1286
  date1904,
1266
1287
  sheetName: entry.name,
1267
- diagnostics
1288
+ diagnostics,
1289
+ containingTableName: tableAt(cell.colIndex, cell.rowIndex)
1268
1290
  });
1269
1291
  if (value !== undefined) {
1270
1292
  content.set(cell.reference, value);
@@ -1319,7 +1341,7 @@ async function convertWorkbook(source, options = {}) {
1319
1341
  }
1320
1342
  }
1321
1343
  if (importTables) {
1322
- for (const table of parseTables(pkg, entry.partPath)) {
1344
+ for (const table of sheetTables) {
1323
1345
  const converted = convertTable(table, entry.name, diagnostics);
1324
1346
  if (converted) {
1325
1347
  tables.push(converted);
@@ -1369,7 +1391,8 @@ function cellValue(cell, format, context) {
1369
1391
  const body = cell.formulaOffset ? offsetFormulaReferences(cell.formula, cell.formulaOffset.cols, cell.formulaOffset.rows) : cell.formula;
1370
1392
  const translated = translateFormula(body, {
1371
1393
  sheetName: context.sheetName,
1372
- cellReference: cell.reference
1394
+ cellReference: cell.reference,
1395
+ containingTableName: context.containingTableName
1373
1396
  });
1374
1397
  context.diagnostics.push(...translated.diagnostics);
1375
1398
  return translated.formula;
@@ -1545,4 +1568,4 @@ export {
1545
1568
  translateFormula
1546
1569
  };
1547
1570
 
1548
- //# debugId=90056589614CAA9A64756E2164756E21
1571
+ //# debugId=0B0A199FAC38549264756E2164756E21
@@ -7,13 +7,13 @@
7
7
  "/**\n * Parses one xl/worksheets/sheetN.xml part.\n *\n * Cell values in Excel are typed by the `t` attribute and stored in `<v>`, with\n * formulas alongside in `<f>`. Shared formulas are stored once on the group's\n * master cell and re-derived here for every other member.\n */\n\nimport {\n asArray,\n attr,\n boolAttr,\n numAttr,\n textOf,\n type XlsxPackage,\n type XmlNode,\n} from \"./package\";\nimport { parseA1, toA1 } from \"../a1\";\n\nexport type CellKind =\n | \"number\"\n | \"string\"\n | \"boolean\"\n | \"error\"\n | \"date\"\n | \"empty\";\n\nexport interface RawCell {\n reference: string;\n colIndex: number;\n rowIndex: number;\n kind: CellKind;\n /** Literal value, before date conversion. */\n value: string | number | boolean | undefined;\n /** Excel formula text without the leading `=`, when the cell has one. */\n formula?: string;\n /**\n * How far this cell sits from the master cell of its shared-formula group.\n * The formula's relative references are shifted by this much at translation\n * time. Absent or zero for an ordinary formula.\n */\n formulaOffset?: { cols: number; rows: number };\n /** Index into the style table's `formats`. */\n styleIndex?: number;\n}\n\nexport interface RawConditionalFormat {\n /** Ranges the rule applies to, as written in the file (`\"A1:B10 D1:D5\"`). */\n ranges: string[];\n type: string;\n operator?: string;\n /** Rule formulas, in the order Excel stores them. */\n formulas: string[];\n text?: string;\n /** Index into the style table's `differentialFormats`. */\n dxfId?: number;\n priority: number;\n /** Colour-scale stops, for `colorScale` rules. */\n colorScale?: {\n cfvo: { type: string; val?: string }[];\n colors: (string | undefined)[];\n };\n /** Present for `top10` rules. */\n rank?: number;\n bottom?: boolean;\n percent?: boolean;\n stopIfTrue?: boolean;\n}\n\nexport interface RawWorksheet {\n cells: RawCell[];\n merges: string[];\n columnWidths: Record<number, number>;\n rowHeights: Record<number, number>;\n frozen?: { rows: number; cols: number };\n conditionalFormats: RawConditionalFormat[];\n /** Hyperlink targets keyed by A1 reference. */\n hyperlinks: Record<string, string>;\n}\n\nexport function parseWorksheet(\n pkg: XlsxPackage,\n partPath: string,\n sharedStrings: string[]\n): RawWorksheet {\n const root = pkg.xml(partPath);\n const worksheet = root?.[\"worksheet\"] as XmlNode | undefined;\n const result: RawWorksheet = {\n cells: [],\n merges: [],\n columnWidths: {},\n rowHeights: {},\n conditionalFormats: [],\n hyperlinks: {},\n };\n if (!worksheet) {\n return result;\n }\n\n parseCells(worksheet, sharedStrings, result);\n parseColumns(worksheet, result);\n parsePanes(worksheet, result);\n parseMerges(worksheet, result);\n parseConditionalFormats(worksheet, result);\n parseHyperlinks(pkg, partPath, worksheet, result);\n\n return result;\n}\n\n/** Master formula of a shared-formula group, keyed by the group's `si`. */\ninterface SharedFormula {\n formula: string;\n colIndex: number;\n rowIndex: number;\n}\n\ninterface CellFormula {\n formula: string;\n offset?: { cols: number; rows: number };\n}\n\nfunction parseCells(\n worksheet: XmlNode,\n sharedStrings: string[],\n result: RawWorksheet\n): void {\n const sheetData = worksheet[\"sheetData\"] as XmlNode | undefined;\n const shared = new Map<string, SharedFormula>();\n\n for (const rawRow of asArray(sheetData?.[\"row\"])) {\n const row = rawRow as XmlNode;\n const rowNumber = numAttr(row, \"r\");\n const height = numAttr(row, \"ht\");\n if (rowNumber !== undefined && height !== undefined) {\n result.rowHeights[rowNumber - 1] = height;\n }\n\n for (const rawCell of asArray(row[\"c\"])) {\n const cell = rawCell as XmlNode;\n const reference = attr(cell, \"r\");\n if (!reference) {\n continue;\n }\n const address = parseA1(reference);\n if (!address) {\n continue;\n }\n\n const styleIndex = numAttr(cell, \"s\");\n const type = attr(cell, \"t\") ?? \"n\";\n const formula = readFormula(cell, address, shared);\n const { kind, value } = readValue(cell, type, sharedStrings);\n\n if (kind === \"empty\" && formula === undefined && styleIndex === undefined) {\n continue;\n }\n\n result.cells.push({\n reference,\n colIndex: address.colIndex,\n rowIndex: address.rowIndex,\n kind,\n value,\n formula: formula?.formula,\n formulaOffset: formula?.offset,\n styleIndex,\n });\n }\n }\n}\n\nfunction readFormula(\n cell: XmlNode,\n address: { colIndex: number; rowIndex: number },\n shared: Map<string, SharedFormula>\n): CellFormula | undefined {\n const node = cell[\"f\"];\n if (node === undefined || node === null) {\n return undefined;\n }\n\n const body = textOf(node);\n const type = attr(node, \"t\");\n const si = attr(node, \"si\");\n\n if (type === \"shared\" && si !== undefined) {\n if (body) {\n // The master cell of the group carries the formula text.\n shared.set(si, {\n formula: body,\n colIndex: address.colIndex,\n rowIndex: address.rowIndex,\n });\n return { formula: body };\n }\n const master = shared.get(si);\n if (!master) {\n return undefined;\n }\n // Members store no text of their own: they reuse the master's formula with\n // its relative references shifted by the distance between the two cells.\n return {\n formula: master.formula,\n offset: {\n cols: address.colIndex - master.colIndex,\n rows: address.rowIndex - master.rowIndex,\n },\n };\n }\n\n // Array formulas (\"array\"/\"dataTable\") carry their text on the anchor cell.\n return body ? { formula: body } : undefined;\n}\n\nfunction readValue(\n cell: XmlNode,\n type: string,\n sharedStrings: string[]\n): { kind: CellKind; value: string | number | boolean | undefined } {\n // Inline strings live in <is>, everything else in <v>.\n if (type === \"inlineStr\") {\n const inline = cell[\"is\"];\n return { kind: \"string\", value: readRichText(inline) };\n }\n\n const raw = cell[\"v\"];\n if (raw === undefined || raw === null) {\n return { kind: \"empty\", value: undefined };\n }\n const text = textOf(raw);\n\n switch (type) {\n case \"s\": {\n const index = Number.parseInt(text, 10);\n return { kind: \"string\", value: sharedStrings[index] ?? \"\" };\n }\n case \"str\":\n // A formula that returned text.\n return { kind: \"string\", value: text };\n case \"b\":\n return { kind: \"boolean\", value: text === \"1\" };\n case \"e\":\n return { kind: \"error\", value: text };\n case \"d\":\n // ISO 8601 date, used by strict OOXML.\n return { kind: \"date\", value: text };\n default: {\n const parsed = Number(text);\n return Number.isFinite(parsed)\n ? { kind: \"number\", value: parsed }\n : { kind: \"string\", value: text };\n }\n }\n}\n\n/** Flatten a rich-text run container into plain text. */\nexport function readRichText(node: unknown): string {\n if (node === undefined || node === null) {\n return \"\";\n }\n if (typeof node === \"string\") {\n return node;\n }\n const record = node as XmlNode;\n const runs = asArray(record[\"r\"]);\n if (runs.length > 0) {\n return runs.map((run) => textOf((run as XmlNode)[\"t\"])).join(\"\");\n }\n if (record[\"t\"] !== undefined) {\n return textOf(record[\"t\"]);\n }\n return textOf(record);\n}\n\nfunction parseColumns(worksheet: XmlNode, result: RawWorksheet): void {\n for (const rawCol of asArray(\n (worksheet[\"cols\"] as XmlNode | undefined)?.[\"col\"]\n )) {\n const col = rawCol as XmlNode;\n const min = numAttr(col, \"min\");\n const max = numAttr(col, \"max\");\n const width = numAttr(col, \"width\");\n if (min === undefined || max === undefined || width === undefined) {\n continue;\n }\n // A run can legitimately span to Excel's last column; recording every index\n // would be wasteful, so very wide runs are skipped.\n if (max - min > 1024) {\n continue;\n }\n for (let index = min; index <= max; index++) {\n result.columnWidths[index - 1] = width;\n }\n }\n}\n\nfunction parsePanes(worksheet: XmlNode, result: RawWorksheet): void {\n const sheetViews = worksheet[\"sheetViews\"] as XmlNode | undefined;\n const sheetView = asArray(sheetViews?.[\"sheetView\"])[0] as XmlNode | undefined;\n const pane = sheetView?.[\"pane\"] as XmlNode | undefined;\n if (!pane) {\n return;\n }\n if (attr(pane, \"state\") !== \"frozen\") {\n return;\n }\n result.frozen = {\n cols: numAttr(pane, \"xSplit\") ?? 0,\n rows: numAttr(pane, \"ySplit\") ?? 0,\n };\n}\n\nfunction parseMerges(worksheet: XmlNode, result: RawWorksheet): void {\n for (const merge of asArray(\n (worksheet[\"mergeCells\"] as XmlNode | undefined)?.[\"mergeCell\"]\n )) {\n const ref = attr(merge, \"ref\");\n if (ref) {\n result.merges.push(ref);\n }\n }\n}\n\nfunction parseConditionalFormats(\n worksheet: XmlNode,\n result: RawWorksheet\n): void {\n for (const rawBlock of asArray(worksheet[\"conditionalFormatting\"])) {\n const block = rawBlock as XmlNode;\n const sqref = attr(block, \"sqref\");\n if (!sqref) {\n continue;\n }\n const ranges = sqref.split(/\\s+/).filter(Boolean);\n\n for (const rawRule of asArray(block[\"cfRule\"])) {\n const rule = rawRule as XmlNode;\n const type = attr(rule, \"type\");\n if (!type) {\n continue;\n }\n\n const colorScaleNode = rule[\"colorScale\"] as XmlNode | undefined;\n\n result.conditionalFormats.push({\n ranges,\n type,\n operator: attr(rule, \"operator\"),\n formulas: asArray(rule[\"formula\"]).map((formula) => textOf(formula)),\n text: attr(rule, \"text\"),\n dxfId: numAttr(rule, \"dxfId\"),\n priority: numAttr(rule, \"priority\") ?? 0,\n rank: numAttr(rule, \"rank\"),\n bottom: boolAttr(rule, \"bottom\"),\n percent: boolAttr(rule, \"percent\"),\n stopIfTrue: boolAttr(rule, \"stopIfTrue\"),\n colorScale: colorScaleNode\n ? {\n cfvo: asArray(colorScaleNode[\"cfvo\"]).map((cfvo) => ({\n type: attr(cfvo, \"type\") ?? \"min\",\n val: attr(cfvo, \"val\"),\n })),\n colors: asArray(colorScaleNode[\"color\"]).map((color) =>\n attr(color, \"rgb\")\n ),\n }\n : undefined,\n });\n }\n }\n}\n\nfunction parseHyperlinks(\n pkg: XlsxPackage,\n partPath: string,\n worksheet: XmlNode,\n result: RawWorksheet\n): void {\n const links = asArray(\n (worksheet[\"hyperlinks\"] as XmlNode | undefined)?.[\"hyperlink\"]\n );\n if (links.length === 0) {\n return;\n }\n\n const relationships = readRelationships(pkg, partPath);\n\n for (const rawLink of links) {\n const link = rawLink as XmlNode;\n const ref = attr(link, \"ref\");\n if (!ref) {\n continue;\n }\n const id = attr(link, \"r:id\") ?? attr(link, \"id\");\n const location = attr(link, \"location\");\n const target = id ? relationships.get(id) : undefined;\n const href = target\n ? location\n ? `${target}#${location}`\n : target\n : location;\n if (!href) {\n continue;\n }\n\n // A hyperlink can cover a range; record it for the range's top-left cell.\n const start = parseA1(ref.split(\":\")[0] ?? ref);\n if (start) {\n result.hyperlinks[toA1(start)] = href;\n }\n }\n}\n\nexport function readRelationships(\n pkg: XlsxPackage,\n partPath: string\n): Map<string, string> {\n const slash = partPath.lastIndexOf(\"/\");\n const dir = slash === -1 ? \"\" : partPath.slice(0, slash);\n const file = slash === -1 ? partPath : partPath.slice(slash + 1);\n const relsPath = `${dir}/_rels/${file}.rels`;\n\n const map = new Map<string, string>();\n const root = pkg.xml(relsPath);\n const container = root?.[\"Relationships\"] as XmlNode | undefined;\n if (!container) {\n return map;\n }\n for (const relationship of asArray(container[\"Relationship\"])) {\n const id = attr(relationship, \"Id\");\n const target = attr(relationship, \"Target\");\n if (id && target) {\n map.set(id, target);\n }\n }\n return map;\n}\n",
8
8
  "/**\n * Parses the workbook-level parts: the sheet list, defined names, the shared\n * string table, and table definitions.\n */\n\nimport {\n asArray,\n attr,\n numAttr,\n type XlsxPackage,\n type XmlNode,\n} from \"./package\";\nimport { readRelationships, readRichText } from \"./worksheet\";\n\nexport interface SheetEntry {\n name: string;\n /** Zip path of the worksheet part. */\n partPath: string;\n /** `visible`, `hidden` or `veryHidden`. */\n state: string;\n}\n\nexport interface DefinedName {\n name: string;\n /** Formula text as stored, e.g. `\"Sheet1!$A$1:$B$5\"`. */\n formula: string;\n /**\n * Index of the sheet this name is scoped to, or undefined for a\n * workbook-scoped name.\n */\n localSheetId?: number;\n hidden: boolean;\n}\n\nexport interface RawTable {\n name: string;\n displayName: string;\n /** Range in A1 notation, including the header and totals rows. */\n ref: string;\n headerRowCount: number;\n totalsRowCount: number;\n columnNames: string[];\n}\n\n/** Read the shared string table, flattening rich text to plain text. */\nexport function parseSharedStrings(pkg: XlsxPackage): string[] {\n const root = pkg.xml(\"xl/sharedStrings.xml\");\n const sst = root?.[\"sst\"] as XmlNode | undefined;\n if (!sst) {\n return [];\n }\n return asArray(sst[\"si\"]).map((entry) => readRichText(entry));\n}\n\nexport function parseWorkbook(pkg: XlsxPackage): {\n sheets: SheetEntry[];\n definedNames: DefinedName[];\n /** True when the file uses the 1904 date system rather than 1900. */\n date1904: boolean;\n} {\n const root = pkg.xml(\"xl/workbook.xml\");\n const workbook = root?.[\"workbook\"] as XmlNode | undefined;\n if (!workbook) {\n return { sheets: [], definedNames: [], date1904: false };\n }\n\n const relationships = readRelationships(pkg, \"xl/workbook.xml\");\n\n const sheets: SheetEntry[] = [];\n for (const rawSheet of asArray(\n (workbook[\"sheets\"] as XmlNode | undefined)?.[\"sheet\"]\n )) {\n const sheet = rawSheet as XmlNode;\n const name = attr(sheet, \"name\");\n const id = attr(sheet, \"r:id\") ?? attr(sheet, \"id\");\n if (!name || !id) {\n continue;\n }\n const target = relationships.get(id);\n if (!target) {\n continue;\n }\n sheets.push({\n name,\n partPath: resolvePart(target),\n state: attr(sheet, \"state\") ?? \"visible\",\n });\n }\n\n const definedNames: DefinedName[] = [];\n for (const rawName of asArray(\n (workbook[\"definedNames\"] as XmlNode | undefined)?.[\"definedName\"]\n )) {\n const node = rawName as XmlNode;\n const name = attr(node, \"name\");\n if (!name) {\n continue;\n }\n definedNames.push({\n name,\n formula: textContent(node),\n localSheetId: numAttr(node, \"localSheetId\"),\n hidden: attr(node, \"hidden\") === \"1\",\n });\n }\n\n const pr = workbook[\"workbookPr\"];\n const date1904 =\n attr(pr, \"date1904\") === \"1\" || attr(pr, \"date1904\") === \"true\";\n\n return { sheets, definedNames, date1904 };\n}\n\n/** Table parts referenced by one worksheet. */\nexport function parseTables(\n pkg: XlsxPackage,\n worksheetPartPath: string\n): RawTable[] {\n const relationships = readRelationships(pkg, worksheetPartPath);\n const tables: RawTable[] = [];\n\n for (const target of relationships.values()) {\n if (!target.includes(\"tables/\")) {\n continue;\n }\n const partPath = resolvePart(target, worksheetPartPath);\n const root = pkg.xml(partPath);\n const table = root?.[\"table\"] as XmlNode | undefined;\n if (!table) {\n continue;\n }\n\n const ref = attr(table, \"ref\");\n const name = attr(table, \"name\") ?? attr(table, \"displayName\");\n if (!ref || !name) {\n continue;\n }\n\n tables.push({\n name,\n displayName: attr(table, \"displayName\") ?? name,\n ref,\n // Absent headerRowCount means one header row, per the schema default.\n headerRowCount: numAttr(table, \"headerRowCount\") ?? 1,\n totalsRowCount: numAttr(table, \"totalsRowCount\") ?? 0,\n columnNames: asArray(\n (table[\"tableColumns\"] as XmlNode | undefined)?.[\"tableColumn\"]\n ).map((column) => attr(column, \"name\") ?? \"\"),\n });\n }\n\n return tables;\n}\n\nfunction textContent(node: XmlNode): string {\n const value = node[\"#text\"];\n if (value === undefined || value === null) {\n return \"\";\n }\n return String(value);\n}\n\n/**\n * Resolve a relationship target against the part that declared it.\n *\n * Targets are usually relative (`worksheets/sheet1.xml` from `xl/workbook.xml`)\n * but may be absolute (`/xl/worksheets/sheet1.xml`).\n */\nfunction resolvePart(target: string, fromPart = \"xl/workbook.xml\"): string {\n if (target.startsWith(\"/\")) {\n return target.slice(1);\n }\n\n const slash = fromPart.lastIndexOf(\"/\");\n const baseDir = slash === -1 ? \"\" : fromPart.slice(0, slash);\n const segments = baseDir ? baseDir.split(\"/\") : [];\n\n for (const segment of target.split(\"/\")) {\n if (segment === \".\" || segment === \"\") {\n continue;\n }\n if (segment === \"..\") {\n segments.pop();\n continue;\n }\n segments.push(segment);\n }\n\n return segments.join(\"/\");\n}\n",
9
9
  "/**\n * Parses xl/styles.xml into the subset of formatting the engine can express.\n *\n * Excel's style model is indirect: a cell carries an index into `cellXfs`, and\n * each `xf` points at a font, fill, border and number format. This flattens\n * that into one record per `xf`.\n */\n\nimport type { CellStyle } from \"@ricsam/formula-engine\";\nimport { asArray, attr, boolAttr, numAttr, type XlsxPackage, type XmlNode } from \"./package\";\n\nexport interface ExcelFormat {\n style: CellStyle;\n /** Number format code, e.g. `\"0.00%\"` or `\"yyyy-mm-dd\"`. */\n numberFormat?: string;\n /** True when the number format renders a date or a time. */\n isDateFormat: boolean;\n}\n\nexport interface StyleTable {\n formats: ExcelFormat[];\n /** Differential formats, referenced by conditional formatting rules. */\n differentialFormats: CellStyle[];\n}\n\n/**\n * Number format ids Excel defines implicitly. Only the date/time ones matter\n * here: everything else is carried through as a metadata string.\n */\nconst BUILTIN_FORMATS: Record<number, string> = {\n 0: \"General\",\n 1: \"0\",\n 2: \"0.00\",\n 3: \"#,##0\",\n 4: \"#,##0.00\",\n 9: \"0%\",\n 10: \"0.00%\",\n 11: \"0.00E+00\",\n 12: \"# ?/?\",\n 13: \"# ??/??\",\n 14: \"mm-dd-yy\",\n 15: \"d-mmm-yy\",\n 16: \"d-mmm\",\n 17: \"mmm-yy\",\n 18: \"h:mm AM/PM\",\n 19: \"h:mm:ss AM/PM\",\n 20: \"h:mm\",\n 21: \"h:mm:ss\",\n 22: \"m/d/yy h:mm\",\n 37: \"#,##0 ;(#,##0)\",\n 38: \"#,##0 ;[Red](#,##0)\",\n 39: \"#,##0.00;(#,##0.00)\",\n 40: \"#,##0.00;[Red](#,##0.00)\",\n 45: \"mm:ss\",\n 46: \"[h]:mm:ss\",\n 47: \"mmss.0\",\n 48: \"##0.0E+0\",\n 49: \"@\",\n};\n\nconst BUILTIN_DATE_FORMAT_IDS = new Set([\n 14, 15, 16, 17, 18, 19, 20, 21, 22, 45, 46, 47,\n]);\n\nexport function parseStyles(pkg: XlsxPackage): StyleTable {\n const root = pkg.xml(\"xl/styles.xml\");\n const styleSheet = root?.[\"styleSheet\"] as XmlNode | undefined;\n if (!styleSheet) {\n return { formats: [], differentialFormats: [] };\n }\n\n const theme = parseThemeColors(pkg);\n const indexedColors = parseIndexedColors(styleSheet);\n\n const numberFormats = new Map<number, string>();\n for (const numFmt of asArray(\n (styleSheet[\"numFmts\"] as XmlNode | undefined)?.[\"numFmt\"]\n )) {\n const id = numAttr(numFmt, \"numFmtId\");\n const code = attr(numFmt, \"formatCode\");\n if (id !== undefined && code !== undefined) {\n numberFormats.set(id, code);\n }\n }\n\n const fonts = asArray((styleSheet[\"fonts\"] as XmlNode | undefined)?.[\"font\"]);\n const fills = asArray((styleSheet[\"fills\"] as XmlNode | undefined)?.[\"fill\"]);\n const borders = asArray(\n (styleSheet[\"borders\"] as XmlNode | undefined)?.[\"border\"]\n );\n\n const cellXfs = asArray(\n (styleSheet[\"cellXfs\"] as XmlNode | undefined)?.[\"xf\"]\n );\n\n const formats: ExcelFormat[] = cellXfs.map((rawXf) => {\n const xf = rawXf as XmlNode;\n const style: CellStyle = {};\n\n if (boolAttr(xf, \"applyFont\", true)) {\n const font = fonts[numAttr(xf, \"fontId\") ?? -1];\n if (font) {\n applyFont(style, font as XmlNode, theme, indexedColors);\n }\n }\n\n if (boolAttr(xf, \"applyFill\", true)) {\n const fill = fills[numAttr(xf, \"fillId\") ?? -1];\n if (fill) {\n applyFill(style, fill as XmlNode, theme, indexedColors);\n }\n }\n\n if (boolAttr(xf, \"applyBorder\", true)) {\n const border = borders[numAttr(xf, \"borderId\") ?? -1];\n if (border) {\n applyBorder(style, border as XmlNode, theme, indexedColors);\n }\n }\n\n if (boolAttr(xf, \"applyAlignment\", true)) {\n const alignment = xf[\"alignment\"];\n if (alignment && boolAttr(alignment, \"wrapText\")) {\n style.wrapText = true;\n }\n }\n\n const numFmtId = numAttr(xf, \"numFmtId\") ?? 0;\n const numberFormat = numberFormats.get(numFmtId) ?? BUILTIN_FORMATS[numFmtId];\n\n return {\n style,\n numberFormat: numberFormat === \"General\" ? undefined : numberFormat,\n isDateFormat: isDateFormat(numFmtId, numberFormat),\n };\n });\n\n const differentialFormats = asArray(\n (styleSheet[\"dxfs\"] as XmlNode | undefined)?.[\"dxf\"]\n ).map((dxf) => {\n const style: CellStyle = {};\n const node = dxf as XmlNode;\n if (node[\"font\"]) {\n applyFont(style, node[\"font\"] as XmlNode, theme, indexedColors);\n }\n if (node[\"fill\"]) {\n applyFill(style, node[\"fill\"] as XmlNode, theme, indexedColors);\n }\n if (node[\"border\"]) {\n applyBorder(style, node[\"border\"] as XmlNode, theme, indexedColors);\n }\n return style;\n });\n\n return { formats, differentialFormats };\n}\n\nfunction applyFont(\n style: CellStyle,\n font: XmlNode,\n theme: string[],\n indexedColors: string[]\n): void {\n if (font[\"b\"] !== undefined && isOn(font[\"b\"])) {\n style.bold = true;\n }\n if (font[\"i\"] !== undefined && isOn(font[\"i\"])) {\n style.italic = true;\n }\n if (font[\"u\"] !== undefined && isOn(font[\"u\"])) {\n style.underline = true;\n }\n const size = numAttr(font[\"sz\"], \"val\");\n if (size !== undefined) {\n // Excel stores font size in points; the engine's fontSize is in pixels.\n style.fontSize = Math.round(size * (96 / 72));\n }\n const color = resolveColor(font[\"color\"], theme, indexedColors);\n if (color) {\n style.color = color;\n }\n}\n\nfunction applyFill(\n style: CellStyle,\n fill: XmlNode,\n theme: string[],\n indexedColors: string[]\n): void {\n const pattern = fill[\"patternFill\"] as XmlNode | undefined;\n if (!pattern) {\n return;\n }\n const patternType = attr(pattern, \"patternType\");\n if (patternType === \"none\" || patternType === undefined) {\n return;\n }\n // For a solid fill Excel puts the visible colour in fgColor, not bgColor.\n const color =\n resolveColor(pattern[\"fgColor\"], theme, indexedColors) ??\n resolveColor(pattern[\"bgColor\"], theme, indexedColors);\n if (color) {\n style.backgroundColor = color;\n }\n}\n\nconst BORDER_SIDES = [\"top\", \"right\", \"bottom\", \"left\"] as const;\n\nfunction applyBorder(\n style: CellStyle,\n border: XmlNode,\n theme: string[],\n indexedColors: string[]\n): void {\n const sides: NonNullable<CellStyle[\"borderSides\"]> = {};\n let color: string | undefined;\n let any = false;\n\n for (const side of BORDER_SIDES) {\n const node = border[side] as XmlNode | undefined;\n const borderStyle = node ? attr(node, \"style\") : undefined;\n if (!node || borderStyle === undefined || borderStyle === \"none\") {\n continue;\n }\n sides[side] = true;\n any = true;\n color ??= resolveColor(node[\"color\"], theme, indexedColors);\n }\n\n if (any) {\n style.borderSides = sides;\n // The engine has one border colour per cell, so the first side's colour\n // stands in for all of them.\n style.borderColor = color ?? \"#000000\";\n }\n}\n\nfunction isOn(node: unknown): boolean {\n // <b/> means bold; <b val=\"0\"/> means not bold.\n const val = attr(node, \"val\");\n return val === undefined || val === \"1\" || val.toLowerCase() === \"true\";\n}\n\nfunction isDateFormat(numFmtId: number, code: string | undefined): boolean {\n if (BUILTIN_DATE_FORMAT_IDS.has(numFmtId)) {\n return true;\n }\n if (!code) {\n return false;\n }\n // Strip literal text and colour/condition sections before looking for date\n // tokens, so that \"0.00\" with a [Red] section is not read as a date.\n const stripped = code\n .replace(/\\[[^\\]]*\\]/g, \"\")\n .replace(/\"[^\"]*\"/g, \"\")\n .replace(/\\\\./g, \"\");\n return /[dmyhs]/i.test(stripped) && !/^[^dmyhs]*$/i.test(stripped);\n}\n\n/** Convert an Excel colour node to a `#rrggbb` string. */\nfunction resolveColor(\n node: unknown,\n theme: string[],\n indexedColors: string[]\n): string | undefined {\n if (!node || typeof node !== \"object\") {\n return undefined;\n }\n\n const rgb = attr(node, \"rgb\");\n if (rgb) {\n return applyTint(argbToHex(rgb), numAttr(node, \"tint\"));\n }\n\n const themeIndex = numAttr(node, \"theme\");\n if (themeIndex !== undefined) {\n const base = theme[themeIndex];\n if (base) {\n return applyTint(base, numAttr(node, \"tint\"));\n }\n }\n\n const indexed = numAttr(node, \"indexed\");\n if (indexed !== undefined) {\n const base = indexedColors[indexed];\n if (base) {\n return applyTint(base, numAttr(node, \"tint\"));\n }\n }\n\n return undefined;\n}\n\n/** Excel writes colours as AARRGGBB; the alpha channel is dropped. */\nfunction argbToHex(argb: string): string {\n const value = argb.replace(/^#/, \"\");\n const rgb = value.length === 8 ? value.slice(2) : value;\n return `#${rgb.toLowerCase()}`;\n}\n\n/**\n * Excel lightens or darkens a base colour by a tint in [-1, 1]. Negative tints\n * darken, positive tints lighten toward white.\n */\nfunction applyTint(hex: string, tint: number | undefined): string {\n if (!tint) {\n return hex;\n }\n const value = hex.replace(\"#\", \"\");\n const channels = [0, 2, 4].map((offset) =>\n Number.parseInt(value.slice(offset, offset + 2), 16)\n );\n const tinted = channels.map((channel) => {\n const next =\n tint < 0 ? channel * (1 + tint) : channel * (1 - tint) + 255 * tint;\n return Math.max(0, Math.min(255, Math.round(next)));\n });\n return `#${tinted.map((c) => c.toString(16).padStart(2, \"0\")).join(\"\")}`;\n}\n\n/** Theme colours, in the order conditional formats and styles index them. */\nfunction parseThemeColors(pkg: XlsxPackage): string[] {\n const themePath = pkg\n .list(\"xl/theme/\")\n .find((path) => path.endsWith(\".xml\"));\n if (!themePath) {\n return [];\n }\n const text = pkg.text(themePath);\n if (!text) {\n return [];\n }\n\n const scheme = /<a:clrScheme[\\s\\S]*?<\\/a:clrScheme>/.exec(text)?.[0];\n if (!scheme) {\n return [];\n }\n\n const colors: string[] = [];\n const entry =\n /<a:(dk1|lt1|dk2|lt2|accent[1-6]|hlink|folHlink)>([\\s\\S]*?)<\\/a:\\1>/g;\n let match: RegExpExecArray | null;\n while ((match = entry.exec(scheme)) !== null) {\n const body = match[2] ?? \"\";\n const srgb = /<a:srgbClr val=\"([0-9A-Fa-f]{6})\"/.exec(body)?.[1];\n const sys = /<a:sysClr[^>]*lastClr=\"([0-9A-Fa-f]{6})\"/.exec(body)?.[1];\n colors.push(`#${(srgb ?? sys ?? \"000000\").toLowerCase()}`);\n }\n\n // Excel's theme index order swaps the first two pairs relative to the file.\n if (colors.length >= 4) {\n const [dk1, lt1, dk2, lt2, ...rest] = colors;\n return [lt1!, dk1!, lt2!, dk2!, ...rest];\n }\n return colors;\n}\n\nfunction parseIndexedColors(styleSheet: XmlNode): string[] {\n const colors = asArray(\n (\n (styleSheet[\"colors\"] as XmlNode | undefined)?.[\"indexedColors\"] as\n | XmlNode\n | undefined\n )?.[\"rgbColor\"]\n );\n if (colors.length > 0) {\n return colors.map((color) => argbToHex(attr(color, \"rgb\") ?? \"FF000000\"));\n }\n return DEFAULT_INDEXED_COLORS;\n}\n\n/** Excel's legacy 56-colour palette, used when a file omits its own. */\nconst DEFAULT_INDEXED_COLORS: string[] = [\n \"#000000\", \"#ffffff\", \"#ff0000\", \"#00ff00\", \"#0000ff\", \"#ffff00\", \"#ff00ff\",\n \"#00ffff\", \"#000000\", \"#ffffff\", \"#ff0000\", \"#00ff00\", \"#0000ff\", \"#ffff00\",\n \"#ff00ff\", \"#00ffff\", \"#800000\", \"#008000\", \"#000080\", \"#808000\", \"#800080\",\n \"#008080\", \"#c0c0c0\", \"#808080\", \"#9999ff\", \"#993366\", \"#ffffcc\", \"#ccffff\",\n \"#660066\", \"#ff8080\", \"#0066cc\", \"#ccccff\", \"#000080\", \"#ff00ff\", \"#ffff00\",\n \"#00ffff\", \"#800080\", \"#800000\", \"#008080\", \"#0000ff\", \"#00ccff\", \"#ccffff\",\n \"#ccffcc\", \"#ffff99\", \"#99ccff\", \"#ff99cc\", \"#cc99ff\", \"#ffcc99\", \"#3366ff\",\n \"#33cccc\", \"#99cc00\", \"#ffcc00\", \"#ff9900\", \"#ff6600\", \"#666699\", \"#969696\",\n \"#003366\", \"#339966\", \"#003300\", \"#333300\", \"#993300\", \"#993366\", \"#333399\",\n \"#333333\",\n];\n",
10
- "/**\n * Translates an Excel formula into engine formula text.\n *\n * Excel and the engine share almost all of their syntax — A1 references, sheet\n * and workbook qualifiers, structured table references, array literals and the\n * operator set all carry over unchanged. Translation therefore rewrites the few\n * constructs that genuinely differ and reports, rather than rewrites, anything\n * the engine cannot evaluate. Formulas using unsupported functions are kept\n * verbatim so the original intent stays visible in the cell.\n */\n\nimport { getFormulaFunctionCatalog } from \"@ricsam/formula-engine\";\nimport type { Diagnostic } from \"../types\";\n\n/** Uppercase names of every function the engine implements, including aliases. */\nlet supportedFunctionNames: Set<string> | undefined;\n\nfunction getSupportedFunctions(): Set<string> {\n if (!supportedFunctionNames) {\n const names = new Set<string>();\n for (const descriptor of getFormulaFunctionCatalog()) {\n names.add(descriptor.name.toUpperCase());\n for (const alias of descriptor.aliases ?? []) {\n names.add(alias.toUpperCase());\n }\n }\n supportedFunctionNames = names;\n }\n return supportedFunctionNames;\n}\n\n/**\n * Excel writes newer functions with a `_xlfn.` prefix (and `_xlfn._xlws.` for\n * worksheet-scoped ones) when they postdate the file format. The prefix is a\n * storage detail, never part of the user-visible formula.\n */\nconst XLFN_PREFIX = /_xlfn\\.(_xlws\\.)?/g;\n\n/**\n * `@` marks implicit intersection in files written by dynamic-array Excel. The\n * engine has no implicit-intersection operator, so it is dropped: for a single\n * -valued reference the behaviour is identical.\n */\nconst IMPLICIT_INTERSECTION = /(?<![\\w$\"'\\]])@(?=[A-Za-z_\\\\])/g;\n\nexport interface TranslateFormulaOptions {\n sheetName?: string;\n cellReference?: string;\n}\n\nexport interface TranslatedFormula {\n /** Engine formula text, including the leading `=`. */\n formula: string;\n diagnostics: Diagnostic[];\n}\n\nexport function translateFormula(\n rawFormula: string,\n options: TranslateFormulaOptions = {}\n): TranslatedFormula {\n const diagnostics: Diagnostic[] = [];\n let body = rawFormula.startsWith(\"=\") ? rawFormula.slice(1) : rawFormula;\n\n body = body.replace(XLFN_PREFIX, \"\");\n body = body.replace(IMPLICIT_INTERSECTION, \"\");\n\n for (const name of findUnsupportedFunctions(body)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"unsupported-function\",\n message:\n `The engine does not implement ${name}(). The formula was imported ` +\n `unchanged and will evaluate to an error.`,\n sheetName: options.sheetName,\n cellReference: options.cellReference,\n source: rawFormula,\n });\n }\n\n return { formula: `=${body}`, diagnostics };\n}\n\n/**\n * Find function calls in a formula whose names the engine does not implement.\n *\n * This scans outside of string literals and skips identifiers that are not\n * followed by `(`, so table columns (`Table[Amount]`) and named expressions are\n * not mistaken for calls.\n */\nexport function findUnsupportedFunctions(formulaBody: string): string[] {\n const supported = getSupportedFunctions();\n const found = new Set<string>();\n\n let inString = false;\n let identifier = \"\";\n\n for (let i = 0; i < formulaBody.length; i++) {\n const char = formulaBody[i]!;\n\n if (inString) {\n if (char === '\"') {\n // A doubled quote is an escaped quote inside the literal.\n if (formulaBody[i + 1] === '\"') {\n i++;\n } else {\n inString = false;\n }\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n identifier = \"\";\n continue;\n }\n\n if (/[A-Za-z0-9_.]/.test(char)) {\n identifier += char;\n continue;\n }\n\n if (char === \"(\" && identifier.length > 0) {\n const name = identifier.toUpperCase();\n // A trailing sheet qualifier (Sheet1!SUM) cannot occur, but a decimal\n // number can end up in `identifier`; require a letter first.\n if (/^[A-Z_][A-Z0-9_.]*$/.test(name) && !supported.has(name)) {\n found.add(name);\n }\n }\n\n identifier = \"\";\n }\n\n return Array.from(found);\n}\n\n/**\n * Expand a shared formula.\n *\n * Excel stores one formula for a group of cells and expects readers to offset\n * its relative references for every other cell in the group. Absolute parts\n * (`$A$1`) stay put.\n */\nexport function offsetFormulaReferences(\n formulaBody: string,\n deltaCols: number,\n deltaRows: number\n): string {\n if (deltaCols === 0 && deltaRows === 0) {\n return formulaBody;\n }\n\n // Matches an optional sheet/workbook qualifier followed by a cell reference,\n // so that the qualifier is preserved while the reference is shifted.\n const reference =\n /(\\$?)([A-Za-z]{1,3})(\\$?)(\\d{1,7})(?![\\w(])/g;\n\n let result = \"\";\n let lastIndex = 0;\n let inString = false;\n\n for (let i = 0; i < formulaBody.length; i++) {\n if (formulaBody[i] === '\"') {\n if (inString && formulaBody[i + 1] === '\"') {\n i++;\n continue;\n }\n inString = !inString;\n }\n if (inString) {\n continue;\n }\n\n reference.lastIndex = i;\n const match = reference.exec(formulaBody);\n if (!match || match.index !== i) {\n continue;\n }\n\n const [whole, colAbs, colLabel, rowAbs, rowDigits] = match;\n // Skip anything that is part of a longer identifier, e.g. the \"A1\" in\n // \"MYA1NAME\" or a function name. A \"!\" before the reference is a sheet\n // qualifier, whose reference still shifts, and a \"$\" is the reference's own\n // absolute marker.\n const before = i > 0 ? formulaBody[i - 1]! : \"\";\n if (/[A-Za-z0-9_.]/.test(before)) {\n continue;\n }\n\n result += formulaBody.slice(lastIndex, i);\n result += shiftReference(\n colAbs!,\n colLabel!,\n rowAbs!,\n rowDigits!,\n deltaCols,\n deltaRows\n );\n lastIndex = i + whole!.length;\n i = lastIndex - 1;\n }\n\n result += formulaBody.slice(lastIndex);\n return result;\n}\n\nfunction shiftReference(\n colAbs: string,\n colLabel: string,\n rowAbs: string,\n rowDigits: string,\n deltaCols: number,\n deltaRows: number\n): string {\n const colIndex = columnLabelToIndex(colLabel);\n const rowIndex = Number.parseInt(rowDigits, 10) - 1;\n\n const newColIndex = colAbs ? colIndex : colIndex + deltaCols;\n const newRowIndex = rowAbs ? rowIndex : rowIndex + deltaRows;\n\n if (newColIndex < 0 || newRowIndex < 0) {\n return \"#REF!\";\n }\n\n return `${colAbs}${columnIndexToLabel(newColIndex)}${rowAbs}${newRowIndex + 1}`;\n}\n\nfunction columnLabelToIndex(label: string): number {\n let index = 0;\n for (let i = 0; i < label.length; i++) {\n index = index * 26 + (label.toUpperCase().charCodeAt(i) - 64);\n }\n return index - 1;\n}\n\nfunction columnIndexToLabel(index: number): string {\n let label = \"\";\n let remaining = index + 1;\n while (remaining > 0) {\n const rest = (remaining - 1) % 26;\n label = String.fromCharCode(65 + rest) + label;\n remaining = Math.floor((remaining - rest) / 26);\n }\n return label;\n}\n",
10
+ "/**\n * Translates an Excel formula into engine formula text.\n *\n * Excel and the engine share almost all of their syntax — A1 references, sheet\n * and workbook qualifiers, structured table references, array literals and the\n * operator set all carry over unchanged. Translation therefore rewrites the few\n * constructs that genuinely differ and reports, rather than rewrites, anything\n * the engine cannot evaluate. Formulas using unsupported functions are kept\n * verbatim so the original intent stays visible in the cell.\n */\n\nimport { getFormulaFunctionCatalog } from \"@ricsam/formula-engine\";\nimport type { Diagnostic } from \"../types\";\n\n/** Uppercase names of every function the engine implements, including aliases. */\nlet supportedFunctionNames: Set<string> | undefined;\n\nfunction getSupportedFunctions(): Set<string> {\n if (!supportedFunctionNames) {\n const names = new Set<string>();\n for (const descriptor of getFormulaFunctionCatalog()) {\n names.add(descriptor.name.toUpperCase());\n for (const alias of descriptor.aliases ?? []) {\n names.add(alias.toUpperCase());\n }\n }\n supportedFunctionNames = names;\n }\n return supportedFunctionNames;\n}\n\n/**\n * Excel writes newer functions with a `_xlfn.` prefix (and `_xlfn._xlws.` for\n * worksheet-scoped ones) when they postdate the file format. The prefix is a\n * storage detail, never part of the user-visible formula.\n */\nconst XLFN_PREFIX = /_xlfn\\.(_xlws\\.)?/g;\n\n/**\n * `@` marks implicit intersection in files written by dynamic-array Excel. The\n * engine has no implicit-intersection operator, so it is dropped: for a\n * single-valued reference the behaviour is identical.\n *\n * `[` is excluded from what may precede it, because `[@Column]` is not an\n * implicit intersection at all — it is a structured reference to the current\n * row. Stripping that `@` turns `Table[@Amount]` into `Table[Amount]`, which is\n * the whole column: a formula that still evaluates, and quietly gives the wrong\n * number.\n */\nconst IMPLICIT_INTERSECTION = /(?<![\\w$\"'\\]\\[])@(?=[A-Za-z_\\\\])/g;\n\n/**\n * Rewrite Excel's stored current-row selector into the `@` form.\n *\n * Excel stores `Table[[#This Row],[Column]]` in the file but only ever *shows*\n * `[@Column]` in its formula bar — the `@` shorthand is newer than the file\n * format, so the fully-qualified selector is what gets written for compatibility.\n * The engine reads the shorthand and not the selector, so this rewrite is what\n * makes a calculated column work at all. It also happens to put back the exact\n * text the author typed, which is the form they will expect to see.\n *\n * Both the spaced spelling Excel writes and the unspaced one some writers emit\n * are handled, as is the `[ColA]:[ColB]` span form.\n */\nconst THIS_ROW_REFERENCE =\n /(?:'((?:[^']|'')+)'|([A-Za-z_\\\\][\\w.\\\\]*))?\\[\\[#This ?Row\\],\\s*\\[([^\\]]*)\\](?:\\s*:\\s*\\[([^\\]]*)\\])?\\]/gi;\n\nexport interface TranslateFormulaOptions {\n sheetName?: string;\n cellReference?: string;\n /**\n * The table the formula's own cell sits inside, when it sits inside one.\n *\n * Excel drops the table name from a current-row reference that points at the\n * table the formula is already in, so `[@Payload]` is what the author sees.\n * Supplying it here reproduces that, and leaving it out keeps the name — which\n * is still correct, just more verbose than Excel would be.\n */\n containingTableName?: string;\n}\n\nexport interface TranslatedFormula {\n /** Engine formula text, including the leading `=`. */\n formula: string;\n diagnostics: Diagnostic[];\n}\n\nexport function translateFormula(\n rawFormula: string,\n options: TranslateFormulaOptions = {}\n): TranslatedFormula {\n const diagnostics: Diagnostic[] = [];\n let body = rawFormula.startsWith(\"=\") ? rawFormula.slice(1) : rawFormula;\n\n body = body.replace(XLFN_PREFIX, \"\");\n body = body.replace(IMPLICIT_INTERSECTION, \"\");\n body = contractThisRowReferences(body, options.containingTableName);\n\n for (const name of findUnsupportedFunctions(body)) {\n diagnostics.push({\n severity: \"warning\",\n code: \"unsupported-function\",\n message:\n `The engine does not implement ${name}(). The formula was imported ` +\n `unchanged and will evaluate to an error.`,\n sheetName: options.sheetName,\n cellReference: options.cellReference,\n source: rawFormula,\n });\n }\n\n return { formula: `=${body}`, diagnostics };\n}\n\n/**\n * Find function calls in a formula whose names the engine does not implement.\n *\n * This scans outside of string literals and skips identifiers that are not\n * followed by `(`, so table columns (`Table[Amount]`) and named expressions are\n * not mistaken for calls.\n */\nexport function findUnsupportedFunctions(formulaBody: string): string[] {\n const supported = getSupportedFunctions();\n const found = new Set<string>();\n\n let inString = false;\n let identifier = \"\";\n\n for (let i = 0; i < formulaBody.length; i++) {\n const char = formulaBody[i]!;\n\n if (inString) {\n if (char === '\"') {\n // A doubled quote is an escaped quote inside the literal.\n if (formulaBody[i + 1] === '\"') {\n i++;\n } else {\n inString = false;\n }\n }\n continue;\n }\n\n if (char === '\"') {\n inString = true;\n identifier = \"\";\n continue;\n }\n\n if (/[A-Za-z0-9_.]/.test(char)) {\n identifier += char;\n continue;\n }\n\n if (char === \"(\" && identifier.length > 0) {\n const name = identifier.toUpperCase();\n // A trailing sheet qualifier (Sheet1!SUM) cannot occur, but a decimal\n // number can end up in `identifier`; require a letter first.\n if (/^[A-Z_][A-Z0-9_.]*$/.test(name) && !supported.has(name)) {\n found.add(name);\n }\n }\n\n identifier = \"\";\n }\n\n return Array.from(found);\n}\n\n/**\n * Expand a shared formula.\n *\n * Excel stores one formula for a group of cells and expects readers to offset\n * its relative references for every other cell in the group. Absolute parts\n * (`$A$1`) stay put.\n */\nexport function offsetFormulaReferences(\n formulaBody: string,\n deltaCols: number,\n deltaRows: number\n): string {\n if (deltaCols === 0 && deltaRows === 0) {\n return formulaBody;\n }\n\n // Matches an optional sheet/workbook qualifier followed by a cell reference,\n // so that the qualifier is preserved while the reference is shifted.\n const reference =\n /(\\$?)([A-Za-z]{1,3})(\\$?)(\\d{1,7})(?![\\w(])/g;\n\n let result = \"\";\n let lastIndex = 0;\n let inString = false;\n\n for (let i = 0; i < formulaBody.length; i++) {\n if (formulaBody[i] === '\"') {\n if (inString && formulaBody[i + 1] === '\"') {\n i++;\n continue;\n }\n inString = !inString;\n }\n if (inString) {\n continue;\n }\n\n reference.lastIndex = i;\n const match = reference.exec(formulaBody);\n if (!match || match.index !== i) {\n continue;\n }\n\n const [whole, colAbs, colLabel, rowAbs, rowDigits] = match;\n // Skip anything that is part of a longer identifier, e.g. the \"A1\" in\n // \"MYA1NAME\" or a function name. A \"!\" before the reference is a sheet\n // qualifier, whose reference still shifts, and a \"$\" is the reference's own\n // absolute marker.\n const before = i > 0 ? formulaBody[i - 1]! : \"\";\n if (/[A-Za-z0-9_.]/.test(before)) {\n continue;\n }\n\n result += formulaBody.slice(lastIndex, i);\n result += shiftReference(\n colAbs!,\n colLabel!,\n rowAbs!,\n rowDigits!,\n deltaCols,\n deltaRows\n );\n lastIndex = i + whole!.length;\n i = lastIndex - 1;\n }\n\n result += formulaBody.slice(lastIndex);\n return result;\n}\n\nfunction shiftReference(\n colAbs: string,\n colLabel: string,\n rowAbs: string,\n rowDigits: string,\n deltaCols: number,\n deltaRows: number\n): string {\n const colIndex = columnLabelToIndex(colLabel);\n const rowIndex = Number.parseInt(rowDigits, 10) - 1;\n\n const newColIndex = colAbs ? colIndex : colIndex + deltaCols;\n const newRowIndex = rowAbs ? rowIndex : rowIndex + deltaRows;\n\n if (newColIndex < 0 || newRowIndex < 0) {\n return \"#REF!\";\n }\n\n return `${colAbs}${columnIndexToLabel(newColIndex)}${rowAbs}${newRowIndex + 1}`;\n}\n\nfunction columnLabelToIndex(label: string): number {\n let index = 0;\n for (let i = 0; i < label.length; i++) {\n index = index * 26 + (label.toUpperCase().charCodeAt(i) - 64);\n }\n return index - 1;\n}\n\nfunction columnIndexToLabel(index: number): string {\n let label = \"\";\n let remaining = index + 1;\n while (remaining > 0) {\n const rest = (remaining - 1) % 26;\n label = String.fromCharCode(65 + rest) + label;\n remaining = Math.floor((remaining - rest) / 26);\n }\n return label;\n}\n\n/**\n * `Table[[#This Row],[Col]]` → `Table[@Col]`, or `[@Col]` when the formula is\n * already inside that table.\n */\nexport function contractThisRowReferences(\n formulaBody: string,\n containingTableName?: string\n): string {\n return formulaBody.replace(\n THIS_ROW_REFERENCE,\n (whole, quotedTable, bareTable, startCol, endCol) => {\n const tableName: string | undefined = quotedTable\n ? String(quotedTable).replace(/''/g, \"'\")\n : bareTable\n ? String(bareTable)\n : undefined;\n\n // A column name can contain characters that would not survive being\n // written bare, so the bracketed form is kept whenever it is a span or\n // the name is not a plain identifier.\n const columns =\n endCol === undefined\n ? `[${startCol}]`\n : `[${startCol}]:[${endCol}]`;\n\n const isPlainSingleColumn =\n endCol === undefined && /^[^[\\]@#'\"]+$/.test(String(startCol));\n\n const reference = isPlainSingleColumn ? `@${startCol}` : `@${columns}`;\n\n // Excel itself drops the table name when the formula lives in that table.\n if (\n tableName &&\n containingTableName &&\n tableName.toLowerCase() === containingTableName.toLowerCase()\n ) {\n return `[${reference}]`;\n }\n if (!tableName) {\n return `[${reference}]`;\n }\n const quoted = quotedTable ? `'${String(quotedTable)}'` : tableName;\n return `${quoted}[${reference}]`;\n }\n );\n}\n",
11
11
  "/**\n * Translates Excel conditional formatting into engine conditional styles.\n *\n * The engine offers two kinds of rule: a formula rule, which paints a cell one\n * colour when a formula is true, and a gradient rule, which interpolates\n * between two colour stops. Excel's rule catalogue is much larger, so this maps\n * what fits and reports the rest.\n *\n * Excel writes each rule's condition relative to the top-left cell of the range\n * it applies to, which is exactly the convention the engine's formula rules use,\n * so conditions carry over without rebasing.\n */\n\nimport {\n hexToLch,\n type ConditionalStyle,\n type LCHColor,\n type StyleCondition,\n} from \"@ricsam/formula-engine\";\nimport type { RawConditionalFormat } from \"../xlsx/worksheet\";\nimport type { Diagnostic } from \"../types\";\nimport type { WorkbookDataArea } from \"@ricsam/formula-engine\";\nimport { rangeReferenceToSpreadsheetRange } from \"../a1\";\nimport { translateFormula } from \"./formula\";\n\nexport interface TranslatedConditionalFormat {\n areas: WorkbookDataArea[];\n condition: StyleCondition;\n}\n\nexport interface TranslateConditionalFormatOptions {\n sheetName: string;\n /** Differential formats from styles.xml, indexed by `dxfId`. */\n differentialFormats: { backgroundColor?: string; color?: string }[];\n}\n\nexport function translateConditionalFormat(\n rule: RawConditionalFormat,\n options: TranslateConditionalFormatOptions\n): { result?: TranslatedConditionalFormat; diagnostics: Diagnostic[] } {\n const diagnostics: Diagnostic[] = [];\n\n const areas: WorkbookDataArea[] = [];\n for (const reference of rule.ranges) {\n const range = rangeReferenceToSpreadsheetRange(reference);\n if (range) {\n areas.push({ sheetName: options.sheetName, range });\n }\n }\n if (areas.length === 0) {\n return { diagnostics };\n }\n\n const anchor = rule.ranges[0]?.split(\":\")[0]?.replace(/\\$/g, \"\") ?? \"A1\";\n\n if (rule.type === \"colorScale\") {\n return translateColorScale(rule, areas, options, diagnostics);\n }\n\n const condition = buildFormulaCondition(rule, anchor, options, diagnostics);\n if (!condition) {\n return { diagnostics };\n }\n\n return { result: { areas, condition }, diagnostics };\n}\n\nfunction buildFormulaCondition(\n rule: RawConditionalFormat,\n anchor: string,\n options: TranslateConditionalFormatOptions,\n diagnostics: Diagnostic[]\n): StyleCondition | undefined {\n const color = ruleColor(rule, options);\n if (!color) {\n diagnostics.push({\n severity: \"warning\",\n code: \"unsupported-conditional-format\",\n message:\n `A ${rule.type} rule was skipped because its format has no fill or ` +\n `font colour the engine can apply.`,\n sheetName: options.sheetName,\n });\n return undefined;\n }\n\n const expression = buildExpression(rule, anchor, options, diagnostics);\n if (!expression) {\n return undefined;\n }\n\n const translated = translateFormula(expression, {\n sheetName: options.sheetName,\n cellReference: anchor,\n });\n diagnostics.push(...translated.diagnostics);\n\n return { type: \"formula\", formula: translated.formula, color };\n}\n\n/**\n * Build the boolean expression for a rule, in terms of the range's anchor cell.\n */\nfunction buildExpression(\n rule: RawConditionalFormat,\n anchor: string,\n options: TranslateConditionalFormatOptions,\n diagnostics: Diagnostic[]\n): string | undefined {\n const [first, second] = rule.formulas;\n\n switch (rule.type) {\n case \"expression\":\n return first ? `=${first}` : undefined;\n\n case \"cellIs\":\n return cellIsExpression(rule.operator, anchor, first, second);\n\n case \"containsText\":\n return rule.text === undefined\n ? undefined\n : `=IFERROR(FIND(${quote(rule.text)},${anchor})>0,FALSE)`;\n\n case \"notContainsText\":\n return rule.text === undefined\n ? undefined\n : `=IFERROR(FIND(${quote(rule.text)},${anchor})>0,FALSE)=FALSE`;\n\n case \"beginsWith\":\n return rule.text === undefined\n ? undefined\n : `=EXACT(LEFT(${anchor},${rule.text.length}),${quote(rule.text)})`;\n\n case \"endsWith\":\n return rule.text === undefined\n ? undefined\n : `=EXACT(RIGHT(${anchor},${rule.text.length}),${quote(rule.text)})`;\n\n case \"containsBlanks\":\n return `=LEN(${anchor})=0`;\n\n case \"notContainsBlanks\":\n return `=LEN(${anchor})>0`;\n\n default:\n diagnostics.push({\n severity: \"warning\",\n code: \"unsupported-conditional-format\",\n message:\n `The engine cannot express a \"${rule.type}\" conditional formatting ` +\n `rule, so it was skipped.`,\n sheetName: options.sheetName,\n });\n return undefined;\n }\n}\n\nfunction cellIsExpression(\n operator: string | undefined,\n anchor: string,\n first: string | undefined,\n second: string | undefined\n): string | undefined {\n if (first === undefined) {\n return undefined;\n }\n\n switch (operator) {\n case \"equal\":\n return `=${anchor}=${first}`;\n case \"notEqual\":\n return `=${anchor}<>${first}`;\n case \"greaterThan\":\n return `=${anchor}>${first}`;\n case \"greaterThanOrEqual\":\n return `=${anchor}>=${first}`;\n case \"lessThan\":\n return `=${anchor}<${first}`;\n case \"lessThanOrEqual\":\n return `=${anchor}<=${first}`;\n case \"between\":\n return second === undefined\n ? undefined\n : `=AND(${anchor}>=${first},${anchor}<=${second})`;\n case \"notBetween\":\n return second === undefined\n ? undefined\n : `=OR(${anchor}<${first},${anchor}>${second})`;\n default:\n return undefined;\n }\n}\n\nfunction translateColorScale(\n rule: RawConditionalFormat,\n areas: WorkbookDataArea[],\n options: TranslateConditionalFormatOptions,\n diagnostics: Diagnostic[]\n): { result?: TranslatedConditionalFormat; diagnostics: Diagnostic[] } {\n const scale = rule.colorScale;\n if (!scale || scale.cfvo.length < 2 || scale.colors.length < 2) {\n return { diagnostics };\n }\n\n if (scale.cfvo.length > 2) {\n diagnostics.push({\n severity: \"info\",\n code: \"unsupported-conditional-format\",\n message:\n \"A three-colour scale was imported as a two-colour gradient between \" +\n \"its lowest and highest stops; the midpoint colour was dropped.\",\n sheetName: options.sheetName,\n });\n }\n\n const firstStop = scale.cfvo[0]!;\n const lastStop = scale.cfvo[scale.cfvo.length - 1]!;\n const firstColor = toLch(scale.colors[0]);\n const lastColor = toLch(scale.colors[scale.colors.length - 1]);\n\n if (!firstColor || !lastColor) {\n return { diagnostics };\n }\n\n const min =\n firstStop.type === \"num\" && firstStop.val !== undefined\n ? ({\n type: \"number\" as const,\n color: firstColor,\n valueFormula: `=${firstStop.val}`,\n })\n : ({ type: \"lowest_value\" as const, color: firstColor });\n\n const max =\n lastStop.type === \"num\" && lastStop.val !== undefined\n ? ({\n type: \"number\" as const,\n color: lastColor,\n valueFormula: `=${lastStop.val}`,\n })\n : ({ type: \"highest_value\" as const, color: lastColor });\n\n if (\n (firstStop.type !== \"num\" && firstStop.type !== \"min\") ||\n (lastStop.type !== \"num\" && lastStop.type !== \"max\")\n ) {\n diagnostics.push({\n severity: \"info\",\n code: \"unsupported-conditional-format\",\n message:\n `A colour scale using \"${firstStop.type}\"/\"${lastStop.type}\" stops was ` +\n \"imported as a gradient across the range's own lowest and highest \" +\n \"values.\",\n sheetName: options.sheetName,\n });\n }\n\n return {\n result: { areas, condition: { type: \"gradient\", min, max } },\n diagnostics,\n };\n}\n\n/**\n * The colour a rule paints. The engine's formula rule takes a single colour, so\n * a differential format's fill wins over its font colour.\n */\nfunction ruleColor(\n rule: RawConditionalFormat,\n options: TranslateConditionalFormatOptions\n): LCHColor | undefined {\n if (rule.dxfId === undefined) {\n return undefined;\n }\n const format = options.differentialFormats[rule.dxfId];\n if (!format) {\n return undefined;\n }\n const hex = format.backgroundColor ?? format.color;\n return hex ? hexToLch(hex) : undefined;\n}\n\nfunction toLch(argb: string | undefined): LCHColor | undefined {\n if (!argb) {\n return undefined;\n }\n const value = argb.replace(/^#/, \"\");\n const rgb = value.length === 8 ? value.slice(2) : value;\n if (!/^[0-9A-Fa-f]{6}$/.test(rgb)) {\n return undefined;\n }\n return hexToLch(`#${rgb.toLowerCase()}`);\n}\n\nfunction quote(text: string): string {\n return `\"${text.replace(/\"/g, '\"\"')}\"`;\n}\n\nexport type { ConditionalStyle };\n",
12
12
  "/**\n * Excel date handling.\n *\n * Excel stores dates as a serial number of days since an epoch, and the engine\n * has no date type. A date-formatted number would therefore display as a bare\n * serial (45000), so it is converted to an ISO 8601 string instead, which is\n * both readable and sortable.\n */\n\n/** Milliseconds in one day. */\nconst DAY_MS = 86_400_000;\n\n/**\n * Excel's 1900 date system has a deliberate bug: it treats 1900 as a leap year,\n * so serial 60 is the non-existent 1900-02-29 and every serial after it is one\n * day ahead of the true date. Serials above 60 are therefore offset by an epoch\n * of 1899-12-30 rather than 1899-12-31.\n */\nconst EPOCH_1900_UTC = Date.UTC(1899, 11, 30);\nconst EPOCH_1904_UTC = Date.UTC(1904, 0, 1);\n\nexport function excelSerialToIso(serial: number, date1904 = false): string {\n if (!Number.isFinite(serial)) {\n return String(serial);\n }\n\n const epoch = date1904 ? EPOCH_1904_UTC : EPOCH_1900_UTC;\n\n // In the 1900 system serials 1-59 map to Jan 1 - Feb 28 1900 and need the\n // extra day that the leap-year bug adds back for later serials.\n const adjusted =\n !date1904 && serial < 60 && serial >= 1 ? serial + 1 : serial;\n\n const wholeDays = Math.floor(adjusted);\n const fraction = adjusted - wholeDays;\n const ms = epoch + wholeDays * DAY_MS + Math.round(fraction * DAY_MS);\n const date = new Date(ms);\n\n if (Number.isNaN(date.getTime())) {\n return String(serial);\n }\n\n const iso = date.toISOString();\n\n // A whole serial is a date with no time component; Excel represents a\n // time-only value as a fraction below 1.\n if (fraction === 0) {\n return iso.slice(0, 10);\n }\n if (wholeDays === 0) {\n return iso.slice(11, 19);\n }\n return iso.slice(0, 19).replace(\"T\", \" \");\n}\n",
13
- "/**\n * The conversion pipeline: an .xlsx package in, `WorkbookData` out.\n */\n\nimport type {\n SerializedCellValue,\n WorkbookDataCellStyle,\n WorkbookDataConditionalStyle,\n WorkbookDataNamedExpression,\n WorkbookDataSheet,\n WorkbookDataTable,\n} from \"@ricsam/formula-engine\";\nimport { readXlsxPackage } from \"./xlsx/package\";\nimport {\n parseSharedStrings,\n parseTables,\n parseWorkbook,\n type RawTable,\n} from \"./xlsx/workbook\";\nimport { parseWorksheet, type RawCell } from \"./xlsx/worksheet\";\nimport { parseStyles, type ExcelFormat } from \"./xlsx/styles\";\nimport { offsetFormulaReferences, translateFormula } from \"./translate/formula\";\nimport { translateConditionalFormat } from \"./translate/conditional-format\";\nimport { excelSerialToIso } from \"./translate/dates\";\nimport {\n parseA1Range,\n rangeReferenceToSpreadsheetRange,\n toA1,\n toSpreadsheetRange,\n} from \"./a1\";\nimport type {\n ConvertOptions,\n ConvertResult,\n Diagnostic,\n ExcelCellMetadata,\n ExcelSheetMetadata,\n ExcelWorkbookData,\n} from \"./types\";\n\n/**\n * Excel's built-in defined names. They configure print areas and filters rather\n * than naming a value, so importing them as named expressions would be noise.\n */\nconst BUILTIN_DEFINED_NAMES = new Set([\n \"_xlnm.print_area\",\n \"_xlnm.print_titles\",\n \"_xlnm._filterdatabase\",\n \"_xlnm.criteria\",\n \"_xlnm.extract\",\n \"_xlnm.database\",\n \"_xlnm.sheet_title\",\n]);\n\nexport async function convertWorkbook(\n source: Blob | ArrayBuffer | Uint8Array,\n options: ConvertOptions = {}\n): Promise<ConvertResult> {\n const {\n styles: importStyles = true,\n conditionalFormatting: importConditionalFormatting = true,\n tables: importTables = true,\n definedNames: importDefinedNames = true,\n cellMetadata: importCellMetadata = true,\n convertDates = true,\n } = options;\n\n const diagnostics: Diagnostic[] = [];\n const pkg = await readXlsxPackage(source);\n\n const sharedStrings = parseSharedStrings(pkg);\n const { sheets: sheetEntries, definedNames, date1904 } = parseWorkbook(pkg);\n const styleTable = parseStyles(pkg);\n\n const selected = options.sheets\n ? sheetEntries.filter((entry) => options.sheets!.includes(entry.name))\n : sheetEntries;\n\n const sheets: WorkbookDataSheet<ExcelCellMetadata, ExcelSheetMetadata>[] = [];\n const tables: WorkbookDataTable[] = [];\n const cellStyles: WorkbookDataCellStyle[] = [];\n const conditionalStyles: WorkbookDataConditionalStyle[] = [];\n const importedSheetNames = new Set<string>();\n\n for (const entry of selected) {\n const worksheet = parseWorksheet(pkg, entry.partPath, sharedStrings);\n importedSheetNames.add(entry.name);\n\n const content = new Map<string, SerializedCellValue>();\n const cellMetadata = new Map<string, ExcelCellMetadata>();\n // Cells sharing one style are collected so each distinct style becomes a\n // single engine rule over many areas rather than one rule per cell.\n const styleGroups = new Map<number, RawCell[]>();\n\n for (const cell of worksheet.cells) {\n const format =\n cell.styleIndex === undefined\n ? undefined\n : styleTable.formats[cell.styleIndex];\n\n const value = cellValue(cell, format, {\n convertDates,\n date1904,\n sheetName: entry.name,\n diagnostics,\n });\n if (value !== undefined) {\n content.set(cell.reference, value);\n }\n\n if (importStyles && cell.styleIndex !== undefined && format) {\n if (Object.keys(format.style).length > 0) {\n const group = styleGroups.get(cell.styleIndex);\n if (group) {\n group.push(cell);\n } else {\n styleGroups.set(cell.styleIndex, [cell]);\n }\n }\n }\n\n if (importCellMetadata) {\n const metadata: ExcelCellMetadata = {};\n if (format?.numberFormat) {\n metadata.numberFormat = format.numberFormat;\n }\n const hyperlink = worksheet.hyperlinks[cell.reference];\n if (hyperlink) {\n metadata.hyperlink = hyperlink;\n }\n if (Object.keys(metadata).length > 0) {\n cellMetadata.set(cell.reference, metadata);\n }\n }\n }\n\n if (importStyles) {\n for (const [styleIndex, cells] of styleGroups) {\n const format = styleTable.formats[styleIndex];\n if (!format) {\n continue;\n }\n cellStyles.push({\n areas: coalesceCellsIntoAreas(entry.name, cells),\n style: format.style,\n });\n }\n }\n\n if (importConditionalFormatting) {\n // Excel evaluates the lowest priority number last, so it wins. The engine\n // applies later rules on top, so rules are emitted in reverse priority.\n const ordered = [...worksheet.conditionalFormats].sort(\n (a, b) => b.priority - a.priority\n );\n for (const rule of ordered) {\n const { result, diagnostics: ruleDiagnostics } =\n translateConditionalFormat(rule, {\n sheetName: entry.name,\n differentialFormats: styleTable.differentialFormats,\n });\n diagnostics.push(...ruleDiagnostics);\n if (result) {\n conditionalStyles.push(result);\n }\n }\n }\n\n if (importTables) {\n for (const table of parseTables(pkg, entry.partPath)) {\n const converted = convertTable(table, entry.name, diagnostics);\n if (converted) {\n tables.push(converted);\n }\n }\n }\n\n const sheetMetadata: ExcelSheetMetadata = {};\n if (Object.keys(worksheet.columnWidths).length > 0) {\n sheetMetadata.columnWidths = worksheet.columnWidths;\n }\n if (Object.keys(worksheet.rowHeights).length > 0) {\n sheetMetadata.rowHeights = worksheet.rowHeights;\n }\n if (worksheet.merges.length > 0) {\n sheetMetadata.merges = worksheet.merges;\n }\n if (worksheet.frozen) {\n sheetMetadata.frozen = worksheet.frozen;\n }\n if (entry.state !== \"visible\") {\n sheetMetadata.visible = false;\n }\n\n sheets.push({\n name: entry.name,\n content,\n cellMetadata: cellMetadata.size > 0 ? cellMetadata : undefined,\n sheetMetadata:\n Object.keys(sheetMetadata).length > 0 ? sheetMetadata : undefined,\n });\n }\n\n const namedExpressions = importDefinedNames\n ? convertDefinedNames(\n definedNames,\n sheetEntries.map((entry) => entry.name),\n importedSheetNames,\n diagnostics\n )\n : [];\n\n const data: ExcelWorkbookData = {\n sheets,\n tables: tables.length > 0 ? tables : undefined,\n namedExpressions:\n namedExpressions.length > 0 ? namedExpressions : undefined,\n cellStyles: cellStyles.length > 0 ? cellStyles : undefined,\n conditionalStyles:\n conditionalStyles.length > 0 ? conditionalStyles : undefined,\n workbookMetadata: {\n fileName: options.fileName,\n sheetOrder: sheetEntries.map((entry) => entry.name),\n diagnostics: diagnostics.length > 0 ? diagnostics : undefined,\n },\n };\n\n return { data, diagnostics };\n}\n\ninterface CellValueContext {\n convertDates: boolean;\n date1904: boolean;\n sheetName: string;\n diagnostics: Diagnostic[];\n}\n\n/**\n * The engine stores a cell as a formula string, a literal, or nothing. A cell\n * with a formula keeps the formula: Excel's cached result is discarded, because\n * the engine recalculates.\n */\nfunction cellValue(\n cell: RawCell,\n format: ExcelFormat | undefined,\n context: CellValueContext\n): SerializedCellValue {\n if (cell.formula !== undefined) {\n const body = cell.formulaOffset\n ? offsetFormulaReferences(\n cell.formula,\n cell.formulaOffset.cols,\n cell.formulaOffset.rows\n )\n : cell.formula;\n\n const translated = translateFormula(body, {\n sheetName: context.sheetName,\n cellReference: cell.reference,\n });\n context.diagnostics.push(...translated.diagnostics);\n return translated.formula;\n }\n\n switch (cell.kind) {\n case \"number\": {\n const value = cell.value as number;\n if (context.convertDates && format?.isDateFormat) {\n return excelSerialToIso(value, context.date1904);\n }\n return value;\n }\n case \"boolean\":\n return cell.value as boolean;\n case \"string\":\n return cell.value as string;\n case \"date\":\n return cell.value as string;\n case \"error\":\n // Excel's own error text is valid engine cell content.\n return cell.value as string;\n case \"empty\":\n return undefined;\n }\n}\n\nfunction convertTable(\n table: RawTable,\n sheetName: string,\n diagnostics: Diagnostic[]\n): WorkbookDataTable | undefined {\n const parsed = parseA1Range(table.ref);\n if (!parsed) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message: `Table \"${table.displayName}\" has an unreadable range (${table.ref}).`,\n sheetName,\n });\n return undefined;\n }\n\n if (table.headerRowCount === 0) {\n // The engine requires a header row, since structured references name it.\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message:\n `Table \"${table.displayName}\" has no header row, which the engine ` +\n `requires for structured references, so it was skipped.`,\n sheetName,\n });\n return undefined;\n }\n\n const numCols = parsed.end.colIndex - parsed.start.colIndex + 1;\n const dataRows =\n parsed.end.rowIndex -\n parsed.start.rowIndex +\n 1 -\n table.headerRowCount -\n table.totalsRowCount;\n\n if (numCols <= 0 || dataRows < 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message: `Table \"${table.displayName}\" has an empty range (${table.ref}).`,\n sheetName,\n });\n return undefined;\n }\n\n return {\n name: table.displayName,\n sheetName,\n start: toA1(parsed.start),\n numRows: { type: \"number\", value: dataRows },\n numCols,\n };\n}\n\nfunction convertDefinedNames(\n definedNames: { name: string; formula: string; localSheetId?: number; hidden: boolean }[],\n sheetNames: string[],\n importedSheetNames: Set<string>,\n diagnostics: Diagnostic[]\n): WorkbookDataNamedExpression[] {\n const result: WorkbookDataNamedExpression[] = [];\n\n for (const definedName of definedNames) {\n if (BUILTIN_DEFINED_NAMES.has(definedName.name.toLowerCase())) {\n continue;\n }\n if (definedName.hidden || definedName.formula.trim() === \"\") {\n continue;\n }\n if (definedName.formula.includes(\"#REF!\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-defined-name\",\n message: `Defined name \"${definedName.name}\" refers to a deleted range.`,\n source: definedName.formula,\n });\n continue;\n }\n\n const sheetName =\n definedName.localSheetId === undefined\n ? undefined\n : sheetNames[definedName.localSheetId];\n\n if (sheetName !== undefined && !importedSheetNames.has(sheetName)) {\n continue;\n }\n\n // Named expressions are stored as a formula body with no leading \"=\".\n const translated = translateFormula(definedName.formula);\n diagnostics.push(...translated.diagnostics);\n\n result.push({\n name: definedName.name,\n expression: translated.formula.slice(1),\n sheetName,\n });\n }\n\n return result;\n}\n\n/**\n * Turn a set of cells sharing one style into as few rectangular areas as\n * possible.\n *\n * Excel's style model is per-cell, but the engine's is per-area, so emitting\n * one area per cell would produce enormous rule lists on real workbooks. Cells\n * are merged into horizontal runs, then adjacent identical runs are merged\n * vertically into blocks.\n */\nexport function coalesceCellsIntoAreas(\n sheetName: string,\n cells: { colIndex: number; rowIndex: number }[]\n): { sheetName: string; range: ReturnType<typeof toSpreadsheetRange> }[] {\n const byRow = new Map<number, number[]>();\n for (const cell of cells) {\n const row = byRow.get(cell.rowIndex);\n if (row) {\n row.push(cell.colIndex);\n } else {\n byRow.set(cell.rowIndex, [cell.colIndex]);\n }\n }\n\n interface Run {\n rowIndex: number;\n startCol: number;\n endCol: number;\n }\n\n const runs: Run[] = [];\n for (const [rowIndex, columns] of byRow) {\n columns.sort((a, b) => a - b);\n let startCol = columns[0]!;\n let previous = startCol;\n for (let i = 1; i < columns.length; i++) {\n const current = columns[i]!;\n if (current === previous + 1) {\n previous = current;\n continue;\n }\n runs.push({ rowIndex, startCol, endCol: previous });\n startCol = current;\n previous = current;\n }\n runs.push({ rowIndex, startCol, endCol: previous });\n }\n\n // Merge runs with identical column spans in consecutive rows into blocks.\n runs.sort((a, b) =>\n a.startCol - b.startCol || a.endCol - b.endCol || a.rowIndex - b.rowIndex\n );\n\n const areas: { sheetName: string; range: ReturnType<typeof toSpreadsheetRange> }[] = [];\n let index = 0;\n while (index < runs.length) {\n const first = runs[index]!;\n let lastRow = first.rowIndex;\n let next = index + 1;\n while (\n next < runs.length &&\n runs[next]!.startCol === first.startCol &&\n runs[next]!.endCol === first.endCol &&\n runs[next]!.rowIndex === lastRow + 1\n ) {\n lastRow = runs[next]!.rowIndex;\n next++;\n }\n\n areas.push({\n sheetName,\n range: toSpreadsheetRange({\n start: { colIndex: first.startCol, rowIndex: first.rowIndex },\n end: { colIndex: first.endCol, rowIndex: lastRow },\n }),\n });\n index = next;\n }\n\n return areas;\n}\n\nexport { rangeReferenceToSpreadsheetRange };\n",
13
+ "/**\n * The conversion pipeline: an .xlsx package in, `WorkbookData` out.\n */\n\nimport type {\n SerializedCellValue,\n WorkbookDataCellStyle,\n WorkbookDataConditionalStyle,\n WorkbookDataNamedExpression,\n WorkbookDataSheet,\n WorkbookDataTable,\n} from \"@ricsam/formula-engine\";\nimport { readXlsxPackage } from \"./xlsx/package\";\nimport {\n parseSharedStrings,\n parseTables,\n parseWorkbook,\n type RawTable,\n} from \"./xlsx/workbook\";\nimport { parseWorksheet, type RawCell } from \"./xlsx/worksheet\";\nimport { parseStyles, type ExcelFormat } from \"./xlsx/styles\";\nimport { offsetFormulaReferences, translateFormula } from \"./translate/formula\";\nimport { translateConditionalFormat } from \"./translate/conditional-format\";\nimport { excelSerialToIso } from \"./translate/dates\";\nimport {\n parseA1Range,\n rangeReferenceToSpreadsheetRange,\n toA1,\n toSpreadsheetRange,\n type ParsedRange,\n} from \"./a1\";\nimport type {\n ConvertOptions,\n ConvertResult,\n Diagnostic,\n ExcelCellMetadata,\n ExcelSheetMetadata,\n ExcelWorkbookData,\n} from \"./types\";\n\n/**\n * Excel's built-in defined names. They configure print areas and filters rather\n * than naming a value, so importing them as named expressions would be noise.\n */\nconst BUILTIN_DEFINED_NAMES = new Set([\n \"_xlnm.print_area\",\n \"_xlnm.print_titles\",\n \"_xlnm._filterdatabase\",\n \"_xlnm.criteria\",\n \"_xlnm.extract\",\n \"_xlnm.database\",\n \"_xlnm.sheet_title\",\n]);\n\nexport async function convertWorkbook(\n source: Blob | ArrayBuffer | Uint8Array,\n options: ConvertOptions = {}\n): Promise<ConvertResult> {\n const {\n styles: importStyles = true,\n conditionalFormatting: importConditionalFormatting = true,\n tables: importTables = true,\n definedNames: importDefinedNames = true,\n cellMetadata: importCellMetadata = true,\n convertDates = true,\n } = options;\n\n const diagnostics: Diagnostic[] = [];\n const pkg = await readXlsxPackage(source);\n\n const sharedStrings = parseSharedStrings(pkg);\n const { sheets: sheetEntries, definedNames, date1904 } = parseWorkbook(pkg);\n const styleTable = parseStyles(pkg);\n\n const selected = options.sheets\n ? sheetEntries.filter((entry) => options.sheets!.includes(entry.name))\n : sheetEntries;\n\n const sheets: WorkbookDataSheet<ExcelCellMetadata, ExcelSheetMetadata>[] = [];\n const tables: WorkbookDataTable[] = [];\n const cellStyles: WorkbookDataCellStyle[] = [];\n const conditionalStyles: WorkbookDataConditionalStyle[] = [];\n const importedSheetNames = new Set<string>();\n\n for (const entry of selected) {\n const worksheet = parseWorksheet(pkg, entry.partPath, sharedStrings);\n importedSheetNames.add(entry.name);\n\n /*\n Tables are read before the cells are, because a formula's translation\n depends on whether its own cell sits inside one: Excel stores a calculated\n column's reference as `Table[[#This Row],[Col]]` and displays it as\n `[@Col]`, and reproducing that needs to know which table \"this row\" is in.\n */\n const sheetTables = importTables ? parseTables(pkg, entry.partPath) : [];\n const tableRanges = sheetTables\n .map((table) => ({ name: table.displayName, range: parseA1Range(table.ref) }))\n .filter(\n (entryTable): entryTable is { name: string; range: ParsedRange } =>\n entryTable.range !== undefined\n );\n\n /** The table a cell sits inside, or undefined when it sits in none. */\n const tableAt = (colIndex: number, rowIndex: number): string | undefined =>\n tableRanges.find(\n ({ range }) =>\n colIndex >= range.start.colIndex &&\n colIndex <= range.end.colIndex &&\n rowIndex >= range.start.rowIndex &&\n rowIndex <= range.end.rowIndex\n )?.name;\n\n const content = new Map<string, SerializedCellValue>();\n const cellMetadata = new Map<string, ExcelCellMetadata>();\n // Cells sharing one style are collected so each distinct style becomes a\n // single engine rule over many areas rather than one rule per cell.\n const styleGroups = new Map<number, RawCell[]>();\n\n for (const cell of worksheet.cells) {\n const format =\n cell.styleIndex === undefined\n ? undefined\n : styleTable.formats[cell.styleIndex];\n\n const value = cellValue(cell, format, {\n convertDates,\n date1904,\n sheetName: entry.name,\n diagnostics,\n containingTableName: tableAt(cell.colIndex, cell.rowIndex),\n });\n if (value !== undefined) {\n content.set(cell.reference, value);\n }\n\n if (importStyles && cell.styleIndex !== undefined && format) {\n if (Object.keys(format.style).length > 0) {\n const group = styleGroups.get(cell.styleIndex);\n if (group) {\n group.push(cell);\n } else {\n styleGroups.set(cell.styleIndex, [cell]);\n }\n }\n }\n\n if (importCellMetadata) {\n const metadata: ExcelCellMetadata = {};\n if (format?.numberFormat) {\n metadata.numberFormat = format.numberFormat;\n }\n const hyperlink = worksheet.hyperlinks[cell.reference];\n if (hyperlink) {\n metadata.hyperlink = hyperlink;\n }\n if (Object.keys(metadata).length > 0) {\n cellMetadata.set(cell.reference, metadata);\n }\n }\n }\n\n if (importStyles) {\n for (const [styleIndex, cells] of styleGroups) {\n const format = styleTable.formats[styleIndex];\n if (!format) {\n continue;\n }\n cellStyles.push({\n areas: coalesceCellsIntoAreas(entry.name, cells),\n style: format.style,\n });\n }\n }\n\n if (importConditionalFormatting) {\n // Excel evaluates the lowest priority number last, so it wins. The engine\n // applies later rules on top, so rules are emitted in reverse priority.\n const ordered = [...worksheet.conditionalFormats].sort(\n (a, b) => b.priority - a.priority\n );\n for (const rule of ordered) {\n const { result, diagnostics: ruleDiagnostics } =\n translateConditionalFormat(rule, {\n sheetName: entry.name,\n differentialFormats: styleTable.differentialFormats,\n });\n diagnostics.push(...ruleDiagnostics);\n if (result) {\n conditionalStyles.push(result);\n }\n }\n }\n\n if (importTables) {\n for (const table of sheetTables) {\n const converted = convertTable(table, entry.name, diagnostics);\n if (converted) {\n tables.push(converted);\n }\n }\n }\n\n const sheetMetadata: ExcelSheetMetadata = {};\n if (Object.keys(worksheet.columnWidths).length > 0) {\n sheetMetadata.columnWidths = worksheet.columnWidths;\n }\n if (Object.keys(worksheet.rowHeights).length > 0) {\n sheetMetadata.rowHeights = worksheet.rowHeights;\n }\n if (worksheet.merges.length > 0) {\n sheetMetadata.merges = worksheet.merges;\n }\n if (worksheet.frozen) {\n sheetMetadata.frozen = worksheet.frozen;\n }\n if (entry.state !== \"visible\") {\n sheetMetadata.visible = false;\n }\n\n sheets.push({\n name: entry.name,\n content,\n cellMetadata: cellMetadata.size > 0 ? cellMetadata : undefined,\n sheetMetadata:\n Object.keys(sheetMetadata).length > 0 ? sheetMetadata : undefined,\n });\n }\n\n const namedExpressions = importDefinedNames\n ? convertDefinedNames(\n definedNames,\n sheetEntries.map((entry) => entry.name),\n importedSheetNames,\n diagnostics\n )\n : [];\n\n const data: ExcelWorkbookData = {\n sheets,\n tables: tables.length > 0 ? tables : undefined,\n namedExpressions:\n namedExpressions.length > 0 ? namedExpressions : undefined,\n cellStyles: cellStyles.length > 0 ? cellStyles : undefined,\n conditionalStyles:\n conditionalStyles.length > 0 ? conditionalStyles : undefined,\n workbookMetadata: {\n fileName: options.fileName,\n sheetOrder: sheetEntries.map((entry) => entry.name),\n diagnostics: diagnostics.length > 0 ? diagnostics : undefined,\n },\n };\n\n return { data, diagnostics };\n}\n\ninterface CellValueContext {\n convertDates: boolean;\n date1904: boolean;\n sheetName: string;\n diagnostics: Diagnostic[];\n /** The table this cell sits inside, when it sits inside one. */\n containingTableName?: string;\n}\n\n/**\n * The engine stores a cell as a formula string, a literal, or nothing. A cell\n * with a formula keeps the formula: Excel's cached result is discarded, because\n * the engine recalculates.\n */\nfunction cellValue(\n cell: RawCell,\n format: ExcelFormat | undefined,\n context: CellValueContext\n): SerializedCellValue {\n if (cell.formula !== undefined) {\n const body = cell.formulaOffset\n ? offsetFormulaReferences(\n cell.formula,\n cell.formulaOffset.cols,\n cell.formulaOffset.rows\n )\n : cell.formula;\n\n const translated = translateFormula(body, {\n sheetName: context.sheetName,\n cellReference: cell.reference,\n containingTableName: context.containingTableName,\n });\n context.diagnostics.push(...translated.diagnostics);\n return translated.formula;\n }\n\n switch (cell.kind) {\n case \"number\": {\n const value = cell.value as number;\n if (context.convertDates && format?.isDateFormat) {\n return excelSerialToIso(value, context.date1904);\n }\n return value;\n }\n case \"boolean\":\n return cell.value as boolean;\n case \"string\":\n return cell.value as string;\n case \"date\":\n return cell.value as string;\n case \"error\":\n // Excel's own error text is valid engine cell content.\n return cell.value as string;\n case \"empty\":\n return undefined;\n }\n}\n\nfunction convertTable(\n table: RawTable,\n sheetName: string,\n diagnostics: Diagnostic[]\n): WorkbookDataTable | undefined {\n const parsed = parseA1Range(table.ref);\n if (!parsed) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message: `Table \"${table.displayName}\" has an unreadable range (${table.ref}).`,\n sheetName,\n });\n return undefined;\n }\n\n if (table.headerRowCount === 0) {\n // The engine requires a header row, since structured references name it.\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message:\n `Table \"${table.displayName}\" has no header row, which the engine ` +\n `requires for structured references, so it was skipped.`,\n sheetName,\n });\n return undefined;\n }\n\n const numCols = parsed.end.colIndex - parsed.start.colIndex + 1;\n const dataRows =\n parsed.end.rowIndex -\n parsed.start.rowIndex +\n 1 -\n table.headerRowCount -\n table.totalsRowCount;\n\n if (numCols <= 0 || dataRows < 0) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-table\",\n message: `Table \"${table.displayName}\" has an empty range (${table.ref}).`,\n sheetName,\n });\n return undefined;\n }\n\n return {\n name: table.displayName,\n sheetName,\n start: toA1(parsed.start),\n numRows: { type: \"number\", value: dataRows },\n numCols,\n };\n}\n\nfunction convertDefinedNames(\n definedNames: { name: string; formula: string; localSheetId?: number; hidden: boolean }[],\n sheetNames: string[],\n importedSheetNames: Set<string>,\n diagnostics: Diagnostic[]\n): WorkbookDataNamedExpression[] {\n const result: WorkbookDataNamedExpression[] = [];\n\n for (const definedName of definedNames) {\n if (BUILTIN_DEFINED_NAMES.has(definedName.name.toLowerCase())) {\n continue;\n }\n if (definedName.hidden || definedName.formula.trim() === \"\") {\n continue;\n }\n if (definedName.formula.includes(\"#REF!\")) {\n diagnostics.push({\n severity: \"warning\",\n code: \"skipped-defined-name\",\n message: `Defined name \"${definedName.name}\" refers to a deleted range.`,\n source: definedName.formula,\n });\n continue;\n }\n\n const sheetName =\n definedName.localSheetId === undefined\n ? undefined\n : sheetNames[definedName.localSheetId];\n\n if (sheetName !== undefined && !importedSheetNames.has(sheetName)) {\n continue;\n }\n\n // Named expressions are stored as a formula body with no leading \"=\".\n const translated = translateFormula(definedName.formula);\n diagnostics.push(...translated.diagnostics);\n\n result.push({\n name: definedName.name,\n expression: translated.formula.slice(1),\n sheetName,\n });\n }\n\n return result;\n}\n\n/**\n * Turn a set of cells sharing one style into as few rectangular areas as\n * possible.\n *\n * Excel's style model is per-cell, but the engine's is per-area, so emitting\n * one area per cell would produce enormous rule lists on real workbooks. Cells\n * are merged into horizontal runs, then adjacent identical runs are merged\n * vertically into blocks.\n */\nexport function coalesceCellsIntoAreas(\n sheetName: string,\n cells: { colIndex: number; rowIndex: number }[]\n): { sheetName: string; range: ReturnType<typeof toSpreadsheetRange> }[] {\n const byRow = new Map<number, number[]>();\n for (const cell of cells) {\n const row = byRow.get(cell.rowIndex);\n if (row) {\n row.push(cell.colIndex);\n } else {\n byRow.set(cell.rowIndex, [cell.colIndex]);\n }\n }\n\n interface Run {\n rowIndex: number;\n startCol: number;\n endCol: number;\n }\n\n const runs: Run[] = [];\n for (const [rowIndex, columns] of byRow) {\n columns.sort((a, b) => a - b);\n let startCol = columns[0]!;\n let previous = startCol;\n for (let i = 1; i < columns.length; i++) {\n const current = columns[i]!;\n if (current === previous + 1) {\n previous = current;\n continue;\n }\n runs.push({ rowIndex, startCol, endCol: previous });\n startCol = current;\n previous = current;\n }\n runs.push({ rowIndex, startCol, endCol: previous });\n }\n\n // Merge runs with identical column spans in consecutive rows into blocks.\n runs.sort((a, b) =>\n a.startCol - b.startCol || a.endCol - b.endCol || a.rowIndex - b.rowIndex\n );\n\n const areas: { sheetName: string; range: ReturnType<typeof toSpreadsheetRange> }[] = [];\n let index = 0;\n while (index < runs.length) {\n const first = runs[index]!;\n let lastRow = first.rowIndex;\n let next = index + 1;\n while (\n next < runs.length &&\n runs[next]!.startCol === first.startCol &&\n runs[next]!.endCol === first.endCol &&\n runs[next]!.rowIndex === lastRow + 1\n ) {\n lastRow = runs[next]!.rowIndex;\n next++;\n }\n\n areas.push({\n sheetName,\n range: toSpreadsheetRange({\n start: { colIndex: first.startCol, rowIndex: first.rowIndex },\n end: { colIndex: first.endCol, rowIndex: lastRow },\n }),\n });\n index = next;\n }\n\n return areas;\n}\n\nexport { rangeReferenceToSpreadsheetRange };\n",
14
14
  "/**\n * excel-to-formula-engine\n *\n * Converts an Excel .xlsx file into `WorkbookData` for `@ricsam/formula-engine`,\n * in the browser and in Node/Bun.\n *\n * ```ts\n * const data = await excelToFormulaEngine(blob);\n * engine.addWorkbook({ workbookName: \"Budget\", data });\n * ```\n */\n\nimport { convertWorkbook } from \"./src/convert\";\nimport type {\n ConvertOptions,\n ConvertResult,\n ExcelWorkbookData,\n} from \"./src/types\";\n\n/**\n * Convert an Excel file into engine `WorkbookData`.\n *\n * Accepts a `Blob` or `File` from a file input, or raw bytes. The result is\n * ready to hand to `FormulaEngine.addWorkbook`.\n *\n * Anything that could not be translated is reported in\n * `data.workbookMetadata.diagnostics`; use {@link excelToFormulaEngineDetailed}\n * when you want the diagnostics alongside the data instead.\n *\n * @throws when the input is not a readable .xlsx package.\n */\nexport async function excelToFormulaEngine(\n source: Blob | ArrayBuffer | Uint8Array,\n options?: ConvertOptions\n): Promise<ExcelWorkbookData> {\n const { data } = await convertWorkbook(source, withFileName(source, options));\n return data;\n}\n\n/**\n * Convert an Excel file, returning the data and the translation diagnostics as\n * separate values.\n */\nexport async function excelToFormulaEngineDetailed(\n source: Blob | ArrayBuffer | Uint8Array,\n options?: ConvertOptions\n): Promise<ConvertResult> {\n return convertWorkbook(source, withFileName(source, options));\n}\n\n/** Pick up the name from a `File` so it lands in workbook metadata. */\nfunction withFileName(\n source: Blob | ArrayBuffer | Uint8Array,\n options: ConvertOptions | undefined\n): ConvertOptions {\n if (options?.fileName !== undefined) {\n return options;\n }\n const name =\n typeof File !== \"undefined\" && source instanceof File\n ? source.name\n : undefined;\n return name ? { ...options, fileName: name } : { ...options };\n}\n\nexport { convertWorkbook };\n\nexport type {\n ConvertOptions,\n ConvertResult,\n Diagnostic,\n DiagnosticCode,\n DiagnosticSeverity,\n ExcelCellMetadata,\n ExcelSheetMetadata,\n ExcelWorkbookData,\n ExcelWorkbookMetadata,\n} from \"./src/types\";\n\nexport {\n findUnsupportedFunctions,\n offsetFormulaReferences,\n translateFormula,\n} from \"./src/translate/formula\";\n\nexport { excelSerialToIso } from \"./src/translate/dates\";\n\nexport {\n columnIndexToLabel,\n columnLabelToIndex,\n parseA1,\n parseA1Range,\n toA1,\n} from \"./src/a1\";\n"
15
15
  ],
16
- "mappings": "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",
17
- "debugId": "90056589614CAA9A64756E2164756E21",
16
+ "mappings": ";AAKA;AACA;AAIA,IAAM,SAAS,IAAI,UAAU;AAAA,EAC3B,kBAAkB;AAAA,EAClB,qBAAqB;AAAA,EAOrB,eAAe;AAAA,EACf,qBAAqB;AAAA,EACrB,YAAY;AAAA,EACZ,iBAAiB;AACnB,CAAC;AAaD,eAAsB,eAAe,CACnC,QACsB;AAAA,EACtB,MAAM,QAAQ,MAAM,QAAQ,MAAM;AAAA,EAClC,IAAI;AAAA,EACJ,IAAI;AAAA,IACF,WAAW,UAAU,KAAK;AAAA,IAC1B,OAAO,OAAO;AAAA,IACd,MAAM,IAAI,MACR,wEACE,mDACF,EAAE,MAAM,CACV;AAAA;AAAA,EAGF,MAAM,QAAQ,IAAI;AAAA,EAClB,YAAY,MAAM,YAAY,OAAO,QAAQ,QAAQ,GAAG;AAAA,IAEtD,MAAM,IAAI,cAAc,IAAI,GAAG,OAAO;AAAA,EACxC;AAAA,EAEA,IAAI,CAAC,MAAM,IAAI,iBAAiB,GAAG;AAAA,IACjC,MAAM,IAAI,MACR,2EACE,2BACJ;AAAA,EACF;AAAA,EAEA,MAAM,WAAW,IAAI;AAAA,EAErB,OAAO;AAAA,IACL;AAAA,IACA,IAAI,CAAC,MAAM;AAAA,MACT,MAAM,UAAU,MAAM,IAAI,cAAc,IAAI,CAAC;AAAA,MAC7C,OAAO,UAAU,UAAU,OAAO,IAAI;AAAA;AAAA,IAExC,GAAG,CAAC,MAAM;AAAA,MACR,MAAM,MAAM,cAAc,IAAI;AAAA,MAC9B,IAAI,SAAS,IAAI,GAAG,GAAG;AAAA,QACrB,OAAO,SAAS,IAAI,GAAG;AAAA,MACzB;AAAA,MACA,MAAM,UAAU,MAAM,IAAI,GAAG;AAAA,MAC7B,MAAM,SAAS,UAAW,OAAO,MAAM,UAAU,OAAO,CAAC,IAAgB;AAAA,MACzE,SAAS,IAAI,KAAK,MAAM;AAAA,MACxB,OAAO;AAAA;AAAA,IAET,GAAG,CAAC,MAAM;AAAA,MACR,OAAO,MAAM,IAAI,cAAc,IAAI,CAAC;AAAA;AAAA,IAEtC,IAAI,CAAC,QAAQ;AAAA,MACX,MAAM,aAAa,cAAc,MAAM;AAAA,MACvC,OAAO,MAAM,KAAK,MAAM,KAAK,CAAC,EAAE,OAAO,CAAC,SACtC,KAAK,WAAW,UAAU,CAC5B;AAAA;AAAA,EAEJ;AAAA;AAGF,SAAS,aAAa,CAAC,MAAsB;AAAA,EAC3C,OAAO,KAAK,QAAQ,OAAO,GAAG,EAAE,QAAQ,QAAQ,EAAE;AAAA;AAGpD,eAAe,OAAO,CACpB,QACqB;AAAA,EACrB,IAAI,kBAAkB,YAAY;AAAA,IAChC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,kBAAkB,aAAa;AAAA,IACjC,OAAO,IAAI,WAAW,MAAM;AAAA,EAC9B;AAAA,EACA,OAAO,IAAI,WAAW,MAAM,OAAO,YAAY,CAAC;AAAA;AAO3C,SAAS,OAAU,CAAC,OAAiC;AAAA,EAC1D,IAAI,UAAU,aAAa,UAAU,MAAM;AAAA,IACzC,OAAO,CAAC;AAAA,EACV;AAAA,EACA,OAAO,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAAA;AAGvC,SAAS,IAAI,CAAC,MAAe,MAAkC;AAAA,EACpE,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AAAA,IACrC;AAAA,EACF;AAAA,EACA,MAAM,QAAS,KAAiC,IAAI;AAAA,EACpD,OAAO,UAAU,aAAa,UAAU,OAAO,YAAY,OAAO,KAAK;AAAA;AAGlE,SAAS,OAAO,CAAC,MAAe,MAAkC;AAAA,EACvE,MAAM,MAAM,KAAK,MAAM,IAAI;AAAA,EAC3B,IAAI,QAAQ,WAAW;AAAA,IACrB;AAAA,EACF;AAAA,EACA,MAAM,SAAS,OAAO,GAAG;AAAA,EACzB,OAAO,OAAO,SAAS,MAAM,IAAI,SAAS;AAAA;AAGrC,SAAS,QAAQ,CACtB,MACA,MACA,WAAW,OACF;AAAA,EACT,MAAM,MAAM,KAAK,MAAM,IAAI;AAAA,EAC3B,IAAI,QAAQ,WAAW;AAAA,IACrB,OAAO;AAAA,EACT;AAAA,EACA,OAAO,QAAQ,OAAO,IAAI,YAAY,MAAM;AAAA;AAIvC,SAAS,MAAM,CAAC,MAAuB;AAAA,EAC5C,IAAI,SAAS,aAAa,SAAS,MAAM;AAAA,IACvC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,SAAS,UAAU;AAAA,IAC5B,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,SAAS,YAAY,OAAO,SAAS,WAAW;AAAA,IACzD,OAAO,OAAO,IAAI;AAAA,EACpB;AAAA,EACA,IAAI,OAAO,SAAS,UAAU;AAAA,IAC5B,MAAM,QAAS,KAAiC;AAAA,IAChD,OAAO,UAAU,aAAa,UAAU,OAAO,KAAK,OAAO,KAAK;AAAA,EAClE;AAAA,EACA,OAAO;AAAA;;;AC9JT,IAAM,UAAU;AAET,SAAS,kBAAkB,CAAC,OAAuB;AAAA,EACxD,IAAI,QAAQ;AAAA,EACZ,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,IACrC,QAAQ,QAAQ,MAAM,MAAM,YAAY,EAAE,WAAW,CAAC,IAAI;AAAA,EAC5D;AAAA,EACA,OAAO,QAAQ;AAAA;AAGV,SAAS,kBAAkB,CAAC,OAAuB;AAAA,EACxD,IAAI,QAAQ;AAAA,EACZ,IAAI,YAAY,QAAQ;AAAA,EACxB,OAAO,YAAY,GAAG;AAAA,IACpB,MAAM,QAAQ,YAAY,KAAK;AAAA,IAC/B,QAAQ,OAAO,aAAa,KAAK,IAAI,IAAI;AAAA,IACzC,YAAY,KAAK,OAAO,YAAY,QAAQ,EAAE;AAAA,EAChD;AAAA,EACA,OAAO;AAAA;AAQF,SAAS,OAAO,CAAC,WAA2C;AAAA,EACjE,MAAM,QAAQ,QAAQ,KAAK,UAAU,KAAK,CAAC;AAAA,EAC3C,IAAI,CAAC,SAAS,MAAM,OAAO,aAAa,MAAM,OAAO,WAAW;AAAA,IAC9D;AAAA,EACF;AAAA,EACA,OAAO;AAAA,IACL,UAAU,mBAAmB,MAAM,EAAE;AAAA,IACrC,UAAU,OAAO,SAAS,MAAM,IAAI,EAAE,IAAI;AAAA,EAC5C;AAAA;AAGK,SAAS,IAAI,GAAG,UAAU,YAAgC;AAAA,EAC/D,OAAO,GAAG,mBAAmB,QAAQ,IAAI,WAAW;AAAA;AAc/C,IAAM,sBAAsB;AAC5B,IAAM,sBAAsB;AAE5B,SAAS,YAAY,CAAC,WAA4C;AAAA,EACvE,MAAM,UAAU,UAAU,KAAK,EAAE,QAAQ,OAAO,EAAE;AAAA,EAClD,OAAO,UAAU,UAAU,QAAQ,MAAM,GAAG;AAAA,EAC5C,IAAI,aAAa,WAAW;AAAA,IAC1B;AAAA,EACF;AAAA,EACA,IAAI,WAAW,WAAW;AAAA,IACxB,MAAM,OAAO,QAAQ,QAAQ;AAAA,IAC7B,OAAO,OAAO,EAAE,OAAO,MAAM,KAAK,KAAK,IAAI;AAAA,EAC7C;AAAA,EAEA,MAAM,YAAY,QAAQ,QAAQ;AAAA,EAClC,MAAM,UAAU,QAAQ,MAAM;AAAA,EAC9B,IAAI,aAAa,SAAS;AAAA,IACxB,OAAO,EAAE,OAAO,WAAW,KAAK,QAAQ;AAAA,EAC1C;AAAA,EAGA,IAAI,cAAc,KAAK,QAAQ,KAAK,cAAc,KAAK,MAAM,GAAG;AAAA,IAC9D,OAAO;AAAA,MACL,OAAO,EAAE,UAAU,mBAAmB,QAAQ,GAAG,UAAU,EAAE;AAAA,MAC7D,KAAK;AAAA,QACH,UAAU,mBAAmB,MAAM;AAAA,QACnC,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,EACF;AAAA,EAGA,IAAI,QAAQ,KAAK,QAAQ,KAAK,QAAQ,KAAK,MAAM,GAAG;AAAA,IAClD,OAAO;AAAA,MACL,OAAO,EAAE,UAAU,GAAG,UAAU,OAAO,SAAS,UAAU,EAAE,IAAI,EAAE;AAAA,MAClE,KAAK;AAAA,QACH,UAAU;AAAA,QACV,UAAU,OAAO,SAAS,QAAQ,EAAE,IAAI;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEA;AAAA;AAGK,SAAS,kBAAkB,CAAC,OAAsC;AAAA,EACvE,OAAO;AAAA,IACL,OAAO,EAAE,KAAK,MAAM,MAAM,UAAU,KAAK,MAAM,MAAM,SAAS;AAAA,IAC9D,KAAK;AAAA,MACH,KAAK,EAAE,MAAM,UAAU,OAAO,MAAM,IAAI,SAAS;AAAA,MACjD,KAAK,EAAE,MAAM,UAAU,OAAO,MAAM,IAAI,SAAS;AAAA,IACnD;AAAA,EACF;AAAA;AAIK,SAAS,gCAAgC,CAC9C,WAC8B;AAAA,EAC9B,MAAM,SAAS,aAAa,SAAS;AAAA,EACrC,OAAO,SAAS,mBAAmB,MAAM,IAAI;AAAA;;;ACvCxC,SAAS,cAAc,CAC5B,KACA,UACA,eACc;AAAA,EACd,MAAM,OAAO,IAAI,IAAI,QAAQ;AAAA,EAC7B,MAAM,YAAY,OAAO;AAAA,EACzB,MAAM,SAAuB;AAAA,IAC3B,OAAO,CAAC;AAAA,IACR,QAAQ,CAAC;AAAA,IACT,cAAc,CAAC;AAAA,IACf,YAAY,CAAC;AAAA,IACb,oBAAoB,CAAC;AAAA,IACrB,YAAY,CAAC;AAAA,EACf;AAAA,EACA,IAAI,CAAC,WAAW;AAAA,IACd,OAAO;AAAA,EACT;AAAA,EAEA,WAAW,WAAW,eAAe,MAAM;AAAA,EAC3C,aAAa,WAAW,MAAM;AAAA,EAC9B,WAAW,WAAW,MAAM;AAAA,EAC5B,YAAY,WAAW,MAAM;AAAA,EAC7B,wBAAwB,WAAW,MAAM;AAAA,EACzC,gBAAgB,KAAK,UAAU,WAAW,MAAM;AAAA,EAEhD,OAAO;AAAA;AAeT,SAAS,UAAU,CACjB,WACA,eACA,QACM;AAAA,EACN,MAAM,YAAY,UAAU;AAAA,EAC5B,MAAM,SAAS,IAAI;AAAA,EAEnB,WAAW,UAAU,QAAQ,YAAY,MAAM,GAAG;AAAA,IAChD,MAAM,MAAM;AAAA,IACZ,MAAM,YAAY,QAAQ,KAAK,GAAG;AAAA,IAClC,MAAM,SAAS,QAAQ,KAAK,IAAI;AAAA,IAChC,IAAI,cAAc,aAAa,WAAW,WAAW;AAAA,MACnD,OAAO,WAAW,YAAY,KAAK;AAAA,IACrC;AAAA,IAEA,WAAW,WAAW,QAAQ,IAAI,IAAI,GAAG;AAAA,MACvC,MAAM,OAAO;AAAA,MACb,MAAM,YAAY,KAAK,MAAM,GAAG;AAAA,MAChC,IAAI,CAAC,WAAW;AAAA,QACd;AAAA,MACF;AAAA,MACA,MAAM,UAAU,QAAQ,SAAS;AAAA,MACjC,IAAI,CAAC,SAAS;AAAA,QACZ;AAAA,MACF;AAAA,MAEA,MAAM,aAAa,QAAQ,MAAM,GAAG;AAAA,MACpC,MAAM,OAAO,KAAK,MAAM,GAAG,KAAK;AAAA,MAChC,MAAM,UAAU,YAAY,MAAM,SAAS,MAAM;AAAA,MACjD,QAAQ,MAAM,UAAU,UAAU,MAAM,MAAM,aAAa;AAAA,MAE3D,IAAI,SAAS,WAAW,YAAY,aAAa,eAAe,WAAW;AAAA,QACzE;AAAA,MACF;AAAA,MAEA,OAAO,MAAM,KAAK;AAAA,QAChB;AAAA,QACA,UAAU,QAAQ;AAAA,QAClB,UAAU,QAAQ;AAAA,QAClB;AAAA,QACA;AAAA,QACA,SAAS,SAAS;AAAA,QAClB,eAAe,SAAS;AAAA,QACxB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAGF,SAAS,WAAW,CAClB,MACA,SACA,QACyB;AAAA,EACzB,MAAM,OAAO,KAAK;AAAA,EAClB,IAAI,SAAS,aAAa,SAAS,MAAM;AAAA,IACvC;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,OAAO,IAAI;AAAA,EACxB,MAAM,OAAO,KAAK,MAAM,GAAG;AAAA,EAC3B,MAAM,KAAK,KAAK,MAAM,IAAI;AAAA,EAE1B,IAAI,SAAS,YAAY,OAAO,WAAW;AAAA,IACzC,IAAI,MAAM;AAAA,MAER,OAAO,IAAI,IAAI;AAAA,QACb,SAAS;AAAA,QACT,UAAU,QAAQ;AAAA,QAClB,UAAU,QAAQ;AAAA,MACpB,CAAC;AAAA,MACD,OAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AAAA,IACA,MAAM,SAAS,OAAO,IAAI,EAAE;AAAA,IAC5B,IAAI,CAAC,QAAQ;AAAA,MACX;AAAA,IACF;AAAA,IAGA,OAAO;AAAA,MACL,SAAS,OAAO;AAAA,MAChB,QAAQ;AAAA,QACN,MAAM,QAAQ,WAAW,OAAO;AAAA,QAChC,MAAM,QAAQ,WAAW,OAAO;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAAA,EAGA,OAAO,OAAO,EAAE,SAAS,KAAK,IAAI;AAAA;AAGpC,SAAS,SAAS,CAChB,MACA,MACA,eACkE;AAAA,EAElE,IAAI,SAAS,aAAa;AAAA,IACxB,MAAM,SAAS,KAAK;AAAA,IACpB,OAAO,EAAE,MAAM,UAAU,OAAO,aAAa,MAAM,EAAE;AAAA,EACvD;AAAA,EAEA,MAAM,MAAM,KAAK;AAAA,EACjB,IAAI,QAAQ,aAAa,QAAQ,MAAM;AAAA,IACrC,OAAO,EAAE,MAAM,SAAS,OAAO,UAAU;AAAA,EAC3C;AAAA,EACA,MAAM,OAAO,OAAO,GAAG;AAAA,EAEvB,QAAQ;AAAA,SACD,KAAK;AAAA,MACR,MAAM,QAAQ,OAAO,SAAS,MAAM,EAAE;AAAA,MACtC,OAAO,EAAE,MAAM,UAAU,OAAO,cAAc,UAAU,GAAG;AAAA,IAC7D;AAAA,SACK;AAAA,MAEH,OAAO,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,SAClC;AAAA,MACH,OAAO,EAAE,MAAM,WAAW,OAAO,SAAS,IAAI;AAAA,SAC3C;AAAA,MACH,OAAO,EAAE,MAAM,SAAS,OAAO,KAAK;AAAA,SACjC;AAAA,MAEH,OAAO,EAAE,MAAM,QAAQ,OAAO,KAAK;AAAA,aAC5B;AAAA,MACP,MAAM,SAAS,OAAO,IAAI;AAAA,MAC1B,OAAO,OAAO,SAAS,MAAM,IACzB,EAAE,MAAM,UAAU,OAAO,OAAO,IAChC,EAAE,MAAM,UAAU,OAAO,KAAK;AAAA,IACpC;AAAA;AAAA;AAKG,SAAS,YAAY,CAAC,MAAuB;AAAA,EAClD,IAAI,SAAS,aAAa,SAAS,MAAM;AAAA,IACvC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,OAAO,SAAS,UAAU;AAAA,IAC5B,OAAO;AAAA,EACT;AAAA,EACA,MAAM,SAAS;AAAA,EACf,MAAM,OAAO,QAAQ,OAAO,IAAI;AAAA,EAChC,IAAI,KAAK,SAAS,GAAG;AAAA,IACnB,OAAO,KAAK,IAAI,CAAC,QAAQ,OAAQ,IAAgB,IAAI,CAAC,EAAE,KAAK,EAAE;AAAA,EACjE;AAAA,EACA,IAAI,OAAO,SAAS,WAAW;AAAA,IAC7B,OAAO,OAAO,OAAO,IAAI;AAAA,EAC3B;AAAA,EACA,OAAO,OAAO,MAAM;AAAA;AAGtB,SAAS,YAAY,CAAC,WAAoB,QAA4B;AAAA,EACpE,WAAW,UAAU,QAClB,UAAU,UAAkC,MAC/C,GAAG;AAAA,IACD,MAAM,MAAM;AAAA,IACZ,MAAM,MAAM,QAAQ,KAAK,KAAK;AAAA,IAC9B,MAAM,MAAM,QAAQ,KAAK,KAAK;AAAA,IAC9B,MAAM,QAAQ,QAAQ,KAAK,OAAO;AAAA,IAClC,IAAI,QAAQ,aAAa,QAAQ,aAAa,UAAU,WAAW;AAAA,MACjE;AAAA,IACF;AAAA,IAGA,IAAI,MAAM,MAAM,MAAM;AAAA,MACpB;AAAA,IACF;AAAA,IACA,SAAS,QAAQ,IAAK,SAAS,KAAK,SAAS;AAAA,MAC3C,OAAO,aAAa,QAAQ,KAAK;AAAA,IACnC;AAAA,EACF;AAAA;AAGF,SAAS,UAAU,CAAC,WAAoB,QAA4B;AAAA,EAClE,MAAM,aAAa,UAAU;AAAA,EAC7B,MAAM,YAAY,QAAQ,aAAa,YAAY,EAAE;AAAA,EACrD,MAAM,OAAO,YAAY;AAAA,EACzB,IAAI,CAAC,MAAM;AAAA,IACT;AAAA,EACF;AAAA,EACA,IAAI,KAAK,MAAM,OAAO,MAAM,UAAU;AAAA,IACpC;AAAA,EACF;AAAA,EACA,OAAO,SAAS;AAAA,IACd,MAAM,QAAQ,MAAM,QAAQ,KAAK;AAAA,IACjC,MAAM,QAAQ,MAAM,QAAQ,KAAK;AAAA,EACnC;AAAA;AAGF,SAAS,WAAW,CAAC,WAAoB,QAA4B;AAAA,EACnE,WAAW,SAAS,QACjB,UAAU,gBAAwC,YACrD,GAAG;AAAA,IACD,MAAM,MAAM,KAAK,OAAO,KAAK;AAAA,IAC7B,IAAI,KAAK;AAAA,MACP,OAAO,OAAO,KAAK,GAAG;AAAA,IACxB;AAAA,EACF;AAAA;AAGF,SAAS,uBAAuB,CAC9B,WACA,QACM;AAAA,EACN,WAAW,YAAY,QAAQ,UAAU,wBAAwB,GAAG;AAAA,IAClE,MAAM,QAAQ;AAAA,IACd,MAAM,QAAQ,KAAK,OAAO,OAAO;AAAA,IACjC,IAAI,CAAC,OAAO;AAAA,MACV;AAAA,IACF;AAAA,IACA,MAAM,SAAS,MAAM,MAAM,KAAK,EAAE,OAAO,OAAO;AAAA,IAEhD,WAAW,WAAW,QAAQ,MAAM,SAAS,GAAG;AAAA,MAC9C,MAAM,OAAO;AAAA,MACb,MAAM,OAAO,KAAK,MAAM,MAAM;AAAA,MAC9B,IAAI,CAAC,MAAM;AAAA,QACT;AAAA,MACF;AAAA,MAEA,MAAM,iBAAiB,KAAK;AAAA,MAE5B,OAAO,mBAAmB,KAAK;AAAA,QAC7B;AAAA,QACA;AAAA,QACA,UAAU,KAAK,MAAM,UAAU;AAAA,QAC/B,UAAU,QAAQ,KAAK,UAAU,EAAE,IAAI,CAAC,YAAY,OAAO,OAAO,CAAC;AAAA,QACnE,MAAM,KAAK,MAAM,MAAM;AAAA,QACvB,OAAO,QAAQ,MAAM,OAAO;AAAA,QAC5B,UAAU,QAAQ,MAAM,UAAU,KAAK;AAAA,QACvC,MAAM,QAAQ,MAAM,MAAM;AAAA,QAC1B,QAAQ,SAAS,MAAM,QAAQ;AAAA,QAC/B,SAAS,SAAS,MAAM,SAAS;AAAA,QACjC,YAAY,SAAS,MAAM,YAAY;AAAA,QACvC,YAAY,iBACR;AAAA,UACE,MAAM,QAAQ,eAAe,OAAO,EAAE,IAAI,CAAC,UAAU;AAAA,YACnD,MAAM,KAAK,MAAM,MAAM,KAAK;AAAA,YAC5B,KAAK,KAAK,MAAM,KAAK;AAAA,UACvB,EAAE;AAAA,UACF,QAAQ,QAAQ,eAAe,QAAQ,EAAE,IAAI,CAAC,UAC5C,KAAK,OAAO,KAAK,CACnB;AAAA,QACF,IACA;AAAA,MACN,CAAC;AAAA,IACH;AAAA,EACF;AAAA;AAGF,SAAS,eAAe,CACtB,KACA,UACA,WACA,QACM;AAAA,EACN,MAAM,QAAQ,QACX,UAAU,gBAAwC,YACrD;AAAA,EACA,IAAI,MAAM,WAAW,GAAG;AAAA,IACtB;AAAA,EACF;AAAA,EAEA,MAAM,gBAAgB,kBAAkB,KAAK,QAAQ;AAAA,EAErD,WAAW,WAAW,OAAO;AAAA,IAC3B,MAAM,OAAO;AAAA,IACb,MAAM,MAAM,KAAK,MAAM,KAAK;AAAA,IAC5B,IAAI,CAAC,KAAK;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM,KAAK,KAAK,MAAM,MAAM,KAAK,KAAK,MAAM,IAAI;AAAA,IAChD,MAAM,WAAW,KAAK,MAAM,UAAU;AAAA,IACtC,MAAM,SAAS,KAAK,cAAc,IAAI,EAAE,IAAI;AAAA,IAC5C,MAAM,OAAO,SACT,WACE,GAAG,UAAU,aACb,SACF;AAAA,IACJ,IAAI,CAAC,MAAM;AAAA,MACT;AAAA,IACF;AAAA,IAGA,MAAM,QAAQ,QAAQ,IAAI,MAAM,GAAG,EAAE,MAAM,GAAG;AAAA,IAC9C,IAAI,OAAO;AAAA,MACT,OAAO,WAAW,KAAK,KAAK,KAAK;AAAA,IACnC;AAAA,EACF;AAAA;AAGK,SAAS,iBAAiB,CAC/B,KACA,UACqB;AAAA,EACrB,MAAM,QAAQ,SAAS,YAAY,GAAG;AAAA,EACtC,MAAM,MAAM,UAAU,KAAK,KAAK,SAAS,MAAM,GAAG,KAAK;AAAA,EACvD,MAAM,OAAO,UAAU,KAAK,WAAW,SAAS,MAAM,QAAQ,CAAC;AAAA,EAC/D,MAAM,WAAW,GAAG,aAAa;AAAA,EAEjC,MAAM,MAAM,IAAI;AAAA,EAChB,MAAM,OAAO,IAAI,IAAI,QAAQ;AAAA,EAC7B,MAAM,YAAY,OAAO;AAAA,EACzB,IAAI,CAAC,WAAW;AAAA,IACd,OAAO;AAAA,EACT;AAAA,EACA,WAAW,gBAAgB,QAAQ,UAAU,eAAe,GAAG;AAAA,IAC7D,MAAM,KAAK,KAAK,cAAc,IAAI;AAAA,IAClC,MAAM,SAAS,KAAK,cAAc,QAAQ;AAAA,IAC1C,IAAI,MAAM,QAAQ;AAAA,MAChB,IAAI,IAAI,IAAI,MAAM;AAAA,IACpB;AAAA,EACF;AAAA,EACA,OAAO;AAAA;;;ACtYF,SAAS,kBAAkB,CAAC,KAA4B;AAAA,EAC7D,MAAM,OAAO,IAAI,IAAI,sBAAsB;AAAA,EAC3C,MAAM,MAAM,OAAO;AAAA,EACnB,IAAI,CAAC,KAAK;AAAA,IACR,OAAO,CAAC;AAAA,EACV;AAAA,EACA,OAAO,QAAQ,IAAI,KAAK,EAAE,IAAI,CAAC,UAAU,aAAa,KAAK,CAAC;AAAA;AAGvD,SAAS,aAAa,CAAC,KAK5B;AAAA,EACA,MAAM,OAAO,IAAI,IAAI,iBAAiB;AAAA,EACtC,MAAM,WAAW,OAAO;AAAA,EACxB,IAAI,CAAC,UAAU;AAAA,IACb,OAAO,EAAE,QAAQ,CAAC,GAAG,cAAc,CAAC,GAAG,UAAU,MAAM;AAAA,EACzD;AAAA,EAEA,MAAM,gBAAgB,kBAAkB,KAAK,iBAAiB;AAAA,EAE9D,MAAM,SAAuB,CAAC;AAAA,EAC9B,WAAW,YAAY,QACpB,SAAS,YAAoC,QAChD,GAAG;AAAA,IACD,MAAM,QAAQ;AAAA,IACd,MAAM,OAAO,KAAK,OAAO,MAAM;AAAA,IAC/B,MAAM,KAAK,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO,IAAI;AAAA,IAClD,IAAI,CAAC,QAAQ,CAAC,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,IACA,MAAM,SAAS,cAAc,IAAI,EAAE;AAAA,IACnC,IAAI,CAAC,QAAQ;AAAA,MACX;AAAA,IACF;AAAA,IACA,OAAO,KAAK;AAAA,MACV;AAAA,MACA,UAAU,YAAY,MAAM;AAAA,MAC5B,OAAO,KAAK,OAAO,OAAO,KAAK;AAAA,IACjC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,eAA8B,CAAC;AAAA,EACrC,WAAW,WAAW,QACnB,SAAS,kBAA0C,cACtD,GAAG;AAAA,IACD,MAAM,OAAO;AAAA,IACb,MAAM,OAAO,KAAK,MAAM,MAAM;AAAA,IAC9B,IAAI,CAAC,MAAM;AAAA,MACT;AAAA,IACF;AAAA,IACA,aAAa,KAAK;AAAA,MAChB;AAAA,MACA,SAAS,YAAY,IAAI;AAAA,MACzB,cAAc,QAAQ,MAAM,cAAc;AAAA,MAC1C,QAAQ,KAAK,MAAM,QAAQ,MAAM;AAAA,IACnC,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,KAAK,SAAS;AAAA,EACpB,MAAM,WACJ,KAAK,IAAI,UAAU,MAAM,OAAO,KAAK,IAAI,UAAU,MAAM;AAAA,EAE3D,OAAO,EAAE,QAAQ,cAAc,SAAS;AAAA;AAInC,SAAS,WAAW,CACzB,KACA,mBACY;AAAA,EACZ,MAAM,gBAAgB,kBAAkB,KAAK,iBAAiB;AAAA,EAC9D,MAAM,SAAqB,CAAC;AAAA,EAE5B,WAAW,UAAU,cAAc,OAAO,GAAG;AAAA,IAC3C,IAAI,CAAC,OAAO,SAAS,SAAS,GAAG;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,MAAM,WAAW,YAAY,QAAQ,iBAAiB;AAAA,IACtD,MAAM,OAAO,IAAI,IAAI,QAAQ;AAAA,IAC7B,MAAM,QAAQ,OAAO;AAAA,IACrB,IAAI,CAAC,OAAO;AAAA,MACV;AAAA,IACF;AAAA,IAEA,MAAM,MAAM,KAAK,OAAO,KAAK;AAAA,IAC7B,MAAM,OAAO,KAAK,OAAO,MAAM,KAAK,KAAK,OAAO,aAAa;AAAA,IAC7D,IAAI,CAAC,OAAO,CAAC,MAAM;AAAA,MACjB;AAAA,IACF;AAAA,IAEA,OAAO,KAAK;AAAA,MACV;AAAA,MACA,aAAa,KAAK,OAAO,aAAa,KAAK;AAAA,MAC3C;AAAA,MAEA,gBAAgB,QAAQ,OAAO,gBAAgB,KAAK;AAAA,MACpD,gBAAgB,QAAQ,OAAO,gBAAgB,KAAK;AAAA,MACpD,aAAa,QACV,MAAM,kBAA0C,cACnD,EAAE,IAAI,CAAC,WAAW,KAAK,QAAQ,MAAM,KAAK,EAAE;AAAA,IAC9C,CAAC;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAGT,SAAS,WAAW,CAAC,MAAuB;AAAA,EAC1C,MAAM,QAAQ,KAAK;AAAA,EACnB,IAAI,UAAU,aAAa,UAAU,MAAM;AAAA,IACzC,OAAO;AAAA,EACT;AAAA,EACA,OAAO,OAAO,KAAK;AAAA;AASrB,SAAS,WAAW,CAAC,QAAgB,WAAW,mBAA2B;AAAA,EACzE,IAAI,OAAO,WAAW,GAAG,GAAG;AAAA,IAC1B,OAAO,OAAO,MAAM,CAAC;AAAA,EACvB;AAAA,EAEA,MAAM,QAAQ,SAAS,YAAY,GAAG;AAAA,EACtC,MAAM,UAAU,UAAU,KAAK,KAAK,SAAS,MAAM,GAAG,KAAK;AAAA,EAC3D,MAAM,WAAW,UAAU,QAAQ,MAAM,GAAG,IAAI,CAAC;AAAA,EAEjD,WAAW,WAAW,OAAO,MAAM,GAAG,GAAG;AAAA,IACvC,IAAI,YAAY,OAAO,YAAY,IAAI;AAAA,MACrC;AAAA,IACF;AAAA,IACA,IAAI,YAAY,MAAM;AAAA,MACpB,SAAS,IAAI;AAAA,MACb;AAAA,IACF;AAAA,IACA,SAAS,KAAK,OAAO;AAAA,EACvB;AAAA,EAEA,OAAO,SAAS,KAAK,GAAG;AAAA;;;AC/J1B,IAAM,kBAA0C;AAAA,EAC9C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAEA,IAAM,0BAA0B,IAAI,IAAI;AAAA,EACtC;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAAA,EAAI;AAC9C,CAAC;AAEM,SAAS,WAAW,CAAC,KAA8B;AAAA,EACxD,MAAM,OAAO,IAAI,IAAI,eAAe;AAAA,EACpC,MAAM,aAAa,OAAO;AAAA,EAC1B,IAAI,CAAC,YAAY;AAAA,IACf,OAAO,EAAE,SAAS,CAAC,GAAG,qBAAqB,CAAC,EAAE;AAAA,EAChD;AAAA,EAEA,MAAM,QAAQ,iBAAiB,GAAG;AAAA,EAClC,MAAM,gBAAgB,mBAAmB,UAAU;AAAA,EAEnD,MAAM,gBAAgB,IAAI;AAAA,EAC1B,WAAW,UAAU,QAClB,WAAW,aAAqC,SACnD,GAAG;AAAA,IACD,MAAM,KAAK,QAAQ,QAAQ,UAAU;AAAA,IACrC,MAAM,OAAO,KAAK,QAAQ,YAAY;AAAA,IACtC,IAAI,OAAO,aAAa,SAAS,WAAW;AAAA,MAC1C,cAAc,IAAI,IAAI,IAAI;AAAA,IAC5B;AAAA,EACF;AAAA,EAEA,MAAM,QAAQ,QAAS,WAAW,WAAmC,OAAO;AAAA,EAC5E,MAAM,QAAQ,QAAS,WAAW,WAAmC,OAAO;AAAA,EAC5E,MAAM,UAAU,QACb,WAAW,aAAqC,SACnD;AAAA,EAEA,MAAM,UAAU,QACb,WAAW,aAAqC,KACnD;AAAA,EAEA,MAAM,UAAyB,QAAQ,IAAI,CAAC,UAAU;AAAA,IACpD,MAAM,KAAK;AAAA,IACX,MAAM,QAAmB,CAAC;AAAA,IAE1B,IAAI,SAAS,IAAI,aAAa,IAAI,GAAG;AAAA,MACnC,MAAM,OAAO,MAAM,QAAQ,IAAI,QAAQ,KAAK;AAAA,MAC5C,IAAI,MAAM;AAAA,QACR,UAAU,OAAO,MAAiB,OAAO,aAAa;AAAA,MACxD;AAAA,IACF;AAAA,IAEA,IAAI,SAAS,IAAI,aAAa,IAAI,GAAG;AAAA,MACnC,MAAM,OAAO,MAAM,QAAQ,IAAI,QAAQ,KAAK;AAAA,MAC5C,IAAI,MAAM;AAAA,QACR,UAAU,OAAO,MAAiB,OAAO,aAAa;AAAA,MACxD;AAAA,IACF;AAAA,IAEA,IAAI,SAAS,IAAI,eAAe,IAAI,GAAG;AAAA,MACrC,MAAM,SAAS,QAAQ,QAAQ,IAAI,UAAU,KAAK;AAAA,MAClD,IAAI,QAAQ;AAAA,QACV,YAAY,OAAO,QAAmB,OAAO,aAAa;AAAA,MAC5D;AAAA,IACF;AAAA,IAEA,IAAI,SAAS,IAAI,kBAAkB,IAAI,GAAG;AAAA,MACxC,MAAM,YAAY,GAAG;AAAA,MACrB,IAAI,aAAa,SAAS,WAAW,UAAU,GAAG;AAAA,QAChD,MAAM,WAAW;AAAA,MACnB;AAAA,IACF;AAAA,IAEA,MAAM,WAAW,QAAQ,IAAI,UAAU,KAAK;AAAA,IAC5C,MAAM,eAAe,cAAc,IAAI,QAAQ,KAAK,gBAAgB;AAAA,IAEpE,OAAO;AAAA,MACL;AAAA,MACA,cAAc,iBAAiB,YAAY,YAAY;AAAA,MACvD,cAAc,aAAa,UAAU,YAAY;AAAA,IACnD;AAAA,GACD;AAAA,EAED,MAAM,sBAAsB,QACzB,WAAW,UAAkC,MAChD,EAAE,IAAI,CAAC,QAAQ;AAAA,IACb,MAAM,QAAmB,CAAC;AAAA,IAC1B,MAAM,OAAO;AAAA,IACb,IAAI,KAAK,SAAS;AAAA,MAChB,UAAU,OAAO,KAAK,SAAoB,OAAO,aAAa;AAAA,IAChE;AAAA,IACA,IAAI,KAAK,SAAS;AAAA,MAChB,UAAU,OAAO,KAAK,SAAoB,OAAO,aAAa;AAAA,IAChE;AAAA,IACA,IAAI,KAAK,WAAW;AAAA,MAClB,YAAY,OAAO,KAAK,WAAsB,OAAO,aAAa;AAAA,IACpE;AAAA,IACA,OAAO;AAAA,GACR;AAAA,EAED,OAAO,EAAE,SAAS,oBAAoB;AAAA;AAGxC,SAAS,SAAS,CAChB,OACA,MACA,OACA,eACM;AAAA,EACN,IAAI,KAAK,SAAS,aAAa,KAAK,KAAK,IAAI,GAAG;AAAA,IAC9C,MAAM,OAAO;AAAA,EACf;AAAA,EACA,IAAI,KAAK,SAAS,aAAa,KAAK,KAAK,IAAI,GAAG;AAAA,IAC9C,MAAM,SAAS;AAAA,EACjB;AAAA,EACA,IAAI,KAAK,SAAS,aAAa,KAAK,KAAK,IAAI,GAAG;AAAA,IAC9C,MAAM,YAAY;AAAA,EACpB;AAAA,EACA,MAAM,OAAO,QAAQ,KAAK,OAAO,KAAK;AAAA,EACtC,IAAI,SAAS,WAAW;AAAA,IAEtB,MAAM,WAAW,KAAK,MAAM,QAAQ,KAAK,GAAG;AAAA,EAC9C;AAAA,EACA,MAAM,QAAQ,aAAa,KAAK,UAAU,OAAO,aAAa;AAAA,EAC9D,IAAI,OAAO;AAAA,IACT,MAAM,QAAQ;AAAA,EAChB;AAAA;AAGF,SAAS,SAAS,CAChB,OACA,MACA,OACA,eACM;AAAA,EACN,MAAM,UAAU,KAAK;AAAA,EACrB,IAAI,CAAC,SAAS;AAAA,IACZ;AAAA,EACF;AAAA,EACA,MAAM,cAAc,KAAK,SAAS,aAAa;AAAA,EAC/C,IAAI,gBAAgB,UAAU,gBAAgB,WAAW;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAM,QACJ,aAAa,QAAQ,YAAY,OAAO,aAAa,KACrD,aAAa,QAAQ,YAAY,OAAO,aAAa;AAAA,EACvD,IAAI,OAAO;AAAA,IACT,MAAM,kBAAkB;AAAA,EAC1B;AAAA;AAGF,IAAM,eAAe,CAAC,OAAO,SAAS,UAAU,MAAM;AAEtD,SAAS,WAAW,CAClB,OACA,QACA,OACA,eACM;AAAA,EACN,MAAM,QAA+C,CAAC;AAAA,EACtD,IAAI;AAAA,EACJ,IAAI,MAAM;AAAA,EAEV,WAAW,QAAQ,cAAc;AAAA,IAC/B,MAAM,OAAO,OAAO;AAAA,IACpB,MAAM,cAAc,OAAO,KAAK,MAAM,OAAO,IAAI;AAAA,IACjD,IAAI,CAAC,QAAQ,gBAAgB,aAAa,gBAAgB,QAAQ;AAAA,MAChE;AAAA,IACF;AAAA,IACA,MAAM,QAAQ;AAAA,IACd,MAAM;AAAA,IACN,UAAU,aAAa,KAAK,UAAU,OAAO,aAAa;AAAA,EAC5D;AAAA,EAEA,IAAI,KAAK;AAAA,IACP,MAAM,cAAc;AAAA,IAGpB,MAAM,cAAc,SAAS;AAAA,EAC/B;AAAA;AAGF,SAAS,IAAI,CAAC,MAAwB;AAAA,EAEpC,MAAM,MAAM,KAAK,MAAM,KAAK;AAAA,EAC5B,OAAO,QAAQ,aAAa,QAAQ,OAAO,IAAI,YAAY,MAAM;AAAA;AAGnE,SAAS,YAAY,CAAC,UAAkB,MAAmC;AAAA,EACzE,IAAI,wBAAwB,IAAI,QAAQ,GAAG;AAAA,IACzC,OAAO;AAAA,EACT;AAAA,EACA,IAAI,CAAC,MAAM;AAAA,IACT,OAAO;AAAA,EACT;AAAA,EAGA,MAAM,WAAW,KACd,QAAQ,eAAe,EAAE,EACzB,QAAQ,YAAY,EAAE,EACtB,QAAQ,QAAQ,EAAE;AAAA,EACrB,OAAO,WAAW,KAAK,QAAQ,KAAK,CAAC,eAAe,KAAK,QAAQ;AAAA;AAInE,SAAS,YAAY,CACnB,MACA,OACA,eACoB;AAAA,EACpB,IAAI,CAAC,QAAQ,OAAO,SAAS,UAAU;AAAA,IACrC;AAAA,EACF;AAAA,EAEA,MAAM,MAAM,KAAK,MAAM,KAAK;AAAA,EAC5B,IAAI,KAAK;AAAA,IACP,OAAO,UAAU,UAAU,GAAG,GAAG,QAAQ,MAAM,MAAM,CAAC;AAAA,EACxD;AAAA,EAEA,MAAM,aAAa,QAAQ,MAAM,OAAO;AAAA,EACxC,IAAI,eAAe,WAAW;AAAA,IAC5B,MAAM,OAAO,MAAM;AAAA,IACnB,IAAI,MAAM;AAAA,MACR,OAAO,UAAU,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,QAAQ,MAAM,SAAS;AAAA,EACvC,IAAI,YAAY,WAAW;AAAA,IACzB,MAAM,OAAO,cAAc;AAAA,IAC3B,IAAI,MAAM;AAAA,MACR,OAAO,UAAU,MAAM,QAAQ,MAAM,MAAM,CAAC;AAAA,IAC9C;AAAA,EACF;AAAA,EAEA;AAAA;AAIF,SAAS,SAAS,CAAC,MAAsB;AAAA,EACvC,MAAM,QAAQ,KAAK,QAAQ,MAAM,EAAE;AAAA,EACnC,MAAM,MAAM,MAAM,WAAW,IAAI,MAAM,MAAM,CAAC,IAAI;AAAA,EAClD,OAAO,IAAI,IAAI,YAAY;AAAA;AAO7B,SAAS,SAAS,CAAC,KAAa,MAAkC;AAAA,EAChE,IAAI,CAAC,MAAM;AAAA,IACT,OAAO;AAAA,EACT;AAAA,EACA,MAAM,QAAQ,IAAI,QAAQ,KAAK,EAAE;AAAA,EACjC,MAAM,WAAW,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,WAC9B,OAAO,SAAS,MAAM,MAAM,QAAQ,SAAS,CAAC,GAAG,EAAE,CACrD;AAAA,EACA,MAAM,SAAS,SAAS,IAAI,CAAC,YAAY;AAAA,IACvC,MAAM,OACJ,OAAO,IAAI,WAAW,IAAI,QAAQ,WAAW,IAAI,QAAQ,MAAM;AAAA,IACjE,OAAO,KAAK,IAAI,GAAG,KAAK,IAAI,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC;AAAA,GACnD;AAAA,EACD,OAAO,IAAI,OAAO,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,KAAK,EAAE;AAAA;AAIvE,SAAS,gBAAgB,CAAC,KAA4B;AAAA,EACpD,MAAM,YAAY,IACf,KAAK,WAAW,EAChB,KAAK,CAAC,SAAS,KAAK,SAAS,MAAM,CAAC;AAAA,EACvC,IAAI,CAAC,WAAW;AAAA,IACd,OAAO,CAAC;AAAA,EACV;AAAA,EACA,MAAM,OAAO,IAAI,KAAK,SAAS;AAAA,EAC/B,IAAI,CAAC,MAAM;AAAA,IACT,OAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,SAAS,sCAAsC,KAAK,IAAI,IAAI;AAAA,EAClE,IAAI,CAAC,QAAQ;AAAA,IACX,OAAO,CAAC;AAAA,EACV;AAAA,EAEA,MAAM,SAAmB,CAAC;AAAA,EAC1B,MAAM,QACJ;AAAA,EACF,IAAI;AAAA,EACJ,QAAQ,QAAQ,MAAM,KAAK,MAAM,OAAO,MAAM;AAAA,IAC5C,MAAM,OAAO,MAAM,MAAM;AAAA,IACzB,MAAM,OAAO,oCAAoC,KAAK,IAAI,IAAI;AAAA,IAC9D,MAAM,MAAM,2CAA2C,KAAK,IAAI,IAAI;AAAA,IACpE,OAAO,KAAK,KAAK,QAAQ,OAAO,UAAU,YAAY,GAAG;AAAA,EAC3D;AAAA,EAGA,IAAI,OAAO,UAAU,GAAG;AAAA,IACtB,OAAO,KAAK,KAAK,KAAK,QAAQ,QAAQ;AAAA,IACtC,OAAO,CAAC,KAAM,KAAM,KAAM,KAAM,GAAG,IAAI;AAAA,EACzC;AAAA,EACA,OAAO;AAAA;AAGT,SAAS,kBAAkB,CAAC,YAA+B;AAAA,EACzD,MAAM,SAAS,QAEV,WAAW,YAAoC,mBAG9C,WACN;AAAA,EACA,IAAI,OAAO,SAAS,GAAG;AAAA,IACrB,OAAO,OAAO,IAAI,CAAC,UAAU,UAAU,KAAK,OAAO,KAAK,KAAK,UAAU,CAAC;AAAA,EAC1E;AAAA,EACA,OAAO;AAAA;AAIT,IAAM,yBAAmC;AAAA,EACvC;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAAW;AAAA,EAClE;AACF;;;ACpXA;AAIA,IAAI;AAEJ,SAAS,qBAAqB,GAAgB;AAAA,EAC5C,IAAI,CAAC,wBAAwB;AAAA,IAC3B,MAAM,QAAQ,IAAI;AAAA,IAClB,WAAW,cAAc,0BAA0B,GAAG;AAAA,MACpD,MAAM,IAAI,WAAW,KAAK,YAAY,CAAC;AAAA,MACvC,WAAW,SAAS,WAAW,WAAW,CAAC,GAAG;AAAA,QAC5C,MAAM,IAAI,MAAM,YAAY,CAAC;AAAA,MAC/B;AAAA,IACF;AAAA,IACA,yBAAyB;AAAA,EAC3B;AAAA,EACA,OAAO;AAAA;AAQT,IAAM,cAAc;AAapB,IAAM,wBAAwB;AAe9B,IAAM,qBACJ;AAsBK,SAAS,gBAAgB,CAC9B,YACA,UAAmC,CAAC,GACjB;AAAA,EACnB,MAAM,cAA4B,CAAC;AAAA,EACnC,IAAI,OAAO,WAAW,WAAW,GAAG,IAAI,WAAW,MAAM,CAAC,IAAI;AAAA,EAE9D,OAAO,KAAK,QAAQ,aAAa,EAAE;AAAA,EACnC,OAAO,KAAK,QAAQ,uBAAuB,EAAE;AAAA,EAC7C,OAAO,0BAA0B,MAAM,QAAQ,mBAAmB;AAAA,EAElE,WAAW,QAAQ,yBAAyB,IAAI,GAAG;AAAA,IACjD,YAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SACE,iCAAiC,sCACjC;AAAA,MACF,WAAW,QAAQ;AAAA,MACnB,eAAe,QAAQ;AAAA,MACvB,QAAQ;AAAA,IACV,CAAC;AAAA,EACH;AAAA,EAEA,OAAO,EAAE,SAAS,IAAI,QAAQ,YAAY;AAAA;AAUrC,SAAS,wBAAwB,CAAC,aAA+B;AAAA,EACtE,MAAM,YAAY,sBAAsB;AAAA,EACxC,MAAM,QAAQ,IAAI;AAAA,EAElB,IAAI,WAAW;AAAA,EACf,IAAI,aAAa;AAAA,EAEjB,SAAS,IAAI,EAAG,IAAI,YAAY,QAAQ,KAAK;AAAA,IAC3C,MAAM,OAAO,YAAY;AAAA,IAEzB,IAAI,UAAU;AAAA,MACZ,IAAI,SAAS,KAAK;AAAA,QAEhB,IAAI,YAAY,IAAI,OAAO,KAAK;AAAA,UAC9B;AAAA,QACF,EAAO;AAAA,UACL,WAAW;AAAA;AAAA,MAEf;AAAA,MACA;AAAA,IACF;AAAA,IAEA,IAAI,SAAS,KAAK;AAAA,MAChB,WAAW;AAAA,MACX,aAAa;AAAA,MACb;AAAA,IACF;AAAA,IAEA,IAAI,gBAAgB,KAAK,IAAI,GAAG;AAAA,MAC9B,cAAc;AAAA,MACd;AAAA,IACF;AAAA,IAEA,IAAI,SAAS,OAAO,WAAW,SAAS,GAAG;AAAA,MACzC,MAAM,OAAO,WAAW,YAAY;AAAA,MAGpC,IAAI,sBAAsB,KAAK,IAAI,KAAK,CAAC,UAAU,IAAI,IAAI,GAAG;AAAA,QAC5D,MAAM,IAAI,IAAI;AAAA,MAChB;AAAA,IACF;AAAA,IAEA,aAAa;AAAA,EACf;AAAA,EAEA,OAAO,MAAM,KAAK,KAAK;AAAA;AAUlB,SAAS,uBAAuB,CACrC,aACA,WACA,WACQ;AAAA,EACR,IAAI,cAAc,KAAK,cAAc,GAAG;AAAA,IACtC,OAAO;AAAA,EACT;AAAA,EAIA,MAAM,YACJ;AAAA,EAEF,IAAI,SAAS;AAAA,EACb,IAAI,YAAY;AAAA,EAChB,IAAI,WAAW;AAAA,EAEf,SAAS,IAAI,EAAG,IAAI,YAAY,QAAQ,KAAK;AAAA,IAC3C,IAAI,YAAY,OAAO,KAAK;AAAA,MAC1B,IAAI,YAAY,YAAY,IAAI,OAAO,KAAK;AAAA,QAC1C;AAAA,QACA;AAAA,MACF;AAAA,MACA,WAAW,CAAC;AAAA,IACd;AAAA,IACA,IAAI,UAAU;AAAA,MACZ;AAAA,IACF;AAAA,IAEA,UAAU,YAAY;AAAA,IACtB,MAAM,QAAQ,UAAU,KAAK,WAAW;AAAA,IACxC,IAAI,CAAC,SAAS,MAAM,UAAU,GAAG;AAAA,MAC/B;AAAA,IACF;AAAA,IAEA,OAAO,OAAO,QAAQ,UAAU,QAAQ,aAAa;AAAA,IAKrD,MAAM,SAAS,IAAI,IAAI,YAAY,IAAI,KAAM;AAAA,IAC7C,IAAI,gBAAgB,KAAK,MAAM,GAAG;AAAA,MAChC;AAAA,IACF;AAAA,IAEA,UAAU,YAAY,MAAM,WAAW,CAAC;AAAA,IACxC,UAAU,eACR,QACA,UACA,QACA,WACA,WACA,SACF;AAAA,IACA,YAAY,IAAI,MAAO;AAAA,IACvB,IAAI,YAAY;AAAA,EAClB;AAAA,EAEA,UAAU,YAAY,MAAM,SAAS;AAAA,EACrC,OAAO;AAAA;AAGT,SAAS,cAAc,CACrB,QACA,UACA,QACA,WACA,WACA,WACQ;AAAA,EACR,MAAM,WAAW,oBAAmB,QAAQ;AAAA,EAC5C,MAAM,WAAW,OAAO,SAAS,WAAW,EAAE,IAAI;AAAA,EAElD,MAAM,cAAc,SAAS,WAAW,WAAW;AAAA,EACnD,MAAM,cAAc,SAAS,WAAW,WAAW;AAAA,EAEnD,IAAI,cAAc,KAAK,cAAc,GAAG;AAAA,IACtC,OAAO;AAAA,EACT;AAAA,EAEA,OAAO,GAAG,SAAS,oBAAmB,WAAW,IAAI,SAAS,cAAc;AAAA;AAG9E,SAAS,mBAAkB,CAAC,OAAuB;AAAA,EACjD,IAAI,QAAQ;AAAA,EACZ,SAAS,IAAI,EAAG,IAAI,MAAM,QAAQ,KAAK;AAAA,IACrC,QAAQ,QAAQ,MAAM,MAAM,YAAY,EAAE,WAAW,CAAC,IAAI;AAAA,EAC5D;AAAA,EACA,OAAO,QAAQ;AAAA;AAGjB,SAAS,mBAAkB,CAAC,OAAuB;AAAA,EACjD,IAAI,QAAQ;AAAA,EACZ,IAAI,YAAY,QAAQ;AAAA,EACxB,OAAO,YAAY,GAAG;AAAA,IACpB,MAAM,QAAQ,YAAY,KAAK;AAAA,IAC/B,QAAQ,OAAO,aAAa,KAAK,IAAI,IAAI;AAAA,IACzC,YAAY,KAAK,OAAO,YAAY,QAAQ,EAAE;AAAA,EAChD;AAAA,EACA,OAAO;AAAA;AAOF,SAAS,yBAAyB,CACvC,aACA,qBACQ;AAAA,EACR,OAAO,YAAY,QACjB,oBACA,CAAC,OAAO,aAAa,WAAW,UAAU,WAAW;AAAA,IACnD,MAAM,YAAgC,cAClC,OAAO,WAAW,EAAE,QAAQ,OAAO,GAAG,IACtC,YACE,OAAO,SAAS,IAChB;AAAA,IAKN,MAAM,UACJ,WAAW,YACP,IAAI,cACJ,IAAI,cAAc;AAAA,IAExB,MAAM,sBACJ,WAAW,aAAa,gBAAgB,KAAK,OAAO,QAAQ,CAAC;AAAA,IAE/D,MAAM,YAAY,sBAAsB,IAAI,aAAa,IAAI;AAAA,IAG7D,IACE,aACA,uBACA,UAAU,YAAY,MAAM,oBAAoB,YAAY,GAC5D;AAAA,MACA,OAAO,IAAI;AAAA,IACb;AAAA,IACA,IAAI,CAAC,WAAW;AAAA,MACd,OAAO,IAAI;AAAA,IACb;AAAA,IACA,MAAM,SAAS,cAAc,IAAI,OAAO,WAAW,OAAO;AAAA,IAC1D,OAAO,GAAG,UAAU;AAAA,GAExB;AAAA;;;ACtTF;AAAA;AAAA;AAuBO,SAAS,0BAA0B,CACxC,MACA,SACqE;AAAA,EACrE,MAAM,cAA4B,CAAC;AAAA,EAEnC,MAAM,QAA4B,CAAC;AAAA,EACnC,WAAW,aAAa,KAAK,QAAQ;AAAA,IACnC,MAAM,QAAQ,iCAAiC,SAAS;AAAA,IACxD,IAAI,OAAO;AAAA,MACT,MAAM,KAAK,EAAE,WAAW,QAAQ,WAAW,MAAM,CAAC;AAAA,IACpD;AAAA,EACF;AAAA,EACA,IAAI,MAAM,WAAW,GAAG;AAAA,IACtB,OAAO,EAAE,YAAY;AAAA,EACvB;AAAA,EAEA,MAAM,SAAS,KAAK,OAAO,IAAI,MAAM,GAAG,EAAE,IAAI,QAAQ,OAAO,EAAE,KAAK;AAAA,EAEpE,IAAI,KAAK,SAAS,cAAc;AAAA,IAC9B,OAAO,oBAAoB,MAAM,OAAO,SAAS,WAAW;AAAA,EAC9D;AAAA,EAEA,MAAM,YAAY,sBAAsB,MAAM,QAAQ,SAAS,WAAW;AAAA,EAC1E,IAAI,CAAC,WAAW;AAAA,IACd,OAAO,EAAE,YAAY;AAAA,EACvB;AAAA,EAEA,OAAO,EAAE,QAAQ,EAAE,OAAO,UAAU,GAAG,YAAY;AAAA;AAGrD,SAAS,qBAAqB,CAC5B,MACA,QACA,SACA,aAC4B;AAAA,EAC5B,MAAM,QAAQ,UAAU,MAAM,OAAO;AAAA,EACrC,IAAI,CAAC,OAAO;AAAA,IACV,YAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SACE,KAAK,KAAK,6DACV;AAAA,MACF,WAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,IACD;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,gBAAgB,MAAM,QAAQ,SAAS,WAAW;AAAA,EACrE,IAAI,CAAC,YAAY;AAAA,IACf;AAAA,EACF;AAAA,EAEA,MAAM,aAAa,iBAAiB,YAAY;AAAA,IAC9C,WAAW,QAAQ;AAAA,IACnB,eAAe;AAAA,EACjB,CAAC;AAAA,EACD,YAAY,KAAK,GAAG,WAAW,WAAW;AAAA,EAE1C,OAAO,EAAE,MAAM,WAAW,SAAS,WAAW,SAAS,MAAM;AAAA;AAM/D,SAAS,eAAe,CACtB,MACA,QACA,SACA,aACoB;AAAA,EACpB,OAAO,OAAO,UAAU,KAAK;AAAA,EAE7B,QAAQ,KAAK;AAAA,SACN;AAAA,MACH,OAAO,QAAQ,IAAI,UAAU;AAAA,SAE1B;AAAA,MACH,OAAO,iBAAiB,KAAK,UAAU,QAAQ,OAAO,MAAM;AAAA,SAEzD;AAAA,MACH,OAAO,KAAK,SAAS,YACjB,YACA,iBAAiB,MAAM,KAAK,IAAI,KAAK;AAAA,SAEtC;AAAA,MACH,OAAO,KAAK,SAAS,YACjB,YACA,iBAAiB,MAAM,KAAK,IAAI,KAAK;AAAA,SAEtC;AAAA,MACH,OAAO,KAAK,SAAS,YACjB,YACA,eAAe,UAAU,KAAK,KAAK,WAAW,MAAM,KAAK,IAAI;AAAA,SAE9D;AAAA,MACH,OAAO,KAAK,SAAS,YACjB,YACA,gBAAgB,UAAU,KAAK,KAAK,WAAW,MAAM,KAAK,IAAI;AAAA,SAE/D;AAAA,MACH,OAAO,QAAQ;AAAA,SAEZ;AAAA,MACH,OAAO,QAAQ;AAAA;AAAA,MAGf,YAAY,KAAK;AAAA,QACf,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SACE,gCAAgC,KAAK,kCACrC;AAAA,QACF,WAAW,QAAQ;AAAA,MACrB,CAAC;AAAA,MACD;AAAA;AAAA;AAIN,SAAS,gBAAgB,CACvB,UACA,QACA,OACA,QACoB;AAAA,EACpB,IAAI,UAAU,WAAW;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,QAAQ;AAAA,SACD;AAAA,MACH,OAAO,IAAI,UAAU;AAAA,SAClB;AAAA,MACH,OAAO,IAAI,WAAW;AAAA,SACnB;AAAA,MACH,OAAO,IAAI,UAAU;AAAA,SAClB;AAAA,MACH,OAAO,IAAI,WAAW;AAAA,SACnB;AAAA,MACH,OAAO,IAAI,UAAU;AAAA,SAClB;AAAA,MACH,OAAO,IAAI,WAAW;AAAA,SACnB;AAAA,MACH,OAAO,WAAW,YACd,YACA,QAAQ,WAAW,SAAS,WAAW;AAAA,SACxC;AAAA,MACH,OAAO,WAAW,YACd,YACA,OAAO,UAAU,SAAS,UAAU;AAAA;AAAA,MAExC;AAAA;AAAA;AAIN,SAAS,mBAAmB,CAC1B,MACA,OACA,SACA,aACqE;AAAA,EACrE,MAAM,QAAQ,KAAK;AAAA,EACnB,IAAI,CAAC,SAAS,MAAM,KAAK,SAAS,KAAK,MAAM,OAAO,SAAS,GAAG;AAAA,IAC9D,OAAO,EAAE,YAAY;AAAA,EACvB;AAAA,EAEA,IAAI,MAAM,KAAK,SAAS,GAAG;AAAA,IACzB,YAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SACE,wEACA;AAAA,MACF,WAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,MAAM,KAAK;AAAA,EAC7B,MAAM,WAAW,MAAM,KAAK,MAAM,KAAK,SAAS;AAAA,EAChD,MAAM,aAAa,MAAM,MAAM,OAAO,EAAE;AAAA,EACxC,MAAM,YAAY,MAAM,MAAM,OAAO,MAAM,OAAO,SAAS,EAAE;AAAA,EAE7D,IAAI,CAAC,cAAc,CAAC,WAAW;AAAA,IAC7B,OAAO,EAAE,YAAY;AAAA,EACvB;AAAA,EAEA,MAAM,MACJ,UAAU,SAAS,SAAS,UAAU,QAAQ,YACzC;AAAA,IACC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,cAAc,IAAI,UAAU;AAAA,EAC9B,IACC,EAAE,MAAM,gBAAyB,OAAO,WAAW;AAAA,EAE1D,MAAM,MACJ,SAAS,SAAS,SAAS,SAAS,QAAQ,YACvC;AAAA,IACC,MAAM;AAAA,IACN,OAAO;AAAA,IACP,cAAc,IAAI,SAAS;AAAA,EAC7B,IACC,EAAE,MAAM,iBAA0B,OAAO,UAAU;AAAA,EAE1D,IACG,UAAU,SAAS,SAAS,UAAU,SAAS,SAC/C,SAAS,SAAS,SAAS,SAAS,SAAS,OAC9C;AAAA,IACA,YAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SACE,yBAAyB,UAAU,UAAU,SAAS,qBACtD,sEACA;AAAA,MACF,WAAW,QAAQ;AAAA,IACrB,CAAC;AAAA,EACH;AAAA,EAEA,OAAO;AAAA,IACL,QAAQ,EAAE,OAAO,WAAW,EAAE,MAAM,YAAY,KAAK,IAAI,EAAE;AAAA,IAC3D;AAAA,EACF;AAAA;AAOF,SAAS,SAAS,CAChB,MACA,SACsB;AAAA,EACtB,IAAI,KAAK,UAAU,WAAW;AAAA,IAC5B;AAAA,EACF;AAAA,EACA,MAAM,SAAS,QAAQ,oBAAoB,KAAK;AAAA,EAChD,IAAI,CAAC,QAAQ;AAAA,IACX;AAAA,EACF;AAAA,EACA,MAAM,MAAM,OAAO,mBAAmB,OAAO;AAAA,EAC7C,OAAO,MAAM,SAAS,GAAG,IAAI;AAAA;AAG/B,SAAS,KAAK,CAAC,MAAgD;AAAA,EAC7D,IAAI,CAAC,MAAM;AAAA,IACT;AAAA,EACF;AAAA,EACA,MAAM,QAAQ,KAAK,QAAQ,MAAM,EAAE;AAAA,EACnC,MAAM,MAAM,MAAM,WAAW,IAAI,MAAM,MAAM,CAAC,IAAI;AAAA,EAClD,IAAI,CAAC,mBAAmB,KAAK,GAAG,GAAG;AAAA,IACjC;AAAA,EACF;AAAA,EACA,OAAO,SAAS,IAAI,IAAI,YAAY,GAAG;AAAA;AAGzC,SAAS,KAAK,CAAC,MAAsB;AAAA,EACnC,OAAO,IAAI,KAAK,QAAQ,MAAM,IAAI;AAAA;;;AC7RpC,IAAM,SAAS;AAQf,IAAM,iBAAiB,KAAK,IAAI,MAAM,IAAI,EAAE;AAC5C,IAAM,iBAAiB,KAAK,IAAI,MAAM,GAAG,CAAC;AAEnC,SAAS,gBAAgB,CAAC,QAAgB,WAAW,OAAe;AAAA,EACzE,IAAI,CAAC,OAAO,SAAS,MAAM,GAAG;AAAA,IAC5B,OAAO,OAAO,MAAM;AAAA,EACtB;AAAA,EAEA,MAAM,QAAQ,WAAW,iBAAiB;AAAA,EAI1C,MAAM,WACJ,CAAC,YAAY,SAAS,MAAM,UAAU,IAAI,SAAS,IAAI;AAAA,EAEzD,MAAM,YAAY,KAAK,MAAM,QAAQ;AAAA,EACrC,MAAM,WAAW,WAAW;AAAA,EAC5B,MAAM,KAAK,QAAQ,YAAY,SAAS,KAAK,MAAM,WAAW,MAAM;AAAA,EACpE,MAAM,OAAO,IAAI,KAAK,EAAE;AAAA,EAExB,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAC,GAAG;AAAA,IAChC,OAAO,OAAO,MAAM;AAAA,EACtB;AAAA,EAEA,MAAM,MAAM,KAAK,YAAY;AAAA,EAI7B,IAAI,aAAa,GAAG;AAAA,IAClB,OAAO,IAAI,MAAM,GAAG,EAAE;AAAA,EACxB;AAAA,EACA,IAAI,cAAc,GAAG;AAAA,IACnB,OAAO,IAAI,MAAM,IAAI,EAAE;AAAA,EACzB;AAAA,EACA,OAAO,IAAI,MAAM,GAAG,EAAE,EAAE,QAAQ,KAAK,GAAG;AAAA;;;ACR1C,IAAM,wBAAwB,IAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAED,eAAsB,eAAe,CACnC,QACA,UAA0B,CAAC,GACH;AAAA,EACxB;AAAA,IACE,QAAQ,eAAe;AAAA,IACvB,uBAAuB,8BAA8B;AAAA,IACrD,QAAQ,eAAe;AAAA,IACvB,cAAc,qBAAqB;AAAA,IACnC,cAAc,qBAAqB;AAAA,IACnC,eAAe;AAAA,MACb;AAAA,EAEJ,MAAM,cAA4B,CAAC;AAAA,EACnC,MAAM,MAAM,MAAM,gBAAgB,MAAM;AAAA,EAExC,MAAM,gBAAgB,mBAAmB,GAAG;AAAA,EAC5C,QAAQ,QAAQ,cAAc,cAAc,aAAa,cAAc,GAAG;AAAA,EAC1E,MAAM,aAAa,YAAY,GAAG;AAAA,EAElC,MAAM,WAAW,QAAQ,SACrB,aAAa,OAAO,CAAC,UAAU,QAAQ,OAAQ,SAAS,MAAM,IAAI,CAAC,IACnE;AAAA,EAEJ,MAAM,SAAqE,CAAC;AAAA,EAC5E,MAAM,SAA8B,CAAC;AAAA,EACrC,MAAM,aAAsC,CAAC;AAAA,EAC7C,MAAM,oBAAoD,CAAC;AAAA,EAC3D,MAAM,qBAAqB,IAAI;AAAA,EAE/B,WAAW,SAAS,UAAU;AAAA,IAC5B,MAAM,YAAY,eAAe,KAAK,MAAM,UAAU,aAAa;AAAA,IACnE,mBAAmB,IAAI,MAAM,IAAI;AAAA,IAQjC,MAAM,cAAc,eAAe,YAAY,KAAK,MAAM,QAAQ,IAAI,CAAC;AAAA,IACvE,MAAM,cAAc,YACjB,IAAI,CAAC,WAAW,EAAE,MAAM,MAAM,aAAa,OAAO,aAAa,MAAM,GAAG,EAAE,EAAE,EAC5E,OACC,CAAC,eACC,WAAW,UAAU,SACzB;AAAA,IAGF,MAAM,UAAU,CAAC,UAAkB,aACjC,YAAY,KACV,GAAG,YACD,YAAY,MAAM,MAAM,YACxB,YAAY,MAAM,IAAI,YACtB,YAAY,MAAM,MAAM,YACxB,YAAY,MAAM,IAAI,QAC1B,GAAG;AAAA,IAEL,MAAM,UAAU,IAAI;AAAA,IACpB,MAAM,eAAe,IAAI;AAAA,IAGzB,MAAM,cAAc,IAAI;AAAA,IAExB,WAAW,QAAQ,UAAU,OAAO;AAAA,MAClC,MAAM,SACJ,KAAK,eAAe,YAChB,YACA,WAAW,QAAQ,KAAK;AAAA,MAE9B,MAAM,QAAQ,UAAU,MAAM,QAAQ;AAAA,QACpC;AAAA,QACA;AAAA,QACA,WAAW,MAAM;AAAA,QACjB;AAAA,QACA,qBAAqB,QAAQ,KAAK,UAAU,KAAK,QAAQ;AAAA,MAC3D,CAAC;AAAA,MACD,IAAI,UAAU,WAAW;AAAA,QACvB,QAAQ,IAAI,KAAK,WAAW,KAAK;AAAA,MACnC;AAAA,MAEA,IAAI,gBAAgB,KAAK,eAAe,aAAa,QAAQ;AAAA,QAC3D,IAAI,OAAO,KAAK,OAAO,KAAK,EAAE,SAAS,GAAG;AAAA,UACxC,MAAM,QAAQ,YAAY,IAAI,KAAK,UAAU;AAAA,UAC7C,IAAI,OAAO;AAAA,YACT,MAAM,KAAK,IAAI;AAAA,UACjB,EAAO;AAAA,YACL,YAAY,IAAI,KAAK,YAAY,CAAC,IAAI,CAAC;AAAA;AAAA,QAE3C;AAAA,MACF;AAAA,MAEA,IAAI,oBAAoB;AAAA,QACtB,MAAM,WAA8B,CAAC;AAAA,QACrC,IAAI,QAAQ,cAAc;AAAA,UACxB,SAAS,eAAe,OAAO;AAAA,QACjC;AAAA,QACA,MAAM,YAAY,UAAU,WAAW,KAAK;AAAA,QAC5C,IAAI,WAAW;AAAA,UACb,SAAS,YAAY;AAAA,QACvB;AAAA,QACA,IAAI,OAAO,KAAK,QAAQ,EAAE,SAAS,GAAG;AAAA,UACpC,aAAa,IAAI,KAAK,WAAW,QAAQ;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,cAAc;AAAA,MAChB,YAAY,YAAY,UAAU,aAAa;AAAA,QAC7C,MAAM,SAAS,WAAW,QAAQ;AAAA,QAClC,IAAI,CAAC,QAAQ;AAAA,UACX;AAAA,QACF;AAAA,QACA,WAAW,KAAK;AAAA,UACd,OAAO,uBAAuB,MAAM,MAAM,KAAK;AAAA,UAC/C,OAAO,OAAO;AAAA,QAChB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,IAEA,IAAI,6BAA6B;AAAA,MAG/B,MAAM,UAAU,CAAC,GAAG,UAAU,kBAAkB,EAAE,KAChD,CAAC,GAAG,MAAM,EAAE,WAAW,EAAE,QAC3B;AAAA,MACA,WAAW,QAAQ,SAAS;AAAA,QAC1B,QAAQ,QAAQ,aAAa,oBAC3B,2BAA2B,MAAM;AAAA,UAC/B,WAAW,MAAM;AAAA,UACjB,qBAAqB,WAAW;AAAA,QAClC,CAAC;AAAA,QACH,YAAY,KAAK,GAAG,eAAe;AAAA,QACnC,IAAI,QAAQ;AAAA,UACV,kBAAkB,KAAK,MAAM;AAAA,QAC/B;AAAA,MACF;AAAA,IACF;AAAA,IAEA,IAAI,cAAc;AAAA,MAChB,WAAW,SAAS,aAAa;AAAA,QAC/B,MAAM,YAAY,aAAa,OAAO,MAAM,MAAM,WAAW;AAAA,QAC7D,IAAI,WAAW;AAAA,UACb,OAAO,KAAK,SAAS;AAAA,QACvB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,MAAM,gBAAoC,CAAC;AAAA,IAC3C,IAAI,OAAO,KAAK,UAAU,YAAY,EAAE,SAAS,GAAG;AAAA,MAClD,cAAc,eAAe,UAAU;AAAA,IACzC;AAAA,IACA,IAAI,OAAO,KAAK,UAAU,UAAU,EAAE,SAAS,GAAG;AAAA,MAChD,cAAc,aAAa,UAAU;AAAA,IACvC;AAAA,IACA,IAAI,UAAU,OAAO,SAAS,GAAG;AAAA,MAC/B,cAAc,SAAS,UAAU;AAAA,IACnC;AAAA,IACA,IAAI,UAAU,QAAQ;AAAA,MACpB,cAAc,SAAS,UAAU;AAAA,IACnC;AAAA,IACA,IAAI,MAAM,UAAU,WAAW;AAAA,MAC7B,cAAc,UAAU;AAAA,IAC1B;AAAA,IAEA,OAAO,KAAK;AAAA,MACV,MAAM,MAAM;AAAA,MACZ;AAAA,MACA,cAAc,aAAa,OAAO,IAAI,eAAe;AAAA,MACrD,eACE,OAAO,KAAK,aAAa,EAAE,SAAS,IAAI,gBAAgB;AAAA,IAC5D,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,mBAAmB,qBACrB,oBACE,cACA,aAAa,IAAI,CAAC,UAAU,MAAM,IAAI,GACtC,oBACA,WACF,IACA,CAAC;AAAA,EAEL,MAAM,OAA0B;AAAA,IAC9B;AAAA,IACA,QAAQ,OAAO,SAAS,IAAI,SAAS;AAAA,IACrC,kBACE,iBAAiB,SAAS,IAAI,mBAAmB;AAAA,IACnD,YAAY,WAAW,SAAS,IAAI,aAAa;AAAA,IACjD,mBACE,kBAAkB,SAAS,IAAI,oBAAoB;AAAA,IACrD,kBAAkB;AAAA,MAChB,UAAU,QAAQ;AAAA,MAClB,YAAY,aAAa,IAAI,CAAC,UAAU,MAAM,IAAI;AAAA,MAClD,aAAa,YAAY,SAAS,IAAI,cAAc;AAAA,IACtD;AAAA,EACF;AAAA,EAEA,OAAO,EAAE,MAAM,YAAY;AAAA;AAiB7B,SAAS,SAAS,CAChB,MACA,QACA,SACqB;AAAA,EACrB,IAAI,KAAK,YAAY,WAAW;AAAA,IAC9B,MAAM,OAAO,KAAK,gBACd,wBACE,KAAK,SACL,KAAK,cAAc,MACnB,KAAK,cAAc,IACrB,IACA,KAAK;AAAA,IAET,MAAM,aAAa,iBAAiB,MAAM;AAAA,MACxC,WAAW,QAAQ;AAAA,MACnB,eAAe,KAAK;AAAA,MACpB,qBAAqB,QAAQ;AAAA,IAC/B,CAAC;AAAA,IACD,QAAQ,YAAY,KAAK,GAAG,WAAW,WAAW;AAAA,IAClD,OAAO,WAAW;AAAA,EACpB;AAAA,EAEA,QAAQ,KAAK;AAAA,SACN,UAAU;AAAA,MACb,MAAM,QAAQ,KAAK;AAAA,MACnB,IAAI,QAAQ,gBAAgB,QAAQ,cAAc;AAAA,QAChD,OAAO,iBAAiB,OAAO,QAAQ,QAAQ;AAAA,MACjD;AAAA,MACA,OAAO;AAAA,IACT;AAAA,SACK;AAAA,MACH,OAAO,KAAK;AAAA,SACT;AAAA,MACH,OAAO,KAAK;AAAA,SACT;AAAA,MACH,OAAO,KAAK;AAAA,SACT;AAAA,MAEH,OAAO,KAAK;AAAA,SACT;AAAA,MACH;AAAA;AAAA;AAIN,SAAS,YAAY,CACnB,OACA,WACA,aAC+B;AAAA,EAC/B,MAAM,SAAS,aAAa,MAAM,GAAG;AAAA,EACrC,IAAI,CAAC,QAAQ;AAAA,IACX,YAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS,UAAU,MAAM,yCAAyC,MAAM;AAAA,MACxE;AAAA,IACF,CAAC;AAAA,IACD;AAAA,EACF;AAAA,EAEA,IAAI,MAAM,mBAAmB,GAAG;AAAA,IAE9B,YAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SACE,UAAU,MAAM,sDAChB;AAAA,MACF;AAAA,IACF,CAAC;AAAA,IACD;AAAA,EACF;AAAA,EAEA,MAAM,UAAU,OAAO,IAAI,WAAW,OAAO,MAAM,WAAW;AAAA,EAC9D,MAAM,WACJ,OAAO,IAAI,WACX,OAAO,MAAM,WACb,IACA,MAAM,iBACN,MAAM;AAAA,EAER,IAAI,WAAW,KAAK,WAAW,GAAG;AAAA,IAChC,YAAY,KAAK;AAAA,MACf,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS,UAAU,MAAM,oCAAoC,MAAM;AAAA,MACnE;AAAA,IACF,CAAC;AAAA,IACD;AAAA,EACF;AAAA,EAEA,OAAO;AAAA,IACL,MAAM,MAAM;AAAA,IACZ;AAAA,IACA,OAAO,KAAK,OAAO,KAAK;AAAA,IACxB,SAAS,EAAE,MAAM,UAAU,OAAO,SAAS;AAAA,IAC3C;AAAA,EACF;AAAA;AAGF,SAAS,mBAAmB,CAC1B,cACA,YACA,oBACA,aAC+B;AAAA,EAC/B,MAAM,SAAwC,CAAC;AAAA,EAE/C,WAAW,eAAe,cAAc;AAAA,IACtC,IAAI,sBAAsB,IAAI,YAAY,KAAK,YAAY,CAAC,GAAG;AAAA,MAC7D;AAAA,IACF;AAAA,IACA,IAAI,YAAY,UAAU,YAAY,QAAQ,KAAK,MAAM,IAAI;AAAA,MAC3D;AAAA,IACF;AAAA,IACA,IAAI,YAAY,QAAQ,SAAS,OAAO,GAAG;AAAA,MACzC,YAAY,KAAK;AAAA,QACf,UAAU;AAAA,QACV,MAAM;AAAA,QACN,SAAS,iBAAiB,YAAY;AAAA,QACtC,QAAQ,YAAY;AAAA,MACtB,CAAC;AAAA,MACD;AAAA,IACF;AAAA,IAEA,MAAM,YACJ,YAAY,iBAAiB,YACzB,YACA,WAAW,YAAY;AAAA,IAE7B,IAAI,cAAc,aAAa,CAAC,mBAAmB,IAAI,SAAS,GAAG;AAAA,MACjE;AAAA,IACF;AAAA,IAGA,MAAM,aAAa,iBAAiB,YAAY,OAAO;AAAA,IACvD,YAAY,KAAK,GAAG,WAAW,WAAW;AAAA,IAE1C,OAAO,KAAK;AAAA,MACV,MAAM,YAAY;AAAA,MAClB,YAAY,WAAW,QAAQ,MAAM,CAAC;AAAA,MACtC;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,OAAO;AAAA;AAYF,SAAS,sBAAsB,CACpC,WACA,OACuE;AAAA,EACvE,MAAM,QAAQ,IAAI;AAAA,EAClB,WAAW,QAAQ,OAAO;AAAA,IACxB,MAAM,MAAM,MAAM,IAAI,KAAK,QAAQ;AAAA,IACnC,IAAI,KAAK;AAAA,MACP,IAAI,KAAK,KAAK,QAAQ;AAAA,IACxB,EAAO;AAAA,MACL,MAAM,IAAI,KAAK,UAAU,CAAC,KAAK,QAAQ,CAAC;AAAA;AAAA,EAE5C;AAAA,EAQA,MAAM,OAAc,CAAC;AAAA,EACrB,YAAY,UAAU,YAAY,OAAO;AAAA,IACvC,QAAQ,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC;AAAA,IAC5B,IAAI,WAAW,QAAQ;AAAA,IACvB,IAAI,WAAW;AAAA,IACf,SAAS,IAAI,EAAG,IAAI,QAAQ,QAAQ,KAAK;AAAA,MACvC,MAAM,UAAU,QAAQ;AAAA,MACxB,IAAI,YAAY,WAAW,GAAG;AAAA,QAC5B,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACA,KAAK,KAAK,EAAE,UAAU,UAAU,QAAQ,SAAS,CAAC;AAAA,MAClD,WAAW;AAAA,MACX,WAAW;AAAA,IACb;AAAA,IACA,KAAK,KAAK,EAAE,UAAU,UAAU,QAAQ,SAAS,CAAC;AAAA,EACpD;AAAA,EAGA,KAAK,KAAK,CAAC,GAAG,MACZ,EAAE,WAAW,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,QACnE;AAAA,EAEA,MAAM,QAA+E,CAAC;AAAA,EACtF,IAAI,QAAQ;AAAA,EACZ,OAAO,QAAQ,KAAK,QAAQ;AAAA,IAC1B,MAAM,QAAQ,KAAK;AAAA,IACnB,IAAI,UAAU,MAAM;AAAA,IACpB,IAAI,OAAO,QAAQ;AAAA,IACnB,OACE,OAAO,KAAK,UACZ,KAAK,MAAO,aAAa,MAAM,YAC/B,KAAK,MAAO,WAAW,MAAM,UAC7B,KAAK,MAAO,aAAa,UAAU,GACnC;AAAA,MACA,UAAU,KAAK,MAAO;AAAA,MACtB;AAAA,IACF;AAAA,IAEA,MAAM,KAAK;AAAA,MACT;AAAA,MACA,OAAO,mBAAmB;AAAA,QACxB,OAAO,EAAE,UAAU,MAAM,UAAU,UAAU,MAAM,SAAS;AAAA,QAC5D,KAAK,EAAE,UAAU,MAAM,QAAQ,UAAU,QAAQ;AAAA,MACnD,CAAC;AAAA,IACH,CAAC;AAAA,IACD,QAAQ;AAAA,EACV;AAAA,EAEA,OAAO;AAAA;;;ACjdT,eAAsB,oBAAoB,CACxC,QACA,SAC4B;AAAA,EAC5B,QAAQ,SAAS,MAAM,gBAAgB,QAAQ,aAAa,QAAQ,OAAO,CAAC;AAAA,EAC5E,OAAO;AAAA;AAOT,eAAsB,4BAA4B,CAChD,QACA,SACwB;AAAA,EACxB,OAAO,gBAAgB,QAAQ,aAAa,QAAQ,OAAO,CAAC;AAAA;AAI9D,SAAS,YAAY,CACnB,QACA,SACgB;AAAA,EAChB,IAAI,SAAS,aAAa,WAAW;AAAA,IACnC,OAAO;AAAA,EACT;AAAA,EACA,MAAM,OACJ,OAAO,SAAS,eAAe,kBAAkB,OAC7C,OAAO,OACP;AAAA,EACN,OAAO,OAAO,KAAK,SAAS,UAAU,KAAK,IAAI,KAAK,QAAQ;AAAA;",
17
+ "debugId": "0B0A199FAC38549264756E2164756E21",
18
18
  "names": []
19
19
  }
@@ -12,6 +12,15 @@ import type { Diagnostic } from "../types";
12
12
  export interface TranslateFormulaOptions {
13
13
  sheetName?: string;
14
14
  cellReference?: string;
15
+ /**
16
+ * The table the formula's own cell sits inside, when it sits inside one.
17
+ *
18
+ * Excel drops the table name from a current-row reference that points at the
19
+ * table the formula is already in, so `[@Payload]` is what the author sees.
20
+ * Supplying it here reproduces that, and leaving it out keeps the name — which
21
+ * is still correct, just more verbose than Excel would be.
22
+ */
23
+ containingTableName?: string;
15
24
  }
16
25
  export interface TranslatedFormula {
17
26
  /** Engine formula text, including the leading `=`. */
@@ -35,3 +44,8 @@ export declare function findUnsupportedFunctions(formulaBody: string): string[];
35
44
  * (`$A$1`) stay put.
36
45
  */
37
46
  export declare function offsetFormulaReferences(formulaBody: string, deltaCols: number, deltaRows: number): string;
47
+ /**
48
+ * `Table[[#This Row],[Col]]` → `Table[@Col]`, or `[@Col]` when the formula is
49
+ * already inside that table.
50
+ */
51
+ export declare function contractThisRowReferences(formulaBody: string, containingTableName?: string): string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ricsam/excel-to-formula-engine",
3
- "version": "0.1.0",
3
+ "version": "0.1.1",
4
4
  "description": "Convert an Excel .xlsx file into FormulaEngine WorkbookData, in the browser",
5
5
  "type": "module",
6
6
  "module": "./dist/index.mjs",