@pluv/crdt-loro 5.0.0 → 5.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser.d.mts +18 -22
- package/dist/browser.d.mts.map +1 -1
- package/dist/browser.mjs +26 -30
- package/dist/browser.mjs.map +1 -1
- package/dist/bundler.mjs +25 -43
- package/dist/bundler.mjs.map +1 -1
- package/dist/node.mjs +25 -43
- package/dist/node.mjs.map +1 -1
- package/dist/rolldown-runtime-D7D4PA-g.mjs +13 -0
- package/package.json +14 -11
- package/.turbo/turbo-build.log +0 -39
- package/CHANGELOG.md +0 -1034
- package/dist/rolldown-runtime-BBjsoOtd.mjs +0 -27
- package/eslint.config.mjs +0 -4
- package/src/counter.ts +0 -8
- package/src/doc/CrdtLoroDoc.ts +0 -259
- package/src/doc/CrdtLoroDocFactory.ts +0 -33
- package/src/doc/builder.ts +0 -70
- package/src/doc/doc.ts +0 -9
- package/src/doc/index.ts +0 -4
- package/src/index.ts +0 -5
- package/src/list.ts +0 -16
- package/src/loro-runtime.browser.ts +0 -1
- package/src/loro-runtime.bundler.ts +0 -1
- package/src/loro-runtime.node.ts +0 -1
- package/src/loro.ts +0 -11
- package/src/map.ts +0 -16
- package/src/movableList.ts +0 -14
- package/src/object.ts +0 -14
- package/src/text.ts +0 -10
- package/src/tree.ts +0 -7
- package/src/types.ts +0 -7
- package/src/utils/index.ts +0 -1
- package/src/utils/oneLine.ts +0 -7
- package/tsconfig.bundler.build.json +0 -8
- package/tsconfig.json +0 -11
- package/tsconfig.node.build.json +0 -8
- package/tsdown.browser.config.ts +0 -14
- package/tsdown.bundler.config.ts +0 -15
- package/tsdown.config.ts +0 -5
- package/tsdown.node.config.ts +0 -15
package/dist/bundler.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundler.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.bundler.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/bundler\";\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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACGA,MAAa,gBAA6B;CAGtC,OAAO,IAFaA,6BAAAA,YAEP;AACjB;;;ACOA,MAAa,WAAW,QAAiB;CACrC,OAAO;EACH,QAAQ,MAA2B;GAC/B,OAAO,IAAI,WAAW,IAAI;EAC9B;EACA,KACI,MACA,QAA4B,CAAC,GACH;GAC1B,MAAM,OAAO,IAAI,QAAQ,IAAI;GAE7B,MAAM,SAAS,MAAM,MAAM;IACvB,KAAA,GAAA,6BAAA,YAAA,CAAgB,IAAI,GAAG,KAAK,gBAAgB,GAAG,IAAI;SAC9C,KAAK,OAAO,GAAG,IAA6B;GACrD,CAAC;GAED,OAAO;EACX;EACA,IACI,MACA,QAAW,CAAC,GACW;GACvB,MAAM,YAAY,IAAI,OAAO,IAAI;GAEjC,OAAO,QAAQ,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,UAAU;IAC3C,KAAA,GAAA,6BAAA,YAAA,CAAgB,IAAI,GAAG,UAAU,aAAa,KAAK,IAAI;SAClD,UAAU,IAAI,KAAK,IAA6B;GACzD,CAAC;GAED,OAAO;EACX;EACA,aACI,MACA,QAA4B,CAAC,GACI;GACjC,MAAM,OAAO,IAAI,eAAe,IAAI;GAEpC,MAAM,SAAS,MAAM,MAAM;IACvB,KAAA,GAAA,6BAAA,YAAA,CAAgB,IAAI,GAAG,KAAK,gBAAgB,GAAG,IAAI;SAC9C,KAAK,OAAO,GAAG,IAA6B;GACrD,CAAC;GAED,OAAO;EACX;EACA,KAAK,MAAc,QAAgB,IAAgC;GAC/D,MAAM,OAAO,IAAI,QAAQ,IAAI;GAE7B,KAAK,OAAO,GAAG,KAAK;GAEpB,OAAO;EACX;EACA,KAAK,MAAc;GACf,OAAO,IAAI,QAAQ,IAAI;EAC3B;CACJ;AACJ;;;AC7CA,MAAM,iBAAiB;AACvB,MAAM,oBAAoB;AAC1B,MAAM,gBAAgB;AAMtB,IAAa,cAAb,MAE4C;CACxC,QAAwB,IAAIC,6BAAAA,QAAQ;CAEpC;CACA,gBAAoC;CAEpC,YAAY,gBAA6C,CAAC,IAAgB;EACtE,MAAM,UAAU,OAAO,QAAQ,KAAK,KAAK,CAAC;EAE1C,MAAM,OAAO,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC,CAAC,CAAC,QACzC,KAAK,QAAQ,IAAI,IAAI,GAAG,mBACzB,IAAI,IAAY,CACpB;EAEA,KAAKC,YAAY,OAAO,QAAQ,OAAO,CAAC,CAAC,QACpC,KAAK,CAAC,KAAK,UAAW,KAAK,IAAI,GAAG,IAAI;GAAE,GAAG;IAAM,MAAM;EAAK,IAAI,KACjE,CAAC,CACL;EACA,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC,QAAQ,KAAKC,YAAY;EAEpD,KAAK,MAAM,OAAO;CACtB;CAEA,kBAAyB,QAA0C;EAC/D,MAAM,SACF,OAAO,OAAO,WAAW,WAAW,aAAa,OAAO,MAAM,IAAI,OAAO;EAE7E,IAAI,CAAC,QAAQ,OAAO;EAEpB,KAAK,MAAM,OAAO,MAAM;EAExB,OAAO;CACX;CAEA,uBAA8B,QAA+C;EAGzE,MAAM,YAFU,OAAO,WAAW,CAAC,EAAA,CAEV,QAAsB,KAAK,WAAW;GAC3D,IAAI,CAAC,QAAQ,OAAO;GAEpB,IAAI,OAAO,WAAW,UAAU;IAC5B,IAAI,KAAK,aAAa,MAAM,CAAC;IAC7B,OAAO;GACX;GAEA,IAAI,OAAO,WAAW,UAAU;IAC5B,IAAI,KAAK,MAAM;IACf,OAAO;GACX;GAEA,OAAO;EACX,GAAG,CAAC,CAAC;EAEL,IAAI,CAAC,SAAS,QAAQ,OAAO;EAE7B,IAAI,SAAS,WAAW,GAAG;GACvB,MAAM,SAAS,SAAS,MAAM;GAE9B,IAAI,CAAC,CAAC,QAAQ,KAAK,MAAM,OAAO,MAAM;GAEtC,OAAO;EACX;EAEA,KAAK,MAAM,YAAY,QAAQ;EAE/B,OAAO;CACX;CAEA,UAA0B;EACtB,IAAI,CAAC,KAAKC,eAAe,OAAO;EAEhC,OAAO,KAAKA,cAAc,QAAQ;CACtC;CAEA,UAA0B;EACtB,IAAI,CAAC,KAAKA,eAAe,OAAO;EAEhC,OAAO,KAAKA,cAAc,QAAQ;CACtC;CAEA,UAAuB,CAEvB;CAIA,IAAwC,KAAuC;EAC3E,IAAI,OAAO,QAAQ,aAAa,OAAO,KAAKF;EAE5C,OAAO,KAAKA,UAAU;CAC1B;CAEA,kBAAiC;EAC7B,OAAO,eAAe,KAAK,MAAM,OAAO,EAAE,MAAM,WAAW,CAAC,CAAC;CACjE;CAIA,OAA2C,MAAa;EACpD,IAAI,OAAO,SAAS,UAAU;GAC1B,MAAM,YAAY,KAAKA,UAAU;GAEjC,OAAO,qBAAqBG,6BAAAA,WACtB,UAAU,SAAS,IACnB,qBAAqBC,6BAAAA,cACnB,UAAU,QACV,UAAU,OAAQ;EAC9B;EAEA,OAAO,OAAO,QAAQ,KAAKJ,SAAS,CAAC,CAAC,QACjC,KAAK,CAAC,KAAK,YAAY;GACpB,GAAI;IACH,MAAM,iBAAiBG,6BAAAA,WAAW,MAAM,SAAS,IAAI,MAAM,OAAQ;EACxE,IACA,CAAC,CACL;CACJ;CAEA,UAA0B;EACtB,MAAM,aAAa,KAAK,MAAM,OAAO;EAErC,OAAO,CAAC,cAAc,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC;CACnD;CAEA,eAAsB,WAA2B;EAG7C,IAAI,CAFa,CAAC,OAAO,KAAK,KAAKH,SAAS,CAAC,CAAC,QAEjC;GACT,QAAQ,KAAK,6CAA6C;GAC1D,OAAO;EACX;EAEA,KAAKA,YAAY,OAAO,QAAQ,SAAS,CAAC,CAAC,QAAQ,KAAK,CAAC,KAAK,UAAU;GACpE,IAAI,gBAAgBI,6BAAAA,aAAa,OAAO;IAAE,GAAG;KAAM,MAAM,KAAK,MAAM,WAAW,GAAG;GAAE;GACpF,IAAI,gBAAgBC,6BAAAA,UAAU,OAAO;IAAE,GAAG;KAAM,MAAM,KAAK,MAAM,QAAQ,GAAG;GAAE;GAC9E,IAAI,gBAAgBC,6BAAAA,SAAS,OAAO;IAAE,GAAG;KAAM,MAAM,KAAK,MAAM,OAAO,GAAG;GAAE;GAC5E,IAAI,gBAAgBC,6BAAAA,iBAChB,OAAO;IAAE,GAAG;KAAM,MAAM,KAAK,MAAM,eAAe,GAAG;GAAE;GAE3D,IAAI,gBAAgBJ,6BAAAA,UAAU,OAAO;IAAE,GAAG;KAAM,MAAM,KAAK,MAAM,QAAQ,GAAG;GAAE;GAC9E,IAAI,gBAAgBK,6BAAAA,UAAU,OAAO;IAAE,GAAG;KAAM,MAAM,KAAK,MAAM,QAAQ,GAAG;GAAE;GAE9E,OAAO;EACX,GAAG,CAAC,CAAa;EAEjB,OAAO,KAAK,MAAM;CACtB;CAEA,OAAoB;EAChB,KAAKN,eAAe,KAAK;EAEzB,OAAO;CACX;CAEA,UACI,UACU;EACV,MAAM,MAAM,UAA0B;GAClC,MAAM,SAAS,eAAe,KAAK,MAAM,OAAO,EAAE,MAAM,SAAS,CAAC,CAAC;GAEnE,SAAS;IACL,KAAK;IACL,OAAO,MAAM,OAAO;IACpB,QAAQ,MAAM,SAAS,OAAO,MAAM,MAAM,IAAI;IAC9C;GACJ,CAAC;EACL;EAeA,OAbsB,OAAO,OAAO,KAAKF,SAAS,CAAC,CAAC,QAC/C,KAAK,aAAa;GAEf,MAAM,cAAcS,SAAU,UAAU,EAAE;GAE1C,aAAa;IACT,IAAI;IACJ,YAAY;GAChB;EACJ,SACM,KAAA,CAGS;CACvB;CAEA,QAAqB;EACjB,IAAI,KAAKP,eAAe;GACpB,KAAKA,cAAc,MAAM;GACzB,KAAKA,cAAc,KAAK;GAExB,KAAKA,gBAAgB;EACzB;EAEA,KAAKA,gBAAgB,IAAIQ,6BAAAA,YAAY,KAAK,OAAO;GAC7C,cAAc;GACd,eAAe;EACnB,CAAC;EAED,OAAO;CACX;;;;;CAMA,SAAgB,IAAsB;EAClC,GAAG;EAEH,KAAK,MAAM,OAAO;EAElB,OAAO;CACX;CAEA,OAAoB;EAChB,KAAKR,eAAe,KAAK;EAEzB,OAAO;CACX;CAEA,cAAc;EACV,MAAM,OAAO,KAAK,MAAM,QAAQ,aAAa;EAC7C,MAAM,KAAK,OAAO,WAAW,cAAc,OAAO,WAAW,IAAI,KAAK,OAAO,CAAC,CAAC,SAAS;EAExF,KAAK,OAAO,GAAG,EAAE;CACrB;AACJ;;;AC5PA,IAAa,qBAAb,MAAa,2BAEH,uBAA0C;CAChD;CAEA,YAAY,wBAA4D,CAAC,IAAgB;EACrF,MAAM,cAAc;EAEpB,KAAK,kBAAkB;CAC3B;CAEA,WAAyC;EACrC,OAAO,IAAI,YAAsB;CACrC;CAEA,WACI,gBAC4B;EAC5B,OAAO,IAAI,mBAA6B,kBAAkB,KAAK,eAAe;CAClF;CAEA,eACI,gBACqB;EACrB,OAAO,IAAI,YAAsB,kBAAkB,KAAK,eAAe;CAC3E;AACJ;;;AC5BA,MAAa,OACT,eAAmD,CAAC,OACrB;CAC/B,OAAO,IAAI,mBAA6B,KAAK;AACjD;;;ACJA,MAAa,QACT,QAA4B,CAAC,MACA;CAC7B,MAAM,YAAY,IAAIS,6BAAAA,SAAS;CAE/B,MAAM,SAAS,MAAM,MAAM;EACvB,KAAA,GAAA,6BAAA,YAAA,CAAgB,IAAI,GAAG,UAAU,gBAAgB,GAAG,IAAI;OACnD,UAAU,OAAO,GAAG,IAA6B;CAC1D,CAAC;CAED,OAAO;AACX;;;ACXA,MAAa,OACT,QAAuD,CAAC,MACE;CAC1D,MAAM,YAAY,IAAIC,6BAAAA,QAAQ;CAE9B,MAAM,SAAS,CAAC,KAAK,UAAU;EAC3B,KAAA,GAAA,6BAAA,YAAA,CAAgB,IAAI,GAAG,UAAU,aAAa,KAAK,IAAI;OAClD,UAAU,IAAI,KAAK,IAA6B;CACzD,CAAC;CAED,OAAO;AACX;;;ACXA,MAAa,eAAkC,QAA4B,CAAC,MAAM;CAC9E,MAAM,YAAY,IAAIC,6BAAAA,gBAAgB;CAEtC,MAAM,SAAS,MAAM,MAAM;EACvB,KAAA,GAAA,6BAAA,YAAA,CAAgB,IAAI,GAAG,UAAU,gBAAgB,GAAG,IAAI;OACnD,UAAU,OAAO,GAAG,IAA6B;CAC1D,CAAC;CAED,OAAO;AACX;;;ACTA,MAAa,UAAyC,UAAsC;CACxF,MAAM,YAAY,IAAIC,6BAAAA,QAAQ;CAE9B,OAAO,QAAQ,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,UAAU;EAC3C,KAAA,GAAA,6BAAA,YAAA,CAAgB,IAAI,GAAG,UAAU,aAAa,KAAK,IAAI;OAClD,UAAU,IAAI,KAAK,IAA6B;CACzD,CAAC;CAED,OAAO;AACX;;;ACVA,MAAa,QAAQ,QAAgB,OAAmC;CACpE,MAAM,YAAY,IAAIC,6BAAAA,SAAS;CAE/B,UAAU,OAAO,GAAG,KAAK;CAEzB,OAAO;AACX;;;ACPA,MAAa,aAAgD;CAGzD,OAAO,IAFeC,6BAAAA,SAEP;AACnB;;;;;;;;;;;;;;;ACIA,MAAa,OAAO"}
|
|
1
|
+
{"version":3,"file":"bundler.mjs","names":["#_storage","#_setPluvId","#_undoManager","container"],"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<\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-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":"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"}
|
package/dist/node.mjs
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
+
import { LoroCounter, LoroDoc, LoroList, LoroMap, LoroMovableList, LoroText, LoroTree, UndoManager, isContainer } from "loro-crdt/nodejs";
|
|
1
2
|
import { fromUint8Array, toUint8Array } from "js-base64";
|
|
2
3
|
import { AbstractCrdtDocFactory } from "@pluv/crdt";
|
|
3
4
|
//#region \0rolldown/runtime.js
|
|
4
5
|
var __defProp = Object.defineProperty;
|
|
5
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
6
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
6
|
var __exportAll = (all, no_symbols) => {
|
|
9
7
|
let target = {};
|
|
10
8
|
for (var name in all) __defProp(target, name, {
|
|
@@ -14,26 +12,10 @@ var __exportAll = (all, no_symbols) => {
|
|
|
14
12
|
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
15
13
|
return target;
|
|
16
14
|
};
|
|
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
15
|
//#endregion
|
|
34
16
|
//#region src/counter.ts
|
|
35
17
|
const counter = () => {
|
|
36
|
-
return new
|
|
18
|
+
return new LoroCounter();
|
|
37
19
|
};
|
|
38
20
|
//#endregion
|
|
39
21
|
//#region src/doc/builder.ts
|
|
@@ -45,7 +27,7 @@ const builder = (doc) => {
|
|
|
45
27
|
list(name, value = []) {
|
|
46
28
|
const list = doc.getList(name);
|
|
47
29
|
value.forEach((item, i) => {
|
|
48
|
-
if (
|
|
30
|
+
if (isContainer(item)) list.insertContainer(i, item);
|
|
49
31
|
else list.insert(i, item);
|
|
50
32
|
});
|
|
51
33
|
return list;
|
|
@@ -53,7 +35,7 @@ const builder = (doc) => {
|
|
|
53
35
|
map(name, value = {}) {
|
|
54
36
|
const container = doc.getMap(name);
|
|
55
37
|
Object.entries(value).forEach(([key, item]) => {
|
|
56
|
-
if (
|
|
38
|
+
if (isContainer(item)) container.setContainer(key, item);
|
|
57
39
|
else container.set(key, item);
|
|
58
40
|
});
|
|
59
41
|
return container;
|
|
@@ -61,7 +43,7 @@ const builder = (doc) => {
|
|
|
61
43
|
moveableList(name, value = []) {
|
|
62
44
|
const list = doc.getMovableList(name);
|
|
63
45
|
value.forEach((item, i) => {
|
|
64
|
-
if (
|
|
46
|
+
if (isContainer(item)) list.insertContainer(i, item);
|
|
65
47
|
else list.insert(i, item);
|
|
66
48
|
});
|
|
67
49
|
return list;
|
|
@@ -82,7 +64,7 @@ const MAX_UNDO_STEPS = 100;
|
|
|
82
64
|
const MERGE_INTERVAL_MS = 1e3;
|
|
83
65
|
const PLUV_ID_FIELD = "__$pluv";
|
|
84
66
|
var CrdtLoroDoc = class {
|
|
85
|
-
value = new
|
|
67
|
+
value = new LoroDoc();
|
|
86
68
|
#_storage;
|
|
87
69
|
#_undoManager = null;
|
|
88
70
|
constructor(params = () => ({})) {
|
|
@@ -142,11 +124,11 @@ var CrdtLoroDoc = class {
|
|
|
142
124
|
toJson(type) {
|
|
143
125
|
if (typeof type === "string") {
|
|
144
126
|
const container = this.#_storage[type];
|
|
145
|
-
return container instanceof
|
|
127
|
+
return container instanceof LoroText ? container.toString() : container instanceof LoroCounter ? container.value : container.toJSON();
|
|
146
128
|
}
|
|
147
129
|
return Object.entries(this.#_storage).reduce((acc, [key, value]) => ({
|
|
148
130
|
...acc,
|
|
149
|
-
[key]: value instanceof
|
|
131
|
+
[key]: value instanceof LoroText ? value.toString() : value.toJSON()
|
|
150
132
|
}), {});
|
|
151
133
|
}
|
|
152
134
|
isEmpty() {
|
|
@@ -159,27 +141,27 @@ var CrdtLoroDoc = class {
|
|
|
159
141
|
return this;
|
|
160
142
|
}
|
|
161
143
|
this.#_storage = Object.entries(reference).reduce((acc, [key, node]) => {
|
|
162
|
-
if (node instanceof
|
|
144
|
+
if (node instanceof LoroCounter) return {
|
|
163
145
|
...acc,
|
|
164
146
|
[key]: this.value.getCounter(key)
|
|
165
147
|
};
|
|
166
|
-
if (node instanceof
|
|
148
|
+
if (node instanceof LoroList) return {
|
|
167
149
|
...acc,
|
|
168
150
|
[key]: this.value.getList(key)
|
|
169
151
|
};
|
|
170
|
-
if (node instanceof
|
|
152
|
+
if (node instanceof LoroMap) return {
|
|
171
153
|
...acc,
|
|
172
154
|
[key]: this.value.getMap(key)
|
|
173
155
|
};
|
|
174
|
-
if (node instanceof
|
|
156
|
+
if (node instanceof LoroMovableList) return {
|
|
175
157
|
...acc,
|
|
176
158
|
[key]: this.value.getMovableList(key)
|
|
177
159
|
};
|
|
178
|
-
if (node instanceof
|
|
160
|
+
if (node instanceof LoroText) return {
|
|
179
161
|
...acc,
|
|
180
162
|
[key]: this.value.getText(key)
|
|
181
163
|
};
|
|
182
|
-
if (node instanceof
|
|
164
|
+
if (node instanceof LoroTree) return {
|
|
183
165
|
...acc,
|
|
184
166
|
[key]: this.value.getTree(key)
|
|
185
167
|
};
|
|
@@ -215,7 +197,7 @@ var CrdtLoroDoc = class {
|
|
|
215
197
|
this.#_undoManager.free();
|
|
216
198
|
this.#_undoManager = null;
|
|
217
199
|
}
|
|
218
|
-
this.#_undoManager = new
|
|
200
|
+
this.#_undoManager = new UndoManager(this.value, {
|
|
219
201
|
maxUndoSteps: MAX_UNDO_STEPS,
|
|
220
202
|
mergeInterval: MERGE_INTERVAL_MS
|
|
221
203
|
});
|
|
@@ -266,9 +248,9 @@ const doc = (value = () => ({})) => {
|
|
|
266
248
|
//#endregion
|
|
267
249
|
//#region src/list.ts
|
|
268
250
|
const list = (value = []) => {
|
|
269
|
-
const container = new
|
|
251
|
+
const container = new LoroList();
|
|
270
252
|
value.forEach((item, i) => {
|
|
271
|
-
if (
|
|
253
|
+
if (isContainer(item)) container.insertContainer(i, item);
|
|
272
254
|
else container.insert(i, item);
|
|
273
255
|
});
|
|
274
256
|
return container;
|
|
@@ -276,9 +258,9 @@ const list = (value = []) => {
|
|
|
276
258
|
//#endregion
|
|
277
259
|
//#region src/map.ts
|
|
278
260
|
const map = (value = []) => {
|
|
279
|
-
const container = new
|
|
261
|
+
const container = new LoroMap();
|
|
280
262
|
value.forEach(([key, item]) => {
|
|
281
|
-
if (
|
|
263
|
+
if (isContainer(item)) container.setContainer(key, item);
|
|
282
264
|
else container.set(key, item);
|
|
283
265
|
});
|
|
284
266
|
return container;
|
|
@@ -286,9 +268,9 @@ const map = (value = []) => {
|
|
|
286
268
|
//#endregion
|
|
287
269
|
//#region src/movableList.ts
|
|
288
270
|
const movableList = (value = []) => {
|
|
289
|
-
const container = new
|
|
271
|
+
const container = new LoroMovableList();
|
|
290
272
|
value.forEach((item, i) => {
|
|
291
|
-
if (
|
|
273
|
+
if (isContainer(item)) container.insertContainer(i, item);
|
|
292
274
|
else container.insert(i, item);
|
|
293
275
|
});
|
|
294
276
|
return container;
|
|
@@ -296,9 +278,9 @@ const movableList = (value = []) => {
|
|
|
296
278
|
//#endregion
|
|
297
279
|
//#region src/object.ts
|
|
298
280
|
const object = (value) => {
|
|
299
|
-
const container = new
|
|
281
|
+
const container = new LoroMap();
|
|
300
282
|
Object.entries(value).forEach(([key, item]) => {
|
|
301
|
-
if (
|
|
283
|
+
if (isContainer(item)) container.setContainer(key, item);
|
|
302
284
|
else container.set(key, item);
|
|
303
285
|
});
|
|
304
286
|
return container;
|
|
@@ -306,14 +288,14 @@ const object = (value) => {
|
|
|
306
288
|
//#endregion
|
|
307
289
|
//#region src/text.ts
|
|
308
290
|
const text = (value = "") => {
|
|
309
|
-
const container = new
|
|
291
|
+
const container = new LoroText();
|
|
310
292
|
container.insert(0, value);
|
|
311
293
|
return container;
|
|
312
294
|
};
|
|
313
295
|
//#endregion
|
|
314
296
|
//#region src/tree.ts
|
|
315
297
|
const tree = () => {
|
|
316
|
-
return new
|
|
298
|
+
return new LoroTree();
|
|
317
299
|
};
|
|
318
300
|
//#endregion
|
|
319
301
|
//#region src/loro.ts
|
package/dist/node.mjs.map
CHANGED
|
@@ -1 +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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"}
|
|
1
|
+
{"version":3,"file":"node.mjs","names":["#_storage","#_setPluvId","#_undoManager","container"],"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<\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-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":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
//#region \0rolldown/runtime.js
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __exportAll = (all, no_symbols) => {
|
|
4
|
+
let target = {};
|
|
5
|
+
for (var name in all) __defProp(target, name, {
|
|
6
|
+
get: all[name],
|
|
7
|
+
enumerable: true
|
|
8
|
+
});
|
|
9
|
+
if (!no_symbols) __defProp(target, Symbol.toStringTag, { value: "Module" });
|
|
10
|
+
return target;
|
|
11
|
+
};
|
|
12
|
+
//#endregion
|
|
13
|
+
export { __exportAll as t };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pluv/crdt-loro",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.2",
|
|
4
4
|
"description": "loro for @pluv/io",
|
|
5
5
|
"author": {
|
|
6
6
|
"email": "david@pluv.io",
|
|
@@ -16,25 +16,28 @@
|
|
|
16
16
|
},
|
|
17
17
|
"type": "module",
|
|
18
18
|
"types": "./dist/browser.d.mts",
|
|
19
|
+
"files": [
|
|
20
|
+
"dist"
|
|
21
|
+
],
|
|
19
22
|
"publishConfig": {
|
|
20
23
|
"access": "public"
|
|
21
24
|
},
|
|
22
25
|
"dependencies": {
|
|
23
|
-
"@
|
|
24
|
-
"
|
|
25
|
-
"@
|
|
26
|
-
"
|
|
26
|
+
"@pluv/crdt": "^5.0.2",
|
|
27
|
+
"@pluv/types": "^5.0.2",
|
|
28
|
+
"@types/node": "^26.2.0",
|
|
29
|
+
"js-base64": "^3.9.3"
|
|
27
30
|
},
|
|
28
31
|
"peerDependencies": {
|
|
29
32
|
"loro-crdt": "^1.0.0"
|
|
30
33
|
},
|
|
31
34
|
"devDependencies": {
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
35
|
+
"@pluv/tsconfig": "^5.0.2",
|
|
36
|
+
"eslint": "^10.9.0",
|
|
37
|
+
"eslint-config-pluv": "^5.0.2",
|
|
38
|
+
"loro-crdt": "^1.14.1",
|
|
39
|
+
"tsdown": "0.22.14",
|
|
40
|
+
"typescript": "^5.9.3"
|
|
38
41
|
},
|
|
39
42
|
"exports": {
|
|
40
43
|
".": {
|
package/.turbo/turbo-build.log
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
$ tsdown --config tsdown.browser.config.ts && tsdown --config tsdown.bundler.config.ts && tsdown --config tsdown.node.config.ts
|
|
2
|
-
[34mℹ[39m [34mtsdown v0.22.3[39m powered by [38;2;255;126;23mrolldown v1.1.2[39m
|
|
3
|
-
[34mℹ[39m config file: [4m/home/runner/work/pluv/pluv/packages/crdt-loro/tsdown.browser.config.ts[24m
|
|
4
|
-
[34mℹ[39m entry: [34msrc/index.ts[39m
|
|
5
|
-
[34mℹ[39m target: [34mesnext[39m
|
|
6
|
-
[34mℹ[39m tsconfig: [34mtsconfig.json[39m
|
|
7
|
-
[34mℹ[39m Build start
|
|
8
|
-
[34mℹ[39m [2mdist/[22m[1mbrowser.mjs[22m [2m 8.99 kB[22m [2m│ gzip: 2.27 kB[22m
|
|
9
|
-
[34mℹ[39m [2mdist/[22mbrowser.mjs.map [2m21.63 kB[22m [2m│ gzip: 4.93 kB[22m
|
|
10
|
-
[34mℹ[39m [2mdist/[22mbrowser.d.mts.map [2m 2.70 kB[22m [2m│ gzip: 0.91 kB[22m
|
|
11
|
-
[34mℹ[39m [2mdist/[22mrolldown-runtime-BBjsoOtd.mjs [2m 1.11 kB[22m [2m│ gzip: 0.54 kB[22m
|
|
12
|
-
[34mℹ[39m [2mdist/[22m[32m[1mbrowser.d.mts[22m[39m [2m 4.88 kB[22m [2m│ gzip: 1.30 kB[22m
|
|
13
|
-
[34mℹ[39m 5 files, total: 39.31 kB
|
|
14
|
-
[33m[PLUGIN_TIMINGS] [0mYour build spent significant time in plugins. Here is a breakdown:
|
|
15
|
-
- rolldown-plugin-dts:generate (55%)
|
|
16
|
-
- tsdown:deps (25%)
|
|
17
|
-
See https://rolldown.rs/reference/InputOptions.checks#plugintimings for more details.
|
|
18
|
-
|
|
19
|
-
[32m✔[39m Build complete in [32m3294ms[39m
|
|
20
|
-
[34mℹ[39m [34mtsdown v0.22.3[39m powered by [38;2;255;126;23mrolldown v1.1.2[39m
|
|
21
|
-
[34mℹ[39m config file: [4m/home/runner/work/pluv/pluv/packages/crdt-loro/tsdown.bundler.config.ts[24m
|
|
22
|
-
[34mℹ[39m entry: [34msrc/index.ts[39m
|
|
23
|
-
[34mℹ[39m target: [34mesnext[39m
|
|
24
|
-
[34mℹ[39m tsconfig: [34mtsconfig.bundler.build.json[39m
|
|
25
|
-
[34mℹ[39m Build start
|
|
26
|
-
[34mℹ[39m [2mdist/[22m[1mbundler.mjs[22m [2m10.00 kB[22m [2m│ gzip: 2.65 kB[22m
|
|
27
|
-
[34mℹ[39m [2mdist/[22mbundler.mjs.map [2m21.66 kB[22m [2m│ gzip: 4.93 kB[22m
|
|
28
|
-
[34mℹ[39m 2 files, total: 31.66 kB
|
|
29
|
-
[32m✔[39m Build complete in [32m127ms[39m
|
|
30
|
-
[34mℹ[39m [34mtsdown v0.22.3[39m powered by [38;2;255;126;23mrolldown v1.1.2[39m
|
|
31
|
-
[34mℹ[39m config file: [4m/home/runner/work/pluv/pluv/packages/crdt-loro/tsdown.node.config.ts[24m
|
|
32
|
-
[34mℹ[39m entry: [34msrc/index.ts[39m
|
|
33
|
-
[34mℹ[39m target: [34mesnext[39m
|
|
34
|
-
[34mℹ[39m tsconfig: [34mtsconfig.node.build.json[39m
|
|
35
|
-
[34mℹ[39m Build start
|
|
36
|
-
[34mℹ[39m [2mdist/[22m[1mnode.mjs[22m [2m 9.91 kB[22m [2m│ gzip: 2.65 kB[22m
|
|
37
|
-
[34mℹ[39m [2mdist/[22mnode.mjs.map [2m21.66 kB[22m [2m│ gzip: 4.93 kB[22m
|
|
38
|
-
[34mℹ[39m 2 files, total: 31.56 kB
|
|
39
|
-
[32m✔[39m Build complete in [32m73ms[39m
|