loro-crdt 1.5.5 → 1.5.7

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/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.5.7
4
+
5
+ ### Patch Changes
6
+
7
+ - 70a3bf3: Feat: support `group_start` and `group_end` for UndoManager #720
8
+ - 24a7f53: fix: panic when calling get_deep_value with an empty tree #740
9
+
10
+ ## 1.5.6
11
+
12
+ ### Patch Changes
13
+
14
+ - 60876bb: Feat: redact
15
+
3
16
  ## 1.5.5
4
17
 
5
18
  ### Patch Changes
package/base64/index.js CHANGED
@@ -383,6 +383,44 @@ function decodeImportBlobMeta(blob, check_checksum) {
383
383
  }
384
384
  }
385
385
 
386
+ /**
387
+ * Redacts sensitive content in JSON updates within the specified version range.
388
+ *
389
+ * This function allows you to share document history while removing potentially sensitive content.
390
+ * It preserves the document structure and collaboration capabilities while replacing content with
391
+ * placeholders according to these redaction rules:
392
+ *
393
+ * - Preserves delete and move operations
394
+ * - Replaces text insertion content with the Unicode replacement character
395
+ * - Substitutes list and map insert values with null
396
+ * - Maintains structure of child containers
397
+ * - Replaces text mark values with null
398
+ * - Preserves map keys and text annotation keys
399
+ *
400
+ * @param {Object|string} jsonUpdates - The JSON updates to redact (object or JSON string)
401
+ * @param {Object} versionRange - Version range defining what content to redact,
402
+ * format: { peerId: [startCounter, endCounter], ... }
403
+ * @returns {Object} The redacted JSON updates
404
+ * @param {string | JsonSchema} json_updates
405
+ * @param {any} version_range
406
+ * @returns {JsonSchema}
407
+ */
408
+ function redactJsonUpdates(json_updates, version_range) {
409
+ try {
410
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
411
+ wasm.redactJsonUpdates(retptr, addHeapObject(json_updates), addHeapObject(version_range));
412
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
413
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
414
+ var r2 = getDataViewMemory0().getInt32(retptr + 4 * 2, true);
415
+ if (r2) {
416
+ throw takeObject(r1);
417
+ }
418
+ return takeObject(r0);
419
+ } finally {
420
+ wasm.__wbindgen_add_to_stack_pointer(16);
421
+ }
422
+ }
423
+
386
424
  function __wbg_adapter_60(arg0, arg1, arg2) {
387
425
  wasm.__wbindgen_export_5(arg0, arg1, addHeapObject(arg2));
388
426
  }
@@ -6133,6 +6171,22 @@ class UndoManager {
6133
6171
  wasm.__wbindgen_add_to_stack_pointer(16);
6134
6172
  }
6135
6173
  }
6174
+ groupStart() {
6175
+ try {
6176
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
6177
+ wasm.undomanager_groupStart(retptr, this.__wbg_ptr);
6178
+ var r0 = getDataViewMemory0().getInt32(retptr + 4 * 0, true);
6179
+ var r1 = getDataViewMemory0().getInt32(retptr + 4 * 1, true);
6180
+ if (r1) {
6181
+ throw takeObject(r0);
6182
+ }
6183
+ } finally {
6184
+ wasm.__wbindgen_add_to_stack_pointer(16);
6185
+ }
6186
+ }
6187
+ groupEnd() {
6188
+ wasm.undomanager_groupEnd(this.__wbg_ptr);
6189
+ }
6136
6190
  /**
6137
6191
  * Can undo the last operation.
6138
6192
  * @returns {boolean}
@@ -6694,7 +6748,7 @@ function __wbg_node_02999533c4ea02e3(arg0) {
6694
6748
  const ret = getObject(arg0).node;
6695
6749
  return addHeapObject(ret);
6696
6750
  }
6697
- function __wbg_now_3e8577e703add0ba() {
6751
+ function __wbg_now_dc4980649ae44bd7() {
6698
6752
  const ret = Date.now();
6699
6753
  return ret;
6700
6754
  }
@@ -6809,11 +6863,11 @@ function __wbindgen_cb_drop(arg0) {
6809
6863
  return ret;
6810
6864
  }
6811
6865
  function __wbindgen_closure_wrapper483(arg0, arg1, arg2) {
6812
- const ret = makeMutClosure(arg0, arg1, 10, __wbg_adapter_60);
6866
+ const ret = makeMutClosure(arg0, arg1, 8, __wbg_adapter_60);
6813
6867
  return addHeapObject(ret);
6814
6868
  }
6815
- function __wbindgen_closure_wrapper485(arg0, arg1, arg2) {
6816
- const ret = makeMutClosure(arg0, arg1, 8, __wbg_adapter_63);
6869
+ function __wbindgen_closure_wrapper486(arg0, arg1, arg2) {
6870
+ const ret = makeMutClosure(arg0, arg1, 10, __wbg_adapter_63);
6817
6871
  return addHeapObject(ret);
6818
6872
  }
6819
6873
  function __wbindgen_debug_string(arg0, arg1) {
@@ -6990,7 +7044,7 @@ var imports = /*#__PURE__*/Object.freeze({
6990
7044
  __wbg_next_928df8c15fc0c9b0: __wbg_next_928df8c15fc0c9b0,
6991
7045
  __wbg_next_9dc0926f351c7090: __wbg_next_9dc0926f351c7090,
6992
7046
  __wbg_node_02999533c4ea02e3: __wbg_node_02999533c4ea02e3,
6993
- __wbg_now_3e8577e703add0ba: __wbg_now_3e8577e703add0ba,
7047
+ __wbg_now_dc4980649ae44bd7: __wbg_now_dc4980649ae44bd7,
6994
7048
  __wbg_ownKeys_b16312a839a4152c: __wbg_ownKeys_b16312a839a4152c,
6995
7049
  __wbg_process_5c1d670bc53614b8: __wbg_process_5c1d670bc53614b8,
6996
7050
  __wbg_push_e7d7247e69dad3ee: __wbg_push_e7d7247e69dad3ee,
@@ -7019,7 +7073,7 @@ var imports = /*#__PURE__*/Object.freeze({
7019
7073
  __wbindgen_boolean_get: __wbindgen_boolean_get,
7020
7074
  __wbindgen_cb_drop: __wbindgen_cb_drop,
7021
7075
  __wbindgen_closure_wrapper483: __wbindgen_closure_wrapper483,
7022
- __wbindgen_closure_wrapper485: __wbindgen_closure_wrapper485,
7076
+ __wbindgen_closure_wrapper486: __wbindgen_closure_wrapper486,
7023
7077
  __wbindgen_debug_string: __wbindgen_debug_string,
7024
7078
  __wbindgen_error_new: __wbindgen_error_new,
7025
7079
  __wbindgen_in: __wbindgen_in,
@@ -7046,6 +7100,7 @@ var imports = /*#__PURE__*/Object.freeze({
7046
7100
  decodeFrontiers: decodeFrontiers,
7047
7101
  decodeImportBlobMeta: decodeImportBlobMeta,
7048
7102
  encodeFrontiers: encodeFrontiers,
7103
+ redactJsonUpdates: redactJsonUpdates,
7049
7104
  run: run,
7050
7105
  setDebug: setDebug
7051
7106
  });
@@ -7054,7 +7109,7 @@ var imports = /*#__PURE__*/Object.freeze({
7054
7109
  // Without this patch, Cloudflare Worker would raise issue like: "Uncaught TypeError: wasm2.__wbindgen_start is not a function"
7055
7110
 
7056
7111
 
7057
- import loro_wasm_bg_js from './loro_wasm_bg-40e94009.js';
7112
+ import loro_wasm_bg_js from './loro_wasm_bg-8058cd67.js';
7058
7113
  const instance = new WebAssembly.Instance(loro_wasm_bg_js(), {
7059
7114
  "./loro_wasm_bg.js": imports,
7060
7115
  });
@@ -7359,4 +7414,4 @@ function idStrToId(idStr) {
7359
7414
  };
7360
7415
  }
7361
7416
 
7362
- export { Awareness, AwarenessWasm, ChangeModifier, Cursor, EphemeralStore, EphemeralStoreWasm, LORO_VERSION, Loro, LoroCounter, LoroDoc, LoroList, LoroMap, LoroMovableList, LoroText, LoroTree, LoroTreeNode, UndoManager, VersionVector, __wbg_String_8f0eb39a4a4c2f66, __wbg_apply_9bb7fe8fff013a3f, __wbg_buffer_ef9774282e5dab94, __wbg_call_0ad083564791763a, __wbg_call_a34b6b4765f27be0, __wbg_call_d00953b926be4879, __wbg_call_efe5a4db7065d1a2, __wbg_changemodifier_new, __wbg_crypto_ed58b8e10a292839, __wbg_cursor_new, __wbg_done_f4c254830a095eaf, __wbg_entries_4dce6361e3ba6fbc, __wbg_entries_83beb641792ccb9c, __wbg_error_7534b8e9a36f1ab4, __wbg_error_9912f7d6d7835a4b, __wbg_from_3aa0fcaa8eef0104, __wbg_getRandomValues_bcb4912f16000dc4, __wbg_get_0c3cc364764a0b98, __wbg_get_b996a12be035ef4f, __wbg_getindex_a471648b3037c750, __wbg_getwithrefkey_1dc361bd10053bfe, __wbg_globalThis_6b4d52a0b6aaeaea, __wbg_global_49324ce12193de77, __wbg_instanceof_ArrayBuffer_ff40e55b5978e215, __wbg_instanceof_Map_0f3f3653f757ced1, __wbg_instanceof_Object_9108547bac1f91b1, __wbg_instanceof_Uint8Array_db97368f94b1373f, __wbg_isArray_8738f1062fa88586, __wbg_isSafeInteger_a1b3e0811faecf2f, __wbg_iterator_c0c688f37fa815e6, __wbg_length_12246a78d2f65d3a, __wbg_length_c24da17096edfe57, __wbg_log_0cc1b7768397bcfe, __wbg_log_0fd6c49475c7bece, __wbg_log_cb9e190acc5753fb, __wbg_lorocounter_new, __wbg_lorolist_new, __wbg_loromap_new, __wbg_loromovablelist_new, __wbg_lorotext_new, __wbg_lorotree_new, __wbg_lorotreenode_new, __wbg_mark_7438147ce31e9d4b, __wbg_measure_fb7825c11612c823, __wbg_msCrypto_0a36e2ec3a343d26, __wbg_new_518e2184725aa711, __wbg_new_59845962d1127937, __wbg_new_67abf4a77618ee3e, __wbg_new_8a6f238a6ece86ea, __wbg_new_e2d07398d7689006, __wbg_newnoargs_a136448eeb7d48ac, __wbg_newwithbyteoffsetandlength_84908302a4c137cf, __wbg_newwithlength_4c216eaaf23f2f9a, __wbg_newwithlength_88b49de1eb24d63e, __wbg_next_928df8c15fc0c9b0, __wbg_next_9dc0926f351c7090, __wbg_node_02999533c4ea02e3, __wbg_now_3e8577e703add0ba, __wbg_ownKeys_b16312a839a4152c, __wbg_process_5c1d670bc53614b8, __wbg_push_e7d7247e69dad3ee, __wbg_randomFillSync_ab2cfe79ebbf2740, __wbg_require_79b1e9274cde3c87, __wbg_resolve_267ff08e7e1d2ce4, __wbg_self_cca3ca60d61220f4, __wbg_set_1b50d2de855a9d50, __wbg_set_393f510a6b7e9da5, __wbg_set_3f1d0b984ed272ed, __wbg_set_5deee49b10b2b780, __wbg_set_93ba9407b5476ec6, __wbg_set_wasm, __wbg_setindex_e0b7b31bfc87ba3f, __wbg_stack_0ed75d68575b0f3c, __wbg_subarray_2dc34705c0dc7cdb, __wbg_then_84907e7a6730461e, __wbg_value_51f8a88d4a1805fb, __wbg_versions_c71aa1626a93e0a1, __wbg_versionvector_new, __wbg_window_2aba046d3fc4ad7c, __wbindgen_as_number, __wbindgen_bigint_from_i64, __wbindgen_bigint_from_u64, __wbindgen_bigint_get_as_i64, __wbindgen_boolean_get, __wbindgen_cb_drop, __wbindgen_closure_wrapper483, __wbindgen_closure_wrapper485, __wbindgen_debug_string, __wbindgen_error_new, __wbindgen_in, __wbindgen_is_array, __wbindgen_is_bigint, __wbindgen_is_falsy, __wbindgen_is_function, __wbindgen_is_null, __wbindgen_is_object, __wbindgen_is_string, __wbindgen_is_undefined, __wbindgen_jsval_eq, __wbindgen_jsval_loose_eq, __wbindgen_memory, __wbindgen_number_get, __wbindgen_number_new, __wbindgen_object_clone_ref, __wbindgen_object_drop_ref, __wbindgen_rethrow, __wbindgen_string_get, __wbindgen_string_new, __wbindgen_throw, __wbindgen_typeof, decodeFrontiers, decodeImportBlobMeta, encodeFrontiers, getType, idStrToId, isContainer, isContainerId, newContainerID, newRootContainerID, run, setDebug };
7417
+ export { Awareness, AwarenessWasm, ChangeModifier, Cursor, EphemeralStore, EphemeralStoreWasm, LORO_VERSION, Loro, LoroCounter, LoroDoc, LoroList, LoroMap, LoroMovableList, LoroText, LoroTree, LoroTreeNode, UndoManager, VersionVector, __wbg_String_8f0eb39a4a4c2f66, __wbg_apply_9bb7fe8fff013a3f, __wbg_buffer_ef9774282e5dab94, __wbg_call_0ad083564791763a, __wbg_call_a34b6b4765f27be0, __wbg_call_d00953b926be4879, __wbg_call_efe5a4db7065d1a2, __wbg_changemodifier_new, __wbg_crypto_ed58b8e10a292839, __wbg_cursor_new, __wbg_done_f4c254830a095eaf, __wbg_entries_4dce6361e3ba6fbc, __wbg_entries_83beb641792ccb9c, __wbg_error_7534b8e9a36f1ab4, __wbg_error_9912f7d6d7835a4b, __wbg_from_3aa0fcaa8eef0104, __wbg_getRandomValues_bcb4912f16000dc4, __wbg_get_0c3cc364764a0b98, __wbg_get_b996a12be035ef4f, __wbg_getindex_a471648b3037c750, __wbg_getwithrefkey_1dc361bd10053bfe, __wbg_globalThis_6b4d52a0b6aaeaea, __wbg_global_49324ce12193de77, __wbg_instanceof_ArrayBuffer_ff40e55b5978e215, __wbg_instanceof_Map_0f3f3653f757ced1, __wbg_instanceof_Object_9108547bac1f91b1, __wbg_instanceof_Uint8Array_db97368f94b1373f, __wbg_isArray_8738f1062fa88586, __wbg_isSafeInteger_a1b3e0811faecf2f, __wbg_iterator_c0c688f37fa815e6, __wbg_length_12246a78d2f65d3a, __wbg_length_c24da17096edfe57, __wbg_log_0cc1b7768397bcfe, __wbg_log_0fd6c49475c7bece, __wbg_log_cb9e190acc5753fb, __wbg_lorocounter_new, __wbg_lorolist_new, __wbg_loromap_new, __wbg_loromovablelist_new, __wbg_lorotext_new, __wbg_lorotree_new, __wbg_lorotreenode_new, __wbg_mark_7438147ce31e9d4b, __wbg_measure_fb7825c11612c823, __wbg_msCrypto_0a36e2ec3a343d26, __wbg_new_518e2184725aa711, __wbg_new_59845962d1127937, __wbg_new_67abf4a77618ee3e, __wbg_new_8a6f238a6ece86ea, __wbg_new_e2d07398d7689006, __wbg_newnoargs_a136448eeb7d48ac, __wbg_newwithbyteoffsetandlength_84908302a4c137cf, __wbg_newwithlength_4c216eaaf23f2f9a, __wbg_newwithlength_88b49de1eb24d63e, __wbg_next_928df8c15fc0c9b0, __wbg_next_9dc0926f351c7090, __wbg_node_02999533c4ea02e3, __wbg_now_dc4980649ae44bd7, __wbg_ownKeys_b16312a839a4152c, __wbg_process_5c1d670bc53614b8, __wbg_push_e7d7247e69dad3ee, __wbg_randomFillSync_ab2cfe79ebbf2740, __wbg_require_79b1e9274cde3c87, __wbg_resolve_267ff08e7e1d2ce4, __wbg_self_cca3ca60d61220f4, __wbg_set_1b50d2de855a9d50, __wbg_set_393f510a6b7e9da5, __wbg_set_3f1d0b984ed272ed, __wbg_set_5deee49b10b2b780, __wbg_set_93ba9407b5476ec6, __wbg_set_wasm, __wbg_setindex_e0b7b31bfc87ba3f, __wbg_stack_0ed75d68575b0f3c, __wbg_subarray_2dc34705c0dc7cdb, __wbg_then_84907e7a6730461e, __wbg_value_51f8a88d4a1805fb, __wbg_versions_c71aa1626a93e0a1, __wbg_versionvector_new, __wbg_window_2aba046d3fc4ad7c, __wbindgen_as_number, __wbindgen_bigint_from_i64, __wbindgen_bigint_from_u64, __wbindgen_bigint_get_as_i64, __wbindgen_boolean_get, __wbindgen_cb_drop, __wbindgen_closure_wrapper483, __wbindgen_closure_wrapper486, __wbindgen_debug_string, __wbindgen_error_new, __wbindgen_in, __wbindgen_is_array, __wbindgen_is_bigint, __wbindgen_is_falsy, __wbindgen_is_function, __wbindgen_is_null, __wbindgen_is_object, __wbindgen_is_string, __wbindgen_is_undefined, __wbindgen_jsval_eq, __wbindgen_jsval_loose_eq, __wbindgen_memory, __wbindgen_number_get, __wbindgen_number_new, __wbindgen_object_clone_ref, __wbindgen_object_drop_ref, __wbindgen_rethrow, __wbindgen_string_get, __wbindgen_string_new, __wbindgen_throw, __wbindgen_typeof, decodeFrontiers, decodeImportBlobMeta, encodeFrontiers, getType, idStrToId, isContainer, isContainerId, newContainerID, newRootContainerID, redactJsonUpdates, run, setDebug };
@@ -24,6 +24,26 @@ export function setDebug(): void;
24
24
  * - changeNum
25
25
  */
26
26
  export function decodeImportBlobMeta(blob: Uint8Array, check_checksum: boolean): ImportBlobMetadata;
27
+ /**
28
+ * Redacts sensitive content in JSON updates within the specified version range.
29
+ *
30
+ * This function allows you to share document history while removing potentially sensitive content.
31
+ * It preserves the document structure and collaboration capabilities while replacing content with
32
+ * placeholders according to these redaction rules:
33
+ *
34
+ * - Preserves delete and move operations
35
+ * - Replaces text insertion content with the Unicode replacement character
36
+ * - Substitutes list and map insert values with null
37
+ * - Maintains structure of child containers
38
+ * - Replaces text mark values with null
39
+ * - Preserves map keys and text annotation keys
40
+ *
41
+ * @param {Object|string} jsonUpdates - The JSON updates to redact (object or JSON string)
42
+ * @param {Object} versionRange - Version range defining what content to redact,
43
+ * format: { peerId: [startCounter, endCounter], ... }
44
+ * @returns {Object} The redacted JSON updates
45
+ */
46
+ export function redactJsonUpdates(json_updates: string | JsonSchema, version_range: any): JsonSchema;
27
47
 
28
48
  /**
29
49
  * Container types supported by loro.
@@ -194,11 +214,11 @@ interface LoroDoc {
194
214
  * doc.commit();
195
215
  * expect(doc.getChangeAt({ peer: "0", counter: 0 }).message).toBe("test");
196
216
  * ```
197
- *
217
+ *
198
218
  * ### Advanced Example: Creating a Merkle DAG
199
- *
219
+ *
200
220
  * By combining `doc.subscribePreCommit` with `doc.exportJsonInIdSpan`, you can implement advanced features like representing Loro's editing history as a Merkle DAG:
201
- *
221
+ *
202
222
  * ```ts
203
223
  * const doc = new LoroDoc();
204
224
  * doc.setPeerId(0);
@@ -218,7 +238,7 @@ interface LoroDoc {
218
238
  * const sha256Hash = hash.digest('hex');
219
239
  * e.modifier.setMessage(sha256Hash);
220
240
  * });
221
- *
241
+ *
222
242
  * doc.getList("list").insert(0, 100);
223
243
  * doc.commit();
224
244
  * // Change 0
@@ -236,8 +256,8 @@ interface LoroDoc {
236
256
  * // }
237
257
  * // ]
238
258
  * // }
239
- *
240
- *
259
+ *
260
+ *
241
261
  * doc.getList("list").insert(0, 200);
242
262
  * doc.commit();
243
263
  * // Change 1
@@ -257,13 +277,13 @@ interface LoroDoc {
257
277
  * // }
258
278
  * // ]
259
279
  * // }
260
- *
280
+ *
261
281
  * expect(doc.getChangeAt({ peer: "0", counter: 0 }).message).toBe("2af99cf93869173984bcf6b1ce5412610b0413d027a5511a8f720a02a4432853");
262
282
  * expect(doc.getChangeAt({ peer: "0", counter: 1 }).message).toBe("aedbb442c554ecf59090e0e8339df1d8febf647f25cc37c67be0c6e27071d37f");
263
283
  * ```
264
- *
284
+ *
265
285
  * @param f - A callback function that receives a pre commit event.
266
- *
286
+ *
267
287
  **/
268
288
  subscribePreCommit(f: (e: { changeMeta: Change, origin: string, modifier: ChangeModifier }) => void): () => void
269
289
 
@@ -587,9 +607,6 @@ interface LoroMovableList {
587
607
  }
588
608
 
589
609
  export type Side = -1 | 0 | 1;
590
-
591
-
592
-
593
610
  export type JsonOpID = `${number}@${PeerID}`;
594
611
  export type JsonContainerID = `🦜:${ContainerID}` ;
595
612
  export type JsonValue =
@@ -888,6 +905,24 @@ interface UndoManager {
888
905
  * @param listener - The callback function.
889
906
  */
890
907
  setOnPop(listener?: UndoConfig["onPop"]): void;
908
+
909
+ /**
910
+ * Starts a new grouping of undo operations.
911
+ * All changes/commits made after this call will be grouped/merged together.
912
+ * to end the group, call `groupEnd`.
913
+ *
914
+ * If a remote import is received within the group, its possible that the undo item will be
915
+ * split and the group will be automatically ended.
916
+ *
917
+ * Calling `groupStart` within an active group will throw but have no effect.
918
+ *
919
+ */
920
+ groupStart(): void;
921
+
922
+ /**
923
+ * Ends the current grouping of undo operations.
924
+ */
925
+ groupEnd(): void;
891
926
  }
892
927
  interface LoroDoc<T extends Record<string, Container> = Record<string, Container>> {
893
928
  /**
@@ -931,7 +966,7 @@ interface LoroDoc<T extends Record<string, Container> = Record<string, Container
931
966
  * import { LoroDoc } from "loro-crdt";
932
967
  *
933
968
  * const doc = new LoroDoc();
934
- * const list = doc.getList("list");
969
+ * const list = doc.getMovableList("list");
935
970
  * ```
936
971
  */
937
972
  getMovableList<Key extends keyof T | ContainerID>(name: Key): T[Key] extends LoroMovableList ? T[Key] : LoroMovableList;
@@ -967,9 +1002,9 @@ interface LoroDoc<T extends Record<string, Container> = Record<string, Container
967
1002
  * It ensures deterministic output, making it ideal for hash calculations and integrity checks.
968
1003
  *
969
1004
  * This method can also export pending changes from the uncommitted transaction that have not yet been applied to the OpLog.
970
- *
1005
+ *
971
1006
  * This method will NOT trigger a new commit implicitly.
972
- *
1007
+ *
973
1008
  * @param idSpan - The id span to export.
974
1009
  * @returns The changes in the given id span.
975
1010
  */