{"version":3,"file":"parse.mjs","names":[],"sources":["../src/parse.ts"],"sourcesContent":["/**\n * XLSX parsing — parse .xlsx files into structured data.\n *\n * @module\n */\nimport {\n  appPropertiesDesc,\n  customPropertiesDesc,\n  parseArchive,\n  parseCorePropsElement,\n} from \"@office-open/core\";\nimport type { ParsedArchive } from \"@office-open/core\";\nimport { toUint8Array } from \"@office-open/core\";\nimport type { DataType } from \"@office-open/core\";\nimport type { ReadContext } from \"@office-open/core/descriptor\";\nimport type { Element } from \"@office-open/xml\";\nimport { attr } from \"@office-open/xml\";\nimport { calcChainDesc } from \"@parts/calc-chain\";\nimport { chartsheetDesc } from \"@parts/chartsheet\";\nimport type { ChartsheetOptions } from \"@parts/chartsheet\";\nimport { commentsDesc } from \"@parts/comments\";\nimport { drawingDesc } from \"@parts/drawing\";\nimport { externalLinkDesc } from \"@parts/external-link\";\nimport type { ExternalLinkOptions } from \"@parts/external-link\";\nimport type { SharedWorkbookOptions, WorkbookOptions } from \"@parts/file\";\nimport { pivotCacheDefDesc, pivotCacheRecordsDesc } from \"@parts/pivot-cache\";\nimport type { PivotCacheDefParseResult, PivotCacheRecordsParseResult } from \"@parts/pivot-cache\";\nimport { pivotTableDesc } from \"@parts/pivot-table\";\nimport type { PivotTableParseResult } from \"@parts/pivot-table\";\nimport type { PivotTableOptions } from \"@parts/pivot/pivot-utils\";\nimport {\n  revisionHeadersDesc,\n  revisionLogDesc,\n  usersDesc,\n  type RevisionLogOptions,\n} from \"@parts/revision-log\";\nimport { sharedStringsDesc } from \"@parts/shared-strings\";\nimport type { SharedStringsDocOptions } from \"@parts/shared-strings\";\nimport { stylesDesc } from \"@parts/styles\";\nimport { tableDesc } from \"@parts/table\";\nimport type { TableOptions } from \"@parts/table\";\nimport { workbookDesc } from \"@parts/workbook\";\nimport { worksheetDesc } from \"@parts/worksheet\";\nimport type {\n  WorksheetChartOptions,\n  WorksheetImageOptions,\n  WorksheetOptions,\n} from \"@parts/worksheet\";\n\nimport { XlsxReadContext } from \"./context\";\n\nexport { parseArchive };\n\n// ── Low-level parse result ──\n\nexport interface XlsxPartRefs {\n  worksheets: string[];\n  charts: string[];\n  media: string[];\n  drawings: string[];\n}\n\nexport interface XlsxDocument {\n  doc: ParsedArchive;\n  /** xl/workbook.xml root element */\n  workbook?: Element;\n  /** Worksheet paths (xl/worksheets/sheet{n}.xml) */\n  worksheets: string[];\n  /** xl/styles.xml root element */\n  styles?: Element;\n  /** xl/sharedStrings.xml root element */\n  sharedStrings?: Element;\n  partRefs: XlsxPartRefs;\n  /** docProps/core.xml path */\n  coreProps?: string;\n  /** docProps/app.xml path */\n  appProps?: string;\n  /** docProps/custom.xml path */\n  customProps?: string;\n}\n\nfunction sortByNumber(paths: string[]): string[] {\n  return paths.sort((a, b) => {\n    const numA = parseInt(a.match(/(\\d+)/)?.[1] ?? \"0\", 10);\n    const numB = parseInt(b.match(/(\\d+)/)?.[1] ?? \"0\", 10);\n    return numA - numB;\n  });\n}\n\n/** Derive the sibling rels path for an external link part.\n * \"xl/externalLinks/externalLink1.xml\" → \"xl/externalLinks/_rels/externalLink1.xml.rels\"\n */\nfunction externalLinkRelsPath(elPath: string): string {\n  const idx = elPath.lastIndexOf(\"/\");\n  const dir = elPath.substring(0, idx);\n  const file = elPath.substring(idx + 1);\n  return `${dir}/_rels/${file}.rels`;\n}\n\n/**\n * Parse raw .xlsx data into a low-level XlsxDocument.\n */\nexport function parseXlsx(data: DataType): XlsxDocument {\n  const uint8 = toUint8Array(data);\n  const doc = parseArchive(uint8);\n\n  const workbook = doc.get(\"xl/workbook.xml\");\n  const styles = doc.get(\"xl/styles.xml\");\n  const sharedStrings = doc.get(\"xl/sharedStrings.xml\");\n\n  // Resolve worksheet paths from workbook rels\n  const worksheets: string[] = [];\n  const charts: string[] = [];\n  const drawings: string[] = [];\n  const media: string[] = [];\n\n  const wbRels = doc.get(\"xl/_rels/workbook.xml.rels\");\n  if (wbRels) {\n    for (const child of wbRels.elements ?? []) {\n      if (child.name !== \"Relationship\") continue;\n      const type = attr(child, \"Type\") ?? \"\";\n      const target = attr(child, \"Target\") ?? \"\";\n      if (!target) continue;\n\n      if (type.includes(\"/worksheet\")) {\n        worksheets.push(target.startsWith(\"/\") ? target.slice(1) : `xl/${target}`);\n      }\n    }\n  }\n  sortByNumber(worksheets);\n\n  // Scan for drawings, charts, media\n  drawings.push(...doc.keys(\"xl/drawings/\").filter((k) => k.endsWith(\".xml\")));\n  charts.push(...doc.keys(\"xl/charts/\").filter((k) => k.endsWith(\".xml\")));\n  media.push(...doc.keys(\"xl/media/\"));\n  sortByNumber(drawings);\n  sortByNumber(charts);\n\n  // Root rels → core/app props\n  let coreProps: string | undefined;\n  let appProps: string | undefined;\n  let customProps: string | undefined;\n  const rootRels = doc.get(\"_rels/.rels\");\n  if (rootRels) {\n    for (const child of rootRels.elements ?? []) {\n      if (child.name !== \"Relationship\") continue;\n      const type = attr(child, \"Type\") ?? \"\";\n      const target = attr(child, \"Target\") ?? \"\";\n      if (type.includes(\"/core-properties\")) coreProps = target;\n      else if (type.includes(\"/extended-properties\")) appProps = target;\n      else if (type.includes(\"/custom-properties\")) customProps = target;\n    }\n  }\n\n  return {\n    doc,\n    workbook,\n    worksheets,\n    styles,\n    sharedStrings,\n    partRefs: { worksheets, charts, media, drawings },\n    coreProps,\n    appProps,\n    customProps,\n  };\n}\n\n// ── Shared strings helper ──\n\n/** Extract plain string array from sharedStringsDesc.parse() result. */\nfunction extractStringsFromEntries(parsed: SharedStringsDocOptions): string[] {\n  const strings: string[] = [];\n  for (const entry of parsed.entries) {\n    if (typeof entry === \"string\") {\n      strings.push(entry);\n    } else if (entry.runs && entry.runs.length > 0) {\n      // Rich text: concatenate run texts\n      strings.push(entry.runs.map((r) => r.text).join(\"\"));\n    }\n  }\n  return strings;\n}\n\n/**\n * Parse a .xlsx file and convert it into WorkbookOptions.\n *\n * The returned options can be passed to `new Workbook(parsed)`.\n */\nexport function parseWorkbook(data: DataType): WorkbookOptions {\n  const xlsx = parseXlsx(data);\n\n  const opts: Partial<WorkbookOptions> = {};\n\n  // Core properties\n  if (xlsx.coreProps) {\n    const corePropsEl = xlsx.doc.get(xlsx.coreProps);\n    if (corePropsEl) {\n      const cp = parseCorePropsElement(corePropsEl);\n      if (cp.title) opts.title = cp.title;\n      if (cp.subject) opts.subject = cp.subject;\n      if (cp.creator) opts.creator = cp.creator;\n      if (cp.keywords) opts.keywords = cp.keywords;\n      if (cp.description) opts.description = cp.description;\n      if (cp.lastModifiedBy) opts.lastModifiedBy = cp.lastModifiedBy;\n      if (cp.revision !== undefined) opts.revision = cp.revision;\n      if (cp.lastPrinted) opts.lastPrinted = cp.lastPrinted;\n      if (cp.created) opts.created = cp.created;\n      if (cp.modified) opts.modified = cp.modified;\n    }\n  }\n\n  // Extended (app) properties\n  if (xlsx.appProps) {\n    const appPropsEl = xlsx.doc.get(xlsx.appProps);\n    if (appPropsEl) {\n      const ap = appPropertiesDesc.parse(appPropsEl, {} as ReadContext);\n      if (ap && Object.keys(ap).length > 0) opts.appProperties = ap;\n    }\n  }\n\n  // Custom properties\n  if (xlsx.customProps) {\n    const customPropsEl = xlsx.doc.get(xlsx.customProps);\n    if (customPropsEl) {\n      const cp = customPropertiesDesc.parse(customPropsEl, {} as ReadContext);\n      if (cp.properties?.length) opts.customProperties = cp.properties;\n    }\n  }\n\n  // Shared strings — use descriptor.parse() for richer data, then extract strings for lookup\n  let strings: string[] = [];\n  if (xlsx.sharedStrings) {\n    const parsed = sharedStringsDesc.parse(xlsx.sharedStrings, {} as never);\n    strings = extractStringsFromEntries(parsed);\n  }\n\n  // Create read context for descriptor pipeline\n  const readContext = new XlsxReadContext(xlsx, strings);\n\n  // Parse styles (fonts, fills, borders, cellXfs)\n  if (xlsx.styles) {\n    const parsedStyles = stylesDesc.parse(xlsx.styles, readContext);\n    readContext.parsedStyles = parsedStyles;\n\n    // Expose styles sections onto the returned opts for round-trip. compiler.ts\n    // re-emits dxfs from options; colors/tableStyles/cellStyles/styleExtensions\n    // are surfaced here even though the compiler currently only consumes dxfs,\n    // so callers retain the parsed data and the fields stay documented.\n    if (parsedStyles.dxfs) opts.dxfs = parsedStyles.dxfs;\n    if (parsedStyles.colors) opts.colors = parsedStyles.colors;\n    if (parsedStyles.customCellStyles) opts.cellStyles = parsedStyles.customCellStyles;\n    if (parsedStyles.styleExtensions) opts.styleExtensions = parsedStyles.styleExtensions;\n    if (parsedStyles.tableStylesInfo?.tableStyles)\n      opts.tableStyles = parsedStyles.tableStylesInfo.tableStyles;\n  }\n\n  // Parse workbook via descriptor for richer data\n  let sheetNames: string[] = [];\n  if (xlsx.workbook) {\n    const wbData = workbookDesc.parse(xlsx.workbook, readContext);\n    if (wbData.sheets) sheetNames = wbData.sheets.map((s) => s.name);\n\n    // Workbook-level properties\n    if (wbData.protection) opts.workbookProtection = wbData.protection;\n    if (wbData.bookView) opts.bookView = wbData.bookView;\n    if (wbData.calcPr) opts.calcPr = wbData.calcPr;\n    if (wbData.customViews) opts.customWorkbookViews = wbData.customViews;\n    if (wbData.fileRecoveryPr) opts.fileRecoveryPr = wbData.fileRecoveryPr;\n    if (wbData.functionGroups) opts.functionGroups = wbData.functionGroups;\n    if (wbData.webPublishing) opts.webPublishing = wbData.webPublishing;\n    if (wbData.fileSharing) opts.fileSharing = wbData.fileSharing;\n    if (wbData.workbookPr) opts.workbookPr = wbData.workbookPr;\n    if (wbData.volTypes) opts.volTypes = wbData.volTypes;\n    if (wbData.webPublishObjects) opts.webPublishObjects = wbData.webPublishObjects;\n  }\n\n  // Parse worksheets using descriptor pipeline\n  const worksheets: WorksheetOptions[] = [];\n  for (const [i, wsPath] of xlsx.worksheets.entries()) {\n    const wsEl = xlsx.doc.get(wsPath);\n    if (!wsEl) continue;\n\n    const wsOpts = worksheetDesc.parse(wsEl, readContext);\n    if (sheetNames[i]) wsOpts.name = sheetNames[i];\n\n    // ── Resolve sub-parts via worksheet relationships ──\n\n    // Comments\n    const commentRels = readContext.getWorksheetRelsByType(wsPath, \"/comments\");\n    for (const cr of commentRels) {\n      const commentEl = xlsx.doc.get(cr.target);\n      if (!commentEl) continue;\n      const commentData = commentsDesc.parse(commentEl, readContext);\n      if (commentData.comments) {\n        wsOpts.comments = commentData.comments;\n        break; // one comments file per worksheet\n      }\n    }\n\n    // Drawings (images + charts)\n    const drawingRels = readContext.getWorksheetRelsByType(wsPath, \"/drawing\");\n    for (const dr of drawingRels) {\n      const drawingEl = xlsx.doc.get(dr.target);\n      if (!drawingEl) continue;\n      const drawingData = drawingDesc.parse(drawingEl, readContext);\n      // drawingDesc.parse yields CT-layer shapes (rId-anchored DrawingImage/\n      // DrawingChart), while WorksheetOptions.images/charts are the user-layer\n      // shapes (data bytes / ChartSpace content). The shapes are not\n      // interchangeable — round-trip drawings are lossy — these casts mark the\n      // known impedance, same as wsOpts.pivotTables above.\n      if (drawingData.images)\n        wsOpts.images = drawingData.images as unknown as WorksheetImageOptions[];\n      if (drawingData.charts)\n        wsOpts.charts = drawingData.charts as unknown as WorksheetChartOptions[];\n      break;\n    }\n\n    // Tables\n    const tableRels = readContext.getWorksheetRelsByType(wsPath, \"/table\");\n    if (tableRels.length > 0) {\n      const tables: TableOptions[] = [];\n      for (const tr of tableRels) {\n        const tableEl = xlsx.doc.get(tr.target);\n        if (!tableEl) continue;\n        const tableData = tableDesc.parse(tableEl, readContext);\n        tables.push(tableData);\n      }\n      if (tables.length > 0) wsOpts.tables = tables;\n    }\n\n    // Pivot tables\n    const pivotRels = readContext.getWorksheetRelsByType(wsPath, \"/pivotTable\");\n    if (pivotRels.length > 0) {\n      const pivotTables: PivotTableParseResult[] = [];\n      for (const pr of pivotRels) {\n        const pivotEl = xlsx.doc.get(pr.target);\n        if (!pivotEl) continue;\n        const pivotData = pivotTableDesc.parse(pivotEl, readContext);\n        pivotTables.push(pivotData);\n      }\n      // WorksheetOptions.pivotTables is PivotTableOptions[] (user-layer) for the\n      // compiler's stringify; parse yields the CT-layer PivotTableParseResult.\n      // The shapes are not interchangeable (index-based vs name-based), so\n      // round-trip pivot tables are lossy — this cast marks the known impedance.\n      if (pivotTables.length > 0)\n        wsOpts.pivotTables = pivotTables as unknown as PivotTableOptions[];\n    }\n\n    // Resolve external hyperlink URLs\n    const hyperlinks = wsOpts.hyperlinks;\n    if (hyperlinks) {\n      for (const hl of hyperlinks) {\n        if (hl.target.type === \"external\") {\n          const resolved = readContext.resolveWorksheetRel(wsPath, hl.target.url);\n          if (resolved) hl.target.url = resolved;\n        }\n      }\n    }\n\n    worksheets.push(wsOpts as WorksheetOptions);\n  }\n\n  opts.worksheets = worksheets;\n\n  // Chartsheets — parse chartsheet parts\n  const chartsheetPaths = xlsx.doc.keys(\"xl/chartsheets/\").filter((k) => k.endsWith(\".xml\"));\n  if (chartsheetPaths.length > 0) {\n    const chartsheets: ChartsheetOptions[] = [];\n    for (const [i, csPath] of chartsheetPaths.entries()) {\n      const csEl = xlsx.doc.get(csPath);\n      if (!csEl) continue;\n      const csData = chartsheetDesc.parse(csEl, readContext);\n      if (sheetNames[worksheets.length + i]) csData.name = sheetNames[worksheets.length + i];\n      chartsheets.push(csData);\n    }\n    if (chartsheets.length > 0) opts.chartsheets = chartsheets;\n  }\n\n  // Pivot cache definitions and records\n  const pivotCacheDefPaths = xlsx.doc\n    .keys(\"xl/pivotCache/\")\n    .filter((k) => k.includes(\"pivotCacheDefinition\"));\n  if (pivotCacheDefPaths.length > 0) {\n    const pivotCaches: PivotCacheDefParseResult[] = [];\n    for (const pcdPath of pivotCacheDefPaths) {\n      const pcdEl = xlsx.doc.get(pcdPath);\n      if (!pcdEl) continue;\n      const pcdData = pivotCacheDefDesc.parse(pcdEl, readContext);\n      pivotCaches.push(pcdData);\n    }\n    if (pivotCaches.length > 0) opts.pivotCaches = pivotCaches;\n  }\n\n  const pivotCacheRecPaths = xlsx.doc\n    .keys(\"xl/pivotCache/\")\n    .filter((k) => k.includes(\"pivotCacheRecords\"));\n  if (pivotCacheRecPaths.length > 0) {\n    const pivotCacheRecords: PivotCacheRecordsParseResult[] = [];\n    for (const pcrPath of pivotCacheRecPaths) {\n      const pcrEl = xlsx.doc.get(pcrPath);\n      if (!pcrEl) continue;\n      const pcrData = pivotCacheRecordsDesc.parse(pcrEl, readContext);\n      pivotCacheRecords.push(pcrData);\n    }\n    if (pivotCacheRecords.length > 0) opts.pivotCacheRecords = pivotCacheRecords;\n  }\n\n  // Calculation chain\n  const calcChainEl = xlsx.doc.get(\"xl/calcChain.xml\");\n  if (calcChainEl) {\n    const calcData = calcChainDesc.parse(calcChainEl, readContext);\n    if (calcData.cells) opts.calcChain = calcData.cells;\n  }\n\n  // External links\n  const extLinkPaths = xlsx.doc.keys(\"xl/externalLinks/\").filter((k) => k.endsWith(\".xml\"));\n  if (extLinkPaths.length > 0) {\n    const externalLinks: ExternalLinkOptions[] = [];\n    for (const elPath of extLinkPaths) {\n      const elEl = xlsx.doc.get(elPath);\n      if (!elEl) continue;\n      const elData = externalLinkDesc.parse(elEl, readContext);\n\n      // Resolve the external book target from the sibling rels file\n      // (xl/externalLinks/_rels/externalLinkN.xml.rels), which compiler.ts writes.\n      if (elData.externalBook) {\n        const relsPath = externalLinkRelsPath(elPath);\n        const relsEl = xlsx.doc.get(relsPath);\n        if (relsEl) {\n          for (const child of relsEl.elements ?? []) {\n            if (child.name !== \"Relationship\") continue;\n            const type = attr(child, \"Type\") ?? \"\";\n            if (!type.includes(\"/externalLinkPath\")) continue;\n            const target = attr(child, \"Target\");\n            if (target) {\n              elData.externalBook.target = target;\n              break;\n            }\n          }\n        }\n      }\n\n      externalLinks.push(elData);\n    }\n    if (externalLinks.length > 0) opts.externalLinks = externalLinks;\n  }\n\n  // Shared-workbook revisions: workbook.xml.rels → revisionHeaders/users;\n  // revisionHeaders.xml.rels → per-header revision logs.\n  const wbRelsEl2 = xlsx.doc.get(\"xl/_rels/workbook.xml.rels\");\n  let revHeadersTarget: string | undefined;\n  let usersTarget: string | undefined;\n  if (wbRelsEl2) {\n    for (const child of wbRelsEl2.elements ?? []) {\n      if (child.name !== \"Relationship\") continue;\n      const type = attr(child, \"Type\") ?? \"\";\n      const target = attr(child, \"Target\") ?? \"\";\n      if (type.includes(\"/revisionHeaders\")) revHeadersTarget = target;\n      else if (type.includes(\"/users\")) usersTarget = target;\n    }\n  }\n  if (revHeadersTarget) {\n    const headersPath = revHeadersTarget.startsWith(\"/\")\n      ? revHeadersTarget.slice(1)\n      : `xl/${revHeadersTarget}`;\n    const headersEl = xlsx.doc.get(headersPath);\n    if (headersEl) {\n      const headers = revisionHeadersDesc.parse(headersEl, readContext);\n      const logs: RevisionLogOptions[] = [];\n      const slash = headersPath.lastIndexOf(\"/\");\n      const revHeadersRelsEl = xlsx.doc.get(\n        `${headersPath.slice(0, slash)}/_rels/${headersPath.slice(slash + 1)}.rels`,\n      );\n      if (revHeadersRelsEl) {\n        for (const child of revHeadersRelsEl.elements ?? []) {\n          if (child.name !== \"Relationship\") continue;\n          if (!(attr(child, \"Type\") ?? \"\").includes(\"/revisionLog\")) continue;\n          const t = attr(child, \"Target\");\n          if (!t) continue;\n          const logEl = xlsx.doc.get(t.startsWith(\"/\") ? t.slice(1) : `xl/${t}`);\n          if (logEl) logs.push(revisionLogDesc.parse(logEl, readContext));\n        }\n      }\n      const revisionLog: SharedWorkbookOptions = { headers, logs };\n      if (usersTarget) {\n        const usersEl = xlsx.doc.get(\n          usersTarget.startsWith(\"/\") ? usersTarget.slice(1) : `xl/${usersTarget}`,\n        );\n        if (usersEl) {\n          const users = usersDesc.parse(usersEl, readContext);\n          if (users.users) revisionLog.users = users;\n        }\n      }\n      opts.revisionLog = revisionLog;\n    }\n  }\n\n  return opts as WorkbookOptions;\n}\n"],"mappings":"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"}