@rowsncolumns/rnc-yrs-store 0.11.17 → 0.13.0-beta.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.
@@ -2,13 +2,19 @@
2
2
  /* eslint-disable */
3
3
 
4
4
  /**
5
- * Thin wasm-bindgen shell over [`YDocEngine`]. Bytes cross as `Uint8Array` (`Vec<u8>`/`&[u8]`),
6
- * results as JSON strings — matching `YrsSheetDoc`, so it builds for both wasm and native.
5
+ * Thin wasm-bindgen shell over the engine router ([`DualEngine`]: the positional v3 store or the
6
+ * stable-ids v5 store, by document). Bytes cross as `Uint8Array` (`Vec<u8>`/`&[u8]`), results as
7
+ * JSON strings, so it builds for both wasm and native.
7
8
  */
8
9
  export class SpreadsheetEngine {
9
10
  free(): void;
10
11
  [Symbol.dispose](): void;
11
12
  addSheet(sheet_id: number, title: string): void;
13
+ /**
14
+ * Anchor a `GridRange` on `sheet_id`: an opaque string (base64 stable range) that
15
+ * `resolveAnchor` resolves later, on any replica, through any structural edit.
16
+ */
17
+ anchorRange(sheet_id: number, range_json: string): string;
12
18
  applyCommand(json: string): string;
13
19
  /**
14
20
  * `applyCommand` without write recording, undo history, or a `CommitResult` diff — and with
@@ -33,6 +39,10 @@ export class SpreadsheetEngine {
33
39
  * Drop the entire undo/redo history (`SpreadsheetEngineLike.clearHistory`).
34
40
  */
35
41
  clearHistory(): void;
42
+ /**
43
+ * JSON array of the sheet's column ids in grid order, as decimal strings.
44
+ */
45
+ columnIds(sheet_id: number): string;
36
46
  /**
37
47
  * Fold the style log into a base, keeping the newest `keep_tail` buffers live (see
38
48
  * `YrsStore::compact_style_log`). Meant for a host holding the workbook write lease (a server
@@ -45,7 +55,7 @@ export class SpreadsheetEngine {
45
55
  * as JSON `Vec<Vec<String>>`. The host writes the grid into the sheet via a `change-batch` command
46
56
  * so the values compute, persist, and collaborate through the normal engine path. Quoting,
47
57
  * embedded newlines, and ragged rows are handled by the `csv` crate.
48
- * RFC 4180 CSV of one sheet's merged view (blocks + hot plane, geometry-aware). Formulas
58
+ * RFC 4180 CSV of one sheet's merged view (blocks + hot plane, at current positions). Formulas
49
59
  * export their computed display value, like Excel/Sheets "Save as CSV". One streaming pass
50
60
  * over the store — built to run in a Web Worker for million-row sheets.
51
61
  * Excel-style Ctrl/Cmd+Arrow target. One of `d_row`/`d_col` is ±1, the other 0; returns
@@ -224,6 +234,11 @@ export class SpreadsheetEngine {
224
234
  loadFromUpdateQuiet(bytes: Uint8Array): void;
225
235
  constructor();
226
236
  parseCsv(text: string): string;
237
+ /**
238
+ * JSON `{sheetId, row, col}` (1-based) of an `rncCells` / `rncNotes` key; `undefined` for a
239
+ * malformed key or an orphan (its row or column was deleted).
240
+ */
241
+ parseStableCellKey(key: string): string | undefined;
227
242
  /**
228
243
  * PRECEDENTS of a cell as `{cells, ranges}` JSON (`SpreadsheetEngineLike.precedents`).
229
244
  */
@@ -261,11 +276,33 @@ export class SpreadsheetEngine {
261
276
  * Register a host (JS) custom-function name (`SpreadsheetEngineLike.registerCustomFunction`).
262
277
  */
263
278
  registerCustomFunction(name: string): void;
279
+ /**
280
+ * JSON `{range: GridRange | null, status: "ok" | "gone" | "unknown"}` for an `anchorRange`
281
+ * anchor: `gone` once every row or column of it was deleted, `unknown` while its lines have
282
+ * not arrived on this replica; a malformed anchor is an `Err`.
283
+ */
284
+ resolveAnchor(anchor: string): string;
285
+ /**
286
+ * JSON array of the sheet's row ids in grid order, as decimal strings.
287
+ */
288
+ rowIds(sheet_id: number): string;
289
+ /**
290
+ * Create stable-ids (v5) documents with this engine; off by default. On, a document it creates
291
+ * starts as v5 — its first edit or import on a fresh engine, or a loaded document that holds no
292
+ * data yet. A document that holds data is never converted (existing documents stay v3), and a
293
+ * v5 document always runs as v5, whatever the setting. Set it from the asset's chosen version,
294
+ * for everyone who opens the asset. `true` when the call made the open (blank) document v5.
295
+ */
296
+ setStableIds(enabled: boolean): boolean;
264
297
  /**
265
298
  * Pin the evaluation timezone for `TODAY()` / `NOW()` as minutes east of UTC (`null` /
266
299
  * `undefined` restores the default `Local` clock). Returns `false` for an offset outside ±24h.
267
300
  */
268
301
  setTimezoneOffsetMinutes(minutes?: number | null): boolean;
302
+ /**
303
+ * `"v5"` while the document runs on the stable-ids store, else `"v3"`.
304
+ */
305
+ sheetDataVersion(): string;
269
306
  /**
270
307
  * Per-sheet 1-based data extents as JSON `[{"sheetId", "maxRow", "maxCol"}]`.
271
308
  */
@@ -294,6 +331,11 @@ export class SpreadsheetEngine {
294
331
  * [`YrsStore::shift_log_frontier`]).
295
332
  */
296
333
  shiftLogFrontier(): string;
334
+ /**
335
+ * The `rncCells` key (`"{sheetId}:{rowId}:{colId}"`) of 1-based `(row, col)`; `undefined`
336
+ * while the row or column is unnamed (past the sheet's named extent). Never names lines.
337
+ */
338
+ stableCellKey(sheet_id: number, row: number, col: number): string | undefined;
297
339
  stateAsUpdate(): Uint8Array;
298
340
  /**
299
341
  * JSON `{buffers, baseBuffers, bytes, seedEntries, styledCells}` — the style history a load
@@ -336,7 +378,9 @@ export class SpreadsheetEngine {
336
378
  }
337
379
 
338
380
  /**
339
- * Minimal yrs-backed sheet doc exposing the canonical `sheetDataV3` encoding + yjs v1 transport.
381
+ * Minimal positional (`sheetDataV3`) sheet doc + yjs v1 transport — the R0 interop spike, kept
382
+ * for the fixture tooling that reads a room the way the engine reads it. It knows the v3 plane
383
+ * only: a v5 document's cells are in `rncCells` (`libs/rnc-yrs-store/docs/v5-document-encoding.md`).
340
384
  */
341
385
  export class YrsSheetDoc {
342
386
  free(): void;
@@ -412,7 +456,9 @@ export interface InitOutput {
412
456
  readonly spreadsheetengine_redo: (a: number) => [number, number];
413
457
  readonly spreadsheetengine_redoDepth: (a: number) => number;
414
458
  readonly spreadsheetengine_registerCustomFunction: (a: number, b: number, c: number) => void;
459
+ readonly spreadsheetengine_setStableIds: (a: number, b: number) => [number, number, number];
415
460
  readonly spreadsheetengine_setTimezoneOffsetMinutes: (a: number, b: number) => number;
461
+ readonly spreadsheetengine_sheetDataVersion: (a: number) => [number, number];
416
462
  readonly spreadsheetengine_sheetExtents: (a: number) => [number, number];
417
463
  readonly spreadsheetengine_sheetIds: (a: number) => [number, number];
418
464
  readonly spreadsheetengine_sheetStats: (a: number) => [number, number];
@@ -430,6 +476,12 @@ export interface InitOutput {
430
476
  readonly yrssheetdoc_new: () => number;
431
477
  readonly yrssheetdoc_setCell: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number];
432
478
  readonly spreadsheetengine_stateAsUpdate: (a: number) => [number, number];
479
+ readonly spreadsheetengine_columnIds: (a: number, b: number) => [number, number];
480
+ readonly spreadsheetengine_parseStableCellKey: (a: number, b: number, c: number) => [number, number];
481
+ readonly spreadsheetengine_rowIds: (a: number, b: number) => [number, number];
482
+ readonly spreadsheetengine_stableCellKey: (a: number, b: number, c: number, d: number) => [number, number];
483
+ readonly spreadsheetengine_anchorRange: (a: number, b: number, c: number, d: number) => [number, number, number, number];
484
+ readonly spreadsheetengine_resolveAnchor: (a: number, b: number, c: number) => [number, number, number, number];
433
485
  readonly spreadsheetengine_shiftLogFrontier: (a: number) => [number, number];
434
486
  readonly spreadsheetengine_transformRange: (a: number, b: number, c: number, d: number, e: number, f: number) => [number, number, number, number];
435
487
  readonly transformRangeThroughOps: (a: number, b: number, c: number, d: number, e: number) => [number, number, number, number];
@@ -1,8 +1,9 @@
1
1
  /* @ts-self-types="./rnc_yrs_store.d.ts" */
2
2
 
3
3
  /**
4
- * Thin wasm-bindgen shell over [`YDocEngine`]. Bytes cross as `Uint8Array` (`Vec<u8>`/`&[u8]`),
5
- * results as JSON strings — matching `YrsSheetDoc`, so it builds for both wasm and native.
4
+ * Thin wasm-bindgen shell over the engine router ([`DualEngine`]: the positional v3 store or the
5
+ * stable-ids v5 store, by document). Bytes cross as `Uint8Array` (`Vec<u8>`/`&[u8]`), results as
6
+ * JSON strings, so it builds for both wasm and native.
6
7
  */
7
8
  export class SpreadsheetEngine {
8
9
  __destroy_into_raw() {
@@ -24,6 +25,33 @@ export class SpreadsheetEngine {
24
25
  const len0 = WASM_VECTOR_LEN;
25
26
  wasm.spreadsheetengine_addSheet(this.__wbg_ptr, sheet_id, ptr0, len0);
26
27
  }
28
+ /**
29
+ * Anchor a `GridRange` on `sheet_id`: an opaque string (base64 stable range) that
30
+ * `resolveAnchor` resolves later, on any replica, through any structural edit.
31
+ * @param {number} sheet_id
32
+ * @param {string} range_json
33
+ * @returns {string}
34
+ */
35
+ anchorRange(sheet_id, range_json) {
36
+ let deferred3_0;
37
+ let deferred3_1;
38
+ try {
39
+ const ptr0 = passStringToWasm0(range_json, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
40
+ const len0 = WASM_VECTOR_LEN;
41
+ const ret = wasm.spreadsheetengine_anchorRange(this.__wbg_ptr, sheet_id, ptr0, len0);
42
+ var ptr2 = ret[0];
43
+ var len2 = ret[1];
44
+ if (ret[3]) {
45
+ ptr2 = 0; len2 = 0;
46
+ throw takeFromExternrefTable0(ret[2]);
47
+ }
48
+ deferred3_0 = ptr2;
49
+ deferred3_1 = len2;
50
+ return getStringFromWasm0(ptr2, len2);
51
+ } finally {
52
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
53
+ }
54
+ }
27
55
  /**
28
56
  * @param {string} json
29
57
  * @returns {string}
@@ -113,6 +141,23 @@ export class SpreadsheetEngine {
113
141
  clearHistory() {
114
142
  wasm.spreadsheetengine_clearHistory(this.__wbg_ptr);
115
143
  }
144
+ /**
145
+ * JSON array of the sheet's column ids in grid order, as decimal strings.
146
+ * @param {number} sheet_id
147
+ * @returns {string}
148
+ */
149
+ columnIds(sheet_id) {
150
+ let deferred1_0;
151
+ let deferred1_1;
152
+ try {
153
+ const ret = wasm.spreadsheetengine_columnIds(this.__wbg_ptr, sheet_id);
154
+ deferred1_0 = ret[0];
155
+ deferred1_1 = ret[1];
156
+ return getStringFromWasm0(ret[0], ret[1]);
157
+ } finally {
158
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
159
+ }
160
+ }
116
161
  /**
117
162
  * Fold the style log into a base, keeping the newest `keep_tail` buffers live (see
118
163
  * `YrsStore::compact_style_log`). Meant for a host holding the workbook write lease (a server
@@ -138,7 +183,7 @@ export class SpreadsheetEngine {
138
183
  * as JSON `Vec<Vec<String>>`. The host writes the grid into the sheet via a `change-batch` command
139
184
  * so the values compute, persist, and collaborate through the normal engine path. Quoting,
140
185
  * embedded newlines, and ragged rows are handled by the `csv` crate.
141
- * RFC 4180 CSV of one sheet's merged view (blocks + hot plane, geometry-aware). Formulas
186
+ * RFC 4180 CSV of one sheet's merged view (blocks + hot plane, at current positions). Formulas
142
187
  * export their computed display value, like Excel/Sheets "Save as CSV". One streaming pass
143
188
  * over the store — built to run in a Web Worker for million-row sheets.
144
189
  * Excel-style Ctrl/Cmd+Arrow target. One of `d_row`/`d_col` is ±1, the other 0; returns
@@ -761,6 +806,23 @@ export class SpreadsheetEngine {
761
806
  wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
762
807
  }
763
808
  }
809
+ /**
810
+ * JSON `{sheetId, row, col}` (1-based) of an `rncCells` / `rncNotes` key; `undefined` for a
811
+ * malformed key or an orphan (its row or column was deleted).
812
+ * @param {string} key
813
+ * @returns {string | undefined}
814
+ */
815
+ parseStableCellKey(key) {
816
+ const ptr0 = passStringToWasm0(key, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
817
+ const len0 = WASM_VECTOR_LEN;
818
+ const ret = wasm.spreadsheetengine_parseStableCellKey(this.__wbg_ptr, ptr0, len0);
819
+ let v2;
820
+ if (ret[0] !== 0) {
821
+ v2 = getStringFromWasm0(ret[0], ret[1]).slice();
822
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
823
+ }
824
+ return v2;
825
+ }
764
826
  /**
765
827
  * PRECEDENTS of a cell as `{cells, ranges}` JSON (`SpreadsheetEngineLike.precedents`).
766
828
  * @param {number} sheet_id
@@ -897,6 +959,66 @@ export class SpreadsheetEngine {
897
959
  const len0 = WASM_VECTOR_LEN;
898
960
  wasm.spreadsheetengine_registerCustomFunction(this.__wbg_ptr, ptr0, len0);
899
961
  }
962
+ /**
963
+ * JSON `{range: GridRange | null, status: "ok" | "gone" | "unknown"}` for an `anchorRange`
964
+ * anchor: `gone` once every row or column of it was deleted, `unknown` while its lines have
965
+ * not arrived on this replica; a malformed anchor is an `Err`.
966
+ * @param {string} anchor
967
+ * @returns {string}
968
+ */
969
+ resolveAnchor(anchor) {
970
+ let deferred3_0;
971
+ let deferred3_1;
972
+ try {
973
+ const ptr0 = passStringToWasm0(anchor, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
974
+ const len0 = WASM_VECTOR_LEN;
975
+ const ret = wasm.spreadsheetengine_resolveAnchor(this.__wbg_ptr, ptr0, len0);
976
+ var ptr2 = ret[0];
977
+ var len2 = ret[1];
978
+ if (ret[3]) {
979
+ ptr2 = 0; len2 = 0;
980
+ throw takeFromExternrefTable0(ret[2]);
981
+ }
982
+ deferred3_0 = ptr2;
983
+ deferred3_1 = len2;
984
+ return getStringFromWasm0(ptr2, len2);
985
+ } finally {
986
+ wasm.__wbindgen_free(deferred3_0, deferred3_1, 1);
987
+ }
988
+ }
989
+ /**
990
+ * JSON array of the sheet's row ids in grid order, as decimal strings.
991
+ * @param {number} sheet_id
992
+ * @returns {string}
993
+ */
994
+ rowIds(sheet_id) {
995
+ let deferred1_0;
996
+ let deferred1_1;
997
+ try {
998
+ const ret = wasm.spreadsheetengine_rowIds(this.__wbg_ptr, sheet_id);
999
+ deferred1_0 = ret[0];
1000
+ deferred1_1 = ret[1];
1001
+ return getStringFromWasm0(ret[0], ret[1]);
1002
+ } finally {
1003
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
1004
+ }
1005
+ }
1006
+ /**
1007
+ * Create stable-ids (v5) documents with this engine; off by default. On, a document it creates
1008
+ * starts as v5 — its first edit or import on a fresh engine, or a loaded document that holds no
1009
+ * data yet. A document that holds data is never converted (existing documents stay v3), and a
1010
+ * v5 document always runs as v5, whatever the setting. Set it from the asset's chosen version,
1011
+ * for everyone who opens the asset. `true` when the call made the open (blank) document v5.
1012
+ * @param {boolean} enabled
1013
+ * @returns {boolean}
1014
+ */
1015
+ setStableIds(enabled) {
1016
+ const ret = wasm.spreadsheetengine_setStableIds(this.__wbg_ptr, enabled);
1017
+ if (ret[2]) {
1018
+ throw takeFromExternrefTable0(ret[1]);
1019
+ }
1020
+ return ret[0] !== 0;
1021
+ }
900
1022
  /**
901
1023
  * Pin the evaluation timezone for `TODAY()` / `NOW()` as minutes east of UTC (`null` /
902
1024
  * `undefined` restores the default `Local` clock). Returns `false` for an offset outside ±24h.
@@ -907,6 +1029,22 @@ export class SpreadsheetEngine {
907
1029
  const ret = wasm.spreadsheetengine_setTimezoneOffsetMinutes(this.__wbg_ptr, isLikeNone(minutes) ? Number.MAX_SAFE_INTEGER : (minutes) >> 0);
908
1030
  return ret !== 0;
909
1031
  }
1032
+ /**
1033
+ * `"v5"` while the document runs on the stable-ids store, else `"v3"`.
1034
+ * @returns {string}
1035
+ */
1036
+ sheetDataVersion() {
1037
+ let deferred1_0;
1038
+ let deferred1_1;
1039
+ try {
1040
+ const ret = wasm.spreadsheetengine_sheetDataVersion(this.__wbg_ptr);
1041
+ deferred1_0 = ret[0];
1042
+ deferred1_1 = ret[1];
1043
+ return getStringFromWasm0(ret[0], ret[1]);
1044
+ } finally {
1045
+ wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
1046
+ }
1047
+ }
910
1048
  /**
911
1049
  * Per-sheet 1-based data extents as JSON `[{"sheetId", "maxRow", "maxCol"}]`.
912
1050
  * @returns {string}
@@ -989,6 +1127,23 @@ export class SpreadsheetEngine {
989
1127
  wasm.__wbindgen_free(deferred1_0, deferred1_1, 1);
990
1128
  }
991
1129
  }
1130
+ /**
1131
+ * The `rncCells` key (`"{sheetId}:{rowId}:{colId}"`) of 1-based `(row, col)`; `undefined`
1132
+ * while the row or column is unnamed (past the sheet's named extent). Never names lines.
1133
+ * @param {number} sheet_id
1134
+ * @param {number} row
1135
+ * @param {number} col
1136
+ * @returns {string | undefined}
1137
+ */
1138
+ stableCellKey(sheet_id, row, col) {
1139
+ const ret = wasm.spreadsheetengine_stableCellKey(this.__wbg_ptr, sheet_id, row, col);
1140
+ let v1;
1141
+ if (ret[0] !== 0) {
1142
+ v1 = getStringFromWasm0(ret[0], ret[1]).slice();
1143
+ wasm.__wbindgen_free(ret[0], ret[1] * 1, 1);
1144
+ }
1145
+ return v1;
1146
+ }
992
1147
  /**
993
1148
  * @returns {Uint8Array}
994
1149
  */
@@ -1143,7 +1298,9 @@ export class SpreadsheetEngine {
1143
1298
  if (Symbol.dispose) SpreadsheetEngine.prototype[Symbol.dispose] = SpreadsheetEngine.prototype.free;
1144
1299
 
1145
1300
  /**
1146
- * Minimal yrs-backed sheet doc exposing the canonical `sheetDataV3` encoding + yjs v1 transport.
1301
+ * Minimal positional (`sheetDataV3`) sheet doc + yjs v1 transport — the R0 interop spike, kept
1302
+ * for the fixture tooling that reads a room the way the engine reads it. It knows the v3 plane
1303
+ * only: a v5 document's cells are in `rncCells` (`libs/rnc-yrs-store/docs/v5-document-encoding.md`).
1147
1304
  */
1148
1305
  export class YrsSheetDoc {
1149
1306
  __destroy_into_raw() {
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rowsncolumns/rnc-yrs-store",
3
- "version": "0.11.17",
3
+ "version": "0.13.0-beta.0",
4
4
  "author": "Vinay M",
5
5
  "license": "SEE LICENSE IN LICENSE.md",
6
6
  "description": "Document-backed Rust→WASM spreadsheet calc engine (yrs/CRDT, canonical sheetDataV3). Ships the `SpreadsheetEngine` (a `Store<YrsStore>`): applyCommand / undo / redo / canUndo + the Yjs collaboration surface (applyUpdate / takePendingUpdates / loadFromUpdate / stateAsUpdate) the Keryx update-pump binds to. This is the 1,000,000-row engine the demo-app ships today — previously vendored, now a versioned package. The PREBUILT wasm is included (consumers need NO Rust/wasm toolchain); the glue's default init REQUIRES an explicit `module_or_path` — pass the URL of the served `rnc_yrs_store_bg.wasm` (webpack/Turbopack statically resolve a bundled `new URL`, which would 404 from this package, so the inline-default branch is intentionally a throw).",