@office-kit/xlsx 0.8.0

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 (220) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +319 -0
  3. package/THIRD_PARTY_NOTICES.md +56 -0
  4. package/dist/cell/cell.d.ts +234 -0
  5. package/dist/cell/index.d.ts +4 -0
  6. package/dist/cell/rich-text.d.ts +37 -0
  7. package/dist/cell-D9CaNKnU.mjs +320 -0
  8. package/dist/cell-D9CaNKnU.mjs.map +1 -0
  9. package/dist/cell-style-BEDjMX1y.mjs +1579 -0
  10. package/dist/cell-style-BEDjMX1y.mjs.map +1 -0
  11. package/dist/cell.mjs +2 -0
  12. package/dist/chart/chart-xml.d.ts +16 -0
  13. package/dist/chart/chart.d.ts +735 -0
  14. package/dist/chart/cx/chartex-xml.d.ts +6 -0
  15. package/dist/chart/cx/chartex.d.ts +279 -0
  16. package/dist/chart/index.d.ts +6 -0
  17. package/dist/chart/user-shapes-xml.d.ts +4 -0
  18. package/dist/chart/user-shapes.d.ts +61 -0
  19. package/dist/chart.mjs +232 -0
  20. package/dist/chart.mjs.map +1 -0
  21. package/dist/chartsheet/chartsheet-xml.d.ts +17 -0
  22. package/dist/chartsheet/chartsheet.d.ts +121 -0
  23. package/dist/chartsheet/index.d.ts +2 -0
  24. package/dist/chartsheet-C3-tqkPy.mjs +23 -0
  25. package/dist/chartsheet-C3-tqkPy.mjs.map +1 -0
  26. package/dist/chartsheet.mjs +2 -0
  27. package/dist/colors-ovWAwnZI.mjs +67 -0
  28. package/dist/colors-ovWAwnZI.mjs.map +1 -0
  29. package/dist/compat/numbers.d.ts +14 -0
  30. package/dist/coordinate-96Ecci4d.mjs +276 -0
  31. package/dist/coordinate-96Ecci4d.mjs.map +1 -0
  32. package/dist/datetime-B2ySVlXt.mjs +71 -0
  33. package/dist/datetime-B2ySVlXt.mjs.map +1 -0
  34. package/dist/defined-names-CviWmtQg.mjs +89 -0
  35. package/dist/defined-names-CviWmtQg.mjs.map +1 -0
  36. package/dist/differential-D4dg-qtZ.mjs +37 -0
  37. package/dist/differential-D4dg-qtZ.mjs.map +1 -0
  38. package/dist/drawing/anchor.d.ts +63 -0
  39. package/dist/drawing/dml/colors.d.ts +109 -0
  40. package/dist/drawing/dml/dml-xml.d.ts +35 -0
  41. package/dist/drawing/dml/effect.d.ts +92 -0
  42. package/dist/drawing/dml/fill.d.ts +115 -0
  43. package/dist/drawing/dml/geometry.d.ts +113 -0
  44. package/dist/drawing/dml/line.d.ts +41 -0
  45. package/dist/drawing/dml/shape-properties.d.ts +33 -0
  46. package/dist/drawing/dml/text.d.ts +218 -0
  47. package/dist/drawing/drawing-xml.d.ts +5 -0
  48. package/dist/drawing/drawing.d.ts +117 -0
  49. package/dist/drawing/image.d.ts +40 -0
  50. package/dist/drawing/index.d.ts +14 -0
  51. package/dist/drawing-BxzLuryn.mjs +415 -0
  52. package/dist/drawing-BxzLuryn.mjs.map +1 -0
  53. package/dist/drawing.mjs +119 -0
  54. package/dist/drawing.mjs.map +1 -0
  55. package/dist/escape-DFTE7ZJc.mjs +51 -0
  56. package/dist/escape-DFTE7ZJc.mjs.map +1 -0
  57. package/dist/exceptions-D-CFwxgm.mjs +37 -0
  58. package/dist/exceptions-D-CFwxgm.mjs.map +1 -0
  59. package/dist/formula/tokenizer.d.ts +61 -0
  60. package/dist/formula/translate.d.ts +67 -0
  61. package/dist/inference-B3ES3KEJ.mjs +42 -0
  62. package/dist/inference-B3ES3KEJ.mjs.map +1 -0
  63. package/dist/io/browser.d.ts +41 -0
  64. package/dist/io/index.d.ts +7 -0
  65. package/dist/io/load.d.ts +46 -0
  66. package/dist/io/node-fs.d.ts +62 -0
  67. package/dist/io/node-save.d.ts +3 -0
  68. package/dist/io/node.d.ts +17 -0
  69. package/dist/io/save.d.ts +14 -0
  70. package/dist/io/sink.d.ts +54 -0
  71. package/dist/io/source.d.ts +14 -0
  72. package/dist/io.mjs +212 -0
  73. package/dist/io.mjs.map +1 -0
  74. package/dist/load-D5cbhoGx.mjs +1069 -0
  75. package/dist/load-D5cbhoGx.mjs.map +1 -0
  76. package/dist/manifest-Dps1-OpP.mjs +801 -0
  77. package/dist/manifest-Dps1-OpP.mjs.map +1 -0
  78. package/dist/node.d.ts +3 -0
  79. package/dist/node.mjs +308 -0
  80. package/dist/node.mjs.map +1 -0
  81. package/dist/packaging/core.d.ts +45 -0
  82. package/dist/packaging/custom.d.ts +62 -0
  83. package/dist/packaging/extended.d.ts +45 -0
  84. package/dist/packaging/index.d.ts +10 -0
  85. package/dist/packaging/manifest.d.ts +24 -0
  86. package/dist/packaging/relationships.d.ts +30 -0
  87. package/dist/packaging.mjs +2 -0
  88. package/dist/parser-DuLejQy1.mjs +156 -0
  89. package/dist/parser-DuLejQy1.mjs.map +1 -0
  90. package/dist/reader-D1fNW9k1.mjs +534 -0
  91. package/dist/reader-D1fNW9k1.mjs.map +1 -0
  92. package/dist/save-RohQtgEZ.mjs +745 -0
  93. package/dist/save-RohQtgEZ.mjs.map +1 -0
  94. package/dist/schema/core.d.ts +133 -0
  95. package/dist/schema/index.d.ts +3 -0
  96. package/dist/schema/serialize.d.ts +6 -0
  97. package/dist/schema.mjs +2 -0
  98. package/dist/serialize-55EnT30e.mjs +254 -0
  99. package/dist/serialize-55EnT30e.mjs.map +1 -0
  100. package/dist/serializer-BwbgHYJV.mjs +116 -0
  101. package/dist/serializer-BwbgHYJV.mjs.map +1 -0
  102. package/dist/streaming/index.d.ts +2 -0
  103. package/dist/streaming/read-only.d.ts +38 -0
  104. package/dist/streaming/write-only.d.ts +47 -0
  105. package/dist/streaming.mjs +612 -0
  106. package/dist/streaming.mjs.map +1 -0
  107. package/dist/styles/alignment.d.ts +33 -0
  108. package/dist/styles/alignment.schema.d.ts +3 -0
  109. package/dist/styles/borders.d.ts +40 -0
  110. package/dist/styles/borders.schema.d.ts +4 -0
  111. package/dist/styles/cell-style.d.ts +270 -0
  112. package/dist/styles/colors.d.ts +128 -0
  113. package/dist/styles/colors.schema.d.ts +3 -0
  114. package/dist/styles/differential.d.ts +41 -0
  115. package/dist/styles/fills.d.ts +54 -0
  116. package/dist/styles/fills.schema.d.ts +6 -0
  117. package/dist/styles/fonts.d.ts +44 -0
  118. package/dist/styles/fonts.schema.d.ts +3 -0
  119. package/dist/styles/index.d.ts +21 -0
  120. package/dist/styles/named-styles.d.ts +52 -0
  121. package/dist/styles/numbers.d.ts +39 -0
  122. package/dist/styles/numbers.schema.d.ts +3 -0
  123. package/dist/styles/protection.d.ts +9 -0
  124. package/dist/styles/protection.schema.d.ts +3 -0
  125. package/dist/styles/stylesheet-reader.d.ts +7 -0
  126. package/dist/styles/stylesheet-writer.d.ts +3 -0
  127. package/dist/styles/stylesheet.d.ts +95 -0
  128. package/dist/styles.mjs +4 -0
  129. package/dist/stylesheet-writer-C2eRmn22.mjs +8624 -0
  130. package/dist/stylesheet-writer-C2eRmn22.mjs.map +1 -0
  131. package/dist/table-DkX6UniA.mjs +113 -0
  132. package/dist/table-DkX6UniA.mjs.map +1 -0
  133. package/dist/tree-Bbs1C8Rc.mjs +192 -0
  134. package/dist/tree-Bbs1C8Rc.mjs.map +1 -0
  135. package/dist/units-rOMQqXh2.mjs +41 -0
  136. package/dist/units-rOMQqXh2.mjs.map +1 -0
  137. package/dist/user-shapes-DfmCGKB0.mjs +252 -0
  138. package/dist/user-shapes-DfmCGKB0.mjs.map +1 -0
  139. package/dist/utf8-D91g1XTG.mjs +143 -0
  140. package/dist/utf8-D91g1XTG.mjs.map +1 -0
  141. package/dist/utils/coordinate.d.ts +103 -0
  142. package/dist/utils/css.d.ts +18 -0
  143. package/dist/utils/datetime.d.ts +38 -0
  144. package/dist/utils/escape.d.ts +34 -0
  145. package/dist/utils/exceptions.d.ts +34 -0
  146. package/dist/utils/index.d.ts +11 -0
  147. package/dist/utils/inference.d.ts +24 -0
  148. package/dist/utils/stable-stringify.d.ts +7 -0
  149. package/dist/utils/units.d.ts +14 -0
  150. package/dist/utils/utf8.d.ts +1 -0
  151. package/dist/utils.mjs +39 -0
  152. package/dist/utils.mjs.map +1 -0
  153. package/dist/workbook/calc-properties.d.ts +47 -0
  154. package/dist/workbook/defined-names.d.ts +121 -0
  155. package/dist/workbook/file-recovery.d.ts +11 -0
  156. package/dist/workbook/file-sharing.d.ts +14 -0
  157. package/dist/workbook/file-version.d.ts +13 -0
  158. package/dist/workbook/function-groups.d.ts +10 -0
  159. package/dist/workbook/index.d.ts +24 -0
  160. package/dist/workbook/protection.d.ts +35 -0
  161. package/dist/workbook/shared-strings.d.ts +57 -0
  162. package/dist/workbook/smart-tags.d.ts +13 -0
  163. package/dist/workbook/views.d.ts +89 -0
  164. package/dist/workbook/workbook-properties.d.ts +57 -0
  165. package/dist/workbook/workbook.d.ts +643 -0
  166. package/dist/workbook-HGYNRBlV.mjs +636 -0
  167. package/dist/workbook-HGYNRBlV.mjs.map +1 -0
  168. package/dist/workbook.mjs +58 -0
  169. package/dist/workbook.mjs.map +1 -0
  170. package/dist/worksheet/auto-filter.d.ts +34 -0
  171. package/dist/worksheet/cell-range.d.ts +121 -0
  172. package/dist/worksheet/comments-xml.d.ts +24 -0
  173. package/dist/worksheet/comments.d.ts +13 -0
  174. package/dist/worksheet/conditional-formatting.d.ts +150 -0
  175. package/dist/worksheet/custom-sheet-views.d.ts +43 -0
  176. package/dist/worksheet/data-consolidate.d.ts +29 -0
  177. package/dist/worksheet/data-validations.d.ts +72 -0
  178. package/dist/worksheet/dimensions.d.ts +40 -0
  179. package/dist/worksheet/errors.d.ts +40 -0
  180. package/dist/worksheet/hyperlinks.d.ts +42 -0
  181. package/dist/worksheet/index.d.ts +46 -0
  182. package/dist/worksheet/ole-objects.d.ts +37 -0
  183. package/dist/worksheet/page-setup.d.ts +173 -0
  184. package/dist/worksheet/phonetic.d.ts +11 -0
  185. package/dist/worksheet/properties.d.ts +34 -0
  186. package/dist/worksheet/protected-ranges.d.ts +19 -0
  187. package/dist/worksheet/protection.d.ts +44 -0
  188. package/dist/worksheet/reader.d.ts +38 -0
  189. package/dist/worksheet/scenarios.d.ts +36 -0
  190. package/dist/worksheet/smart-tags.d.ts +23 -0
  191. package/dist/worksheet/sort-state.d.ts +28 -0
  192. package/dist/worksheet/table-xml.d.ts +5 -0
  193. package/dist/worksheet/table.d.ts +80 -0
  194. package/dist/worksheet/views.d.ts +47 -0
  195. package/dist/worksheet/web-publish.d.ts +21 -0
  196. package/dist/worksheet/worksheet.d.ts +935 -0
  197. package/dist/worksheet/writer.d.ts +72 -0
  198. package/dist/worksheet-CmCNoIgD.mjs +1726 -0
  199. package/dist/worksheet-CmCNoIgD.mjs.map +1 -0
  200. package/dist/worksheet.mjs +247 -0
  201. package/dist/worksheet.mjs.map +1 -0
  202. package/dist/writer-DspzfkNA.mjs +221 -0
  203. package/dist/writer-DspzfkNA.mjs.map +1 -0
  204. package/dist/xml/index.d.ts +10 -0
  205. package/dist/xml/iterparse.d.ts +22 -0
  206. package/dist/xml/namespaces.d.ts +91 -0
  207. package/dist/xml/parser.d.ts +7 -0
  208. package/dist/xml/serializer.d.ts +14 -0
  209. package/dist/xml/stream-writer.d.ts +39 -0
  210. package/dist/xml/tree.d.ts +37 -0
  211. package/dist/xml.mjs +140 -0
  212. package/dist/xml.mjs.map +1 -0
  213. package/dist/zip/decompression-guard.d.ts +70 -0
  214. package/dist/zip/index.d.ts +6 -0
  215. package/dist/zip/random-access-reader.d.ts +16 -0
  216. package/dist/zip/reader.d.ts +45 -0
  217. package/dist/zip/writer.d.ts +65 -0
  218. package/dist/zip/zip64-patch.d.ts +12 -0
  219. package/dist/zip.mjs +3 -0
  220. package/package.json +147 -0
@@ -0,0 +1,121 @@
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';
5
+ /** `<sheetView>` inside `<sheetViews>`. */
6
+ export interface ChartsheetView {
7
+ workbookViewId: number;
8
+ tabSelected?: boolean;
9
+ zoomScale?: number;
10
+ zoomToFit?: boolean;
11
+ }
12
+ /** `<sheetPr>` chartsheet properties. */
13
+ export interface ChartsheetProperties {
14
+ published?: boolean;
15
+ codeName?: string;
16
+ /**
17
+ * Tab strip colour. Mirrors `SheetProperties.tabColor` on worksheets so the
18
+ * two sheet kinds expose the same colour model (rgb / indexed / theme /
19
+ * auto / tint) instead of forcing callers to special-case chartsheets.
20
+ */
21
+ tabColor?: Color;
22
+ }
23
+ /** Subset of `<sheetProtection>` fields we round-trip on chartsheets. */
24
+ export interface ChartsheetProtection {
25
+ /** Protect content (chart elements / text). */
26
+ content?: boolean;
27
+ /** Protect drawing objects (shapes / annotations). */
28
+ objects?: boolean;
29
+ algorithmName?: string;
30
+ hashValue?: string;
31
+ saltValue?: string;
32
+ spinCount?: number;
33
+ }
34
+ export interface Chartsheet {
35
+ /** Display title shown in Excel's tab strip. Mirrors Worksheet.title for SheetRef compatibility. */
36
+ title: string;
37
+ views: ChartsheetView[];
38
+ properties?: ChartsheetProperties;
39
+ protection?: ChartsheetProtection;
40
+ /**
41
+ * Drawing payload — typically a single absoluteAnchor with a chart
42
+ * graphicFrame. Mirrors Worksheet.drawing so the existing drawing-XML helpers
43
+ * can be reused.
44
+ */
45
+ drawing?: Drawing;
46
+ /** `<pageMargins>` — six required margins in inches. */
47
+ pageMargins?: PageMargins;
48
+ /** `<pageSetup>` — paper size / orientation / scale / fitToPage. */
49
+ pageSetup?: PageSetup;
50
+ /** `<headerFooter>` — odd/even/first header + footer mini-format strings. */
51
+ headerFooter?: HeaderFooter;
52
+ /** `<legacyDrawing r:id="…"/>` — VML drawing for comments / form-control overlay. */
53
+ legacyDrawingRId?: string;
54
+ /** `<legacyDrawingHF r:id="…"/>` — VML drawing for header/footer print background. */
55
+ legacyDrawingHFRId?: string;
56
+ /**
57
+ * `<drawingHF r:id="…" lho="N" cho="N" lhe="N" che="N" lhf="N" chf="N"
58
+ * rho="N" cho2="N" rhe="N" che2="N" rhf="N" chf2="N" lfo="N" cfo="N" lfe="N"
59
+ * cfe="N" lff="N" cff="N" rfo="N" cfo2="N" rfe="N" cfe2="N" rff="N"
60
+ * cff2="N"/>` — drawing slot + per-section image indices for header/footer
61
+ * print backgrounds (DrawingML rather than VML).
62
+ */
63
+ drawingHF?: ChartsheetDrawingHF;
64
+ /** `<picture r:id="…"/>` — chartsheet background image. */
65
+ backgroundPictureRId?: string;
66
+ /** `<webPublishItems>` — Excel 2007 "Publish to web" entries (rare on chartsheets). */
67
+ webPublishItems: WebPublishItem[];
68
+ /**
69
+ * `<customSheetViews>` — saved per-user view presets for this chartsheet
70
+ * (Shared Workbook era). Each entry can carry its own page margins / setup /
71
+ * header-footer.
72
+ */
73
+ customSheetViews: ChartsheetCustomSheetView[];
74
+ }
75
+ /** One `<customSheetView>` entry inside a chartsheet. */
76
+ export interface ChartsheetCustomSheetView {
77
+ guid: string;
78
+ scale?: number;
79
+ state?: 'visible' | 'hidden' | 'veryHidden';
80
+ zoomToFit?: boolean;
81
+ pageMargins?: PageMargins;
82
+ pageSetup?: PageSetup;
83
+ headerFooter?: HeaderFooter;
84
+ }
85
+ export declare const makeChartsheetCustomSheetView: (opts: Partial<ChartsheetCustomSheetView> & {
86
+ guid: string;
87
+ }) => ChartsheetCustomSheetView;
88
+ /**
89
+ * `<drawingHF>` — per-section image-index map for the header/footer drawing
90
+ * reference. Each `*o` / `*e` / `*f` attr is a 1-based image number into the
91
+ * referenced drawing part. All optional.
92
+ */
93
+ export interface ChartsheetDrawingHF {
94
+ /** Required rels link to xl/drawings/drawingN.xml carrying the actual image refs. */
95
+ rId: string;
96
+ /** Left-header image index for odd pages. */
97
+ lho?: number;
98
+ cho?: number;
99
+ rho?: number;
100
+ /** Left-header image index for even pages. */
101
+ lhe?: number;
102
+ che?: number;
103
+ rhe?: number;
104
+ /** Left-header image index for the first page (when differentFirst). */
105
+ lhf?: number;
106
+ chf?: number;
107
+ rhf?: number;
108
+ /** Left-footer image index for odd pages. */
109
+ lfo?: number;
110
+ cfo?: number;
111
+ rfo?: number;
112
+ /** Left-footer image index for even pages. */
113
+ lfe?: number;
114
+ cfe?: number;
115
+ rfe?: number;
116
+ /** Left-footer image index for first page. */
117
+ lff?: number;
118
+ cff?: number;
119
+ rff?: number;
120
+ }
121
+ export declare const makeChartsheet: (title: string) => Chartsheet;
@@ -0,0 +1,2 @@
1
+ export type { Chartsheet, ChartsheetCustomSheetView, ChartsheetDrawingHF, ChartsheetProperties, ChartsheetProtection, ChartsheetView, } from './chartsheet';
2
+ export { makeChartsheet, makeChartsheetCustomSheetView } from './chartsheet';
@@ -0,0 +1,23 @@
1
+ //#region src/chartsheet/chartsheet.ts
2
+ const makeChartsheetCustomSheetView = (opts) => ({
3
+ guid: opts.guid,
4
+ ...opts.scale !== void 0 ? { scale: opts.scale } : {},
5
+ ...opts.state !== void 0 ? { state: opts.state } : {},
6
+ ...opts.zoomToFit !== void 0 ? { zoomToFit: opts.zoomToFit } : {},
7
+ ...opts.pageMargins !== void 0 ? { pageMargins: opts.pageMargins } : {},
8
+ ...opts.pageSetup !== void 0 ? { pageSetup: opts.pageSetup } : {},
9
+ ...opts.headerFooter !== void 0 ? { headerFooter: opts.headerFooter } : {}
10
+ });
11
+ const makeChartsheet = (title) => ({
12
+ title,
13
+ views: [{
14
+ workbookViewId: 0,
15
+ zoomToFit: true
16
+ }],
17
+ webPublishItems: [],
18
+ customSheetViews: []
19
+ });
20
+ //#endregion
21
+ export { makeChartsheetCustomSheetView as n, makeChartsheet as t };
22
+
23
+ //# sourceMappingURL=chartsheet-C3-tqkPy.mjs.map
@@ -0,0 +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"}
@@ -0,0 +1,2 @@
1
+ import { n as makeChartsheetCustomSheetView, t as makeChartsheet } from "./chartsheet-C3-tqkPy.mjs";
2
+ export { makeChartsheet, makeChartsheetCustomSheetView };
@@ -0,0 +1,67 @@
1
+ //#region src/drawing/dml/colors.ts
2
+ const SCHEME_COLOR_NAMES = [
3
+ "bg1",
4
+ "tx1",
5
+ "bg2",
6
+ "tx2",
7
+ "accent1",
8
+ "accent2",
9
+ "accent3",
10
+ "accent4",
11
+ "accent5",
12
+ "accent6",
13
+ "hlink",
14
+ "folHlink",
15
+ "phClr",
16
+ "dk1",
17
+ "lt1",
18
+ "dk2",
19
+ "lt2"
20
+ ];
21
+ /** Color mod kinds that take no `val` attribute (their elements are empty). */
22
+ const VALUELESS_COLOR_MOD_KINDS = [
23
+ "gray",
24
+ "comp",
25
+ "inv",
26
+ "invGamma",
27
+ "gamma"
28
+ ];
29
+ /** Color mod kinds that carry a numeric `val` attribute. */
30
+ const VALUED_COLOR_MOD_KINDS = [
31
+ "lumMod",
32
+ "lumOff",
33
+ "satMod",
34
+ "satOff",
35
+ "hueMod",
36
+ "hueOff",
37
+ "tint",
38
+ "shade",
39
+ "alpha",
40
+ "alphaMod",
41
+ "alphaOff",
42
+ "red",
43
+ "green",
44
+ "blue",
45
+ "redMod",
46
+ "greenMod",
47
+ "blueMod",
48
+ "redOff",
49
+ "greenOff",
50
+ "blueOff"
51
+ ];
52
+ const makeSrgbColor = (rrggbb) => ({
53
+ kind: "srgb",
54
+ value: rrggbb.toUpperCase()
55
+ });
56
+ const makeSchemeColor = (name) => ({
57
+ kind: "schemeClr",
58
+ value: name
59
+ });
60
+ const makeColor = (base, mods = []) => ({
61
+ base,
62
+ mods
63
+ });
64
+ //#endregion
65
+ export { makeSchemeColor as a, makeColor as i, VALUED_COLOR_MOD_KINDS as n, makeSrgbColor as o, VALUELESS_COLOR_MOD_KINDS as r, SCHEME_COLOR_NAMES as t };
66
+
67
+ //# sourceMappingURL=colors-ovWAwnZI.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors-ovWAwnZI.mjs","names":[],"sources":["../src/drawing/dml/colors.ts"],"sourcesContent":["// DrawingML colors.\n//\n// ECMA-376 spreads \"color\" across six element kinds (`<a:srgbClr>`,\n// `<a:sysClr>`, `<a:schemeClr>`, `<a:prstClr>`, `<a:hslClr>`, `<a:scrgbClr>`)\n// plus a long modifier list (`<a:lumMod>`, `<a:tint>`, etc.) that may follow\n// the base color. The model splits the two: a `DmlColor` discriminated union\n// for the base, and a `ColorMod[]` carrying the ordered modifier list. Wrapping\n// them in `DmlColorWithMods` keeps the modifier order — Excel re-applies them\n// in the same sequence.\n\n/** ECMA-376 scheme-color names (`<a:schemeClr val=\"...\">`). */\nexport type SchemeColorName =\n | 'bg1'\n | 'tx1'\n | 'bg2'\n | 'tx2'\n | 'accent1'\n | 'accent2'\n | 'accent3'\n | 'accent4'\n | 'accent5'\n | 'accent6'\n | 'hlink'\n | 'folHlink'\n | 'phClr'\n | 'dk1'\n | 'lt1'\n | 'dk2'\n | 'lt2';\n\nexport const SCHEME_COLOR_NAMES: ReadonlyArray<SchemeColorName> = [\n 'bg1',\n 'tx1',\n 'bg2',\n 'tx2',\n 'accent1',\n 'accent2',\n 'accent3',\n 'accent4',\n 'accent5',\n 'accent6',\n 'hlink',\n 'folHlink',\n 'phClr',\n 'dk1',\n 'lt1',\n 'dk2',\n 'lt2',\n];\n\nexport type DmlColor =\n | { kind: 'srgb'; value: string /* RRGGBB */ }\n | { kind: 'sysClr'; value: string; lastClr?: string }\n | { kind: 'schemeClr'; value: SchemeColorName }\n | { kind: 'prstClr'; value: string }\n | { kind: 'hslClr'; hue: number; sat: number; lum: number }\n | { kind: 'scrgbClr'; r: number; g: number; b: number };\n\nexport type ColorMod =\n | { kind: 'lumMod'; val: number }\n | { kind: 'lumOff'; val: number }\n | { kind: 'satMod'; val: number }\n | { kind: 'satOff'; val: number }\n | { kind: 'hueMod'; val: number }\n | { kind: 'hueOff'; val: number }\n | { kind: 'tint'; val: number }\n | { kind: 'shade'; val: number }\n | { kind: 'alpha'; val: number }\n | { kind: 'alphaMod'; val: number }\n | { kind: 'alphaOff'; val: number }\n | { kind: 'red'; val: number }\n | { kind: 'green'; val: number }\n | { kind: 'blue'; val: number }\n | { kind: 'redMod'; val: number }\n | { kind: 'greenMod'; val: number }\n | { kind: 'blueMod'; val: number }\n | { kind: 'redOff'; val: number }\n | { kind: 'greenOff'; val: number }\n | { kind: 'blueOff'; val: number }\n | { kind: 'gray' }\n | { kind: 'comp' }\n | { kind: 'inv' }\n | { kind: 'invGamma' }\n | { kind: 'gamma' };\n\n/** Color mod kinds that take no `val` attribute (their elements are empty). */\nexport const VALUELESS_COLOR_MOD_KINDS: ReadonlyArray<ColorMod['kind']> = ['gray', 'comp', 'inv', 'invGamma', 'gamma'];\n\n/** Color mod kinds that carry a numeric `val` attribute. */\nexport const VALUED_COLOR_MOD_KINDS: ReadonlyArray<ColorMod['kind']> = [\n 'lumMod',\n 'lumOff',\n 'satMod',\n 'satOff',\n 'hueMod',\n 'hueOff',\n 'tint',\n 'shade',\n 'alpha',\n 'alphaMod',\n 'alphaOff',\n 'red',\n 'green',\n 'blue',\n 'redMod',\n 'greenMod',\n 'blueMod',\n 'redOff',\n 'greenOff',\n 'blueOff',\n];\n\nexport interface DmlColorWithMods {\n base: DmlColor;\n mods: ColorMod[];\n}\n\nexport const makeSrgbColor = (rrggbb: string): DmlColor => ({ kind: 'srgb', value: rrggbb.toUpperCase() });\n\nexport const makeSchemeColor = (name: SchemeColorName): DmlColor => ({ kind: 'schemeClr', value: name });\n\nexport const makeColor = (base: DmlColor, mods: ColorMod[] = []): DmlColorWithMods => ({ base, mods });\n"],"mappings":";AA8BA,MAAa,qBAAqD;CAChE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;;AAsCA,MAAa,4BAA6D;CAAC;CAAQ;CAAQ;CAAO;CAAY;AAAO;;AAGrH,MAAa,yBAA0D;CACrE;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF;AAOA,MAAa,iBAAiB,YAA8B;CAAE,MAAM;CAAQ,OAAO,OAAO,YAAY;AAAE;AAExG,MAAa,mBAAmB,UAAqC;CAAE,MAAM;CAAa,OAAO;AAAK;AAEtG,MAAa,aAAa,MAAgB,OAAmB,CAAC,OAAyB;CAAE;CAAM;AAAK"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * `Number.isFinite` typed as a guard. Distinct from the global `isFinite()`
3
+ * which coerces strings. Rejects `NaN` and ±Infinity.
4
+ */
5
+ export declare function isFiniteNumber(x: unknown): x is number;
6
+ /** `Number.isInteger` typed as a guard. */
7
+ export declare function isInteger(x: unknown): x is number;
8
+ /**
9
+ * Detect any of the JS typed-array views (Int8Array, Uint8Array, Float32Array,
10
+ * etc.). Used at workbook-build boundaries where integration code may pass
11
+ * numpy-style buffers — we accept them and iterate per-element rather than
12
+ * refusing.
13
+ */
14
+ export declare function isTypedArray(x: unknown): x is ArrayBufferView;
@@ -0,0 +1,276 @@
1
+ import { o as OpenXmlSchemaError } from "./exceptions-D-CFwxgm.mjs";
2
+ //#region src/utils/coordinate.ts
3
+ /** Maximum column index Excel accepts (XFD). */
4
+ const MAX_COL = 16384;
5
+ /** Maximum row index Excel accepts. */
6
+ const MAX_ROW = 1048576;
7
+ const indexByLetter = /* @__PURE__ */ new Map();
8
+ const letterByIndex = /* @__PURE__ */ new Map();
9
+ /**
10
+ * 1-based column index → spreadsheet column letter ("A", "Z", "AA", "XFD").
11
+ * Throws OpenXmlSchemaError when out of range.
12
+ */
13
+ function columnLetterFromIndex(n) {
14
+ const cached = letterByIndex.get(n);
15
+ if (cached !== void 0) return cached;
16
+ if (!Number.isInteger(n) || n < 1 || n > 16384) throw new OpenXmlSchemaError(`column index ${n} is out of range [1, ${MAX_COL}]`);
17
+ let m = n;
18
+ let out = "";
19
+ while (m > 0) {
20
+ m -= 1;
21
+ out = String.fromCharCode(65 + m % 26) + out;
22
+ m = Math.floor(m / 26);
23
+ }
24
+ letterByIndex.set(n, out);
25
+ return out;
26
+ }
27
+ /**
28
+ * Column letter → 1-based column index. Case-insensitive but at most 3 letters
29
+ * (the spec ceiling). Throws on empty / non-A-Z / over-range.
30
+ */
31
+ function columnIndexFromLetter(letter) {
32
+ const cached = indexByLetter.get(letter);
33
+ if (cached !== void 0) return cached;
34
+ if (letter.length === 0 || letter.length > 3) throw new OpenXmlSchemaError(`column letter "${letter}" is empty or too long`);
35
+ let n = 0;
36
+ for (let i = 0; i < letter.length; i++) {
37
+ const c = letter.charCodeAt(i);
38
+ let v;
39
+ if (c >= 65 && c <= 90) v = c - 64;
40
+ else if (c >= 97 && c <= 122) v = c - 96;
41
+ else throw new OpenXmlSchemaError(`column letter "${letter}" contains non-letter char`);
42
+ n = n * 26 + v;
43
+ }
44
+ if (n < 1 || n > 16384) throw new OpenXmlSchemaError(`column letter "${letter}" expands to out-of-range index ${n}`);
45
+ const key = letter.toUpperCase();
46
+ indexByLetter.set(key, n);
47
+ if (key !== letter) indexByLetter.set(letter, n);
48
+ return n;
49
+ }
50
+ const COORD_RE = /^[$]?([A-Za-z]{1,3})[$]?([1-9][0-9]*)$/;
51
+ const COL_RANGE_RE = /^[$]?([A-Za-z]{1,3}):[$]?([A-Za-z]{1,3})$/;
52
+ const ROW_RANGE_RE = /^[$]?([1-9][0-9]*):[$]?([1-9][0-9]*)$/;
53
+ const SHEET_RANGE_RE = /^(?:'((?:[^']|'')+)'|([^'!]+))!(.+)$/;
54
+ /**
55
+ * Parse a single-cell coordinate string ("A1", "$XFD$1048576") into its column
56
+ * letter (always uppercased) and 1-based row.
57
+ */
58
+ function coordinateFromString(coord) {
59
+ const m = COORD_RE.exec(coord);
60
+ if (m === null || m[1] === void 0 || m[2] === void 0) throw new OpenXmlSchemaError(`coordinateFromString: invalid coordinate "${coord}"`);
61
+ const column = m[1].toUpperCase();
62
+ const row = Number.parseInt(m[2], 10);
63
+ if (row < 1 || row > 1048576) throw new OpenXmlSchemaError(`coordinateFromString: row ${row} out of range`);
64
+ columnIndexFromLetter(column);
65
+ return {
66
+ column,
67
+ row
68
+ };
69
+ }
70
+ /**
71
+ * Same as {@link coordinateFromString} but returning the column as its 1-based
72
+ * numeric index. Thin convenience for the worksheet read path.
73
+ */
74
+ function coordinateToTuple(coord) {
75
+ const c = coordinateFromString(coord);
76
+ return {
77
+ col: columnIndexFromLetter(c.column),
78
+ row: c.row
79
+ };
80
+ }
81
+ /** Compose `"A1"` from a 1-based (col, row). */
82
+ function tupleToCoordinate(col, row) {
83
+ if (!Number.isInteger(row) || row < 1 || row > 1048576) throw new OpenXmlSchemaError(`tupleToCoordinate: row ${row} out of range`);
84
+ return `${columnLetterFromIndex(col)}${row}`;
85
+ }
86
+ /**
87
+ * Predicate: true iff `s` is a valid single-cell A1 coordinate (`"A1"`,
88
+ * `"XFD1048576"`). Strings with `$` absolute markers, surrounding whitespace,
89
+ * ranges (`A1:B2`), or out-of-bound row / column return false. Useful for
90
+ * sanitising user input before passing to {@link coordinateToTuple} or
91
+ * `setCellByCoord`.
92
+ */
93
+ function isValidCellRef(s) {
94
+ if (typeof s !== "string") return false;
95
+ const m = /^([A-Za-z]{1,3})([1-9][0-9]*)$/.exec(s);
96
+ if (!m) return false;
97
+ const colStr = m[1];
98
+ const rowStr = m[2];
99
+ if (colStr === void 0 || rowStr === void 0) return false;
100
+ const col = columnIndexFromLetterUnchecked(colStr);
101
+ if (col < 1 || col > 16384) return false;
102
+ const row = Number.parseInt(rowStr, 10);
103
+ if (!Number.isFinite(row) || row < 1 || row > 1048576) return false;
104
+ return true;
105
+ }
106
+ /**
107
+ * Predicate: true iff `s` is a valid A1-style range expression — single cell,
108
+ * two-corner range, whole column (`A:A`), or whole row (`1:1`). `$` markers,
109
+ * whitespace, and out-of-bound bounds fail. Sanity-check before {@link
110
+ * rangeBoundaries} / `parseRange`.
111
+ */
112
+ function isValidRangeRef(s) {
113
+ if (typeof s !== "string" || s.length === 0) return false;
114
+ if (isValidCellRef(s)) return true;
115
+ const ab = /^([A-Za-z]{1,3})([1-9][0-9]*):([A-Za-z]{1,3})([1-9][0-9]*)$/.exec(s);
116
+ if (ab) {
117
+ const [, c1, r1, c2, r2] = ab;
118
+ if (!c1 || !r1 || !c2 || !r2) return false;
119
+ const col1 = columnIndexFromLetterUnchecked(c1);
120
+ const col2 = columnIndexFromLetterUnchecked(c2);
121
+ if (col1 < 1 || col1 > 16384 || col2 < 1 || col2 > 16384) return false;
122
+ const row1 = Number.parseInt(r1, 10);
123
+ const row2 = Number.parseInt(r2, 10);
124
+ return row1 >= 1 && row1 <= 1048576 && row2 >= 1 && row2 <= 1048576;
125
+ }
126
+ const cc = /^([A-Za-z]{1,3}):([A-Za-z]{1,3})$/.exec(s);
127
+ if (cc) {
128
+ const [, c1, c2] = cc;
129
+ if (!c1 || !c2) return false;
130
+ const col1 = columnIndexFromLetterUnchecked(c1);
131
+ const col2 = columnIndexFromLetterUnchecked(c2);
132
+ return col1 >= 1 && col1 <= 16384 && col2 >= 1 && col2 <= 16384;
133
+ }
134
+ const rr = /^([1-9][0-9]*):([1-9][0-9]*)$/.exec(s);
135
+ if (rr) {
136
+ const [, r1, r2] = rr;
137
+ if (!r1 || !r2) return false;
138
+ const row1 = Number.parseInt(r1, 10);
139
+ const row2 = Number.parseInt(r2, 10);
140
+ return row1 >= 1 && row1 <= 1048576 && row2 >= 1 && row2 <= 1048576;
141
+ }
142
+ return false;
143
+ }
144
+ const columnIndexFromLetterUnchecked = (letters) => {
145
+ let n = 0;
146
+ const upper = letters.toUpperCase();
147
+ for (let i = 0; i < upper.length; i++) {
148
+ const ch = upper.charCodeAt(i);
149
+ if (ch < 65 || ch > 90) return -1;
150
+ n = n * 26 + (ch - 64);
151
+ }
152
+ return n;
153
+ };
154
+ /**
155
+ * Predicate: true iff `s` is a valid 1..3-char column letter (`"A"` through
156
+ * `"XFD"`, case-insensitive). Empty / over-long / out-of-bound / non-string
157
+ * fails.
158
+ */
159
+ function isValidColumnLetter(s) {
160
+ if (typeof s !== "string" || s.length === 0 || s.length > 3) return false;
161
+ if (!/^[A-Za-z]+$/.test(s)) return false;
162
+ const col = columnIndexFromLetterUnchecked(s);
163
+ return col >= 1 && col <= 16384;
164
+ }
165
+ /**
166
+ * Predicate: true iff `n` is a valid 1-based row index in `[1, 1048576]`.
167
+ * Non-finite / non-integer / out-of-bound fails.
168
+ */
169
+ function isValidRowNumber(n) {
170
+ return typeof n === "number" && Number.isInteger(n) && n >= 1 && n <= 1048576;
171
+ }
172
+ /**
173
+ * Predicate: true iff `n` is a valid 1-based column index in `[1, 16384]`.
174
+ * Non-finite / non-integer / out-of-bound fails.
175
+ */
176
+ function isValidColumnNumber(n) {
177
+ return typeof n === "number" && Number.isInteger(n) && n >= 1 && n <= 16384;
178
+ }
179
+ /**
180
+ * Parse "A1:B5" / "A:A" / "1:1" / single-cell into 1-based (minCol, minRow,
181
+ * maxCol, maxRow). Whole-column ranges fill rows to [1, MAX_ROW]; whole-row
182
+ * ranges fill cols to [1, MAX_COL].
183
+ */
184
+ function rangeBoundaries(range) {
185
+ const trimmed = range.trim();
186
+ if (trimmed.length === 0) throw new OpenXmlSchemaError("rangeBoundaries: empty range");
187
+ const colon = trimmed.indexOf(":");
188
+ if (colon < 0) {
189
+ const c = coordinateFromString(trimmed);
190
+ const col = columnIndexFromLetter(c.column);
191
+ return {
192
+ minCol: col,
193
+ minRow: c.row,
194
+ maxCol: col,
195
+ maxRow: c.row
196
+ };
197
+ }
198
+ const left = trimmed.slice(0, colon);
199
+ const right = trimmed.slice(colon + 1);
200
+ const colsOnly = COL_RANGE_RE.exec(trimmed);
201
+ if (colsOnly !== null && colsOnly[1] !== void 0 && colsOnly[2] !== void 0) {
202
+ const minCol = columnIndexFromLetter(colsOnly[1]);
203
+ const maxCol = columnIndexFromLetter(colsOnly[2]);
204
+ return {
205
+ minCol: Math.min(minCol, maxCol),
206
+ minRow: 1,
207
+ maxCol: Math.max(minCol, maxCol),
208
+ maxRow: MAX_ROW
209
+ };
210
+ }
211
+ const rowsOnly = ROW_RANGE_RE.exec(trimmed);
212
+ if (rowsOnly !== null && rowsOnly[1] !== void 0 && rowsOnly[2] !== void 0) {
213
+ const minRow = Number.parseInt(rowsOnly[1], 10);
214
+ const maxRow = Number.parseInt(rowsOnly[2], 10);
215
+ if (minRow < 1 || maxRow < 1 || minRow > 1048576 || maxRow > 1048576) throw new OpenXmlSchemaError(`rangeBoundaries: row out of range in "${trimmed}"`);
216
+ return {
217
+ minCol: 1,
218
+ minRow: Math.min(minRow, maxRow),
219
+ maxCol: MAX_COL,
220
+ maxRow: Math.max(minRow, maxRow)
221
+ };
222
+ }
223
+ const a = coordinateFromString(left);
224
+ const b = coordinateFromString(right);
225
+ const ac = columnIndexFromLetter(a.column);
226
+ const bc = columnIndexFromLetter(b.column);
227
+ return {
228
+ minCol: Math.min(ac, bc),
229
+ minRow: Math.min(a.row, b.row),
230
+ maxCol: Math.max(ac, bc),
231
+ maxRow: Math.max(a.row, b.row)
232
+ };
233
+ }
234
+ /** Inverse of {@link rangeBoundaries} for the rectangular case. */
235
+ function boundariesToRangeString(b) {
236
+ const tl = tupleToCoordinate(b.minCol, b.minRow);
237
+ if (b.minCol === b.maxCol && b.minRow === b.maxRow) return tl;
238
+ return `${tl}:${tupleToCoordinate(b.maxCol, b.maxRow)}`;
239
+ }
240
+ /**
241
+ * Parse a sheet-qualified range ("Sheet1!A1:B5" / "'Quarter 1'!A1"). Sheet
242
+ * names with single quotes inside use SQL-style doubling ("'Bob''s Sheet'!A1")
243
+ * — we unescape on the way out.
244
+ */
245
+ function parseSheetRange(input) {
246
+ const m = SHEET_RANGE_RE.exec(input);
247
+ if (m === null) throw new OpenXmlSchemaError(`parseSheetRange: missing "!" delimiter in "${input}"`);
248
+ const quoted = m[1];
249
+ const bare = m[2];
250
+ const range = m[3];
251
+ if (range === void 0) throw new OpenXmlSchemaError(`parseSheetRange: empty range part in "${input}"`);
252
+ return {
253
+ sheet: quoted !== void 0 ? quoted.replace(/''/g, "'") : bare ?? "",
254
+ range,
255
+ bounds: rangeBoundaries(range)
256
+ };
257
+ }
258
+ const BARE_SHEET_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
259
+ /**
260
+ * Inverse of {@link parseSheetRange}: format a sheet title + range (or
261
+ * single-cell ref) as `Sheet1!A1` or `'Quarter 1'!A1` per Excel's
262
+ * sheet-qualified syntax. Single quotes inside the title are escaped by
263
+ * doubling (`'Bob''s Sheet'`).
264
+ *
265
+ * Quoting rule: sheet titles consisting only of `[A-Za-z_][A-Za-z0-9_]*` are
266
+ * emitted bare; everything else (spaces, digits-leading, hyphens, apostrophes,
267
+ * punctuation…) gets wrapped in single quotes.
268
+ */
269
+ function formatSheetQualifiedRef(sheet, ref) {
270
+ if (BARE_SHEET_NAME.test(sheet)) return `${sheet}!${ref}`;
271
+ return `'${sheet.replace(/'/g, "''")}'!${ref}`;
272
+ }
273
+ //#endregion
274
+ export { columnLetterFromIndex as a, formatSheetQualifiedRef as c, isValidColumnNumber as d, isValidRangeRef as f, tupleToCoordinate as g, rangeBoundaries as h, columnIndexFromLetter as i, isValidCellRef as l, parseSheetRange as m, MAX_ROW as n, coordinateFromString as o, isValidRowNumber as p, boundariesToRangeString as r, coordinateToTuple as s, MAX_COL as t, isValidColumnLetter as u };
275
+
276
+ //# sourceMappingURL=coordinate-96Ecci4d.mjs.map
@@ -0,0 +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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"}
@@ -0,0 +1,71 @@
1
+ import { o as OpenXmlSchemaError } from "./exceptions-D-CFwxgm.mjs";
2
+ //#region src/utils/datetime.ts
3
+ /** 1899-12-30 (UTC) — the Windows / 1900-system epoch in ms. */
4
+ const WINDOWS_EPOCH_MS = Date.UTC(1899, 11, 30);
5
+ /** 1904-01-01 (UTC) — the Mac / 1904-system epoch in ms. */
6
+ const MAC_EPOCH_MS = Date.UTC(1904, 0, 1);
7
+ const MS_PER_DAY = 864e5;
8
+ /** Serial day index of the phantom 1900-02-29; absorbed onto 1900-02-28. */
9
+ const LEAP_DUPLICATE_DAY = 60;
10
+ const epochMs = (e) => e === "mac" ? MAC_EPOCH_MS : WINDOWS_EPOCH_MS;
11
+ /**
12
+ * Convert an Excel serial date into a JS `Date` (UTC). The fractional part is
13
+ * treated as a fraction of a day. For Windows 1900 the leap-bug compensation
14
+ * kicks in for serials in [0, 60).
15
+ */
16
+ function excelToDate(serial, opts) {
17
+ if (!Number.isFinite(serial)) throw new OpenXmlSchemaError(`excelToDate: serial "${serial}" is not finite`);
18
+ const epoch = epochMs(opts?.epoch);
19
+ const day = Math.floor(serial);
20
+ const fraction = serial - day;
21
+ const ms = epoch + (epoch === WINDOWS_EPOCH_MS && serial >= 0 && serial < LEAP_DUPLICATE_DAY ? day + 1 : day) * MS_PER_DAY + Math.round(fraction * MS_PER_DAY);
22
+ return new Date(ms);
23
+ }
24
+ /**
25
+ * Convert a JS `Date` into an Excel serial. The Date is read in UTC. On Windows
26
+ * 1900, dates ≤ 1900-02-28 get a -1 day correction to account for Excel's
27
+ * phantom leap day.
28
+ */
29
+ function dateToExcel(date, opts) {
30
+ const t = date.getTime();
31
+ if (!Number.isFinite(t)) throw new OpenXmlSchemaError("dateToExcel: invalid Date");
32
+ const epoch = epochMs(opts?.epoch);
33
+ const dayStartMs = Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate());
34
+ const days = Math.round((dayStartMs - epoch) / MS_PER_DAY);
35
+ const subDay = (t - dayStartMs) / MS_PER_DAY;
36
+ return (epoch === WINDOWS_EPOCH_MS && days <= LEAP_DUPLICATE_DAY ? days - 1 : days) + subDay;
37
+ }
38
+ /** Excel duration serial (fraction of a day) → milliseconds. */
39
+ function excelToDuration(serial) {
40
+ if (!Number.isFinite(serial)) throw new OpenXmlSchemaError(`excelToDuration: serial "${serial}" is not finite`);
41
+ return Math.round(serial * MS_PER_DAY);
42
+ }
43
+ /** Milliseconds → Excel duration serial (fraction of a day). */
44
+ function durationToExcel(ms) {
45
+ if (!Number.isFinite(ms)) throw new OpenXmlSchemaError(`durationToExcel: ms "${ms}" is not finite`);
46
+ return ms / MS_PER_DAY;
47
+ }
48
+ /**
49
+ * Parse an ISO-8601 / W3CDTF datetime string into a `Date`. Same grammar as
50
+ * `new Date(string)`; the wrapper just adds typed error reporting and a
51
+ * stricter "must be a recognised ISO" guard.
52
+ */
53
+ function fromIso8601(s) {
54
+ if (typeof s !== "string" || s.length === 0) throw new OpenXmlSchemaError(`fromIso8601: empty input`);
55
+ const d = new Date(s);
56
+ if (Number.isNaN(d.getTime())) throw new OpenXmlSchemaError(`fromIso8601: invalid datetime "${s}"`);
57
+ return d;
58
+ }
59
+ /**
60
+ * Format a `Date` as ISO-8601 with second precision in UTC. Trims the
61
+ * millisecond fragment that `Date.toISOString()` always produces, so the output
62
+ * matches Excel / openpyxl's W3CDTF style.
63
+ */
64
+ function toIso8601(d) {
65
+ if (Number.isNaN(d.getTime())) throw new OpenXmlSchemaError("toIso8601: invalid Date");
66
+ return d.toISOString().replace(/\.\d{3}Z$/, "Z");
67
+ }
68
+ //#endregion
69
+ export { excelToDate as a, toIso8601 as c, durationToExcel as i, WINDOWS_EPOCH_MS as n, excelToDuration as o, dateToExcel as r, fromIso8601 as s, MAC_EPOCH_MS as t };
70
+
71
+ //# sourceMappingURL=datetime-B2ySVlXt.mjs.map