@office-kit/xlsx 0.11.0 → 0.11.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.
Files changed (155) hide show
  1. package/README.md +7 -0
  2. package/dist/cell/cell.d.ts +1 -1
  3. package/dist/cell/index.d.ts +4 -4
  4. package/dist/cell/rich-text.d.ts +1 -1
  5. package/dist/cell-BucgGwl3.mjs.map +1 -1
  6. package/dist/cell-style-DuvS_Lsg.mjs.map +1 -1
  7. package/dist/chart/chart-xml.d.ts +1 -1
  8. package/dist/chart/chart.d.ts +3 -3
  9. package/dist/chart/cx/chartex-xml.d.ts +1 -1
  10. package/dist/chart/cx/chartex.d.ts +2 -2
  11. package/dist/chart/index.d.ts +6 -6
  12. package/dist/chart/user-shapes-xml.d.ts +1 -1
  13. package/dist/chart/user-shapes.d.ts +2 -2
  14. package/dist/chart.mjs.map +1 -1
  15. package/dist/chartsheet/chartsheet-xml.d.ts +1 -1
  16. package/dist/chartsheet/chartsheet.d.ts +4 -4
  17. package/dist/chartsheet/index.d.ts +2 -2
  18. package/dist/chartsheet-C3-tqkPy.mjs.map +1 -1
  19. package/dist/coordinate-96Ecci4d.mjs.map +1 -1
  20. package/dist/datetime-B2ySVlXt.mjs.map +1 -1
  21. package/dist/defined-names-CviWmtQg.mjs.map +1 -1
  22. package/dist/differential-DvKU8fJt.mjs.map +1 -1
  23. package/dist/drawing/dml/dml-xml.d.ts +8 -8
  24. package/dist/drawing/dml/effect.d.ts +2 -2
  25. package/dist/drawing/dml/fill.d.ts +1 -1
  26. package/dist/drawing/dml/geometry.d.ts +1 -1
  27. package/dist/drawing/dml/line.d.ts +1 -1
  28. package/dist/drawing/dml/shape-properties.d.ts +5 -5
  29. package/dist/drawing/dml/text.d.ts +4 -4
  30. package/dist/drawing/drawing-xml.d.ts +1 -1
  31. package/dist/drawing/drawing.d.ts +9 -9
  32. package/dist/drawing/index.d.ts +14 -14
  33. package/dist/drawing-BxzLuryn.mjs.map +1 -1
  34. package/dist/drawing.mjs.map +1 -1
  35. package/dist/{escape-DFTE7ZJc.mjs → escape-rnWSPpWY.mjs} +4 -6
  36. package/dist/{escape-DFTE7ZJc.mjs.map → escape-rnWSPpWY.mjs.map} +1 -1
  37. package/dist/formula/tokenizer.d.ts +1 -1
  38. package/dist/formula/translate.d.ts +2 -2
  39. package/dist/io/browser.d.ts +2 -2
  40. package/dist/io/index.d.ts +7 -7
  41. package/dist/io/load.d.ts +4 -4
  42. package/dist/io/node-fs.d.ts +2 -2
  43. package/dist/io/node-save.d.ts +2 -2
  44. package/dist/io/node.d.ts +2 -2
  45. package/dist/io/save.d.ts +2 -2
  46. package/dist/io.mjs +2 -2
  47. package/dist/io.mjs.map +1 -1
  48. package/dist/{load-MyOIjtrU.mjs → load-Bghb1YHY.mjs} +5 -5
  49. package/dist/load-Bghb1YHY.mjs.map +1 -0
  50. package/dist/{manifest-Cm9K7D62.mjs → manifest-pLmx7KYh.mjs} +3 -3
  51. package/dist/manifest-pLmx7KYh.mjs.map +1 -0
  52. package/dist/node.d.ts +3 -3
  53. package/dist/node.mjs +1 -1
  54. package/dist/node.mjs.map +1 -1
  55. package/dist/packaging/core.d.ts +1 -1
  56. package/dist/packaging/custom.d.ts +2 -2
  57. package/dist/packaging/extended.d.ts +2 -2
  58. package/dist/packaging/index.d.ts +10 -10
  59. package/dist/packaging.mjs +1 -1
  60. package/dist/{parser-D3SLaOFe.mjs → parser-By6RWZVW.mjs} +39 -10
  61. package/dist/parser-By6RWZVW.mjs.map +1 -0
  62. package/dist/reader-BNaUTVCy.mjs.map +1 -1
  63. package/dist/{save-2moCT3Af.mjs → save-Bqcf8w3g.mjs} +6 -6
  64. package/dist/save-Bqcf8w3g.mjs.map +1 -0
  65. package/dist/schema/core.d.ts +1 -1
  66. package/dist/schema/index.d.ts +3 -3
  67. package/dist/schema/serialize.d.ts +2 -2
  68. package/dist/serialize-BC2Wu3bR.mjs.map +1 -1
  69. package/dist/{serializer-BtO2TrI7.mjs → serializer-C6nm0mRJ.mjs} +2 -2
  70. package/dist/serializer-C6nm0mRJ.mjs.map +1 -0
  71. package/dist/streaming/index.d.ts +2 -2
  72. package/dist/streaming/read-only.d.ts +4 -4
  73. package/dist/streaming/write-only.d.ts +7 -7
  74. package/dist/streaming.mjs +6 -6
  75. package/dist/streaming.mjs.map +1 -1
  76. package/dist/styles/alignment.schema.d.ts +2 -2
  77. package/dist/styles/borders.d.ts +1 -1
  78. package/dist/styles/borders.schema.d.ts +2 -2
  79. package/dist/styles/cell-style.d.ts +9 -9
  80. package/dist/styles/colors.schema.d.ts +2 -2
  81. package/dist/styles/differential.d.ts +7 -7
  82. package/dist/styles/fills.d.ts +1 -1
  83. package/dist/styles/fills.schema.d.ts +2 -2
  84. package/dist/styles/fonts.d.ts +1 -1
  85. package/dist/styles/fonts.schema.d.ts +2 -2
  86. package/dist/styles/index.d.ts +21 -21
  87. package/dist/styles/named-styles.d.ts +6 -6
  88. package/dist/styles/numbers.schema.d.ts +2 -2
  89. package/dist/styles/protection.schema.d.ts +2 -2
  90. package/dist/styles/stylesheet-reader.d.ts +1 -1
  91. package/dist/styles/stylesheet-writer.d.ts +1 -1
  92. package/dist/styles/stylesheet.d.ts +8 -8
  93. package/dist/{stylesheet-writer-BrOw4jMY.mjs → stylesheet-writer-HxaX7bGy.mjs} +6 -6
  94. package/dist/stylesheet-writer-HxaX7bGy.mjs.map +1 -0
  95. package/dist/table-1P8we2gS.mjs.map +1 -1
  96. package/dist/tree-BX-sRRVp.mjs.map +1 -1
  97. package/dist/user-shapes-DfmCGKB0.mjs.map +1 -1
  98. package/dist/utf8-Tn3nzyik.mjs.map +1 -1
  99. package/dist/utils/escape.d.ts +3 -5
  100. package/dist/utils/index.d.ts +11 -11
  101. package/dist/utils.mjs +1 -1
  102. package/dist/workbook/calc-properties.d.ts +1 -1
  103. package/dist/workbook/defined-names.d.ts +3 -3
  104. package/dist/workbook/index.d.ts +24 -24
  105. package/dist/workbook/protection.d.ts +1 -1
  106. package/dist/workbook/shared-strings.d.ts +2 -2
  107. package/dist/workbook/views.d.ts +1 -1
  108. package/dist/workbook/workbook-properties.d.ts +1 -1
  109. package/dist/workbook/workbook.d.ts +46 -46
  110. package/dist/{workbook-CARZS94U.mjs → workbook-BlZVXiyG.mjs} +3 -3
  111. package/dist/workbook-BlZVXiyG.mjs.map +1 -0
  112. package/dist/workbook.mjs +1 -1
  113. package/dist/workbook.mjs.map +1 -1
  114. package/dist/worksheet/auto-filter.d.ts +1 -1
  115. package/dist/worksheet/cell-range.d.ts +2 -2
  116. package/dist/worksheet/comments-xml.d.ts +1 -1
  117. package/dist/worksheet/conditional-formatting.d.ts +2 -2
  118. package/dist/worksheet/custom-sheet-views.d.ts +2 -2
  119. package/dist/worksheet/data-validations.d.ts +2 -2
  120. package/dist/worksheet/errors.d.ts +1 -1
  121. package/dist/worksheet/hyperlinks.d.ts +1 -1
  122. package/dist/worksheet/index.d.ts +46 -46
  123. package/dist/worksheet/ole-objects.d.ts +1 -1
  124. package/dist/worksheet/page-setup.d.ts +1 -1
  125. package/dist/worksheet/properties.d.ts +1 -1
  126. package/dist/worksheet/protected-ranges.d.ts +1 -1
  127. package/dist/worksheet/protection.d.ts +1 -1
  128. package/dist/worksheet/reader.d.ts +9 -9
  129. package/dist/worksheet/scenarios.d.ts +1 -1
  130. package/dist/worksheet/table-xml.d.ts +1 -1
  131. package/dist/worksheet/table.d.ts +3 -3
  132. package/dist/worksheet/worksheet.d.ts +31 -31
  133. package/dist/worksheet/writer.d.ts +9 -9
  134. package/dist/worksheet-C5Ensf_j.mjs.map +1 -1
  135. package/dist/worksheet.mjs.map +1 -1
  136. package/dist/writer-IyFccCRJ.mjs.map +1 -1
  137. package/dist/xml/index.d.ts +10 -10
  138. package/dist/xml/parser.d.ts +1 -1
  139. package/dist/xml/serializer.d.ts +1 -1
  140. package/dist/xml/stream-writer.d.ts +1 -1
  141. package/dist/xml.mjs +3 -3
  142. package/dist/xml.mjs.map +1 -1
  143. package/dist/zip/decompression-guard.d.ts +1 -1
  144. package/dist/zip/index.d.ts +6 -6
  145. package/dist/zip/random-access-reader.d.ts +2 -2
  146. package/dist/zip/reader.d.ts +2 -2
  147. package/dist/zip/writer.d.ts +1 -1
  148. package/package.json +4 -1
  149. package/dist/load-MyOIjtrU.mjs.map +0 -1
  150. package/dist/manifest-Cm9K7D62.mjs.map +0 -1
  151. package/dist/parser-D3SLaOFe.mjs.map +0 -1
  152. package/dist/save-2moCT3Af.mjs.map +0 -1
  153. package/dist/serializer-BtO2TrI7.mjs.map +0 -1
  154. package/dist/stylesheet-writer-BrOw4jMY.mjs.map +0 -1
  155. package/dist/workbook-CARZS94U.mjs.map +0 -1
@@ -1,6 +1,6 @@
1
- import type { ShapeProperties } from '../drawing/dml/shape-properties';
2
- import type { TextBody } from '../drawing/dml/text';
3
- import type { ChartDrawing } from './user-shapes';
1
+ import type { ShapeProperties } from '../drawing/dml/shape-properties.js';
2
+ import type { TextBody } from '../drawing/dml/text.js';
3
+ import type { ChartDrawing } from './user-shapes.js';
4
4
  export type LegendPosition = 'r' | 't' | 'l' | 'b' | 'tr';
5
5
  export type GroupingType = 'clustered' | 'stacked' | 'percentStacked' | 'standard';
6
6
  export type BarDirection = 'bar' | 'col';
@@ -1,4 +1,4 @@
1
- import type { CxChartSpace } from './chartex';
1
+ import type { CxChartSpace } from './chartex.js';
2
2
  /** Best-effort sniff: returns true if `bytes` starts with a `cx:chartSpace` root. */
3
3
  export declare function isChartExBytes(bytes: Uint8Array | string): boolean;
4
4
  export declare function parseChartExXml(bytes: Uint8Array | string): CxChartSpace;
@@ -1,5 +1,5 @@
1
- import type { ShapeProperties } from '../../drawing/dml/shape-properties';
2
- import type { TextBody } from '../../drawing/dml/text';
1
+ import type { ShapeProperties } from '../../drawing/dml/shape-properties.js';
2
+ import type { TextBody } from '../../drawing/dml/text.js';
3
3
  /** Chartex layout discriminator. Lives on `<cx:series layoutId="...">`. */
4
4
  export type CxLayoutId = 'clusteredColumn' | 'waterfall' | 'sunburst' | 'treemap' | 'boxWhisker' | 'pareto' | 'paretoLine' | 'regionMap' | 'funnel';
5
5
  /** Numeric data point inside a chartex `<cx:numDim>` / `<cx:strDim>` level. */
@@ -1,6 +1,6 @@
1
- export type { Area3DChart, AreaChart, Bar3DChart, BarChart, BarDirection, BarFrame, BarSeries, BubbleChart, BubbleSeries, BubbleSizeRepresents, AxisCrossBetween, AxisCrosses, AxisOrientation, AxisScaling, CategoryAxis, CategoryLabelAlignment, CategoryRef, ChartKind, ChartNumberFormat, ChartSpace, ChartTitle, DateAxis, DataLabel, DataLabelList, DataLabelPosition, DataPoint, DoughnutChart, ErrorBarDirection, ErrorBars, ErrorBarType, ErrorValType, Gridlines, GroupingType, HiLowLines, Layout, LayoutMode, LayoutTarget, Legend, LegendPosition, Line3DChart, LineChart, LineSeries, ManualLayout, Marker, MarkerSymbol, NumericRef, OfPieChart, OfPieType, Pie3DChart, PieChart, PlotArea, RadarChart, RadarStyle, ScatterChart, ScatterSeries, ScatterStyle, SeriesAxis, SplitType, StockChart, Surface3DChart, SurfaceChart, SurfaceFrame, TickLabelPosition, TickMark, TimeUnit, Trendline, TrendlineType, UpDownBars, ValueAxis, View3D, } from './chart';
2
- export { makeArea3DChart, makeAreaChart, makeBar3DChart, makeBarChart, makeBarSeries, makeBubbleChart, makeBubbleSeries, makeChartSpace, makeDoughnutChart, makeLine3DChart, makeLineChart, makeOfPieChart, makePie3DChart, makePieChart, makeRadarChart, makeScatterChart, makeScatterSeries, makeStockChart, makeSurface3DChart, makeSurfaceChart, } from './chart';
3
- export type { CxAxis, CxChart, CxChartData, CxChartSpace, CxData, CxDataLabelPos, CxDataLabels, CxDim, CxExternalData, CxLayoutId, CxLayoutPr, CxLegend, CxNumDim, CxPlotArea, CxPoint, CxSeries, CxStrDim, CxTitle, } from './cx/chartex';
4
- export { makeBoxWhiskerChart, makeCxAxis, makeCxChartSpace, makeCxData, makeCxNumDim, makeCxSeries, makeCxStrDim, makeFunnelChart, makeHistogramChart, makeParetoChart, makeRegionMapChart, makeSunburstChart, makeTreemapChart, makeWaterfallChart, } from './cx/chartex';
5
- export type { ChartDrawing, ChartDrawingPicture, ChartDrawingShape, ChartRelativeMarker, UserShapeAnchor, UserShapeContent, } from './user-shapes';
6
- export { makeAbsSizeAnchor, makeChartDrawing, makeChartShape, makeRelSizeAnchor, } from './user-shapes';
1
+ export type { Area3DChart, AreaChart, Bar3DChart, BarChart, BarDirection, BarFrame, BarSeries, BubbleChart, BubbleSeries, BubbleSizeRepresents, AxisCrossBetween, AxisCrosses, AxisOrientation, AxisScaling, CategoryAxis, CategoryLabelAlignment, CategoryRef, ChartKind, ChartNumberFormat, ChartSpace, ChartTitle, DateAxis, DataLabel, DataLabelList, DataLabelPosition, DataPoint, DoughnutChart, ErrorBarDirection, ErrorBars, ErrorBarType, ErrorValType, Gridlines, GroupingType, HiLowLines, Layout, LayoutMode, LayoutTarget, Legend, LegendPosition, Line3DChart, LineChart, LineSeries, ManualLayout, Marker, MarkerSymbol, NumericRef, OfPieChart, OfPieType, Pie3DChart, PieChart, PlotArea, RadarChart, RadarStyle, ScatterChart, ScatterSeries, ScatterStyle, SeriesAxis, SplitType, StockChart, Surface3DChart, SurfaceChart, SurfaceFrame, TickLabelPosition, TickMark, TimeUnit, Trendline, TrendlineType, UpDownBars, ValueAxis, View3D, } from './chart.js';
2
+ export { makeArea3DChart, makeAreaChart, makeBar3DChart, makeBarChart, makeBarSeries, makeBubbleChart, makeBubbleSeries, makeChartSpace, makeDoughnutChart, makeLine3DChart, makeLineChart, makeOfPieChart, makePie3DChart, makePieChart, makeRadarChart, makeScatterChart, makeScatterSeries, makeStockChart, makeSurface3DChart, makeSurfaceChart, } from './chart.js';
3
+ export type { CxAxis, CxChart, CxChartData, CxChartSpace, CxData, CxDataLabelPos, CxDataLabels, CxDim, CxExternalData, CxLayoutId, CxLayoutPr, CxLegend, CxNumDim, CxPlotArea, CxPoint, CxSeries, CxStrDim, CxTitle, } from './cx/chartex.js';
4
+ export { makeBoxWhiskerChart, makeCxAxis, makeCxChartSpace, makeCxData, makeCxNumDim, makeCxSeries, makeCxStrDim, makeFunnelChart, makeHistogramChart, makeParetoChart, makeRegionMapChart, makeSunburstChart, makeTreemapChart, makeWaterfallChart, } from './cx/chartex.js';
5
+ export type { ChartDrawing, ChartDrawingPicture, ChartDrawingShape, ChartRelativeMarker, UserShapeAnchor, UserShapeContent, } from './user-shapes.js';
6
+ export { makeAbsSizeAnchor, makeChartDrawing, makeChartShape, makeRelSizeAnchor, } from './user-shapes.js';
@@ -1,4 +1,4 @@
1
- import { type ChartDrawing } from './user-shapes';
1
+ import { type ChartDrawing } from './user-shapes.js';
2
2
  export declare function parseUserShapesXml(bytes: Uint8Array | string): ChartDrawing;
3
3
  export declare function serializeUserShapes(d: ChartDrawing): string;
4
4
  export declare function userShapesToBytes(d: ChartDrawing): Uint8Array;
@@ -1,5 +1,5 @@
1
- import type { ShapeProperties, PositiveSize2D } from '../drawing/dml/shape-properties';
2
- import type { TextBody } from '../drawing/dml/text';
1
+ import type { ShapeProperties, PositiveSize2D } from '../drawing/dml/shape-properties.js';
2
+ import type { TextBody } from '../drawing/dml/text.js';
3
3
  /** `<cdr:from>` / `<cdr:to>` marker. Decimal in 0..1. */
4
4
  export interface ChartRelativeMarker {
5
5
  x: number;
@@ -1 +1 @@
1
- {"version":3,"file":"chart.mjs","names":[],"sources":["../src/chart/cx/chartex.ts"],"sourcesContent":["import type { ShapeProperties } from '../../drawing/dml/shape-properties';\nimport type { TextBody } from '../../drawing/dml/text';\n\n// Chartex (cx:) data model.\n//\n// Chartex covers the eight Excel-2016 chart kinds that aren't part of ECMA-376:\n// Sunburst, Treemap, Waterfall, Histogram, Pareto, Funnel, Box-and-Whisker, and\n// Region Map. Unlike the legacy `c:` chart space where each kind has its own\n// `<c:barChart>`/`<c:lineChart>` element, chartex puts the discriminator on the\n// series — `<cx:series layoutId=\"...\">` — and stores all source data once at\n// the top of the document under `<cx:chartData>` so multiple series can share\n// the same numbers.\n\n/** Chartex layout discriminator. Lives on `<cx:series layoutId=\"...\">`. */\nexport type CxLayoutId =\n | 'clusteredColumn'\n | 'waterfall'\n | 'sunburst'\n | 'treemap'\n | 'boxWhisker'\n | 'pareto'\n | 'paretoLine'\n | 'regionMap'\n | 'funnel';\n\n/** Numeric data point inside a chartex `<cx:numDim>` / `<cx:strDim>` level. */\nexport interface CxPoint {\n idx: number;\n v: string;\n}\n\n/** Numeric dimension (val / colorVal / size / x / y). */\nexport interface CxNumDim {\n kind: 'num';\n /** Dimension role attribute (`val`, `colorVal`, `size`, `x`, `y`). */\n type: string;\n /** Cell reference, e.g. `Sheet1!$A$1:$A$5`. */\n f?: string;\n /** Optional `dir=\"col\"|\"row\"` formula direction hint. */\n dir?: 'col' | 'row';\n ptCount?: number;\n pts: CxPoint[];\n formatCode?: string;\n}\n\n/** String dimension (cat / colorStr). */\nexport interface CxStrDim {\n kind: 'str';\n /** Dimension role attribute (`cat`, `colorStr`). */\n type: string;\n f?: string;\n dir?: 'col' | 'row';\n ptCount?: number;\n pts: CxPoint[];\n formatCode?: string;\n}\n\nexport type CxDim = CxNumDim | CxStrDim;\n\n/** Source data block, referenced by `<cx:dataId val=\"N\"/>` on series. */\nexport interface CxData {\n id: number;\n dims: CxDim[];\n}\n\n/** External data linkage (rare — most charts inline the cache). */\nexport interface CxExternalData {\n rId: string;\n autoUpdate?: boolean;\n}\n\nexport interface CxChartData {\n externalData?: CxExternalData;\n data: CxData[];\n}\n\n/** Layout-properties union, keyed on the series' layoutId family. */\nexport type CxLayoutPr =\n | { kind: 'waterfall'; subtotalIdx: number[] }\n | {\n kind: 'binning';\n binCountAuto?: boolean;\n binCount?: number;\n binSize?: number;\n intervalClosed?: 'r' | 'l';\n underflow?: number;\n overflow?: number;\n }\n | { kind: 'parentLabel'; layout: 'overlapping' | 'banner' | 'none' }\n | {\n kind: 'visibility';\n meanLine?: boolean;\n meanMarker?: boolean;\n nonoutliers?: boolean;\n outliers?: boolean;\n quartileMethod?: 'exclusive' | 'inclusive';\n }\n | {\n kind: 'region';\n cultureLanguage?: string;\n cultureRegion?: string;\n projectionType?: 'automatic' | 'mercator' | 'miller' | 'albers';\n regionLabelLayout?: 'none' | 'bestFit' | 'showAll';\n };\n\nexport type CxDataLabelPos = 'ctr' | 'b' | 'l' | 'r' | 't' | 'inEnd' | 'outEnd' | 'inBase';\n\nexport interface CxDataLabels {\n pos?: CxDataLabelPos;\n visibility?: {\n seriesName?: boolean;\n categoryName?: boolean;\n value?: boolean;\n };\n}\n\nexport interface CxSeries {\n layoutId: CxLayoutId;\n hidden?: boolean;\n ownerIdx?: number;\n formatIdx?: number;\n axisIds?: number[];\n /** Series text — typically a cell reference. */\n tx?: { f?: string; v?: string };\n dataLabels?: CxDataLabels;\n /** Numeric id pointing into chartData.data. */\n dataId?: number;\n layoutPr?: CxLayoutPr;\n /** Per-series shape properties (fill / line / effects). */\n spPr?: ShapeProperties;\n /** Per-series default text properties. */\n txPr?: TextBody;\n}\n\nexport interface CxAxis {\n id: number;\n hidden?: boolean;\n /** Continuous (value) axis bounds. */\n valScaling?: { min?: number; max?: number };\n /** Category-axis gap width %. */\n catScalingGapWidth?: number;\n majorGridlines?: boolean;\n title?: CxTitle;\n /** Axis-line / tick formatting. */\n spPr?: ShapeProperties;\n /** Tick-label text formatting. */\n txPr?: TextBody;\n}\n\nexport interface CxTitle {\n pos?: 't' | 'b' | 'l' | 'r';\n align?: 'ctr' | 'l' | 'r';\n overlay?: boolean;\n /** Plain text (rich runs not preserved at this layer). */\n text?: string;\n /** Cell-reference text source. */\n txDataRef?: string;\n /** Title chrome (frame fill / border). */\n spPr?: ShapeProperties;\n /** Title text formatting. */\n txPr?: TextBody;\n}\n\nexport interface CxLegend {\n pos?: 't' | 'b' | 'l' | 'r' | 'tr';\n align?: 'ctr' | 'l' | 'r';\n overlay?: boolean;\n /** Legend chrome (frame fill / border). */\n spPr?: ShapeProperties;\n /** Legend text formatting. */\n txPr?: TextBody;\n}\n\nexport interface CxPlotArea {\n series: CxSeries[];\n axes: CxAxis[];\n /** Plot-surface shape properties (background fill / border line). */\n spPr?: ShapeProperties;\n}\n\nexport interface CxChart {\n title?: CxTitle;\n plotArea: CxPlotArea;\n legend?: CxLegend;\n plotVisOnly?: boolean;\n dispBlanksAs?: 'span' | 'gap' | 'zero';\n}\n\n/** Root model for a chartex `xl/charts/chartN.xml` part. */\nexport interface CxChartSpace {\n kind: 'cxChartSpace';\n chartData: CxChartData;\n chart: CxChart;\n /** Chart-space level shape properties (overall frame). */\n spPr?: ShapeProperties;\n /** Chart-space level default text properties. */\n txPr?: TextBody;\n}\n\n// ---- factories --------------------------------------------------------------\n\nexport const makeCxNumDim = (opts: {\n type: string;\n f?: string;\n dir?: 'col' | 'row';\n ptCount?: number;\n pts?: CxPoint[];\n formatCode?: string;\n}): CxNumDim => ({\n kind: 'num',\n type: opts.type,\n ...(opts.f !== undefined ? { f: opts.f } : {}),\n ...(opts.dir !== undefined ? { dir: opts.dir } : {}),\n ...(opts.ptCount !== undefined ? { ptCount: opts.ptCount } : {}),\n pts: opts.pts ?? [],\n ...(opts.formatCode !== undefined ? { formatCode: opts.formatCode } : {}),\n});\n\nexport const makeCxStrDim = (opts: {\n type: string;\n f?: string;\n dir?: 'col' | 'row';\n ptCount?: number;\n pts?: CxPoint[];\n formatCode?: string;\n}): CxStrDim => ({\n kind: 'str',\n type: opts.type,\n ...(opts.f !== undefined ? { f: opts.f } : {}),\n ...(opts.dir !== undefined ? { dir: opts.dir } : {}),\n ...(opts.ptCount !== undefined ? { ptCount: opts.ptCount } : {}),\n pts: opts.pts ?? [],\n ...(opts.formatCode !== undefined ? { formatCode: opts.formatCode } : {}),\n});\n\nexport const makeCxData = (id: number, dims: CxDim[]): CxData => ({ id, dims });\n\nexport const makeCxSeries = (opts: {\n layoutId: CxLayoutId;\n dataId?: number;\n hidden?: boolean;\n ownerIdx?: number;\n formatIdx?: number;\n axisIds?: number[];\n tx?: { f?: string; v?: string };\n dataLabels?: CxDataLabels;\n layoutPr?: CxLayoutPr;\n spPr?: ShapeProperties;\n txPr?: TextBody;\n}): CxSeries => ({\n layoutId: opts.layoutId,\n ...(opts.hidden !== undefined ? { hidden: opts.hidden } : {}),\n ...(opts.ownerIdx !== undefined ? { ownerIdx: opts.ownerIdx } : {}),\n ...(opts.formatIdx !== undefined ? { formatIdx: opts.formatIdx } : {}),\n ...(opts.axisIds !== undefined ? { axisIds: opts.axisIds } : {}),\n ...(opts.tx ? { tx: opts.tx } : {}),\n ...(opts.dataLabels ? { dataLabels: opts.dataLabels } : {}),\n ...(opts.dataId !== undefined ? { dataId: opts.dataId } : {}),\n ...(opts.layoutPr ? { layoutPr: opts.layoutPr } : {}),\n ...(opts.spPr ? { spPr: opts.spPr } : {}),\n ...(opts.txPr ? { txPr: opts.txPr } : {}),\n});\n\nexport const makeCxAxis = (opts: {\n id: number;\n hidden?: boolean;\n valScaling?: { min?: number; max?: number };\n catScalingGapWidth?: number;\n majorGridlines?: boolean;\n title?: CxTitle;\n spPr?: ShapeProperties;\n txPr?: TextBody;\n}): CxAxis => ({\n id: opts.id,\n ...(opts.hidden !== undefined ? { hidden: opts.hidden } : {}),\n ...(opts.valScaling ? { valScaling: opts.valScaling } : {}),\n ...(opts.catScalingGapWidth !== undefined ? { catScalingGapWidth: opts.catScalingGapWidth } : {}),\n ...(opts.majorGridlines !== undefined ? { majorGridlines: opts.majorGridlines } : {}),\n ...(opts.title ? { title: opts.title } : {}),\n ...(opts.spPr ? { spPr: opts.spPr } : {}),\n ...(opts.txPr ? { txPr: opts.txPr } : {}),\n});\n\nexport const makeCxChartSpace = (opts: {\n series: CxSeries[];\n data?: CxData[];\n axes?: CxAxis[];\n title?: CxTitle;\n legend?: CxLegend;\n plotVisOnly?: boolean;\n dispBlanksAs?: CxChart['dispBlanksAs'];\n externalData?: CxExternalData;\n plotAreaSpPr?: ShapeProperties;\n spPr?: ShapeProperties;\n txPr?: TextBody;\n}): CxChartSpace => ({\n kind: 'cxChartSpace',\n chartData: {\n ...(opts.externalData ? { externalData: opts.externalData } : {}),\n data: opts.data ?? [],\n },\n chart: {\n plotArea: {\n series: opts.series,\n axes: opts.axes ?? [],\n ...(opts.plotAreaSpPr ? { spPr: opts.plotAreaSpPr } : {}),\n },\n ...(opts.title ? { title: opts.title } : {}),\n ...(opts.legend ? { legend: opts.legend } : {}),\n ...(opts.plotVisOnly !== undefined ? { plotVisOnly: opts.plotVisOnly } : {}),\n ...(opts.dispBlanksAs !== undefined ? { dispBlanksAs: opts.dispBlanksAs } : {}),\n },\n ...(opts.spPr ? { spPr: opts.spPr } : {}),\n ...(opts.txPr ? { txPr: opts.txPr } : {}),\n});\n\n// ---- per-kind convenience factories ----------------------------------------\n//\n// Each helper builds a CxChartSpace with one CxData block (id 0) carrying the\n// appropriate dimension shapes for the layoutId. Callers populate the dim point\n// caches directly when they have data on hand.\n\nexport const makeSunburstChart = (opts: { catRef?: string; valRef?: string; valFormatCode?: string }): CxChartSpace =>\n makeCxChartSpace({\n data: [\n makeCxData(0, [\n makeCxStrDim({ type: 'cat', ...(opts.catRef !== undefined ? { f: opts.catRef } : {}) }),\n makeCxNumDim({\n type: 'val',\n ...(opts.valRef !== undefined ? { f: opts.valRef } : {}),\n ...(opts.valFormatCode !== undefined ? { formatCode: opts.valFormatCode } : {}),\n }),\n ]),\n ],\n series: [makeCxSeries({ layoutId: 'sunburst', dataId: 0 })],\n });\n\nexport const makeTreemapChart = (opts: {\n catRef?: string;\n valRef?: string;\n parentLabelLayout?: 'overlapping' | 'banner' | 'none';\n}): CxChartSpace =>\n makeCxChartSpace({\n data: [\n makeCxData(0, [\n makeCxStrDim({ type: 'cat', ...(opts.catRef !== undefined ? { f: opts.catRef } : {}) }),\n makeCxNumDim({ type: 'val', ...(opts.valRef !== undefined ? { f: opts.valRef } : {}) }),\n ]),\n ],\n series: [\n makeCxSeries({\n layoutId: 'treemap',\n dataId: 0,\n layoutPr: { kind: 'parentLabel', layout: opts.parentLabelLayout ?? 'overlapping' },\n }),\n ],\n });\n\nexport const makeWaterfallChart = (opts: { catRef?: string; valRef?: string; subtotalIdx?: number[] }): CxChartSpace =>\n makeCxChartSpace({\n data: [\n makeCxData(0, [\n makeCxStrDim({ type: 'cat', ...(opts.catRef !== undefined ? { f: opts.catRef } : {}) }),\n makeCxNumDim({ type: 'val', ...(opts.valRef !== undefined ? { f: opts.valRef } : {}) }),\n ]),\n ],\n series: [\n makeCxSeries({\n layoutId: 'waterfall',\n dataId: 0,\n axisIds: [0, 1],\n layoutPr: { kind: 'waterfall', subtotalIdx: opts.subtotalIdx ?? [] },\n }),\n ],\n axes: [makeCxAxis({ id: 0 }), makeCxAxis({ id: 1 })],\n });\n\nexport const makeHistogramChart = (opts: {\n valRef?: string;\n binCountAuto?: boolean;\n binCount?: number;\n binSize?: number;\n intervalClosed?: 'r' | 'l';\n underflow?: number;\n overflow?: number;\n}): CxChartSpace =>\n makeCxChartSpace({\n data: [makeCxData(0, [makeCxNumDim({ type: 'val', ...(opts.valRef !== undefined ? { f: opts.valRef } : {}) })])],\n series: [\n makeCxSeries({\n layoutId: 'clusteredColumn',\n dataId: 0,\n axisIds: [0, 1],\n layoutPr: {\n kind: 'binning',\n ...(opts.binCountAuto !== undefined ? { binCountAuto: opts.binCountAuto } : {}),\n ...(opts.binCount !== undefined ? { binCount: opts.binCount } : {}),\n ...(opts.binSize !== undefined ? { binSize: opts.binSize } : {}),\n ...(opts.intervalClosed !== undefined ? { intervalClosed: opts.intervalClosed } : {}),\n ...(opts.underflow !== undefined ? { underflow: opts.underflow } : {}),\n ...(opts.overflow !== undefined ? { overflow: opts.overflow } : {}),\n },\n }),\n ],\n axes: [makeCxAxis({ id: 0 }), makeCxAxis({ id: 1 })],\n });\n\nexport const makeParetoChart = (opts: {\n valRef?: string;\n catRef?: string;\n binCountAuto?: boolean;\n binCount?: number;\n binSize?: number;\n}): CxChartSpace => {\n const dims: CxDim[] = [makeCxNumDim({ type: 'val', ...(opts.valRef !== undefined ? { f: opts.valRef } : {}) })];\n if (opts.catRef !== undefined) dims.unshift(makeCxStrDim({ type: 'cat', f: opts.catRef }));\n return makeCxChartSpace({\n data: [makeCxData(0, dims)],\n series: [\n makeCxSeries({\n layoutId: 'clusteredColumn',\n dataId: 0,\n axisIds: [0, 1],\n layoutPr: {\n kind: 'binning',\n ...(opts.binCountAuto !== undefined ? { binCountAuto: opts.binCountAuto } : {}),\n ...(opts.binCount !== undefined ? { binCount: opts.binCount } : {}),\n ...(opts.binSize !== undefined ? { binSize: opts.binSize } : {}),\n },\n }),\n makeCxSeries({ layoutId: 'paretoLine', dataId: 0, ownerIdx: 0, axisIds: [0, 2] }),\n ],\n axes: [makeCxAxis({ id: 0 }), makeCxAxis({ id: 1 }), makeCxAxis({ id: 2 })],\n });\n};\n\nexport const makeFunnelChart = (opts: { catRef?: string; valRef?: string }): CxChartSpace =>\n makeCxChartSpace({\n data: [\n makeCxData(0, [\n makeCxStrDim({ type: 'cat', ...(opts.catRef !== undefined ? { f: opts.catRef } : {}) }),\n makeCxNumDim({ type: 'val', ...(opts.valRef !== undefined ? { f: opts.valRef } : {}) }),\n ]),\n ],\n series: [makeCxSeries({ layoutId: 'funnel', dataId: 0 })],\n });\n\nexport const makeBoxWhiskerChart = (opts: {\n catRef?: string;\n valRef?: string;\n meanLine?: boolean;\n meanMarker?: boolean;\n outliers?: boolean;\n nonoutliers?: boolean;\n quartileMethod?: 'exclusive' | 'inclusive';\n}): CxChartSpace =>\n makeCxChartSpace({\n data: [\n makeCxData(0, [\n makeCxStrDim({ type: 'cat', ...(opts.catRef !== undefined ? { f: opts.catRef } : {}) }),\n makeCxNumDim({ type: 'val', ...(opts.valRef !== undefined ? { f: opts.valRef } : {}) }),\n ]),\n ],\n series: [\n makeCxSeries({\n layoutId: 'boxWhisker',\n dataId: 0,\n axisIds: [0, 1],\n layoutPr: {\n kind: 'visibility',\n ...(opts.meanLine !== undefined ? { meanLine: opts.meanLine } : {}),\n ...(opts.meanMarker !== undefined ? { meanMarker: opts.meanMarker } : {}),\n ...(opts.outliers !== undefined ? { outliers: opts.outliers } : {}),\n ...(opts.nonoutliers !== undefined ? { nonoutliers: opts.nonoutliers } : {}),\n ...(opts.quartileMethod !== undefined ? { quartileMethod: opts.quartileMethod } : {}),\n },\n }),\n ],\n axes: [makeCxAxis({ id: 0 }), makeCxAxis({ id: 1 })],\n });\n\nexport const makeRegionMapChart = (opts: {\n catRef?: string;\n valRef?: string;\n cultureLanguage?: string;\n cultureRegion?: string;\n projectionType?: 'automatic' | 'mercator' | 'miller' | 'albers';\n regionLabelLayout?: 'none' | 'bestFit' | 'showAll';\n}): CxChartSpace =>\n makeCxChartSpace({\n data: [\n makeCxData(0, [\n makeCxStrDim({ type: 'cat', ...(opts.catRef !== undefined ? { f: opts.catRef } : {}) }),\n makeCxNumDim({ type: 'val', ...(opts.valRef !== undefined ? { f: opts.valRef } : {}) }),\n ]),\n ],\n series: [\n makeCxSeries({\n layoutId: 'regionMap',\n dataId: 0,\n layoutPr: {\n kind: 'region',\n ...(opts.cultureLanguage !== undefined ? { cultureLanguage: opts.cultureLanguage } : {}),\n ...(opts.cultureRegion !== undefined ? { cultureRegion: opts.cultureRegion } : {}),\n ...(opts.projectionType !== undefined ? { projectionType: opts.projectionType } : {}),\n ...(opts.regionLabelLayout !== undefined ? { regionLabelLayout: opts.regionLabelLayout } : {}),\n },\n }),\n ],\n });\n"],"mappings":"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"}
1
+ {"version":3,"file":"chart.mjs","names":[],"sources":["../src/chart/cx/chartex.ts"],"sourcesContent":["import type { ShapeProperties } from '../../drawing/dml/shape-properties.js';\nimport type { TextBody } from '../../drawing/dml/text.js';\n\n// Chartex (cx:) data model.\n//\n// Chartex covers the eight Excel-2016 chart kinds that aren't part of ECMA-376:\n// Sunburst, Treemap, Waterfall, Histogram, Pareto, Funnel, Box-and-Whisker, and\n// Region Map. Unlike the legacy `c:` chart space where each kind has its own\n// `<c:barChart>`/`<c:lineChart>` element, chartex puts the discriminator on the\n// series — `<cx:series layoutId=\"...\">` — and stores all source data once at\n// the top of the document under `<cx:chartData>` so multiple series can share\n// the same numbers.\n\n/** Chartex layout discriminator. Lives on `<cx:series layoutId=\"...\">`. */\nexport type CxLayoutId =\n | 'clusteredColumn'\n | 'waterfall'\n | 'sunburst'\n | 'treemap'\n | 'boxWhisker'\n | 'pareto'\n | 'paretoLine'\n | 'regionMap'\n | 'funnel';\n\n/** Numeric data point inside a chartex `<cx:numDim>` / `<cx:strDim>` level. */\nexport interface CxPoint {\n idx: number;\n v: string;\n}\n\n/** Numeric dimension (val / colorVal / size / x / y). */\nexport interface CxNumDim {\n kind: 'num';\n /** Dimension role attribute (`val`, `colorVal`, `size`, `x`, `y`). */\n type: string;\n /** Cell reference, e.g. `Sheet1!$A$1:$A$5`. */\n f?: string;\n /** Optional `dir=\"col\"|\"row\"` formula direction hint. */\n dir?: 'col' | 'row';\n ptCount?: number;\n pts: CxPoint[];\n formatCode?: string;\n}\n\n/** String dimension (cat / colorStr). */\nexport interface CxStrDim {\n kind: 'str';\n /** Dimension role attribute (`cat`, `colorStr`). */\n type: string;\n f?: string;\n dir?: 'col' | 'row';\n ptCount?: number;\n pts: CxPoint[];\n formatCode?: string;\n}\n\nexport type CxDim = CxNumDim | CxStrDim;\n\n/** Source data block, referenced by `<cx:dataId val=\"N\"/>` on series. */\nexport interface CxData {\n id: number;\n dims: CxDim[];\n}\n\n/** External data linkage (rare — most charts inline the cache). */\nexport interface CxExternalData {\n rId: string;\n autoUpdate?: boolean;\n}\n\nexport interface CxChartData {\n externalData?: CxExternalData;\n data: CxData[];\n}\n\n/** Layout-properties union, keyed on the series' layoutId family. */\nexport type CxLayoutPr =\n | { kind: 'waterfall'; subtotalIdx: number[] }\n | {\n kind: 'binning';\n binCountAuto?: boolean;\n binCount?: number;\n binSize?: number;\n intervalClosed?: 'r' | 'l';\n underflow?: number;\n overflow?: number;\n }\n | { kind: 'parentLabel'; layout: 'overlapping' | 'banner' | 'none' }\n | {\n kind: 'visibility';\n meanLine?: boolean;\n meanMarker?: boolean;\n nonoutliers?: boolean;\n outliers?: boolean;\n quartileMethod?: 'exclusive' | 'inclusive';\n }\n | {\n kind: 'region';\n cultureLanguage?: string;\n cultureRegion?: string;\n projectionType?: 'automatic' | 'mercator' | 'miller' | 'albers';\n regionLabelLayout?: 'none' | 'bestFit' | 'showAll';\n };\n\nexport type CxDataLabelPos = 'ctr' | 'b' | 'l' | 'r' | 't' | 'inEnd' | 'outEnd' | 'inBase';\n\nexport interface CxDataLabels {\n pos?: CxDataLabelPos;\n visibility?: {\n seriesName?: boolean;\n categoryName?: boolean;\n value?: boolean;\n };\n}\n\nexport interface CxSeries {\n layoutId: CxLayoutId;\n hidden?: boolean;\n ownerIdx?: number;\n formatIdx?: number;\n axisIds?: number[];\n /** Series text — typically a cell reference. */\n tx?: { f?: string; v?: string };\n dataLabels?: CxDataLabels;\n /** Numeric id pointing into chartData.data. */\n dataId?: number;\n layoutPr?: CxLayoutPr;\n /** Per-series shape properties (fill / line / effects). */\n spPr?: ShapeProperties;\n /** Per-series default text properties. */\n txPr?: TextBody;\n}\n\nexport interface CxAxis {\n id: number;\n hidden?: boolean;\n /** Continuous (value) axis bounds. */\n valScaling?: { min?: number; max?: number };\n /** Category-axis gap width %. */\n catScalingGapWidth?: number;\n majorGridlines?: boolean;\n title?: CxTitle;\n /** Axis-line / tick formatting. */\n spPr?: ShapeProperties;\n /** Tick-label text formatting. */\n txPr?: TextBody;\n}\n\nexport interface CxTitle {\n pos?: 't' | 'b' | 'l' | 'r';\n align?: 'ctr' | 'l' | 'r';\n overlay?: boolean;\n /** Plain text (rich runs not preserved at this layer). */\n text?: string;\n /** Cell-reference text source. */\n txDataRef?: string;\n /** Title chrome (frame fill / border). */\n spPr?: ShapeProperties;\n /** Title text formatting. */\n txPr?: TextBody;\n}\n\nexport interface CxLegend {\n pos?: 't' | 'b' | 'l' | 'r' | 'tr';\n align?: 'ctr' | 'l' | 'r';\n overlay?: boolean;\n /** Legend chrome (frame fill / border). */\n spPr?: ShapeProperties;\n /** Legend text formatting. */\n txPr?: TextBody;\n}\n\nexport interface CxPlotArea {\n series: CxSeries[];\n axes: CxAxis[];\n /** Plot-surface shape properties (background fill / border line). */\n spPr?: ShapeProperties;\n}\n\nexport interface CxChart {\n title?: CxTitle;\n plotArea: CxPlotArea;\n legend?: CxLegend;\n plotVisOnly?: boolean;\n dispBlanksAs?: 'span' | 'gap' | 'zero';\n}\n\n/** Root model for a chartex `xl/charts/chartN.xml` part. */\nexport interface CxChartSpace {\n kind: 'cxChartSpace';\n chartData: CxChartData;\n chart: CxChart;\n /** Chart-space level shape properties (overall frame). */\n spPr?: ShapeProperties;\n /** Chart-space level default text properties. */\n txPr?: TextBody;\n}\n\n// ---- factories --------------------------------------------------------------\n\nexport const makeCxNumDim = (opts: {\n type: string;\n f?: string;\n dir?: 'col' | 'row';\n ptCount?: number;\n pts?: CxPoint[];\n formatCode?: string;\n}): CxNumDim => ({\n kind: 'num',\n type: opts.type,\n ...(opts.f !== undefined ? { f: opts.f } : {}),\n ...(opts.dir !== undefined ? { dir: opts.dir } : {}),\n ...(opts.ptCount !== undefined ? { ptCount: opts.ptCount } : {}),\n pts: opts.pts ?? [],\n ...(opts.formatCode !== undefined ? { formatCode: opts.formatCode } : {}),\n});\n\nexport const makeCxStrDim = (opts: {\n type: string;\n f?: string;\n dir?: 'col' | 'row';\n ptCount?: number;\n pts?: CxPoint[];\n formatCode?: string;\n}): CxStrDim => ({\n kind: 'str',\n type: opts.type,\n ...(opts.f !== undefined ? { f: opts.f } : {}),\n ...(opts.dir !== undefined ? { dir: opts.dir } : {}),\n ...(opts.ptCount !== undefined ? { ptCount: opts.ptCount } : {}),\n pts: opts.pts ?? [],\n ...(opts.formatCode !== undefined ? { formatCode: opts.formatCode } : {}),\n});\n\nexport const makeCxData = (id: number, dims: CxDim[]): CxData => ({ id, dims });\n\nexport const makeCxSeries = (opts: {\n layoutId: CxLayoutId;\n dataId?: number;\n hidden?: boolean;\n ownerIdx?: number;\n formatIdx?: number;\n axisIds?: number[];\n tx?: { f?: string; v?: string };\n dataLabels?: CxDataLabels;\n layoutPr?: CxLayoutPr;\n spPr?: ShapeProperties;\n txPr?: TextBody;\n}): CxSeries => ({\n layoutId: opts.layoutId,\n ...(opts.hidden !== undefined ? { hidden: opts.hidden } : {}),\n ...(opts.ownerIdx !== undefined ? { ownerIdx: opts.ownerIdx } : {}),\n ...(opts.formatIdx !== undefined ? { formatIdx: opts.formatIdx } : {}),\n ...(opts.axisIds !== undefined ? { axisIds: opts.axisIds } : {}),\n ...(opts.tx ? { tx: opts.tx } : {}),\n ...(opts.dataLabels ? { dataLabels: opts.dataLabels } : {}),\n ...(opts.dataId !== undefined ? { dataId: opts.dataId } : {}),\n ...(opts.layoutPr ? { layoutPr: opts.layoutPr } : {}),\n ...(opts.spPr ? { spPr: opts.spPr } : {}),\n ...(opts.txPr ? { txPr: opts.txPr } : {}),\n});\n\nexport const makeCxAxis = (opts: {\n id: number;\n hidden?: boolean;\n valScaling?: { min?: number; max?: number };\n catScalingGapWidth?: number;\n majorGridlines?: boolean;\n title?: CxTitle;\n spPr?: ShapeProperties;\n txPr?: TextBody;\n}): CxAxis => ({\n id: opts.id,\n ...(opts.hidden !== undefined ? { hidden: opts.hidden } : {}),\n ...(opts.valScaling ? { valScaling: opts.valScaling } : {}),\n ...(opts.catScalingGapWidth !== undefined ? { catScalingGapWidth: opts.catScalingGapWidth } : {}),\n ...(opts.majorGridlines !== undefined ? { majorGridlines: opts.majorGridlines } : {}),\n ...(opts.title ? { title: opts.title } : {}),\n ...(opts.spPr ? { spPr: opts.spPr } : {}),\n ...(opts.txPr ? { txPr: opts.txPr } : {}),\n});\n\nexport const makeCxChartSpace = (opts: {\n series: CxSeries[];\n data?: CxData[];\n axes?: CxAxis[];\n title?: CxTitle;\n legend?: CxLegend;\n plotVisOnly?: boolean;\n dispBlanksAs?: CxChart['dispBlanksAs'];\n externalData?: CxExternalData;\n plotAreaSpPr?: ShapeProperties;\n spPr?: ShapeProperties;\n txPr?: TextBody;\n}): CxChartSpace => ({\n kind: 'cxChartSpace',\n chartData: {\n ...(opts.externalData ? { externalData: opts.externalData } : {}),\n data: opts.data ?? [],\n },\n chart: {\n plotArea: {\n series: opts.series,\n axes: opts.axes ?? [],\n ...(opts.plotAreaSpPr ? { spPr: opts.plotAreaSpPr } : {}),\n },\n ...(opts.title ? { title: opts.title } : {}),\n ...(opts.legend ? { legend: opts.legend } : {}),\n ...(opts.plotVisOnly !== undefined ? { plotVisOnly: opts.plotVisOnly } : {}),\n ...(opts.dispBlanksAs !== undefined ? { dispBlanksAs: opts.dispBlanksAs } : {}),\n },\n ...(opts.spPr ? { spPr: opts.spPr } : {}),\n ...(opts.txPr ? { txPr: opts.txPr } : {}),\n});\n\n// ---- per-kind convenience factories ----------------------------------------\n//\n// Each helper builds a CxChartSpace with one CxData block (id 0) carrying the\n// appropriate dimension shapes for the layoutId. Callers populate the dim point\n// caches directly when they have data on hand.\n\nexport const makeSunburstChart = (opts: { catRef?: string; valRef?: string; valFormatCode?: string }): CxChartSpace =>\n makeCxChartSpace({\n data: [\n makeCxData(0, [\n makeCxStrDim({ type: 'cat', ...(opts.catRef !== undefined ? { f: opts.catRef } : {}) }),\n makeCxNumDim({\n type: 'val',\n ...(opts.valRef !== undefined ? { f: opts.valRef } : {}),\n ...(opts.valFormatCode !== undefined ? { formatCode: opts.valFormatCode } : {}),\n }),\n ]),\n ],\n series: [makeCxSeries({ layoutId: 'sunburst', dataId: 0 })],\n });\n\nexport const makeTreemapChart = (opts: {\n catRef?: string;\n valRef?: string;\n parentLabelLayout?: 'overlapping' | 'banner' | 'none';\n}): CxChartSpace =>\n makeCxChartSpace({\n data: [\n makeCxData(0, [\n makeCxStrDim({ type: 'cat', ...(opts.catRef !== undefined ? { f: opts.catRef } : {}) }),\n makeCxNumDim({ type: 'val', ...(opts.valRef !== undefined ? { f: opts.valRef } : {}) }),\n ]),\n ],\n series: [\n makeCxSeries({\n layoutId: 'treemap',\n dataId: 0,\n layoutPr: { kind: 'parentLabel', layout: opts.parentLabelLayout ?? 'overlapping' },\n }),\n ],\n });\n\nexport const makeWaterfallChart = (opts: { catRef?: string; valRef?: string; subtotalIdx?: number[] }): CxChartSpace =>\n makeCxChartSpace({\n data: [\n makeCxData(0, [\n makeCxStrDim({ type: 'cat', ...(opts.catRef !== undefined ? { f: opts.catRef } : {}) }),\n makeCxNumDim({ type: 'val', ...(opts.valRef !== undefined ? { f: opts.valRef } : {}) }),\n ]),\n ],\n series: [\n makeCxSeries({\n layoutId: 'waterfall',\n dataId: 0,\n axisIds: [0, 1],\n layoutPr: { kind: 'waterfall', subtotalIdx: opts.subtotalIdx ?? [] },\n }),\n ],\n axes: [makeCxAxis({ id: 0 }), makeCxAxis({ id: 1 })],\n });\n\nexport const makeHistogramChart = (opts: {\n valRef?: string;\n binCountAuto?: boolean;\n binCount?: number;\n binSize?: number;\n intervalClosed?: 'r' | 'l';\n underflow?: number;\n overflow?: number;\n}): CxChartSpace =>\n makeCxChartSpace({\n data: [makeCxData(0, [makeCxNumDim({ type: 'val', ...(opts.valRef !== undefined ? { f: opts.valRef } : {}) })])],\n series: [\n makeCxSeries({\n layoutId: 'clusteredColumn',\n dataId: 0,\n axisIds: [0, 1],\n layoutPr: {\n kind: 'binning',\n ...(opts.binCountAuto !== undefined ? { binCountAuto: opts.binCountAuto } : {}),\n ...(opts.binCount !== undefined ? { binCount: opts.binCount } : {}),\n ...(opts.binSize !== undefined ? { binSize: opts.binSize } : {}),\n ...(opts.intervalClosed !== undefined ? { intervalClosed: opts.intervalClosed } : {}),\n ...(opts.underflow !== undefined ? { underflow: opts.underflow } : {}),\n ...(opts.overflow !== undefined ? { overflow: opts.overflow } : {}),\n },\n }),\n ],\n axes: [makeCxAxis({ id: 0 }), makeCxAxis({ id: 1 })],\n });\n\nexport const makeParetoChart = (opts: {\n valRef?: string;\n catRef?: string;\n binCountAuto?: boolean;\n binCount?: number;\n binSize?: number;\n}): CxChartSpace => {\n const dims: CxDim[] = [makeCxNumDim({ type: 'val', ...(opts.valRef !== undefined ? { f: opts.valRef } : {}) })];\n if (opts.catRef !== undefined) dims.unshift(makeCxStrDim({ type: 'cat', f: opts.catRef }));\n return makeCxChartSpace({\n data: [makeCxData(0, dims)],\n series: [\n makeCxSeries({\n layoutId: 'clusteredColumn',\n dataId: 0,\n axisIds: [0, 1],\n layoutPr: {\n kind: 'binning',\n ...(opts.binCountAuto !== undefined ? { binCountAuto: opts.binCountAuto } : {}),\n ...(opts.binCount !== undefined ? { binCount: opts.binCount } : {}),\n ...(opts.binSize !== undefined ? { binSize: opts.binSize } : {}),\n },\n }),\n makeCxSeries({ layoutId: 'paretoLine', dataId: 0, ownerIdx: 0, axisIds: [0, 2] }),\n ],\n axes: [makeCxAxis({ id: 0 }), makeCxAxis({ id: 1 }), makeCxAxis({ id: 2 })],\n });\n};\n\nexport const makeFunnelChart = (opts: { catRef?: string; valRef?: string }): CxChartSpace =>\n makeCxChartSpace({\n data: [\n makeCxData(0, [\n makeCxStrDim({ type: 'cat', ...(opts.catRef !== undefined ? { f: opts.catRef } : {}) }),\n makeCxNumDim({ type: 'val', ...(opts.valRef !== undefined ? { f: opts.valRef } : {}) }),\n ]),\n ],\n series: [makeCxSeries({ layoutId: 'funnel', dataId: 0 })],\n });\n\nexport const makeBoxWhiskerChart = (opts: {\n catRef?: string;\n valRef?: string;\n meanLine?: boolean;\n meanMarker?: boolean;\n outliers?: boolean;\n nonoutliers?: boolean;\n quartileMethod?: 'exclusive' | 'inclusive';\n}): CxChartSpace =>\n makeCxChartSpace({\n data: [\n makeCxData(0, [\n makeCxStrDim({ type: 'cat', ...(opts.catRef !== undefined ? { f: opts.catRef } : {}) }),\n makeCxNumDim({ type: 'val', ...(opts.valRef !== undefined ? { f: opts.valRef } : {}) }),\n ]),\n ],\n series: [\n makeCxSeries({\n layoutId: 'boxWhisker',\n dataId: 0,\n axisIds: [0, 1],\n layoutPr: {\n kind: 'visibility',\n ...(opts.meanLine !== undefined ? { meanLine: opts.meanLine } : {}),\n ...(opts.meanMarker !== undefined ? { meanMarker: opts.meanMarker } : {}),\n ...(opts.outliers !== undefined ? { outliers: opts.outliers } : {}),\n ...(opts.nonoutliers !== undefined ? { nonoutliers: opts.nonoutliers } : {}),\n ...(opts.quartileMethod !== undefined ? { quartileMethod: opts.quartileMethod } : {}),\n },\n }),\n ],\n axes: [makeCxAxis({ id: 0 }), makeCxAxis({ id: 1 })],\n });\n\nexport const makeRegionMapChart = (opts: {\n catRef?: string;\n valRef?: string;\n cultureLanguage?: string;\n cultureRegion?: string;\n projectionType?: 'automatic' | 'mercator' | 'miller' | 'albers';\n regionLabelLayout?: 'none' | 'bestFit' | 'showAll';\n}): CxChartSpace =>\n makeCxChartSpace({\n data: [\n makeCxData(0, [\n makeCxStrDim({ type: 'cat', ...(opts.catRef !== undefined ? { f: opts.catRef } : {}) }),\n makeCxNumDim({ type: 'val', ...(opts.valRef !== undefined ? { f: opts.valRef } : {}) }),\n ]),\n ],\n series: [\n makeCxSeries({\n layoutId: 'regionMap',\n dataId: 0,\n layoutPr: {\n kind: 'region',\n ...(opts.cultureLanguage !== undefined ? { cultureLanguage: opts.cultureLanguage } : {}),\n ...(opts.cultureRegion !== undefined ? { cultureRegion: opts.cultureRegion } : {}),\n ...(opts.projectionType !== undefined ? { projectionType: opts.projectionType } : {}),\n ...(opts.regionLabelLayout !== undefined ? { regionLabelLayout: opts.regionLabelLayout } : {}),\n },\n }),\n ],\n });\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { type Chartsheet } from './chartsheet';
1
+ import { type Chartsheet } from './chartsheet.js';
2
2
  /**
3
3
  * Parse a chartsheet part. Returns a Chartsheet with `title` set to the
4
4
  * provided fallback (Excel doesn't store the display name inside the chartsheet
@@ -1,7 +1,7 @@
1
- import type { Drawing } from '../drawing/drawing';
2
- import type { Color } from '../styles/colors';
3
- import type { HeaderFooter, PageMargins, PageSetup } from '../worksheet/page-setup';
4
- import type { WebPublishItem } from '../worksheet/web-publish';
1
+ import type { Drawing } from '../drawing/drawing.js';
2
+ import type { Color } from '../styles/colors.js';
3
+ import type { HeaderFooter, PageMargins, PageSetup } from '../worksheet/page-setup.js';
4
+ import type { WebPublishItem } from '../worksheet/web-publish.js';
5
5
  /** `<sheetView>` inside `<sheetViews>`. */
6
6
  export interface ChartsheetView {
7
7
  workbookViewId: number;
@@ -1,2 +1,2 @@
1
- export type { Chartsheet, ChartsheetCustomSheetView, ChartsheetDrawingHF, ChartsheetProperties, ChartsheetProtection, ChartsheetView, } from './chartsheet';
2
- export { makeChartsheet, makeChartsheetCustomSheetView } from './chartsheet';
1
+ export type { Chartsheet, ChartsheetCustomSheetView, ChartsheetDrawingHF, ChartsheetProperties, ChartsheetProtection, ChartsheetView, } from './chartsheet.js';
2
+ export { makeChartsheet, makeChartsheetCustomSheetView } from './chartsheet.js';
@@ -1 +1 @@
1
- {"version":3,"file":"chartsheet-C3-tqkPy.mjs","names":[],"sources":["../src/chartsheet/chartsheet.ts"],"sourcesContent":["// Chartsheet model.\n//\n// A chartsheet is a workbook child that holds a single chart instead of cells.\n// It still gets a row in `<sheets>` (with the same r:id + sheetId machinery as\n// a worksheet), but its part lives under `xl/chartsheets/sheetN.xml` and\n// references a drawing via `<drawing r:id=\"...\"/>` carrying an absoluteAnchor\n// with the chart.\n\nimport type { Drawing } from '../drawing/drawing';\nimport type { Color } from '../styles/colors';\nimport type { HeaderFooter, PageMargins, PageSetup } from '../worksheet/page-setup';\nimport type { WebPublishItem } from '../worksheet/web-publish';\n\n/** `<sheetView>` inside `<sheetViews>`. */\nexport interface ChartsheetView {\n workbookViewId: number;\n tabSelected?: boolean;\n zoomScale?: number;\n zoomToFit?: boolean;\n}\n\n/** `<sheetPr>` chartsheet properties. */\nexport interface ChartsheetProperties {\n published?: boolean;\n codeName?: string;\n /**\n * Tab strip colour. Mirrors `SheetProperties.tabColor` on worksheets so the\n * two sheet kinds expose the same colour model (rgb / indexed / theme /\n * auto / tint) instead of forcing callers to special-case chartsheets.\n */\n tabColor?: Color;\n}\n\n/** Subset of `<sheetProtection>` fields we round-trip on chartsheets. */\nexport interface ChartsheetProtection {\n /** Protect content (chart elements / text). */\n content?: boolean;\n /** Protect drawing objects (shapes / annotations). */\n objects?: boolean;\n algorithmName?: string;\n hashValue?: string;\n saltValue?: string;\n spinCount?: number;\n}\n\nexport interface Chartsheet {\n /** Display title shown in Excel's tab strip. Mirrors Worksheet.title for SheetRef compatibility. */\n title: string;\n views: ChartsheetView[];\n properties?: ChartsheetProperties;\n protection?: ChartsheetProtection;\n /**\n * Drawing payload — typically a single absoluteAnchor with a chart\n * graphicFrame. Mirrors Worksheet.drawing so the existing drawing-XML helpers\n * can be reused.\n */\n drawing?: Drawing;\n /** `<pageMargins>` — six required margins in inches. */\n pageMargins?: PageMargins;\n /** `<pageSetup>` — paper size / orientation / scale / fitToPage. */\n pageSetup?: PageSetup;\n /** `<headerFooter>` — odd/even/first header + footer mini-format strings. */\n headerFooter?: HeaderFooter;\n /** `<legacyDrawing r:id=\"…\"/>` — VML drawing for comments / form-control overlay. */\n legacyDrawingRId?: string;\n /** `<legacyDrawingHF r:id=\"…\"/>` — VML drawing for header/footer print background. */\n legacyDrawingHFRId?: string;\n /**\n * `<drawingHF r:id=\"…\" lho=\"N\" cho=\"N\" lhe=\"N\" che=\"N\" lhf=\"N\" chf=\"N\"\n * rho=\"N\" cho2=\"N\" rhe=\"N\" che2=\"N\" rhf=\"N\" chf2=\"N\" lfo=\"N\" cfo=\"N\" lfe=\"N\"\n * cfe=\"N\" lff=\"N\" cff=\"N\" rfo=\"N\" cfo2=\"N\" rfe=\"N\" cfe2=\"N\" rff=\"N\"\n * cff2=\"N\"/>` — drawing slot + per-section image indices for header/footer\n * print backgrounds (DrawingML rather than VML).\n */\n drawingHF?: ChartsheetDrawingHF;\n /** `<picture r:id=\"…\"/>` — chartsheet background image. */\n backgroundPictureRId?: string;\n /** `<webPublishItems>` — Excel 2007 \"Publish to web\" entries (rare on chartsheets). */\n webPublishItems: WebPublishItem[];\n /**\n * `<customSheetViews>` — saved per-user view presets for this chartsheet\n * (Shared Workbook era). Each entry can carry its own page margins / setup /\n * header-footer.\n */\n customSheetViews: ChartsheetCustomSheetView[];\n}\n\n/** One `<customSheetView>` entry inside a chartsheet. */\nexport interface ChartsheetCustomSheetView {\n guid: string;\n scale?: number;\n state?: 'visible' | 'hidden' | 'veryHidden';\n zoomToFit?: boolean;\n pageMargins?: PageMargins;\n pageSetup?: PageSetup;\n headerFooter?: HeaderFooter;\n}\n\nexport const makeChartsheetCustomSheetView = (\n opts: Partial<ChartsheetCustomSheetView> & { guid: string },\n): ChartsheetCustomSheetView => ({\n guid: opts.guid,\n ...(opts.scale !== undefined ? { scale: opts.scale } : {}),\n ...(opts.state !== undefined ? { state: opts.state } : {}),\n ...(opts.zoomToFit !== undefined ? { zoomToFit: opts.zoomToFit } : {}),\n ...(opts.pageMargins !== undefined ? { pageMargins: opts.pageMargins } : {}),\n ...(opts.pageSetup !== undefined ? { pageSetup: opts.pageSetup } : {}),\n ...(opts.headerFooter !== undefined ? { headerFooter: opts.headerFooter } : {}),\n});\n\n/**\n * `<drawingHF>` — per-section image-index map for the header/footer drawing\n * reference. Each `*o` / `*e` / `*f` attr is a 1-based image number into the\n * referenced drawing part. All optional.\n */\nexport interface ChartsheetDrawingHF {\n /** Required rels link to xl/drawings/drawingN.xml carrying the actual image refs. */\n rId: string;\n /** Left-header image index for odd pages. */\n lho?: number;\n cho?: number;\n rho?: number;\n /** Left-header image index for even pages. */\n lhe?: number;\n che?: number;\n rhe?: number;\n /** Left-header image index for the first page (when differentFirst). */\n lhf?: number;\n chf?: number;\n rhf?: number;\n /** Left-footer image index for odd pages. */\n lfo?: number;\n cfo?: number;\n rfo?: number;\n /** Left-footer image index for even pages. */\n lfe?: number;\n cfe?: number;\n rfe?: number;\n /** Left-footer image index for first page. */\n lff?: number;\n cff?: number;\n rff?: number;\n}\n\nexport const makeChartsheet = (title: string): Chartsheet => ({\n title,\n views: [{ workbookViewId: 0, zoomToFit: true }],\n webPublishItems: [],\n customSheetViews: [],\n});\n"],"mappings":";AAkGA,MAAa,iCACX,UAC+B;CAC/B,MAAM,KAAK;CACX,GAAI,KAAK,UAAU,KAAA,IAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;CACxD,GAAI,KAAK,UAAU,KAAA,IAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;CACxD,GAAI,KAAK,cAAc,KAAA,IAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;CACpE,GAAI,KAAK,gBAAgB,KAAA,IAAY,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;CAC1E,GAAI,KAAK,cAAc,KAAA,IAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;CACpE,GAAI,KAAK,iBAAiB,KAAA,IAAY,EAAE,cAAc,KAAK,aAAa,IAAI,CAAC;AAC/E;AAoCA,MAAa,kBAAkB,WAA+B;CAC5D;CACA,OAAO,CAAC;EAAE,gBAAgB;EAAG,WAAW;CAAK,CAAC;CAC9C,iBAAiB,CAAC;CAClB,kBAAkB,CAAC;AACrB"}
1
+ {"version":3,"file":"chartsheet-C3-tqkPy.mjs","names":[],"sources":["../src/chartsheet/chartsheet.ts"],"sourcesContent":["// Chartsheet model.\n//\n// A chartsheet is a workbook child that holds a single chart instead of cells.\n// It still gets a row in `<sheets>` (with the same r:id + sheetId machinery as\n// a worksheet), but its part lives under `xl/chartsheets/sheetN.xml` and\n// references a drawing via `<drawing r:id=\"...\"/>` carrying an absoluteAnchor\n// with the chart.\n\nimport type { Drawing } from '../drawing/drawing.js';\nimport type { Color } from '../styles/colors.js';\nimport type { HeaderFooter, PageMargins, PageSetup } from '../worksheet/page-setup.js';\nimport type { WebPublishItem } from '../worksheet/web-publish.js';\n\n/** `<sheetView>` inside `<sheetViews>`. */\nexport interface ChartsheetView {\n workbookViewId: number;\n tabSelected?: boolean;\n zoomScale?: number;\n zoomToFit?: boolean;\n}\n\n/** `<sheetPr>` chartsheet properties. */\nexport interface ChartsheetProperties {\n published?: boolean;\n codeName?: string;\n /**\n * Tab strip colour. Mirrors `SheetProperties.tabColor` on worksheets so the\n * two sheet kinds expose the same colour model (rgb / indexed / theme /\n * auto / tint) instead of forcing callers to special-case chartsheets.\n */\n tabColor?: Color;\n}\n\n/** Subset of `<sheetProtection>` fields we round-trip on chartsheets. */\nexport interface ChartsheetProtection {\n /** Protect content (chart elements / text). */\n content?: boolean;\n /** Protect drawing objects (shapes / annotations). */\n objects?: boolean;\n algorithmName?: string;\n hashValue?: string;\n saltValue?: string;\n spinCount?: number;\n}\n\nexport interface Chartsheet {\n /** Display title shown in Excel's tab strip. Mirrors Worksheet.title for SheetRef compatibility. */\n title: string;\n views: ChartsheetView[];\n properties?: ChartsheetProperties;\n protection?: ChartsheetProtection;\n /**\n * Drawing payload — typically a single absoluteAnchor with a chart\n * graphicFrame. Mirrors Worksheet.drawing so the existing drawing-XML helpers\n * can be reused.\n */\n drawing?: Drawing;\n /** `<pageMargins>` — six required margins in inches. */\n pageMargins?: PageMargins;\n /** `<pageSetup>` — paper size / orientation / scale / fitToPage. */\n pageSetup?: PageSetup;\n /** `<headerFooter>` — odd/even/first header + footer mini-format strings. */\n headerFooter?: HeaderFooter;\n /** `<legacyDrawing r:id=\"…\"/>` — VML drawing for comments / form-control overlay. */\n legacyDrawingRId?: string;\n /** `<legacyDrawingHF r:id=\"…\"/>` — VML drawing for header/footer print background. */\n legacyDrawingHFRId?: string;\n /**\n * `<drawingHF r:id=\"…\" lho=\"N\" cho=\"N\" lhe=\"N\" che=\"N\" lhf=\"N\" chf=\"N\"\n * rho=\"N\" cho2=\"N\" rhe=\"N\" che2=\"N\" rhf=\"N\" chf2=\"N\" lfo=\"N\" cfo=\"N\" lfe=\"N\"\n * cfe=\"N\" lff=\"N\" cff=\"N\" rfo=\"N\" cfo2=\"N\" rfe=\"N\" cfe2=\"N\" rff=\"N\"\n * cff2=\"N\"/>` — drawing slot + per-section image indices for header/footer\n * print backgrounds (DrawingML rather than VML).\n */\n drawingHF?: ChartsheetDrawingHF;\n /** `<picture r:id=\"…\"/>` — chartsheet background image. */\n backgroundPictureRId?: string;\n /** `<webPublishItems>` — Excel 2007 \"Publish to web\" entries (rare on chartsheets). */\n webPublishItems: WebPublishItem[];\n /**\n * `<customSheetViews>` — saved per-user view presets for this chartsheet\n * (Shared Workbook era). Each entry can carry its own page margins / setup /\n * header-footer.\n */\n customSheetViews: ChartsheetCustomSheetView[];\n}\n\n/** One `<customSheetView>` entry inside a chartsheet. */\nexport interface ChartsheetCustomSheetView {\n guid: string;\n scale?: number;\n state?: 'visible' | 'hidden' | 'veryHidden';\n zoomToFit?: boolean;\n pageMargins?: PageMargins;\n pageSetup?: PageSetup;\n headerFooter?: HeaderFooter;\n}\n\nexport const makeChartsheetCustomSheetView = (\n opts: Partial<ChartsheetCustomSheetView> & { guid: string },\n): ChartsheetCustomSheetView => ({\n guid: opts.guid,\n ...(opts.scale !== undefined ? { scale: opts.scale } : {}),\n ...(opts.state !== undefined ? { state: opts.state } : {}),\n ...(opts.zoomToFit !== undefined ? { zoomToFit: opts.zoomToFit } : {}),\n ...(opts.pageMargins !== undefined ? { pageMargins: opts.pageMargins } : {}),\n ...(opts.pageSetup !== undefined ? { pageSetup: opts.pageSetup } : {}),\n ...(opts.headerFooter !== undefined ? { headerFooter: opts.headerFooter } : {}),\n});\n\n/**\n * `<drawingHF>` — per-section image-index map for the header/footer drawing\n * reference. Each `*o` / `*e` / `*f` attr is a 1-based image number into the\n * referenced drawing part. All optional.\n */\nexport interface ChartsheetDrawingHF {\n /** Required rels link to xl/drawings/drawingN.xml carrying the actual image refs. */\n rId: string;\n /** Left-header image index for odd pages. */\n lho?: number;\n cho?: number;\n rho?: number;\n /** Left-header image index for even pages. */\n lhe?: number;\n che?: number;\n rhe?: number;\n /** Left-header image index for the first page (when differentFirst). */\n lhf?: number;\n chf?: number;\n rhf?: number;\n /** Left-footer image index for odd pages. */\n lfo?: number;\n cfo?: number;\n rfo?: number;\n /** Left-footer image index for even pages. */\n lfe?: number;\n cfe?: number;\n rfe?: number;\n /** Left-footer image index for first page. */\n lff?: number;\n cff?: number;\n rff?: number;\n}\n\nexport const makeChartsheet = (title: string): Chartsheet => ({\n title,\n views: [{ workbookViewId: 0, zoomToFit: true }],\n webPublishItems: [],\n customSheetViews: [],\n});\n"],"mappings":";AAkGA,MAAa,iCACX,UAC+B;CAC/B,MAAM,KAAK;CACX,GAAI,KAAK,UAAU,KAAA,IAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;CACxD,GAAI,KAAK,UAAU,KAAA,IAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;CACxD,GAAI,KAAK,cAAc,KAAA,IAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;CACpE,GAAI,KAAK,gBAAgB,KAAA,IAAY,EAAE,aAAa,KAAK,YAAY,IAAI,CAAC;CAC1E,GAAI,KAAK,cAAc,KAAA,IAAY,EAAE,WAAW,KAAK,UAAU,IAAI,CAAC;CACpE,GAAI,KAAK,iBAAiB,KAAA,IAAY,EAAE,cAAc,KAAK,aAAa,IAAI,CAAC;AAC/E;AAoCA,MAAa,kBAAkB,WAA+B;CAC5D;CACA,OAAO,CAAC;EAAE,gBAAgB;EAAG,WAAW;CAAK,CAAC;CAC9C,iBAAiB,CAAC;CAClB,kBAAkB,CAAC;AACrB"}
@@ -1 +1 @@
1
- {"version":3,"file":"coordinate-96Ecci4d.mjs","names":[],"sources":["../src/utils/coordinate.ts"],"sourcesContent":["// Worksheet coordinate utilities. Mirrors openpyxl/openpyxl/utils/cell.py.\n//\n// These functions are on the worksheet read/write hot path (millions of calls\n// when streaming a sheet) so the implementations stay branch-light, regex-based\n// only at the entry points, with bounded Map caches for the bidirectional\n// column letter <-> index mapping.\n\nimport { OpenXmlSchemaError } from './exceptions';\n\n/** Maximum column index Excel accepts (XFD). */\nexport const MAX_COL = 16384;\n/** Maximum row index Excel accepts. */\nexport const MAX_ROW = 1048576;\n\n// ---- column letter <-> 1-based index ---------------------------------------\n\nconst indexByLetter = new Map<string, number>();\nconst letterByIndex = new Map<number, string>();\n\n/**\n * 1-based column index → spreadsheet column letter (\"A\", \"Z\", \"AA\", \"XFD\").\n * Throws OpenXmlSchemaError when out of range.\n */\nexport function columnLetterFromIndex(n: number): string {\n const cached = letterByIndex.get(n);\n if (cached !== undefined) return cached;\n if (!Number.isInteger(n) || n < 1 || n > MAX_COL) {\n throw new OpenXmlSchemaError(`column index ${n} is out of range [1, ${MAX_COL}]`);\n }\n let m = n;\n let out = '';\n while (m > 0) {\n m -= 1; // shift to 0-based for the modulo\n out = String.fromCharCode(65 + (m % 26)) + out;\n m = Math.floor(m / 26);\n }\n letterByIndex.set(n, out);\n return out;\n}\n\n/**\n * Column letter → 1-based column index. Case-insensitive but at most 3 letters\n * (the spec ceiling). Throws on empty / non-A-Z / over-range.\n */\nexport function columnIndexFromLetter(letter: string): number {\n const cached = indexByLetter.get(letter);\n if (cached !== undefined) return cached;\n if (letter.length === 0 || letter.length > 3) {\n throw new OpenXmlSchemaError(`column letter \"${letter}\" is empty or too long`);\n }\n let n = 0;\n for (let i = 0; i < letter.length; i++) {\n const c = letter.charCodeAt(i);\n let v: number;\n if (c >= 65 && c <= 90)\n v = c - 64; // 'A' = 65\n else if (c >= 97 && c <= 122)\n v = c - 96; // 'a' = 97\n else throw new OpenXmlSchemaError(`column letter \"${letter}\" contains non-letter char`);\n n = n * 26 + v;\n }\n if (n < 1 || n > MAX_COL) {\n throw new OpenXmlSchemaError(`column letter \"${letter}\" expands to out-of-range index ${n}`);\n }\n // Normalise the cache key to upper-case so 'a' / 'A' share a slot.\n const key = letter.toUpperCase();\n indexByLetter.set(key, n);\n if (key !== letter) indexByLetter.set(letter, n);\n return n;\n}\n\n// ---- coordinate parsing ----------------------------------------------------\n\n/** A single-cell coordinate split into its letter and 1-based row. */\nexport interface CellCoordinate {\n column: string;\n row: number;\n}\n\n/** A single-cell coordinate split into 1-based numeric (col, row). */\nexport interface CellCoordinateNumeric {\n col: number;\n row: number;\n}\n\n/** A 1-based rectangular boundary. */\nexport interface CellRangeBoundaries {\n minCol: number;\n minRow: number;\n maxCol: number;\n maxRow: number;\n}\n\nconst COORD_RE = /^[$]?([A-Za-z]{1,3})[$]?([1-9][0-9]*)$/;\nconst COL_RANGE_RE = /^[$]?([A-Za-z]{1,3}):[$]?([A-Za-z]{1,3})$/;\nconst ROW_RANGE_RE = /^[$]?([1-9][0-9]*):[$]?([1-9][0-9]*)$/;\nconst SHEET_RANGE_RE = /^(?:'((?:[^']|'')+)'|([^'!]+))!(.+)$/;\n\n/**\n * Parse a single-cell coordinate string (\"A1\", \"$XFD$1048576\") into its column\n * letter (always uppercased) and 1-based row.\n */\nexport function coordinateFromString(coord: string): CellCoordinate {\n const m = COORD_RE.exec(coord);\n if (m === null || m[1] === undefined || m[2] === undefined) {\n throw new OpenXmlSchemaError(`coordinateFromString: invalid coordinate \"${coord}\"`);\n }\n const column = m[1].toUpperCase();\n const row = Number.parseInt(m[2], 10);\n if (row < 1 || row > MAX_ROW) {\n throw new OpenXmlSchemaError(`coordinateFromString: row ${row} out of range`);\n }\n // Validate column upper bound through the cached helper.\n columnIndexFromLetter(column);\n return { column, row };\n}\n\n/**\n * Same as {@link coordinateFromString} but returning the column as its 1-based\n * numeric index. Thin convenience for the worksheet read path.\n */\nexport function coordinateToTuple(coord: string): CellCoordinateNumeric {\n const c = coordinateFromString(coord);\n return { col: columnIndexFromLetter(c.column), row: c.row };\n}\n\n/** Compose `\"A1\"` from a 1-based (col, row). */\nexport function tupleToCoordinate(col: number, row: number): string {\n if (!Number.isInteger(row) || row < 1 || row > MAX_ROW) {\n throw new OpenXmlSchemaError(`tupleToCoordinate: row ${row} out of range`);\n }\n return `${columnLetterFromIndex(col)}${row}`;\n}\n\n/**\n * Predicate: true iff `s` is a valid single-cell A1 coordinate (`\"A1\"`,\n * `\"XFD1048576\"`). Strings with `$` absolute markers, surrounding whitespace,\n * ranges (`A1:B2`), or out-of-bound row / column return false. Useful for\n * sanitising user input before passing to {@link coordinateToTuple} or\n * `setCellByCoord`.\n */\nexport function isValidCellRef(s: unknown): s is string {\n if (typeof s !== 'string') return false;\n const m = /^([A-Za-z]{1,3})([1-9][0-9]*)$/.exec(s);\n if (!m) return false;\n const colStr = m[1];\n const rowStr = m[2];\n if (colStr === undefined || rowStr === undefined) return false;\n const col = columnIndexFromLetterUnchecked(colStr);\n if (col < 1 || col > MAX_COL) return false;\n const row = Number.parseInt(rowStr, 10);\n if (!Number.isFinite(row) || row < 1 || row > MAX_ROW) return false;\n return true;\n}\n\n/**\n * Predicate: true iff `s` is a valid A1-style range expression — single cell,\n * two-corner range, whole column (`A:A`), or whole row (`1:1`). `$` markers,\n * whitespace, and out-of-bound bounds fail. Sanity-check before {@link\n * rangeBoundaries} / `parseRange`.\n */\nexport function isValidRangeRef(s: unknown): s is string {\n if (typeof s !== 'string' || s.length === 0) return false;\n if (isValidCellRef(s)) return true;\n const ab = /^([A-Za-z]{1,3})([1-9][0-9]*):([A-Za-z]{1,3})([1-9][0-9]*)$/.exec(s);\n if (ab) {\n const [, c1, r1, c2, r2] = ab;\n if (!c1 || !r1 || !c2 || !r2) return false;\n const col1 = columnIndexFromLetterUnchecked(c1);\n const col2 = columnIndexFromLetterUnchecked(c2);\n if (col1 < 1 || col1 > MAX_COL || col2 < 1 || col2 > MAX_COL) return false;\n const row1 = Number.parseInt(r1, 10);\n const row2 = Number.parseInt(r2, 10);\n return row1 >= 1 && row1 <= MAX_ROW && row2 >= 1 && row2 <= MAX_ROW;\n }\n const cc = /^([A-Za-z]{1,3}):([A-Za-z]{1,3})$/.exec(s);\n if (cc) {\n const [, c1, c2] = cc;\n if (!c1 || !c2) return false;\n const col1 = columnIndexFromLetterUnchecked(c1);\n const col2 = columnIndexFromLetterUnchecked(c2);\n return col1 >= 1 && col1 <= MAX_COL && col2 >= 1 && col2 <= MAX_COL;\n }\n const rr = /^([1-9][0-9]*):([1-9][0-9]*)$/.exec(s);\n if (rr) {\n const [, r1, r2] = rr;\n if (!r1 || !r2) return false;\n const row1 = Number.parseInt(r1, 10);\n const row2 = Number.parseInt(r2, 10);\n return row1 >= 1 && row1 <= MAX_ROW && row2 >= 1 && row2 <= MAX_ROW;\n }\n return false;\n}\n\nconst columnIndexFromLetterUnchecked = (letters: string): number => {\n let n = 0;\n const upper = letters.toUpperCase();\n for (let i = 0; i < upper.length; i++) {\n const ch = upper.charCodeAt(i);\n if (ch < 65 || ch > 90) return -1;\n n = n * 26 + (ch - 64);\n }\n return n;\n};\n\n/**\n * Predicate: true iff `s` is a valid 1..3-char column letter (`\"A\"` through\n * `\"XFD\"`, case-insensitive). Empty / over-long / out-of-bound / non-string\n * fails.\n */\nexport function isValidColumnLetter(s: unknown): s is string {\n if (typeof s !== 'string' || s.length === 0 || s.length > 3) return false;\n if (!/^[A-Za-z]+$/.test(s)) return false;\n const col = columnIndexFromLetterUnchecked(s);\n return col >= 1 && col <= MAX_COL;\n}\n\n/**\n * Predicate: true iff `n` is a valid 1-based row index in `[1, 1048576]`.\n * Non-finite / non-integer / out-of-bound fails.\n */\nexport function isValidRowNumber(n: unknown): n is number {\n return typeof n === 'number' && Number.isInteger(n) && n >= 1 && n <= MAX_ROW;\n}\n\n/**\n * Predicate: true iff `n` is a valid 1-based column index in `[1, 16384]`.\n * Non-finite / non-integer / out-of-bound fails.\n */\nexport function isValidColumnNumber(n: unknown): n is number {\n return typeof n === 'number' && Number.isInteger(n) && n >= 1 && n <= MAX_COL;\n}\n\n/**\n * Parse \"A1:B5\" / \"A:A\" / \"1:1\" / single-cell into 1-based (minCol, minRow,\n * maxCol, maxRow). Whole-column ranges fill rows to [1, MAX_ROW]; whole-row\n * ranges fill cols to [1, MAX_COL].\n */\nexport function rangeBoundaries(range: string): CellRangeBoundaries {\n const trimmed = range.trim();\n if (trimmed.length === 0) throw new OpenXmlSchemaError('rangeBoundaries: empty range');\n\n const colon = trimmed.indexOf(':');\n if (colon < 0) {\n // Single-cell shorthand: \"A1\" → A1:A1.\n const c = coordinateFromString(trimmed);\n const col = columnIndexFromLetter(c.column);\n return { minCol: col, minRow: c.row, maxCol: col, maxRow: c.row };\n }\n\n const left = trimmed.slice(0, colon);\n const right = trimmed.slice(colon + 1);\n\n const colsOnly = COL_RANGE_RE.exec(trimmed);\n if (colsOnly !== null && colsOnly[1] !== undefined && colsOnly[2] !== undefined) {\n const minCol = columnIndexFromLetter(colsOnly[1]);\n const maxCol = columnIndexFromLetter(colsOnly[2]);\n return {\n minCol: Math.min(minCol, maxCol),\n minRow: 1,\n maxCol: Math.max(minCol, maxCol),\n maxRow: MAX_ROW,\n };\n }\n\n const rowsOnly = ROW_RANGE_RE.exec(trimmed);\n if (rowsOnly !== null && rowsOnly[1] !== undefined && rowsOnly[2] !== undefined) {\n const minRow = Number.parseInt(rowsOnly[1], 10);\n const maxRow = Number.parseInt(rowsOnly[2], 10);\n if (minRow < 1 || maxRow < 1 || minRow > MAX_ROW || maxRow > MAX_ROW) {\n throw new OpenXmlSchemaError(`rangeBoundaries: row out of range in \"${trimmed}\"`);\n }\n return {\n minCol: 1,\n minRow: Math.min(minRow, maxRow),\n maxCol: MAX_COL,\n maxRow: Math.max(minRow, maxRow),\n };\n }\n\n const a = coordinateFromString(left);\n const b = coordinateFromString(right);\n const ac = columnIndexFromLetter(a.column);\n const bc = columnIndexFromLetter(b.column);\n return {\n minCol: Math.min(ac, bc),\n minRow: Math.min(a.row, b.row),\n maxCol: Math.max(ac, bc),\n maxRow: Math.max(a.row, b.row),\n };\n}\n\n/** Inverse of {@link rangeBoundaries} for the rectangular case. */\nexport function boundariesToRangeString(b: CellRangeBoundaries): string {\n const tl = tupleToCoordinate(b.minCol, b.minRow);\n if (b.minCol === b.maxCol && b.minRow === b.maxRow) return tl;\n const br = tupleToCoordinate(b.maxCol, b.maxRow);\n return `${tl}:${br}`;\n}\n\n/**\n * Parse a sheet-qualified range (\"Sheet1!A1:B5\" / \"'Quarter 1'!A1\"). Sheet\n * names with single quotes inside use SQL-style doubling (\"'Bob''s Sheet'!A1\")\n * — we unescape on the way out.\n */\nexport function parseSheetRange(input: string): {\n sheet: string;\n range: string;\n bounds: CellRangeBoundaries;\n} {\n const m = SHEET_RANGE_RE.exec(input);\n if (m === null) throw new OpenXmlSchemaError(`parseSheetRange: missing \"!\" delimiter in \"${input}\"`);\n const quoted = m[1];\n const bare = m[2];\n const range = m[3];\n if (range === undefined) throw new OpenXmlSchemaError(`parseSheetRange: empty range part in \"${input}\"`);\n const sheet = quoted !== undefined ? quoted.replace(/''/g, \"'\") : (bare ?? '');\n return { sheet, range, bounds: rangeBoundaries(range) };\n}\n\nconst BARE_SHEET_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/**\n * Inverse of {@link parseSheetRange}: format a sheet title + range (or\n * single-cell ref) as `Sheet1!A1` or `'Quarter 1'!A1` per Excel's\n * sheet-qualified syntax. Single quotes inside the title are escaped by\n * doubling (`'Bob''s Sheet'`).\n *\n * Quoting rule: sheet titles consisting only of `[A-Za-z_][A-Za-z0-9_]*` are\n * emitted bare; everything else (spaces, digits-leading, hyphens, apostrophes,\n * punctuation…) gets wrapped in single quotes.\n */\nexport function formatSheetQualifiedRef(sheet: string, ref: string): string {\n if (BARE_SHEET_NAME.test(sheet)) return `${sheet}!${ref}`;\n return `'${sheet.replace(/'/g, \"''\")}'!${ref}`;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"coordinate-96Ecci4d.mjs","names":[],"sources":["../src/utils/coordinate.ts"],"sourcesContent":["// Worksheet coordinate utilities. Mirrors openpyxl/openpyxl/utils/cell.py.\n//\n// These functions are on the worksheet read/write hot path (millions of calls\n// when streaming a sheet) so the implementations stay branch-light, regex-based\n// only at the entry points, with bounded Map caches for the bidirectional\n// column letter <-> index mapping.\n\nimport { OpenXmlSchemaError } from './exceptions.js';\n\n/** Maximum column index Excel accepts (XFD). */\nexport const MAX_COL = 16384;\n/** Maximum row index Excel accepts. */\nexport const MAX_ROW = 1048576;\n\n// ---- column letter <-> 1-based index ---------------------------------------\n\nconst indexByLetter = new Map<string, number>();\nconst letterByIndex = new Map<number, string>();\n\n/**\n * 1-based column index → spreadsheet column letter (\"A\", \"Z\", \"AA\", \"XFD\").\n * Throws OpenXmlSchemaError when out of range.\n */\nexport function columnLetterFromIndex(n: number): string {\n const cached = letterByIndex.get(n);\n if (cached !== undefined) return cached;\n if (!Number.isInteger(n) || n < 1 || n > MAX_COL) {\n throw new OpenXmlSchemaError(`column index ${n} is out of range [1, ${MAX_COL}]`);\n }\n let m = n;\n let out = '';\n while (m > 0) {\n m -= 1; // shift to 0-based for the modulo\n out = String.fromCharCode(65 + (m % 26)) + out;\n m = Math.floor(m / 26);\n }\n letterByIndex.set(n, out);\n return out;\n}\n\n/**\n * Column letter → 1-based column index. Case-insensitive but at most 3 letters\n * (the spec ceiling). Throws on empty / non-A-Z / over-range.\n */\nexport function columnIndexFromLetter(letter: string): number {\n const cached = indexByLetter.get(letter);\n if (cached !== undefined) return cached;\n if (letter.length === 0 || letter.length > 3) {\n throw new OpenXmlSchemaError(`column letter \"${letter}\" is empty or too long`);\n }\n let n = 0;\n for (let i = 0; i < letter.length; i++) {\n const c = letter.charCodeAt(i);\n let v: number;\n if (c >= 65 && c <= 90)\n v = c - 64; // 'A' = 65\n else if (c >= 97 && c <= 122)\n v = c - 96; // 'a' = 97\n else throw new OpenXmlSchemaError(`column letter \"${letter}\" contains non-letter char`);\n n = n * 26 + v;\n }\n if (n < 1 || n > MAX_COL) {\n throw new OpenXmlSchemaError(`column letter \"${letter}\" expands to out-of-range index ${n}`);\n }\n // Normalise the cache key to upper-case so 'a' / 'A' share a slot.\n const key = letter.toUpperCase();\n indexByLetter.set(key, n);\n if (key !== letter) indexByLetter.set(letter, n);\n return n;\n}\n\n// ---- coordinate parsing ----------------------------------------------------\n\n/** A single-cell coordinate split into its letter and 1-based row. */\nexport interface CellCoordinate {\n column: string;\n row: number;\n}\n\n/** A single-cell coordinate split into 1-based numeric (col, row). */\nexport interface CellCoordinateNumeric {\n col: number;\n row: number;\n}\n\n/** A 1-based rectangular boundary. */\nexport interface CellRangeBoundaries {\n minCol: number;\n minRow: number;\n maxCol: number;\n maxRow: number;\n}\n\nconst COORD_RE = /^[$]?([A-Za-z]{1,3})[$]?([1-9][0-9]*)$/;\nconst COL_RANGE_RE = /^[$]?([A-Za-z]{1,3}):[$]?([A-Za-z]{1,3})$/;\nconst ROW_RANGE_RE = /^[$]?([1-9][0-9]*):[$]?([1-9][0-9]*)$/;\nconst SHEET_RANGE_RE = /^(?:'((?:[^']|'')+)'|([^'!]+))!(.+)$/;\n\n/**\n * Parse a single-cell coordinate string (\"A1\", \"$XFD$1048576\") into its column\n * letter (always uppercased) and 1-based row.\n */\nexport function coordinateFromString(coord: string): CellCoordinate {\n const m = COORD_RE.exec(coord);\n if (m === null || m[1] === undefined || m[2] === undefined) {\n throw new OpenXmlSchemaError(`coordinateFromString: invalid coordinate \"${coord}\"`);\n }\n const column = m[1].toUpperCase();\n const row = Number.parseInt(m[2], 10);\n if (row < 1 || row > MAX_ROW) {\n throw new OpenXmlSchemaError(`coordinateFromString: row ${row} out of range`);\n }\n // Validate column upper bound through the cached helper.\n columnIndexFromLetter(column);\n return { column, row };\n}\n\n/**\n * Same as {@link coordinateFromString} but returning the column as its 1-based\n * numeric index. Thin convenience for the worksheet read path.\n */\nexport function coordinateToTuple(coord: string): CellCoordinateNumeric {\n const c = coordinateFromString(coord);\n return { col: columnIndexFromLetter(c.column), row: c.row };\n}\n\n/** Compose `\"A1\"` from a 1-based (col, row). */\nexport function tupleToCoordinate(col: number, row: number): string {\n if (!Number.isInteger(row) || row < 1 || row > MAX_ROW) {\n throw new OpenXmlSchemaError(`tupleToCoordinate: row ${row} out of range`);\n }\n return `${columnLetterFromIndex(col)}${row}`;\n}\n\n/**\n * Predicate: true iff `s` is a valid single-cell A1 coordinate (`\"A1\"`,\n * `\"XFD1048576\"`). Strings with `$` absolute markers, surrounding whitespace,\n * ranges (`A1:B2`), or out-of-bound row / column return false. Useful for\n * sanitising user input before passing to {@link coordinateToTuple} or\n * `setCellByCoord`.\n */\nexport function isValidCellRef(s: unknown): s is string {\n if (typeof s !== 'string') return false;\n const m = /^([A-Za-z]{1,3})([1-9][0-9]*)$/.exec(s);\n if (!m) return false;\n const colStr = m[1];\n const rowStr = m[2];\n if (colStr === undefined || rowStr === undefined) return false;\n const col = columnIndexFromLetterUnchecked(colStr);\n if (col < 1 || col > MAX_COL) return false;\n const row = Number.parseInt(rowStr, 10);\n if (!Number.isFinite(row) || row < 1 || row > MAX_ROW) return false;\n return true;\n}\n\n/**\n * Predicate: true iff `s` is a valid A1-style range expression — single cell,\n * two-corner range, whole column (`A:A`), or whole row (`1:1`). `$` markers,\n * whitespace, and out-of-bound bounds fail. Sanity-check before {@link\n * rangeBoundaries} / `parseRange`.\n */\nexport function isValidRangeRef(s: unknown): s is string {\n if (typeof s !== 'string' || s.length === 0) return false;\n if (isValidCellRef(s)) return true;\n const ab = /^([A-Za-z]{1,3})([1-9][0-9]*):([A-Za-z]{1,3})([1-9][0-9]*)$/.exec(s);\n if (ab) {\n const [, c1, r1, c2, r2] = ab;\n if (!c1 || !r1 || !c2 || !r2) return false;\n const col1 = columnIndexFromLetterUnchecked(c1);\n const col2 = columnIndexFromLetterUnchecked(c2);\n if (col1 < 1 || col1 > MAX_COL || col2 < 1 || col2 > MAX_COL) return false;\n const row1 = Number.parseInt(r1, 10);\n const row2 = Number.parseInt(r2, 10);\n return row1 >= 1 && row1 <= MAX_ROW && row2 >= 1 && row2 <= MAX_ROW;\n }\n const cc = /^([A-Za-z]{1,3}):([A-Za-z]{1,3})$/.exec(s);\n if (cc) {\n const [, c1, c2] = cc;\n if (!c1 || !c2) return false;\n const col1 = columnIndexFromLetterUnchecked(c1);\n const col2 = columnIndexFromLetterUnchecked(c2);\n return col1 >= 1 && col1 <= MAX_COL && col2 >= 1 && col2 <= MAX_COL;\n }\n const rr = /^([1-9][0-9]*):([1-9][0-9]*)$/.exec(s);\n if (rr) {\n const [, r1, r2] = rr;\n if (!r1 || !r2) return false;\n const row1 = Number.parseInt(r1, 10);\n const row2 = Number.parseInt(r2, 10);\n return row1 >= 1 && row1 <= MAX_ROW && row2 >= 1 && row2 <= MAX_ROW;\n }\n return false;\n}\n\nconst columnIndexFromLetterUnchecked = (letters: string): number => {\n let n = 0;\n const upper = letters.toUpperCase();\n for (let i = 0; i < upper.length; i++) {\n const ch = upper.charCodeAt(i);\n if (ch < 65 || ch > 90) return -1;\n n = n * 26 + (ch - 64);\n }\n return n;\n};\n\n/**\n * Predicate: true iff `s` is a valid 1..3-char column letter (`\"A\"` through\n * `\"XFD\"`, case-insensitive). Empty / over-long / out-of-bound / non-string\n * fails.\n */\nexport function isValidColumnLetter(s: unknown): s is string {\n if (typeof s !== 'string' || s.length === 0 || s.length > 3) return false;\n if (!/^[A-Za-z]+$/.test(s)) return false;\n const col = columnIndexFromLetterUnchecked(s);\n return col >= 1 && col <= MAX_COL;\n}\n\n/**\n * Predicate: true iff `n` is a valid 1-based row index in `[1, 1048576]`.\n * Non-finite / non-integer / out-of-bound fails.\n */\nexport function isValidRowNumber(n: unknown): n is number {\n return typeof n === 'number' && Number.isInteger(n) && n >= 1 && n <= MAX_ROW;\n}\n\n/**\n * Predicate: true iff `n` is a valid 1-based column index in `[1, 16384]`.\n * Non-finite / non-integer / out-of-bound fails.\n */\nexport function isValidColumnNumber(n: unknown): n is number {\n return typeof n === 'number' && Number.isInteger(n) && n >= 1 && n <= MAX_COL;\n}\n\n/**\n * Parse \"A1:B5\" / \"A:A\" / \"1:1\" / single-cell into 1-based (minCol, minRow,\n * maxCol, maxRow). Whole-column ranges fill rows to [1, MAX_ROW]; whole-row\n * ranges fill cols to [1, MAX_COL].\n */\nexport function rangeBoundaries(range: string): CellRangeBoundaries {\n const trimmed = range.trim();\n if (trimmed.length === 0) throw new OpenXmlSchemaError('rangeBoundaries: empty range');\n\n const colon = trimmed.indexOf(':');\n if (colon < 0) {\n // Single-cell shorthand: \"A1\" → A1:A1.\n const c = coordinateFromString(trimmed);\n const col = columnIndexFromLetter(c.column);\n return { minCol: col, minRow: c.row, maxCol: col, maxRow: c.row };\n }\n\n const left = trimmed.slice(0, colon);\n const right = trimmed.slice(colon + 1);\n\n const colsOnly = COL_RANGE_RE.exec(trimmed);\n if (colsOnly !== null && colsOnly[1] !== undefined && colsOnly[2] !== undefined) {\n const minCol = columnIndexFromLetter(colsOnly[1]);\n const maxCol = columnIndexFromLetter(colsOnly[2]);\n return {\n minCol: Math.min(minCol, maxCol),\n minRow: 1,\n maxCol: Math.max(minCol, maxCol),\n maxRow: MAX_ROW,\n };\n }\n\n const rowsOnly = ROW_RANGE_RE.exec(trimmed);\n if (rowsOnly !== null && rowsOnly[1] !== undefined && rowsOnly[2] !== undefined) {\n const minRow = Number.parseInt(rowsOnly[1], 10);\n const maxRow = Number.parseInt(rowsOnly[2], 10);\n if (minRow < 1 || maxRow < 1 || minRow > MAX_ROW || maxRow > MAX_ROW) {\n throw new OpenXmlSchemaError(`rangeBoundaries: row out of range in \"${trimmed}\"`);\n }\n return {\n minCol: 1,\n minRow: Math.min(minRow, maxRow),\n maxCol: MAX_COL,\n maxRow: Math.max(minRow, maxRow),\n };\n }\n\n const a = coordinateFromString(left);\n const b = coordinateFromString(right);\n const ac = columnIndexFromLetter(a.column);\n const bc = columnIndexFromLetter(b.column);\n return {\n minCol: Math.min(ac, bc),\n minRow: Math.min(a.row, b.row),\n maxCol: Math.max(ac, bc),\n maxRow: Math.max(a.row, b.row),\n };\n}\n\n/** Inverse of {@link rangeBoundaries} for the rectangular case. */\nexport function boundariesToRangeString(b: CellRangeBoundaries): string {\n const tl = tupleToCoordinate(b.minCol, b.minRow);\n if (b.minCol === b.maxCol && b.minRow === b.maxRow) return tl;\n const br = tupleToCoordinate(b.maxCol, b.maxRow);\n return `${tl}:${br}`;\n}\n\n/**\n * Parse a sheet-qualified range (\"Sheet1!A1:B5\" / \"'Quarter 1'!A1\"). Sheet\n * names with single quotes inside use SQL-style doubling (\"'Bob''s Sheet'!A1\")\n * — we unescape on the way out.\n */\nexport function parseSheetRange(input: string): {\n sheet: string;\n range: string;\n bounds: CellRangeBoundaries;\n} {\n const m = SHEET_RANGE_RE.exec(input);\n if (m === null) throw new OpenXmlSchemaError(`parseSheetRange: missing \"!\" delimiter in \"${input}\"`);\n const quoted = m[1];\n const bare = m[2];\n const range = m[3];\n if (range === undefined) throw new OpenXmlSchemaError(`parseSheetRange: empty range part in \"${input}\"`);\n const sheet = quoted !== undefined ? quoted.replace(/''/g, \"'\") : (bare ?? '');\n return { sheet, range, bounds: rangeBoundaries(range) };\n}\n\nconst BARE_SHEET_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;\n\n/**\n * Inverse of {@link parseSheetRange}: format a sheet title + range (or\n * single-cell ref) as `Sheet1!A1` or `'Quarter 1'!A1` per Excel's\n * sheet-qualified syntax. Single quotes inside the title are escaped by\n * doubling (`'Bob''s Sheet'`).\n *\n * Quoting rule: sheet titles consisting only of `[A-Za-z_][A-Za-z0-9_]*` are\n * emitted bare; everything else (spaces, digits-leading, hyphens, apostrophes,\n * punctuation…) gets wrapped in single quotes.\n */\nexport function formatSheetQualifiedRef(sheet: string, ref: string): string {\n if (BARE_SHEET_NAME.test(sheet)) return `${sheet}!${ref}`;\n return `'${sheet.replace(/'/g, \"''\")}'!${ref}`;\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"datetime-B2ySVlXt.mjs","names":[],"sources":["../src/utils/datetime.ts"],"sourcesContent":["// Excel <-> JavaScript Date conversions. Mirrors\n// openpyxl/openpyxl/utils/datetime.py.\n//\n// Excel stores datetimes as fractional \"serial days\" since an epoch. Two epochs\n// are in use:\n// * Windows (\"1900 date system\", default): epoch 1899-12-30 with the\n// well-known 1900 leap-year bug — Excel treats 1900-02-29 as a\n// valid day even though it isn't. We collapse that phantom day\n// onto 1900-02-28 (the openpyxl approach), so date math past\n// March 1, 1900 stays consistent without leaking the bug.\n// * Mac (\"1904 date system\"): epoch 1904-01-01, no leap bug.\n//\n// Dates stay as numeric serials on the worksheet hot path; conversion to a JS\n// Date happens lazily only when callers ask. JS Dates are interpreted in UTC\n// throughout to avoid timezone drift between read and write.\n\nimport { OpenXmlSchemaError } from './exceptions';\n\n/** Excel epoch identifier. */\nexport type ExcelEpoch = 'windows' | 'mac';\n\n/** 1899-12-30 (UTC) — the Windows / 1900-system epoch in ms. */\nexport const WINDOWS_EPOCH_MS = Date.UTC(1899, 11, 30);\n/** 1904-01-01 (UTC) — the Mac / 1904-system epoch in ms. */\nexport const MAC_EPOCH_MS = Date.UTC(1904, 0, 1);\n\nconst MS_PER_DAY = 86_400_000;\n/** Serial day index of the phantom 1900-02-29; absorbed onto 1900-02-28. */\nconst LEAP_DUPLICATE_DAY = 60;\n\nconst epochMs = (e: ExcelEpoch | undefined): number => (e === 'mac' ? MAC_EPOCH_MS : WINDOWS_EPOCH_MS);\n\n/**\n * Convert an Excel serial date into a JS `Date` (UTC). The fractional part is\n * treated as a fraction of a day. For Windows 1900 the leap-bug compensation\n * kicks in for serials in [0, 60).\n */\nexport function excelToDate(serial: number, opts?: { epoch?: ExcelEpoch }): Date {\n if (!Number.isFinite(serial)) {\n throw new OpenXmlSchemaError(`excelToDate: serial \"${serial}\" is not finite`);\n }\n const epoch = epochMs(opts?.epoch);\n const day = Math.floor(serial);\n const fraction = serial - day;\n const isWindows = epoch === WINDOWS_EPOCH_MS;\n // Windows quirk: bump days [0, 60) by one so the day count lines up with\n // Excel's serial numbering through the phantom Feb 29 1900.\n const dayAdjusted = isWindows && serial >= 0 && serial < LEAP_DUPLICATE_DAY ? day + 1 : day;\n const ms = epoch + dayAdjusted * MS_PER_DAY + Math.round(fraction * MS_PER_DAY);\n return new Date(ms);\n}\n\n/**\n * Convert a JS `Date` into an Excel serial. The Date is read in UTC. On Windows\n * 1900, dates ≤ 1900-02-28 get a -1 day correction to account for Excel's\n * phantom leap day.\n */\nexport function dateToExcel(date: Date, opts?: { epoch?: ExcelEpoch }): number {\n const t = date.getTime();\n if (!Number.isFinite(t)) {\n throw new OpenXmlSchemaError('dateToExcel: invalid Date');\n }\n const epoch = epochMs(opts?.epoch);\n const dayStartMs = Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());\n const days = Math.round((dayStartMs - epoch) / MS_PER_DAY);\n const subDay = (t - dayStartMs) / MS_PER_DAY;\n const isWindows = epoch === WINDOWS_EPOCH_MS;\n const daysAdjusted = isWindows && days <= LEAP_DUPLICATE_DAY ? days - 1 : days;\n return daysAdjusted + subDay;\n}\n\n/** Excel duration serial (fraction of a day) → milliseconds. */\nexport function excelToDuration(serial: number): number {\n if (!Number.isFinite(serial)) {\n throw new OpenXmlSchemaError(`excelToDuration: serial \"${serial}\" is not finite`);\n }\n return Math.round(serial * MS_PER_DAY);\n}\n\n/** Milliseconds → Excel duration serial (fraction of a day). */\nexport function durationToExcel(ms: number): number {\n if (!Number.isFinite(ms)) {\n throw new OpenXmlSchemaError(`durationToExcel: ms \"${ms}\" is not finite`);\n }\n return ms / MS_PER_DAY;\n}\n\n// ---- ISO 8601 helpers ------------------------------------------------------\n\n/**\n * Parse an ISO-8601 / W3CDTF datetime string into a `Date`. Same grammar as\n * `new Date(string)`; the wrapper just adds typed error reporting and a\n * stricter \"must be a recognised ISO\" guard.\n */\nexport function fromIso8601(s: string): Date {\n if (typeof s !== 'string' || s.length === 0) {\n throw new OpenXmlSchemaError(`fromIso8601: empty input`);\n }\n const d = new Date(s);\n if (Number.isNaN(d.getTime())) {\n throw new OpenXmlSchemaError(`fromIso8601: invalid datetime \"${s}\"`);\n }\n return d;\n}\n\n/**\n * Format a `Date` as ISO-8601 with second precision in UTC. Trims the\n * millisecond fragment that `Date.toISOString()` always produces, so the output\n * matches Excel / openpyxl's W3CDTF style.\n */\nexport function toIso8601(d: Date): string {\n if (Number.isNaN(d.getTime())) {\n throw new OpenXmlSchemaError('toIso8601: invalid Date');\n }\n return d.toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n}\n"],"mappings":";;;AAsBA,MAAa,mBAAmB,KAAK,IAAI,MAAM,IAAI,EAAE;;AAErD,MAAa,eAAe,KAAK,IAAI,MAAM,GAAG,CAAC;AAE/C,MAAM,aAAa;;AAEnB,MAAM,qBAAqB;AAE3B,MAAM,WAAW,MAAuC,MAAM,QAAQ,eAAe;;;;;;AAOrF,SAAgB,YAAY,QAAgB,MAAqC;CAC/E,IAAI,CAAC,OAAO,SAAS,MAAM,GACzB,MAAM,IAAI,mBAAmB,wBAAwB,OAAO,gBAAgB;CAE9E,MAAM,QAAQ,QAAQ,MAAM,KAAK;CACjC,MAAM,MAAM,KAAK,MAAM,MAAM;CAC7B,MAAM,WAAW,SAAS;CAK1B,MAAM,KAAK,SAJO,UAAU,oBAGK,UAAU,KAAK,SAAS,qBAAqB,MAAM,IAAI,OACvD,aAAa,KAAK,MAAM,WAAW,UAAU;CAC9E,OAAO,IAAI,KAAK,EAAE;AACpB;;;;;;AAOA,SAAgB,YAAY,MAAY,MAAuC;CAC7E,MAAM,IAAI,KAAK,QAAQ;CACvB,IAAI,CAAC,OAAO,SAAS,CAAC,GACpB,MAAM,IAAI,mBAAmB,2BAA2B;CAE1D,MAAM,QAAQ,QAAQ,MAAM,KAAK;CACjC,MAAM,aAAa,KAAK,IAAI,KAAK,eAAe,GAAG,KAAK,YAAY,GAAG,KAAK,WAAW,CAAC;CACxF,MAAM,OAAO,KAAK,OAAO,aAAa,SAAS,UAAU;CACzD,MAAM,UAAU,IAAI,cAAc;CAGlC,QAFkB,UAAU,oBACM,QAAQ,qBAAqB,OAAO,IAAI,QACpD;AACxB;;AAGA,SAAgB,gBAAgB,QAAwB;CACtD,IAAI,CAAC,OAAO,SAAS,MAAM,GACzB,MAAM,IAAI,mBAAmB,4BAA4B,OAAO,gBAAgB;CAElF,OAAO,KAAK,MAAM,SAAS,UAAU;AACvC;;AAGA,SAAgB,gBAAgB,IAAoB;CAClD,IAAI,CAAC,OAAO,SAAS,EAAE,GACrB,MAAM,IAAI,mBAAmB,wBAAwB,GAAG,gBAAgB;CAE1E,OAAO,KAAK;AACd;;;;;;AASA,SAAgB,YAAY,GAAiB;CAC3C,IAAI,OAAO,MAAM,YAAY,EAAE,WAAW,GACxC,MAAM,IAAI,mBAAmB,0BAA0B;CAEzD,MAAM,IAAI,IAAI,KAAK,CAAC;CACpB,IAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,GAC1B,MAAM,IAAI,mBAAmB,kCAAkC,EAAE,EAAE;CAErE,OAAO;AACT;;;;;;AAOA,SAAgB,UAAU,GAAiB;CACzC,IAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,GAC1B,MAAM,IAAI,mBAAmB,yBAAyB;CAExD,OAAO,EAAE,YAAY,CAAC,CAAC,QAAQ,aAAa,GAAG;AACjD"}
1
+ {"version":3,"file":"datetime-B2ySVlXt.mjs","names":[],"sources":["../src/utils/datetime.ts"],"sourcesContent":["// Excel <-> JavaScript Date conversions. Mirrors\n// openpyxl/openpyxl/utils/datetime.py.\n//\n// Excel stores datetimes as fractional \"serial days\" since an epoch. Two epochs\n// are in use:\n// * Windows (\"1900 date system\", default): epoch 1899-12-30 with the\n// well-known 1900 leap-year bug — Excel treats 1900-02-29 as a\n// valid day even though it isn't. We collapse that phantom day\n// onto 1900-02-28 (the openpyxl approach), so date math past\n// March 1, 1900 stays consistent without leaking the bug.\n// * Mac (\"1904 date system\"): epoch 1904-01-01, no leap bug.\n//\n// Dates stay as numeric serials on the worksheet hot path; conversion to a JS\n// Date happens lazily only when callers ask. JS Dates are interpreted in UTC\n// throughout to avoid timezone drift between read and write.\n\nimport { OpenXmlSchemaError } from './exceptions.js';\n\n/** Excel epoch identifier. */\nexport type ExcelEpoch = 'windows' | 'mac';\n\n/** 1899-12-30 (UTC) — the Windows / 1900-system epoch in ms. */\nexport const WINDOWS_EPOCH_MS = Date.UTC(1899, 11, 30);\n/** 1904-01-01 (UTC) — the Mac / 1904-system epoch in ms. */\nexport const MAC_EPOCH_MS = Date.UTC(1904, 0, 1);\n\nconst MS_PER_DAY = 86_400_000;\n/** Serial day index of the phantom 1900-02-29; absorbed onto 1900-02-28. */\nconst LEAP_DUPLICATE_DAY = 60;\n\nconst epochMs = (e: ExcelEpoch | undefined): number => (e === 'mac' ? MAC_EPOCH_MS : WINDOWS_EPOCH_MS);\n\n/**\n * Convert an Excel serial date into a JS `Date` (UTC). The fractional part is\n * treated as a fraction of a day. For Windows 1900 the leap-bug compensation\n * kicks in for serials in [0, 60).\n */\nexport function excelToDate(serial: number, opts?: { epoch?: ExcelEpoch }): Date {\n if (!Number.isFinite(serial)) {\n throw new OpenXmlSchemaError(`excelToDate: serial \"${serial}\" is not finite`);\n }\n const epoch = epochMs(opts?.epoch);\n const day = Math.floor(serial);\n const fraction = serial - day;\n const isWindows = epoch === WINDOWS_EPOCH_MS;\n // Windows quirk: bump days [0, 60) by one so the day count lines up with\n // Excel's serial numbering through the phantom Feb 29 1900.\n const dayAdjusted = isWindows && serial >= 0 && serial < LEAP_DUPLICATE_DAY ? day + 1 : day;\n const ms = epoch + dayAdjusted * MS_PER_DAY + Math.round(fraction * MS_PER_DAY);\n return new Date(ms);\n}\n\n/**\n * Convert a JS `Date` into an Excel serial. The Date is read in UTC. On Windows\n * 1900, dates ≤ 1900-02-28 get a -1 day correction to account for Excel's\n * phantom leap day.\n */\nexport function dateToExcel(date: Date, opts?: { epoch?: ExcelEpoch }): number {\n const t = date.getTime();\n if (!Number.isFinite(t)) {\n throw new OpenXmlSchemaError('dateToExcel: invalid Date');\n }\n const epoch = epochMs(opts?.epoch);\n const dayStartMs = Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());\n const days = Math.round((dayStartMs - epoch) / MS_PER_DAY);\n const subDay = (t - dayStartMs) / MS_PER_DAY;\n const isWindows = epoch === WINDOWS_EPOCH_MS;\n const daysAdjusted = isWindows && days <= LEAP_DUPLICATE_DAY ? days - 1 : days;\n return daysAdjusted + subDay;\n}\n\n/** Excel duration serial (fraction of a day) → milliseconds. */\nexport function excelToDuration(serial: number): number {\n if (!Number.isFinite(serial)) {\n throw new OpenXmlSchemaError(`excelToDuration: serial \"${serial}\" is not finite`);\n }\n return Math.round(serial * MS_PER_DAY);\n}\n\n/** Milliseconds → Excel duration serial (fraction of a day). */\nexport function durationToExcel(ms: number): number {\n if (!Number.isFinite(ms)) {\n throw new OpenXmlSchemaError(`durationToExcel: ms \"${ms}\" is not finite`);\n }\n return ms / MS_PER_DAY;\n}\n\n// ---- ISO 8601 helpers ------------------------------------------------------\n\n/**\n * Parse an ISO-8601 / W3CDTF datetime string into a `Date`. Same grammar as\n * `new Date(string)`; the wrapper just adds typed error reporting and a\n * stricter \"must be a recognised ISO\" guard.\n */\nexport function fromIso8601(s: string): Date {\n if (typeof s !== 'string' || s.length === 0) {\n throw new OpenXmlSchemaError(`fromIso8601: empty input`);\n }\n const d = new Date(s);\n if (Number.isNaN(d.getTime())) {\n throw new OpenXmlSchemaError(`fromIso8601: invalid datetime \"${s}\"`);\n }\n return d;\n}\n\n/**\n * Format a `Date` as ISO-8601 with second precision in UTC. Trims the\n * millisecond fragment that `Date.toISOString()` always produces, so the output\n * matches Excel / openpyxl's W3CDTF style.\n */\nexport function toIso8601(d: Date): string {\n if (Number.isNaN(d.getTime())) {\n throw new OpenXmlSchemaError('toIso8601: invalid Date');\n }\n return d.toISOString().replace(/\\.\\d{3}Z$/, 'Z');\n}\n"],"mappings":";;;AAsBA,MAAa,mBAAmB,KAAK,IAAI,MAAM,IAAI,EAAE;;AAErD,MAAa,eAAe,KAAK,IAAI,MAAM,GAAG,CAAC;AAE/C,MAAM,aAAa;;AAEnB,MAAM,qBAAqB;AAE3B,MAAM,WAAW,MAAuC,MAAM,QAAQ,eAAe;;;;;;AAOrF,SAAgB,YAAY,QAAgB,MAAqC;CAC/E,IAAI,CAAC,OAAO,SAAS,MAAM,GACzB,MAAM,IAAI,mBAAmB,wBAAwB,OAAO,gBAAgB;CAE9E,MAAM,QAAQ,QAAQ,MAAM,KAAK;CACjC,MAAM,MAAM,KAAK,MAAM,MAAM;CAC7B,MAAM,WAAW,SAAS;CAK1B,MAAM,KAAK,SAJO,UAAU,oBAGK,UAAU,KAAK,SAAS,qBAAqB,MAAM,IAAI,OACvD,aAAa,KAAK,MAAM,WAAW,UAAU;CAC9E,OAAO,IAAI,KAAK,EAAE;AACpB;;;;;;AAOA,SAAgB,YAAY,MAAY,MAAuC;CAC7E,MAAM,IAAI,KAAK,QAAQ;CACvB,IAAI,CAAC,OAAO,SAAS,CAAC,GACpB,MAAM,IAAI,mBAAmB,2BAA2B;CAE1D,MAAM,QAAQ,QAAQ,MAAM,KAAK;CACjC,MAAM,aAAa,KAAK,IAAI,KAAK,eAAe,GAAG,KAAK,YAAY,GAAG,KAAK,WAAW,CAAC;CACxF,MAAM,OAAO,KAAK,OAAO,aAAa,SAAS,UAAU;CACzD,MAAM,UAAU,IAAI,cAAc;CAGlC,QAFkB,UAAU,oBACM,QAAQ,qBAAqB,OAAO,IAAI,QACpD;AACxB;;AAGA,SAAgB,gBAAgB,QAAwB;CACtD,IAAI,CAAC,OAAO,SAAS,MAAM,GACzB,MAAM,IAAI,mBAAmB,4BAA4B,OAAO,gBAAgB;CAElF,OAAO,KAAK,MAAM,SAAS,UAAU;AACvC;;AAGA,SAAgB,gBAAgB,IAAoB;CAClD,IAAI,CAAC,OAAO,SAAS,EAAE,GACrB,MAAM,IAAI,mBAAmB,wBAAwB,GAAG,gBAAgB;CAE1E,OAAO,KAAK;AACd;;;;;;AASA,SAAgB,YAAY,GAAiB;CAC3C,IAAI,OAAO,MAAM,YAAY,EAAE,WAAW,GACxC,MAAM,IAAI,mBAAmB,0BAA0B;CAEzD,MAAM,IAAI,IAAI,KAAK,CAAC;CACpB,IAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,GAC1B,MAAM,IAAI,mBAAmB,kCAAkC,EAAE,EAAE;CAErE,OAAO;AACT;;;;;;AAOA,SAAgB,UAAU,GAAiB;CACzC,IAAI,OAAO,MAAM,EAAE,QAAQ,CAAC,GAC1B,MAAM,IAAI,mBAAmB,yBAAyB;CAExD,OAAO,EAAE,YAAY,CAAC,CAAC,QAAQ,aAAa,GAAG;AACjD"}
@@ -1 +1 @@
1
- {"version":3,"file":"defined-names-CviWmtQg.mjs","names":[],"sources":["../src/workbook/defined-names.ts"],"sourcesContent":["// Workbook-level defined names. Models the OOXML schema's `<definedName>` element.\n//\n// A defined name binds an identifier to a formula-style value (`'Sheet\n// 1'!$A$1:$B$10`, `SUM(A:A)`, etc). Workbook-scope names omit `localSheetId`;\n// sheet-scope names use the 0-based sheet index. Excel reserves a handful of\n// names with the `_xlnm.` prefix for built-in uses (Print_Area, Print_Titles,\n// Sheet_Title, etc) — those round-trip here as plain DefinedName entries since\n// the value semantics are the same.\n\nimport { OpenXmlSchemaError } from '../utils/exceptions';\n\nexport interface DefinedName {\n /** Identifier — `_xlnm.Print_Area` for built-ins, otherwise user-chosen. */\n name: string;\n /** The formula expression the name points at. */\n value: string;\n /** 0-based sheet index for sheet-scope names; undefined → workbook-scope. */\n scope?: number;\n /** Hidden from the Name Manager when true. */\n hidden?: boolean;\n /** Optional human-readable description. */\n comment?: string;\n}\n\nexport function makeDefinedName(opts: Partial<DefinedName> & { name: string; value: string }): DefinedName {\n return {\n name: opts.name,\n value: opts.value,\n ...(opts.scope !== undefined ? { scope: opts.scope } : {}),\n ...(opts.hidden !== undefined ? { hidden: opts.hidden } : {}),\n ...(opts.comment !== undefined ? { comment: opts.comment } : {}),\n };\n}\n\n// ---- Workbook ergonomic helpers -----------------------------------------\n\nimport { type CellRangeBoundaries, parseSheetRange } from '../utils/coordinate';\nimport type { Worksheet } from '../worksheet/worksheet';\nimport { getRangeAddress } from '../worksheet/worksheet';\nimport type { Workbook } from './workbook';\n\n/**\n * One parsed leg of a defined name's value. Defined-name values can be\n * comma-separated multi-range expressions (e.g. `_xlnm.Print_Titles` sets\n * `Sheet!$1:$1,Sheet!$A:$A`); this represents one such leg.\n */\nexport interface DefinedNameTarget {\n sheet: string;\n range: string;\n bounds: CellRangeBoundaries;\n}\n\n/**\n * Add a workbook-scope or sheet-scope defined name. If a defined name with the\n * same `name` (and `scope`) already exists, it's replaced — Excel allows one\n * workbook-scope and one per-sheet-scope name, but not two with the same scope.\n * Returns the resulting `DefinedName`.\n */\nexport const addDefinedName = (\n wb: Workbook,\n opts: Partial<DefinedName> & { name: string; value: string },\n): DefinedName => {\n const dn = makeDefinedName(opts);\n // Replace any existing entry with the same name + scope.\n const idx = wb.definedNames.findIndex((d) => d.name === dn.name && d.scope === dn.scope);\n if (idx >= 0) {\n wb.definedNames[idx] = dn;\n } else {\n wb.definedNames.push(dn);\n }\n return dn;\n};\n\n/**\n * High-level: register a defined name pointing at a worksheet range. Combines\n * {@link getRangeAddress} (sheet-qualified, properly quoted) with {@link\n * addDefinedName}, so the caller doesn't have to assemble the formula string by\n * hand.\n *\n * Pass `opts.localToSheet: true` to scope the name to the worksheet (instead of\n * the workbook). Re-using the same `name` + scope replaces the previous entry\n * (Excel's per-scope-uniqueness rule).\n *\n * Throws when `localToSheet: true` is set but the worksheet isn't on\n * `wb.sheets` — that would be a stale Worksheet reference.\n */\nexport const addDefinedNameForRange = (\n wb: Workbook,\n name: string,\n ws: Worksheet,\n range: string,\n opts: { localToSheet?: boolean; hidden?: boolean; comment?: string } = {},\n): DefinedName => {\n const value = getRangeAddress(ws, range);\n let scope: number | undefined;\n if (opts.localToSheet) {\n const idx = wb.sheets.findIndex((s) => s.sheet === ws);\n if (idx < 0) {\n throw new OpenXmlSchemaError(\n `addDefinedNameForRange: worksheet \"${ws.title}\" is not registered on this workbook`,\n );\n }\n scope = idx;\n }\n return addDefinedName(wb, {\n name,\n value,\n ...(scope !== undefined ? { scope } : {}),\n ...(opts.hidden !== undefined ? { hidden: opts.hidden } : {}),\n ...(opts.comment !== undefined ? { comment: opts.comment } : {}),\n });\n};\n\n/** Look up a defined name by identifier and (optional) sheet scope. */\nexport const getDefinedName = (\n wb: Workbook,\n name: string,\n scope?: number,\n): DefinedName | undefined => wb.definedNames.find((d) => d.name === name && d.scope === scope);\n\n/**\n * Resolve a defined name's `value` into one or more {@link DefinedNameTarget}s.\n * Comma-separated values (e.g. `_xlnm.Print_Titles` typically sets\n * `Sheet!$1:$1,Sheet!$A:$A`) yield one entry per leg; a plain `Sheet!A1:B5`\n * yields a single-element array.\n *\n * Returns `undefined` when the name doesn't exist; throws when the value can't\n * be parsed (e.g. a constant or a non-range formula — defined names are\n * sometimes used for things like `=42` or `=SUM(A:A)` which aren't ranges).\n */\nexport const getDefinedNameTarget = (\n wb: Workbook,\n name: string,\n scope?: number,\n): DefinedNameTarget[] | undefined => {\n const dn = getDefinedName(wb, name, scope);\n if (!dn) return undefined;\n // Defined-name values use `,` as the leg separator. Sheet titles can\n // themselves contain commas inside `'...'` quotes — split on commas that\n // aren't inside an unbalanced single-quoted segment.\n const legs: string[] = [];\n let current = '';\n let inQuote = false;\n for (let i = 0; i < dn.value.length; i++) {\n const c = dn.value[i];\n if (c === \"'\") {\n // Doubled `''` inside a quoted run is the escape for a literal apostrophe\n // — skip the second one without flipping the state.\n if (inQuote && dn.value[i + 1] === \"'\") {\n current += \"''\";\n i++;\n continue;\n }\n inQuote = !inQuote;\n current += c;\n continue;\n }\n if (c === ',' && !inQuote) {\n legs.push(current);\n current = '';\n continue;\n }\n current += c;\n }\n if (current.length > 0) legs.push(current);\n return legs.map((leg) => parseSheetRange(leg));\n};\n\n/**\n * Remove a defined name by identifier + scope. Returns true if any entry was\n * removed.\n */\nexport const removeDefinedName = (wb: Workbook, name: string, scope?: number): boolean => {\n const idx = wb.definedNames.findIndex((d) => d.name === name && d.scope === scope);\n if (idx < 0) return false;\n wb.definedNames.splice(idx, 1);\n return true;\n};\n\n/**\n * Read-only snapshot of every defined name. Pass `{ scope }` to narrow to\n * workbook-scope (`scope: undefined`) or one specific sheet (`scope: 0`) — omit\n * the option entirely to list all.\n */\nexport const listDefinedNames = (\n wb: Workbook,\n opts: { scope?: number | 'workbook' | 'all' } = {},\n): ReadonlyArray<DefinedName> => {\n const scope = opts.scope ?? 'all';\n if (scope === 'all') return wb.definedNames;\n if (scope === 'workbook') return wb.definedNames.filter((d) => d.scope === undefined);\n return wb.definedNames.filter((d) => d.scope === scope);\n};\n\n/**\n * Bulk-remove every defined name matching `predicate`. Returns the count\n * removed. Mirrors {@link removeDataValidations} on worksheets.\n */\nexport const removeDefinedNames = (\n wb: Workbook,\n predicate: (d: DefinedName) => boolean,\n): number => {\n const before = wb.definedNames.length;\n wb.definedNames = wb.definedNames.filter((d) => !predicate(d));\n return before - wb.definedNames.length;\n};\n\n/**\n * Rename a defined name, scoped or workbook-scope. Returns `true` when an entry\n * was renamed. Throws when `newName` is already taken with the same scope\n * (Excel forbids duplicates within a scope).\n */\nexport const renameDefinedName = (\n wb: Workbook,\n oldName: string,\n newName: string,\n scope?: number,\n): boolean => {\n const idx = wb.definedNames.findIndex((d) => d.name === oldName && d.scope === scope);\n if (idx < 0) return false;\n const conflict = wb.definedNames.findIndex((d, i) => i !== idx && d.name === newName && d.scope === scope);\n if (conflict >= 0) {\n throw new OpenXmlSchemaError(`renameDefinedName: \"${newName}\" is already in use at the same scope`);\n }\n const existing = wb.definedNames[idx];\n if (!existing) return false;\n wb.definedNames[idx] = { ...existing, name: newName };\n return true;\n};\n\n/**\n * Read-only snapshot of every `_xlnm.Print_Area` defined name. Each entry is\n * the raw DefinedName carrying `scope` (sheet index) and `value` (the\n * print-area expression like `'Sheet1'!$A$1:$D$10`).\n */\nexport const listPrintAreas = (wb: Workbook): ReadonlyArray<DefinedName> =>\n wb.definedNames.filter((d) => d.name === '_xlnm.Print_Area');\n\n/**\n * Read-only snapshot of every `_xlnm.Print_Titles` defined name. Each entry's\n * `value` is the title-row / title-col expression Excel re-uses on every\n * printed page.\n */\nexport const listPrintTitles = (wb: Workbook): ReadonlyArray<DefinedName> =>\n wb.definedNames.filter((d) => d.name === '_xlnm.Print_Titles');\n\n/**\n * Define the print-area for a given sheet. Excel uses the built-in\n * `_xlnm.Print_Area` defined name with sheet scope.\n */\nexport const setPrintArea = (wb: Workbook, sheetIndex: number, ref: string): DefinedName => {\n return addDefinedName(wb, {\n name: '_xlnm.Print_Area',\n value: ref,\n scope: sheetIndex,\n });\n};\n\n/**\n * Define print-title rows / columns on a sheet. Excel uses the\n * `_xlnm.Print_Titles` defined name. Pass `rows` (\"$1:$1\") to repeat row 1 on\n * every printed page; `cols` (\"$A:$A\") to repeat column A.\n */\nexport const setPrintTitles = (\n wb: Workbook,\n sheetIndex: number,\n opts: { rows?: string; cols?: string; sheetName: string },\n): DefinedName => {\n const parts: string[] = [];\n // The wire form is \"Sheet!$1:$1,Sheet!$A:$A\"; both refs share the sheet\n // prefix.\n if (opts.cols !== undefined) parts.push(`'${opts.sheetName}'!${opts.cols}`);\n if (opts.rows !== undefined) parts.push(`'${opts.sheetName}'!${opts.rows}`);\n if (parts.length === 0) {\n throw new OpenXmlSchemaError('setPrintTitles: at least one of rows or cols must be set');\n }\n return addDefinedName(wb, {\n name: '_xlnm.Print_Titles',\n value: parts.join(','),\n scope: sheetIndex,\n });\n};\n"],"mappings":";;AAwBA,SAAgB,gBAAgB,MAA2E;CACzG,OAAO;EACL,MAAM,KAAK;EACX,OAAO,KAAK;EACZ,GAAI,KAAK,UAAU,KAAA,IAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;EACxD,GAAI,KAAK,WAAW,KAAA,IAAY,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;EAC3D,GAAI,KAAK,YAAY,KAAA,IAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;CAChE;AACF;;;;;;;AA0BA,MAAa,kBACX,IACA,SACgB;CAChB,MAAM,KAAK,gBAAgB,IAAI;CAE/B,MAAM,MAAM,GAAG,aAAa,WAAW,MAAM,EAAE,SAAS,GAAG,QAAQ,EAAE,UAAU,GAAG,KAAK;CACvF,IAAI,OAAO,GACT,GAAG,aAAa,OAAO;MAEvB,GAAG,aAAa,KAAK,EAAE;CAEzB,OAAO;AACT;;AA2CA,MAAa,kBACX,IACA,MACA,UAC4B,GAAG,aAAa,MAAM,MAAM,EAAE,SAAS,QAAQ,EAAE,UAAU,KAAK;;;;;;;;;;;AAY9F,MAAa,wBACX,IACA,MACA,UACoC;CACpC,MAAM,KAAK,eAAe,IAAI,MAAM,KAAK;CACzC,IAAI,CAAC,IAAI,OAAO,KAAA;CAIhB,MAAM,OAAiB,CAAC;CACxB,IAAI,UAAU;CACd,IAAI,UAAU;CACd,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,MAAM,QAAQ,KAAK;EACxC,MAAM,IAAI,GAAG,MAAM;EACnB,IAAI,MAAM,KAAK;GAGb,IAAI,WAAW,GAAG,MAAM,IAAI,OAAO,KAAK;IACtC,WAAW;IACX;IACA;GACF;GACA,UAAU,CAAC;GACX,WAAW;GACX;EACF;EACA,IAAI,MAAM,OAAO,CAAC,SAAS;GACzB,KAAK,KAAK,OAAO;GACjB,UAAU;GACV;EACF;EACA,WAAW;CACb;CACA,IAAI,QAAQ,SAAS,GAAG,KAAK,KAAK,OAAO;CACzC,OAAO,KAAK,KAAK,QAAQ,gBAAgB,GAAG,CAAC;AAC/C;;;;;AAMA,MAAa,qBAAqB,IAAc,MAAc,UAA4B;CACxF,MAAM,MAAM,GAAG,aAAa,WAAW,MAAM,EAAE,SAAS,QAAQ,EAAE,UAAU,KAAK;CACjF,IAAI,MAAM,GAAG,OAAO;CACpB,GAAG,aAAa,OAAO,KAAK,CAAC;CAC7B,OAAO;AACT;;;;;;AAOA,MAAa,oBACX,IACA,OAAgD,CAAC,MAClB;CAC/B,MAAM,QAAQ,KAAK,SAAS;CAC5B,IAAI,UAAU,OAAO,OAAO,GAAG;CAC/B,IAAI,UAAU,YAAY,OAAO,GAAG,aAAa,QAAQ,MAAM,EAAE,UAAU,KAAA,CAAS;CACpF,OAAO,GAAG,aAAa,QAAQ,MAAM,EAAE,UAAU,KAAK;AACxD"}
1
+ {"version":3,"file":"defined-names-CviWmtQg.mjs","names":[],"sources":["../src/workbook/defined-names.ts"],"sourcesContent":["// Workbook-level defined names. Models the OOXML schema's `<definedName>` element.\n//\n// A defined name binds an identifier to a formula-style value (`'Sheet\n// 1'!$A$1:$B$10`, `SUM(A:A)`, etc). Workbook-scope names omit `localSheetId`;\n// sheet-scope names use the 0-based sheet index. Excel reserves a handful of\n// names with the `_xlnm.` prefix for built-in uses (Print_Area, Print_Titles,\n// Sheet_Title, etc) — those round-trip here as plain DefinedName entries since\n// the value semantics are the same.\n\nimport { OpenXmlSchemaError } from '../utils/exceptions.js';\n\nexport interface DefinedName {\n /** Identifier — `_xlnm.Print_Area` for built-ins, otherwise user-chosen. */\n name: string;\n /** The formula expression the name points at. */\n value: string;\n /** 0-based sheet index for sheet-scope names; undefined → workbook-scope. */\n scope?: number;\n /** Hidden from the Name Manager when true. */\n hidden?: boolean;\n /** Optional human-readable description. */\n comment?: string;\n}\n\nexport function makeDefinedName(opts: Partial<DefinedName> & { name: string; value: string }): DefinedName {\n return {\n name: opts.name,\n value: opts.value,\n ...(opts.scope !== undefined ? { scope: opts.scope } : {}),\n ...(opts.hidden !== undefined ? { hidden: opts.hidden } : {}),\n ...(opts.comment !== undefined ? { comment: opts.comment } : {}),\n };\n}\n\n// ---- Workbook ergonomic helpers -----------------------------------------\n\nimport { type CellRangeBoundaries, parseSheetRange } from '../utils/coordinate.js';\nimport type { Worksheet } from '../worksheet/worksheet.js';\nimport { getRangeAddress } from '../worksheet/worksheet.js';\nimport type { Workbook } from './workbook.js';\n\n/**\n * One parsed leg of a defined name's value. Defined-name values can be\n * comma-separated multi-range expressions (e.g. `_xlnm.Print_Titles` sets\n * `Sheet!$1:$1,Sheet!$A:$A`); this represents one such leg.\n */\nexport interface DefinedNameTarget {\n sheet: string;\n range: string;\n bounds: CellRangeBoundaries;\n}\n\n/**\n * Add a workbook-scope or sheet-scope defined name. If a defined name with the\n * same `name` (and `scope`) already exists, it's replaced — Excel allows one\n * workbook-scope and one per-sheet-scope name, but not two with the same scope.\n * Returns the resulting `DefinedName`.\n */\nexport const addDefinedName = (\n wb: Workbook,\n opts: Partial<DefinedName> & { name: string; value: string },\n): DefinedName => {\n const dn = makeDefinedName(opts);\n // Replace any existing entry with the same name + scope.\n const idx = wb.definedNames.findIndex((d) => d.name === dn.name && d.scope === dn.scope);\n if (idx >= 0) {\n wb.definedNames[idx] = dn;\n } else {\n wb.definedNames.push(dn);\n }\n return dn;\n};\n\n/**\n * High-level: register a defined name pointing at a worksheet range. Combines\n * {@link getRangeAddress} (sheet-qualified, properly quoted) with {@link\n * addDefinedName}, so the caller doesn't have to assemble the formula string by\n * hand.\n *\n * Pass `opts.localToSheet: true` to scope the name to the worksheet (instead of\n * the workbook). Re-using the same `name` + scope replaces the previous entry\n * (Excel's per-scope-uniqueness rule).\n *\n * Throws when `localToSheet: true` is set but the worksheet isn't on\n * `wb.sheets` — that would be a stale Worksheet reference.\n */\nexport const addDefinedNameForRange = (\n wb: Workbook,\n name: string,\n ws: Worksheet,\n range: string,\n opts: { localToSheet?: boolean; hidden?: boolean; comment?: string } = {},\n): DefinedName => {\n const value = getRangeAddress(ws, range);\n let scope: number | undefined;\n if (opts.localToSheet) {\n const idx = wb.sheets.findIndex((s) => s.sheet === ws);\n if (idx < 0) {\n throw new OpenXmlSchemaError(\n `addDefinedNameForRange: worksheet \"${ws.title}\" is not registered on this workbook`,\n );\n }\n scope = idx;\n }\n return addDefinedName(wb, {\n name,\n value,\n ...(scope !== undefined ? { scope } : {}),\n ...(opts.hidden !== undefined ? { hidden: opts.hidden } : {}),\n ...(opts.comment !== undefined ? { comment: opts.comment } : {}),\n });\n};\n\n/** Look up a defined name by identifier and (optional) sheet scope. */\nexport const getDefinedName = (\n wb: Workbook,\n name: string,\n scope?: number,\n): DefinedName | undefined => wb.definedNames.find((d) => d.name === name && d.scope === scope);\n\n/**\n * Resolve a defined name's `value` into one or more {@link DefinedNameTarget}s.\n * Comma-separated values (e.g. `_xlnm.Print_Titles` typically sets\n * `Sheet!$1:$1,Sheet!$A:$A`) yield one entry per leg; a plain `Sheet!A1:B5`\n * yields a single-element array.\n *\n * Returns `undefined` when the name doesn't exist; throws when the value can't\n * be parsed (e.g. a constant or a non-range formula — defined names are\n * sometimes used for things like `=42` or `=SUM(A:A)` which aren't ranges).\n */\nexport const getDefinedNameTarget = (\n wb: Workbook,\n name: string,\n scope?: number,\n): DefinedNameTarget[] | undefined => {\n const dn = getDefinedName(wb, name, scope);\n if (!dn) return undefined;\n // Defined-name values use `,` as the leg separator. Sheet titles can\n // themselves contain commas inside `'...'` quotes — split on commas that\n // aren't inside an unbalanced single-quoted segment.\n const legs: string[] = [];\n let current = '';\n let inQuote = false;\n for (let i = 0; i < dn.value.length; i++) {\n const c = dn.value[i];\n if (c === \"'\") {\n // Doubled `''` inside a quoted run is the escape for a literal apostrophe\n // — skip the second one without flipping the state.\n if (inQuote && dn.value[i + 1] === \"'\") {\n current += \"''\";\n i++;\n continue;\n }\n inQuote = !inQuote;\n current += c;\n continue;\n }\n if (c === ',' && !inQuote) {\n legs.push(current);\n current = '';\n continue;\n }\n current += c;\n }\n if (current.length > 0) legs.push(current);\n return legs.map((leg) => parseSheetRange(leg));\n};\n\n/**\n * Remove a defined name by identifier + scope. Returns true if any entry was\n * removed.\n */\nexport const removeDefinedName = (wb: Workbook, name: string, scope?: number): boolean => {\n const idx = wb.definedNames.findIndex((d) => d.name === name && d.scope === scope);\n if (idx < 0) return false;\n wb.definedNames.splice(idx, 1);\n return true;\n};\n\n/**\n * Read-only snapshot of every defined name. Pass `{ scope }` to narrow to\n * workbook-scope (`scope: undefined`) or one specific sheet (`scope: 0`) — omit\n * the option entirely to list all.\n */\nexport const listDefinedNames = (\n wb: Workbook,\n opts: { scope?: number | 'workbook' | 'all' } = {},\n): ReadonlyArray<DefinedName> => {\n const scope = opts.scope ?? 'all';\n if (scope === 'all') return wb.definedNames;\n if (scope === 'workbook') return wb.definedNames.filter((d) => d.scope === undefined);\n return wb.definedNames.filter((d) => d.scope === scope);\n};\n\n/**\n * Bulk-remove every defined name matching `predicate`. Returns the count\n * removed. Mirrors {@link removeDataValidations} on worksheets.\n */\nexport const removeDefinedNames = (\n wb: Workbook,\n predicate: (d: DefinedName) => boolean,\n): number => {\n const before = wb.definedNames.length;\n wb.definedNames = wb.definedNames.filter((d) => !predicate(d));\n return before - wb.definedNames.length;\n};\n\n/**\n * Rename a defined name, scoped or workbook-scope. Returns `true` when an entry\n * was renamed. Throws when `newName` is already taken with the same scope\n * (Excel forbids duplicates within a scope).\n */\nexport const renameDefinedName = (\n wb: Workbook,\n oldName: string,\n newName: string,\n scope?: number,\n): boolean => {\n const idx = wb.definedNames.findIndex((d) => d.name === oldName && d.scope === scope);\n if (idx < 0) return false;\n const conflict = wb.definedNames.findIndex((d, i) => i !== idx && d.name === newName && d.scope === scope);\n if (conflict >= 0) {\n throw new OpenXmlSchemaError(`renameDefinedName: \"${newName}\" is already in use at the same scope`);\n }\n const existing = wb.definedNames[idx];\n if (!existing) return false;\n wb.definedNames[idx] = { ...existing, name: newName };\n return true;\n};\n\n/**\n * Read-only snapshot of every `_xlnm.Print_Area` defined name. Each entry is\n * the raw DefinedName carrying `scope` (sheet index) and `value` (the\n * print-area expression like `'Sheet1'!$A$1:$D$10`).\n */\nexport const listPrintAreas = (wb: Workbook): ReadonlyArray<DefinedName> =>\n wb.definedNames.filter((d) => d.name === '_xlnm.Print_Area');\n\n/**\n * Read-only snapshot of every `_xlnm.Print_Titles` defined name. Each entry's\n * `value` is the title-row / title-col expression Excel re-uses on every\n * printed page.\n */\nexport const listPrintTitles = (wb: Workbook): ReadonlyArray<DefinedName> =>\n wb.definedNames.filter((d) => d.name === '_xlnm.Print_Titles');\n\n/**\n * Define the print-area for a given sheet. Excel uses the built-in\n * `_xlnm.Print_Area` defined name with sheet scope.\n */\nexport const setPrintArea = (wb: Workbook, sheetIndex: number, ref: string): DefinedName => {\n return addDefinedName(wb, {\n name: '_xlnm.Print_Area',\n value: ref,\n scope: sheetIndex,\n });\n};\n\n/**\n * Define print-title rows / columns on a sheet. Excel uses the\n * `_xlnm.Print_Titles` defined name. Pass `rows` (\"$1:$1\") to repeat row 1 on\n * every printed page; `cols` (\"$A:$A\") to repeat column A.\n */\nexport const setPrintTitles = (\n wb: Workbook,\n sheetIndex: number,\n opts: { rows?: string; cols?: string; sheetName: string },\n): DefinedName => {\n const parts: string[] = [];\n // The wire form is \"Sheet!$1:$1,Sheet!$A:$A\"; both refs share the sheet\n // prefix.\n if (opts.cols !== undefined) parts.push(`'${opts.sheetName}'!${opts.cols}`);\n if (opts.rows !== undefined) parts.push(`'${opts.sheetName}'!${opts.rows}`);\n if (parts.length === 0) {\n throw new OpenXmlSchemaError('setPrintTitles: at least one of rows or cols must be set');\n }\n return addDefinedName(wb, {\n name: '_xlnm.Print_Titles',\n value: parts.join(','),\n scope: sheetIndex,\n });\n};\n"],"mappings":";;AAwBA,SAAgB,gBAAgB,MAA2E;CACzG,OAAO;EACL,MAAM,KAAK;EACX,OAAO,KAAK;EACZ,GAAI,KAAK,UAAU,KAAA,IAAY,EAAE,OAAO,KAAK,MAAM,IAAI,CAAC;EACxD,GAAI,KAAK,WAAW,KAAA,IAAY,EAAE,QAAQ,KAAK,OAAO,IAAI,CAAC;EAC3D,GAAI,KAAK,YAAY,KAAA,IAAY,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;CAChE;AACF;;;;;;;AA0BA,MAAa,kBACX,IACA,SACgB;CAChB,MAAM,KAAK,gBAAgB,IAAI;CAE/B,MAAM,MAAM,GAAG,aAAa,WAAW,MAAM,EAAE,SAAS,GAAG,QAAQ,EAAE,UAAU,GAAG,KAAK;CACvF,IAAI,OAAO,GACT,GAAG,aAAa,OAAO;MAEvB,GAAG,aAAa,KAAK,EAAE;CAEzB,OAAO;AACT;;AA2CA,MAAa,kBACX,IACA,MACA,UAC4B,GAAG,aAAa,MAAM,MAAM,EAAE,SAAS,QAAQ,EAAE,UAAU,KAAK;;;;;;;;;;;AAY9F,MAAa,wBACX,IACA,MACA,UACoC;CACpC,MAAM,KAAK,eAAe,IAAI,MAAM,KAAK;CACzC,IAAI,CAAC,IAAI,OAAO,KAAA;CAIhB,MAAM,OAAiB,CAAC;CACxB,IAAI,UAAU;CACd,IAAI,UAAU;CACd,KAAK,IAAI,IAAI,GAAG,IAAI,GAAG,MAAM,QAAQ,KAAK;EACxC,MAAM,IAAI,GAAG,MAAM;EACnB,IAAI,MAAM,KAAK;GAGb,IAAI,WAAW,GAAG,MAAM,IAAI,OAAO,KAAK;IACtC,WAAW;IACX;IACA;GACF;GACA,UAAU,CAAC;GACX,WAAW;GACX;EACF;EACA,IAAI,MAAM,OAAO,CAAC,SAAS;GACzB,KAAK,KAAK,OAAO;GACjB,UAAU;GACV;EACF;EACA,WAAW;CACb;CACA,IAAI,QAAQ,SAAS,GAAG,KAAK,KAAK,OAAO;CACzC,OAAO,KAAK,KAAK,QAAQ,gBAAgB,GAAG,CAAC;AAC/C;;;;;AAMA,MAAa,qBAAqB,IAAc,MAAc,UAA4B;CACxF,MAAM,MAAM,GAAG,aAAa,WAAW,MAAM,EAAE,SAAS,QAAQ,EAAE,UAAU,KAAK;CACjF,IAAI,MAAM,GAAG,OAAO;CACpB,GAAG,aAAa,OAAO,KAAK,CAAC;CAC7B,OAAO;AACT;;;;;;AAOA,MAAa,oBACX,IACA,OAAgD,CAAC,MAClB;CAC/B,MAAM,QAAQ,KAAK,SAAS;CAC5B,IAAI,UAAU,OAAO,OAAO,GAAG;CAC/B,IAAI,UAAU,YAAY,OAAO,GAAG,aAAa,QAAQ,MAAM,EAAE,UAAU,KAAA,CAAS;CACpF,OAAO,GAAG,aAAa,QAAQ,MAAM,EAAE,UAAU,KAAK;AACxD"}
@@ -1 +1 @@
1
- {"version":3,"file":"differential-DvKU8fJt.mjs","names":[],"sources":["../src/styles/differential.ts"],"sourcesContent":["// DifferentialStyle (DXF) — partial style overlay used by conditional\n// formatting and Excel-table style elements. Mirrors\n// openpyxl/openpyxl/styles/differential.py.\n//\n// Where a NamedStyle / CellXf carries a *complete* style snapshot, a\n// DifferentialStyle carries only the components that override the base.\n// The Stylesheet keeps DXFs in their own pool (`dxfs`) and conditional-\n// formatting rules / table-style elements reference them by index.\n\nimport { stableStringify } from '../utils/stable-stringify';\nimport type { Alignment } from './alignment';\nimport type { Border } from './borders';\nimport type { Fill } from './fills';\nimport type { Font } from './fonts';\nimport type { NumberFormat } from './numbers';\nimport type { Protection } from './protection';\nimport type { Stylesheet } from './stylesheet';\n\n/**\n * Differential (\"partial\") style. Every component is optional; only\n * the set fields override the base style of whatever the DXF is\n * applied to.\n */\nexport interface DifferentialStyle {\n readonly font?: Font;\n readonly fill?: Fill;\n readonly border?: Border;\n readonly alignment?: Alignment;\n readonly protection?: Protection;\n /**\n * NumberFormat carries both the id and the format code so DXFs can\n * reference custom user-defined number formats without ambiguity.\n */\n readonly numFmt?: NumberFormat;\n}\n\nexport function makeDifferentialStyle(opts: Partial<DifferentialStyle> = {}): DifferentialStyle {\n const out: { -readonly [K in keyof DifferentialStyle]: DifferentialStyle[K] } = {};\n if (opts.font !== undefined) out.font = opts.font;\n if (opts.fill !== undefined) out.fill = opts.fill;\n if (opts.border !== undefined) out.border = opts.border;\n if (opts.alignment !== undefined) out.alignment = opts.alignment;\n if (opts.protection !== undefined) out.protection = opts.protection;\n if (opts.numFmt !== undefined) out.numFmt = opts.numFmt;\n return Object.freeze(out);\n}\n\n/**\n * Stylesheet pool extension. The DXF list is allocated lazily on first\n * use so empty stylesheets stay slim.\n */\nexport interface StylesheetWithDxfs extends Stylesheet {\n dxfs?: DifferentialStyle[];\n _dxfIdByKey?: Map<string, number>;\n}\n\n/**\n * Add a DifferentialStyle to the stylesheet's `dxfs` pool. Returns\n * the 0-based index. Idempotent on structural equality (via\n * stableStringify).\n */\nexport function addDxf(ss: Stylesheet, dxf: DifferentialStyle): number {\n const w = ss as StylesheetWithDxfs;\n if (w.dxfs === undefined) w.dxfs = [];\n if (w._dxfIdByKey === undefined) w._dxfIdByKey = new Map();\n const key = stableStringify(dxf);\n const cached = w._dxfIdByKey.get(key);\n if (cached !== undefined) return cached;\n const id = w.dxfs.length;\n w.dxfs.push(dxf);\n w._dxfIdByKey.set(key, id);\n return id;\n}\n\n/** Read-only access to the dxfs pool. Returns `[]` when none registered. */\nexport function getDxfs(ss: Stylesheet): ReadonlyArray<DifferentialStyle> {\n return (ss as StylesheetWithDxfs).dxfs ?? [];\n}\n"],"mappings":";;AAoCA,SAAgB,sBAAsB,OAAmC,CAAC,GAAsB;CAC9F,MAAM,MAA0E,CAAC;CACjF,IAAI,KAAK,SAAS,KAAA,GAAW,IAAI,OAAO,KAAK;CAC7C,IAAI,KAAK,SAAS,KAAA,GAAW,IAAI,OAAO,KAAK;CAC7C,IAAI,KAAK,WAAW,KAAA,GAAW,IAAI,SAAS,KAAK;CACjD,IAAI,KAAK,cAAc,KAAA,GAAW,IAAI,YAAY,KAAK;CACvD,IAAI,KAAK,eAAe,KAAA,GAAW,IAAI,aAAa,KAAK;CACzD,IAAI,KAAK,WAAW,KAAA,GAAW,IAAI,SAAS,KAAK;CACjD,OAAO,OAAO,OAAO,GAAG;AAC1B;;;;;;AAgBA,SAAgB,OAAO,IAAgB,KAAgC;CACrE,MAAM,IAAI;CACV,IAAI,EAAE,SAAS,KAAA,GAAW,EAAE,OAAO,CAAC;CACpC,IAAI,EAAE,gBAAgB,KAAA,GAAW,EAAE,8BAAc,IAAI,IAAI;CACzD,MAAM,MAAM,gBAAgB,GAAG;CAC/B,MAAM,SAAS,EAAE,YAAY,IAAI,GAAG;CACpC,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,MAAM,KAAK,EAAE,KAAK;CAClB,EAAE,KAAK,KAAK,GAAG;CACf,EAAE,YAAY,IAAI,KAAK,EAAE;CACzB,OAAO;AACT;;AAGA,SAAgB,QAAQ,IAAkD;CACxE,OAAQ,GAA0B,QAAQ,CAAC;AAC7C"}
1
+ {"version":3,"file":"differential-DvKU8fJt.mjs","names":[],"sources":["../src/styles/differential.ts"],"sourcesContent":["// DifferentialStyle (DXF) — partial style overlay used by conditional\n// formatting and Excel-table style elements. Mirrors\n// openpyxl/openpyxl/styles/differential.py.\n//\n// Where a NamedStyle / CellXf carries a *complete* style snapshot, a\n// DifferentialStyle carries only the components that override the base.\n// The Stylesheet keeps DXFs in their own pool (`dxfs`) and conditional-\n// formatting rules / table-style elements reference them by index.\n\nimport { stableStringify } from '../utils/stable-stringify.js';\nimport type { Alignment } from './alignment.js';\nimport type { Border } from './borders.js';\nimport type { Fill } from './fills.js';\nimport type { Font } from './fonts.js';\nimport type { NumberFormat } from './numbers.js';\nimport type { Protection } from './protection.js';\nimport type { Stylesheet } from './stylesheet.js';\n\n/**\n * Differential (\"partial\") style. Every component is optional; only\n * the set fields override the base style of whatever the DXF is\n * applied to.\n */\nexport interface DifferentialStyle {\n readonly font?: Font;\n readonly fill?: Fill;\n readonly border?: Border;\n readonly alignment?: Alignment;\n readonly protection?: Protection;\n /**\n * NumberFormat carries both the id and the format code so DXFs can\n * reference custom user-defined number formats without ambiguity.\n */\n readonly numFmt?: NumberFormat;\n}\n\nexport function makeDifferentialStyle(opts: Partial<DifferentialStyle> = {}): DifferentialStyle {\n const out: { -readonly [K in keyof DifferentialStyle]: DifferentialStyle[K] } = {};\n if (opts.font !== undefined) out.font = opts.font;\n if (opts.fill !== undefined) out.fill = opts.fill;\n if (opts.border !== undefined) out.border = opts.border;\n if (opts.alignment !== undefined) out.alignment = opts.alignment;\n if (opts.protection !== undefined) out.protection = opts.protection;\n if (opts.numFmt !== undefined) out.numFmt = opts.numFmt;\n return Object.freeze(out);\n}\n\n/**\n * Stylesheet pool extension. The DXF list is allocated lazily on first\n * use so empty stylesheets stay slim.\n */\nexport interface StylesheetWithDxfs extends Stylesheet {\n dxfs?: DifferentialStyle[];\n _dxfIdByKey?: Map<string, number>;\n}\n\n/**\n * Add a DifferentialStyle to the stylesheet's `dxfs` pool. Returns\n * the 0-based index. Idempotent on structural equality (via\n * stableStringify).\n */\nexport function addDxf(ss: Stylesheet, dxf: DifferentialStyle): number {\n const w = ss as StylesheetWithDxfs;\n if (w.dxfs === undefined) w.dxfs = [];\n if (w._dxfIdByKey === undefined) w._dxfIdByKey = new Map();\n const key = stableStringify(dxf);\n const cached = w._dxfIdByKey.get(key);\n if (cached !== undefined) return cached;\n const id = w.dxfs.length;\n w.dxfs.push(dxf);\n w._dxfIdByKey.set(key, id);\n return id;\n}\n\n/** Read-only access to the dxfs pool. Returns `[]` when none registered. */\nexport function getDxfs(ss: Stylesheet): ReadonlyArray<DifferentialStyle> {\n return (ss as StylesheetWithDxfs).dxfs ?? [];\n}\n"],"mappings":";;AAoCA,SAAgB,sBAAsB,OAAmC,CAAC,GAAsB;CAC9F,MAAM,MAA0E,CAAC;CACjF,IAAI,KAAK,SAAS,KAAA,GAAW,IAAI,OAAO,KAAK;CAC7C,IAAI,KAAK,SAAS,KAAA,GAAW,IAAI,OAAO,KAAK;CAC7C,IAAI,KAAK,WAAW,KAAA,GAAW,IAAI,SAAS,KAAK;CACjD,IAAI,KAAK,cAAc,KAAA,GAAW,IAAI,YAAY,KAAK;CACvD,IAAI,KAAK,eAAe,KAAA,GAAW,IAAI,aAAa,KAAK;CACzD,IAAI,KAAK,WAAW,KAAA,GAAW,IAAI,SAAS,KAAK;CACjD,OAAO,OAAO,OAAO,GAAG;AAC1B;;;;;;AAgBA,SAAgB,OAAO,IAAgB,KAAgC;CACrE,MAAM,IAAI;CACV,IAAI,EAAE,SAAS,KAAA,GAAW,EAAE,OAAO,CAAC;CACpC,IAAI,EAAE,gBAAgB,KAAA,GAAW,EAAE,8BAAc,IAAI,IAAI;CACzD,MAAM,MAAM,gBAAgB,GAAG;CAC/B,MAAM,SAAS,EAAE,YAAY,IAAI,GAAG;CACpC,IAAI,WAAW,KAAA,GAAW,OAAO;CACjC,MAAM,KAAK,EAAE,KAAK;CAClB,EAAE,KAAK,KAAK,GAAG;CACf,EAAE,YAAY,IAAI,KAAK,EAAE;CACzB,OAAO;AACT;;AAGA,SAAgB,QAAQ,IAAkD;CACxE,OAAQ,GAA0B,QAAQ,CAAC;AAC7C"}
@@ -1,11 +1,11 @@
1
- import { type XmlNode } from '../../xml/tree';
2
- import { type DmlColorWithMods } from './colors';
3
- import type { EffectsRef } from './effect';
4
- import type { Fill } from './fill';
5
- import type { Geometry } from './geometry';
6
- import type { LineProperties } from './line';
7
- import type { ShapeProperties } from './shape-properties';
8
- import type { TextBody, TextBodyProperties } from './text';
1
+ import { type XmlNode } from '../../xml/tree.js';
2
+ import { type DmlColorWithMods } from './colors.js';
3
+ import type { EffectsRef } from './effect.js';
4
+ import type { Fill } from './fill.js';
5
+ import type { Geometry } from './geometry.js';
6
+ import type { LineProperties } from './line.js';
7
+ import type { ShapeProperties } from './shape-properties.js';
8
+ import type { TextBody, TextBodyProperties } from './text.js';
9
9
  /** Parse the first known color base element (with its mods) found inside `parent`. */
10
10
  export declare const parseDmlColor: (parent: XmlNode) => DmlColorWithMods | undefined;
11
11
  /** Serialize a color directly (without an enclosing wrapper). */
@@ -1,5 +1,5 @@
1
- import type { DmlColorWithMods } from './colors';
2
- import type { Fill } from './fill';
1
+ import type { DmlColorWithMods } from './colors.js';
2
+ import type { Fill } from './fill.js';
3
3
  export type FillBlendMode = 'over' | 'mult' | 'screen' | 'darken' | 'lighten';
4
4
  export type ShadowAlign = 'tl' | 't' | 'tr' | 'l' | 'ctr' | 'r' | 'bl' | 'b' | 'br';
5
5
  /** Preset-shadow names (`<a:prstShdw prst="shdwN"/>`, 20 entries). */
@@ -1,4 +1,4 @@
1
- import type { DmlColor, DmlColorWithMods } from './colors';
1
+ import type { DmlColor, DmlColorWithMods } from './colors.js';
2
2
  /** Relative rectangle (0..100000-thousandths). */
3
3
  export interface RelativeRect {
4
4
  l?: number;
@@ -1,4 +1,4 @@
1
- import type { Point2D } from './shape-properties';
1
+ import type { Point2D } from './shape-properties.js';
2
2
  /**
3
3
  * ECMA-376 §20.1.10.55 preset shape catalogue (`ST_PresetShapeType`, 187
4
4
  * entries). Pulled from openpyxl's `PresetGeometry2D.prst` Set so the test
@@ -1,4 +1,4 @@
1
- import type { Fill } from './fill';
1
+ import type { Fill } from './fill.js';
2
2
  export type PresetDash = 'solid' | 'dot' | 'dash' | 'lgDash' | 'dashDot' | 'lgDashDot' | 'lgDashDotDot' | 'sysDash' | 'sysDot' | 'sysDashDot' | 'sysDashDotDot';
3
3
  type LineDash = {
4
4
  kind: 'preset';
@@ -1,8 +1,8 @@
1
- import type { Point2D, PositiveSize2D } from '../anchor';
2
- import type { EffectsRef } from './effect';
3
- import type { Fill } from './fill';
4
- import type { Geometry } from './geometry';
5
- import type { LineProperties } from './line';
1
+ import type { Point2D, PositiveSize2D } from '../anchor.js';
2
+ import type { EffectsRef } from './effect.js';
3
+ import type { Fill } from './fill.js';
4
+ import type { Geometry } from './geometry.js';
5
+ import type { LineProperties } from './line.js';
6
6
  export type { Point2D, PositiveSize2D };
7
7
  export type BlackWhiteMode = 'clr' | 'auto' | 'gray' | 'ltGray' | 'invGray' | 'grayWhite' | 'blackGray' | 'blackWhite' | 'black' | 'white' | 'hidden';
8
8
  /** `<a:xfrm>`. Position / size / rotation transformation. */
@@ -1,7 +1,7 @@
1
- import type { DmlColorWithMods } from './colors';
2
- import type { EffectsRef } from './effect';
3
- import type { Fill } from './fill';
4
- import type { LineProperties } from './line';
1
+ import type { DmlColorWithMods } from './colors.js';
2
+ import type { EffectsRef } from './effect.js';
3
+ import type { Fill } from './fill.js';
4
+ import type { LineProperties } from './line.js';
5
5
  export type FontAlign = 'auto' | 't' | 'ctr' | 'base' | 'b';
6
6
  export type ParagraphAlign = 'l' | 'ctr' | 'r' | 'just' | 'justLow' | 'dist' | 'thaiDist';
7
7
  export type TextUnderline = 'none' | 'words' | 'sng' | 'dbl' | 'heavy' | 'dotted' | 'dottedHeavy' | 'dash' | 'dashHeavy' | 'dashLong' | 'dashLongHeavy' | 'dotDash' | 'dotDashHeavy' | 'dotDotDash' | 'dotDotDashHeavy' | 'wavy' | 'wavyHeavy' | 'wavyDbl';
@@ -1,4 +1,4 @@
1
- import { type Drawing } from './drawing';
1
+ import { type Drawing } from './drawing.js';
2
2
  /** Parse a `xl/drawings/drawingN.xml` payload into a Drawing object. */
3
3
  export declare function parseDrawingXml(bytes: Uint8Array | string): Drawing;
4
4
  /**