xlsx-mini 0.0.0 → 0.1.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 (86) hide show
  1. package/README.md +420 -2
  2. package/dist/browser.d.ts +16 -0
  3. package/dist/browser.d.ts.map +1 -0
  4. package/dist/browser.js +36 -0
  5. package/dist/browser.js.map +1 -0
  6. package/dist/errors/index.d.ts +21 -0
  7. package/dist/errors/index.d.ts.map +1 -0
  8. package/dist/errors/index.js +23 -0
  9. package/dist/errors/index.js.map +1 -0
  10. package/dist/index.d.ts +8 -0
  11. package/dist/index.d.ts.map +1 -0
  12. package/dist/index.js +5 -0
  13. package/dist/index.js.map +1 -0
  14. package/dist/opc/index.d.ts +8 -0
  15. package/dist/opc/index.d.ts.map +1 -0
  16. package/dist/opc/index.js +8 -0
  17. package/dist/opc/index.js.map +1 -0
  18. package/dist/opc/lib/compression.d.ts +17 -0
  19. package/dist/opc/lib/compression.d.ts.map +1 -0
  20. package/dist/opc/lib/compression.js +54 -0
  21. package/dist/opc/lib/compression.js.map +1 -0
  22. package/dist/opc/lib/crc32.d.ts +8 -0
  23. package/dist/opc/lib/crc32.d.ts.map +1 -0
  24. package/dist/opc/lib/crc32.js +58 -0
  25. package/dist/opc/lib/crc32.js.map +1 -0
  26. package/dist/opc/lib/zip.d.ts +13 -0
  27. package/dist/opc/lib/zip.d.ts.map +1 -0
  28. package/dist/opc/lib/zip.js +104 -0
  29. package/dist/opc/lib/zip.js.map +1 -0
  30. package/dist/shared-strings/index.d.ts +9 -0
  31. package/dist/shared-strings/index.d.ts.map +1 -0
  32. package/dist/shared-strings/index.js +27 -0
  33. package/dist/shared-strings/index.js.map +1 -0
  34. package/dist/styles/index.d.ts +32 -0
  35. package/dist/styles/index.d.ts.map +1 -0
  36. package/dist/styles/index.js +106 -0
  37. package/dist/styles/index.js.map +1 -0
  38. package/dist/workbook/index.d.ts +27 -0
  39. package/dist/workbook/index.d.ts.map +1 -0
  40. package/dist/workbook/index.js +75 -0
  41. package/dist/workbook/index.js.map +1 -0
  42. package/dist/workbook/lib/model.d.ts +11 -0
  43. package/dist/workbook/lib/model.d.ts.map +1 -0
  44. package/dist/workbook/lib/model.js +2 -0
  45. package/dist/workbook/lib/model.js.map +1 -0
  46. package/dist/workbook/lib/validate.d.ts +4 -0
  47. package/dist/workbook/lib/validate.d.ts.map +1 -0
  48. package/dist/workbook/lib/validate.js +38 -0
  49. package/dist/workbook/lib/validate.js.map +1 -0
  50. package/dist/worksheet/index.d.ts +16 -0
  51. package/dist/worksheet/index.d.ts.map +1 -0
  52. package/dist/worksheet/index.js +25 -0
  53. package/dist/worksheet/index.js.map +1 -0
  54. package/dist/worksheet/lib/cell-ref.d.ts +6 -0
  55. package/dist/worksheet/lib/cell-ref.d.ts.map +1 -0
  56. package/dist/worksheet/lib/cell-ref.js +19 -0
  57. package/dist/worksheet/lib/cell-ref.js.map +1 -0
  58. package/dist/worksheet/lib/from-objects.d.ts +53 -0
  59. package/dist/worksheet/lib/from-objects.d.ts.map +1 -0
  60. package/dist/worksheet/lib/from-objects.js +65 -0
  61. package/dist/worksheet/lib/from-objects.js.map +1 -0
  62. package/dist/worksheet/lib/layout.d.ts +12 -0
  63. package/dist/worksheet/lib/layout.d.ts.map +1 -0
  64. package/dist/worksheet/lib/layout.js +58 -0
  65. package/dist/worksheet/lib/layout.js.map +1 -0
  66. package/dist/worksheet/lib/model.d.ts +112 -0
  67. package/dist/worksheet/lib/model.d.ts.map +1 -0
  68. package/dist/worksheet/lib/model.js +2 -0
  69. package/dist/worksheet/lib/model.js.map +1 -0
  70. package/dist/worksheet/lib/render-rows.d.ts +23 -0
  71. package/dist/worksheet/lib/render-rows.d.ts.map +1 -0
  72. package/dist/worksheet/lib/render-rows.js +167 -0
  73. package/dist/worksheet/lib/render-rows.js.map +1 -0
  74. package/dist/worksheet/lib/serial.d.ts +11 -0
  75. package/dist/worksheet/lib/serial.d.ts.map +1 -0
  76. package/dist/worksheet/lib/serial.js +44 -0
  77. package/dist/worksheet/lib/serial.js.map +1 -0
  78. package/dist/write-xlsx.d.ts +29 -0
  79. package/dist/write-xlsx.d.ts.map +1 -0
  80. package/dist/write-xlsx.js +49 -0
  81. package/dist/write-xlsx.js.map +1 -0
  82. package/dist/xml/index.d.ts +24 -0
  83. package/dist/xml/index.d.ts.map +1 -0
  84. package/dist/xml/index.js +152 -0
  85. package/dist/xml/index.js.map +1 -0
  86. package/package.json +79 -7
@@ -0,0 +1,38 @@
1
+ import { XlsxMiniError } from "../../errors/index.js";
2
+ const MAX_NAME_LENGTH = 31;
3
+ const FORBIDDEN_CHARACTERS = /[[\]:*?/\\]/;
4
+ const RESERVED_NAME = "history";
5
+ /** Throws the first problem Excel would refuse: no sheets, a bad sheet name, a duplicate name. */
6
+ export function validateWorkbook(workbook) {
7
+ const sheets = workbook.sheets;
8
+ if (sheets.length === 0) {
9
+ throw new XlsxMiniError("NO_SHEETS", "sheets", "A workbook needs at least one sheet");
10
+ }
11
+ const seen = new Set();
12
+ for (let i = 0; i < sheets.length; i++) {
13
+ const path = `sheets[${i}].name`;
14
+ const name = sheets[i].name;
15
+ const problem = sheetNameProblem(name);
16
+ if (problem !== undefined)
17
+ throw new XlsxMiniError("INVALID_SHEET_NAME", path, problem);
18
+ const key = name.toLowerCase();
19
+ if (seen.has(key)) {
20
+ throw new XlsxMiniError("DUPLICATE_SHEET_NAME", path, `Sheet name "${name}" is already used; Excel compares names case-insensitively`);
21
+ }
22
+ seen.add(key);
23
+ }
24
+ }
25
+ function sheetNameProblem(name) {
26
+ if (typeof name !== "string" || name.length === 0)
27
+ return "Sheet name must be a non-empty string";
28
+ if (name.length > MAX_NAME_LENGTH)
29
+ return `Sheet name "${name}" is longer than ${MAX_NAME_LENGTH} characters`;
30
+ if (FORBIDDEN_CHARACTERS.test(name))
31
+ return `Sheet name "${name}" contains one of [ ] : * ? / \\`;
32
+ if (name.startsWith("'") || name.endsWith("'"))
33
+ return `Sheet name "${name}" cannot start or end with an apostrophe`;
34
+ if (name.toLowerCase() === RESERVED_NAME)
35
+ return `Sheet name "${name}" is reserved by Excel`;
36
+ return undefined;
37
+ }
38
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../src/workbook/lib/validate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAGtD,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,oBAAoB,GAAG,aAAa,CAAC;AAC3C,MAAM,aAAa,GAAG,SAAS,CAAC;AAEhC,kGAAkG;AAClG,MAAM,UAAU,gBAAgB,CAAC,QAAkB;IACjD,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IAC/B,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,aAAa,CAAC,WAAW,EAAE,QAAQ,EAAE,qCAAqC,CAAC,CAAC;IACxF,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,IAAI,CAAC;QAC7B,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,OAAO,KAAK,SAAS;YAAE,MAAM,IAAI,aAAa,CAAC,oBAAoB,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;QACxF,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,IAAI,aAAa,CACrB,sBAAsB,EACtB,IAAI,EACJ,eAAe,IAAI,4DAA4D,CAChF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,gBAAgB,CAAC,IAAa;IACrC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,uCAAuC,CAAC;IAClG,IAAI,IAAI,CAAC,MAAM,GAAG,eAAe;QAC/B,OAAO,eAAe,IAAI,oBAAoB,eAAe,aAAa,CAAC;IAC7E,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,eAAe,IAAI,kCAAkC,CAAC;IAClG,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC5C,OAAO,eAAe,IAAI,0CAA0C,CAAC;IACvE,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,aAAa;QAAE,OAAO,eAAe,IAAI,wBAAwB,CAAC;IAC7F,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import type { Sheet } from "./lib/model.js";
2
+ import { type WorksheetContext } from "./lib/render-rows.js";
3
+ export type { Cell, CellObject, CellValue, Coerce, Column, Freeze, Register, Registered, Row, Sheet, TemporalInstantLike, TemporalLike, TemporalPlainDateLike, TemporalPlainDateTimeLike, TemporalZonedDateTimeLike, } from "./lib/model.js";
4
+ export type { WorksheetContext } from "./lib/render-rows.js";
5
+ export { columnLetter } from "./lib/cell-ref.js";
6
+ export { type ObjectColumn, type SheetFromObjectsOptions, sheetFromObjects, } from "./lib/from-objects.js";
7
+ export { serialFromCivil, serialFromEpochMillis } from "./lib/serial.js";
8
+ /** A rendered worksheet part and what the workbook part needs to know about it. */
9
+ export interface RenderedWorksheet {
10
+ readonly data: Uint8Array;
11
+ /** The autofilter range such as `A1:C4`, when the sheet filters a non-empty range. */
12
+ readonly filterRange: string | undefined;
13
+ }
14
+ /** Renders `xl/worksheets/sheetN.xml`, interning text and registering styles as it goes. */
15
+ export declare function renderWorksheet(sheet: Sheet, context: WorksheetContext): RenderedWorksheet;
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/worksheet/index.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAmB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE9E,YAAY,EACV,IAAI,EACJ,UAAU,EACV,SAAS,EACT,MAAM,EACN,MAAM,EACN,MAAM,EACN,QAAQ,EACR,UAAU,EACV,GAAG,EACH,KAAK,EACL,mBAAmB,EACnB,YAAY,EACZ,qBAAqB,EACrB,yBAAyB,EACzB,yBAAyB,GAC1B,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EACL,KAAK,YAAY,EACjB,KAAK,uBAAuB,EAC5B,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,mFAAmF;AACnF,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,sFAAsF;IACtF,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;CAC1C;AAED,4FAA4F;AAC5F,wBAAgB,eAAe,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,gBAAgB,GAAG,iBAAiB,CAmB1F"}
@@ -0,0 +1,25 @@
1
+ import { XML_DECLARATION, createXmlSink } from "../xml/index.js";
2
+ import { collectColumns, renderFreeze } from "./lib/layout.js";
3
+ import { renderSheetData } from "./lib/render-rows.js";
4
+ export { columnLetter } from "./lib/cell-ref.js";
5
+ export { sheetFromObjects, } from "./lib/from-objects.js";
6
+ export { serialFromCivil, serialFromEpochMillis } from "./lib/serial.js";
7
+ /** Renders `xl/worksheets/sheetN.xml`, interning text and registering styles as it goes. */
8
+ export function renderWorksheet(sheet, context) {
9
+ const columns = collectColumns(sheet, context.sheetIndex, (style) => context.styles.validate(style));
10
+ const views = renderFreeze(sheet, context.sheetIndex);
11
+ const sink = createXmlSink();
12
+ const range = renderSheetData(sheet.rows, columns.styles, context, sink);
13
+ const empty = range.length === 0;
14
+ const dimension = empty ? "" : `<dimension ref="${range}"/>`;
15
+ const filterRange = sheet.autoFilter === true && !empty ? range : undefined;
16
+ const autoFilter = filterRange === undefined ? "" : `<autoFilter ref="${filterRange}"/>`;
17
+ const prefix = `${XML_DECLARATION}<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">` +
18
+ dimension +
19
+ views +
20
+ columns.cols +
21
+ (empty ? "<sheetData/>" : "<sheetData>");
22
+ const suffix = (empty ? "" : "</sheetData>") + autoFilter + "</worksheet>";
23
+ return { data: sink.finish(prefix, suffix), filterRange };
24
+ }
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/worksheet/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACjE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAE/D,OAAO,EAAE,eAAe,EAAyB,MAAM,sBAAsB,CAAC;AAoB9E,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAGL,gBAAgB,GACjB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AASzE,4FAA4F;AAC5F,MAAM,UAAU,eAAe,CAAC,KAAY,EAAE,OAAyB;IACrE,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,KAAK,EAAE,EAAE,CAClE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAC/B,CAAC;IACF,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IACtD,MAAM,IAAI,GAAG,aAAa,EAAE,CAAC;IAC7B,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACzE,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,mBAAmB,KAAK,KAAK,CAAC;IAC7D,MAAM,WAAW,GAAG,KAAK,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5E,MAAM,UAAU,GAAG,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,oBAAoB,WAAW,KAAK,CAAC;IACzF,MAAM,MAAM,GACV,GAAG,eAAe,6JAA6J;QAC/K,SAAS;QACT,KAAK;QACL,OAAO,CAAC,IAAI;QACZ,CAAC,KAAK,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,GAAG,UAAU,GAAG,cAAc,CAAC;IAC3E,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;AAC5D,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Excel column letters for a zero-based column index: 0 is `A`, 25 is `Z`, 26 is `AA`.
3
+ * Results are cached, so a wide sheet pays the conversion once per column.
4
+ */
5
+ export declare function columnLetter(index: number): string;
6
+ //# sourceMappingURL=cell-ref.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell-ref.d.ts","sourceRoot":"","sources":["../../../src/worksheet/lib/cell-ref.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAWlD"}
@@ -0,0 +1,19 @@
1
+ const letters = [];
2
+ /**
3
+ * Excel column letters for a zero-based column index: 0 is `A`, 25 is `Z`, 26 is `AA`.
4
+ * Results are cached, so a wide sheet pays the conversion once per column.
5
+ */
6
+ export function columnLetter(index) {
7
+ const cached = letters[index];
8
+ if (cached !== undefined)
9
+ return cached;
10
+ let result = "";
11
+ let remaining = index;
12
+ do {
13
+ result = String.fromCharCode(65 + (remaining % 26)) + result;
14
+ remaining = Math.floor(remaining / 26) - 1;
15
+ } while (remaining >= 0);
16
+ letters[index] = result;
17
+ return result;
18
+ }
19
+ //# sourceMappingURL=cell-ref.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cell-ref.js","sourceRoot":"","sources":["../../../src/worksheet/lib/cell-ref.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,GAAa,EAAE,CAAC;AAE7B;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,MAAM,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,MAAM,CAAC;IACxC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,GAAG,CAAC;QACF,MAAM,GAAG,MAAM,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC,SAAS,GAAG,EAAE,CAAC,CAAC,GAAG,MAAM,CAAC;QAC7D,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC,QAAQ,SAAS,IAAI,CAAC,EAAE;IACzB,OAAO,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC;IACxB,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,53 @@
1
+ import type { CellStyle } from "../../styles/index.js";
2
+ import type { CellValue, Sheet } from "./model.js";
3
+ /** The keys of an object whose values can go straight into a cell. */
4
+ type CellKeys<T> = {
5
+ [K in keyof T]-?: T[K] extends CellValue ? K : never;
6
+ }[keyof T] & string;
7
+ interface ColumnBase {
8
+ /** Header text; the key when omitted. */
9
+ readonly header?: string;
10
+ /** Width in Excel's character units. */
11
+ readonly width?: number;
12
+ /** Default style for the column's data cells. */
13
+ readonly style?: CellStyle;
14
+ }
15
+ /** A column read straight from a property whose type a cell can hold. */
16
+ interface ValueColumn<T> extends ColumnBase {
17
+ readonly key: CellKeys<T>;
18
+ readonly value?: undefined;
19
+ }
20
+ /** A column computed from the whole object; the key only names it. */
21
+ interface DerivedColumn<T> extends ColumnBase {
22
+ readonly key: keyof T & string;
23
+ readonly value: (item: T) => CellValue;
24
+ }
25
+ export type ObjectColumn<T> = ValueColumn<T> | DerivedColumn<T>;
26
+ export interface SheetFromObjectsOptions<T> {
27
+ readonly name: string;
28
+ /** Columns in order. When omitted, the first object's own keys become the columns, keys as headers. */
29
+ readonly columns?: readonly ObjectColumn<T>[];
30
+ /** Style of the header row, or `false` for no header row. Default: bold. */
31
+ readonly header?: CellStyle | false;
32
+ /** Keep the header row visible while scrolling. Default: on when there is a header row. */
33
+ readonly freeze?: boolean;
34
+ /** Filter dropdowns on the header row. Default: on when there is a header row. */
35
+ readonly autoFilter?: boolean;
36
+ }
37
+ /**
38
+ * Turns objects into a sheet: one row per object, one column per key. Rows are produced lazily, so
39
+ * a generator or cursor is read once, when the sheet is written.
40
+ *
41
+ * @example
42
+ * const sheet = sheetFromObjects(orders, {
43
+ * name: "Orders",
44
+ * columns: [
45
+ * { key: "id", header: "Order" },
46
+ * { key: "total", header: "Total", style: { numberFormat: '#,##0.00 "kr"' } },
47
+ * { key: "tags", header: "Tags", value: (order) => order.tags.join(", ") },
48
+ * ],
49
+ * });
50
+ */
51
+ export declare function sheetFromObjects<T extends object>(data: Iterable<T>, options: SheetFromObjectsOptions<T>): Sheet;
52
+ export {};
53
+ //# sourceMappingURL=from-objects.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-objects.d.ts","sourceRoot":"","sources":["../../../src/worksheet/lib/from-objects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAQ,SAAS,EAAe,KAAK,EAAE,MAAM,YAAY,CAAC;AAEtE,sEAAsE;AACtE,KAAK,QAAQ,CAAC,CAAC,IAAI;KAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,SAAS,GAAG,CAAC,GAAG,KAAK;CAAE,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC;AAE9F,UAAU,UAAU;IAClB,yCAAyC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,wCAAwC;IACxC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,iDAAiD;IACjD,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;CAC5B;AAED,yEAAyE;AACzE,UAAU,WAAW,CAAC,CAAC,CAAE,SAAQ,UAAU;IACzC,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC1B,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,CAAC;CAC5B;AAED,sEAAsE;AACtE,UAAU,aAAa,CAAC,CAAC,CAAE,SAAQ,UAAU;IAC3C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,MAAM,CAAC;IAC/B,QAAQ,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,SAAS,CAAC;CACxC;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CAAC;AAEhE,MAAM,WAAW,uBAAuB,CAAC,CAAC;IACxC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,uGAAuG;IACvG,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;IAC9C,4EAA4E;IAC5E,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,KAAK,CAAC;IACpC,2FAA2F;IAC3F,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;IAC1B,kFAAkF;IAClF,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;CAC/B;AAID;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAC/C,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EACjB,OAAO,EAAE,uBAAuB,CAAC,CAAC,CAAC,GAClC,KAAK,CAgBP"}
@@ -0,0 +1,65 @@
1
+ const BOLD_HEADER = { bold: true };
2
+ /**
3
+ * Turns objects into a sheet: one row per object, one column per key. Rows are produced lazily, so
4
+ * a generator or cursor is read once, when the sheet is written.
5
+ *
6
+ * @example
7
+ * const sheet = sheetFromObjects(orders, {
8
+ * name: "Orders",
9
+ * columns: [
10
+ * { key: "id", header: "Order" },
11
+ * { key: "total", header: "Total", style: { numberFormat: '#,##0.00 "kr"' } },
12
+ * { key: "tags", header: "Tags", value: (order) => order.tags.join(", ") },
13
+ * ],
14
+ * });
15
+ */
16
+ export function sheetFromObjects(data, options) {
17
+ const headerStyle = options.header === undefined ? BOLD_HEADER : options.header;
18
+ const hasHeader = headerStyle !== false;
19
+ const freeze = options.freeze ?? hasHeader;
20
+ const autoFilter = options.autoFilter ?? hasHeader;
21
+ const columns = options.columns;
22
+ const rows = {
23
+ [Symbol.iterator]: () => columns === undefined
24
+ ? inferredRows(data, headerStyle)
25
+ : explicitRows(data, columns, headerStyle),
26
+ };
27
+ const sheet = freeze
28
+ ? { name: options.name, rows, freeze: { rows: 1 }, autoFilter }
29
+ : { name: options.name, rows, autoFilter };
30
+ return columns === undefined ? sheet : { ...sheet, columns: columns.map(toColumn) };
31
+ }
32
+ function toColumn(column) {
33
+ const result = {};
34
+ if (column.width !== undefined)
35
+ result.width = column.width;
36
+ if (column.style !== undefined)
37
+ result.style = column.style;
38
+ return result;
39
+ }
40
+ function* explicitRows(data, columns, headerStyle) {
41
+ if (headerStyle !== false)
42
+ yield columns.map((column) => ({ value: column.header ?? column.key, style: headerStyle }));
43
+ for (const item of data) {
44
+ const row = [];
45
+ for (const column of columns) {
46
+ row.push(column.value === undefined ? item[column.key] : column.value(item));
47
+ }
48
+ yield row;
49
+ }
50
+ }
51
+ function* inferredRows(data, headerStyle) {
52
+ const iterator = data[Symbol.iterator]();
53
+ const first = iterator.next();
54
+ if (first.done === true)
55
+ return;
56
+ const keys = Object.keys(first.value);
57
+ if (headerStyle !== false)
58
+ yield keys.map((key) => ({ value: key, style: headerStyle }));
59
+ yield keys.map((key) => first.value[key]);
60
+ for (let next = iterator.next(); next.done !== true; next = iterator.next()) {
61
+ const item = next.value;
62
+ yield keys.map((key) => item[key]);
63
+ }
64
+ }
65
+ //# sourceMappingURL=from-objects.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-objects.js","sourceRoot":"","sources":["../../../src/worksheet/lib/from-objects.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { CellStyle } from "../../styles/index.js";
2
+ import type { Sheet } from "./model.js";
3
+ /** What the sheet's columns contribute: a style per position and the `<cols>` element. */
4
+ export interface CollectedColumns {
5
+ readonly styles: readonly (CellStyle | undefined)[];
6
+ readonly cols: string;
7
+ }
8
+ /** Validates every column up front, so a bad width or format is reported at the column. */
9
+ export declare function collectColumns(sheet: Sheet, sheetIndex: number, validateStyle: (style: CellStyle) => void): CollectedColumns;
10
+ /** The `<sheetViews>` element with a frozen pane, or an empty string when nothing is frozen. */
11
+ export declare function renderFreeze(sheet: Sheet, sheetIndex: number): string;
12
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/worksheet/lib/layout.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAMxC,0FAA0F;AAC1F,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,EAAE,CAAC;IACpD,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;CACvB;AAED,2FAA2F;AAC3F,wBAAgB,cAAc,CAC5B,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM,EAClB,aAAa,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,GACxC,gBAAgB,CAoClB;AAED,gGAAgG;AAChG,wBAAgB,YAAY,CAAC,KAAK,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAyBrE"}
@@ -0,0 +1,58 @@
1
+ import { XlsxMiniError } from "../../errors/index.js";
2
+ import { columnLetter } from "./cell-ref.js";
3
+ const MAX_COLUMN_WIDTH = 255;
4
+ const MAX_ROWS = 1_048_576;
5
+ const MAX_COLUMNS = 16_384;
6
+ /** Validates every column up front, so a bad width or format is reported at the column. */
7
+ export function collectColumns(sheet, sheetIndex, validateStyle) {
8
+ const columns = sheet.columns;
9
+ if (columns === undefined)
10
+ return { styles: [], cols: "" };
11
+ const styles = [];
12
+ let cols = "";
13
+ for (let i = 0; i < columns.length; i++) {
14
+ const column = columns[i];
15
+ const style = column?.style;
16
+ if (style !== undefined) {
17
+ try {
18
+ validateStyle(style);
19
+ }
20
+ catch (error) {
21
+ if (error instanceof XlsxMiniError) {
22
+ throw new XlsxMiniError(error.code, `sheets[${sheetIndex}].columns[${i}].style.numberFormat`, error.message.replace(/ at $/, ""));
23
+ }
24
+ throw error;
25
+ }
26
+ }
27
+ styles.push(style);
28
+ const width = column?.width;
29
+ if (width !== undefined) {
30
+ if (!Number.isFinite(width) || width <= 0 || width > MAX_COLUMN_WIDTH) {
31
+ throw new XlsxMiniError("INVALID_COLUMN_WIDTH", `sheets[${sheetIndex}].columns[${i}].width`, `Column widths run from above 0 to ${MAX_COLUMN_WIDTH} characters, not ${width}`);
32
+ }
33
+ cols += `<col min="${i + 1}" max="${i + 1}" width="${width}" customWidth="1"/>`;
34
+ }
35
+ }
36
+ return { styles, cols: cols.length === 0 ? "" : `<cols>${cols}</cols>` };
37
+ }
38
+ /** The `<sheetViews>` element with a frozen pane, or an empty string when nothing is frozen. */
39
+ export function renderFreeze(sheet, sheetIndex) {
40
+ const freeze = sheet.freeze;
41
+ if (freeze === undefined)
42
+ return "";
43
+ const rows = freeze.rows ?? 0;
44
+ const columns = freeze.columns ?? 0;
45
+ if (!Number.isInteger(rows) || rows < 0 || rows >= MAX_ROWS) {
46
+ throw new XlsxMiniError("INVALID_FREEZE", `sheets[${sheetIndex}].freeze.rows`, `Frozen rows must be a whole number from 0 to ${MAX_ROWS - 1}, not ${rows}`);
47
+ }
48
+ if (!Number.isInteger(columns) || columns < 0 || columns >= MAX_COLUMNS) {
49
+ throw new XlsxMiniError("INVALID_FREEZE", `sheets[${sheetIndex}].freeze.columns`, `Frozen columns must be a whole number from 0 to ${MAX_COLUMNS - 1}, not ${columns}`);
50
+ }
51
+ if (rows === 0 && columns === 0)
52
+ return "";
53
+ const topLeft = columnLetter(columns) + (rows + 1);
54
+ const activePane = rows === 0 ? "topRight" : columns === 0 ? "bottomLeft" : "bottomRight";
55
+ const splits = (columns === 0 ? "" : ` xSplit="${columns}"`) + (rows === 0 ? "" : ` ySplit="${rows}"`);
56
+ return `<sheetViews><sheetView workbookViewId="0"><pane${splits} topLeftCell="${topLeft}" activePane="${activePane}" state="frozen"/></sheetView></sheetViews>`;
57
+ }
58
+ //# sourceMappingURL=layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../src/worksheet/lib/layout.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAEtD,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAG7C,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,QAAQ,GAAG,SAAS,CAAC;AAC3B,MAAM,WAAW,GAAG,MAAM,CAAC;AAQ3B,2FAA2F;AAC3F,MAAM,UAAU,cAAc,CAC5B,KAAY,EACZ,UAAkB,EAClB,aAAyC;IAEzC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,OAAO,KAAK,SAAS;QAAE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC3D,MAAM,MAAM,GAA8B,EAAE,CAAC;IAC7C,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC1B,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAC;QAC5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,aAAa,CAAC,KAAK,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,KAAK,YAAY,aAAa,EAAE,CAAC;oBACnC,MAAM,IAAI,aAAa,CACrB,KAAK,CAAC,IAAI,EACV,UAAU,UAAU,aAAa,CAAC,sBAAsB,EACxD,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CACnC,CAAC;gBACJ,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;QACH,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,CAAC;QAC5B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,KAAK,GAAG,gBAAgB,EAAE,CAAC;gBACtE,MAAM,IAAI,aAAa,CACrB,sBAAsB,EACtB,UAAU,UAAU,aAAa,CAAC,SAAS,EAC3C,qCAAqC,gBAAgB,oBAAoB,KAAK,EAAE,CACjF,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,YAAY,KAAK,qBAAqB,CAAC;QAClF,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,IAAI,SAAS,EAAE,CAAC;AAC3E,CAAC;AAED,gGAAgG;AAChG,MAAM,UAAU,YAAY,CAAC,KAAY,EAAE,UAAkB;IAC3D,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,IAAI,MAAM,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACpC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,CAAC,CAAC;IAC9B,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,QAAQ,EAAE,CAAC;QAC5D,MAAM,IAAI,aAAa,CACrB,gBAAgB,EAChB,UAAU,UAAU,eAAe,EACnC,gDAAgD,QAAQ,GAAG,CAAC,SAAS,IAAI,EAAE,CAC5E,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,IAAI,WAAW,EAAE,CAAC;QACxE,MAAM,IAAI,aAAa,CACrB,gBAAgB,EAChB,UAAU,UAAU,kBAAkB,EACtC,mDAAmD,WAAW,GAAG,CAAC,SAAS,OAAO,EAAE,CACrF,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC;IAC1F,MAAM,MAAM,GACV,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC;IAC1F,OAAO,kDAAkD,MAAM,iBAAiB,OAAO,iBAAiB,UAAU,6CAA6C,CAAC;AAClK,CAAC"}
@@ -0,0 +1,112 @@
1
+ import type { CellStyle } from "../../styles/index.js";
2
+ /**
3
+ * Augment this interface to let your own types into cells, then convert them in `coerce`.
4
+ * See the README section "Extending accepted value types".
5
+ *
6
+ * @example
7
+ * declare module "xlsx-mini" {
8
+ * interface Register { cellValue: Decimal | bigint }
9
+ * }
10
+ */
11
+ export interface Register {
12
+ }
13
+ /** The value types a consumer registered, or `never` when none. */
14
+ export type Registered = Register extends {
15
+ cellValue: infer T;
16
+ } ? T : never;
17
+ /** A Temporal.PlainDate, native or polyfilled, recognised by its tag; written as a date without time. */
18
+ export interface TemporalPlainDateLike {
19
+ readonly [Symbol.toStringTag]: "Temporal.PlainDate";
20
+ readonly year: number;
21
+ readonly month: number;
22
+ readonly day: number;
23
+ }
24
+ /** A Temporal.PlainDateTime, native or polyfilled; written with its wall-clock time. */
25
+ export interface TemporalPlainDateTimeLike {
26
+ readonly [Symbol.toStringTag]: "Temporal.PlainDateTime";
27
+ readonly year: number;
28
+ readonly month: number;
29
+ readonly day: number;
30
+ readonly hour: number;
31
+ readonly minute: number;
32
+ readonly second: number;
33
+ readonly millisecond: number;
34
+ readonly microsecond: number;
35
+ readonly nanosecond: number;
36
+ }
37
+ /** A Temporal.ZonedDateTime, native or polyfilled; written with its wall-clock time in its zone. */
38
+ export interface TemporalZonedDateTimeLike {
39
+ readonly [Symbol.toStringTag]: "Temporal.ZonedDateTime";
40
+ readonly year: number;
41
+ readonly month: number;
42
+ readonly day: number;
43
+ readonly hour: number;
44
+ readonly minute: number;
45
+ readonly second: number;
46
+ readonly millisecond: number;
47
+ readonly microsecond: number;
48
+ readonly nanosecond: number;
49
+ }
50
+ /** A Temporal.Instant, native or polyfilled; written as UTC. */
51
+ export interface TemporalInstantLike {
52
+ readonly [Symbol.toStringTag]: "Temporal.Instant";
53
+ readonly epochMilliseconds: number;
54
+ }
55
+ export type TemporalLike = TemporalPlainDateLike | TemporalPlainDateTimeLike | TemporalZonedDateTimeLike | TemporalInstantLike;
56
+ /**
57
+ * What a cell can hold. `null` and `undefined` write no cell. A `Date` is written as UTC.
58
+ * Temporal values are recognised by their `Symbol.toStringTag`, so no Temporal global is needed.
59
+ */
60
+ export type CellValue = string | number | boolean | Date | TemporalLike | null | undefined | Registered;
61
+ /** A cell written as a plain object, so the value can carry a style. */
62
+ export interface CellObject {
63
+ readonly value: CellValue;
64
+ readonly style?: CellStyle;
65
+ }
66
+ /** One cell of a row: a bare value, or a plain `{ value }` object. */
67
+ export type Cell = CellValue | CellObject;
68
+ /** One row, left to right from column A. */
69
+ export type Row = readonly Cell[];
70
+ /** What a column carries for every cell in it. Positions match the row arrays: index 0 is column A. */
71
+ export interface Column {
72
+ /** Width in Excel's character units (the unit the column-width dialog shows), from above 0 to 255. */
73
+ readonly width?: number;
74
+ /** Default style for the column's cells; a cell's own style properties win. */
75
+ readonly style?: CellStyle;
76
+ }
77
+ /** Rows from the top and columns from the left that stay in place while the sheet scrolls. */
78
+ export interface Freeze {
79
+ readonly rows?: number;
80
+ readonly columns?: number;
81
+ }
82
+ /**
83
+ * One sheet of a workbook.
84
+ *
85
+ * @example
86
+ * const sheet: Sheet = {
87
+ * name: "Orders",
88
+ * columns: [undefined, { style: { numberFormat: '#,##0.00 "kr"' } }],
89
+ * rows: [["Order", "Total"], ["A-1001", 1234.5]],
90
+ * };
91
+ */
92
+ export interface Sheet {
93
+ readonly name: string;
94
+ /** Any iterable of rows, so a generator or database cursor can feed a sheet without an array. */
95
+ readonly rows: Iterable<Row>;
96
+ /** Per-column settings, by position; leave a slot `undefined` for a column with none. */
97
+ readonly columns?: readonly (Column | undefined)[];
98
+ /** Freeze panes: the header rows and the leading columns that stay visible. */
99
+ readonly freeze?: Freeze;
100
+ /** Filter dropdowns on row 1 across the used range. */
101
+ readonly autoFilter?: boolean;
102
+ }
103
+ /**
104
+ * Converts a value the writer does not handle natively, or overrides how it handles a `Date` or a
105
+ * Temporal value. Called once per such value with the value's path; the result is written as if the
106
+ * caller had put it in the cell. Never called for strings, numbers, booleans, `null` or `undefined`.
107
+ *
108
+ * @example
109
+ * const coerce: Coerce = (value) => (typeof value === "bigint" ? Number(value) : value);
110
+ */
111
+ export type Coerce = (value: Date | TemporalLike | Registered, path: string) => CellValue;
112
+ //# sourceMappingURL=model.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../../src/worksheet/lib/model.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model.js","sourceRoot":"","sources":["../../../src/worksheet/lib/model.ts"],"names":[],"mappings":""}
@@ -0,0 +1,23 @@
1
+ import type { StringTable } from "../../shared-strings/index.js";
2
+ import type { CellStyle } from "../../styles/index.js";
3
+ import type { XmlSink } from "../../xml/index.js";
4
+ import type { Coerce, Row } from "./model.js";
5
+ /** Everything a worksheet needs from its surroundings to render. */
6
+ export interface WorksheetContext {
7
+ readonly strings: StringTable;
8
+ /** What the worksheet needs from the styles feature: a cell-format index for a style, and validation. */
9
+ readonly styles: {
10
+ indexFor(cell: CellStyle | undefined, column: CellStyle | undefined, dateDefault: number): number;
11
+ validate(style: CellStyle): void;
12
+ };
13
+ readonly coerce: Coerce | undefined;
14
+ /** Zero-based position of the sheet in the workbook, for error paths. */
15
+ readonly sheetIndex: number;
16
+ }
17
+ /**
18
+ * Renders every row with at least one cell into the sink; positions survive because rows and
19
+ * cells carry `r`. Returns the used range such as `A1:C4`, or an empty string when no cell was
20
+ * written.
21
+ */
22
+ export declare function renderSheetData(rows: Iterable<Row>, columnStyles: readonly (CellStyle | undefined)[], context: WorksheetContext, sink: XmlSink): string;
23
+ //# sourceMappingURL=render-rows.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-rows.d.ts","sourceRoot":"","sources":["../../../src/worksheet/lib/render-rows.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,KAAK,EAAoB,MAAM,EAAE,GAAG,EAAgB,MAAM,YAAY,CAAC;AAW9E,oEAAoE;AACpE,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,yGAAyG;IACzG,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CACN,IAAI,EAAE,SAAS,GAAG,SAAS,EAC3B,MAAM,EAAE,SAAS,GAAG,SAAS,EAC7B,WAAW,EAAE,MAAM,GAClB,MAAM,CAAC;QACV,QAAQ,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;KAClC,CAAC;IACF,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,yEAAyE;IACzE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,CAAC,GAAG,CAAC,EACnB,YAAY,EAAE,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,EAAE,EAChD,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAE,OAAO,GACZ,MAAM,CAsCR"}