@pluv/crdt-loro 4.0.1 → 4.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.
@@ -1,17 +1,26 @@
1
-
2
- > @pluv/crdt-loro@4.0.1 build /home/runner/work/pluv/pluv/packages/crdt-loro
3
- > tsdown
4
-
5
- ℹ tsdown v0.20.0-beta.4 powered by rolldown v1.0.0-beta.60
6
- ℹ config file: /home/runner/work/pluv/pluv/packages/crdt-loro/tsdown.config.ts
1
+ $ tsdown --config tsdown.browser.config.ts && tsdown --config tsdown.node.config.ts
2
+ ℹ tsdown v0.22.2 powered by rolldown v1.1.0
3
+ ℹ config file: /home/runner/work/pluv/pluv/packages/crdt-loro/tsdown.browser.config.ts
7
4
  ℹ entry: src/index.ts
8
5
  ℹ target: esnext
9
6
  ℹ tsconfig: tsconfig.json
10
7
  ℹ Build start
11
- ℹ dist/index.mjs  8.16 kB │ gzip: 2.22 kB
12
- ℹ dist/index.mjs.map 20.88 kB │ gzip: 4.89 kB
13
- ℹ dist/index.d.mts.map  2.55 kB │ gzip: 0.88 kB
14
- ℹ dist/chunk-15K8U1wQ.mjs  0.36 kB │ gzip: 0.25 kB
15
- ℹ dist/index.d.mts  4.38 kB │ gzip: 1.27 kB
16
- ℹ 5 files, total: 36.34 kB
17
- ✔ Build complete in 2956ms
8
+ ℹ dist/browser.mjs  8.98 kB │ gzip: 2.26 kB
9
+ ℹ dist/browser.mjs.map 21.63 kB │ gzip: 4.93 kB
10
+ ℹ dist/browser.d.mts.map  2.70 kB │ gzip: 0.91 kB
11
+ ℹ dist/chunk-BBjsoOtd.mjs  1.11 kB │ gzip: 0.54 kB
12
+ ℹ dist/browser.d.mts  4.88 kB │ gzip: 1.30 kB
13
+ ℹ 5 files, total: 39.30 kB
14
+ [PLUGIN_TIMINGS] Your build spent significant time in plugin `rolldown-plugin-dts:generate`. See https://rolldown.rs/options/checks#plugintimings for more details.
15
+
16
+ ✔ Build complete in 3316ms
17
+ ℹ tsdown v0.22.2 powered by rolldown v1.1.0
18
+ ℹ config file: /home/runner/work/pluv/pluv/packages/crdt-loro/tsdown.node.config.ts
19
+ ℹ entry: src/index.ts
20
+ ℹ target: esnext
21
+ ℹ tsconfig: tsconfig.node.build.json
22
+ ℹ Build start
23
+ ℹ dist/node.mjs  9.91 kB │ gzip: 2.65 kB
24
+ ℹ dist/node.mjs.map 21.66 kB │ gzip: 4.93 kB
25
+ ℹ 2 files, total: 31.56 kB
26
+ ✔ Build complete in 86ms
package/CHANGELOG.md CHANGED
@@ -1,5 +1,15 @@
1
1
  # @pluv/crdt-loro
2
2
 
3
+ ## 4.0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - ba5b80e: Fix Node resolution to use loro-crdt/nodejs instead of the bundler WASM entry.
8
+ - e1913b3: Upgraded internal dependencies
9
+ - Updated dependencies [e1913b3]
10
+ - @pluv/types@4.0.2
11
+ - @pluv/crdt@4.0.2
12
+
3
13
  ## 4.0.1
4
14
 
5
15
  ### Patch Changes
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  > This package is currently in preview and may have breaking changes between versions.
4
4
 
5
- > Yjs adapter for [@pluv/client](https://www.npmjs.com/package/@pluv/client) and [@pluv/io](https://www.npmjs.com/package/@pluv/io).
5
+ > Loro adapter for [@pluv/client](https://www.npmjs.com/package/@pluv/client) and [@pluv/io](https://www.npmjs.com/package/@pluv/io).
6
6
 
7
7
  **👉 See full documentation on [pluv.io](https://pluv.io/docs/introduction). 👈**
8
8
 
@@ -18,3 +18,26 @@ yarn add @pluv/crdt-loro loro-crdt
18
18
  # pnpm
19
19
  pnpm add @pluv/crdt-loro loro-crdt
20
20
  ```
21
+
22
+ ## Browser setup
23
+
24
+ When using Loro in the browser (e.g. with Next.js or Vite), configure your bundler to handle WASM. See the [Loro getting started guide](https://loro.dev/docs/tutorial/get_started).
25
+
26
+ For Next.js with webpack, enable `asyncWebAssembly` in `next.config.js`:
27
+
28
+ ```js
29
+ webpack: (config) => {
30
+ config.experiments = { asyncWebAssembly: true };
31
+ return config;
32
+ },
33
+ ```
34
+
35
+ ## Node.js
36
+
37
+ When running on Node.js (e.g. with `@pluv/platform-node`), import `@pluv/crdt-loro` normally. The package resolves to a Node build automatically via conditional exports.
38
+
39
+ If your toolchain does not pick the Node build, import explicitly:
40
+
41
+ ```ts
42
+ import { loro } from "@pluv/crdt-loro/node";
43
+ ```
@@ -1,10 +1,12 @@
1
- import * as loro_crdt0 from "loro-crdt";
2
- import { LoroCounter, LoroDoc, LoroList, LoroMap, LoroMovableList, LoroText, LoroTree } from "loro-crdt";
3
1
  import { AbstractCrdtDocFactory, CrdtType, DocApplyEncodedStateParams, DocBatchApplyEncodedStateParams, DocSubscribeCallbackParams, InferCrdtJson } from "@pluv/crdt";
4
2
  import { CrdtDocLike } from "@pluv/types";
5
3
 
4
+ //#region src/loro-runtime.browser.d.ts
5
+
6
+ import * as import_loro_crdt from "loro-crdt";
7
+ //#endregion
6
8
  //#region src/counter.d.ts
7
- declare const counter: () => LoroCounter;
9
+ declare const counter: () => loro_runtime_browser_d_exports.LoroCounter;
8
10
  //#endregion
9
11
  //#region src/types.d.ts
10
12
  type LoroType<TValue extends unknown, TJson extends unknown = any> = TValue & CrdtType<TValue, TJson> & {
@@ -14,20 +16,20 @@ type LoroType<TValue extends unknown, TJson extends unknown = any> = TValue & Cr
14
16
  //#endregion
15
17
  //#region src/doc/builder.d.ts
16
18
  type LoroBuilder = ReturnType<typeof builder>;
17
- declare const builder: (doc: LoroDoc) => {
18
- counter(name: string): LoroCounter;
19
- list<T extends unknown>(name: string, value?: T[] | readonly T[]): LoroType<LoroList<T>, T[]>;
20
- map<T extends Record<string, unknown>>(name: string, value?: T): LoroType<LoroMap<T>, T>;
21
- moveableList<T extends unknown>(name: string, value?: T[] | readonly T[]): LoroType<LoroMovableList<T>, T[]>;
22
- text(name: string, value?: string): LoroType<LoroText, string>;
23
- tree(name: string): loro_crdt0.LoroTree<Record<string, unknown>>;
19
+ declare const builder: (doc: loro_runtime_browser_d_exports.LoroDoc) => {
20
+ counter(name: string): loro_runtime_browser_d_exports.LoroCounter;
21
+ list<T extends unknown>(name: string, value?: T[] | readonly T[]): LoroType<loro_runtime_browser_d_exports.LoroList<T>, T[]>;
22
+ map<T extends Record<string, unknown>>(name: string, value?: T): LoroType<loro_runtime_browser_d_exports.LoroMap<T>, T>;
23
+ moveableList<T extends unknown>(name: string, value?: T[] | readonly T[]): LoroType<loro_runtime_browser_d_exports.LoroMovableList<T>, T[]>;
24
+ text(name: string, value?: string): LoroType<loro_runtime_browser_d_exports.LoroText, string>;
25
+ tree(name: string): import("loro-crdt").LoroTree<Record<string, unknown>>;
24
26
  };
25
27
  //#endregion
26
28
  //#region src/doc/CrdtLoroDoc.d.ts
27
29
  type CrdtLoroDocParams<TStorage extends Record<string, LoroType<any, any>>> = (builder: LoroBuilder) => TStorage;
28
- declare class CrdtLoroDoc<TStorage extends Record<string, LoroType<any, any>>> implements CrdtDocLike<LoroDoc, TStorage> {
30
+ declare class CrdtLoroDoc<TStorage extends Record<string, LoroType<any, any>>> implements CrdtDocLike<loro_runtime_browser_d_exports.LoroDoc, TStorage> {
29
31
  #private;
30
- value: LoroDoc;
32
+ value: loro_runtime_browser_d_exports.LoroDoc;
31
33
  constructor(params?: CrdtLoroDocParams<TStorage>);
32
34
  applyEncodedState(params: DocApplyEncodedStateParams): this;
33
35
  batchApplyEncodedState(params: DocBatchApplyEncodedStateParams): this;
@@ -42,7 +44,7 @@ declare class CrdtLoroDoc<TStorage extends Record<string, LoroType<any, any>>> i
42
44
  isEmpty(): boolean;
43
45
  rebuildStorage(reference: TStorage): this;
44
46
  redo(): this;
45
- subscribe(listener: (params: DocSubscribeCallbackParams<LoroDoc, TStorage>) => void): () => void;
47
+ subscribe(listener: (params: DocSubscribeCallbackParams<loro_runtime_browser_d_exports.LoroDoc, TStorage>) => void): () => void;
46
48
  track(): this;
47
49
  /**
48
50
  * @description Unlike Yjs, this method is required to be called after each loro operation.
@@ -53,7 +55,7 @@ declare class CrdtLoroDoc<TStorage extends Record<string, LoroType<any, any>>> i
53
55
  }
54
56
  //#endregion
55
57
  //#region src/doc/CrdtLoroDocFactory.d.ts
56
- declare class CrdtLoroDocFactory<TStorage extends Record<string, LoroType<any, any>>> extends AbstractCrdtDocFactory<LoroDoc, TStorage> {
58
+ declare class CrdtLoroDocFactory<TStorage extends Record<string, LoroType<any, any>>> extends AbstractCrdtDocFactory<loro_runtime_browser_d_exports.LoroDoc, TStorage> {
57
59
  readonly _initialStorage: (builder: LoroBuilder) => TStorage;
58
60
  constructor(initialStorage?: (builder: LoroBuilder) => TStorage);
59
61
  getEmpty(): CrdtLoroDoc<TStorage>;
@@ -65,22 +67,22 @@ declare class CrdtLoroDocFactory<TStorage extends Record<string, LoroType<any, a
65
67
  declare const doc: <TStorage extends Record<string, LoroType<any, any>>>(value?: (builder: LoroBuilder) => TStorage) => CrdtLoroDocFactory<TStorage>;
66
68
  //#endregion
67
69
  //#region src/list.d.ts
68
- declare const list: <T extends unknown>(value?: T[] | readonly T[]) => LoroType<LoroList<T>, T[]>;
70
+ declare const list: <T extends unknown>(value?: T[] | readonly T[]) => LoroType<loro_runtime_browser_d_exports.LoroList<T>, T[]>;
69
71
  //#endregion
70
72
  //#region src/map.d.ts
71
- declare const map: <T extends unknown>(value?: readonly (readonly [key: string, value: T])[]) => LoroType<LoroMap<Record<string, T>>, Record<string, T>>;
73
+ declare const map: <T extends unknown>(value?: readonly (readonly [key: string, value: T])[]) => LoroType<loro_runtime_browser_d_exports.LoroMap<Record<string, T>>, Record<string, T>>;
72
74
  //#endregion
73
75
  //#region src/movableList.d.ts
74
- declare const movableList: <T extends unknown>(value?: T[] | readonly T[]) => LoroType<LoroMovableList<T>, T[]>;
76
+ declare const movableList: <T extends unknown>(value?: T[] | readonly T[]) => LoroType<loro_runtime_browser_d_exports.LoroMovableList<T>, T[]>;
75
77
  //#endregion
76
78
  //#region src/object.d.ts
77
- declare const object: <T extends Record<string, any>>(value: T) => LoroType<LoroMap<T>, T>;
79
+ declare const object: <T extends Record<string, any>>(value: T) => LoroType<loro_runtime_browser_d_exports.LoroMap<T>, T>;
78
80
  //#endregion
79
81
  //#region src/text.d.ts
80
- declare const text: (value?: string) => LoroType<LoroText, string>;
82
+ declare const text: (value?: string) => LoroType<loro_runtime_browser_d_exports.LoroText, string>;
81
83
  //#endregion
82
84
  //#region src/tree.d.ts
83
- declare const tree: <T extends Record<string, unknown>>() => LoroTree<T>;
85
+ declare const tree: <T extends Record<string, unknown>>() => loro_runtime_browser_d_exports.LoroTree<T>;
84
86
  declare namespace loro_d_exports {
85
87
  export { CrdtLoroDoc, LoroBuilder, LoroType, counter, doc, kind, list, map, movableList, object, text, tree };
86
88
  }
@@ -90,4 +92,4 @@ declare const kind: "loro";
90
92
  type LoroLibraryType = typeof loro_d_exports;
91
93
  //#endregion
92
94
  export { LoroLibraryType, loro_d_exports as loro };
93
- //# sourceMappingURL=index.d.mts.map
95
+ //# sourceMappingURL=browser.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.d.mts","names":[],"sources":["../src/loro-runtime.browser.ts","../src/counter.ts","../src/types.ts","../src/doc/builder.ts","../src/doc/CrdtLoroDoc.ts","../src/doc/CrdtLoroDocFactory.ts","../src/doc/doc.ts","../src/list.ts","../src/map.ts","../src/movableList.ts","../src/object.ts","../src/text.ts","../src/tree.ts","../src/loro.ts","../src/index.ts"],"mappings":"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"}
@@ -1,62 +1,63 @@
1
- import { t as __exportAll } from "./chunk-15K8U1wQ.mjs";
2
- import { LoroCounter, LoroDoc, LoroList, LoroMap, LoroMovableList, LoroText, LoroTree, UndoManager, isContainer } from "loro-crdt";
1
+ import { n as __reExport, t as __exportAll } from "./chunk-BBjsoOtd.mjs";
3
2
  import { fromUint8Array, toUint8Array } from "js-base64";
4
3
  import { AbstractCrdtDocFactory } from "@pluv/crdt";
5
-
4
+ //#region src/loro-runtime.browser.ts
5
+ var loro_runtime_browser_exports = /* @__PURE__ */ __exportAll({});
6
+ import * as import_loro_crdt from "loro-crdt";
7
+ __reExport(loro_runtime_browser_exports, import_loro_crdt);
8
+ //#endregion
6
9
  //#region src/counter.ts
7
10
  const counter = () => {
8
- return new LoroCounter();
11
+ return new loro_runtime_browser_exports.LoroCounter();
9
12
  };
10
-
11
13
  //#endregion
12
14
  //#region src/doc/builder.ts
13
- const builder = (doc$1) => {
15
+ const builder = (doc) => {
14
16
  return {
15
17
  counter(name) {
16
- return doc$1.getCounter(name);
18
+ return doc.getCounter(name);
17
19
  },
18
20
  list(name, value = []) {
19
- const list$1 = doc$1.getList(name);
21
+ const list = doc.getList(name);
20
22
  value.forEach((item, i) => {
21
- if (isContainer(item)) list$1.insertContainer(i, item);
22
- else list$1.insert(i, item);
23
+ if ((0, loro_runtime_browser_exports.isContainer)(item)) list.insertContainer(i, item);
24
+ else list.insert(i, item);
23
25
  });
24
- return list$1;
26
+ return list;
25
27
  },
26
28
  map(name, value = {}) {
27
- const container = doc$1.getMap(name);
29
+ const container = doc.getMap(name);
28
30
  Object.entries(value).forEach(([key, item]) => {
29
- if (isContainer(item)) container.setContainer(key, item);
31
+ if ((0, loro_runtime_browser_exports.isContainer)(item)) container.setContainer(key, item);
30
32
  else container.set(key, item);
31
33
  });
32
34
  return container;
33
35
  },
34
36
  moveableList(name, value = []) {
35
- const list$1 = doc$1.getMovableList(name);
37
+ const list = doc.getMovableList(name);
36
38
  value.forEach((item, i) => {
37
- if (isContainer(item)) list$1.insertContainer(i, item);
38
- else list$1.insert(i, item);
39
+ if ((0, loro_runtime_browser_exports.isContainer)(item)) list.insertContainer(i, item);
40
+ else list.insert(i, item);
39
41
  });
40
- return list$1;
42
+ return list;
41
43
  },
42
44
  text(name, value = "") {
43
- const text$1 = doc$1.getText(name);
44
- text$1.insert(0, value);
45
- return text$1;
45
+ const text = doc.getText(name);
46
+ text.insert(0, value);
47
+ return text;
46
48
  },
47
49
  tree(name) {
48
- return doc$1.getTree(name);
50
+ return doc.getTree(name);
49
51
  }
50
52
  };
51
53
  };
52
-
53
54
  //#endregion
54
55
  //#region src/doc/CrdtLoroDoc.ts
55
56
  const MAX_UNDO_STEPS = 100;
56
57
  const MERGE_INTERVAL_MS = 1e3;
57
58
  const PLUV_ID_FIELD = "__$pluv";
58
59
  var CrdtLoroDoc = class {
59
- value = new LoroDoc();
60
+ value = new loro_runtime_browser_exports.LoroDoc();
60
61
  #_storage;
61
62
  #_undoManager = null;
62
63
  constructor(params = () => ({})) {
@@ -116,11 +117,11 @@ var CrdtLoroDoc = class {
116
117
  toJson(type) {
117
118
  if (typeof type === "string") {
118
119
  const container = this.#_storage[type];
119
- return container instanceof LoroText ? container.toString() : container instanceof LoroCounter ? container.value : container.toJSON();
120
+ return container instanceof loro_runtime_browser_exports.LoroText ? container.toString() : container instanceof loro_runtime_browser_exports.LoroCounter ? container.value : container.toJSON();
120
121
  }
121
122
  return Object.entries(this.#_storage).reduce((acc, [key, value]) => ({
122
123
  ...acc,
123
- [key]: value instanceof LoroText ? value.toString() : value.toJSON()
124
+ [key]: value instanceof loro_runtime_browser_exports.LoroText ? value.toString() : value.toJSON()
124
125
  }), {});
125
126
  }
126
127
  isEmpty() {
@@ -133,27 +134,27 @@ var CrdtLoroDoc = class {
133
134
  return this;
134
135
  }
135
136
  this.#_storage = Object.entries(reference).reduce((acc, [key, node]) => {
136
- if (node instanceof LoroCounter) return {
137
+ if (node instanceof loro_runtime_browser_exports.LoroCounter) return {
137
138
  ...acc,
138
139
  [key]: this.value.getCounter(key)
139
140
  };
140
- if (node instanceof LoroList) return {
141
+ if (node instanceof loro_runtime_browser_exports.LoroList) return {
141
142
  ...acc,
142
143
  [key]: this.value.getList(key)
143
144
  };
144
- if (node instanceof LoroMap) return {
145
+ if (node instanceof loro_runtime_browser_exports.LoroMap) return {
145
146
  ...acc,
146
147
  [key]: this.value.getMap(key)
147
148
  };
148
- if (node instanceof LoroMovableList) return {
149
+ if (node instanceof loro_runtime_browser_exports.LoroMovableList) return {
149
150
  ...acc,
150
151
  [key]: this.value.getMovableList(key)
151
152
  };
152
- if (node instanceof LoroText) return {
153
+ if (node instanceof loro_runtime_browser_exports.LoroText) return {
153
154
  ...acc,
154
155
  [key]: this.value.getText(key)
155
156
  };
156
- if (node instanceof LoroTree) return {
157
+ if (node instanceof loro_runtime_browser_exports.LoroTree) return {
157
158
  ...acc,
158
159
  [key]: this.value.getTree(key)
159
160
  };
@@ -189,7 +190,7 @@ var CrdtLoroDoc = class {
189
190
  this.#_undoManager.free();
190
191
  this.#_undoManager = null;
191
192
  }
192
- this.#_undoManager = new UndoManager(this.value, {
193
+ this.#_undoManager = new loro_runtime_browser_exports.UndoManager(this.value, {
193
194
  maxUndoSteps: MAX_UNDO_STEPS,
194
195
  mergeInterval: MERGE_INTERVAL_MS
195
196
  });
@@ -209,12 +210,11 @@ var CrdtLoroDoc = class {
209
210
  return this;
210
211
  }
211
212
  #_setPluvId() {
212
- const text$1 = this.value.getText(PLUV_ID_FIELD);
213
+ const text = this.value.getText(PLUV_ID_FIELD);
213
214
  const id = typeof crypto !== "undefined" ? crypto.randomUUID() : Math.random().toString();
214
- text$1.insert(0, id);
215
+ text.insert(0, id);
215
216
  }
216
217
  };
217
-
218
218
  //#endregion
219
219
  //#region src/doc/CrdtLoroDocFactory.ts
220
220
  var CrdtLoroDocFactory = class CrdtLoroDocFactory extends AbstractCrdtDocFactory {
@@ -233,71 +233,63 @@ var CrdtLoroDocFactory = class CrdtLoroDocFactory extends AbstractCrdtDocFactory
233
233
  return new CrdtLoroDoc(initialStorage ?? this._initialStorage);
234
234
  }
235
235
  };
236
-
237
236
  //#endregion
238
237
  //#region src/doc/doc.ts
239
238
  const doc = (value = () => ({})) => {
240
239
  return new CrdtLoroDocFactory(value);
241
240
  };
242
-
243
241
  //#endregion
244
242
  //#region src/list.ts
245
243
  const list = (value = []) => {
246
- const container = new LoroList();
244
+ const container = new loro_runtime_browser_exports.LoroList();
247
245
  value.forEach((item, i) => {
248
- if (isContainer(item)) container.insertContainer(i, item);
246
+ if ((0, loro_runtime_browser_exports.isContainer)(item)) container.insertContainer(i, item);
249
247
  else container.insert(i, item);
250
248
  });
251
249
  return container;
252
250
  };
253
-
254
251
  //#endregion
255
252
  //#region src/map.ts
256
253
  const map = (value = []) => {
257
- const container = new LoroMap();
254
+ const container = new loro_runtime_browser_exports.LoroMap();
258
255
  value.forEach(([key, item]) => {
259
- if (isContainer(item)) container.setContainer(key, item);
256
+ if ((0, loro_runtime_browser_exports.isContainer)(item)) container.setContainer(key, item);
260
257
  else container.set(key, item);
261
258
  });
262
259
  return container;
263
260
  };
264
-
265
261
  //#endregion
266
262
  //#region src/movableList.ts
267
263
  const movableList = (value = []) => {
268
- const container = new LoroMovableList();
264
+ const container = new loro_runtime_browser_exports.LoroMovableList();
269
265
  value.forEach((item, i) => {
270
- if (isContainer(item)) container.insertContainer(i, item);
266
+ if ((0, loro_runtime_browser_exports.isContainer)(item)) container.insertContainer(i, item);
271
267
  else container.insert(i, item);
272
268
  });
273
269
  return container;
274
270
  };
275
-
276
271
  //#endregion
277
272
  //#region src/object.ts
278
273
  const object = (value) => {
279
- const container = new LoroMap();
274
+ const container = new loro_runtime_browser_exports.LoroMap();
280
275
  Object.entries(value).forEach(([key, item]) => {
281
- if (isContainer(item)) container.setContainer(key, item);
276
+ if ((0, loro_runtime_browser_exports.isContainer)(item)) container.setContainer(key, item);
282
277
  else container.set(key, item);
283
278
  });
284
279
  return container;
285
280
  };
286
-
287
281
  //#endregion
288
282
  //#region src/text.ts
289
283
  const text = (value = "") => {
290
- const container = new LoroText();
284
+ const container = new loro_runtime_browser_exports.LoroText();
291
285
  container.insert(0, value);
292
286
  return container;
293
287
  };
294
-
295
288
  //#endregion
296
289
  //#region src/tree.ts
297
290
  const tree = () => {
298
- return new LoroTree();
291
+ return new loro_runtime_browser_exports.LoroTree();
299
292
  };
300
-
301
293
  //#endregion
302
294
  //#region src/loro.ts
303
295
  var loro_exports = /* @__PURE__ */ __exportAll({
@@ -313,7 +305,7 @@ var loro_exports = /* @__PURE__ */ __exportAll({
313
305
  tree: () => tree
314
306
  });
315
307
  const kind = "loro";
316
-
317
308
  //#endregion
318
309
  export { loro_exports as loro };
319
- //# sourceMappingURL=index.mjs.map
310
+
311
+ //# sourceMappingURL=browser.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"browser.mjs","names":["LoroCounter","LoroDoc","#_storage","#_setPluvId","#_undoManager","LoroText","LoroCounter","LoroList","LoroMap","LoroMovableList","LoroTree","container","UndoManager","LoroList","LoroMap","LoroMovableList","LoroMap","LoroText","LoroTree"],"sources":["../src/loro-runtime.browser.ts","../src/counter.ts","../src/doc/builder.ts","../src/doc/CrdtLoroDoc.ts","../src/doc/CrdtLoroDocFactory.ts","../src/doc/doc.ts","../src/list.ts","../src/map.ts","../src/movableList.ts","../src/object.ts","../src/text.ts","../src/tree.ts","../src/loro.ts"],"sourcesContent":["export * from \"loro-crdt\";\n","import { LoroCounter } from \"@loro-runtime\";\nimport { LoroType } from \"./types\";\n\nexport const counter = (): LoroCounter => {\n const counter = new LoroCounter();\n\n return counter as unknown as LoroType<LoroCounter, number>;\n};\n","import type {\n Container,\n LoroCounter,\n LoroDoc,\n LoroList,\n LoroMap,\n LoroMovableList,\n LoroText,\n} from \"@loro-runtime\";\nimport { isContainer } from \"@loro-runtime\";\nimport type { LoroType } from \"../types\";\n\nexport type LoroBuilder = ReturnType<typeof builder>;\n\nexport const builder = (doc: LoroDoc) => {\n return {\n counter(name: string): LoroCounter {\n return doc.getCounter(name);\n },\n list<T extends unknown>(\n name: string,\n value: T[] | readonly T[] = [],\n ): LoroType<LoroList<T>, T[]> {\n const list = doc.getList(name);\n\n value.forEach((item, i) => {\n if (isContainer(item)) list.insertContainer(i, item);\n else list.insert(i, item as Exclude<T, Container>);\n });\n\n return list as unknown as LoroType<LoroList<T>, T[]>;\n },\n map<T extends Record<string, unknown>>(\n name: string,\n value: T = {} as T,\n ): LoroType<LoroMap<T>, T> {\n const container = doc.getMap(name);\n\n Object.entries(value).forEach(([key, item]) => {\n if (isContainer(item)) container.setContainer(key, item);\n else container.set(key, item as Exclude<T, Container>);\n });\n\n return container as unknown as LoroType<LoroMap<T>, T>;\n },\n moveableList<T extends unknown>(\n name: string,\n value: T[] | readonly T[] = [],\n ): LoroType<LoroMovableList<T>, T[]> {\n const list = doc.getMovableList(name);\n\n value.forEach((item, i) => {\n if (isContainer(item)) list.insertContainer(i, item);\n else list.insert(i, item as Exclude<T, Container>);\n });\n\n return list as unknown as LoroType<LoroMovableList<T>, T[]>;\n },\n text(name: string, value: string = \"\"): LoroType<LoroText, string> {\n const text = doc.getText(name);\n\n text.insert(0, value);\n\n return text as unknown as LoroType<LoroText, string>;\n },\n tree(name: string) {\n return doc.getTree(name);\n },\n };\n};\n","import type {\n DocApplyEncodedStateParams,\n DocBatchApplyEncodedStateParams,\n DocSubscribeCallbackParams,\n InferCrdtJson,\n} from \"@pluv/crdt\";\nimport type { CrdtDocLike } from \"@pluv/types\";\nimport { fromUint8Array, toUint8Array } from \"js-base64\";\nimport type { Container } from \"@loro-runtime\";\nimport {\n LoroCounter,\n LoroDoc,\n LoroEventBatch,\n LoroList,\n LoroMap,\n LoroMovableList,\n LoroText,\n LoroTree,\n UndoManager,\n} from \"@loro-runtime\";\nimport type { LoroType } from \"../types\";\nimport type { LoroBuilder } from \"./builder\";\nimport { builder } from \"./builder\";\n\nconst MAX_UNDO_STEPS = 100;\nconst MERGE_INTERVAL_MS = 1_000;\nconst PLUV_ID_FIELD = \"__$pluv\";\n\nexport type CrdtLoroDocParams<TStorage extends Record<string, LoroType<any, any>>> = (\n builder: LoroBuilder,\n) => TStorage;\n\nexport class CrdtLoroDoc<\n TStorage extends Record<string, LoroType<any, any>>,\n> implements CrdtDocLike<LoroDoc, TStorage> {\n public value: LoroDoc = new LoroDoc();\n\n #_storage: TStorage;\n #_undoManager: UndoManager | null = null;\n\n constructor(params: CrdtLoroDocParams<TStorage> = () => ({}) as TStorage) {\n const storage = params(builder(this.value));\n\n const keys = Object.keys(this.value.toJSON()).reduce(\n (set, key) => set.add(key),\n new Set<string>(),\n );\n\n this.#_storage = Object.entries(storage).reduce(\n (acc, [key, node]) => (keys.has(key) ? { ...acc, [key]: node } : acc),\n {} as TStorage,\n );\n if (!!Object.keys(storage).length) this.#_setPluvId();\n\n this.value.commit();\n }\n\n public applyEncodedState(params: DocApplyEncodedStateParams): this {\n const update =\n typeof params.update === \"string\" ? toUint8Array(params.update) : params.update;\n\n if (!update) return this;\n\n this.value.import(update);\n\n return this;\n }\n\n public batchApplyEncodedState(params: DocBatchApplyEncodedStateParams): this {\n const updates = params.updates ?? [];\n\n const filtered = updates.reduce<Uint8Array[]>((acc, update) => {\n if (!update) return acc;\n\n if (typeof update === \"string\") {\n acc.push(toUint8Array(update));\n return acc;\n }\n\n if (typeof update === \"object\") {\n acc.push(update);\n return acc;\n }\n\n return acc;\n }, []);\n\n if (!filtered.length) return this;\n\n if (filtered.length === 1) {\n const update = filtered[0] ?? null;\n\n if (!!update) this.value.import(update);\n\n return this;\n }\n\n this.value.importBatch(filtered);\n\n return this;\n }\n\n public canRedo(): boolean {\n if (!this.#_undoManager) return false;\n\n return this.#_undoManager.canRedo();\n }\n\n public canUndo(): boolean {\n if (!this.#_undoManager) return false;\n\n return this.#_undoManager.canUndo();\n }\n\n public destroy(): void {\n return;\n }\n\n public get(key?: undefined): TStorage;\n public get<TKey extends keyof TStorage>(key: TKey): TStorage[TKey];\n public get<TKey extends keyof TStorage>(key?: TKey): TStorage | TStorage[TKey] {\n if (typeof key === \"undefined\") return this.#_storage;\n\n return this.#_storage[key as TKey];\n }\n\n public getEncodedState(): string {\n return fromUint8Array(this.value.export({ mode: \"snapshot\" }));\n }\n\n public toJson(): InferCrdtJson<TStorage>;\n public toJson<TKey extends keyof TStorage>(type: TKey): InferCrdtJson<TStorage[TKey]>;\n public toJson<TKey extends keyof TStorage>(type?: TKey) {\n if (typeof type === \"string\") {\n const container = this.#_storage[type] as unknown as Container;\n\n return container instanceof LoroText\n ? container.toString()\n : container instanceof LoroCounter\n ? container.value\n : container.toJSON!();\n }\n\n return Object.entries(this.#_storage).reduce(\n (acc, [key, value]) => ({\n ...(acc as any),\n [key]: value instanceof LoroText ? value.toString() : value.toJSON!(),\n }),\n {} as InferCrdtJson<TStorage>,\n );\n }\n\n public isEmpty(): boolean {\n const serialized = this.value.toJSON();\n\n return !serialized || !Object.keys(serialized).length;\n }\n\n public rebuildStorage(reference: TStorage): this {\n const isBuilt = !!Object.keys(this.#_storage).length;\n\n if (isBuilt) {\n console.warn(\"Attempted to rebuild storage multiple times\");\n return this;\n }\n\n this.#_storage = Object.entries(reference).reduce((acc, [key, node]) => {\n if (node instanceof LoroCounter) return { ...acc, [key]: this.value.getCounter(key) };\n if (node instanceof LoroList) return { ...acc, [key]: this.value.getList(key) };\n if (node instanceof LoroMap) return { ...acc, [key]: this.value.getMap(key) };\n if (node instanceof LoroMovableList) {\n return { ...acc, [key]: this.value.getMovableList(key) };\n }\n if (node instanceof LoroText) return { ...acc, [key]: this.value.getText(key) };\n if (node instanceof LoroTree) return { ...acc, [key]: this.value.getTree(key) };\n\n return acc;\n }, {} as TStorage);\n\n return this.track();\n }\n\n public redo(): this {\n this.#_undoManager?.redo();\n\n return this;\n }\n\n public subscribe(\n listener: (params: DocSubscribeCallbackParams<LoroDoc, TStorage>) => void,\n ): () => void {\n const fn = (event: LoroEventBatch) => {\n const update = fromUint8Array(this.value.export({ mode: \"update\" }));\n\n listener({\n doc: this,\n local: event.by === \"local\",\n origin: event.origin ? String(event.origin) : null,\n update,\n });\n };\n\n const unsubcribeAll = Object.values(this.#_storage).reduce<() => void>(\n (acc, crdtType) => {\n const container = crdtType as unknown as Container;\n const unsubscribe = container.subscribe(fn);\n\n return () => {\n acc();\n unsubscribe();\n };\n },\n () => undefined,\n );\n\n return unsubcribeAll;\n }\n\n public track(): this {\n if (this.#_undoManager) {\n this.#_undoManager.clear();\n this.#_undoManager.free();\n\n this.#_undoManager = null;\n }\n\n this.#_undoManager = new UndoManager(this.value, {\n maxUndoSteps: MAX_UNDO_STEPS,\n mergeInterval: MERGE_INTERVAL_MS,\n });\n\n return this;\n }\n\n /**\n * @description Unlike Yjs, this method is required to be called after each loro operation.\n * @date January 12, 2025\n */\n public transact(fn: () => void): this {\n fn();\n\n this.value.commit();\n\n return this;\n }\n\n public undo(): this {\n this.#_undoManager?.undo();\n\n return this;\n }\n\n #_setPluvId() {\n const text = this.value.getText(PLUV_ID_FIELD);\n const id = typeof crypto !== \"undefined\" ? crypto.randomUUID() : Math.random().toString();\n\n text.insert(0, id);\n }\n}\n","import { AbstractCrdtDocFactory } from \"@pluv/crdt\";\nimport type { LoroDoc } from \"@loro-runtime\";\nimport type { LoroType } from \"../types\";\nimport { CrdtLoroDoc } from \"./CrdtLoroDoc\";\nimport type { LoroBuilder } from \"./builder\";\n\nexport class CrdtLoroDocFactory<\n TStorage extends Record<string, LoroType<any, any>>,\n> extends AbstractCrdtDocFactory<LoroDoc, TStorage> {\n public readonly _initialStorage: (builder: LoroBuilder) => TStorage;\n\n constructor(initialStorage: (builder: LoroBuilder) => TStorage = () => ({}) as TStorage) {\n super(initialStorage);\n\n this._initialStorage = initialStorage;\n }\n\n public getEmpty(): CrdtLoroDoc<TStorage> {\n return new CrdtLoroDoc<TStorage>();\n }\n\n public getFactory(\n initialStorage?: ((builder: LoroBuilder) => TStorage) | undefined,\n ): CrdtLoroDocFactory<TStorage> {\n return new CrdtLoroDocFactory<TStorage>(initialStorage ?? this._initialStorage);\n }\n\n public getInitialized(\n initialStorage?: (builder: LoroBuilder) => TStorage,\n ): CrdtLoroDoc<TStorage> {\n return new CrdtLoroDoc<TStorage>(initialStorage ?? this._initialStorage);\n }\n}\n","import type { LoroType } from \"../types\";\nimport type { LoroBuilder } from \"./builder\";\nimport { CrdtLoroDocFactory } from \"./CrdtLoroDocFactory\";\n\nexport const doc = <TStorage extends Record<string, LoroType<any, any>>>(\n value: (builder: LoroBuilder) => TStorage = () => ({}) as TStorage,\n): CrdtLoroDocFactory<TStorage> => {\n return new CrdtLoroDocFactory<TStorage>(value);\n};\n","import type { Container } from \"@loro-runtime\";\nimport { LoroList, isContainer } from \"@loro-runtime\";\nimport type { LoroType } from \"./types\";\n\nexport const list = <T extends unknown>(\n value: T[] | readonly T[] = [],\n): LoroType<LoroList<T>, T[]> => {\n const container = new LoroList();\n\n value.forEach((item, i) => {\n if (isContainer(item)) container.insertContainer(i, item);\n else container.insert(i, item as Exclude<T, Container>);\n });\n\n return container as unknown as LoroType<LoroList<T>, T[]>;\n};\n","import type { Container } from \"@loro-runtime\";\nimport { LoroMap, isContainer } from \"@loro-runtime\";\nimport type { LoroType } from \"./types\";\n\nexport const map = <T extends unknown>(\n value: readonly (readonly [key: string, value: T])[] = [],\n): LoroType<LoroMap<Record<string, T>>, Record<string, T>> => {\n const container = new LoroMap();\n\n value.forEach(([key, item]) => {\n if (isContainer(item)) container.setContainer(key, item);\n else container.set(key, item as Exclude<T, Container>);\n });\n\n return container as unknown as LoroType<LoroMap<Record<string, T>>, Record<string, T>>;\n};\n","import type { Container } from \"@loro-runtime\";\nimport { isContainer, LoroMovableList } from \"@loro-runtime\";\nimport type { LoroType } from \"./types\";\n\nexport const movableList = <T extends unknown>(value: T[] | readonly T[] = []) => {\n const container = new LoroMovableList();\n\n value.forEach((item, i) => {\n if (isContainer(item)) container.insertContainer(i, item);\n else container.insert(i, item as Exclude<T, Container>);\n });\n\n return container as unknown as LoroType<LoroMovableList<T>, T[]>;\n};\n","import type { Container } from \"@loro-runtime\";\nimport { LoroMap, isContainer } from \"@loro-runtime\";\nimport type { LoroType } from \"./types\";\n\nexport const object = <T extends Record<string, any>>(value: T): LoroType<LoroMap<T>, T> => {\n const container = new LoroMap();\n\n Object.entries(value).forEach(([key, item]) => {\n if (isContainer(item)) container.setContainer(key, item);\n else container.set(key, item as Exclude<T, Container>);\n });\n\n return container as unknown as LoroType<LoroMap<T>, T>;\n};\n","import { LoroText } from \"@loro-runtime\";\nimport type { LoroType } from \"./types\";\n\nexport const text = (value: string = \"\"): LoroType<LoroText, string> => {\n const container = new LoroText();\n\n container.insert(0, value);\n\n return container as unknown as LoroType<LoroText, string>;\n};\n","import { LoroTree } from \"@loro-runtime\";\n\nexport const tree = <T extends Record<string, unknown>>() => {\n const container = new LoroTree<T>();\n\n return container;\n};\n","export { counter } from \"./counter\";\nexport { CrdtLoroDoc, doc } from \"./doc\";\nexport type { LoroBuilder } from \"./doc\";\nexport { list } from \"./list\";\nexport { map } from \"./map\";\nexport { movableList } from \"./movableList\";\nexport { object } from \"./object\";\nexport { text } from \"./text\";\nexport { tree } from \"./tree\";\nexport type { LoroType } from \"./types\";\nexport const kind = \"loro\" as const;\n"],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ //#region \0rolldown/runtime.js
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __exportAll = (all, no_symbols) => {
7
+ let target = {};
8
+ for (var name in all) __defProp(target, name, {
9
+ get: all[name],
10
+ enumerable: true
11
+ });
12
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
13
+ return target;
14
+ };
15
+ var __copyProps = (to, from, except, desc) => {
16
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
17
+ key = keys[i];
18
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
19
+ get: ((k) => from[k]).bind(null, key),
20
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
21
+ });
22
+ }
23
+ return to;
24
+ };
25
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
26
+ //#endregion
27
+ export { __reExport as n, __exportAll as t };
package/dist/node.mjs ADDED
@@ -0,0 +1,336 @@
1
+ import { fromUint8Array, toUint8Array } from "js-base64";
2
+ import { AbstractCrdtDocFactory } from "@pluv/crdt";
3
+ //#region \0rolldown/runtime.js
4
+ var __defProp = Object.defineProperty;
5
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __exportAll = (all, no_symbols) => {
9
+ let target = {};
10
+ for (var name in all) __defProp(target, name, {
11
+ get: all[name],
12
+ enumerable: true
13
+ });
14
+ if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
15
+ return target;
16
+ };
17
+ var __copyProps = (to, from, except, desc) => {
18
+ if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
19
+ key = keys[i];
20
+ if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
21
+ get: ((k) => from[k]).bind(null, key),
22
+ enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
23
+ });
24
+ }
25
+ return to;
26
+ };
27
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
28
+ //#endregion
29
+ //#region src/loro-runtime.node.ts
30
+ var loro_runtime_node_exports = /* @__PURE__ */ __exportAll({});
31
+ import * as import_loro_crdt_nodejs from "loro-crdt/nodejs";
32
+ __reExport(loro_runtime_node_exports, import_loro_crdt_nodejs);
33
+ //#endregion
34
+ //#region src/counter.ts
35
+ const counter = () => {
36
+ return new loro_runtime_node_exports.LoroCounter();
37
+ };
38
+ //#endregion
39
+ //#region src/doc/builder.ts
40
+ const builder = (doc) => {
41
+ return {
42
+ counter(name) {
43
+ return doc.getCounter(name);
44
+ },
45
+ list(name, value = []) {
46
+ const list = doc.getList(name);
47
+ value.forEach((item, i) => {
48
+ if ((0, loro_runtime_node_exports.isContainer)(item)) list.insertContainer(i, item);
49
+ else list.insert(i, item);
50
+ });
51
+ return list;
52
+ },
53
+ map(name, value = {}) {
54
+ const container = doc.getMap(name);
55
+ Object.entries(value).forEach(([key, item]) => {
56
+ if ((0, loro_runtime_node_exports.isContainer)(item)) container.setContainer(key, item);
57
+ else container.set(key, item);
58
+ });
59
+ return container;
60
+ },
61
+ moveableList(name, value = []) {
62
+ const list = doc.getMovableList(name);
63
+ value.forEach((item, i) => {
64
+ if ((0, loro_runtime_node_exports.isContainer)(item)) list.insertContainer(i, item);
65
+ else list.insert(i, item);
66
+ });
67
+ return list;
68
+ },
69
+ text(name, value = "") {
70
+ const text = doc.getText(name);
71
+ text.insert(0, value);
72
+ return text;
73
+ },
74
+ tree(name) {
75
+ return doc.getTree(name);
76
+ }
77
+ };
78
+ };
79
+ //#endregion
80
+ //#region src/doc/CrdtLoroDoc.ts
81
+ const MAX_UNDO_STEPS = 100;
82
+ const MERGE_INTERVAL_MS = 1e3;
83
+ const PLUV_ID_FIELD = "__$pluv";
84
+ var CrdtLoroDoc = class {
85
+ value = new loro_runtime_node_exports.LoroDoc();
86
+ #_storage;
87
+ #_undoManager = null;
88
+ constructor(params = () => ({})) {
89
+ const storage = params(builder(this.value));
90
+ const keys = Object.keys(this.value.toJSON()).reduce((set, key) => set.add(key), /* @__PURE__ */ new Set());
91
+ this.#_storage = Object.entries(storage).reduce((acc, [key, node]) => keys.has(key) ? {
92
+ ...acc,
93
+ [key]: node
94
+ } : acc, {});
95
+ if (!!Object.keys(storage).length) this.#_setPluvId();
96
+ this.value.commit();
97
+ }
98
+ applyEncodedState(params) {
99
+ const update = typeof params.update === "string" ? toUint8Array(params.update) : params.update;
100
+ if (!update) return this;
101
+ this.value.import(update);
102
+ return this;
103
+ }
104
+ batchApplyEncodedState(params) {
105
+ const filtered = (params.updates ?? []).reduce((acc, update) => {
106
+ if (!update) return acc;
107
+ if (typeof update === "string") {
108
+ acc.push(toUint8Array(update));
109
+ return acc;
110
+ }
111
+ if (typeof update === "object") {
112
+ acc.push(update);
113
+ return acc;
114
+ }
115
+ return acc;
116
+ }, []);
117
+ if (!filtered.length) return this;
118
+ if (filtered.length === 1) {
119
+ const update = filtered[0] ?? null;
120
+ if (!!update) this.value.import(update);
121
+ return this;
122
+ }
123
+ this.value.importBatch(filtered);
124
+ return this;
125
+ }
126
+ canRedo() {
127
+ if (!this.#_undoManager) return false;
128
+ return this.#_undoManager.canRedo();
129
+ }
130
+ canUndo() {
131
+ if (!this.#_undoManager) return false;
132
+ return this.#_undoManager.canUndo();
133
+ }
134
+ destroy() {}
135
+ get(key) {
136
+ if (typeof key === "undefined") return this.#_storage;
137
+ return this.#_storage[key];
138
+ }
139
+ getEncodedState() {
140
+ return fromUint8Array(this.value.export({ mode: "snapshot" }));
141
+ }
142
+ toJson(type) {
143
+ if (typeof type === "string") {
144
+ const container = this.#_storage[type];
145
+ return container instanceof loro_runtime_node_exports.LoroText ? container.toString() : container instanceof loro_runtime_node_exports.LoroCounter ? container.value : container.toJSON();
146
+ }
147
+ return Object.entries(this.#_storage).reduce((acc, [key, value]) => ({
148
+ ...acc,
149
+ [key]: value instanceof loro_runtime_node_exports.LoroText ? value.toString() : value.toJSON()
150
+ }), {});
151
+ }
152
+ isEmpty() {
153
+ const serialized = this.value.toJSON();
154
+ return !serialized || !Object.keys(serialized).length;
155
+ }
156
+ rebuildStorage(reference) {
157
+ if (!!Object.keys(this.#_storage).length) {
158
+ console.warn("Attempted to rebuild storage multiple times");
159
+ return this;
160
+ }
161
+ this.#_storage = Object.entries(reference).reduce((acc, [key, node]) => {
162
+ if (node instanceof loro_runtime_node_exports.LoroCounter) return {
163
+ ...acc,
164
+ [key]: this.value.getCounter(key)
165
+ };
166
+ if (node instanceof loro_runtime_node_exports.LoroList) return {
167
+ ...acc,
168
+ [key]: this.value.getList(key)
169
+ };
170
+ if (node instanceof loro_runtime_node_exports.LoroMap) return {
171
+ ...acc,
172
+ [key]: this.value.getMap(key)
173
+ };
174
+ if (node instanceof loro_runtime_node_exports.LoroMovableList) return {
175
+ ...acc,
176
+ [key]: this.value.getMovableList(key)
177
+ };
178
+ if (node instanceof loro_runtime_node_exports.LoroText) return {
179
+ ...acc,
180
+ [key]: this.value.getText(key)
181
+ };
182
+ if (node instanceof loro_runtime_node_exports.LoroTree) return {
183
+ ...acc,
184
+ [key]: this.value.getTree(key)
185
+ };
186
+ return acc;
187
+ }, {});
188
+ return this.track();
189
+ }
190
+ redo() {
191
+ this.#_undoManager?.redo();
192
+ return this;
193
+ }
194
+ subscribe(listener) {
195
+ const fn = (event) => {
196
+ const update = fromUint8Array(this.value.export({ mode: "update" }));
197
+ listener({
198
+ doc: this,
199
+ local: event.by === "local",
200
+ origin: event.origin ? String(event.origin) : null,
201
+ update
202
+ });
203
+ };
204
+ return Object.values(this.#_storage).reduce((acc, crdtType) => {
205
+ const unsubscribe = crdtType.subscribe(fn);
206
+ return () => {
207
+ acc();
208
+ unsubscribe();
209
+ };
210
+ }, () => void 0);
211
+ }
212
+ track() {
213
+ if (this.#_undoManager) {
214
+ this.#_undoManager.clear();
215
+ this.#_undoManager.free();
216
+ this.#_undoManager = null;
217
+ }
218
+ this.#_undoManager = new loro_runtime_node_exports.UndoManager(this.value, {
219
+ maxUndoSteps: MAX_UNDO_STEPS,
220
+ mergeInterval: MERGE_INTERVAL_MS
221
+ });
222
+ return this;
223
+ }
224
+ /**
225
+ * @description Unlike Yjs, this method is required to be called after each loro operation.
226
+ * @date January 12, 2025
227
+ */
228
+ transact(fn) {
229
+ fn();
230
+ this.value.commit();
231
+ return this;
232
+ }
233
+ undo() {
234
+ this.#_undoManager?.undo();
235
+ return this;
236
+ }
237
+ #_setPluvId() {
238
+ const text = this.value.getText(PLUV_ID_FIELD);
239
+ const id = typeof crypto !== "undefined" ? crypto.randomUUID() : Math.random().toString();
240
+ text.insert(0, id);
241
+ }
242
+ };
243
+ //#endregion
244
+ //#region src/doc/CrdtLoroDocFactory.ts
245
+ var CrdtLoroDocFactory = class CrdtLoroDocFactory extends AbstractCrdtDocFactory {
246
+ _initialStorage;
247
+ constructor(initialStorage = () => ({})) {
248
+ super(initialStorage);
249
+ this._initialStorage = initialStorage;
250
+ }
251
+ getEmpty() {
252
+ return new CrdtLoroDoc();
253
+ }
254
+ getFactory(initialStorage) {
255
+ return new CrdtLoroDocFactory(initialStorage ?? this._initialStorage);
256
+ }
257
+ getInitialized(initialStorage) {
258
+ return new CrdtLoroDoc(initialStorage ?? this._initialStorage);
259
+ }
260
+ };
261
+ //#endregion
262
+ //#region src/doc/doc.ts
263
+ const doc = (value = () => ({})) => {
264
+ return new CrdtLoroDocFactory(value);
265
+ };
266
+ //#endregion
267
+ //#region src/list.ts
268
+ const list = (value = []) => {
269
+ const container = new loro_runtime_node_exports.LoroList();
270
+ value.forEach((item, i) => {
271
+ if ((0, loro_runtime_node_exports.isContainer)(item)) container.insertContainer(i, item);
272
+ else container.insert(i, item);
273
+ });
274
+ return container;
275
+ };
276
+ //#endregion
277
+ //#region src/map.ts
278
+ const map = (value = []) => {
279
+ const container = new loro_runtime_node_exports.LoroMap();
280
+ value.forEach(([key, item]) => {
281
+ if ((0, loro_runtime_node_exports.isContainer)(item)) container.setContainer(key, item);
282
+ else container.set(key, item);
283
+ });
284
+ return container;
285
+ };
286
+ //#endregion
287
+ //#region src/movableList.ts
288
+ const movableList = (value = []) => {
289
+ const container = new loro_runtime_node_exports.LoroMovableList();
290
+ value.forEach((item, i) => {
291
+ if ((0, loro_runtime_node_exports.isContainer)(item)) container.insertContainer(i, item);
292
+ else container.insert(i, item);
293
+ });
294
+ return container;
295
+ };
296
+ //#endregion
297
+ //#region src/object.ts
298
+ const object = (value) => {
299
+ const container = new loro_runtime_node_exports.LoroMap();
300
+ Object.entries(value).forEach(([key, item]) => {
301
+ if ((0, loro_runtime_node_exports.isContainer)(item)) container.setContainer(key, item);
302
+ else container.set(key, item);
303
+ });
304
+ return container;
305
+ };
306
+ //#endregion
307
+ //#region src/text.ts
308
+ const text = (value = "") => {
309
+ const container = new loro_runtime_node_exports.LoroText();
310
+ container.insert(0, value);
311
+ return container;
312
+ };
313
+ //#endregion
314
+ //#region src/tree.ts
315
+ const tree = () => {
316
+ return new loro_runtime_node_exports.LoroTree();
317
+ };
318
+ //#endregion
319
+ //#region src/loro.ts
320
+ var loro_exports = /* @__PURE__ */ __exportAll({
321
+ CrdtLoroDoc: () => CrdtLoroDoc,
322
+ counter: () => counter,
323
+ doc: () => doc,
324
+ kind: () => kind,
325
+ list: () => list,
326
+ map: () => map,
327
+ movableList: () => movableList,
328
+ object: () => object,
329
+ text: () => text,
330
+ tree: () => tree
331
+ });
332
+ const kind = "loro";
333
+ //#endregion
334
+ export { loro_exports as loro };
335
+
336
+ //# sourceMappingURL=node.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node.mjs","names":["LoroCounter","LoroDoc","#_storage","#_setPluvId","#_undoManager","LoroText","LoroCounter","LoroList","LoroMap","LoroMovableList","LoroTree","container","UndoManager","LoroList","LoroMap","LoroMovableList","LoroMap","LoroText","LoroTree"],"sources":["../src/loro-runtime.node.ts","../src/counter.ts","../src/doc/builder.ts","../src/doc/CrdtLoroDoc.ts","../src/doc/CrdtLoroDocFactory.ts","../src/doc/doc.ts","../src/list.ts","../src/map.ts","../src/movableList.ts","../src/object.ts","../src/text.ts","../src/tree.ts","../src/loro.ts"],"sourcesContent":["export * from \"loro-crdt/nodejs\";\n","import { LoroCounter } from \"@loro-runtime\";\nimport { LoroType } from \"./types\";\n\nexport const counter = (): LoroCounter => {\n const counter = new LoroCounter();\n\n return counter as unknown as LoroType<LoroCounter, number>;\n};\n","import type {\n Container,\n LoroCounter,\n LoroDoc,\n LoroList,\n LoroMap,\n LoroMovableList,\n LoroText,\n} from \"@loro-runtime\";\nimport { isContainer } from \"@loro-runtime\";\nimport type { LoroType } from \"../types\";\n\nexport type LoroBuilder = ReturnType<typeof builder>;\n\nexport const builder = (doc: LoroDoc) => {\n return {\n counter(name: string): LoroCounter {\n return doc.getCounter(name);\n },\n list<T extends unknown>(\n name: string,\n value: T[] | readonly T[] = [],\n ): LoroType<LoroList<T>, T[]> {\n const list = doc.getList(name);\n\n value.forEach((item, i) => {\n if (isContainer(item)) list.insertContainer(i, item);\n else list.insert(i, item as Exclude<T, Container>);\n });\n\n return list as unknown as LoroType<LoroList<T>, T[]>;\n },\n map<T extends Record<string, unknown>>(\n name: string,\n value: T = {} as T,\n ): LoroType<LoroMap<T>, T> {\n const container = doc.getMap(name);\n\n Object.entries(value).forEach(([key, item]) => {\n if (isContainer(item)) container.setContainer(key, item);\n else container.set(key, item as Exclude<T, Container>);\n });\n\n return container as unknown as LoroType<LoroMap<T>, T>;\n },\n moveableList<T extends unknown>(\n name: string,\n value: T[] | readonly T[] = [],\n ): LoroType<LoroMovableList<T>, T[]> {\n const list = doc.getMovableList(name);\n\n value.forEach((item, i) => {\n if (isContainer(item)) list.insertContainer(i, item);\n else list.insert(i, item as Exclude<T, Container>);\n });\n\n return list as unknown as LoroType<LoroMovableList<T>, T[]>;\n },\n text(name: string, value: string = \"\"): LoroType<LoroText, string> {\n const text = doc.getText(name);\n\n text.insert(0, value);\n\n return text as unknown as LoroType<LoroText, string>;\n },\n tree(name: string) {\n return doc.getTree(name);\n },\n };\n};\n","import type {\n DocApplyEncodedStateParams,\n DocBatchApplyEncodedStateParams,\n DocSubscribeCallbackParams,\n InferCrdtJson,\n} from \"@pluv/crdt\";\nimport type { CrdtDocLike } from \"@pluv/types\";\nimport { fromUint8Array, toUint8Array } from \"js-base64\";\nimport type { Container } from \"@loro-runtime\";\nimport {\n LoroCounter,\n LoroDoc,\n LoroEventBatch,\n LoroList,\n LoroMap,\n LoroMovableList,\n LoroText,\n LoroTree,\n UndoManager,\n} from \"@loro-runtime\";\nimport type { LoroType } from \"../types\";\nimport type { LoroBuilder } from \"./builder\";\nimport { builder } from \"./builder\";\n\nconst MAX_UNDO_STEPS = 100;\nconst MERGE_INTERVAL_MS = 1_000;\nconst PLUV_ID_FIELD = \"__$pluv\";\n\nexport type CrdtLoroDocParams<TStorage extends Record<string, LoroType<any, any>>> = (\n builder: LoroBuilder,\n) => TStorage;\n\nexport class CrdtLoroDoc<\n TStorage extends Record<string, LoroType<any, any>>,\n> implements CrdtDocLike<LoroDoc, TStorage> {\n public value: LoroDoc = new LoroDoc();\n\n #_storage: TStorage;\n #_undoManager: UndoManager | null = null;\n\n constructor(params: CrdtLoroDocParams<TStorage> = () => ({}) as TStorage) {\n const storage = params(builder(this.value));\n\n const keys = Object.keys(this.value.toJSON()).reduce(\n (set, key) => set.add(key),\n new Set<string>(),\n );\n\n this.#_storage = Object.entries(storage).reduce(\n (acc, [key, node]) => (keys.has(key) ? { ...acc, [key]: node } : acc),\n {} as TStorage,\n );\n if (!!Object.keys(storage).length) this.#_setPluvId();\n\n this.value.commit();\n }\n\n public applyEncodedState(params: DocApplyEncodedStateParams): this {\n const update =\n typeof params.update === \"string\" ? toUint8Array(params.update) : params.update;\n\n if (!update) return this;\n\n this.value.import(update);\n\n return this;\n }\n\n public batchApplyEncodedState(params: DocBatchApplyEncodedStateParams): this {\n const updates = params.updates ?? [];\n\n const filtered = updates.reduce<Uint8Array[]>((acc, update) => {\n if (!update) return acc;\n\n if (typeof update === \"string\") {\n acc.push(toUint8Array(update));\n return acc;\n }\n\n if (typeof update === \"object\") {\n acc.push(update);\n return acc;\n }\n\n return acc;\n }, []);\n\n if (!filtered.length) return this;\n\n if (filtered.length === 1) {\n const update = filtered[0] ?? null;\n\n if (!!update) this.value.import(update);\n\n return this;\n }\n\n this.value.importBatch(filtered);\n\n return this;\n }\n\n public canRedo(): boolean {\n if (!this.#_undoManager) return false;\n\n return this.#_undoManager.canRedo();\n }\n\n public canUndo(): boolean {\n if (!this.#_undoManager) return false;\n\n return this.#_undoManager.canUndo();\n }\n\n public destroy(): void {\n return;\n }\n\n public get(key?: undefined): TStorage;\n public get<TKey extends keyof TStorage>(key: TKey): TStorage[TKey];\n public get<TKey extends keyof TStorage>(key?: TKey): TStorage | TStorage[TKey] {\n if (typeof key === \"undefined\") return this.#_storage;\n\n return this.#_storage[key as TKey];\n }\n\n public getEncodedState(): string {\n return fromUint8Array(this.value.export({ mode: \"snapshot\" }));\n }\n\n public toJson(): InferCrdtJson<TStorage>;\n public toJson<TKey extends keyof TStorage>(type: TKey): InferCrdtJson<TStorage[TKey]>;\n public toJson<TKey extends keyof TStorage>(type?: TKey) {\n if (typeof type === \"string\") {\n const container = this.#_storage[type] as unknown as Container;\n\n return container instanceof LoroText\n ? container.toString()\n : container instanceof LoroCounter\n ? container.value\n : container.toJSON!();\n }\n\n return Object.entries(this.#_storage).reduce(\n (acc, [key, value]) => ({\n ...(acc as any),\n [key]: value instanceof LoroText ? value.toString() : value.toJSON!(),\n }),\n {} as InferCrdtJson<TStorage>,\n );\n }\n\n public isEmpty(): boolean {\n const serialized = this.value.toJSON();\n\n return !serialized || !Object.keys(serialized).length;\n }\n\n public rebuildStorage(reference: TStorage): this {\n const isBuilt = !!Object.keys(this.#_storage).length;\n\n if (isBuilt) {\n console.warn(\"Attempted to rebuild storage multiple times\");\n return this;\n }\n\n this.#_storage = Object.entries(reference).reduce((acc, [key, node]) => {\n if (node instanceof LoroCounter) return { ...acc, [key]: this.value.getCounter(key) };\n if (node instanceof LoroList) return { ...acc, [key]: this.value.getList(key) };\n if (node instanceof LoroMap) return { ...acc, [key]: this.value.getMap(key) };\n if (node instanceof LoroMovableList) {\n return { ...acc, [key]: this.value.getMovableList(key) };\n }\n if (node instanceof LoroText) return { ...acc, [key]: this.value.getText(key) };\n if (node instanceof LoroTree) return { ...acc, [key]: this.value.getTree(key) };\n\n return acc;\n }, {} as TStorage);\n\n return this.track();\n }\n\n public redo(): this {\n this.#_undoManager?.redo();\n\n return this;\n }\n\n public subscribe(\n listener: (params: DocSubscribeCallbackParams<LoroDoc, TStorage>) => void,\n ): () => void {\n const fn = (event: LoroEventBatch) => {\n const update = fromUint8Array(this.value.export({ mode: \"update\" }));\n\n listener({\n doc: this,\n local: event.by === \"local\",\n origin: event.origin ? String(event.origin) : null,\n update,\n });\n };\n\n const unsubcribeAll = Object.values(this.#_storage).reduce<() => void>(\n (acc, crdtType) => {\n const container = crdtType as unknown as Container;\n const unsubscribe = container.subscribe(fn);\n\n return () => {\n acc();\n unsubscribe();\n };\n },\n () => undefined,\n );\n\n return unsubcribeAll;\n }\n\n public track(): this {\n if (this.#_undoManager) {\n this.#_undoManager.clear();\n this.#_undoManager.free();\n\n this.#_undoManager = null;\n }\n\n this.#_undoManager = new UndoManager(this.value, {\n maxUndoSteps: MAX_UNDO_STEPS,\n mergeInterval: MERGE_INTERVAL_MS,\n });\n\n return this;\n }\n\n /**\n * @description Unlike Yjs, this method is required to be called after each loro operation.\n * @date January 12, 2025\n */\n public transact(fn: () => void): this {\n fn();\n\n this.value.commit();\n\n return this;\n }\n\n public undo(): this {\n this.#_undoManager?.undo();\n\n return this;\n }\n\n #_setPluvId() {\n const text = this.value.getText(PLUV_ID_FIELD);\n const id = typeof crypto !== \"undefined\" ? crypto.randomUUID() : Math.random().toString();\n\n text.insert(0, id);\n }\n}\n","import { AbstractCrdtDocFactory } from \"@pluv/crdt\";\nimport type { LoroDoc } from \"@loro-runtime\";\nimport type { LoroType } from \"../types\";\nimport { CrdtLoroDoc } from \"./CrdtLoroDoc\";\nimport type { LoroBuilder } from \"./builder\";\n\nexport class CrdtLoroDocFactory<\n TStorage extends Record<string, LoroType<any, any>>,\n> extends AbstractCrdtDocFactory<LoroDoc, TStorage> {\n public readonly _initialStorage: (builder: LoroBuilder) => TStorage;\n\n constructor(initialStorage: (builder: LoroBuilder) => TStorage = () => ({}) as TStorage) {\n super(initialStorage);\n\n this._initialStorage = initialStorage;\n }\n\n public getEmpty(): CrdtLoroDoc<TStorage> {\n return new CrdtLoroDoc<TStorage>();\n }\n\n public getFactory(\n initialStorage?: ((builder: LoroBuilder) => TStorage) | undefined,\n ): CrdtLoroDocFactory<TStorage> {\n return new CrdtLoroDocFactory<TStorage>(initialStorage ?? this._initialStorage);\n }\n\n public getInitialized(\n initialStorage?: (builder: LoroBuilder) => TStorage,\n ): CrdtLoroDoc<TStorage> {\n return new CrdtLoroDoc<TStorage>(initialStorage ?? this._initialStorage);\n }\n}\n","import type { LoroType } from \"../types\";\nimport type { LoroBuilder } from \"./builder\";\nimport { CrdtLoroDocFactory } from \"./CrdtLoroDocFactory\";\n\nexport const doc = <TStorage extends Record<string, LoroType<any, any>>>(\n value: (builder: LoroBuilder) => TStorage = () => ({}) as TStorage,\n): CrdtLoroDocFactory<TStorage> => {\n return new CrdtLoroDocFactory<TStorage>(value);\n};\n","import type { Container } from \"@loro-runtime\";\nimport { LoroList, isContainer } from \"@loro-runtime\";\nimport type { LoroType } from \"./types\";\n\nexport const list = <T extends unknown>(\n value: T[] | readonly T[] = [],\n): LoroType<LoroList<T>, T[]> => {\n const container = new LoroList();\n\n value.forEach((item, i) => {\n if (isContainer(item)) container.insertContainer(i, item);\n else container.insert(i, item as Exclude<T, Container>);\n });\n\n return container as unknown as LoroType<LoroList<T>, T[]>;\n};\n","import type { Container } from \"@loro-runtime\";\nimport { LoroMap, isContainer } from \"@loro-runtime\";\nimport type { LoroType } from \"./types\";\n\nexport const map = <T extends unknown>(\n value: readonly (readonly [key: string, value: T])[] = [],\n): LoroType<LoroMap<Record<string, T>>, Record<string, T>> => {\n const container = new LoroMap();\n\n value.forEach(([key, item]) => {\n if (isContainer(item)) container.setContainer(key, item);\n else container.set(key, item as Exclude<T, Container>);\n });\n\n return container as unknown as LoroType<LoroMap<Record<string, T>>, Record<string, T>>;\n};\n","import type { Container } from \"@loro-runtime\";\nimport { isContainer, LoroMovableList } from \"@loro-runtime\";\nimport type { LoroType } from \"./types\";\n\nexport const movableList = <T extends unknown>(value: T[] | readonly T[] = []) => {\n const container = new LoroMovableList();\n\n value.forEach((item, i) => {\n if (isContainer(item)) container.insertContainer(i, item);\n else container.insert(i, item as Exclude<T, Container>);\n });\n\n return container as unknown as LoroType<LoroMovableList<T>, T[]>;\n};\n","import type { Container } from \"@loro-runtime\";\nimport { LoroMap, isContainer } from \"@loro-runtime\";\nimport type { LoroType } from \"./types\";\n\nexport const object = <T extends Record<string, any>>(value: T): LoroType<LoroMap<T>, T> => {\n const container = new LoroMap();\n\n Object.entries(value).forEach(([key, item]) => {\n if (isContainer(item)) container.setContainer(key, item);\n else container.set(key, item as Exclude<T, Container>);\n });\n\n return container as unknown as LoroType<LoroMap<T>, T>;\n};\n","import { LoroText } from \"@loro-runtime\";\nimport type { LoroType } from \"./types\";\n\nexport const text = (value: string = \"\"): LoroType<LoroText, string> => {\n const container = new LoroText();\n\n container.insert(0, value);\n\n return container as unknown as LoroType<LoroText, string>;\n};\n","import { LoroTree } from \"@loro-runtime\";\n\nexport const tree = <T extends Record<string, unknown>>() => {\n const container = new LoroTree<T>();\n\n return container;\n};\n","export { counter } from \"./counter\";\nexport { CrdtLoroDoc, doc } from \"./doc\";\nexport type { LoroBuilder } from \"./doc\";\nexport { list } from \"./list\";\nexport { map } from \"./map\";\nexport { movableList } from \"./movableList\";\nexport { object } from \"./object\";\nexport { text } from \"./text\";\nexport { tree } from \"./tree\";\nexport type { LoroType } from \"./types\";\nexport const kind = \"loro\" as const;\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pluv/crdt-loro",
3
- "version": "4.0.1",
3
+ "version": "4.0.2",
4
4
  "description": "loro for @pluv/io",
5
5
  "author": {
6
6
  "email": "david@pluv.io",
@@ -15,34 +15,47 @@
15
15
  "directory": "packages/crdt-loro"
16
16
  },
17
17
  "type": "module",
18
- "types": "./dist/index.d.mts",
18
+ "types": "./dist/browser.d.mts",
19
19
  "publishConfig": {
20
20
  "access": "public"
21
21
  },
22
22
  "dependencies": {
23
- "@types/node": "^25.0.9",
23
+ "@types/node": "^25.9.2",
24
24
  "js-base64": "^3.7.8",
25
- "@pluv/crdt": "^4.0.1",
26
- "@pluv/types": "^4.0.1"
25
+ "@pluv/crdt": "^4.0.2",
26
+ "@pluv/types": "^4.0.2"
27
27
  },
28
28
  "peerDependencies": {
29
29
  "loro-crdt": "^1.0.0"
30
30
  },
31
31
  "devDependencies": {
32
- "eslint": "^9.39.2",
33
- "loro-crdt": "^1.10.4",
34
- "tsdown": "0.20.0-beta.4",
32
+ "eslint": "^10.4.1",
33
+ "loro-crdt": "^1.13.1",
34
+ "tsdown": "0.22.2",
35
35
  "typescript": "^5.9.3",
36
- "@pluv/tsconfig": "^4.0.1",
37
- "eslint-config-pluv": "^4.0.1"
36
+ "@pluv/tsconfig": "^4.0.2",
37
+ "eslint-config-pluv": "^4.0.2"
38
38
  },
39
39
  "exports": {
40
- ".": "./dist/index.mjs",
40
+ ".": {
41
+ "types": "./dist/browser.d.mts",
42
+ "browser": "./dist/browser.mjs",
43
+ "node": "./dist/node.mjs",
44
+ "default": "./dist/browser.mjs"
45
+ },
46
+ "./browser": {
47
+ "types": "./dist/browser.d.mts",
48
+ "default": "./dist/browser.mjs"
49
+ },
50
+ "./node": {
51
+ "types": "./dist/browser.d.mts",
52
+ "default": "./dist/node.mjs"
53
+ },
41
54
  "./*": "./*"
42
55
  },
43
56
  "scripts": {
44
- "build": "tsdown",
45
- "dev": "tsdown --watch",
57
+ "build": "tsdown --config tsdown.browser.config.ts && tsdown --config tsdown.node.config.ts",
58
+ "dev": "tsdown --config tsdown.browser.config.ts --watch",
46
59
  "lint": "eslint \"src/**/*.ts*\" --fix --max-warnings 0",
47
60
  "typecheck": "tsc --noEmit",
48
61
  "clean": "rm -rf .turbo && rm -rf node_modules && rm -rf dist"
package/src/counter.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { LoroCounter } from "loro-crdt";
1
+ import { LoroCounter } from "@loro-runtime";
2
2
  import { LoroType } from "./types";
3
3
 
4
4
  export const counter = (): LoroCounter => {
@@ -6,7 +6,7 @@ import type {
6
6
  } from "@pluv/crdt";
7
7
  import type { CrdtDocLike } from "@pluv/types";
8
8
  import { fromUint8Array, toUint8Array } from "js-base64";
9
- import type { Container } from "loro-crdt";
9
+ import type { Container } from "@loro-runtime";
10
10
  import {
11
11
  LoroCounter,
12
12
  LoroDoc,
@@ -17,7 +17,7 @@ import {
17
17
  LoroText,
18
18
  LoroTree,
19
19
  UndoManager,
20
- } from "loro-crdt";
20
+ } from "@loro-runtime";
21
21
  import type { LoroType } from "../types";
22
22
  import type { LoroBuilder } from "./builder";
23
23
  import { builder } from "./builder";
@@ -30,9 +30,9 @@ export type CrdtLoroDocParams<TStorage extends Record<string, LoroType<any, any>
30
30
  builder: LoroBuilder,
31
31
  ) => TStorage;
32
32
 
33
- export class CrdtLoroDoc<TStorage extends Record<string, LoroType<any, any>>>
34
- implements CrdtDocLike<LoroDoc, TStorage>
35
- {
33
+ export class CrdtLoroDoc<
34
+ TStorage extends Record<string, LoroType<any, any>>,
35
+ > implements CrdtDocLike<LoroDoc, TStorage> {
36
36
  public value: LoroDoc = new LoroDoc();
37
37
 
38
38
  #_storage: TStorage;
@@ -1,5 +1,5 @@
1
1
  import { AbstractCrdtDocFactory } from "@pluv/crdt";
2
- import type { LoroDoc } from "loro-crdt";
2
+ import type { LoroDoc } from "@loro-runtime";
3
3
  import type { LoroType } from "../types";
4
4
  import { CrdtLoroDoc } from "./CrdtLoroDoc";
5
5
  import type { LoroBuilder } from "./builder";
@@ -6,8 +6,8 @@ import type {
6
6
  LoroMap,
7
7
  LoroMovableList,
8
8
  LoroText,
9
- } from "loro-crdt";
10
- import { isContainer } from "loro-crdt";
9
+ } from "@loro-runtime";
10
+ import { isContainer } from "@loro-runtime";
11
11
  import type { LoroType } from "../types";
12
12
 
13
13
  export type LoroBuilder = ReturnType<typeof builder>;
package/src/list.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type { Container } from "loro-crdt";
2
- import { LoroList, isContainer } from "loro-crdt";
1
+ import type { Container } from "@loro-runtime";
2
+ import { LoroList, isContainer } from "@loro-runtime";
3
3
  import type { LoroType } from "./types";
4
4
 
5
5
  export const list = <T extends unknown>(
@@ -0,0 +1 @@
1
+ export * from "loro-crdt";
@@ -0,0 +1 @@
1
+ export * from "loro-crdt/nodejs";
package/src/map.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type { Container } from "loro-crdt";
2
- import { LoroMap, isContainer } from "loro-crdt";
1
+ import type { Container } from "@loro-runtime";
2
+ import { LoroMap, isContainer } from "@loro-runtime";
3
3
  import type { LoroType } from "./types";
4
4
 
5
5
  export const map = <T extends unknown>(
@@ -1,5 +1,5 @@
1
- import type { Container } from "loro-crdt";
2
- import { isContainer, LoroMovableList } from "loro-crdt";
1
+ import type { Container } from "@loro-runtime";
2
+ import { isContainer, LoroMovableList } from "@loro-runtime";
3
3
  import type { LoroType } from "./types";
4
4
 
5
5
  export const movableList = <T extends unknown>(value: T[] | readonly T[] = []) => {
package/src/object.ts CHANGED
@@ -1,5 +1,5 @@
1
- import type { Container } from "loro-crdt";
2
- import { LoroMap, isContainer } from "loro-crdt";
1
+ import type { Container } from "@loro-runtime";
2
+ import { LoroMap, isContainer } from "@loro-runtime";
3
3
  import type { LoroType } from "./types";
4
4
 
5
5
  export const object = <T extends Record<string, any>>(value: T): LoroType<LoroMap<T>, T> => {
package/src/text.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { LoroText } from "loro-crdt";
1
+ import { LoroText } from "@loro-runtime";
2
2
  import type { LoroType } from "./types";
3
3
 
4
4
  export const text = (value: string = ""): LoroType<LoroText, string> => {
package/src/tree.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { LoroTree } from "loro-crdt";
1
+ import { LoroTree } from "@loro-runtime";
2
2
 
3
3
  export const tree = <T extends Record<string, unknown>>() => {
4
4
  const container = new LoroTree<T>();
package/tsconfig.json CHANGED
@@ -3,6 +3,9 @@
3
3
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx"],
4
4
  "exclude": ["node_modules"],
5
5
  "compilerOptions": {
6
- "lib": ["dom", "esnext"]
6
+ "lib": ["dom", "esnext"],
7
+ "paths": {
8
+ "@loro-runtime": ["./src/loro-runtime.browser.ts"]
9
+ }
7
10
  }
8
11
  }
@@ -0,0 +1,8 @@
1
+ {
2
+ "extends": "./tsconfig.json",
3
+ "compilerOptions": {
4
+ "paths": {
5
+ "@loro-runtime": ["./src/loro-runtime.node.ts"]
6
+ }
7
+ }
8
+ }
@@ -0,0 +1,14 @@
1
+ import { defineConfig } from "tsdown";
2
+
3
+ export default defineConfig({
4
+ entry: { browser: "src/index.ts" },
5
+ alias: {
6
+ "@loro-runtime": "./src/loro-runtime.browser.ts",
7
+ },
8
+ format: ["esm"],
9
+ target: "esnext",
10
+ sourcemap: true,
11
+ dts: true,
12
+ outDir: "dist",
13
+ clean: true,
14
+ });
package/tsdown.config.ts CHANGED
@@ -1,14 +1,4 @@
1
- import { defineConfig } from "tsdown";
1
+ import browserConfig from "./tsdown.browser.config.ts";
2
+ import nodeConfig from "./tsdown.node.config.ts";
2
3
 
3
- export default defineConfig({
4
- format: ["esm"],
5
- dts: true,
6
- outDir: "dist",
7
- entry: "src/index.ts",
8
- target: "esnext",
9
- sourcemap: true,
10
- clean: true,
11
- exports: {
12
- all: true,
13
- },
14
- });
4
+ export default [browserConfig, nodeConfig];
@@ -0,0 +1,15 @@
1
+ import { defineConfig } from "tsdown";
2
+
3
+ export default defineConfig({
4
+ entry: { node: "src/index.ts" },
5
+ alias: {
6
+ "@loro-runtime": "./src/loro-runtime.node.ts",
7
+ },
8
+ format: ["esm"],
9
+ target: "esnext",
10
+ sourcemap: true,
11
+ tsconfig: "tsconfig.node.build.json",
12
+ dts: false,
13
+ outDir: "dist",
14
+ clean: false,
15
+ });
@@ -1,18 +0,0 @@
1
- //#region rolldown:runtime
2
- var __defProp = Object.defineProperty;
3
- var __exportAll = (all, symbols) => {
4
- let target = {};
5
- for (var name in all) {
6
- __defProp(target, name, {
7
- get: all[name],
8
- enumerable: true
9
- });
10
- }
11
- if (symbols) {
12
- __defProp(target, Symbol.toStringTag, { value: "Module" });
13
- }
14
- return target;
15
- };
16
-
17
- //#endregion
18
- export { __exportAll as t };
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/counter.ts","../src/types.ts","../src/doc/builder.ts","../src/doc/CrdtLoroDoc.ts","../src/doc/CrdtLoroDocFactory.ts","../src/doc/doc.ts","../src/list.ts","../src/map.ts","../src/movableList.ts","../src/object.ts","../src/text.ts","../src/tree.ts","../src/loro.ts","../src/index.ts"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.mjs","names":["doc","list","text","#_storage","#_setPluvId","#_undoManager","text"],"sources":["../src/counter.ts","../src/doc/builder.ts","../src/doc/CrdtLoroDoc.ts","../src/doc/CrdtLoroDocFactory.ts","../src/doc/doc.ts","../src/list.ts","../src/map.ts","../src/movableList.ts","../src/object.ts","../src/text.ts","../src/tree.ts","../src/loro.ts"],"sourcesContent":["import { LoroCounter } from \"loro-crdt\";\nimport { LoroType } from \"./types\";\n\nexport const counter = (): LoroCounter => {\n const counter = new LoroCounter();\n\n return counter as unknown as LoroType<LoroCounter, number>;\n};\n","import type {\n Container,\n LoroCounter,\n LoroDoc,\n LoroList,\n LoroMap,\n LoroMovableList,\n LoroText,\n} from \"loro-crdt\";\nimport { isContainer } from \"loro-crdt\";\nimport type { LoroType } from \"../types\";\n\nexport type LoroBuilder = ReturnType<typeof builder>;\n\nexport const builder = (doc: LoroDoc) => {\n return {\n counter(name: string): LoroCounter {\n return doc.getCounter(name);\n },\n list<T extends unknown>(\n name: string,\n value: T[] | readonly T[] = [],\n ): LoroType<LoroList<T>, T[]> {\n const list = doc.getList(name);\n\n value.forEach((item, i) => {\n if (isContainer(item)) list.insertContainer(i, item);\n else list.insert(i, item as Exclude<T, Container>);\n });\n\n return list as unknown as LoroType<LoroList<T>, T[]>;\n },\n map<T extends Record<string, unknown>>(\n name: string,\n value: T = {} as T,\n ): LoroType<LoroMap<T>, T> {\n const container = doc.getMap(name);\n\n Object.entries(value).forEach(([key, item]) => {\n if (isContainer(item)) container.setContainer(key, item);\n else container.set(key, item as Exclude<T, Container>);\n });\n\n return container as unknown as LoroType<LoroMap<T>, T>;\n },\n moveableList<T extends unknown>(\n name: string,\n value: T[] | readonly T[] = [],\n ): LoroType<LoroMovableList<T>, T[]> {\n const list = doc.getMovableList(name);\n\n value.forEach((item, i) => {\n if (isContainer(item)) list.insertContainer(i, item);\n else list.insert(i, item as Exclude<T, Container>);\n });\n\n return list as unknown as LoroType<LoroMovableList<T>, T[]>;\n },\n text(name: string, value: string = \"\"): LoroType<LoroText, string> {\n const text = doc.getText(name);\n\n text.insert(0, value);\n\n return text as unknown as LoroType<LoroText, string>;\n },\n tree(name: string) {\n return doc.getTree(name);\n },\n };\n};\n","import type {\n DocApplyEncodedStateParams,\n DocBatchApplyEncodedStateParams,\n DocSubscribeCallbackParams,\n InferCrdtJson,\n} from \"@pluv/crdt\";\nimport type { CrdtDocLike } from \"@pluv/types\";\nimport { fromUint8Array, toUint8Array } from \"js-base64\";\nimport type { Container } from \"loro-crdt\";\nimport {\n LoroCounter,\n LoroDoc,\n LoroEventBatch,\n LoroList,\n LoroMap,\n LoroMovableList,\n LoroText,\n LoroTree,\n UndoManager,\n} from \"loro-crdt\";\nimport type { LoroType } from \"../types\";\nimport type { LoroBuilder } from \"./builder\";\nimport { builder } from \"./builder\";\n\nconst MAX_UNDO_STEPS = 100;\nconst MERGE_INTERVAL_MS = 1_000;\nconst PLUV_ID_FIELD = \"__$pluv\";\n\nexport type CrdtLoroDocParams<TStorage extends Record<string, LoroType<any, any>>> = (\n builder: LoroBuilder,\n) => TStorage;\n\nexport class CrdtLoroDoc<TStorage extends Record<string, LoroType<any, any>>>\n implements CrdtDocLike<LoroDoc, TStorage>\n{\n public value: LoroDoc = new LoroDoc();\n\n #_storage: TStorage;\n #_undoManager: UndoManager | null = null;\n\n constructor(params: CrdtLoroDocParams<TStorage> = () => ({}) as TStorage) {\n const storage = params(builder(this.value));\n\n const keys = Object.keys(this.value.toJSON()).reduce(\n (set, key) => set.add(key),\n new Set<string>(),\n );\n\n this.#_storage = Object.entries(storage).reduce(\n (acc, [key, node]) => (keys.has(key) ? { ...acc, [key]: node } : acc),\n {} as TStorage,\n );\n if (!!Object.keys(storage).length) this.#_setPluvId();\n\n this.value.commit();\n }\n\n public applyEncodedState(params: DocApplyEncodedStateParams): this {\n const update =\n typeof params.update === \"string\" ? toUint8Array(params.update) : params.update;\n\n if (!update) return this;\n\n this.value.import(update);\n\n return this;\n }\n\n public batchApplyEncodedState(params: DocBatchApplyEncodedStateParams): this {\n const updates = params.updates ?? [];\n\n const filtered = updates.reduce<Uint8Array[]>((acc, update) => {\n if (!update) return acc;\n\n if (typeof update === \"string\") {\n acc.push(toUint8Array(update));\n return acc;\n }\n\n if (typeof update === \"object\") {\n acc.push(update);\n return acc;\n }\n\n return acc;\n }, []);\n\n if (!filtered.length) return this;\n\n if (filtered.length === 1) {\n const update = filtered[0] ?? null;\n\n if (!!update) this.value.import(update);\n\n return this;\n }\n\n this.value.importBatch(filtered);\n\n return this;\n }\n\n public canRedo(): boolean {\n if (!this.#_undoManager) return false;\n\n return this.#_undoManager.canRedo();\n }\n\n public canUndo(): boolean {\n if (!this.#_undoManager) return false;\n\n return this.#_undoManager.canUndo();\n }\n\n public destroy(): void {\n return;\n }\n\n public get(key?: undefined): TStorage;\n public get<TKey extends keyof TStorage>(key: TKey): TStorage[TKey];\n public get<TKey extends keyof TStorage>(key?: TKey): TStorage | TStorage[TKey] {\n if (typeof key === \"undefined\") return this.#_storage;\n\n return this.#_storage[key as TKey];\n }\n\n public getEncodedState(): string {\n return fromUint8Array(this.value.export({ mode: \"snapshot\" }));\n }\n\n public toJson(): InferCrdtJson<TStorage>;\n public toJson<TKey extends keyof TStorage>(type: TKey): InferCrdtJson<TStorage[TKey]>;\n public toJson<TKey extends keyof TStorage>(type?: TKey) {\n if (typeof type === \"string\") {\n const container = this.#_storage[type] as unknown as Container;\n\n return container instanceof LoroText\n ? container.toString()\n : container instanceof LoroCounter\n ? container.value\n : container.toJSON!();\n }\n\n return Object.entries(this.#_storage).reduce(\n (acc, [key, value]) => ({\n ...(acc as any),\n [key]: value instanceof LoroText ? value.toString() : value.toJSON!(),\n }),\n {} as InferCrdtJson<TStorage>,\n );\n }\n\n public isEmpty(): boolean {\n const serialized = this.value.toJSON();\n\n return !serialized || !Object.keys(serialized).length;\n }\n\n public rebuildStorage(reference: TStorage): this {\n const isBuilt = !!Object.keys(this.#_storage).length;\n\n if (isBuilt) {\n console.warn(\"Attempted to rebuild storage multiple times\");\n return this;\n }\n\n this.#_storage = Object.entries(reference).reduce((acc, [key, node]) => {\n if (node instanceof LoroCounter) return { ...acc, [key]: this.value.getCounter(key) };\n if (node instanceof LoroList) return { ...acc, [key]: this.value.getList(key) };\n if (node instanceof LoroMap) return { ...acc, [key]: this.value.getMap(key) };\n if (node instanceof LoroMovableList) {\n return { ...acc, [key]: this.value.getMovableList(key) };\n }\n if (node instanceof LoroText) return { ...acc, [key]: this.value.getText(key) };\n if (node instanceof LoroTree) return { ...acc, [key]: this.value.getTree(key) };\n\n return acc;\n }, {} as TStorage);\n\n return this.track();\n }\n\n public redo(): this {\n this.#_undoManager?.redo();\n\n return this;\n }\n\n public subscribe(\n listener: (params: DocSubscribeCallbackParams<LoroDoc, TStorage>) => void,\n ): () => void {\n const fn = (event: LoroEventBatch) => {\n const update = fromUint8Array(this.value.export({ mode: \"update\" }));\n\n listener({\n doc: this,\n local: event.by === \"local\",\n origin: event.origin ? String(event.origin) : null,\n update,\n });\n };\n\n const unsubcribeAll = Object.values(this.#_storage).reduce<() => void>(\n (acc, crdtType) => {\n const container = crdtType as unknown as Container;\n const unsubscribe = container.subscribe(fn);\n\n return () => {\n acc();\n unsubscribe();\n };\n },\n () => undefined,\n );\n\n return unsubcribeAll;\n }\n\n public track(): this {\n if (this.#_undoManager) {\n this.#_undoManager.clear();\n this.#_undoManager.free();\n\n this.#_undoManager = null;\n }\n\n this.#_undoManager = new UndoManager(this.value, {\n maxUndoSteps: MAX_UNDO_STEPS,\n mergeInterval: MERGE_INTERVAL_MS,\n });\n\n return this;\n }\n\n /**\n * @description Unlike Yjs, this method is required to be called after each loro operation.\n * @date January 12, 2025\n */\n public transact(fn: () => void): this {\n fn();\n\n this.value.commit();\n\n return this;\n }\n\n public undo(): this {\n this.#_undoManager?.undo();\n\n return this;\n }\n\n #_setPluvId() {\n const text = this.value.getText(PLUV_ID_FIELD);\n const id = typeof crypto !== \"undefined\" ? crypto.randomUUID() : Math.random().toString();\n\n text.insert(0, id);\n }\n}\n","import { AbstractCrdtDocFactory } from \"@pluv/crdt\";\nimport type { LoroDoc } from \"loro-crdt\";\nimport type { LoroType } from \"../types\";\nimport { CrdtLoroDoc } from \"./CrdtLoroDoc\";\nimport type { LoroBuilder } from \"./builder\";\n\nexport class CrdtLoroDocFactory<\n TStorage extends Record<string, LoroType<any, any>>,\n> extends AbstractCrdtDocFactory<LoroDoc, TStorage> {\n public readonly _initialStorage: (builder: LoroBuilder) => TStorage;\n\n constructor(initialStorage: (builder: LoroBuilder) => TStorage = () => ({}) as TStorage) {\n super(initialStorage);\n\n this._initialStorage = initialStorage;\n }\n\n public getEmpty(): CrdtLoroDoc<TStorage> {\n return new CrdtLoroDoc<TStorage>();\n }\n\n public getFactory(\n initialStorage?: ((builder: LoroBuilder) => TStorage) | undefined,\n ): CrdtLoroDocFactory<TStorage> {\n return new CrdtLoroDocFactory<TStorage>(initialStorage ?? this._initialStorage);\n }\n\n public getInitialized(\n initialStorage?: (builder: LoroBuilder) => TStorage,\n ): CrdtLoroDoc<TStorage> {\n return new CrdtLoroDoc<TStorage>(initialStorage ?? this._initialStorage);\n }\n}\n","import type { LoroType } from \"../types\";\nimport type { LoroBuilder } from \"./builder\";\nimport { CrdtLoroDocFactory } from \"./CrdtLoroDocFactory\";\n\nexport const doc = <TStorage extends Record<string, LoroType<any, any>>>(\n value: (builder: LoroBuilder) => TStorage = () => ({}) as TStorage,\n): CrdtLoroDocFactory<TStorage> => {\n return new CrdtLoroDocFactory<TStorage>(value);\n};\n","import type { Container } from \"loro-crdt\";\nimport { LoroList, isContainer } from \"loro-crdt\";\nimport type { LoroType } from \"./types\";\n\nexport const list = <T extends unknown>(\n value: T[] | readonly T[] = [],\n): LoroType<LoroList<T>, T[]> => {\n const container = new LoroList();\n\n value.forEach((item, i) => {\n if (isContainer(item)) container.insertContainer(i, item);\n else container.insert(i, item as Exclude<T, Container>);\n });\n\n return container as unknown as LoroType<LoroList<T>, T[]>;\n};\n","import type { Container } from \"loro-crdt\";\nimport { LoroMap, isContainer } from \"loro-crdt\";\nimport type { LoroType } from \"./types\";\n\nexport const map = <T extends unknown>(\n value: readonly (readonly [key: string, value: T])[] = [],\n): LoroType<LoroMap<Record<string, T>>, Record<string, T>> => {\n const container = new LoroMap();\n\n value.forEach(([key, item]) => {\n if (isContainer(item)) container.setContainer(key, item);\n else container.set(key, item as Exclude<T, Container>);\n });\n\n return container as unknown as LoroType<LoroMap<Record<string, T>>, Record<string, T>>;\n};\n","import type { Container } from \"loro-crdt\";\nimport { isContainer, LoroMovableList } from \"loro-crdt\";\nimport type { LoroType } from \"./types\";\n\nexport const movableList = <T extends unknown>(value: T[] | readonly T[] = []) => {\n const container = new LoroMovableList();\n\n value.forEach((item, i) => {\n if (isContainer(item)) container.insertContainer(i, item);\n else container.insert(i, item as Exclude<T, Container>);\n });\n\n return container as unknown as LoroType<LoroMovableList<T>, T[]>;\n};\n","import type { Container } from \"loro-crdt\";\nimport { LoroMap, isContainer } from \"loro-crdt\";\nimport type { LoroType } from \"./types\";\n\nexport const object = <T extends Record<string, any>>(value: T): LoroType<LoroMap<T>, T> => {\n const container = new LoroMap();\n\n Object.entries(value).forEach(([key, item]) => {\n if (isContainer(item)) container.setContainer(key, item);\n else container.set(key, item as Exclude<T, Container>);\n });\n\n return container as unknown as LoroType<LoroMap<T>, T>;\n};\n","import { LoroText } from \"loro-crdt\";\nimport type { LoroType } from \"./types\";\n\nexport const text = (value: string = \"\"): LoroType<LoroText, string> => {\n const container = new LoroText();\n\n container.insert(0, value);\n\n return container as unknown as LoroType<LoroText, string>;\n};\n","import { LoroTree } from \"loro-crdt\";\n\nexport const tree = <T extends Record<string, unknown>>() => {\n const container = new LoroTree<T>();\n\n return container;\n};\n","export { counter } from \"./counter\";\nexport { CrdtLoroDoc, doc } from \"./doc\";\nexport type { LoroBuilder } from \"./doc\";\nexport { list } from \"./list\";\nexport { map } from \"./map\";\nexport { movableList } from \"./movableList\";\nexport { object } from \"./object\";\nexport { text } from \"./text\";\nexport { tree } from \"./tree\";\nexport type { LoroType } from \"./types\";\nexport const kind = \"loro\" as const;\n"],"mappings":";;;;;;AAGA,MAAa,gBAA6B;AAGtC,QAFgB,IAAI,aAAa;;;;;ACUrC,MAAa,WAAW,UAAiB;AACrC,QAAO;EACH,QAAQ,MAA2B;AAC/B,UAAOA,MAAI,WAAW,KAAK;;EAE/B,KACI,MACA,QAA4B,EAAE,EACJ;GAC1B,MAAMC,SAAOD,MAAI,QAAQ,KAAK;AAE9B,SAAM,SAAS,MAAM,MAAM;AACvB,QAAI,YAAY,KAAK,CAAE,QAAK,gBAAgB,GAAG,KAAK;QAC/C,QAAK,OAAO,GAAG,KAA8B;KACpD;AAEF,UAAOC;;EAEX,IACI,MACA,QAAW,EAAE,EACU;GACvB,MAAM,YAAYD,MAAI,OAAO,KAAK;AAElC,UAAO,QAAQ,MAAM,CAAC,SAAS,CAAC,KAAK,UAAU;AAC3C,QAAI,YAAY,KAAK,CAAE,WAAU,aAAa,KAAK,KAAK;QACnD,WAAU,IAAI,KAAK,KAA8B;KACxD;AAEF,UAAO;;EAEX,aACI,MACA,QAA4B,EAAE,EACG;GACjC,MAAMC,SAAOD,MAAI,eAAe,KAAK;AAErC,SAAM,SAAS,MAAM,MAAM;AACvB,QAAI,YAAY,KAAK,CAAE,QAAK,gBAAgB,GAAG,KAAK;QAC/C,QAAK,OAAO,GAAG,KAA8B;KACpD;AAEF,UAAOC;;EAEX,KAAK,MAAc,QAAgB,IAAgC;GAC/D,MAAMC,SAAOF,MAAI,QAAQ,KAAK;AAE9B,UAAK,OAAO,GAAG,MAAM;AAErB,UAAOE;;EAEX,KAAK,MAAc;AACf,UAAOF,MAAI,QAAQ,KAAK;;EAE/B;;;;;AC5CL,MAAM,iBAAiB;AACvB,MAAM,oBAAoB;AAC1B,MAAM,gBAAgB;AAMtB,IAAa,cAAb,MAEA;CACI,AAAO,QAAiB,IAAI,SAAS;CAErC;CACA,gBAAoC;CAEpC,YAAY,gBAA6C,EAAE,GAAe;EACtE,MAAM,UAAU,OAAO,QAAQ,KAAK,MAAM,CAAC;EAE3C,MAAM,OAAO,OAAO,KAAK,KAAK,MAAM,QAAQ,CAAC,CAAC,QACzC,KAAK,QAAQ,IAAI,IAAI,IAAI,kBAC1B,IAAI,KAAa,CACpB;AAED,QAAKG,WAAY,OAAO,QAAQ,QAAQ,CAAC,QACpC,KAAK,CAAC,KAAK,UAAW,KAAK,IAAI,IAAI,GAAG;GAAE,GAAG;IAAM,MAAM;GAAM,GAAG,KACjE,EAAE,CACL;AACD,MAAI,CAAC,CAAC,OAAO,KAAK,QAAQ,CAAC,OAAQ,OAAKC,YAAa;AAErD,OAAK,MAAM,QAAQ;;CAGvB,AAAO,kBAAkB,QAA0C;EAC/D,MAAM,SACF,OAAO,OAAO,WAAW,WAAW,aAAa,OAAO,OAAO,GAAG,OAAO;AAE7E,MAAI,CAAC,OAAQ,QAAO;AAEpB,OAAK,MAAM,OAAO,OAAO;AAEzB,SAAO;;CAGX,AAAO,uBAAuB,QAA+C;EAGzE,MAAM,YAFU,OAAO,WAAW,EAAE,EAEX,QAAsB,KAAK,WAAW;AAC3D,OAAI,CAAC,OAAQ,QAAO;AAEpB,OAAI,OAAO,WAAW,UAAU;AAC5B,QAAI,KAAK,aAAa,OAAO,CAAC;AAC9B,WAAO;;AAGX,OAAI,OAAO,WAAW,UAAU;AAC5B,QAAI,KAAK,OAAO;AAChB,WAAO;;AAGX,UAAO;KACR,EAAE,CAAC;AAEN,MAAI,CAAC,SAAS,OAAQ,QAAO;AAE7B,MAAI,SAAS,WAAW,GAAG;GACvB,MAAM,SAAS,SAAS,MAAM;AAE9B,OAAI,CAAC,CAAC,OAAQ,MAAK,MAAM,OAAO,OAAO;AAEvC,UAAO;;AAGX,OAAK,MAAM,YAAY,SAAS;AAEhC,SAAO;;CAGX,AAAO,UAAmB;AACtB,MAAI,CAAC,MAAKC,aAAe,QAAO;AAEhC,SAAO,MAAKA,aAAc,SAAS;;CAGvC,AAAO,UAAmB;AACtB,MAAI,CAAC,MAAKA,aAAe,QAAO;AAEhC,SAAO,MAAKA,aAAc,SAAS;;CAGvC,AAAO,UAAgB;CAMvB,AAAO,IAAiC,KAAuC;AAC3E,MAAI,OAAO,QAAQ,YAAa,QAAO,MAAKF;AAE5C,SAAO,MAAKA,SAAU;;CAG1B,AAAO,kBAA0B;AAC7B,SAAO,eAAe,KAAK,MAAM,OAAO,EAAE,MAAM,YAAY,CAAC,CAAC;;CAKlE,AAAO,OAAoC,MAAa;AACpD,MAAI,OAAO,SAAS,UAAU;GAC1B,MAAM,YAAY,MAAKA,SAAU;AAEjC,UAAO,qBAAqB,WACtB,UAAU,UAAU,GACpB,qBAAqB,cACnB,UAAU,QACV,UAAU,QAAS;;AAG/B,SAAO,OAAO,QAAQ,MAAKA,SAAU,CAAC,QACjC,KAAK,CAAC,KAAK,YAAY;GACpB,GAAI;IACH,MAAM,iBAAiB,WAAW,MAAM,UAAU,GAAG,MAAM,QAAS;GACxE,GACD,EAAE,CACL;;CAGL,AAAO,UAAmB;EACtB,MAAM,aAAa,KAAK,MAAM,QAAQ;AAEtC,SAAO,CAAC,cAAc,CAAC,OAAO,KAAK,WAAW,CAAC;;CAGnD,AAAO,eAAe,WAA2B;AAG7C,MAFgB,CAAC,CAAC,OAAO,KAAK,MAAKA,SAAU,CAAC,QAEjC;AACT,WAAQ,KAAK,8CAA8C;AAC3D,UAAO;;AAGX,QAAKA,WAAY,OAAO,QAAQ,UAAU,CAAC,QAAQ,KAAK,CAAC,KAAK,UAAU;AACpE,OAAI,gBAAgB,YAAa,QAAO;IAAE,GAAG;KAAM,MAAM,KAAK,MAAM,WAAW,IAAI;IAAE;AACrF,OAAI,gBAAgB,SAAU,QAAO;IAAE,GAAG;KAAM,MAAM,KAAK,MAAM,QAAQ,IAAI;IAAE;AAC/E,OAAI,gBAAgB,QAAS,QAAO;IAAE,GAAG;KAAM,MAAM,KAAK,MAAM,OAAO,IAAI;IAAE;AAC7E,OAAI,gBAAgB,gBAChB,QAAO;IAAE,GAAG;KAAM,MAAM,KAAK,MAAM,eAAe,IAAI;IAAE;AAE5D,OAAI,gBAAgB,SAAU,QAAO;IAAE,GAAG;KAAM,MAAM,KAAK,MAAM,QAAQ,IAAI;IAAE;AAC/E,OAAI,gBAAgB,SAAU,QAAO;IAAE,GAAG;KAAM,MAAM,KAAK,MAAM,QAAQ,IAAI;IAAE;AAE/E,UAAO;KACR,EAAE,CAAa;AAElB,SAAO,KAAK,OAAO;;CAGvB,AAAO,OAAa;AAChB,QAAKE,cAAe,MAAM;AAE1B,SAAO;;CAGX,AAAO,UACH,UACU;EACV,MAAM,MAAM,UAA0B;GAClC,MAAM,SAAS,eAAe,KAAK,MAAM,OAAO,EAAE,MAAM,UAAU,CAAC,CAAC;AAEpE,YAAS;IACL,KAAK;IACL,OAAO,MAAM,OAAO;IACpB,QAAQ,MAAM,SAAS,OAAO,MAAM,OAAO,GAAG;IAC9C;IACH,CAAC;;AAgBN,SAbsB,OAAO,OAAO,MAAKF,SAAU,CAAC,QAC/C,KAAK,aAAa;GAEf,MAAM,cADY,SACY,UAAU,GAAG;AAE3C,gBAAa;AACT,SAAK;AACL,iBAAa;;WAGf,OACT;;CAKL,AAAO,QAAc;AACjB,MAAI,MAAKE,cAAe;AACpB,SAAKA,aAAc,OAAO;AAC1B,SAAKA,aAAc,MAAM;AAEzB,SAAKA,eAAgB;;AAGzB,QAAKA,eAAgB,IAAI,YAAY,KAAK,OAAO;GAC7C,cAAc;GACd,eAAe;GAClB,CAAC;AAEF,SAAO;;;;;;CAOX,AAAO,SAAS,IAAsB;AAClC,MAAI;AAEJ,OAAK,MAAM,QAAQ;AAEnB,SAAO;;CAGX,AAAO,OAAa;AAChB,QAAKA,cAAe,MAAM;AAE1B,SAAO;;CAGX,cAAc;EACV,MAAMC,SAAO,KAAK,MAAM,QAAQ,cAAc;EAC9C,MAAM,KAAK,OAAO,WAAW,cAAc,OAAO,YAAY,GAAG,KAAK,QAAQ,CAAC,UAAU;AAEzF,SAAK,OAAO,GAAG,GAAG;;;;;;AC1P1B,IAAa,qBAAb,MAAa,2BAEH,uBAA0C;CAChD,AAAgB;CAEhB,YAAY,wBAA4D,EAAE,GAAe;AACrF,QAAM,eAAe;AAErB,OAAK,kBAAkB;;CAG3B,AAAO,WAAkC;AACrC,SAAO,IAAI,aAAuB;;CAGtC,AAAO,WACH,gBAC4B;AAC5B,SAAO,IAAI,mBAA6B,kBAAkB,KAAK,gBAAgB;;CAGnF,AAAO,eACH,gBACqB;AACrB,SAAO,IAAI,YAAsB,kBAAkB,KAAK,gBAAgB;;;;;;AC1BhF,MAAa,OACT,eAAmD,EAAE,MACtB;AAC/B,QAAO,IAAI,mBAA6B,MAAM;;;;;ACHlD,MAAa,QACT,QAA4B,EAAE,KACD;CAC7B,MAAM,YAAY,IAAI,UAAU;AAEhC,OAAM,SAAS,MAAM,MAAM;AACvB,MAAI,YAAY,KAAK,CAAE,WAAU,gBAAgB,GAAG,KAAK;MACpD,WAAU,OAAO,GAAG,KAA8B;GACzD;AAEF,QAAO;;;;;ACVX,MAAa,OACT,QAAuD,EAAE,KACC;CAC1D,MAAM,YAAY,IAAI,SAAS;AAE/B,OAAM,SAAS,CAAC,KAAK,UAAU;AAC3B,MAAI,YAAY,KAAK,CAAE,WAAU,aAAa,KAAK,KAAK;MACnD,WAAU,IAAI,KAAK,KAA8B;GACxD;AAEF,QAAO;;;;;ACVX,MAAa,eAAkC,QAA4B,EAAE,KAAK;CAC9E,MAAM,YAAY,IAAI,iBAAiB;AAEvC,OAAM,SAAS,MAAM,MAAM;AACvB,MAAI,YAAY,KAAK,CAAE,WAAU,gBAAgB,GAAG,KAAK;MACpD,WAAU,OAAO,GAAG,KAA8B;GACzD;AAEF,QAAO;;;;;ACRX,MAAa,UAAyC,UAAsC;CACxF,MAAM,YAAY,IAAI,SAAS;AAE/B,QAAO,QAAQ,MAAM,CAAC,SAAS,CAAC,KAAK,UAAU;AAC3C,MAAI,YAAY,KAAK,CAAE,WAAU,aAAa,KAAK,KAAK;MACnD,WAAU,IAAI,KAAK,KAA8B;GACxD;AAEF,QAAO;;;;;ACTX,MAAa,QAAQ,QAAgB,OAAmC;CACpE,MAAM,YAAY,IAAI,UAAU;AAEhC,WAAU,OAAO,GAAG,MAAM;AAE1B,QAAO;;;;;ACNX,MAAa,aAAgD;AAGzD,QAFkB,IAAI,UAAa;;;;;;;;;;;;;;;;;ACOvC,MAAa,OAAO"}