@datalayer/cells 0.0.0-stage → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +55 -2
- package/lib/chrome/index.d.ts +7 -0
- package/lib/chrome/index.d.ts.map +1 -0
- package/lib/chrome/index.js +7 -0
- package/lib/chrome/index.js.map +1 -0
- package/lib/collab/index.d.ts +7 -0
- package/lib/collab/index.d.ts.map +1 -0
- package/lib/collab/index.js +7 -0
- package/lib/collab/index.js.map +1 -0
- package/lib/core/axis.d.ts +103 -0
- package/lib/core/axis.d.ts.map +1 -0
- package/lib/core/axis.js +470 -0
- package/lib/core/axis.js.map +1 -0
- package/lib/core/cells.d.ts +71 -0
- package/lib/core/cells.d.ts.map +1 -0
- package/lib/core/cells.js +285 -0
- package/lib/core/cells.js.map +1 -0
- package/lib/core/commands.d.ts +157 -0
- package/lib/core/commands.d.ts.map +1 -0
- package/lib/core/commands.js +620 -0
- package/lib/core/commands.js.map +1 -0
- package/lib/core/format.d.ts +52 -0
- package/lib/core/format.d.ts.map +1 -0
- package/lib/core/format.js +264 -0
- package/lib/core/format.js.map +1 -0
- package/lib/core/history.d.ts +42 -0
- package/lib/core/history.d.ts.map +1 -0
- package/lib/core/history.js +63 -0
- package/lib/core/history.js.map +1 -0
- package/lib/core/index.d.ts +23 -0
- package/lib/core/index.d.ts.map +1 -0
- package/lib/core/index.js +28 -0
- package/lib/core/index.js.map +1 -0
- package/lib/core/model.d.ts +116 -0
- package/lib/core/model.d.ts.map +1 -0
- package/lib/core/model.js +330 -0
- package/lib/core/model.js.map +1 -0
- package/lib/core/patches.d.ts +140 -0
- package/lib/core/patches.d.ts.map +1 -0
- package/lib/core/patches.js +272 -0
- package/lib/core/patches.js.map +1 -0
- package/lib/core/reactor.d.ts +24 -0
- package/lib/core/reactor.d.ts.map +1 -0
- package/lib/core/reactor.js +48 -0
- package/lib/core/reactor.js.map +1 -0
- package/lib/core/selection.d.ts +81 -0
- package/lib/core/selection.d.ts.map +1 -0
- package/lib/core/selection.js +175 -0
- package/lib/core/selection.js.map +1 -0
- package/lib/core/strings.d.ts +19 -0
- package/lib/core/strings.d.ts.map +1 -0
- package/lib/core/strings.js +61 -0
- package/lib/core/strings.js.map +1 -0
- package/lib/core/styles.d.ts +48 -0
- package/lib/core/styles.d.ts.map +1 -0
- package/lib/core/styles.js +102 -0
- package/lib/core/styles.js.map +1 -0
- package/lib/core/values.d.ts +20 -0
- package/lib/core/values.d.ts.map +1 -0
- package/lib/core/values.js +39 -0
- package/lib/core/values.js.map +1 -0
- package/lib/core/workbook.d.ts +59 -0
- package/lib/core/workbook.d.ts.map +1 -0
- package/lib/core/workbook.js +101 -0
- package/lib/core/workbook.js.map +1 -0
- package/lib/core/zone.d.ts +48 -0
- package/lib/core/zone.d.ts.map +1 -0
- package/lib/core/zone.js +89 -0
- package/lib/core/zone.js.map +1 -0
- package/lib/csv/index.d.ts +7 -0
- package/lib/csv/index.d.ts.map +1 -0
- package/lib/csv/index.js +7 -0
- package/lib/csv/index.js.map +1 -0
- package/lib/index.d.ts +8 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +13 -0
- package/lib/index.js.map +1 -0
- package/lib/plugin/index.d.ts +7 -0
- package/lib/plugin/index.d.ts.map +1 -0
- package/lib/plugin/index.js +7 -0
- package/lib/plugin/index.js.map +1 -0
- package/lib/points/index.d.ts +154 -0
- package/lib/points/index.d.ts.map +1 -0
- package/lib/points/index.js +50 -0
- package/lib/points/index.js.map +1 -0
- package/lib/points/resolve.d.ts +56 -0
- package/lib/points/resolve.d.ts.map +1 -0
- package/lib/points/resolve.js +106 -0
- package/lib/points/resolve.js.map +1 -0
- package/lib/xlsx/index.d.ts +7 -0
- package/lib/xlsx/index.d.ts.map +1 -0
- package/lib/xlsx/index.js +7 -0
- package/lib/xlsx/index.js.map +1 -0
- package/package.json +116 -4
- package/style/cells.css +7 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { type Style } from './styles.js';
|
|
2
|
+
import { type CellValue } from './values.js';
|
|
3
|
+
import { type Limits, type Workbook } from './workbook.js';
|
|
4
|
+
import type { Zone } from './zone.js';
|
|
5
|
+
export declare const FORMAT_VERSION = 1;
|
|
6
|
+
/** A value as JSON carries it: errors as `{ error }`. */
|
|
7
|
+
export type JsonValue = number | string | boolean | null | {
|
|
8
|
+
readonly error: string;
|
|
9
|
+
};
|
|
10
|
+
export interface CellsCell {
|
|
11
|
+
/** The value, or a formula's cached value. */
|
|
12
|
+
readonly v?: JsonValue;
|
|
13
|
+
/** The formula in A1 notation, without the `=`. */
|
|
14
|
+
readonly f?: string;
|
|
15
|
+
/** An index into `styles`. */
|
|
16
|
+
readonly s?: number;
|
|
17
|
+
}
|
|
18
|
+
export interface CellsSheet {
|
|
19
|
+
readonly id: string;
|
|
20
|
+
readonly name: string;
|
|
21
|
+
readonly rows: Readonly<Record<string, {
|
|
22
|
+
readonly cells: Readonly<Record<string, CellsCell>>;
|
|
23
|
+
}>>;
|
|
24
|
+
readonly sizes?: {
|
|
25
|
+
readonly rows?: Readonly<Record<string, number>>;
|
|
26
|
+
readonly cols?: Readonly<Record<string, number>>;
|
|
27
|
+
};
|
|
28
|
+
readonly hidden?: {
|
|
29
|
+
readonly rows?: readonly number[];
|
|
30
|
+
readonly cols?: readonly number[];
|
|
31
|
+
};
|
|
32
|
+
readonly merges?: readonly Zone[];
|
|
33
|
+
readonly frozen?: {
|
|
34
|
+
readonly rows: number;
|
|
35
|
+
readonly cols: number;
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
export interface CellsWorkbook {
|
|
39
|
+
readonly version: 1;
|
|
40
|
+
readonly sheets: readonly CellsSheet[];
|
|
41
|
+
/** Index 0 is the default style and may be omitted (`[]`). */
|
|
42
|
+
readonly styles?: readonly Style[];
|
|
43
|
+
}
|
|
44
|
+
/** Throws a sentence naming the first bad field; returns the data typed. */
|
|
45
|
+
export declare function validateWorkbook(data: unknown, limits?: Limits): CellsWorkbook;
|
|
46
|
+
/** Fill an empty workbook from validated data (no patches, no history). */
|
|
47
|
+
export declare function loadInto(workbook: Workbook, data: unknown): void;
|
|
48
|
+
/** The workbook as `CellsWorkbook` JSON. */
|
|
49
|
+
export declare function toJSON(workbook: Workbook): CellsWorkbook;
|
|
50
|
+
/** A workbook of one sheet from rows of values: the convenience for small tables. */
|
|
51
|
+
export declare function fromRows(rows: readonly (readonly CellValue[])[], name?: string): CellsWorkbook;
|
|
52
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../../src/core/format.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAc,KAAK,KAAK,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,KAAK,SAAS,EAAuC,MAAM,aAAa,CAAC;AAClF,OAAO,EAAkB,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAC3E,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEtC,eAAO,MAAM,cAAc,IAAI,CAAC;AAEhC,yDAAyD;AACzD,MAAM,MAAM,SAAS,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,GAAG;IAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAEtF,MAAM,WAAW,SAAS;IACxB,8CAA8C;IAC9C,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;IACvB,mDAAmD;IACnD,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;IACpB,8BAA8B;IAC9B,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,CAAA;KAAE,CAAC,CAAC,CAAC;IACjG,QAAQ,CAAC,KAAK,CAAC,EAAE;QACf,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACjD,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;KAClD,CAAC;IACF,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;IAC3F,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,IAAI,EAAE,CAAC;IAClC,QAAQ,CAAC,MAAM,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACpE;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,OAAO,EAAE,CAAC,CAAC;IACpB,QAAQ,CAAC,MAAM,EAAE,SAAS,UAAU,EAAE,CAAC;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,KAAK,EAAE,CAAC;CACpC;AAuCD,4EAA4E;AAC5E,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,GAAE,MAAuB,GAAG,aAAa,CA8F9F;AAOD,2EAA2E;AAC3E,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,GAAG,IAAI,CAyBhE;AAED,4CAA4C;AAC5C,wBAAgB,MAAM,CAAC,QAAQ,EAAE,QAAQ,GAAG,aAAa,CA0CxD;AAkBD,qFAAqF;AACrF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,SAAS,SAAS,EAAE,CAAC,EAAE,EAAE,IAAI,SAAW,GAAG,aAAa,CAShG"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2022-2026 Datalayer, Inc.
|
|
3
|
+
*
|
|
4
|
+
* MIT License
|
|
5
|
+
*/
|
|
6
|
+
import { checkStyle } from './styles.js';
|
|
7
|
+
import { cellError, isCellError, isErrorCode } from './values.js';
|
|
8
|
+
import { DEFAULT_LIMITS } from './workbook.js';
|
|
9
|
+
export const FORMAT_VERSION = 1;
|
|
10
|
+
class FormatError extends Error {
|
|
11
|
+
}
|
|
12
|
+
function fail(path, message) {
|
|
13
|
+
throw new FormatError(`${path}: ${message}`);
|
|
14
|
+
}
|
|
15
|
+
const isObject = (x) => typeof x === 'object' && x !== null && !Array.isArray(x);
|
|
16
|
+
const isIndex = (key, max) => /^(0|[1-9][0-9]*)$/.test(key) && Number(key) < max;
|
|
17
|
+
function checkValue(v, path) {
|
|
18
|
+
if (v === null || typeof v === 'string' || typeof v === 'boolean')
|
|
19
|
+
return;
|
|
20
|
+
if (typeof v === 'number') {
|
|
21
|
+
if (!Number.isFinite(v))
|
|
22
|
+
fail(path, `${v} is not a value`);
|
|
23
|
+
return;
|
|
24
|
+
}
|
|
25
|
+
if (isObject(v) && typeof v.error === 'string' && Object.keys(v).length === 1) {
|
|
26
|
+
if (!isErrorCode(v.error))
|
|
27
|
+
fail(path, `'${v.error}' is not an error code`);
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
fail(path, `${JSON.stringify(v)} is not a value (a number, a string, a boolean, null or { error })`);
|
|
31
|
+
}
|
|
32
|
+
function checkZone(z, path, limits) {
|
|
33
|
+
if (!isObject(z))
|
|
34
|
+
fail(path, 'a zone is { top, left, bottom, right }');
|
|
35
|
+
for (const k of ['top', 'left', 'bottom', 'right']) {
|
|
36
|
+
if (!Number.isInteger(z[k]) || z[k] < 0)
|
|
37
|
+
fail(`${path}.${k}`, 'a non-negative integer');
|
|
38
|
+
}
|
|
39
|
+
const { top, left, bottom, right } = z;
|
|
40
|
+
if (top > bottom || left > right)
|
|
41
|
+
fail(path, 'top-left after bottom-right');
|
|
42
|
+
if (bottom >= limits.rows || right >= limits.cols)
|
|
43
|
+
fail(path, 'outside the sheet');
|
|
44
|
+
}
|
|
45
|
+
/** Throws a sentence naming the first bad field; returns the data typed. */
|
|
46
|
+
export function validateWorkbook(data, limits = DEFAULT_LIMITS) {
|
|
47
|
+
if (!isObject(data))
|
|
48
|
+
fail('workbook', 'a CellsWorkbook is a JSON object');
|
|
49
|
+
if (data.version !== FORMAT_VERSION) {
|
|
50
|
+
fail('version', `this is format version ${JSON.stringify(data.version)}; Cells reads version ${FORMAT_VERSION}`);
|
|
51
|
+
}
|
|
52
|
+
const styles = data.styles ?? [];
|
|
53
|
+
if (!Array.isArray(styles))
|
|
54
|
+
fail('styles', 'a list');
|
|
55
|
+
styles.forEach((s, i) => checkStyle(s, `styles[${i}]`));
|
|
56
|
+
if (styles.length > 0 && Object.keys(styles[0]).length > 0)
|
|
57
|
+
fail('styles[0]', 'style 0 is the default: {}');
|
|
58
|
+
if (!Array.isArray(data.sheets) || data.sheets.length === 0)
|
|
59
|
+
fail('sheets', 'a non-empty list');
|
|
60
|
+
const ids = new Set();
|
|
61
|
+
const names = new Set();
|
|
62
|
+
data.sheets.forEach((sheet, i) => {
|
|
63
|
+
const p = `sheets[${i}]`;
|
|
64
|
+
if (!isObject(sheet))
|
|
65
|
+
fail(p, 'a sheet is an object');
|
|
66
|
+
if (typeof sheet.id !== 'string' || sheet.id === '')
|
|
67
|
+
fail(`${p}.id`, 'a non-empty string');
|
|
68
|
+
if (ids.has(sheet.id))
|
|
69
|
+
fail(`${p}.id`, `'${sheet.id}' is used twice`);
|
|
70
|
+
ids.add(sheet.id);
|
|
71
|
+
if (typeof sheet.name !== 'string' || sheet.name.trim() === '')
|
|
72
|
+
fail(`${p}.name`, 'a non-empty string');
|
|
73
|
+
if (names.has(sheet.name.toLowerCase()))
|
|
74
|
+
fail(`${p}.name`, `'${sheet.name}' is used twice`);
|
|
75
|
+
names.add(sheet.name.toLowerCase());
|
|
76
|
+
if (!isObject(sheet.rows))
|
|
77
|
+
fail(`${p}.rows`, 'an object keyed by row index');
|
|
78
|
+
for (const [r, row] of Object.entries(sheet.rows)) {
|
|
79
|
+
const rp = `${p}.rows["${r}"]`;
|
|
80
|
+
if (!isIndex(r, limits.rows))
|
|
81
|
+
fail(rp, `'${r}' is not a row index below ${limits.rows}`);
|
|
82
|
+
if (!isObject(row) || !isObject(row.cells))
|
|
83
|
+
fail(rp, 'a row is { cells: { … } }');
|
|
84
|
+
for (const [c, cell] of Object.entries(row.cells)) {
|
|
85
|
+
const cp = `${rp}.cells["${c}"]`;
|
|
86
|
+
if (!isIndex(c, limits.cols))
|
|
87
|
+
fail(cp, `'${c}' is not a column index below ${limits.cols}`);
|
|
88
|
+
if (!isObject(cell))
|
|
89
|
+
fail(cp, 'a cell is { v?, f?, s? }');
|
|
90
|
+
for (const k of Object.keys(cell))
|
|
91
|
+
if (!['v', 'f', 's'].includes(k))
|
|
92
|
+
fail(`${cp}.${k}`, 'a cell has v, f and s only');
|
|
93
|
+
if ('v' in cell)
|
|
94
|
+
checkValue(cell.v, `${cp}.v`);
|
|
95
|
+
if ('f' in cell && (typeof cell.f !== 'string' || cell.f === ''))
|
|
96
|
+
fail(`${cp}.f`, 'a formula without the =');
|
|
97
|
+
if ('s' in cell &&
|
|
98
|
+
(!Number.isInteger(cell.s) ||
|
|
99
|
+
cell.s < 0 ||
|
|
100
|
+
cell.s >= Math.max(1, styles.length))) {
|
|
101
|
+
fail(`${cp}.s`, `no style ${JSON.stringify(cell.s)}`);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (sheet.sizes !== undefined) {
|
|
106
|
+
if (!isObject(sheet.sizes))
|
|
107
|
+
fail(`${p}.sizes`, '{ rows?, cols? }');
|
|
108
|
+
for (const axis of ['rows', 'cols']) {
|
|
109
|
+
const sizes = sheet.sizes[axis];
|
|
110
|
+
if (sizes === undefined)
|
|
111
|
+
continue;
|
|
112
|
+
if (!isObject(sizes))
|
|
113
|
+
fail(`${p}.sizes.${axis}`, 'an object keyed by index');
|
|
114
|
+
for (const [k, v] of Object.entries(sizes)) {
|
|
115
|
+
if (!isIndex(k, limits[axis]))
|
|
116
|
+
fail(`${p}.sizes.${axis}["${k}"]`, 'not an index of the sheet');
|
|
117
|
+
if (!(typeof v === 'number' && v > 0 && Number.isFinite(v)))
|
|
118
|
+
fail(`${p}.sizes.${axis}["${k}"]`, 'a positive size');
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (sheet.hidden !== undefined) {
|
|
123
|
+
if (!isObject(sheet.hidden))
|
|
124
|
+
fail(`${p}.hidden`, '{ rows?, cols? }');
|
|
125
|
+
for (const axis of ['rows', 'cols']) {
|
|
126
|
+
const list = sheet.hidden[axis];
|
|
127
|
+
if (list === undefined)
|
|
128
|
+
continue;
|
|
129
|
+
if (!Array.isArray(list))
|
|
130
|
+
fail(`${p}.hidden.${axis}`, 'a list of indexes');
|
|
131
|
+
list.forEach((x, j) => {
|
|
132
|
+
if (!Number.isInteger(x) || x < 0 || x >= limits[axis])
|
|
133
|
+
fail(`${p}.hidden.${axis}[${j}]`, 'not an index of the sheet');
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
if (sheet.merges !== undefined) {
|
|
138
|
+
if (!Array.isArray(sheet.merges))
|
|
139
|
+
fail(`${p}.merges`, 'a list of zones');
|
|
140
|
+
sheet.merges.forEach((z, j) => checkZone(z, `${p}.merges[${j}]`, limits));
|
|
141
|
+
}
|
|
142
|
+
if (sheet.frozen !== undefined) {
|
|
143
|
+
const f = sheet.frozen;
|
|
144
|
+
if (!isObject(f) ||
|
|
145
|
+
!Number.isInteger(f.rows) ||
|
|
146
|
+
!Number.isInteger(f.cols) ||
|
|
147
|
+
f.rows < 0 ||
|
|
148
|
+
f.cols < 0) {
|
|
149
|
+
fail(`${p}.frozen`, '{ rows, cols }, non-negative integers');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
return data;
|
|
154
|
+
}
|
|
155
|
+
const toValue = (v) => v === undefined || v === null ? null : typeof v === 'object' ? cellError(v.error) : v;
|
|
156
|
+
const toJsonValue = (v) => (isCellError(v) ? { error: v.error } : v);
|
|
157
|
+
/** Fill an empty workbook from validated data (no patches, no history). */
|
|
158
|
+
export function loadInto(workbook, data) {
|
|
159
|
+
if (workbook.sheets.length > 0)
|
|
160
|
+
throw new Error('loadInto fills an empty workbook.');
|
|
161
|
+
const wb = validateWorkbook(data, workbook.limits);
|
|
162
|
+
const styleMap = (wb.styles ?? []).map((s) => workbook.styles.intern(s));
|
|
163
|
+
for (const s of wb.sheets) {
|
|
164
|
+
const sheet = workbook.createSheet(s.name, s.id);
|
|
165
|
+
for (const [r, row] of Object.entries(s.rows)) {
|
|
166
|
+
for (const [c, cell] of Object.entries(row.cells)) {
|
|
167
|
+
const style = cell.s === undefined ? 0 : (styleMap[cell.s] ?? 0);
|
|
168
|
+
const content = cell.f === undefined
|
|
169
|
+
? { value: toValue(cell.v), style }
|
|
170
|
+
: { value: toValue(cell.v), formula: cell.f, style };
|
|
171
|
+
sheet.cells.set(Number(r), Number(c), content);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
for (const axis of ['rows', 'cols']) {
|
|
175
|
+
const a = axis === 'rows' ? sheet.rows : sheet.cols;
|
|
176
|
+
for (const [k, v] of Object.entries(s.sizes?.[axis] ?? {}))
|
|
177
|
+
a.resize(Number(k), v);
|
|
178
|
+
for (const i of s.hidden?.[axis] ?? [])
|
|
179
|
+
a.setHidden(i, true);
|
|
180
|
+
}
|
|
181
|
+
sheet.merges = (s.merges ?? []).map((z) => ({ ...z }));
|
|
182
|
+
sheet.frozen = s.frozen ? { rows: s.frozen.rows, cols: s.frozen.cols } : { rows: 0, cols: 0 };
|
|
183
|
+
workbook.sheets.push(sheet);
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
/** The workbook as `CellsWorkbook` JSON. */
|
|
187
|
+
export function toJSON(workbook) {
|
|
188
|
+
const used = new Map([[0, 0]]);
|
|
189
|
+
const styles = [{}];
|
|
190
|
+
const styleIndex = (i) => {
|
|
191
|
+
let j = used.get(i);
|
|
192
|
+
if (j === undefined) {
|
|
193
|
+
j = styles.length;
|
|
194
|
+
styles.push(workbook.styles.get(i));
|
|
195
|
+
used.set(i, j);
|
|
196
|
+
}
|
|
197
|
+
return j;
|
|
198
|
+
};
|
|
199
|
+
const sheets = workbook.sheets.map((sheet) => {
|
|
200
|
+
const rows = {};
|
|
201
|
+
const entries = [...sheet.cells.entries()].sort((a, b) => a[0] - b[0] || a[1] - b[1]);
|
|
202
|
+
for (const [row, col, c] of entries) {
|
|
203
|
+
const cell = {};
|
|
204
|
+
if (c.value !== null)
|
|
205
|
+
cell.v = toJsonValue(c.value);
|
|
206
|
+
if (c.formula !== undefined)
|
|
207
|
+
cell.f = c.formula;
|
|
208
|
+
if (c.style !== 0)
|
|
209
|
+
cell.s = styleIndex(c.style);
|
|
210
|
+
(rows[row] ??= { cells: {} }).cells[col] = cell;
|
|
211
|
+
}
|
|
212
|
+
const out = {
|
|
213
|
+
id: sheet.id,
|
|
214
|
+
name: sheet.name,
|
|
215
|
+
rows,
|
|
216
|
+
};
|
|
217
|
+
const sizes = {};
|
|
218
|
+
const hidden = {};
|
|
219
|
+
for (const axis of ['rows', 'cols']) {
|
|
220
|
+
const a = axis === 'rows' ? sheet.rows : sheet.cols;
|
|
221
|
+
const s = axisSizes(a);
|
|
222
|
+
if (Object.keys(s.sizes).length > 0)
|
|
223
|
+
sizes[axis] = s.sizes;
|
|
224
|
+
if (s.hidden.length > 0)
|
|
225
|
+
hidden[axis] = s.hidden;
|
|
226
|
+
}
|
|
227
|
+
if (Object.keys(sizes).length > 0)
|
|
228
|
+
out.sizes = sizes;
|
|
229
|
+
if (Object.keys(hidden).length > 0)
|
|
230
|
+
out.hidden = hidden;
|
|
231
|
+
if (sheet.merges.length > 0)
|
|
232
|
+
out.merges = sheet.merges.map((z) => ({ ...z }));
|
|
233
|
+
if (sheet.frozen.rows > 0 || sheet.frozen.cols > 0)
|
|
234
|
+
out.frozen = { ...sheet.frozen };
|
|
235
|
+
return out;
|
|
236
|
+
});
|
|
237
|
+
return { version: FORMAT_VERSION, sheets, styles };
|
|
238
|
+
}
|
|
239
|
+
function axisSizes(a) {
|
|
240
|
+
const sizes = {};
|
|
241
|
+
const hidden = [];
|
|
242
|
+
// Only an axis that ever changed size has its arrays; walk it only then.
|
|
243
|
+
if (!a.customized)
|
|
244
|
+
return { sizes, hidden };
|
|
245
|
+
for (let i = 0; i < a.count; i += 1) {
|
|
246
|
+
const s = a.sizeOf(i);
|
|
247
|
+
if (s !== a.defaultSize)
|
|
248
|
+
sizes[i] = s;
|
|
249
|
+
if (a.isHidden(i))
|
|
250
|
+
hidden.push(i);
|
|
251
|
+
}
|
|
252
|
+
return { sizes, hidden };
|
|
253
|
+
}
|
|
254
|
+
/** A workbook of one sheet from rows of values: the convenience for small tables. */
|
|
255
|
+
export function fromRows(rows, name = 'Sheet1') {
|
|
256
|
+
const out = {};
|
|
257
|
+
rows.forEach((row, r) => row.forEach((v, c) => {
|
|
258
|
+
if (v === null || v === undefined)
|
|
259
|
+
return;
|
|
260
|
+
(out[r] ??= { cells: {} }).cells[c] = { v: toJsonValue(v) };
|
|
261
|
+
}));
|
|
262
|
+
return { version: FORMAT_VERSION, sheets: [{ id: 's1', name, rows: out }], styles: [] };
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/core/format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local history: a stack of steps, each the patches of one transaction.
|
|
3
|
+
* Undo applies their inverses in reverse order; redo the patches again. No
|
|
4
|
+
* snapshot of the workbook is ever stored. Capped at 500 steps or 64 MB of
|
|
5
|
+
* patches, whichever comes first; the oldest steps go.
|
|
6
|
+
*
|
|
7
|
+
* @module core/history
|
|
8
|
+
*/
|
|
9
|
+
import type { Patch } from './patches.js';
|
|
10
|
+
export interface HistoryStep<S = unknown> {
|
|
11
|
+
readonly label: string;
|
|
12
|
+
readonly patches: readonly Patch[];
|
|
13
|
+
readonly bytes: number;
|
|
14
|
+
/** The selection before and after, restored with the step (view state, not undone itself). */
|
|
15
|
+
readonly selectionBefore: S;
|
|
16
|
+
readonly selectionAfter: S;
|
|
17
|
+
}
|
|
18
|
+
export interface HistoryLimits {
|
|
19
|
+
readonly steps: number;
|
|
20
|
+
readonly bytes: number;
|
|
21
|
+
}
|
|
22
|
+
export declare const DEFAULT_HISTORY_LIMITS: HistoryLimits;
|
|
23
|
+
export declare class LocalHistory<S = unknown> {
|
|
24
|
+
#private;
|
|
25
|
+
readonly limits: HistoryLimits;
|
|
26
|
+
constructor(limits?: HistoryLimits);
|
|
27
|
+
push(step: HistoryStep<S>): void;
|
|
28
|
+
/** The step to undo, moved to the redo stack; `undefined` when there is none. */
|
|
29
|
+
popUndo(): HistoryStep<S> | undefined;
|
|
30
|
+
popRedo(): HistoryStep<S> | undefined;
|
|
31
|
+
get canUndo(): boolean;
|
|
32
|
+
get canRedo(): boolean;
|
|
33
|
+
get size(): {
|
|
34
|
+
steps: number;
|
|
35
|
+
bytes: number;
|
|
36
|
+
};
|
|
37
|
+
/** The label of the step undo would undo. */
|
|
38
|
+
get undoLabel(): string | undefined;
|
|
39
|
+
get redoLabel(): string | undefined;
|
|
40
|
+
clear(): void;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=history.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.d.ts","sourceRoot":"","sources":["../../src/core/history.ts"],"names":[],"mappings":"AAMA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,EAAE,SAAS,KAAK,EAAE,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,8FAA8F;IAC9F,QAAQ,CAAC,eAAe,EAAE,CAAC,CAAC;IAC5B,QAAQ,CAAC,cAAc,EAAE,CAAC,CAAC;CAC5B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,eAAO,MAAM,sBAAsB,EAAE,aAAuD,CAAC;AAE7F,qBAAa,YAAY,CAAC,CAAC,GAAG,OAAO;;IACnC,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;gBAKnB,MAAM,GAAE,aAAsC;IAM1D,IAAI,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,GAAG,IAAI;IAahC,iFAAiF;IACjF,OAAO,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS;IAMrC,OAAO,IAAI,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS;IAMrC,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,OAAO,IAAI,OAAO,CAErB;IAED,IAAI,IAAI,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAE3C;IAED,6CAA6C;IAC7C,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,IAAI,SAAS,IAAI,MAAM,GAAG,SAAS,CAElC;IAED,KAAK,IAAI,IAAI;CAKd"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2022-2026 Datalayer, Inc.
|
|
3
|
+
*
|
|
4
|
+
* MIT License
|
|
5
|
+
*/
|
|
6
|
+
export const DEFAULT_HISTORY_LIMITS = { steps: 500, bytes: 64 * 1024 * 1024 };
|
|
7
|
+
export class LocalHistory {
|
|
8
|
+
limits;
|
|
9
|
+
#undo = [];
|
|
10
|
+
#redo = [];
|
|
11
|
+
#bytes = 0;
|
|
12
|
+
constructor(limits = DEFAULT_HISTORY_LIMITS) {
|
|
13
|
+
if (!(limits.steps >= 1) || !(limits.bytes >= 1))
|
|
14
|
+
throw new Error('History limits must be positive.');
|
|
15
|
+
this.limits = limits;
|
|
16
|
+
}
|
|
17
|
+
push(step) {
|
|
18
|
+
this.#undo.push(step);
|
|
19
|
+
this.#bytes += step.bytes;
|
|
20
|
+
for (const s of this.#redo)
|
|
21
|
+
this.#bytes -= s.bytes;
|
|
22
|
+
this.#redo = [];
|
|
23
|
+
while (this.#undo.length > this.limits.steps ||
|
|
24
|
+
(this.#bytes > this.limits.bytes && this.#undo.length > 1)) {
|
|
25
|
+
this.#bytes -= this.#undo.shift().bytes;
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
/** The step to undo, moved to the redo stack; `undefined` when there is none. */
|
|
29
|
+
popUndo() {
|
|
30
|
+
const step = this.#undo.pop();
|
|
31
|
+
if (step)
|
|
32
|
+
this.#redo.push(step);
|
|
33
|
+
return step;
|
|
34
|
+
}
|
|
35
|
+
popRedo() {
|
|
36
|
+
const step = this.#redo.pop();
|
|
37
|
+
if (step)
|
|
38
|
+
this.#undo.push(step);
|
|
39
|
+
return step;
|
|
40
|
+
}
|
|
41
|
+
get canUndo() {
|
|
42
|
+
return this.#undo.length > 0;
|
|
43
|
+
}
|
|
44
|
+
get canRedo() {
|
|
45
|
+
return this.#redo.length > 0;
|
|
46
|
+
}
|
|
47
|
+
get size() {
|
|
48
|
+
return { steps: this.#undo.length, bytes: this.#bytes };
|
|
49
|
+
}
|
|
50
|
+
/** The label of the step undo would undo. */
|
|
51
|
+
get undoLabel() {
|
|
52
|
+
return this.#undo.at(-1)?.label;
|
|
53
|
+
}
|
|
54
|
+
get redoLabel() {
|
|
55
|
+
return this.#redo.at(-1)?.label;
|
|
56
|
+
}
|
|
57
|
+
clear() {
|
|
58
|
+
this.#undo = [];
|
|
59
|
+
this.#redo = [];
|
|
60
|
+
this.#bytes = 0;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
//# sourceMappingURL=history.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"history.js","sourceRoot":"","sources":["../../src/core/history.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AA2BH,MAAM,CAAC,MAAM,sBAAsB,GAAkB,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;AAE7F,MAAM,OAAO,YAAY;IACd,MAAM,CAAgB;IAC/B,KAAK,GAAqB,EAAE,CAAC;IAC7B,KAAK,GAAqB,EAAE,CAAC;IAC7B,MAAM,GAAG,CAAC,CAAC;IAEX,YAAY,SAAwB,sBAAsB;QACxD,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC;YAC9C,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAED,IAAI,CAAC,IAAoB;QACvB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC;QAC1B,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC;QACnD,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,OACE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK;YACrC,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,EAC1D,CAAC;YACD,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC,KAAK,CAAC;QAC3C,CAAC;IACH,CAAC;IAED,iFAAiF;IACjF,OAAO;QACL,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC9B,IAAI,IAAI;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO;QACL,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAC9B,IAAI,IAAI;YAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC/B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAC1D,CAAC;IAED,6CAA6C;IAC7C,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;IAClC,CAAC;IAED,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC;IAClC,CAAC;IAED,KAAK;QACH,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,CAAC;CACF"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `@datalayer/cells/core`: the headless spreadsheet model. No React, no DOM;
|
|
3
|
+
* it runs in a browser, in Node and in a worker. Extended through the
|
|
4
|
+
* Reactor contribution points it opens (`datalayer.cells.*`).
|
|
5
|
+
*
|
|
6
|
+
* @module core
|
|
7
|
+
*/
|
|
8
|
+
export * from './axis.js';
|
|
9
|
+
export * from './cells.js';
|
|
10
|
+
export * from './commands.js';
|
|
11
|
+
export * from './format.js';
|
|
12
|
+
export * from './history.js';
|
|
13
|
+
export * from './model.js';
|
|
14
|
+
export * from './patches.js';
|
|
15
|
+
export * from './reactor.js';
|
|
16
|
+
export * from './selection.js';
|
|
17
|
+
export * from './strings.js';
|
|
18
|
+
export * from './styles.js';
|
|
19
|
+
export * from './values.js';
|
|
20
|
+
export * from './workbook.js';
|
|
21
|
+
export * from './zone.js';
|
|
22
|
+
export * from '../points/index.js';
|
|
23
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAMA;;;;;;GAMG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2022-2026 Datalayer, Inc.
|
|
3
|
+
*
|
|
4
|
+
* MIT License
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* `@datalayer/cells/core`: the headless spreadsheet model. No React, no DOM;
|
|
8
|
+
* it runs in a browser, in Node and in a worker. Extended through the
|
|
9
|
+
* Reactor contribution points it opens (`datalayer.cells.*`).
|
|
10
|
+
*
|
|
11
|
+
* @module core
|
|
12
|
+
*/
|
|
13
|
+
export * from './axis.js';
|
|
14
|
+
export * from './cells.js';
|
|
15
|
+
export * from './commands.js';
|
|
16
|
+
export * from './format.js';
|
|
17
|
+
export * from './history.js';
|
|
18
|
+
export * from './model.js';
|
|
19
|
+
export * from './patches.js';
|
|
20
|
+
export * from './reactor.js';
|
|
21
|
+
export * from './selection.js';
|
|
22
|
+
export * from './strings.js';
|
|
23
|
+
export * from './styles.js';
|
|
24
|
+
export * from './values.js';
|
|
25
|
+
export * from './workbook.js';
|
|
26
|
+
export * from './zone.js';
|
|
27
|
+
export * from '../points/index.js';
|
|
28
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;;;GAMG;AAEH,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The model: commands in, patches applied, history kept, listeners told.
|
|
3
|
+
* Reading goes through getters; writing only through `dispatch` (and
|
|
4
|
+
* `transact`, `undo`, `redo`). Command handlers and patch ops come from the
|
|
5
|
+
* Reactor platform's `datalayer.cells.*` points, resolved once into tables
|
|
6
|
+
* and again only when the platform changes.
|
|
7
|
+
*
|
|
8
|
+
* @module core/model
|
|
9
|
+
*/
|
|
10
|
+
import type { PlatformInput, ReactorPlatform } from '@datalayer/reactor';
|
|
11
|
+
import type { CellContent } from './cells.js';
|
|
12
|
+
import { type Command, type CommandResult } from './commands.js';
|
|
13
|
+
import { type HistoryLimits } from './history.js';
|
|
14
|
+
import type { Patch, PatchOp } from './patches.js';
|
|
15
|
+
import { type SelectionState } from './selection.js';
|
|
16
|
+
import type { Style } from './styles.js';
|
|
17
|
+
import { type CellsWorkbook } from './format.js';
|
|
18
|
+
import { type CellValue } from './values.js';
|
|
19
|
+
import { type Limits, type Sheet, Workbook } from './workbook.js';
|
|
20
|
+
import type { Zone } from './zone.js';
|
|
21
|
+
/** Where a change came from. */
|
|
22
|
+
export type Origin = 'local' | 'undo' | 'redo' | 'remote' | 'load';
|
|
23
|
+
/** One committed change: what listeners and `onChange` receive. */
|
|
24
|
+
export interface Transaction {
|
|
25
|
+
readonly label: string;
|
|
26
|
+
readonly commands: readonly Command[];
|
|
27
|
+
readonly patches: readonly Patch[];
|
|
28
|
+
readonly origin: Origin;
|
|
29
|
+
}
|
|
30
|
+
export interface CellsModelOptions {
|
|
31
|
+
/** A started Reactor platform the host owns, with `CellsCorePlugin` among its plugins. */
|
|
32
|
+
readonly reactor?: ReactorPlatform;
|
|
33
|
+
/** Reactor plugins: the model builds its own platform from the core, the built-ins and these. */
|
|
34
|
+
readonly plugins?: readonly PlatformInput[];
|
|
35
|
+
readonly limits?: Partial<Limits>;
|
|
36
|
+
readonly readOnly?: boolean;
|
|
37
|
+
readonly history?: Partial<HistoryLimits>;
|
|
38
|
+
/** A `CellsWorkbook` to load; validated whole first, refused with the path of the first bad field. */
|
|
39
|
+
readonly data?: unknown;
|
|
40
|
+
}
|
|
41
|
+
export type ChangeListener = (transaction: Transaction) => void;
|
|
42
|
+
export type SelectionListener = (selection: SelectionState) => void;
|
|
43
|
+
export declare class CellsModel {
|
|
44
|
+
#private;
|
|
45
|
+
readonly reactor: ReactorPlatform;
|
|
46
|
+
readonly workbook: Workbook;
|
|
47
|
+
readonly readOnly: boolean;
|
|
48
|
+
constructor(options?: CellsModelOptions);
|
|
49
|
+
/** Run a command: refused with reasons, or applied as one undo step (or into the open transaction). */
|
|
50
|
+
dispatch(command: Command): CommandResult;
|
|
51
|
+
/**
|
|
52
|
+
* Group every command `fn` dispatches into one undo step and one change
|
|
53
|
+
* event. If `fn` throws, what it applied is rolled back and the error rethrown.
|
|
54
|
+
* A refused command inside does not stop the others; `fn` decides.
|
|
55
|
+
*/
|
|
56
|
+
transact<T>(label: string, fn: () => T): T;
|
|
57
|
+
undo(): boolean;
|
|
58
|
+
redo(): boolean;
|
|
59
|
+
get canUndo(): boolean;
|
|
60
|
+
get canRedo(): boolean;
|
|
61
|
+
/** The labels of the steps undo and redo would take. */
|
|
62
|
+
get historyLabels(): {
|
|
63
|
+
undo?: string;
|
|
64
|
+
redo?: string;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* Apply patches that did not come from a local command (a remote peer's),
|
|
68
|
+
* without history. The binding (`./collab`) is the caller.
|
|
69
|
+
*/
|
|
70
|
+
applyRemote(patches: readonly Patch[], label?: string): void;
|
|
71
|
+
/** Called after every committed change; returns the unsubscriber. */
|
|
72
|
+
subscribe(listener: ChangeListener): () => void;
|
|
73
|
+
/** The selection stream: called on every selection change. */
|
|
74
|
+
subscribeSelection(listener: SelectionListener): () => void;
|
|
75
|
+
/** Grows on every change: what `useSyncExternalStore` compares. */
|
|
76
|
+
get revision(): number;
|
|
77
|
+
get selection(): SelectionState;
|
|
78
|
+
/** Set the selection (view state: never undone, never synced). */
|
|
79
|
+
select(selection: SelectionState): void;
|
|
80
|
+
get sheets(): readonly Sheet[];
|
|
81
|
+
sheet(id: string): Sheet;
|
|
82
|
+
/** What a cell holds, or `null`. */
|
|
83
|
+
content(sheet: string, row: number, col: number): CellContent | null;
|
|
84
|
+
/**
|
|
85
|
+
* What a cell shows: its value, or a formula's last computed value. Until
|
|
86
|
+
* the formula engine evaluates it, a formula with no cached value is `#NAME?`.
|
|
87
|
+
*/
|
|
88
|
+
value(sheet: string, row: number, col: number): CellValue;
|
|
89
|
+
style(sheet: string, row: number, col: number): Style;
|
|
90
|
+
/** The workbook as `CellsWorkbook` JSON. */
|
|
91
|
+
toJSON(): CellsWorkbook;
|
|
92
|
+
/** The values a zone shows, as rows (empty cells are `null`). */
|
|
93
|
+
toRows(zone: Zone, sheet?: string): CellValue[][];
|
|
94
|
+
/** Counters for the debug overlay and `useCellsStats`. */
|
|
95
|
+
stats(): {
|
|
96
|
+
revision: number;
|
|
97
|
+
sheets: number;
|
|
98
|
+
cells: number;
|
|
99
|
+
chunks: number;
|
|
100
|
+
strings: number;
|
|
101
|
+
styles: number;
|
|
102
|
+
formulas: number;
|
|
103
|
+
history: {
|
|
104
|
+
steps: number;
|
|
105
|
+
bytes: number;
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
/** The handler of a command type, for hosts that list what can be dispatched. */
|
|
109
|
+
commandTypes(): string[];
|
|
110
|
+
/** The patch op of a type; the forcing test reads it. */
|
|
111
|
+
patchOp(op: string): PatchOp<any> | undefined;
|
|
112
|
+
patchOpNames(): string[];
|
|
113
|
+
}
|
|
114
|
+
/** A model: from `data` (a `CellsWorkbook`), or one empty sheet. */
|
|
115
|
+
export declare function createCellsModel(options?: CellsModelOptions): CellsModel;
|
|
116
|
+
//# sourceMappingURL=model.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model.d.ts","sourceRoot":"","sources":["../../src/core/model.ts"],"names":[],"mappings":"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"}
|