UNPKG

dop

Version:
1,145 lines (981 loc) 34.2 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); // https://stackoverflow.com/questions/27433075/using-a-for-each-loop-on-an-empty-array-in-javascript function forEach(object, callback) { if (isArray(object)) { for (var prop = 0; prop < object.length; ++prop) { callback(object[prop], prop); } } else { for (var prop$1 in object) { callback(object[prop$1], prop$1); } } } function forEachDeep(object, callback, path) { if ( path === void 0 ) path = []; forEach(object, function (value_origin, prop) { path.push(prop); if ( callback({ object: object, prop: prop, path: path.slice(0) }) && isObject(value_origin) ) { forEachDeep(value_origin, callback, path); } path.pop(); }); } // https://jsperf.com/merge-challenge function merge(target, patch) { var args = arguments; if (args.length > 2) { // Remove the target 2 arguments of the arguments and add thoose arguments as merged at the begining Array.prototype.splice.call(args, 0, 2, merge.call(this, target, patch)); // Recursion return merge.apply(this, args) } else if (patch === target) { return target } else { mergeCore(patch, target, mergeMutator); return target } } // https://jsperf.com/dop-foreachobject // https://2ality.com/2019/10/shared-mutable-state.html function mergeCore(patch, target_root, mutator) { forEachDeep(patch, function (ref) { var object = ref.object; var prop = ref.prop; var path = ref.path; var target = getDeep(target_root, path.slice(0, path.length - 1)); var output = mutator({ patch: object, target: target, prop: prop, path: path }); return output !== false }); } function mergeMutator(ref) { var patch = ref.patch; var target = ref.target; var prop = ref.prop; var origin_value = patch[prop]; var destiny_value = target[prop]; var tof_origin = is(origin_value); var tof_destiny = is(destiny_value); if (isPlain(origin_value)) { if (!target.hasOwnProperty(prop) || tof_origin != tof_destiny) { target[prop] = tof_origin == 'array' ? [] : {}; } } else { target[prop] = origin_value; return false // we dont go deeper } } function converter(patch, params, converters) { var patch_root = { '': patch }; // a trick to allow top level var target_root = { '': isArray(patch) ? [] : {} }; // a trick to allow top level mergeCore(patch_root, target_root, function (ref) { var patch = ref.patch; var prop = ref.prop; var target = ref.target; var path = ref.path; var value = converters.reduce( function (value, converter) { return converter( merge( { value: value, patch: patch, target: target, prop: prop, path: path, }, params ) ); }, patch[prop] ); if (patch[prop] !== value) { target[prop] = value; return false // we don't go deeper } else { return mergeMutator({ patch: patch, target: target, prop: prop }) } }); return target_root[''] } function getUniqueKey(object) { var key_name; for (var key in object) { if (key_name !== undefined) { return } key_name = key; } return key_name } function getDeep(object, path) { var prop = path[0]; if (path.length === 0) { return object } if (isObject(object) && object.hasOwnProperty(prop)) { return getDeep(object[prop], path.slice(1)) } } function setDeep(object, path, value) { path = path.slice(0); var prop = path.shift(); if (path.length === 0) { object[prop] = value; return } if (!object.hasOwnProperty(prop)) { object[prop] = {}; } return setDeep(object[prop], path, value) } var ESCAPE_KEY = '$escape'; var RPC_KEY = '$r'; var DELETE_KEY = '$d'; var REPLACE_KEY = '$e'; var SPLICE_KEY = '$s'; var SWAP_KEY = '$w'; var MULTI_KEY = '$m'; var RPC_CREATOR = { ENTRY: 'ENTRY', REQUEST: 'REQUEST', RESPONSE: 'RESPONSE', }; function is(value) { if (value === null) { return 'null' } if (isArray(value)) { return 'array' } return typeof value } function isFunction(fn) { return typeof fn == 'function' } function isArray(array) { return Array.isArray(array) } function isObject(object) { return object !== null && typeof object == 'object' } function isPlain(object) { if (!isObject(object)) { return false } var prototype = Object.getPrototypeOf(object); return prototype === Object.prototype || prototype === Array.prototype } function isPlainObject(object) { if (!isObject(object)) { return false } return Object.getPrototypeOf(object) === Object.prototype } function isInteger(number) { return ( typeof number === 'number' && isFinite(number) && Math.floor(number) === number ) } // export function isProxy(object) { // if (typeof Proxy !== 'function') { // return false // } // try { // object instanceof Proxy // return false // } catch (e) { // return true // } // } function isValidToDecode(ref) { var value = ref.value; var key = ref.key; return getUniqueKey(value) === key && value.hasOwnProperty(key) } function isValidToEscape(ref) { var value = ref.value; return getUniqueKey(value) === ESCAPE_KEY } function producePatch(baseobject, callback) { var draft = {}; var mutations = []; var storing = false; forEachDeep({ draft: baseobject }, function (ref) { var object = ref.object; var prop = ref.prop; var path = ref.path; var origin = object; var destiny = getDeep(draft, path.slice(0, path.length - 1)); var origin_value = origin[prop]; var destiny_value = destiny[prop]; var tof_origin = is(origin_value); var tof_destiny = is(destiny_value); if ( isPlain(origin_value) && (!destiny.hasOwnProperty(prop) || tof_origin != tof_destiny) ) { destiny[prop] = new Proxy(tof_origin == 'array' ? [] : {}, { set: function (object, prop, value) { if (storing) { mutations.push([ path.slice(1).concat(prop), isPlainObject(value) //&& isPlainObject(object[prop]) ? TYPE.Replace(value) : value ]); } object[prop] = value; return true }, deleteProperty: function (object, prop) { if (storing) { mutations.push([ path.slice(1).concat(prop), TYPE.Delete() ]); } delete object[prop]; return true }, }); return true } else { destiny[prop] = origin_value; return false // we dont go deeper } }); storing = true; callback(draft.draft); storing = false; var patch = createPatchFromMutations(mutations); return { patch: patch, mutations: mutations } } function createPatchFromMutations(mutations) { var patch = {}; mutations.forEach(function (mutation) { return setDeep(patch, mutation[0], mutation[1]); }); return patch } function createPatchAndUnpatchFromMutations(mutations, object) { var patch = {}; var unpatch = {}; mutations.forEach(function (ref) { var path = ref.path; var old_value = ref.old_value; setDeep(patch, path, getDeep(object, path)); setDeep(unpatch, path, old_value); }); return { patch: patch, unpatch: unpatch } } function localProcedureCall(fn, req, args, errorInstances) { function reject(error) { // https://airbrake.io/blog/nodejs-error-handling/nodejs-error-class-hierarchy for (var index = 0; index < errorInstances.length; ++index) { if (error instanceof errorInstances[index]) { throw error } } req.reject(error); } try { var output = fn.apply(req, args); if (output !== req) { output instanceof Promise ? output.then(req.resolve).catch(reject) : req.resolve(output); } } catch (error) { reject(error); } } function createRequest() { var resolve; var reject; var promise = new Promise(function (res, rej) { resolve = res; reject = rej; }); promise.resolve = resolve; promise.reject = reject; return promise } // function Request(executor) { // let resolve // let reject // const promise = new Promise((res, rej) => { // resolve = res // reject = rej // // return executor(res, rej) // }) // promise.__proto__ = Request.prototype // promise.resolve = resolve // promise.reject = reject // return promise // } // Request.__proto__ = Promise // Request.prototype.__proto__ = Promise.prototype function createNodeFactory(ref) { var encode = ref.encode; var decode = ref.decode; return function createNode(ref) { if ( ref === void 0 ) ref = {}; var serialize = ref.serialize; if ( serialize === void 0 ) serialize = JSON.stringify; var deserialize = ref.deserialize; if ( deserialize === void 0 ) deserialize = JSON.parse; var rpcFilter = ref.rpcFilter; if ( rpcFilter === void 0 ) rpcFilter = function (props) { return props.rpc; }; var errorInstances = ref.errorInstances; if ( errorInstances === void 0 ) errorInstances = [Error]; var local_rpcs_id = {}; var local_rpcs = new Map(); var local_rpc_index = 1; // 0 is reserved for the entry function used in open() var requests = {}; var request_id_index = 0; var encode_params = { local_rpcs: local_rpcs, registerLocalRpcFromEncode: registerLocalRpcFromEncode, }; function registerRpc(function_id, fn) { local_rpcs_id[function_id] = fn; local_rpcs.set(fn, function_id); return function_id } function createRpc(function_id) { var makeCall = function (request_id, args) { var data = [request_id, function_id]; if (args.length > 0) { data.push(args); } node.send(encode(data, encode_params)); return data }; var rpc = function () { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; var request_id = ++request_id_index; var req = createRequest(); var resolve = req.resolve; var reject = req.reject; var resolveOrReject = function (fn, value) { fn(value); delete requests[request_id]; return req }; req.data = makeCall(request_id, args); req.node = node; req.createdAt = new Date().getTime(); req.resolve = function (value) { return resolveOrReject(resolve, value); }; req.reject = function (error) { return resolveOrReject(reject, error); }; requests[request_id] = req; return req }; rpc.push = function () { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; makeCall(0, args); }; return rpc } function createRemoteFunction(ref) { var function_id = ref.function_id; var function_creator = ref.function_creator; var caller = ref.caller; var path = ref.path; return rpcFilter({ rpc: createRpc(function_id), node: node, function_id: function_id, function_creator: function_creator, caller: caller, path: path, }) } function getNextLocalFunctionId() { while (local_rpcs_id.hasOwnProperty(local_rpc_index)) { local_rpc_index += 1; } return local_rpc_index } function open(send, fn) { var function_id = 0; if (isFunction(fn)) { registerRpc(function_id, fn); } node.send = function (msg) { return send(serialize(msg)); }; return createRemoteFunction({ function_id: function_id, function_creator: RPC_CREATOR.ENTRY, }) } function message(msg) { msg = deserialize(msg); if (!isArray(msg) || !isInteger(msg[0])) { return false } var id = msg[0]; var function_id = msg[1]; var is_request = id > -1; var fn = is_request ? local_rpcs_id[function_id] : undefined; msg = decode(msg, { createRemoteFunction: createRemoteFunction, caller: fn, function_creator: is_request ? RPC_CREATOR.REQUEST : RPC_CREATOR.RESPONSE, }); var args = msg[2]; var response_id = -id; if (is_request && isFunction(fn)) { args = isArray(msg[2]) ? msg[2] : []; // Request without response if (id === 0) { var req = { node: node }; args.push(req); fn.apply(req, args); } // Request else { var req$1 = createRequest(); var response = [response_id]; req$1.node = node; req$1.then(function (value) { response.push(0); // no errors if (value !== undefined) { response.push(value); } node.send(encode(response, encode_params)); }).catch(function (error) { response.push(error === 0 ? null : error); node.send(encode(response, encode_params)); }); args.push(req$1); localProcedureCall(fn, req$1, args, errorInstances); } return true } // Response else if (id < 0 && requests.hasOwnProperty(response_id)) { var response_status = function_id; var req$2 = requests[response_id]; response_status === 0 ? req$2.resolve(args) : req$2.reject(response_status); return true } return false } function registerLocalRpcFromEncode(fn) { return registerRpc(getNextLocalFunctionId(), fn) } var node = { open: open, message: message, requests: requests, registerRpc: registerRpc, createRpc: createRpc, }; return node } } function createStoreFactory(applyPatchFunction) { return function createStore(state) { var listeners = new Map(); function subscribe(listener, filter) { listeners.set(listener, filter); return function () { return unsubscribe(listener); } // This has become a kind of standard } function unsubscribe(listener) { listeners.delete(listener); } function applyPatch(patch_or_fn) { var applied = applyPatchFunction(api.state, patch_or_fn); var outputs = Array.from(listeners.entries()).map( function (ref) { var listener = ref[0]; var filter = ref[1]; var mutations = isFunction(filter) ? applied.mutations.filter(filter) : applied.mutations.slice(0); var ref$1 = createPatchAndUnpatchFromMutations( mutations, applied.patch ); var patch = ref$1.patch; var unpatch = ref$1.unpatch; return { listener: listener, patch: patch, unpatch: unpatch, mutations: mutations, } } ); outputs.mutations = applied.mutations; outputs.patch = applied.patch; outputs.unpatch = applied.unpatch; return outputs } var api = { state: state, listeners: listeners, subscribe: subscribe, unsubscribe: unsubscribe, applyPatch: applyPatch, }; return api } } function applyPatchFactory(patchers) { function applyPatch(target, patch_or_fn) { var patch = isFunction(patch_or_fn) ? producePatch(target, patch_or_fn).patch : patch_or_fn; return applyPatchRaw(target, patch) } function applyPatchRaw(target, patch) { var mutations = []; var target_root = { '': target }; // a trick to allow top level patches var patch_root = { '': patch }; // a trick to allow top level patches var unpatch_root = { '': {} }; function addMutation(target, prop, old_value, path) { mutations.push({ target: target, prop: prop, old_value: old_value, path: path, }); } mergeCore(patch_root, target_root, function (ref) { var patch = ref.patch; var target = ref.target; var prop = ref.prop; var path = ref.path; var patch_value = patch[prop]; var target_value = target[prop]; if ( !target.hasOwnProperty(prop) || (patch_value !== target_value && !(isPlainObject(patch_value) && isPlain(target_value))) ) { var length = target.length; // Applying patches var old_value = patchers.reduce( function (old_value, patcher) { return patcher({ patch: patch, target: target, prop: prop, old_value: old_value, applyPatch: applyPatch, }); }, target_value ); // We register the mutation if old_value is different to the new value if (target[prop] !== old_value) { addMutation(target, prop, old_value, path.slice(1)); if (target.length !== length) { addMutation( target, 'length', length, path.slice(1, path.length - 1).concat('length') ); } } return false // we don't go deeper } }); // Creating unpatch for (var index = mutations.length - 1; index >= 0; --index) { var ref = mutations[index]; var path = ref.path; var old_value = ref.old_value; setDeep(unpatch_root, [''].concat(path), old_value); } return { result: target_root[''], patch: patch, unpatch: unpatch_root[''], mutations: mutations, } } return applyPatch } function Delete() { if (!(this instanceof Delete)) { return new Delete() } } Delete.patch = function (ref) { var patch = ref.patch; var target = ref.target; var prop = ref.prop; var old_value = ref.old_value; if (patch[prop] instanceof Delete || patch[prop] === Delete) { delete target[prop]; } return old_value }; Delete.encode = function (ref) { var obj, obj$1; var value = ref.value; if (value instanceof Delete || value === Delete) { return ( obj = {}, obj[DELETE_KEY] = 0, obj ) } else if (isValidToDecodeDelete({ value: value })) { return ( obj$1 = {}, obj$1[ESCAPE_KEY] = value, obj$1 ) } return value }; Delete.decode = function (ref) { var value = ref.value; if (isValidToDecodeDelete({ value: value })) { return new Delete() } else if ( isValidToEscape({ value: value }) && isValidToDecodeDelete({ value: value[ESCAPE_KEY] }) ) { return value[ESCAPE_KEY] } return value }; function isValidToDecodeDelete(ref) { var value = ref.value; return getUniqueKey(value) === DELETE_KEY && value[DELETE_KEY] === 0 } function Replace(value) { if (!(this instanceof Replace)) { return new Replace(value) } this.value = value; } Replace.patch = function (ref) { var patch = ref.patch; var target = ref.target; var prop = ref.prop; var old_value = ref.old_value; if (patch[prop] instanceof Replace) { target[prop] = patch[prop].value; return old_value instanceof Delete ? old_value : new Replace(old_value) } return old_value }; Replace.encode = function (ref) { var obj, obj$1; var value = ref.value; var encode = ref.encode; if (value instanceof Replace) { return ( obj = {}, obj[REPLACE_KEY] = encode(value.value), obj ) } else if (isValidToDecode({ value: value, key: REPLACE_KEY })) { return ( obj$1 = {}, obj$1[ESCAPE_KEY] = value, obj$1 ) } return value }; Replace.decode = function (ref) { var value = ref.value; var decode = ref.decode; if (isValidToDecode({ value: value, key: REPLACE_KEY })) { return new Replace(decode(value[REPLACE_KEY])) } else if ( isValidToEscape({ value: value }) && isValidToDecode({ value: value[ESCAPE_KEY], key: REPLACE_KEY }) ) { return value[ESCAPE_KEY] } return value }; function Primitives() {} Primitives.patch = function (ref) { var patch = ref.patch; var target = ref.target; var prop = ref.prop; var old_value = ref.old_value; var applyPatch = ref.applyPatch; var patch_value = patch[prop]; // If target[prop] is not defined yet if (!target.hasOwnProperty(prop)) { old_value = new Delete(); } // New array if (isArray(patch_value)) { target[prop] = merge([], patch_value); if (isPlainObject(old_value)) { old_value = Replace(old_value); } } // Object as patch else if (isPlainObject(patch_value)) { target[prop] = applyPatch({}, patch_value).result; } // Any other else { target[prop] = patch_value; } return old_value }; function Rpc() {} Rpc.encode = function (ref) { var obj, obj$1; var value = ref.value; var local_rpcs = ref.local_rpcs; var registerLocalRpcFromEncode = ref.registerLocalRpcFromEncode; if (isFunction(value)) { var function_id = local_rpcs.has(value) ? local_rpcs.get(value) : registerLocalRpcFromEncode(value); return ( obj = {}, obj[RPC_KEY] = function_id, obj ) } else if (isValidToDecode({ value: value, key: RPC_KEY })) { return ( obj$1 = {}, obj$1[ESCAPE_KEY] = value, obj$1 ) } return value }; Rpc.decode = function (ref) { var value = ref.value; var createRemoteFunction = ref.createRemoteFunction; var path = ref.path; var caller = ref.caller; var function_creator = ref.function_creator; if (getUniqueKey(value) === RPC_KEY && isInteger(value[RPC_KEY])) { return createRemoteFunction({ function_id: value[RPC_KEY], function_creator: function_creator, caller: caller, path: path.slice(2), }) } else if ( isValidToEscape({ value: value }) && isValidToDecode({ value: value[ESCAPE_KEY], key: RPC_KEY }) ) { return value[ESCAPE_KEY] } return value }; function Splice() { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; if (!(this instanceof Splice)) { return new (Function.prototype.bind.apply( Splice, [ null ].concat( args) )) } this.args = args; } Splice.patch = function (ref) { var patch = ref.patch; var target = ref.target; var prop = ref.prop; var old_value = ref.old_value; var patch_value = patch[prop]; if (patch_value instanceof Splice) { target[prop] = old_value; if (isArray(old_value)) { var args = patch_value.args; if (args[0] < 0) { args[0] = old_value.length + args[0]; } var spliced = old_value.splice.apply(old_value, args); var inverted = [args[0], args.length - 2].concat(spliced); return Splice.apply(null, inverted) } } return old_value }; Splice.encode = function (ref) { var obj, obj$1; var value = ref.value; var encode = ref.encode; if (value instanceof Splice) { return ( obj = {}, obj[SPLICE_KEY] = encode(value.args), obj ) } else if (isValidToDecode$1({ value: value, key: SPLICE_KEY })) { return ( obj$1 = {}, obj$1[ESCAPE_KEY] = value, obj$1 ) } return value }; Splice.decode = function (ref) { var value = ref.value; var decode = ref.decode; if (isValidToDecode$1({ value: value, key: SPLICE_KEY })) { return Splice.apply(null, decode(value[SPLICE_KEY])) } else if ( isValidToEscape({ value: value }) && isValidToDecode$1({ value: value[ESCAPE_KEY], key: SPLICE_KEY }) ) { return value[ESCAPE_KEY] } return value }; function isValidToDecode$1(ref) { var value = ref.value; return getUniqueKey(value) === SPLICE_KEY && isArray(value[SPLICE_KEY]) } function Swap() { var args = [], len = arguments.length; while ( len-- ) args[ len ] = arguments[ len ]; if (!(this instanceof Swap)) { return new (Function.prototype.bind.apply( Swap, [ null ].concat( args) )) } this.args = args; } Swap.patch = function (ref) { var patch = ref.patch; var target = ref.target; var prop = ref.prop; var old_value = ref.old_value; var patch_value = patch[prop]; if (patch_value instanceof Swap) { target[prop] = old_value; if (isArray(old_value)) { var array = old_value; var swaps = patch_value.args; if (array.length > 0 && swaps.length > 1) { var total = swaps.length - 1; for (var index = 0; index < total; index += 2) { var swap_a = swaps[index]; var swap_b = swaps[index + 1]; var temp_item = array[swap_a]; array[swap_a] = array[swap_b]; array[swap_b] = temp_item; } return Swap.apply(null, swaps.slice(0).reverse()) } } } return old_value }; Swap.encode = function (ref) { var obj, obj$1; var value = ref.value; if (value instanceof Swap) { return ( obj = {}, obj[SWAP_KEY] = value.args, obj ) } else if (isValidToDecode$2({ value: value, key: SWAP_KEY })) { return ( obj$1 = {}, obj$1[ESCAPE_KEY] = value, obj$1 ) } return value }; Swap.decode = function (ref) { var value = ref.value; if (isValidToDecode$2({ value: value, key: SWAP_KEY })) { return Swap.apply(null, value[SWAP_KEY]) } else if ( isValidToEscape({ value: value }) && isValidToDecode$2({ value: value[ESCAPE_KEY], key: SWAP_KEY }) ) { return value[ESCAPE_KEY] } return value }; function isValidToDecode$2(ref) { var value = ref.value; return getUniqueKey(value) === SWAP_KEY && isArray(value[SWAP_KEY]) } function Multi() { var values = [], len = arguments.length; while ( len-- ) values[ len ] = arguments[ len ]; if (!(this instanceof Multi)) { return new (Function.prototype.bind.apply( Multi, [ null ].concat( values) )) } this.values = values; } Multi.patch = function (ref) { var patch = ref.patch; var target = ref.target; var prop = ref.prop; var old_value = ref.old_value; var applyPatch = ref.applyPatch; var patch_value = patch[prop]; if (patch_value instanceof Multi) { target[prop] = old_value; var unpatch = patch_value.values.map(function (value) { var obj; var ref = applyPatch(target, ( obj = {}, obj[prop] = value, obj )); var unpatch = ref.unpatch; return unpatch[prop] }); return Multi.apply(null, unpatch.reverse()) } return old_value }; Multi.encode = function (ref) { var obj, obj$1; var value = ref.value; var encode = ref.encode; if (value instanceof Multi) { return ( obj = {}, obj[MULTI_KEY] = encode(value.values), obj ) } else if (isValidToDecodeMulti({ value: value })) { return ( obj$1 = {}, obj$1[ESCAPE_KEY] = value, obj$1 ) } return value }; Multi.decode = function (ref) { var value = ref.value; var decode = ref.decode; if (isValidToDecodeMulti({ value: value })) { return Multi.apply(null, decode(value[MULTI_KEY])) } else if ( isValidToEscape({ value: value }) && isValidToDecodeMulti({ value: value[ESCAPE_KEY] }) ) { return value[ESCAPE_KEY] } return value }; function isValidToDecodeMulti(ref) { var value = ref.value; return getUniqueKey(value) === MULTI_KEY && isArray(value[MULTI_KEY]) } // import { version } from '../package.json.js' // Deno does not support json imports: https://stackoverflow.com/questions/61907155/deno-import-json-file-as-module var version = '1.5.4'; function factory() { var patchers = []; var encoders = []; var decoders = []; var encode = function (object, params, list) { if ( params === void 0 ) params = {}; if ( list === void 0 ) list = encoders; return converter(object, merge(params, { encode: encode }), list); }; var decode = function (object, params, list) { if ( params === void 0 ) params = {}; if ( list === void 0 ) list = decoders; return converter(object, merge(params, { decode: decode }), list); }; var applyPatch = applyPatchFactory(patchers); var createStore = createStoreFactory(applyPatch); var createNode = createNodeFactory({ encode: encode, decode: decode }); var addType = function (ref) { var patch = ref.patch; var encode = ref.encode; var decode = ref.decode; if (isFunction(patch)) { patchers.push(patch); } if (isFunction(encode)) { encoders.push(encode); } if (isFunction(decode)) { decoders.push(decode); } }; addType(Primitives); addType(Rpc); addType(Delete); addType(Replace); addType(Splice); addType(Swap); addType(Multi); return { version: version, factory: factory, merge: merge, encode: encode, decode: decode, producePatch: producePatch, applyPatch: applyPatch, createNode: createNode, createStore: createStore, addType: addType, TYPE: { Delete: Delete, Replace: Replace, Splice: Splice, Swap: Swap, Multi: Multi, }, } } var dop = factory(); var encode = dop.encode; var decode = dop.decode; var applyPatch = dop.applyPatch; var createNode = dop.createNode; var createStore = dop.createStore; var addType = dop.addType; var TYPE = dop.TYPE; exports.TYPE = TYPE; exports.addType = addType; exports.applyPatch = applyPatch; exports.createNode = createNode; exports.createStore = createStore; exports.decode = decode; exports.default = dop; exports.encode = encode; exports.factory = factory; exports.merge = merge; exports.producePatch = producePatch; exports.version = version;