@rowsncolumns/y-spreadsheet 14.0.32

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 (53) hide show
  1. package/LICENSE.md +100 -0
  2. package/Readme.md +77 -0
  3. package/dist/cjs/helpers.d.ts +179 -0
  4. package/dist/cjs/helpers.d.ts.map +1 -0
  5. package/dist/cjs/helpers.js +1635 -0
  6. package/dist/cjs/index.d.ts +6 -0
  7. package/dist/cjs/index.d.ts.map +1 -0
  8. package/dist/cjs/index.js +8 -0
  9. package/dist/cjs/observables.d.ts +10 -0
  10. package/dist/cjs/observables.d.ts.map +1 -0
  11. package/dist/cjs/observables.js +90 -0
  12. package/dist/cjs/profiling/batch-profile.spec.d.ts +2 -0
  13. package/dist/cjs/profiling/batch-profile.spec.d.ts.map +1 -0
  14. package/dist/cjs/profiling/batch-profile.spec.js +175 -0
  15. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  16. package/dist/cjs/types.d.ts +62 -0
  17. package/dist/cjs/types.d.ts.map +1 -0
  18. package/dist/cjs/types.js +2 -0
  19. package/dist/cjs/use-yspreadsheet-v2.d.ts +152 -0
  20. package/dist/cjs/use-yspreadsheet-v2.d.ts.map +1 -0
  21. package/dist/cjs/use-yspreadsheet-v2.js +980 -0
  22. package/dist/cjs/use-yspreadsheet.d.ts +39 -0
  23. package/dist/cjs/use-yspreadsheet.d.ts.map +1 -0
  24. package/dist/cjs/use-yspreadsheet.js +430 -0
  25. package/dist/cjs/vitest.config.d.ts +3 -0
  26. package/dist/cjs/vitest.config.d.ts.map +1 -0
  27. package/dist/cjs/vitest.config.js +23 -0
  28. package/dist/esm/helpers.d.ts +179 -0
  29. package/dist/esm/helpers.d.ts.map +1 -0
  30. package/dist/esm/helpers.js +1346 -0
  31. package/dist/esm/index.d.ts +6 -0
  32. package/dist/esm/index.d.ts.map +1 -0
  33. package/dist/esm/index.js +5 -0
  34. package/dist/esm/observables.d.ts +10 -0
  35. package/dist/esm/observables.d.ts.map +1 -0
  36. package/dist/esm/observables.js +51 -0
  37. package/dist/esm/profiling/batch-profile.spec.d.ts +2 -0
  38. package/dist/esm/profiling/batch-profile.spec.d.ts.map +1 -0
  39. package/dist/esm/profiling/batch-profile.spec.js +131 -0
  40. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  41. package/dist/esm/types.d.ts +62 -0
  42. package/dist/esm/types.d.ts.map +1 -0
  43. package/dist/esm/types.js +1 -0
  44. package/dist/esm/use-yspreadsheet-v2.d.ts +152 -0
  45. package/dist/esm/use-yspreadsheet-v2.d.ts.map +1 -0
  46. package/dist/esm/use-yspreadsheet-v2.js +814 -0
  47. package/dist/esm/use-yspreadsheet.d.ts +39 -0
  48. package/dist/esm/use-yspreadsheet.d.ts.map +1 -0
  49. package/dist/esm/use-yspreadsheet.js +304 -0
  50. package/dist/esm/vitest.config.d.ts +3 -0
  51. package/dist/esm/vitest.config.d.ts.map +1 -0
  52. package/dist/esm/vitest.config.js +21 -0
  53. package/package.json +54 -0
@@ -0,0 +1,39 @@
1
+ import type { HocuspocusProvider } from "@hocuspocus/provider";
2
+ import type { CellInterface } from "@rowsncolumns/grid";
3
+ import type { CellData, Collaborator, ConditionalFormatRule, DataValidationRuleRecord, EmbeddedChart, EmbeddedObject, NamedRange, ProtectedRange, Sheet, TableView } from "@rowsncolumns/spreadsheet";
4
+ import type { CalculateNowOptions, CalculationOperation, HistoryType, SheetData, SpreadsheetPatch } from "@rowsncolumns/spreadsheet-state";
5
+ import type { Patch } from "immer";
6
+ import type { WebsocketProvider } from "y-websocket";
7
+ import type * as Y from "yjs";
8
+ export type useYSpreadsheetProps<T extends CellData, S extends Sheet, C extends EmbeddedChart, O extends EmbeddedObject> = {
9
+ userId: string | number;
10
+ title: string;
11
+ sheetId: number;
12
+ activeCell?: CellInterface;
13
+ provider?: HocuspocusProvider | WebsocketProvider | any;
14
+ doc: Y.Doc;
15
+ calculateNow(options?: CalculateNowOptions): void;
16
+ onChangeSheetData: React.Dispatch<React.SetStateAction<SheetData<T>>>;
17
+ onChangeTables: React.Dispatch<React.SetStateAction<TableView[]>>;
18
+ onChangeSheets: React.Dispatch<React.SetStateAction<S[]>>;
19
+ onChangeCharts?: React.Dispatch<React.SetStateAction<C[]>>;
20
+ onChangeEmbeds?: React.Dispatch<React.SetStateAction<O[]>>;
21
+ onChangeNamedRanges?: React.Dispatch<React.SetStateAction<NamedRange[]>>;
22
+ onChangeProtectedRanges?: React.Dispatch<React.SetStateAction<ProtectedRange[]>>;
23
+ onChangeConditionalFormats?: React.Dispatch<React.SetStateAction<ConditionalFormatRule[]>>;
24
+ onChangeDataValidations?: React.Dispatch<React.SetStateAction<DataValidationRuleRecord[]>>;
25
+ enqueueCalculation: (operation: CalculationOperation) => void;
26
+ onError?(err: unknown): void;
27
+ onInitialDataLoaded?(): void;
28
+ };
29
+ /**
30
+ * Connects to a Y server and picks up the most recent change
31
+ * Does not load initial data
32
+ * @returns
33
+ */
34
+ export declare const useYSpreadsheet: <T extends CellData, S extends Sheet, C extends EmbeddedChart, O extends EmbeddedObject>({ onChangeSheetData, onChangeSheets, onChangeTables, onChangeCharts, onChangeEmbeds, onChangeConditionalFormats, onChangeDataValidations, onChangeNamedRanges, onChangeProtectedRanges, onError, enqueueCalculation, calculateNow, userId, title, sheetId, activeCell, doc, provider, }: useYSpreadsheetProps<T, S, C, O>) => {
35
+ onBroadcastPatch: (patches: [patch: SpreadsheetPatch<Patch>, type?: HistoryType | undefined][]) => void;
36
+ users: Collaborator[];
37
+ synced: boolean;
38
+ };
39
+ //# sourceMappingURL=use-yspreadsheet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-yspreadsheet.d.ts","sourceRoot":"","sources":["../../use-yspreadsheet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,430 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useYSpreadsheet = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var spreadsheet_1 = require("@rowsncolumns/spreadsheet");
6
+ var immer_1 = require("immer");
7
+ var uniqBy_1 = tslib_1.__importDefault(require("lodash/uniqBy"));
8
+ var react_1 = require("react");
9
+ var yjs_1 = require("yjs");
10
+ var getStateVector = function (doc) { return (0, yjs_1.encodeStateVector)(doc); };
11
+ // Function to get updates between two state vectors
12
+ var getUpdatesBetween = function (doc, stateVector1, stateVector2) {
13
+ var diff = (0, yjs_1.encodeStateAsUpdate)(doc, stateVector1);
14
+ var newDiff = (0, yjs_1.encodeStateAsUpdate)(doc, stateVector2);
15
+ return (0, yjs_1.diffUpdate)(diff, newDiff);
16
+ };
17
+ /**
18
+ * Connects to a Y server and picks up the most recent change
19
+ * Does not load initial data
20
+ * @returns
21
+ */
22
+ var useYSpreadsheet = function (_a) {
23
+ var onChangeSheetData = _a.onChangeSheetData, onChangeSheets = _a.onChangeSheets, onChangeTables = _a.onChangeTables, onChangeCharts = _a.onChangeCharts, onChangeEmbeds = _a.onChangeEmbeds, onChangeConditionalFormats = _a.onChangeConditionalFormats, onChangeDataValidations = _a.onChangeDataValidations, onChangeNamedRanges = _a.onChangeNamedRanges, onChangeProtectedRanges = _a.onChangeProtectedRanges, onError = _a.onError, enqueueCalculation = _a.enqueueCalculation, calculateNow = _a.calculateNow, userId = _a.userId, title = _a.title, sheetId = _a.sheetId, activeCell = _a.activeCell, doc = _a.doc, provider = _a.provider;
24
+ var _b = tslib_1.__read((0, react_1.useState)([]), 2), users = _b[0], setUsers = _b[1];
25
+ var _c = tslib_1.__read((0, react_1.useState)(false), 2), synced = _c[0], setSynced = _c[1];
26
+ var previousStateVectorRef = (0, react_1.useRef)(undefined);
27
+ var currentStateVectorRef = (0, react_1.useRef)(undefined);
28
+ // Recalc cells
29
+ var yRecalcCells = (0, react_1.useMemo)(function () { return doc.getArray("recalcCells"); }, [doc]);
30
+ var yDisableRecalc = doc.getMap("disableRecalc");
31
+ // Counter
32
+ // Create a counter to keep track of when the last sync was done
33
+ var docSyncCounterRef = (0, react_1.useRef)(new Map());
34
+ // Create a doc map
35
+ var docMap = (0, react_1.useMemo)(function () {
36
+ var docMap = new Map([
37
+ [
38
+ "sheets",
39
+ [doc.getArray("sheets"), onChangeSheets, "sheetId"],
40
+ ],
41
+ [
42
+ "sheetData",
43
+ [doc.getArray("sheetData"), onChangeSheetData],
44
+ ],
45
+ ["tables", [doc.getArray("tables"), onChangeTables, "id"]],
46
+ ["embeds", [doc.getArray("embeds"), onChangeEmbeds, "id"]],
47
+ ["charts", [doc.getArray("charts"), onChangeCharts, "id"]],
48
+ [
49
+ "conditionalFormats",
50
+ [
51
+ doc.getArray("conditionalFormats"),
52
+ onChangeConditionalFormats,
53
+ "id",
54
+ ],
55
+ ],
56
+ [
57
+ "dataValidations",
58
+ [
59
+ doc.getArray("dataValidations"),
60
+ onChangeDataValidations,
61
+ "id",
62
+ ],
63
+ ],
64
+ [
65
+ "namedRanges",
66
+ [doc.getArray("namedRanges"), onChangeNamedRanges, "id"],
67
+ ],
68
+ [
69
+ "protectedRanges",
70
+ [
71
+ doc.getArray("protectedRanges"),
72
+ onChangeProtectedRanges,
73
+ "id",
74
+ ],
75
+ ],
76
+ ]);
77
+ return docMap;
78
+ }, [
79
+ onChangeSheets,
80
+ onChangeSheetData,
81
+ onChangeTables,
82
+ onChangeCharts,
83
+ onChangeConditionalFormats,
84
+ onChangeDataValidations,
85
+ onChangeNamedRanges,
86
+ onChangeProtectedRanges,
87
+ onChangeEmbeds,
88
+ doc,
89
+ ]);
90
+ // Listen to awareness
91
+ var awareness = provider === null || provider === void 0 ? void 0 : provider.awareness;
92
+ // Callback when the content is first synced
93
+ var onSynced = (0, react_1.useCallback)(function () {
94
+ var e_1, _a;
95
+ var _b;
96
+ var syncedDoc = doc;
97
+ if (previousStateVectorRef.current) {
98
+ // Capture the current state vector on subsequent syncs
99
+ currentStateVectorRef.current = getStateVector(doc);
100
+ var updates = getUpdatesBetween(doc, previousStateVectorRef.current, currentStateVectorRef.current);
101
+ var newDoc = new yjs_1.Doc({ gc: true });
102
+ (0, yjs_1.applyUpdate)(newDoc, updates);
103
+ syncedDoc = newDoc;
104
+ previousStateVectorRef.current = currentStateVectorRef.current;
105
+ }
106
+ var getInitialPatches = function (ydoc, counterStart) {
107
+ var e_2, _a;
108
+ if (counterStart === void 0) { counterStart = 0; }
109
+ var patches = [];
110
+ var endCounter = counterStart;
111
+ for (var i = counterStart; i < ydoc.length; i++) {
112
+ var userPatches = ydoc.get(i).patches;
113
+ try {
114
+ for (var userPatches_1 = (e_2 = void 0, tslib_1.__values(userPatches)), userPatches_1_1 = userPatches_1.next(); !userPatches_1_1.done; userPatches_1_1 = userPatches_1.next()) {
115
+ var patch = userPatches_1_1.value;
116
+ patches.push(patch);
117
+ }
118
+ }
119
+ catch (e_2_1) { e_2 = { error: e_2_1 }; }
120
+ finally {
121
+ try {
122
+ if (userPatches_1_1 && !userPatches_1_1.done && (_a = userPatches_1.return)) _a.call(userPatches_1);
123
+ }
124
+ finally { if (e_2) throw e_2.error; }
125
+ }
126
+ endCounter++;
127
+ }
128
+ return [patches, endCounter];
129
+ };
130
+ var _loop_1 = function (mappingKey, _1, setStateFn, idKey) {
131
+ var startCounter = (_b = docSyncCounterRef.current.get(mappingKey)) !== null && _b !== void 0 ? _b : 0;
132
+ var _e = tslib_1.__read(getInitialPatches(syncedDoc.getArray(mappingKey), startCounter), 2), patches = _e[0], endCounter = _e[1];
133
+ if (patches.length) {
134
+ docSyncCounterRef.current.set(mappingKey, endCounter);
135
+ setStateFn === null || setStateFn === void 0 ? void 0 : setStateFn(function (prev) {
136
+ try {
137
+ var nextState = idKey
138
+ ? (0, uniqBy_1.default)((0, immer_1.applyPatches)(prev, patches), idKey)
139
+ : (0, immer_1.applyPatches)(prev, patches);
140
+ return nextState;
141
+ }
142
+ catch (err) {
143
+ console.error(err);
144
+ onError === null || onError === void 0 ? void 0 : onError(err);
145
+ }
146
+ return prev;
147
+ });
148
+ }
149
+ };
150
+ try {
151
+ for (var docMap_1 = tslib_1.__values(docMap), docMap_1_1 = docMap_1.next(); !docMap_1_1.done; docMap_1_1 = docMap_1.next()) {
152
+ var _c = tslib_1.__read(docMap_1_1.value, 2), mappingKey = _c[0], _d = tslib_1.__read(_c[1], 3), _1 = _d[0], setStateFn = _d[1], idKey = _d[2];
153
+ _loop_1(mappingKey, _1, setStateFn, idKey);
154
+ }
155
+ }
156
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
157
+ finally {
158
+ try {
159
+ if (docMap_1_1 && !docMap_1_1.done && (_a = docMap_1.return)) _a.call(docMap_1);
160
+ }
161
+ finally { if (e_1) throw e_1.error; }
162
+ }
163
+ // Update recalc cells
164
+ (0, spreadsheet_1.scheduleNormalPriorityCallback)(function () {
165
+ calculateNow({
166
+ disableEvaluation: true,
167
+ shouldResetCellDependencyGraph: true,
168
+ });
169
+ });
170
+ // Set synced
171
+ setSynced(true);
172
+ }, [calculateNow, docMap, onError, doc]);
173
+ // Sync state
174
+ if ((provider === null || provider === void 0 ? void 0 : provider.synced) && !synced) {
175
+ onSynced();
176
+ }
177
+ // Listen to first sync event
178
+ (0, spreadsheet_1.useIsomorphicLayoutEffect)(function () {
179
+ provider === null || provider === void 0 ? void 0 : provider.on("synced", onSynced);
180
+ var onConnectionStatusChange = function (_a) {
181
+ var status = _a.status;
182
+ if (status === "disconnected") {
183
+ previousStateVectorRef.current = getStateVector(doc);
184
+ }
185
+ };
186
+ provider === null || provider === void 0 ? void 0 : provider.on("status", onConnectionStatusChange);
187
+ return function () {
188
+ provider === null || provider === void 0 ? void 0 : provider.off("synced", onSynced);
189
+ provider === null || provider === void 0 ? void 0 : provider.off("status", onConnectionStatusChange);
190
+ };
191
+ }, [provider, onSynced, doc]);
192
+ // Awareness
193
+ (0, spreadsheet_1.useIsomorphicLayoutEffect)(function () {
194
+ var onChangeAwareness = function () {
195
+ var e_3, _a;
196
+ if (awareness) {
197
+ var collaborators = [];
198
+ try {
199
+ for (var _b = tslib_1.__values(awareness.getStates().entries()), _c = _b.next(); !_c.done; _c = _b.next()) {
200
+ var _d = tslib_1.__read(_c.value, 2), _2 = _d[0], value = _d[1];
201
+ if (value && value.activeCell && value.userId) {
202
+ collaborators.push({
203
+ activeCell: value.activeCell,
204
+ title: value.title,
205
+ userId: value.userId,
206
+ sheetId: value.sheetId,
207
+ });
208
+ }
209
+ }
210
+ }
211
+ catch (e_3_1) { e_3 = { error: e_3_1 }; }
212
+ finally {
213
+ try {
214
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
215
+ }
216
+ finally { if (e_3) throw e_3.error; }
217
+ }
218
+ setUsers(collaborators);
219
+ }
220
+ };
221
+ // Listen to awareness
222
+ awareness === null || awareness === void 0 ? void 0 : awareness.on("change", onChangeAwareness);
223
+ return function () {
224
+ awareness === null || awareness === void 0 ? void 0 : awareness.off("change", onChangeAwareness);
225
+ };
226
+ }, [awareness]);
227
+ // Set local awareness state
228
+ (0, spreadsheet_1.useIsomorphicLayoutEffect)(function () {
229
+ awareness === null || awareness === void 0 ? void 0 : awareness.setLocalState({
230
+ userId: userId,
231
+ title: title,
232
+ sheetId: sheetId,
233
+ });
234
+ }, [awareness, userId, title, sheetId]);
235
+ // Sheet data changes
236
+ (0, spreadsheet_1.useIsomorphicLayoutEffect)(function () {
237
+ var e_4, _a;
238
+ var getPatchDeltasFromEvent = function (event) {
239
+ var e_5, _a, e_6, _b, e_7, _c;
240
+ var patches = [];
241
+ if (event.transaction.origin !== "locale") {
242
+ try {
243
+ for (var _d = tslib_1.__values(event.changes.delta), _e = _d.next(); !_e.done; _e = _d.next()) {
244
+ var changes = _e.value;
245
+ for (var type in changes) {
246
+ if (type === "insert" && changes[type] !== undefined) {
247
+ try {
248
+ for (var _f = (e_6 = void 0, tslib_1.__values(changes[type])), _g = _f.next(); !_g.done; _g = _f.next()) {
249
+ var userPatches = _g.value.patches;
250
+ try {
251
+ for (var userPatches_2 = (e_7 = void 0, tslib_1.__values(userPatches)), userPatches_2_1 = userPatches_2.next(); !userPatches_2_1.done; userPatches_2_1 = userPatches_2.next()) {
252
+ var patch = userPatches_2_1.value;
253
+ patches.push(patch);
254
+ }
255
+ }
256
+ catch (e_7_1) { e_7 = { error: e_7_1 }; }
257
+ finally {
258
+ try {
259
+ if (userPatches_2_1 && !userPatches_2_1.done && (_c = userPatches_2.return)) _c.call(userPatches_2);
260
+ }
261
+ finally { if (e_7) throw e_7.error; }
262
+ }
263
+ }
264
+ }
265
+ catch (e_6_1) { e_6 = { error: e_6_1 }; }
266
+ finally {
267
+ try {
268
+ if (_g && !_g.done && (_b = _f.return)) _b.call(_f);
269
+ }
270
+ finally { if (e_6) throw e_6.error; }
271
+ }
272
+ }
273
+ }
274
+ }
275
+ }
276
+ catch (e_5_1) { e_5 = { error: e_5_1 }; }
277
+ finally {
278
+ try {
279
+ if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
280
+ }
281
+ finally { if (e_5) throw e_5.error; }
282
+ }
283
+ }
284
+ return patches;
285
+ };
286
+ var syncRecalcCells = function (recalcCells) {
287
+ var e_8, _a;
288
+ try {
289
+ for (var recalcCells_1 = tslib_1.__values(recalcCells), recalcCells_1_1 = recalcCells_1.next(); !recalcCells_1_1.done; recalcCells_1_1 = recalcCells_1.next()) {
290
+ var _b = tslib_1.__read(recalcCells_1_1.value, 2), _3 = _b[0], position = _b[1];
291
+ enqueueCalculation({
292
+ type: "add",
293
+ position: position,
294
+ });
295
+ }
296
+ }
297
+ catch (e_8_1) { e_8 = { error: e_8_1 }; }
298
+ finally {
299
+ try {
300
+ if (recalcCells_1_1 && !recalcCells_1_1.done && (_a = recalcCells_1.return)) _a.call(recalcCells_1);
301
+ }
302
+ finally { if (e_8) throw e_8.error; }
303
+ }
304
+ };
305
+ // Trigger cell recalcs
306
+ var onRecalcCellsChange = function (event) {
307
+ var patches = getPatchDeltasFromEvent(event);
308
+ if (event.transaction.origin !== "local") {
309
+ syncRecalcCells(patches);
310
+ }
311
+ };
312
+ // Listen to changes after sync
313
+ if (synced) {
314
+ var subs_1 = [];
315
+ var _loop_2 = function (_4, doc_1, setStateFn) {
316
+ var callback = function (event) {
317
+ var patches = getPatchDeltasFromEvent(event);
318
+ var disableRecalc = yDisableRecalc.get("disableRecalc");
319
+ if (event.transaction.origin !== "local" && disableRecalc !== true) {
320
+ if (patches.length) {
321
+ setStateFn === null || setStateFn === void 0 ? void 0 : setStateFn(function (prev) {
322
+ try {
323
+ return (0, immer_1.applyPatches)(prev, patches);
324
+ }
325
+ catch (err) {
326
+ console.error(err);
327
+ onError === null || onError === void 0 ? void 0 : onError(err);
328
+ }
329
+ return prev;
330
+ });
331
+ }
332
+ }
333
+ };
334
+ doc_1.observe(callback);
335
+ subs_1.push([doc_1, callback]);
336
+ };
337
+ try {
338
+ for (var docMap_2 = tslib_1.__values(docMap), docMap_2_1 = docMap_2.next(); !docMap_2_1.done; docMap_2_1 = docMap_2.next()) {
339
+ var _b = tslib_1.__read(docMap_2_1.value, 2), _4 = _b[0], _c = tslib_1.__read(_b[1], 2), doc_1 = _c[0], setStateFn = _c[1];
340
+ _loop_2(_4, doc_1, setStateFn);
341
+ }
342
+ }
343
+ catch (e_4_1) { e_4 = { error: e_4_1 }; }
344
+ finally {
345
+ try {
346
+ if (docMap_2_1 && !docMap_2_1.done && (_a = docMap_2.return)) _a.call(docMap_2);
347
+ }
348
+ finally { if (e_4) throw e_4.error; }
349
+ }
350
+ // Observe recalc cells separat
351
+ yRecalcCells.observe(onRecalcCellsChange);
352
+ return function () {
353
+ subs_1.forEach(function (_a) {
354
+ var _b = tslib_1.__read(_a, 2), doc = _b[0], callback = _b[1];
355
+ return doc.unobserve(callback);
356
+ });
357
+ yRecalcCells.unobserve(onRecalcCellsChange);
358
+ };
359
+ }
360
+ }, [userId, provider, synced, doc, yDisableRecalc]);
361
+ // Broadcast patch
362
+ var onBroadcastPatch = (0, react_1.useCallback)(function (patches) {
363
+ doc.transact(function () {
364
+ var e_9, _a, e_10, _b;
365
+ var _c, _d;
366
+ try {
367
+ for (var patches_1 = tslib_1.__values(patches), patches_1_1 = patches_1.next(); !patches_1_1.done; patches_1_1 = patches_1.next()) {
368
+ var _e = tslib_1.__read(patches_1_1.value, 2), patch = _e[0], _f = _e[1], type = _f === void 0 ? "redo" : _f;
369
+ var patchKey = type === "redo" ? "patches" : "inversePatches";
370
+ try {
371
+ for (var docMap_3 = (e_10 = void 0, tslib_1.__values(docMap)), docMap_3_1 = docMap_3.next(); !docMap_3_1.done; docMap_3_1 = docMap_3.next()) {
372
+ var _g = tslib_1.__read(docMap_3_1.value, 2), mappingKey = _g[0], _h = tslib_1.__read(_g[1], 1), doc_2 = _h[0];
373
+ var currentPatch = patch[mappingKey];
374
+ var patches_2 = currentPatch === null || currentPatch === void 0 ? void 0 : currentPatch[patchKey];
375
+ if (patches_2) {
376
+ var startCounter = (_c = docSyncCounterRef.current.get(mappingKey)) !== null && _c !== void 0 ? _c : 0;
377
+ doc_2.push([
378
+ {
379
+ userId: userId,
380
+ patches: patches_2,
381
+ },
382
+ ]);
383
+ // Update last counter
384
+ docSyncCounterRef.current.set(mappingKey, startCounter + patches_2.length);
385
+ }
386
+ }
387
+ }
388
+ catch (e_10_1) { e_10 = { error: e_10_1 }; }
389
+ finally {
390
+ try {
391
+ if (docMap_3_1 && !docMap_3_1.done && (_b = docMap_3.return)) _b.call(docMap_3);
392
+ }
393
+ finally { if (e_10) throw e_10.error; }
394
+ }
395
+ if ((_d = patch.recalcCells) === null || _d === void 0 ? void 0 : _d[type]) {
396
+ yRecalcCells.push([
397
+ {
398
+ userId: userId,
399
+ patches: Array.from(patch.recalcCells[type]),
400
+ },
401
+ ]);
402
+ }
403
+ }
404
+ }
405
+ catch (e_9_1) { e_9 = { error: e_9_1 }; }
406
+ finally {
407
+ try {
408
+ if (patches_1_1 && !patches_1_1.done && (_a = patches_1.return)) _a.call(patches_1);
409
+ }
410
+ finally { if (e_9) throw e_9.error; }
411
+ }
412
+ }, "local");
413
+ }, [userId, docMap, doc, yRecalcCells, yDisableRecalc]);
414
+ // Listen to active cell change
415
+ (0, spreadsheet_1.useIsomorphicLayoutEffect)(function () {
416
+ if (activeCell) {
417
+ awareness === null || awareness === void 0 ? void 0 : awareness.setLocalStateField("activeCell", activeCell);
418
+ }
419
+ }, [awareness, activeCell]);
420
+ // Listen to sheet change
421
+ (0, spreadsheet_1.useIsomorphicLayoutEffect)(function () {
422
+ awareness === null || awareness === void 0 ? void 0 : awareness.setLocalStateField("sheetId", sheetId);
423
+ }, [awareness, sheetId]);
424
+ return {
425
+ onBroadcastPatch: onBroadcastPatch,
426
+ users: users,
427
+ synced: synced,
428
+ };
429
+ };
430
+ exports.useYSpreadsheet = useYSpreadsheet;
@@ -0,0 +1,3 @@
1
+ declare const _default: import("vite").UserConfig;
2
+ export default _default;
3
+ //# sourceMappingURL=vitest.config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitest.config.d.ts","sourceRoot":"","sources":["../../vitest.config.ts"],"names":[],"mappings":";AAEA,wBAsBG"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ var config_1 = require("vitest/config");
4
+ exports.default = (0, config_1.defineConfig)({
5
+ test: {
6
+ globals: true,
7
+ environment: "jsdom",
8
+ // ✅ correct location for deps.inline
9
+ deps: {
10
+ inline: ["konva", "react-konva"],
11
+ },
12
+ },
13
+ // Ensure Vite bundles these for SSR-style test runs
14
+ ssr: {
15
+ noExternal: ["konva", "react-konva"],
16
+ },
17
+ // Prefer the ESM build of react-konva (avoid its CJS wrapper that requires konva)
18
+ resolve: {
19
+ alias: {
20
+ "react-konva": "react-konva/es/ReactKonvaCore.js",
21
+ },
22
+ },
23
+ });