"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var src_exports = {}; __export(src_exports, { Feature: () => Feature, OpaqueReference: () => OpaqueReference, Serializer: () => Serializer, SerovalConflictedNodeIdError: () => SerovalConflictedNodeIdError, SerovalDepthLimitError: () => SerovalDepthLimitError, SerovalDeserializationError: () => SerovalDeserializationError, SerovalError: () => SerovalError, SerovalMalformedNodeError: () => SerovalMalformedNodeError, SerovalMissingInstanceError: () => SerovalMissingInstanceError, SerovalMissingPluginError: () => SerovalMissingPluginError, SerovalMissingReferenceError: () => SerovalMissingReferenceError, SerovalMissingReferenceForIdError: () => SerovalMissingReferenceForIdError, SerovalMode: () => SerovalMode, SerovalParserError: () => SerovalParserError, SerovalSerializationError: () => SerovalSerializationError, SerovalUnknownTypedArrayError: () => SerovalUnknownTypedArrayError, SerovalUnsupportedNodeError: () => SerovalUnsupportedNodeError, SerovalUnsupportedTypeError: () => SerovalUnsupportedTypeError, compileJSON: () => compileJSON, createPlugin: () => createPlugin, createReference: () => createReference, createStream: () => createStream, crossSerialize: () => crossSerialize, crossSerializeAsync: () => crossSerializeAsync, crossSerializeStream: () => crossSerializeStream, deserialize: () => deserialize2, fromCrossJSON: () => fromCrossJSON, fromJSON: () => fromJSON, getCrossReferenceHeader: () => getCrossReferenceHeader, resolvePlugins: () => resolvePlugins, serialize: () => serialize2, serializeAsync: () => serializeAsync, toCrossJSON: () => toCrossJSON, toCrossJSONAsync: () => toCrossJSONAsync, toCrossJSONStream: () => toCrossJSONStream, toJSON: () => toJSON, toJSONAsync: () => toJSONAsync }); module.exports = __toCommonJS(src_exports); // src/core/compat.ts var Feature = /* @__PURE__ */ ((Feature2) => { Feature2[Feature2["AggregateError"] = 1] = "AggregateError"; Feature2[Feature2["ArrowFunction"] = 2] = "ArrowFunction"; Feature2[Feature2["ErrorPrototypeStack"] = 4] = "ErrorPrototypeStack"; Feature2[Feature2["ObjectAssign"] = 8] = "ObjectAssign"; Feature2[Feature2["BigIntTypedArray"] = 16] = "BigIntTypedArray"; Feature2[Feature2["RegExp"] = 32] = "RegExp"; return Feature2; })(Feature || {}); var ALL_ENABLED = 1 /* AggregateError */ | 2 /* ArrowFunction */ | 4 /* ErrorPrototypeStack */ | 8 /* ObjectAssign */ | 16 /* BigIntTypedArray */ | 32 /* RegExp */; // src/core/symbols.ts var SYM_ASYNC_ITERATOR = Symbol.asyncIterator; var SYM_HAS_INSTANCE = Symbol.hasInstance; var SYM_IS_CONCAT_SPREADABLE = Symbol.isConcatSpreadable; var SYM_ITERATOR = Symbol.iterator; var SYM_MATCH = Symbol.match; var SYM_MATCH_ALL = Symbol.matchAll; var SYM_REPLACE = Symbol.replace; var SYM_SEARCH = Symbol.search; var SYM_SPECIES = Symbol.species; var SYM_SPLIT = Symbol.split; var SYM_TO_PRIMITIVE = Symbol.toPrimitive; var SYM_TO_STRING_TAG = Symbol.toStringTag; var SYM_UNSCOPABLES = Symbol.unscopables; // src/core/constants.ts var SYMBOL_STRING = { [0 /* AsyncIterator */]: "Symbol.asyncIterator", [1 /* HasInstance */]: "Symbol.hasInstance", [2 /* IsConcatSpreadable */]: "Symbol.isConcatSpreadable", [3 /* Iterator */]: "Symbol.iterator", [4 /* Match */]: "Symbol.match", [5 /* MatchAll */]: "Symbol.matchAll", [6 /* Replace */]: "Symbol.replace", [7 /* Search */]: "Symbol.search", [8 /* Species */]: "Symbol.species", [9 /* Split */]: "Symbol.split", [10 /* ToPrimitive */]: "Symbol.toPrimitive", [11 /* ToStringTag */]: "Symbol.toStringTag", [12 /* Unscopables */]: "Symbol.unscopables" }; var INV_SYMBOL_REF = { [SYM_ASYNC_ITERATOR]: 0 /* AsyncIterator */, [SYM_HAS_INSTANCE]: 1 /* HasInstance */, [SYM_IS_CONCAT_SPREADABLE]: 2 /* IsConcatSpreadable */, [SYM_ITERATOR]: 3 /* Iterator */, [SYM_MATCH]: 4 /* Match */, [SYM_MATCH_ALL]: 5 /* MatchAll */, [SYM_REPLACE]: 6 /* Replace */, [SYM_SEARCH]: 7 /* Search */, [SYM_SPECIES]: 8 /* Species */, [SYM_SPLIT]: 9 /* Split */, [SYM_TO_PRIMITIVE]: 10 /* ToPrimitive */, [SYM_TO_STRING_TAG]: 11 /* ToStringTag */, [SYM_UNSCOPABLES]: 12 /* Unscopables */ }; var SYMBOL_REF = { [0 /* AsyncIterator */]: SYM_ASYNC_ITERATOR, [1 /* HasInstance */]: SYM_HAS_INSTANCE, [2 /* IsConcatSpreadable */]: SYM_IS_CONCAT_SPREADABLE, [3 /* Iterator */]: SYM_ITERATOR, [4 /* Match */]: SYM_MATCH, [5 /* MatchAll */]: SYM_MATCH_ALL, [6 /* Replace */]: SYM_REPLACE, [7 /* Search */]: SYM_SEARCH, [8 /* Species */]: SYM_SPECIES, [9 /* Split */]: SYM_SPLIT, [10 /* ToPrimitive */]: SYM_TO_PRIMITIVE, [11 /* ToStringTag */]: SYM_TO_STRING_TAG, [12 /* Unscopables */]: SYM_UNSCOPABLES }; var CONSTANT_STRING = { [2 /* True */]: "!0", [3 /* False */]: "!1", [1 /* Undefined */]: "void 0", [0 /* Null */]: "null", [4 /* NegZero */]: "-0", [5 /* Inf */]: "1/0", [6 /* NegInf */]: "-1/0", [7 /* Nan */]: "0/0" }; var NIL = void 0; var CONSTANT_VAL = { [2 /* True */]: true, [3 /* False */]: false, [1 /* Undefined */]: NIL, [0 /* Null */]: null, [4 /* NegZero */]: -0, [5 /* Inf */]: Number.POSITIVE_INFINITY, [6 /* NegInf */]: Number.NEGATIVE_INFINITY, [7 /* Nan */]: Number.NaN }; var ERROR_CONSTRUCTOR_STRING = { [0 /* Error */]: "Error", [1 /* EvalError */]: "EvalError", [2 /* RangeError */]: "RangeError", [3 /* ReferenceError */]: "ReferenceError", [4 /* SyntaxError */]: "SyntaxError", [5 /* TypeError */]: "TypeError", [6 /* URIError */]: "URIError" }; var ERROR_CONSTRUCTOR = { [0 /* Error */]: Error, [1 /* EvalError */]: EvalError, [2 /* RangeError */]: RangeError, [3 /* ReferenceError */]: ReferenceError, [4 /* SyntaxError */]: SyntaxError, [5 /* TypeError */]: TypeError, [6 /* URIError */]: URIError }; // src/core/node.ts function createSerovalNode(t, i, s, c, m, p, e, a, f, b, o, l) { return { t, i, s, c, m, p, e, a, f, b, o, l }; } // src/core/literals.ts function createConstantNode(value) { return createSerovalNode( 2 /* Constant */, NIL, value, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL ); } var TRUE_NODE = /* @__PURE__ */ createConstantNode( 2 /* True */ ); var FALSE_NODE = /* @__PURE__ */ createConstantNode( 3 /* False */ ); var UNDEFINED_NODE = /* @__PURE__ */ createConstantNode( 1 /* Undefined */ ); var NULL_NODE = /* @__PURE__ */ createConstantNode( 0 /* Null */ ); var NEG_ZERO_NODE = /* @__PURE__ */ createConstantNode( 4 /* NegZero */ ); var INFINITY_NODE = /* @__PURE__ */ createConstantNode( 5 /* Inf */ ); var NEG_INFINITY_NODE = /* @__PURE__ */ createConstantNode( 6 /* NegInf */ ); var NAN_NODE = /* @__PURE__ */ createConstantNode(7 /* Nan */); // src/core/string.ts function serializeChar(str) { switch (str) { case '"': return '\\"'; case "\\": return "\\\\"; case "\n": return "\\n"; case "\r": return "\\r"; case "\b": return "\\b"; case " ": return "\\t"; case "\f": return "\\f"; case "<": return "\\x3C"; case "\u2028": return "\\u2028"; case "\u2029": return "\\u2029"; default: return NIL; } } function serializeString(str) { let result = ""; let lastPos = 0; let replacement; for (let i = 0, len = str.length; i < len; i++) { replacement = serializeChar(str[i]); if (replacement) { result += str.slice(lastPos, i) + replacement; lastPos = i + 1; } } if (lastPos === 0) { result = str; } else { result += str.slice(lastPos); } return result; } function deserializeReplacer(str) { switch (str) { case "\\\\": return "\\"; case '\\"': return '"'; case "\\n": return "\n"; case "\\r": return "\r"; case "\\b": return "\b"; case "\\t": return " "; case "\\f": return "\f"; case "\\x3C": return "<"; case "\\u2028": return "\u2028"; case "\\u2029": return "\u2029"; default: return str; } } function deserializeString(str) { return str.replace( /(\\\\|\\"|\\n|\\r|\\b|\\t|\\f|\\u2028|\\u2029|\\x3C)/g, deserializeReplacer ); } // src/core/keys.ts var REFERENCES_KEY = "__SEROVAL_REFS__"; var GLOBAL_CONTEXT_REFERENCES = "$R"; var GLOBAL_CONTEXT_R = `self.${GLOBAL_CONTEXT_REFERENCES}`; function getCrossReferenceHeader(id) { if (id == null) { return `${GLOBAL_CONTEXT_R}=${GLOBAL_CONTEXT_R}||[]`; } return `(${GLOBAL_CONTEXT_R}=${GLOBAL_CONTEXT_R}||{})["${serializeString( id )}"]=[]`; } // src/core/reference.ts var REFERENCE = /* @__PURE__ */ new Map(); var INV_REFERENCE = /* @__PURE__ */ new Map(); function createReference(id, value) { REFERENCE.set(value, id); INV_REFERENCE.set(id, value); return value; } function hasReferenceID(value) { return REFERENCE.has(value); } function hasReference(id) { return INV_REFERENCE.has(id); } function getReferenceID(value) { if (hasReferenceID(value)) { return REFERENCE.get(value); } throw new SerovalMissingReferenceError(value); } function getReference(id) { if (hasReference(id)) { return INV_REFERENCE.get(id); } throw new SerovalMissingReferenceForIdError(id); } if (typeof globalThis !== "undefined") { Object.defineProperty(globalThis, REFERENCES_KEY, { value: INV_REFERENCE, configurable: true, writable: false, enumerable: false }); } else if (typeof window !== "undefined") { Object.defineProperty(window, REFERENCES_KEY, { value: INV_REFERENCE, configurable: true, writable: false, enumerable: false }); } else if (typeof self !== "undefined") { Object.defineProperty(self, REFERENCES_KEY, { value: INV_REFERENCE, configurable: true, writable: false, enumerable: false }); } else if (typeof global !== "undefined") { Object.defineProperty(global, REFERENCES_KEY, { value: INV_REFERENCE, configurable: true, writable: false, enumerable: false }); } // src/core/utils/error.ts function getErrorConstructor(error) { if (error instanceof EvalError) { return 1 /* EvalError */; } if (error instanceof RangeError) { return 2 /* RangeError */; } if (error instanceof ReferenceError) { return 3 /* ReferenceError */; } if (error instanceof SyntaxError) { return 4 /* SyntaxError */; } if (error instanceof TypeError) { return 5 /* TypeError */; } if (error instanceof URIError) { return 6 /* URIError */; } return 0 /* Error */; } function getInitialErrorOptions(error) { const construct = ERROR_CONSTRUCTOR_STRING[getErrorConstructor(error)]; if (error.name !== construct) { return { name: error.name }; } if (error.constructor.name !== construct) { return { name: error.constructor.name }; } return {}; } function getErrorOptions(error, features) { let options = getInitialErrorOptions(error); const names = Object.getOwnPropertyNames(error); for (let i = 0, len = names.length, name; i < len; i++) { name = names[i]; if (name !== "name" && name !== "message") { if (name === "stack") { if (features & 4 /* ErrorPrototypeStack */) { options = options || {}; options[name] = error[name]; } } else { options = options || {}; options[name] = error[name]; } } } return options; } // src/core/utils/get-object-flag.ts function getObjectFlag(obj) { if (Object.isFrozen(obj)) { return 3 /* Frozen */; } if (Object.isSealed(obj)) { return 2 /* Sealed */; } if (Object.isExtensible(obj)) { return 0 /* None */; } return 1 /* NonExtensible */; } // src/core/base-primitives.ts function createNumberNode(value) { switch (value) { case Number.POSITIVE_INFINITY: return INFINITY_NODE; case Number.NEGATIVE_INFINITY: return NEG_INFINITY_NODE; } if (value !== value) { return NAN_NODE; } if (Object.is(value, -0)) { return NEG_ZERO_NODE; } return createSerovalNode( 0 /* Number */, NIL, value, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL ); } function createStringNode(value) { return createSerovalNode( 1 /* String */, NIL, serializeString(value), NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL ); } function createBigIntNode(current) { return createSerovalNode( 3 /* BigInt */, NIL, "" + current, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL ); } function createIndexedValueNode(id) { return createSerovalNode( 4 /* IndexedValue */, id, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL ); } function createDateNode(id, current) { const timestamp = current.valueOf(); return createSerovalNode( 5 /* Date */, id, timestamp !== timestamp ? "" : current.toISOString(), NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL ); } function createRegExpNode(id, current) { return createSerovalNode( 6 /* RegExp */, id, NIL, serializeString(current.source), current.flags, NIL, NIL, NIL, NIL, NIL, NIL, NIL ); } function createWKSymbolNode(id, current) { return createSerovalNode( 17 /* WKSymbol */, id, INV_SYMBOL_REF[current], NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL ); } function createReferenceNode(id, ref) { return createSerovalNode( 18 /* Reference */, id, serializeString(getReferenceID(ref)), NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL ); } function createPluginNode(id, tag, value) { return createSerovalNode( 25 /* Plugin */, id, value, serializeString(tag), NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL ); } function createArrayNode(id, current, parsedItems) { return createSerovalNode( 9 /* Array */, id, NIL, NIL, NIL, NIL, NIL, parsedItems, NIL, NIL, getObjectFlag(current), NIL ); } function createBoxedNode(id, boxed) { return createSerovalNode( 21 /* Boxed */, id, NIL, NIL, NIL, NIL, NIL, NIL, boxed, NIL, NIL, NIL ); } function createTypedArrayNode(id, current, buffer) { return createSerovalNode( 15 /* TypedArray */, id, NIL, current.constructor.name, NIL, NIL, NIL, NIL, buffer, current.byteOffset, NIL, current.length ); } function createBigIntTypedArrayNode(id, current, buffer) { return createSerovalNode( 16 /* BigIntTypedArray */, id, NIL, current.constructor.name, NIL, NIL, NIL, NIL, buffer, current.byteOffset, NIL, current.byteLength ); } function createDataViewNode(id, current, buffer) { return createSerovalNode( 20 /* DataView */, id, NIL, NIL, NIL, NIL, NIL, NIL, buffer, current.byteOffset, NIL, current.byteLength ); } function createErrorNode(id, current, options) { return createSerovalNode( 13 /* Error */, id, getErrorConstructor(current), NIL, serializeString(current.message), options, NIL, NIL, NIL, NIL, NIL, NIL ); } function createAggregateErrorNode(id, current, options) { return createSerovalNode( 14 /* AggregateError */, id, getErrorConstructor(current), NIL, serializeString(current.message), options, NIL, NIL, NIL, NIL, NIL, NIL ); } function createSetNode(id, items) { return createSerovalNode( 7 /* Set */, id, NIL, NIL, NIL, NIL, NIL, items, NIL, NIL, NIL, NIL ); } function createIteratorFactoryInstanceNode(factory, items) { return createSerovalNode( 28 /* IteratorFactoryInstance */, NIL, NIL, NIL, NIL, NIL, NIL, [factory, items], NIL, NIL, NIL, NIL ); } function createAsyncIteratorFactoryInstanceNode(factory, items) { return createSerovalNode( 30 /* AsyncIteratorFactoryInstance */, NIL, NIL, NIL, NIL, NIL, NIL, [factory, items], NIL, NIL, NIL, NIL ); } function createStreamConstructorNode(id, factory, sequence) { return createSerovalNode( 31 /* StreamConstructor */, id, NIL, NIL, NIL, NIL, NIL, sequence, factory, NIL, NIL, NIL ); } function createStreamNextNode(id, parsed) { return createSerovalNode( 32 /* StreamNext */, id, NIL, NIL, NIL, NIL, NIL, NIL, parsed, NIL, NIL, NIL ); } function createStreamThrowNode(id, parsed) { return createSerovalNode( 33 /* StreamThrow */, id, NIL, NIL, NIL, NIL, NIL, NIL, parsed, NIL, NIL, NIL ); } function createStreamReturnNode(id, parsed) { return createSerovalNode( 34 /* StreamReturn */, id, NIL, NIL, NIL, NIL, NIL, NIL, parsed, NIL, NIL, NIL ); } // src/core/errors.ts var { toString: objectToString } = Object.prototype; function getErrorMessageDev(type, cause) { if (cause instanceof Error) { return `Seroval caught an error during the ${type} process. ${cause.name} ${cause.message} - For more information, please check the "cause" property of this error. - If you believe this is an error in Seroval, please submit an issue at https://github.com/lxsmnsyc/seroval/issues/new`; } return `Seroval caught an error during the ${type} process. "${objectToString.call(cause)}" For more information, please check the "cause" property of this error.`; } var getErrorMessage = (type, cause) => false ? getErrorMessageProd(type) : getErrorMessageDev(type, cause); var SerovalError = class extends Error { constructor(type, cause) { super(getErrorMessage(type, cause)); this.cause = cause; } }; var SerovalParserError = class extends SerovalError { constructor(cause) { super("parsing", cause); } }; var SerovalSerializationError = class extends SerovalError { constructor(cause) { super("serialization", cause); } }; var SerovalDeserializationError = class extends SerovalError { constructor(cause) { super("deserialization", cause); } }; var SerovalUnsupportedTypeError = class extends Error { constructor(value) { super( false ? getSpecificErrorMessage(1 /* UnsupportedType */) : `The value ${objectToString.call(value)} of type "${typeof value}" cannot be parsed/serialized. There are few workarounds for this problem: - Transform the value in a way that it can be serialized. - If the reference is present on multiple runtimes (isomorphic), you can use the Reference API to map the references.` ); this.value = value; } }; var SerovalUnsupportedNodeError = class extends Error { constructor(node) { super( false ? getSpecificErrorMessage(2 /* UnsupportedNode */) : 'Unsupported node type "' + node.t + '".' ); } }; var SerovalMissingPluginError = class extends Error { constructor(tag) { super( false ? getSpecificErrorMessage(3 /* MissingPlugin */) : 'Missing plugin for tag "' + tag + '".' ); } }; var SerovalMissingInstanceError = class extends Error { constructor(tag) { super( false ? getSpecificErrorMessage(4 /* MissingInstance */) : 'Missing "' + tag + '" instance.' ); } }; var SerovalMissingReferenceError = class extends Error { constructor(value) { super( false ? getSpecificErrorMessage(5 /* MissingReference */) : 'Missing reference for the value "' + objectToString.call(value) + '" of type "' + typeof value + '"' ); this.value = value; } }; var SerovalMissingReferenceForIdError = class extends Error { constructor(id) { super( false ? getSpecificErrorMessage(6 /* MissingReferenceForId */) : 'Missing reference for id "' + serializeString(id) + '"' ); } }; var SerovalUnknownTypedArrayError = class extends Error { constructor(name) { super( false ? getSpecificErrorMessage(7 /* UnknownTypedArray */) : 'Unknown TypedArray "' + name + '"' ); } }; var SerovalMalformedNodeError = class extends Error { constructor(node) { super( false ? getSpecificErrorMessage(8 /* MalformedNode */) : 'Malformed node type "' + node.t + '".' ); } }; var SerovalConflictedNodeIdError = class extends Error { constructor(node) { super( false ? getSpecificErrorMessage(9 /* ConflictedNodeId */) : 'Conflicted node id "' + node.i + '".' ); } }; var SerovalDepthLimitError = class extends Error { constructor(limit) { super( false ? getSpecificErrorMessage(9 /* ConflictedNodeId */) : "Depth limit of " + limit + " reached" ); } }; // src/core/opaque-reference.ts var OpaqueReference = class { constructor(value, replacement) { this.value = value; this.replacement = replacement; } }; // src/core/constructors.ts var PROMISE_CONSTRUCTOR = () => { const resolver = { p: 0, s: 0, f: 0 }; resolver.p = new Promise((resolve, reject) => { resolver.s = resolve; resolver.f = reject; }); return resolver; }; var PROMISE_SUCCESS = (resolver, data) => { resolver.s(data); resolver.p.s = 1; resolver.p.v = data; }; var PROMISE_FAILURE = (resolver, data) => { resolver.f(data); resolver.p.s = 2; resolver.p.v = data; }; var SERIALIZED_PROMISE_CONSTRUCTOR = /* @__PURE__ */ PROMISE_CONSTRUCTOR.toString(); var SERIALIZED_PROMISE_SUCCESS = /* @__PURE__ */ PROMISE_SUCCESS.toString(); var SERIALIZED_PROMISE_FAILURE = /* @__PURE__ */ PROMISE_FAILURE.toString(); var STREAM_CONSTRUCTOR = () => { const buffer = []; const listeners = []; let alive = true; let success = false; let count = 0; const flush = (value, mode, x) => { for (x = 0; x < count; x++) { if (listeners[x]) { listeners[x][mode](value); } } }; const up = (listener, x, z, current) => { for (x = 0, z = buffer.length; x < z; x++) { current = buffer[x]; if (!alive && x === z - 1) { listener[success ? "return" : "throw"](current); } else { listener.next(current); } } }; const on = (listener, temp) => { if (alive) { temp = count++; listeners[temp] = listener; } up(listener); return () => { if (alive) { listeners[temp] = listeners[count]; listeners[count--] = void 0; } }; }; return { __SEROVAL_STREAM__: true, on: (listener) => on(listener), next: (value) => { if (alive) { buffer.push(value); flush(value, "next"); } }, throw: (value) => { if (alive) { buffer.push(value); flush(value, "throw"); alive = false; success = false; listeners.length = 0; } }, return: (value) => { if (alive) { buffer.push(value); flush(value, "return"); alive = false; success = true; listeners.length = 0; } } }; }; var SERIALIZED_STREAM_CONSTRUCTOR = /* @__PURE__ */ STREAM_CONSTRUCTOR.toString(); var ITERATOR_CONSTRUCTOR = (symbol) => (sequence) => () => { let index = 0; const instance = { [symbol]: () => instance, next: () => { if (index > sequence.d) { return { done: true, value: void 0 }; } const currentIndex = index++; const data = sequence.v[currentIndex]; if (currentIndex === sequence.t) { throw data; } return { done: currentIndex === sequence.d, value: data }; } }; return instance; }; var SERIALIZED_ITERATOR_CONSTRUCTOR = /* @__PURE__ */ ITERATOR_CONSTRUCTOR.toString(); var ASYNC_ITERATOR_CONSTRUCTOR = (symbol, createPromise) => (stream) => () => { let count = 0; let doneAt = -1; let isThrow = false; const buffer = []; const pending = []; const finalize = (i = 0, len = pending.length) => { for (; i < len; i++) { pending[i].s({ done: true, value: void 0 }); } }; stream.on({ next: (value) => { const temp = pending.shift(); if (temp) { temp.s({ done: false, value }); } buffer.push(value); }, throw: (value) => { const temp = pending.shift(); if (temp) { temp.f(value); } finalize(); doneAt = buffer.length; isThrow = true; buffer.push(value); }, return: (value) => { const temp = pending.shift(); if (temp) { temp.s({ done: true, value }); } finalize(); doneAt = buffer.length; buffer.push(value); } }); const instance = { [symbol]: () => instance, next: () => { if (doneAt === -1) { const index2 = count++; if (index2 >= buffer.length) { const temp = createPromise(); pending.push(temp); return temp.p; } return { done: false, value: buffer[index2] }; } if (count > doneAt) { return { done: true, value: void 0 }; } const index = count++; const value = buffer[index]; if (index !== doneAt) { return { done: false, value }; } if (isThrow) { throw value; } return { done: true, value }; } }; return instance; }; var SERIALIZED_ASYNC_ITERATOR_CONSTRUCTOR = /* @__PURE__ */ ASYNC_ITERATOR_CONSTRUCTOR.toString(); var ARRAY_BUFFER_CONSTRUCTOR = (b64) => { const decoded = atob(b64); const length = decoded.length; const arr = new Uint8Array(length); for (let i = 0; i < length; i++) { arr[i] = decoded.charCodeAt(i); } return arr.buffer; }; var SERIALIZED_ARRAY_BUFFER_CONSTRUCTOR = /* @__PURE__ */ ARRAY_BUFFER_CONSTRUCTOR.toString(); // src/core/special-reference.ts var ITERATOR = {}; var ASYNC_ITERATOR = {}; var SPECIAL_REFS = { [0 /* MapSentinel */]: {}, [1 /* PromiseConstructor */]: {}, [2 /* PromiseSuccess */]: {}, [3 /* PromiseFailure */]: {}, [4 /* StreamConstructor */]: {}, [5 /* ArrayBufferConstructor */]: {} }; var SPECIAL_REF_STRING = { [0 /* MapSentinel */]: "[]", [1 /* PromiseConstructor */]: SERIALIZED_PROMISE_CONSTRUCTOR, [2 /* PromiseSuccess */]: SERIALIZED_PROMISE_SUCCESS, [3 /* PromiseFailure */]: SERIALIZED_PROMISE_FAILURE, [4 /* StreamConstructor */]: SERIALIZED_STREAM_CONSTRUCTOR, [5 /* ArrayBufferConstructor */]: SERIALIZED_ARRAY_BUFFER_CONSTRUCTOR }; // src/core/stream.ts function isStream(value) { return "__SEROVAL_STREAM__" in value; } function createStream() { return STREAM_CONSTRUCTOR(); } function createStreamFromAsyncIterable(iterable) { const stream = createStream(); const iterator = iterable[SYM_ASYNC_ITERATOR](); async function push() { try { const value = await iterator.next(); if (value.done) { stream.return(value.value); } else { stream.next(value.value); await push(); } } catch (error) { stream.throw(error); } } push().catch(() => { }); return stream; } var createAsyncIterable = ASYNC_ITERATOR_CONSTRUCTOR( SYM_ASYNC_ITERATOR, PROMISE_CONSTRUCTOR ); function streamToAsyncIterable(stream) { return createAsyncIterable( stream ); } // src/core/utils/iterator-to-sequence.ts function iteratorToSequence(source) { const values = []; let throwsAt = -1; let doneAt = -1; const iterator = source[SYM_ITERATOR](); while (true) { try { const value = iterator.next(); values.push(value.value); if (value.done) { doneAt = values.length - 1; break; } } catch (error) { throwsAt = values.length; values.push(error); } } return { v: values, t: throwsAt, d: doneAt }; } var createIterator = ITERATOR_CONSTRUCTOR(SYM_ITERATOR); function sequenceToIterator(sequence) { return createIterator(sequence); } // src/core/utils/promise-to-result.ts async function promiseToResult(current) { try { return [1, await current]; } catch (e) { return [0, e]; } } // src/core/context/parser.ts function createBaseParserContext(mode, options) { return { plugins: options.plugins, mode, marked: /* @__PURE__ */ new Set(), features: ALL_ENABLED ^ (options.disabledFeatures || 0), refs: options.refs || /* @__PURE__ */ new Map(), depthLimit: options.depthLimit || 1e3 }; } function markParserRef(ctx, id) { ctx.marked.add(id); } function createIndexForValue(ctx, current) { const id = ctx.refs.size; ctx.refs.set(current, id); return id; } function getNodeForIndexedValue(ctx, current) { const registeredId = ctx.refs.get(current); if (registeredId != null) { markParserRef(ctx, registeredId); return { type: 1 /* Indexed */, value: createIndexedValueNode(registeredId) }; } return { type: 0 /* Fresh */, value: createIndexForValue(ctx, current) }; } function getReferenceNode(ctx, current) { const indexed = getNodeForIndexedValue(ctx, current); if (indexed.type === 1 /* Indexed */) { return indexed; } if (hasReferenceID(current)) { return { type: 2 /* Referenced */, value: createReferenceNode(indexed.value, current) }; } return indexed; } function parseWellKnownSymbol(ctx, current) { const ref = getReferenceNode(ctx, current); if (ref.type !== 0 /* Fresh */) { return ref.value; } if (current in INV_SYMBOL_REF) { return createWKSymbolNode(ref.value, current); } throw new SerovalUnsupportedTypeError(current); } function parseSpecialReference(ctx, ref) { const result = getNodeForIndexedValue(ctx, SPECIAL_REFS[ref]); if (result.type === 1 /* Indexed */) { return result.value; } return createSerovalNode( 26 /* SpecialReference */, result.value, ref, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL, NIL ); } function parseIteratorFactory(ctx) { const result = getNodeForIndexedValue(ctx, ITERATOR); if (result.type === 1 /* Indexed */) { return result.value; } return createSerovalNode( 27 /* IteratorFactory */, result.value, NIL, NIL, NIL, NIL, NIL, NIL, parseWellKnownSymbol(ctx, SYM_ITERATOR), NIL, NIL, NIL ); } function parseAsyncIteratorFactory(ctx) { const result = getNodeForIndexedValue(ctx, ASYNC_ITERATOR); if (result.type === 1 /* Indexed */) { return result.value; } return createSerovalNode( 29 /* AsyncIteratorFactory */, result.value, NIL, NIL, NIL, NIL, NIL, [ parseSpecialReference(ctx, 1 /* PromiseConstructor */), parseWellKnownSymbol(ctx, SYM_ASYNC_ITERATOR) ], NIL, NIL, NIL, NIL ); } function createObjectNode(id, current, empty, record) { return createSerovalNode( empty ? 11 /* NullConstructor */ : 10 /* Object */, id, NIL, NIL, NIL, record, NIL, NIL, NIL, NIL, getObjectFlag(current), NIL ); } function createMapNode(ctx, id, k, v) { return createSerovalNode( 8 /* Map */, id, NIL, NIL, NIL, NIL, { k, v }, NIL, parseSpecialReference(ctx, 0 /* MapSentinel */), NIL, NIL, NIL ); } function createPromiseConstructorNode(ctx, id, resolver) { return createSerovalNode( 22 /* PromiseConstructor */, id, resolver, NIL, NIL, NIL, NIL, NIL, parseSpecialReference(ctx, 1 /* PromiseConstructor */), NIL, NIL, NIL ); } function createArrayBufferNode(ctx, id, current) { const bytes = new Uint8Array(current); let result = ""; for (let i = 0, len = bytes.length; i < len; i++) { result += String.fromCharCode(bytes[i]); } return createSerovalNode( 19 /* ArrayBuffer */, id, serializeString(btoa(result)), NIL, NIL, NIL, NIL, NIL, parseSpecialReference(ctx, 5 /* ArrayBufferConstructor */), NIL, NIL, NIL ); } // src/core/context/async-parser.ts function createAsyncParserContext(mode, options) { return { base: createBaseParserContext(mode, options), child: void 0 }; } var AsyncParsePluginContext = class { constructor(_p, depth) { this._p = _p; this.depth = depth; } parse(current) { return parseAsync(this._p, this.depth, current); } }; async function parseItems(ctx, depth, current) { const nodes = []; for (let i = 0, len = current.length; i < len; i++) { if (i in current) { nodes[i] = await parseAsync(ctx, depth, current[i]); } else { nodes[i] = 0; } } return nodes; } async function parseArray(ctx, depth, id, current) { return createArrayNode(id, current, await parseItems(ctx, depth, current)); } async function parseProperties(ctx, depth, properties) { const entries = Object.entries(properties); const keyNodes = []; const valueNodes = []; for (let i = 0, len = entries.length; i < len; i++) { keyNodes.push(serializeString(entries[i][0])); valueNodes.push(await parseAsync(ctx, depth, entries[i][1])); } if (SYM_ITERATOR in properties) { keyNodes.push(parseWellKnownSymbol(ctx.base, SYM_ITERATOR)); valueNodes.push( createIteratorFactoryInstanceNode( parseIteratorFactory(ctx.base), await parseAsync( ctx, depth, iteratorToSequence(properties) ) ) ); } if (SYM_ASYNC_ITERATOR in properties) { keyNodes.push(parseWellKnownSymbol(ctx.base, SYM_ASYNC_ITERATOR)); valueNodes.push( createAsyncIteratorFactoryInstanceNode( parseAsyncIteratorFactory(ctx.base), await parseAsync( ctx, depth, createStreamFromAsyncIterable( properties ) ) ) ); } if (SYM_TO_STRING_TAG in properties) { keyNodes.push(parseWellKnownSymbol(ctx.base, SYM_TO_STRING_TAG)); valueNodes.push(createStringNode(properties[SYM_TO_STRING_TAG])); } if (SYM_IS_CONCAT_SPREADABLE in properties) { keyNodes.push(parseWellKnownSymbol(ctx.base, SYM_IS_CONCAT_SPREADABLE)); valueNodes.push( properties[SYM_IS_CONCAT_SPREADABLE] ? TRUE_NODE : FALSE_NODE ); } return { k: keyNodes, v: valueNodes }; } async function parsePlainObject(ctx, depth, id, current, empty) { return createObjectNode( id, current, empty, await parseProperties(ctx, depth, current) ); } async function parseBoxed(ctx, depth, id, current) { return createBoxedNode(id, await parseAsync(ctx, depth, current.valueOf())); } async function parseTypedArray(ctx, depth, id, current) { return createTypedArrayNode( id, current, await parseAsync(ctx, depth, current.buffer) ); } async function parseBigIntTypedArray(ctx, depth, id, current) { return createBigIntTypedArrayNode( id, current, await parseAsync(ctx, depth, current.buffer) ); } async function parseDataView(ctx, depth, id, current) { return createDataViewNode( id, current, await parseAsync(ctx, depth, current.buffer) ); } async function parseError(ctx, depth, id, current) { const options = getErrorOptions(current, ctx.base.features); return createErrorNode( id, current, options ? await parseProperties(ctx, depth, options) : NIL ); } async function parseAggregateError(ctx, depth, id, current) { const options = getErrorOptions(current, ctx.base.features); return createAggregateErrorNode( id, current, options ? await parseProperties(ctx, depth, options) : NIL ); } async function parseMap(ctx, depth, id, current) { const keyNodes = []; const valueNodes = []; for (const [key, value] of current.entries()) { keyNodes.push(await parseAsync(ctx, depth, key)); valueNodes.push(await parseAsync(ctx, depth, value)); } return createMapNode(ctx.base, id, keyNodes, valueNodes); } async function parseSet(ctx, depth, id, current) { const items = []; for (const item of current.keys()) { items.push(await parseAsync(ctx, depth, item)); } return createSetNode(id, items); } async function parsePlugin(ctx, depth, id, current) { const currentPlugins = ctx.base.plugins; if (currentPlugins) { for (let i = 0, len = currentPlugins.length; i < len; i++) { const plugin = currentPlugins[i]; if (plugin.parse.async && plugin.test(current)) { return createPluginNode( id, plugin.tag, await plugin.parse.async( current, new AsyncParsePluginContext(ctx, depth), { id } ) ); } } } return NIL; } async function parsePromise(ctx, depth, id, current) { const [status, result] = await promiseToResult(current); return createSerovalNode( 12 /* Promise */, id, status, NIL, NIL, NIL, NIL, NIL, await parseAsync(ctx, depth, result), NIL, NIL, NIL ); } function parseStreamHandle(depth, id, current, resolve, reject) { const sequence = []; const cleanup = current.on({ next: (value) => { markParserRef(this.base, id); parseAsync(this, depth, value).then( (data) => { sequence.push(createStreamNextNode(id, data)); }, (data) => { reject(data); cleanup(); } ); }, throw: (value) => { markParserRef(this.base, id); parseAsync(this, depth, value).then( (data) => { sequence.push(createStreamThrowNode(id, data)); resolve(sequence); cleanup(); }, (data) => { reject(data); cleanup(); } ); }, return: (value) => { markParserRef(this.base, id); parseAsync(this, depth, value).then( (data) => { sequence.push(createStreamReturnNode(id, data)); resolve(sequence); cleanup(); }, (data) => { reject(data); cleanup(); } ); } }); } async function parseStream(ctx, depth, id, current) { return createStreamConstructorNode( id, parseSpecialReference(ctx.base, 4 /* StreamConstructor */), await new Promise( parseStreamHandle.bind(ctx, depth, id, current) ) ); } async function parseObjectAsync(ctx, depth, id, current) { if (Array.isArray(current)) { return parseArray(ctx, depth, id, current); } if (isStream(current)) { return parseStream(ctx, depth, id, current); } const currentClass = current.constructor; if (currentClass === OpaqueReference) { return parseAsync( ctx, depth, current.replacement ); } const parsed = await parsePlugin(ctx, depth, id, current); if (parsed) { return parsed; } switch (currentClass) { case Object: return parsePlainObject( ctx, depth, id, current, false ); case NIL: return parsePlainObject( ctx, depth, id, current, true ); case Date: return createDateNode(id, current); case Error: case EvalError: case RangeError: case ReferenceError: case SyntaxError: case TypeError: case URIError: return parseError(ctx, depth, id, current); case Number: case Boolean: case String: case BigInt: return parseBoxed(ctx, depth, id, current); case ArrayBuffer: return createArrayBufferNode( ctx.base, id, current ); case Int8Array: case Int16Array: case Int32Array: case Uint8Array: case Uint16Array: case Uint32Array: case Uint8ClampedArray: case Float32Array: case Float64Array: return parseTypedArray( ctx, depth, id, current ); case DataView: return parseDataView(ctx, depth, id, current); case Map: return parseMap( ctx, depth, id, current ); case Set: return parseSet(ctx, depth, id, current); default: break; } if (currentClass === Promise || current instanceof Promise) { return parsePromise(ctx, depth, id, current); } const currentFeatures = ctx.base.features; if (currentFeatures & 32 /* RegExp */ && currentClass === RegExp) { return createRegExpNode(id, current); } if (currentFeatures & 16 /* BigIntTypedArray */) { switch (currentClass) { case BigInt64Array: case BigUint64Array: return parseBigIntTypedArray( ctx, depth, id, current ); default: break; } } if (currentFeatures & 1 /* AggregateError */ && typeof AggregateError !== "undefined" && (currentClass === AggregateError || current instanceof AggregateError)) { return parseAggregateError( ctx, depth, id, current ); } if (current instanceof Error) { return parseError(ctx, depth, id, current); } if (SYM_ITERATOR in current || SYM_ASYNC_ITERATOR in current) { return parsePlainObject(ctx, depth, id, current, !!currentClass); } throw new SerovalUnsupportedTypeError(current); } async function parseFunctionAsync(ctx, depth, current) { const ref = getReferenceNode(ctx.base, current); if (ref.type !== 0 /* Fresh */) { return ref.value; } const plugin = await parsePlugin(ctx, depth, ref.value, current); if (plugin) { return plugin; } throw new SerovalUnsupportedTypeError(current); } async function parseAsync(ctx, depth, current) { switch (typeof current) { case "boolean": return current ? TRUE_NODE : FALSE_NODE; case "undefined": return UNDEFINED_NODE; case "string": return createStringNode(current); case "number": return createNumberNode(current); case "bigint": return createBigIntNode(current); case "object": { if (current) { const ref = getReferenceNode(ctx.base, current); return ref.type === 0 ? await parseObjectAsync(ctx, depth + 1, ref.value, current) : ref.value; } return NULL_NODE; } case "symbol": return parseWellKnownSymbol(ctx.base, current); case "function": return parseFunctionAsync(ctx, depth, current); default: throw new SerovalUnsupportedTypeError(current); } } async function parseTopAsync(ctx, current) { try { return await parseAsync(ctx, 0, current); } catch (error) { throw error instanceof SerovalParserError ? error : new SerovalParserError(error); } } // src/core/plugin.ts var SerovalMode = /* @__PURE__ */ ((SerovalMode2) => { SerovalMode2[SerovalMode2["Vanilla"] = 1] = "Vanilla"; SerovalMode2[SerovalMode2["Cross"] = 2] = "Cross"; return SerovalMode2; })(SerovalMode || {}); function createPlugin(plugin) { return plugin; } function dedupePlugins(deduped, plugins) { for (let i = 0, len = plugins.length; i < len; i++) { const current = plugins[i]; if (!deduped.has(current)) { deduped.add(current); if (current.extends) { dedupePlugins(deduped, current.extends); } } } } function resolvePlugins(plugins) { if (plugins) { const deduped = /* @__PURE__ */ new Set(); dedupePlugins(deduped, plugins); return [...deduped]; } return void 0; } // src/core/utils/typed-array.ts function getTypedArrayConstructor(name) { switch (name) { case "Int8Array": return Int8Array; case "Int16Array": return Int16Array; case "Int32Array": return Int32Array; case "Uint8Array": return Uint8Array; case "Uint16Array": return Uint16Array; case "Uint32Array": return Uint32Array; case "Uint8ClampedArray": return Uint8ClampedArray; case "Float32Array": return Float32Array; case "Float64Array": return Float64Array; case "BigInt64Array": return BigInt64Array; case "BigUint64Array": return BigUint64Array; default: throw new SerovalUnknownTypedArrayError(name); } } // src/core/context/deserializer.ts var MAX_BASE64_LENGTH = 1e6; var MAX_BIGINT_LENGTH = 1e4; var MAX_REGEXP_SOURCE_LENGTH = 2e4; function applyObjectFlag(obj, flag) { switch (flag) { case 3 /* Frozen */: return Object.freeze(obj); case 1 /* NonExtensible */: return Object.preventExtensions(obj); case 2 /* Sealed */: return Object.seal(obj); default: return obj; } } var DEFAULT_DEPTH_LIMIT = 1e3; function createBaseDeserializerContext(mode, options) { var _a; return { mode, plugins: options.plugins, refs: options.refs || /* @__PURE__ */ new Map(), features: (_a = options.features) != null ? _a : ALL_ENABLED ^ (options.disabledFeatures || 0), depthLimit: options.depthLimit || DEFAULT_DEPTH_LIMIT }; } function createVanillaDeserializerContext(options) { return { mode: 1 /* Vanilla */, base: createBaseDeserializerContext(1 /* Vanilla */, options), child: NIL, state: { marked: new Set(options.markedRefs) } }; } function createCrossDeserializerContext(options) { return { mode: 2 /* Cross */, base: createBaseDeserializerContext(2 /* Cross */, options), child: NIL }; } var DeserializePluginContext = class { constructor(_p, depth) { this._p = _p; this.depth = depth; } deserialize(node) { return deserialize(this._p, this.depth, node); } }; function guardIndexedValue(ctx, id) { if (id < 0 || !Number.isFinite(id) || !Number.isInteger(id)) { throw new SerovalMalformedNodeError({ t: 4 /* IndexedValue */, i: id }); } if (ctx.refs.has(id)) { throw new Error("Conflicted ref id: " + id); } } function assignIndexedValueVanilla(ctx, id, value) { guardIndexedValue(ctx.base, id); if (ctx.state.marked.has(id)) { ctx.base.refs.set(id, value); } return value; } function assignIndexedValueCross(ctx, id, value) { guardIndexedValue(ctx.base, id); ctx.base.refs.set(id, value); return value; } function assignIndexedValue(ctx, id, value) { return ctx.mode === 1 /* Vanilla */ ? assignIndexedValueVanilla(ctx, id, value) : assignIndexedValueCross(ctx, id, value); } function deserializeKnownValue(node, record, key) { if (Object.hasOwn(record, key)) { return record[key]; } throw new SerovalMalformedNodeError(node); } function deserializeReference(ctx, node) { return assignIndexedValue( ctx, node.i, getReference(deserializeString(node.s)) ); } function deserializeArray(ctx, depth, node) { const items = node.a; const len = items.length; const result = assignIndexedValue( ctx, node.i, new Array(len) ); for (let i = 0, item; i < len; i++) { item = items[i]; if (item) { result[i] = deserialize(ctx, depth, item); } } applyObjectFlag(result, node.o); return result; } function isValidKey(key) { switch (key) { case "constructor": case "__proto__": case "prototype": case "__defineGetter__": case "__defineSetter__": case "__lookupGetter__": case "__lookupSetter__": return false; default: return true; } } function isValidSymbol(symbol) { switch (symbol) { case SYM_ASYNC_ITERATOR: case SYM_IS_CONCAT_SPREADABLE: case SYM_TO_STRING_TAG: case SYM_ITERATOR: return true; default: return false; } } function assignStringProperty(object, key, value) { if (isValidKey(key)) { object[key] = value; } else { Object.defineProperty(object, key, { value, configurable: true, enumerable: true, writable: true }); } } function assignProperty(ctx, depth, object, key, value) { if (typeof key === "string") { assignStringProperty(object, key, deserialize(ctx, depth, value)); } else { const actual = deserialize(ctx, depth, key); switch (typeof actual) { case "string": assignStringProperty(object, actual, deserialize(ctx, depth, value)); break; case "symbol": if (isValidSymbol(actual)) { object[actual] = deserialize(ctx, depth, value); } break; default: throw new SerovalMalformedNodeError(key); } } } function deserializeProperties(ctx, depth, node, result) { const keys = node.k; const len = keys.length; if (len > 0) { for (let i = 0, vals = node.v, len2 = keys.length; i < len2; i++) { assignProperty(ctx, depth, result, keys[i], vals[i]); } } return result; } function deserializeObject(ctx, depth, node) { const result = assignIndexedValue( ctx, node.i, node.t === 10 /* Object */ ? {} : /* @__PURE__ */ Object.create(null) ); deserializeProperties(ctx, depth, node.p, result); applyObjectFlag(result, node.o); return result; } function deserializeDate(ctx, node) { return assignIndexedValue(ctx, node.i, new Date(node.s)); } function deserializeRegExp(ctx, node) { if (ctx.base.features & 32 /* RegExp */) { const source = deserializeString(node.c); if (source.length > MAX_REGEXP_SOURCE_LENGTH) { throw new SerovalMalformedNodeError(node); } return assignIndexedValue(ctx, node.i, new RegExp(source, node.m)); } throw new SerovalUnsupportedNodeError(node); } function deserializeSet(ctx, depth, node) { const result = assignIndexedValue(ctx, node.i, /* @__PURE__ */ new Set()); for (let i = 0, items = node.a, len = items.length; i < len; i++) { result.add(deserialize(ctx, depth, items[i])); } return result; } function deserializeMap(ctx, depth, node) { const result = assignIndexedValue(ctx, node.i, /* @__PURE__ */ new Map()); for (let i = 0, keys = node.e.k, vals = node.e.v, len = keys.length; i < len; i++) { result.set( deserialize(ctx, depth, keys[i]), deserialize(ctx, depth, vals[i]) ); } return result; } function deserializeArrayBuffer(ctx, node) { if (node.s.length > MAX_BASE64_LENGTH) { throw new SerovalMalformedNodeError(node); } const result = assignIndexedValue( ctx, node.i, ARRAY_BUFFER_CONSTRUCTOR(deserializeString(node.s)) ); return result; } function deserializeTypedArray(ctx, depth, node) { var _a; const construct = getTypedArrayConstructor(node.c); const source = deserialize(ctx, depth, node.f); const offset = (_a = node.b) != null ? _a : 0; if (offset < 0 || offset > source.byteLength) { throw new SerovalMalformedNodeError(node); } const result = assignIndexedValue( ctx, node.i, new construct(source, offset, node.l) ); return result; } function deserializeDataView(ctx, depth, node) { var _a; const source = deserialize(ctx, depth, node.f); const offset = (_a = node.b) != null ? _a : 0; if (offset < 0 || offset > source.byteLength) { throw new SerovalMalformedNodeError(node); } const result = assignIndexedValue( ctx, node.i, new DataView(source, offset, node.l) ); return result; } function deserializeDictionary(ctx, depth, node, result) { if (node.p) { const fields = deserializeProperties(ctx, depth, node.p, {}); Object.defineProperties(result, Object.getOwnPropertyDescriptors(fields)); } return result; } function deserializeAggregateError(ctx, depth, node) { const result = assignIndexedValue( ctx, node.i, new AggregateError([], deserializeString(node.m)) ); return deserializeDictionary(ctx, depth, node, result); } function deserializeError(ctx, depth, node) { const construct = deserializeKnownValue(node, ERROR_CONSTRUCTOR, node.s); const result = assignIndexedValue( ctx, node.i, new construct(deserializeString(node.m)) ); return deserializeDictionary(ctx, depth, node, result); } function deserializePromise(ctx, depth, node) { const deferred = PROMISE_CONSTRUCTOR(); const result = assignIndexedValue(ctx, node.i, deferred.p); const deserialized = deserialize(ctx, depth, node.f); if (node.s) { deferred.s(deserialized); } else { deferred.f(deserialized); } return result; } function deserializeBoxed(ctx, depth, node) { return assignIndexedValue( ctx, node.i, // biome-ignore lint/style/useConsistentBuiltinInstantiation: intended Object(deserialize(ctx, depth, node.f)) ); } function deserializePlugin(ctx, depth, node) { const currentPlugins = ctx.base.plugins; if (currentPlugins) { const tag = deserializeString(node.c); for (let i = 0, len = currentPlugins.length; i < len; i++) { const plugin = currentPlugins[i]; if (plugin.tag === tag) { return assignIndexedValue( ctx, node.i, plugin.deserialize(node.s, new DeserializePluginContext(ctx, depth), { id: node.i }) ); } } } throw new SerovalMissingPluginError(node.c); } function deserializePromiseConstructor(ctx, node) { return assignIndexedValue( ctx, node.i, assignIndexedValue(ctx, node.s, PROMISE_CONSTRUCTOR()).p ); } function deserializePromiseResolve(ctx, depth, node) { const deferred = ctx.base.refs.get(node.i); if (deferred) { deferred.s(deserialize(ctx, depth, node.a[1])); return NIL; } throw new SerovalMissingInstanceError("Promise"); } function deserializePromiseReject(ctx, depth, node) { const deferred = ctx.base.refs.get(node.i); if (deferred) { deferred.f(deserialize(ctx, depth, node.a[1])); return NIL; } throw new SerovalMissingInstanceError("Promise"); } function deserializeIteratorFactoryInstance(ctx, depth, node) { deserialize(ctx, depth, node.a[0]); const source = deserialize(ctx, depth, node.a[1]); return sequenceToIterator(source); } function deserializeAsyncIteratorFactoryInstance(ctx, depth, node) { deserialize(ctx, depth, node.a[0]); const source = deserialize(ctx, depth, node.a[1]); return streamToAsyncIterable(source); } function deserializeStreamConstructor(ctx, depth, node) { const result = assignIndexedValue(ctx, node.i, createStream()); const items = node.a; const len = items.length; if (len) { for (let i = 0; i < len; i++) { deserialize(ctx, depth, items[i]); } } return result; } function deserializeStreamNext(ctx, depth, node) { const deferred = ctx.base.refs.get(node.i); if (deferred && isStream(deferred)) { deferred.next(deserialize(ctx, depth, node.f)); return NIL; } throw new SerovalMissingInstanceError("Stream"); } function deserializeStreamThrow(ctx, depth, node) { const deferred = ctx.base.refs.get(node.i); if (deferred && isStream(deferred)) { deferred.throw(deserialize(ctx, depth, node.f)); return NIL; } throw new SerovalMissingInstanceError("Stream"); } function deserializeStreamReturn(ctx, depth, node) { const deferred = ctx.base.refs.get(node.i); if (deferred && isStream(deferred)) { deferred.return(deserialize(ctx, depth, node.f)); return NIL; } throw new SerovalMissingInstanceError("Stream"); } function deserializeIteratorFactory(ctx, depth, node) { deserialize(ctx, depth, node.f); return NIL; } function deserializeAsyncIteratorFactory(ctx, depth, node) { deserialize(ctx, depth, node.a[1]); return NIL; } function deserialize(ctx, depth, node) { if (depth > ctx.base.depthLimit) { throw new SerovalDepthLimitError(ctx.base.depthLimit); } depth += 1; switch (node.t) { case 2 /* Constant */: return deserializeKnownValue(node, CONSTANT_VAL, node.s); case 0 /* Number */: return Number(node.s); case 1 /* String */: return deserializeString(String(node.s)); case 3 /* BigInt */: if (String(node.s).length > MAX_BIGINT_LENGTH) { throw new SerovalMalformedNodeError(node); } return BigInt(node.s); case 4 /* IndexedValue */: return ctx.base.refs.get(node.i); case 18 /* Reference */: return deserializeReference(ctx, node); case 9 /* Array */: return deserializeArray(ctx, depth, node); case 10 /* Object */: case 11 /* NullConstructor */: return deserializeObject(ctx, depth, node); case 5 /* Date */: return deserializeDate(ctx, node); case 6 /* RegExp */: return deserializeRegExp(ctx, node); case 7 /* Set */: return deserializeSet(ctx, depth, node); case 8 /* Map */: return deserializeMap(ctx, depth, node); case 19 /* ArrayBuffer */: return deserializeArrayBuffer(ctx, node); case 16 /* BigIntTypedArray */: case 15 /* TypedArray */: return deserializeTypedArray(ctx, depth, node); case 20 /* DataView */: return deserializeDataView(ctx, depth, node); case 14 /* AggregateError */: return deserializeAggregateError(ctx, depth, node); case 13 /* Error */: return deserializeError(ctx, depth, node); case 12 /* Promise */: return deserializePromise(ctx, depth, node); case 17 /* WKSymbol */: return deserializeKnownValue(node, SYMBOL_REF, node.s); case 21 /* Boxed */: return deserializeBoxed(ctx, depth, node); case 25 /* Plugin */: return deserializePlugin(ctx, depth, node); case 22 /* PromiseConstructor */: return deserializePromiseConstructor(ctx, node); case 23 /* PromiseSuccess */: return deserializePromiseResolve(ctx, depth, node); case 24 /* PromiseFailure */: return deserializePromiseReject(ctx, depth, node); case 28 /* IteratorFactoryInstance */: return deserializeIteratorFactoryInstance(ctx, depth, node); case 30 /* AsyncIteratorFactoryInstance */: return deserializeAsyncIteratorFactoryInstance(ctx, depth, node); case 31 /* StreamConstructor */: return deserializeStreamConstructor(ctx, depth, node); case 32 /* StreamNext */: return deserializeStreamNext(ctx, depth, node); case 33 /* StreamThrow */: return deserializeStreamThrow(ctx, depth, node); case 34 /* StreamReturn */: return deserializeStreamReturn(ctx, depth, node); case 27 /* IteratorFactory */: return deserializeIteratorFactory(ctx, depth, node); case 29 /* AsyncIteratorFactory */: return deserializeAsyncIteratorFactory(ctx, depth, node); // case SerovalNodeType.SpecialReference: default: throw new SerovalUnsupportedNodeError(node); } } function deserializeTop(ctx, node) { try { return deserialize(ctx, 0, node); } catch (error) { throw new SerovalDeserializationError(error); } } // src/core/function-string.ts var RETURN = () => T; var SERIALIZED_RETURN = /* @__PURE__ */ RETURN.toString(); var IS_MODERN = /* @__PURE__ */ /=>/.test(SERIALIZED_RETURN); function createFunction(parameters, body) { if (IS_MODERN) { const joined = parameters.length === 1 ? parameters[0] : "(" + parameters.join(",") + ")"; return joined + "=>" + (body.startsWith("{") ? "(" + body + ")" : body); } return "function(" + parameters.join(",") + "){return " + body + "}"; } function createEffectfulFunction(parameters, body) { if (IS_MODERN) { const joined = parameters.length === 1 ? parameters[0] : "(" + parameters.join(",") + ")"; return joined + "=>{" + body + "}"; } return "function(" + parameters.join(",") + "){" + body + "}"; } // src/core/utils/get-identifier.ts var REF_START_CHARS = "hjkmoquxzABCDEFGHIJKLNPQRTUVWXYZ$_"; var REF_START_CHARS_LEN = REF_START_CHARS.length; var REF_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$_"; var REF_CHARS_LEN = REF_CHARS.length; function getIdentifier(index) { let mod = index % REF_START_CHARS_LEN; let ref = REF_START_CHARS[mod]; index = (index - mod) / REF_START_CHARS_LEN; while (index > 0) { mod = index % REF_CHARS_LEN; ref += REF_CHARS[mod]; index = (index - mod) / REF_CHARS_LEN; } return ref; } // src/core/utils/is-valid-identifier.ts var IDENTIFIER_CHECK = /^[$A-Z_][0-9A-Z_$]*$/i; function isValidIdentifier(name) { const char = name[0]; return (char === "$" || char === "_" || char >= "A" && char <= "Z" || char >= "a" && char <= "z") && IDENTIFIER_CHECK.test(name); } // src/core/context/serializer.ts function getAssignmentExpression(assignment) { switch (assignment.t) { case 0 /* Index */: return assignment.s + "=" + assignment.v; case 2 /* Set */: return assignment.s + ".set(" + assignment.k + "," + assignment.v + ")"; case 1 /* Add */: return assignment.s + ".add(" + assignment.v + ")"; case 3 /* Delete */: return assignment.s + ".delete(" + assignment.k + ")"; } } function mergeAssignments(assignments) { const newAssignments = []; let current = assignments[0]; for (let i = 1, len = assignments.length, item, prev = current; i < len; i++) { item = assignments[i]; if (item.t === 0 /* Index */ && item.v === prev.v) { current = { t: 0 /* Index */, s: item.s, k: NIL, v: getAssignmentExpression(current) }; } else if (item.t === 2 /* Set */ && item.s === prev.s) { current = { t: 2 /* Set */, s: getAssignmentExpression(current), k: item.k, v: item.v }; } else if (item.t === 1 /* Add */ && item.s === prev.s) { current = { t: 1 /* Add */, s: getAssignmentExpression(current), k: NIL, v: item.v }; } else if (item.t === 3 /* Delete */ && item.s === prev.s) { current = { t: 3 /* Delete */, s: getAssignmentExpression(current), k: item.k, v: NIL }; } else { newAssignments.push(current); current = item; } prev = item; } newAssignments.push(current); return newAssignments; } function resolveAssignments(assignments) { if (assignments.length) { let result = ""; const merged = mergeAssignments(assignments); for (let i = 0, len = merged.length; i < len; i++) { result += getAssignmentExpression(merged[i]) + ","; } return result; } return NIL; } var NULL_CONSTRUCTOR = "Object.create(null)"; var SET_CONSTRUCTOR = "new Set"; var MAP_CONSTRUCTOR = "new Map"; var PROMISE_RESOLVE = "Promise.resolve"; var PROMISE_REJECT = "Promise.reject"; var OBJECT_FLAG_CONSTRUCTOR = { [3 /* Frozen */]: "Object.freeze", [2 /* Sealed */]: "Object.seal", [1 /* NonExtensible */]: "Object.preventExtensions", [0 /* None */]: NIL }; function createBaseSerializerContext(mode, options) { return { mode, plugins: options.plugins, features: options.features, marked: new Set(options.markedRefs), stack: [], flags: [], assignments: [] }; } function createVanillaSerializerState() { return { valid: /* @__PURE__ */ new Map(), vars: [] }; } function createVanillaSerializerContext(options) { return { mode: 1 /* Vanilla */, base: createBaseSerializerContext(1 /* Vanilla */, options), state: createVanillaSerializerState(), child: NIL }; } function createCrossSerializerContext(options) { return { mode: 2 /* Cross */, base: createBaseSerializerContext(2 /* Cross */, options), state: options, child: NIL }; } var SerializePluginContext = class { constructor(_p) { this._p = _p; } serialize(node) { return serialize(this._p, node); } }; function getVanillaRefParam(state, index) { let actualIndex = state.valid.get(index); if (actualIndex == null) { actualIndex = state.valid.size; state.valid.set(index, actualIndex); } let identifier = state.vars[actualIndex]; if (identifier == null) { identifier = getIdentifier(actualIndex); state.vars[actualIndex] = identifier; } return identifier; } function getCrossRefParam(id) { return GLOBAL_CONTEXT_REFERENCES + "[" + id + "]"; } function getRefParam(ctx, id) { return ctx.mode === 1 /* Vanilla */ ? getVanillaRefParam(ctx.state, id) : getCrossRefParam(id); } function markSerializerRef(ctx, id) { ctx.marked.add(id); } function isSerializerRefMarked(ctx, id) { return ctx.marked.has(id); } function pushObjectFlag(ctx, flag, id) { if (flag !== 0 /* None */) { markSerializerRef(ctx.base, id); ctx.base.flags.push({ type: flag, value: getRefParam(ctx, id) }); } } function resolveFlags(ctx) { let result = ""; for (let i = 0, current = ctx.flags, len = current.length; i < len; i++) { const flag = current[i]; result += OBJECT_FLAG_CONSTRUCTOR[flag.type] + "(" + flag.value + "),"; } return result; } function resolvePatches(ctx) { const assignments = resolveAssignments(ctx.assignments); const flags = resolveFlags(ctx); if (assignments) { if (flags) { return assignments + flags; } return assignments; } return flags; } function createAssignment(ctx, source, value) { ctx.assignments.push({ t: 0 /* Index */, s: source, k: NIL, v: value }); } function createAddAssignment(ctx, ref, value) { ctx.base.assignments.push({ t: 1 /* Add */, s: getRefParam(ctx, ref), k: NIL, v: value }); } function createSetAssignment(ctx, ref, key, value) { ctx.base.assignments.push({ t: 2 /* Set */, s: getRefParam(ctx, ref), k: key, v: value }); } function createDeleteAssignment(ctx, ref, key) { ctx.base.assignments.push({ t: 3 /* Delete */, s: getRefParam(ctx, ref), k: key, v: NIL }); } function createArrayAssign(ctx, ref, index, value) { createAssignment(ctx.base, getRefParam(ctx, ref) + "[" + index + "]", value); } function createObjectAssign(ctx, ref, key, value) { createAssignment(ctx.base, getRefParam(ctx, ref) + "." + key, value); } function isIndexedValueInStack(ctx, node) { return node.t === 4 /* IndexedValue */ && ctx.stack.includes(node.i); } function assignIndexedValue2(ctx, index, value) { if (ctx.mode === 1 /* Vanilla */ && !isSerializerRefMarked(ctx.base, index)) { return value; } return getRefParam(ctx, index) + "=" + value; } function serializeReference(node) { return REFERENCES_KEY + '.get("' + node.s + '")'; } function serializeArrayItem(ctx, id, item, index) { if (item) { if (isIndexedValueInStack(ctx.base, item)) { markSerializerRef(ctx.base, id); createArrayAssign( ctx, id, index, getRefParam(ctx, item.i) ); return ""; } return serialize(ctx, item); } return ""; } function serializeArray(ctx, node) { const id = node.i; const list = node.a; const len = list.length; if (len > 0) { ctx.base.stack.push(id); let values = serializeArrayItem(ctx, id, list[0], 0); let isHoley = values === ""; for (let i = 1, item; i < len; i++) { item = serializeArrayItem(ctx, id, list[i], i); values += "," + item; isHoley = item === ""; } ctx.base.stack.pop(); pushObjectFlag(ctx, node.o, node.i); return "[" + values + (isHoley ? ",]" : "]"); } return "[]"; } function serializeProperty(ctx, source, key, val) { if (typeof key === "string") { const check = Number(key); const isIdentifier = ( // Test if key is a valid positive number or JS identifier // so that we don't have to serialize the key and wrap with brackets check >= 0 && // It's also important to consider that if the key is // indeed numeric, we need to make sure that when // converted back into a string, it's still the same // to the original key. This allows us to differentiate // keys that has numeric formats but in a different // format, which can cause unintentional key declaration // Example: { 0x1: 1 } vs { '0x1': 1 } check.toString() === key || isValidIdentifier(key) ); if (isIndexedValueInStack(ctx.base, val)) { const refParam = getRefParam(ctx, val.i); markSerializerRef(ctx.base, source.i); if (isIdentifier && check !== check) { createObjectAssign(ctx, source.i, key, refParam); } else { createArrayAssign( ctx, source.i, isIdentifier ? key : '"' + key + '"', refParam ); } return ""; } return (isIdentifier ? key : '"' + key + '"') + ":" + serialize(ctx, val); } return "[" + serialize(ctx, key) + "]:" + serialize(ctx, val); } function serializeProperties(ctx, source, record) { const keys = record.k; const len = keys.length; if (len > 0) { const values = record.v; ctx.base.stack.push(source.i); let result = serializeProperty(ctx, source, keys[0], values[0]); for (let i = 1, item = result; i < len; i++) { item = serializeProperty(ctx, source, keys[i], values[i]); result += (item && result && ",") + item; } ctx.base.stack.pop(); return "{" + result + "}"; } return "{}"; } function serializeObject(ctx, node) { pushObjectFlag(ctx, node.o, node.i); return serializeProperties(ctx, node, node.p); } function serializeWithObjectAssign(ctx, source, value, serialized) { const fields = serializeProperties(ctx, source, value); if (fields !== "{}") { return "Object.assign(" + serialized + "," + fields + ")"; } return serialized; } function serializeStringKeyAssignment(ctx, source, mainAssignments, key, value) { const base = ctx.base; const serialized = serialize(ctx, value); const check = Number(key); const isIdentifier = ( // Test if key is a valid positive number or JS identifier // so that we don't have to serialize the key and wrap with brackets check >= 0 && // It's also important to consider that if the key is // indeed numeric, we need to make sure that when // converted back into a string, it's still the same // to the original key. This allows us to differentiate // keys that has numeric formats but in a different // format, which can cause unintentional key declaration // Example: { 0x1: 1 } vs { '0x1': 1 } check.toString() === key || isValidIdentifier(key) ); if (isIndexedValueInStack(base, value)) { if (isIdentifier && check !== check) { createObjectAssign(ctx, source.i, key, serialized); } else { createArrayAssign( ctx, source.i, isIdentifier ? key : '"' + key + '"', serialized ); } } else { const parentAssignment = base.assignments; base.assignments = mainAssignments; if (isIdentifier && check !== check) { createObjectAssign(ctx, source.i, key, serialized); } else { createArrayAssign( ctx, source.i, isIdentifier ? key : '"' + key + '"', serialized ); } base.assignments = parentAssignment; } } function serializeAssignment(ctx, source, mainAssignments, key, value) { if (typeof key === "string") { serializeStringKeyAssignment(ctx, source, mainAssignments, key, value); } else { const base = ctx.base; const parent = base.stack; base.stack = []; const serialized = serialize(ctx, value); base.stack = parent; const parentAssignment = base.assignments; base.assignments = mainAssignments; createArrayAssign(ctx, source.i, serialize(ctx, key), serialized); base.assignments = parentAssignment; } } function serializeAssignments(ctx, source, node) { const keys = node.k; const len = keys.length; if (len > 0) { const mainAssignments = []; const values = node.v; ctx.base.stack.push(source.i); for (let i = 0; i < len; i++) { serializeAssignment(ctx, source, mainAssignments, keys[i], values[i]); } ctx.base.stack.pop(); return resolveAssignments(mainAssignments); } return NIL; } function serializeDictionary(ctx, node, init) { if (node.p) { const base = ctx.base; if (base.features & 8 /* ObjectAssign */) { init = serializeWithObjectAssign(ctx, node, node.p, init); } else { markSerializerRef(base, node.i); const assignments = serializeAssignments(ctx, node, node.p); if (assignments) { return "(" + assignIndexedValue2(ctx, node.i, init) + "," + assignments + getRefParam(ctx, node.i) + ")"; } } } return init; } function serializeNullConstructor(ctx, node) { pushObjectFlag(ctx, node.o, node.i); return serializeDictionary(ctx, node, NULL_CONSTRUCTOR); } function serializeDate(node) { return 'new Date("' + node.s + '")'; } function serializeRegExp(ctx, node) { if (ctx.base.features & 32 /* RegExp */) { return "/" + node.c + "/" + node.m; } throw new SerovalUnsupportedNodeError(node); } function serializeSetItem(ctx, id, item) { const base = ctx.base; if (isIndexedValueInStack(base, item)) { markSerializerRef(base, id); createAddAssignment( ctx, id, getRefParam(ctx, item.i) ); return ""; } return serialize(ctx, item); } function serializeSet(ctx, node) { let serialized = SET_CONSTRUCTOR; const items = node.a; const size = items.length; const id = node.i; if (size > 0) { ctx.base.stack.push(id); let result = serializeSetItem(ctx, id, items[0]); for (let i = 1, item = result; i < size; i++) { item = serializeSetItem(ctx, id, items[i]); result += (item && result && ",") + item; } ctx.base.stack.pop(); if (result) { serialized += "([" + result + "])"; } } return serialized; } function serializeMapEntry(ctx, id, key, val, sentinel) { const base = ctx.base; if (isIndexedValueInStack(base, key)) { const keyRef = getRefParam(ctx, key.i); markSerializerRef(base, id); if (isIndexedValueInStack(base, val)) { const valueRef = getRefParam(ctx, val.i); createSetAssignment(ctx, id, keyRef, valueRef); return ""; } if (val.t !== 4 /* IndexedValue */ && val.i != null && isSerializerRefMarked(base, val.i)) { const serialized = "(" + serialize(ctx, val) + ",[" + sentinel + "," + sentinel + "])"; createSetAssignment(ctx, id, keyRef, getRefParam(ctx, val.i)); createDeleteAssignment(ctx, id, sentinel); return serialized; } const parent = base.stack; base.stack = []; createSetAssignment(ctx, id, keyRef, serialize(ctx, val)); base.stack = parent; return ""; } if (isIndexedValueInStack(base, val)) { const valueRef = getRefParam(ctx, val.i); markSerializerRef(base, id); if (key.t !== 4 /* IndexedValue */ && key.i != null && isSerializerRefMarked(base, key.i)) { const serialized = "(" + serialize(ctx, key) + ",[" + sentinel + "," + sentinel + "])"; createSetAssignment(ctx, id, getRefParam(ctx, key.i), valueRef); createDeleteAssignment(ctx, id, sentinel); return serialized; } const parent = base.stack; base.stack = []; createSetAssignment(ctx, id, serialize(ctx, key), valueRef); base.stack = parent; return ""; } return "[" + serialize(ctx, key) + "," + serialize(ctx, val) + "]"; } function serializeMap(ctx, node) { let serialized = MAP_CONSTRUCTOR; const keys = node.e.k; const size = keys.length; const id = node.i; const sentinel = node.f; const sentinelId = getRefParam(ctx, sentinel.i); const base = ctx.base; if (size > 0) { const vals = node.e.v; base.stack.push(id); let result = serializeMapEntry(ctx, id, keys[0], vals[0], sentinelId); for (let i = 1, item = result; i < size; i++) { item = serializeMapEntry(ctx, id, keys[i], vals[i], sentinelId); result += (item && result && ",") + item; } base.stack.pop(); if (result) { serialized += "([" + result + "])"; } } if (sentinel.t === 26 /* SpecialReference */) { markSerializerRef(base, sentinel.i); serialized = "(" + serialize(ctx, sentinel) + "," + serialized + ")"; } return serialized; } function serializeArrayBuffer(ctx, node) { return getConstructor(ctx, node.f) + '("' + node.s + '")'; } function serializeTypedArray(ctx, node) { return "new " + node.c + "(" + serialize(ctx, node.f) + "," + node.b + "," + node.l + ")"; } function serializeDataView(ctx, node) { return "new DataView(" + serialize(ctx, node.f) + "," + node.b + "," + node.l + ")"; } function serializeAggregateError(ctx, node) { const id = node.i; ctx.base.stack.push(id); const serialized = serializeDictionary( ctx, node, 'new AggregateError([],"' + node.m + '")' ); ctx.base.stack.pop(); return serialized; } function serializeError(ctx, node) { return serializeDictionary( ctx, node, "new " + ERROR_CONSTRUCTOR_STRING[node.s] + '("' + node.m + '")' ); } function serializePromise(ctx, node) { let serialized; const fulfilled = node.f; const id = node.i; const promiseConstructor = node.s ? PROMISE_RESOLVE : PROMISE_REJECT; const base = ctx.base; if (isIndexedValueInStack(base, fulfilled)) { const ref = getRefParam(ctx, fulfilled.i); serialized = promiseConstructor + (node.s ? "().then(" + createFunction([], ref) + ")" : "().catch(" + createEffectfulFunction([], "throw " + ref) + ")"); } else { base.stack.push(id); const result = serialize(ctx, fulfilled); base.stack.pop(); serialized = promiseConstructor + "(" + result + ")"; } return serialized; } function serializeBoxed(ctx, node) { return "Object(" + serialize(ctx, node.f) + ")"; } function getConstructor(ctx, node) { const current = serialize(ctx, node); return node.t === 4 /* IndexedValue */ ? current : "(" + current + ")"; } function serializePromiseConstructor(ctx, node) { if (ctx.mode === 1 /* Vanilla */) { throw new SerovalUnsupportedNodeError(node); } const resolver = assignIndexedValue2( ctx, node.s, getConstructor(ctx, node.f) + "()" ); return "(" + resolver + ").p"; } function serializePromiseResolve(ctx, node) { if (ctx.mode === 1 /* Vanilla */) { throw new SerovalUnsupportedNodeError(node); } return getConstructor(ctx, node.a[0]) + "(" + getRefParam(ctx, node.i) + "," + serialize(ctx, node.a[1]) + ")"; } function serializePromiseReject(ctx, node) { if (ctx.mode === 1 /* Vanilla */) { throw new SerovalUnsupportedNodeError(node); } return getConstructor(ctx, node.a[0]) + "(" + getRefParam(ctx, node.i) + "," + serialize(ctx, node.a[1]) + ")"; } function serializePlugin(ctx, node) { const currentPlugins = ctx.base.plugins; if (currentPlugins) { for (let i = 0, len = currentPlugins.length; i < len; i++) { const plugin = currentPlugins[i]; if (plugin.tag === node.c) { if (ctx.child == null) { ctx.child = new SerializePluginContext(ctx); } return plugin.serialize(node.s, ctx.child, { id: node.i }); } } } throw new SerovalMissingPluginError(node.c); } function serializeIteratorFactory(ctx, node) { let result = ""; let initialized = false; if (node.f.t !== 4 /* IndexedValue */) { markSerializerRef(ctx.base, node.f.i); result = "(" + serialize(ctx, node.f) + ","; initialized = true; } result += assignIndexedValue2( ctx, node.i, "(" + SERIALIZED_ITERATOR_CONSTRUCTOR + ")(" + getRefParam(ctx, node.f.i) + ")" ); if (initialized) { result += ")"; } return result; } function serializeIteratorFactoryInstance(ctx, node) { return getConstructor(ctx, node.a[0]) + "(" + serialize(ctx, node.a[1]) + ")"; } function serializeAsyncIteratorFactory(ctx, node) { const promise = node.a[0]; const symbol = node.a[1]; const base = ctx.base; let result = ""; if (promise.t !== 4 /* IndexedValue */) { markSerializerRef(base, promise.i); result += "(" + serialize(ctx, promise); } if (symbol.t !== 4 /* IndexedValue */) { markSerializerRef(base, symbol.i); result += (result ? "," : "(") + serialize(ctx, symbol); } if (result) { result += ","; } const iterator = assignIndexedValue2( ctx, node.i, "(" + SERIALIZED_ASYNC_ITERATOR_CONSTRUCTOR + ")(" + getRefParam(ctx, symbol.i) + "," + getRefParam(ctx, promise.i) + ")" ); if (result) { return result + iterator + ")"; } return iterator; } function serializeAsyncIteratorFactoryInstance(ctx, node) { return getConstructor(ctx, node.a[0]) + "(" + serialize(ctx, node.a[1]) + ")"; } function serializeStreamConstructor(ctx, node) { const result = assignIndexedValue2( ctx, node.i, getConstructor(ctx, node.f) + "()" ); const len = node.a.length; if (len) { let values = serialize(ctx, node.a[0]); for (let i = 1; i < len; i++) { values += "," + serialize(ctx, node.a[i]); } return "(" + result + "," + values + "," + getRefParam(ctx, node.i) + ")"; } return result; } function serializeStreamNext(ctx, node) { return getRefParam(ctx, node.i) + ".next(" + serialize(ctx, node.f) + ")"; } function serializeStreamThrow(ctx, node) { return getRefParam(ctx, node.i) + ".throw(" + serialize(ctx, node.f) + ")"; } function serializeStreamReturn(ctx, node) { return getRefParam(ctx, node.i) + ".return(" + serialize(ctx, node.f) + ")"; } function serializeAssignable(ctx, node) { switch (node.t) { case 17 /* WKSymbol */: return SYMBOL_STRING[node.s]; case 18 /* Reference */: return serializeReference(node); case 9 /* Array */: return serializeArray(ctx, node); case 10 /* Object */: return serializeObject(ctx, node); case 11 /* NullConstructor */: return serializeNullConstructor(ctx, node); case 5 /* Date */: return serializeDate(node); case 6 /* RegExp */: return serializeRegExp(ctx, node); case 7 /* Set */: return serializeSet(ctx, node); case 8 /* Map */: return serializeMap(ctx, node); case 19 /* ArrayBuffer */: return serializeArrayBuffer(ctx, node); case 16 /* BigIntTypedArray */: case 15 /* TypedArray */: return serializeTypedArray(ctx, node); case 20 /* DataView */: return serializeDataView(ctx, node); case 14 /* AggregateError */: return serializeAggregateError(ctx, node); case 13 /* Error */: return serializeError(ctx, node); case 12 /* Promise */: return serializePromise(ctx, node); case 21 /* Boxed */: return serializeBoxed(ctx, node); case 22 /* PromiseConstructor */: return serializePromiseConstructor(ctx, node); case 25 /* Plugin */: return serializePlugin(ctx, node); case 26 /* SpecialReference */: return SPECIAL_REF_STRING[node.s]; default: throw new SerovalUnsupportedNodeError(node); } } function serialize(ctx, node) { switch (node.t) { case 2 /* Constant */: return CONSTANT_STRING[node.s]; case 0 /* Number */: return "" + node.s; case 1 /* String */: return '"' + node.s + '"'; case 3 /* BigInt */: return node.s + "n"; case 4 /* IndexedValue */: return getRefParam(ctx, node.i); case 23 /* PromiseSuccess */: return serializePromiseResolve(ctx, node); case 24 /* PromiseFailure */: return serializePromiseReject(ctx, node); case 27 /* IteratorFactory */: return serializeIteratorFactory(ctx, node); case 28 /* IteratorFactoryInstance */: return serializeIteratorFactoryInstance(ctx, node); case 29 /* AsyncIteratorFactory */: return serializeAsyncIteratorFactory(ctx, node); case 30 /* AsyncIteratorFactoryInstance */: return serializeAsyncIteratorFactoryInstance(ctx, node); case 31 /* StreamConstructor */: return serializeStreamConstructor(ctx, node); case 32 /* StreamNext */: return serializeStreamNext(ctx, node); case 33 /* StreamThrow */: return serializeStreamThrow(ctx, node); case 34 /* StreamReturn */: return serializeStreamReturn(ctx, node); default: return assignIndexedValue2(ctx, node.i, serializeAssignable(ctx, node)); } } function serializeTopVanilla(ctx, tree) { const result = serialize(ctx, tree); if (tree.i != null && ctx.state.vars.length) { const patches = resolvePatches(ctx.base); let body = result; if (patches) { const index = getRefParam(ctx, tree.i); body = result + "," + patches + index; if (!result.startsWith(index + "=")) { body = index + "=" + body; } body = "(" + body + ")"; } return "(" + createFunction(ctx.state.vars, body) + ")()"; } if (tree.t === 10 /* Object */) { return "(" + result + ")"; } return result; } function serializeTopCross(ctx, tree) { const result = serialize(ctx, tree); const id = tree.i; if (id == null) { return result; } const patches = resolvePatches(ctx.base); const ref = getRefParam(ctx, id); const scopeId = ctx.state.scopeId; const params = scopeId == null ? "" : GLOBAL_CONTEXT_REFERENCES; const body = patches ? "(" + result + "," + patches + ref + ")" : result; if (params === "") { if (tree.t === 10 /* Object */ && !patches) { return "(" + body + ")"; } return body; } const args = scopeId == null ? "()" : "(" + GLOBAL_CONTEXT_REFERENCES + '["' + serializeString(scopeId) + '"])'; return "(" + createFunction([params], body) + ")" + args; } // src/core/context/sync-parser.ts function createSyncParserContext(mode, options) { return { type: 1 /* Sync */, base: createBaseParserContext(mode, options), child: NIL }; } var SyncParsePluginContext = class { constructor(_p, depth) { this._p = _p; this.depth = depth; } parse(current) { return parseSOS(this._p, this.depth, current); } }; var StreamParsePluginContext = class { constructor(_p, depth) { this._p = _p; this.depth = depth; } parse(current) { return parseSOS(this._p, this.depth, current); } parseWithError(current) { return parseWithError(this._p, this.depth, current); } isAlive() { return this._p.state.alive; } pushPendingState() { pushPendingState(this._p); } popPendingState() { popPendingState(this._p); } onParse(node) { onParse(this._p, node); } onError(error) { onError(this._p, error); } }; function createStreamParserState(options) { return { alive: true, pending: 0, initial: true, buffer: [], onParse: options.onParse, onError: options.onError, onDone: options.onDone }; } function createStreamParserContext(options) { return { type: 2 /* Stream */, base: createBaseParserContext(2 /* Cross */, options), state: createStreamParserState(options) }; } function parseItems2(ctx, depth, current) { const nodes = []; for (let i = 0, len = current.length; i < len; i++) { if (i in current) { nodes[i] = parseSOS(ctx, depth, current[i]); } else { nodes[i] = 0; } } return nodes; } function parseArray2(ctx, depth, id, current) { return createArrayNode(id, current, parseItems2(ctx, depth, current)); } function parseProperties2(ctx, depth, properties) { const entries = Object.entries(properties); const keyNodes = []; const valueNodes = []; for (let i = 0, len = entries.length; i < len; i++) { keyNodes.push(serializeString(entries[i][0])); valueNodes.push(parseSOS(ctx, depth, entries[i][1])); } if (SYM_ITERATOR in properties) { keyNodes.push(parseWellKnownSymbol(ctx.base, SYM_ITERATOR)); valueNodes.push( createIteratorFactoryInstanceNode( parseIteratorFactory(ctx.base), parseSOS( ctx, depth, iteratorToSequence(properties) ) ) ); } if (SYM_ASYNC_ITERATOR in properties) { keyNodes.push(parseWellKnownSymbol(ctx.base, SYM_ASYNC_ITERATOR)); valueNodes.push( createAsyncIteratorFactoryInstanceNode( parseAsyncIteratorFactory(ctx.base), parseSOS( ctx, depth, ctx.type === 1 /* Sync */ ? createStream() : createStreamFromAsyncIterable( properties ) ) ) ); } if (SYM_TO_STRING_TAG in properties) { keyNodes.push(parseWellKnownSymbol(ctx.base, SYM_TO_STRING_TAG)); valueNodes.push(createStringNode(properties[SYM_TO_STRING_TAG])); } if (SYM_IS_CONCAT_SPREADABLE in properties) { keyNodes.push(parseWellKnownSymbol(ctx.base, SYM_IS_CONCAT_SPREADABLE)); valueNodes.push( properties[SYM_IS_CONCAT_SPREADABLE] ? TRUE_NODE : FALSE_NODE ); } return { k: keyNodes, v: valueNodes }; } function parsePlainObject2(ctx, depth, id, current, empty) { return createObjectNode( id, current, empty, parseProperties2(ctx, depth, current) ); } function parseBoxed2(ctx, depth, id, current) { return createBoxedNode(id, parseSOS(ctx, depth, current.valueOf())); } function parseTypedArray2(ctx, depth, id, current) { return createTypedArrayNode( id, current, parseSOS(ctx, depth, current.buffer) ); } function parseBigIntTypedArray2(ctx, depth, id, current) { return createBigIntTypedArrayNode( id, current, parseSOS(ctx, depth, current.buffer) ); } function parseDataView2(ctx, depth, id, current) { return createDataViewNode(id, current, parseSOS(ctx, depth, current.buffer)); } function parseError2(ctx, depth, id, current) { const options = getErrorOptions(current, ctx.base.features); return createErrorNode( id, current, options ? parseProperties2(ctx, depth, options) : NIL ); } function parseAggregateError2(ctx, depth, id, current) { const options = getErrorOptions(current, ctx.base.features); return createAggregateErrorNode( id, current, options ? parseProperties2(ctx, depth, options) : NIL ); } function parseMap2(ctx, depth, id, current) { const keyNodes = []; const valueNodes = []; for (const [key, value] of current.entries()) { keyNodes.push(parseSOS(ctx, depth, key)); valueNodes.push(parseSOS(ctx, depth, value)); } return createMapNode(ctx.base, id, keyNodes, valueNodes); } function parseSet2(ctx, depth, id, current) { const items = []; for (const item of current.keys()) { items.push(parseSOS(ctx, depth, item)); } return createSetNode(id, items); } function parseStream2(ctx, depth, id, current) { const result = createStreamConstructorNode( id, parseSpecialReference(ctx.base, 4 /* StreamConstructor */), [] ); if (ctx.type === 1 /* Sync */) { return result; } pushPendingState(ctx); current.on({ next: (value) => { if (ctx.state.alive) { const parsed = parseWithError(ctx, depth, value); if (parsed) { onParse(ctx, createStreamNextNode(id, parsed)); } } }, throw: (value) => { if (ctx.state.alive) { const parsed = parseWithError(ctx, depth, value); if (parsed) { onParse(ctx, createStreamThrowNode(id, parsed)); } } popPendingState(ctx); }, return: (value) => { if (ctx.state.alive) { const parsed = parseWithError(ctx, depth, value); if (parsed) { onParse(ctx, createStreamReturnNode(id, parsed)); } } popPendingState(ctx); } }); return result; } function handlePromiseSuccess(id, depth, data) { if (this.state.alive) { const parsed = parseWithError(this, depth, data); if (parsed) { onParse( this, createSerovalNode( 23 /* PromiseSuccess */, id, NIL, NIL, NIL, NIL, NIL, [ parseSpecialReference(this.base, 2 /* PromiseSuccess */), parsed ], NIL, NIL, NIL, NIL ) ); } popPendingState(this); } } function handlePromiseFailure(id, depth, data) { if (this.state.alive) { const parsed = parseWithError(this, depth, data); if (parsed) { onParse( this, createSerovalNode( 24 /* PromiseFailure */, id, NIL, NIL, NIL, NIL, NIL, [ parseSpecialReference(this.base, 3 /* PromiseFailure */), parsed ], NIL, NIL, NIL, NIL ) ); } } popPendingState(this); } function parsePromise2(ctx, depth, id, current) { const resolver = createIndexForValue(ctx.base, {}); if (ctx.type === 2 /* Stream */) { pushPendingState(ctx); current.then( handlePromiseSuccess.bind(ctx, resolver, depth), handlePromiseFailure.bind(ctx, resolver, depth) ); } return createPromiseConstructorNode(ctx.base, id, resolver); } function parsePluginSync(ctx, depth, id, current, currentPlugins) { for (let i = 0, len = currentPlugins.length; i < len; i++) { const plugin = currentPlugins[i]; if (plugin.parse.sync && plugin.test(current)) { return createPluginNode( id, plugin.tag, plugin.parse.sync(current, new SyncParsePluginContext(ctx, depth), { id }) ); } } return NIL; } function parsePluginStream(ctx, depth, id, current, currentPlugins) { for (let i = 0, len = currentPlugins.length; i < len; i++) { const plugin = currentPlugins[i]; if (plugin.parse.stream && plugin.test(current)) { return createPluginNode( id, plugin.tag, plugin.parse.stream(current, new StreamParsePluginContext(ctx, depth), { id }) ); } } return NIL; } function parsePlugin2(ctx, depth, id, current) { const currentPlugins = ctx.base.plugins; if (currentPlugins) { return ctx.type === 1 /* Sync */ ? parsePluginSync(ctx, depth, id, current, currentPlugins) : parsePluginStream(ctx, depth, id, current, currentPlugins); } return NIL; } function parseObjectPhase2(ctx, depth, id, current, currentClass) { switch (currentClass) { case Object: return parsePlainObject2( ctx, depth, id, current, false ); case NIL: return parsePlainObject2( ctx, depth, id, current, true ); case Date: return createDateNode(id, current); case Error: case EvalError: case RangeError: case ReferenceError: case SyntaxError: case TypeError: case URIError: return parseError2(ctx, depth, id, current); case Number: case Boolean: case String: case BigInt: return parseBoxed2(ctx, depth, id, current); case ArrayBuffer: return createArrayBufferNode( ctx.base, id, current ); case Int8Array: case Int16Array: case Int32Array: case Uint8Array: case Uint16Array: case Uint32Array: case Uint8ClampedArray: case Float32Array: case Float64Array: return parseTypedArray2( ctx, depth, id, current ); case DataView: return parseDataView2(ctx, depth, id, current); case Map: return parseMap2( ctx, depth, id, current ); case Set: return parseSet2(ctx, depth, id, current); default: break; } if (currentClass === Promise || current instanceof Promise) { return parsePromise2(ctx, depth, id, current); } const currentFeatures = ctx.base.features; if (currentFeatures & 32 /* RegExp */ && currentClass === RegExp) { return createRegExpNode(id, current); } if (currentFeatures & 16 /* BigIntTypedArray */) { switch (currentClass) { case BigInt64Array: case BigUint64Array: return parseBigIntTypedArray2( ctx, depth, id, current ); default: break; } } if (currentFeatures & 1 /* AggregateError */ && typeof AggregateError !== "undefined" && (currentClass === AggregateError || current instanceof AggregateError)) { return parseAggregateError2( ctx, depth, id, current ); } if (current instanceof Error) { return parseError2(ctx, depth, id, current); } if (SYM_ITERATOR in current || SYM_ASYNC_ITERATOR in current) { return parsePlainObject2(ctx, depth, id, current, !!currentClass); } throw new SerovalUnsupportedTypeError(current); } function parseObject(ctx, depth, id, current) { if (Array.isArray(current)) { return parseArray2(ctx, depth, id, current); } if (isStream(current)) { return parseStream2(ctx, depth, id, current); } const currentClass = current.constructor; if (currentClass === OpaqueReference) { return parseSOS( ctx, depth, current.replacement ); } const parsed = parsePlugin2(ctx, depth, id, current); if (parsed) { return parsed; } return parseObjectPhase2(ctx, depth, id, current, currentClass); } function parseFunction(ctx, depth, current) { const ref = getReferenceNode(ctx.base, current); if (ref.type !== 0 /* Fresh */) { return ref.value; } const plugin = parsePlugin2(ctx, depth, ref.value, current); if (plugin) { return plugin; } throw new SerovalUnsupportedTypeError(current); } function parseSOS(ctx, depth, current) { if (depth >= ctx.base.depthLimit) { throw new SerovalDepthLimitError(ctx.base.depthLimit); } switch (typeof current) { case "boolean": return current ? TRUE_NODE : FALSE_NODE; case "undefined": return UNDEFINED_NODE; case "string": return createStringNode(current); case "number": return createNumberNode(current); case "bigint": return createBigIntNode(current); case "object": { if (current) { const ref = getReferenceNode(ctx.base, current); return ref.type === 0 /* Fresh */ ? parseObject(ctx, depth + 1, ref.value, current) : ref.value; } return NULL_NODE; } case "symbol": return parseWellKnownSymbol(ctx.base, current); case "function": { return parseFunction(ctx, depth, current); } default: throw new SerovalUnsupportedTypeError(current); } } function parseTop(ctx, current) { try { return parseSOS(ctx, 0, current); } catch (error) { throw error instanceof SerovalParserError ? error : new SerovalParserError(error); } } function onParse(ctx, node) { if (ctx.state.initial) { ctx.state.buffer.push(node); } else { onParseInternal(ctx, node, false); } } function onError(ctx, error) { if (ctx.state.onError) { ctx.state.onError(error); } else { throw error instanceof SerovalParserError ? error : new SerovalParserError(error); } } function onDone(ctx) { if (ctx.state.onDone) { ctx.state.onDone(); } } function onParseInternal(ctx, node, initial) { try { ctx.state.onParse(node, initial); } catch (error) { onError(ctx, error); } } function pushPendingState(ctx) { ctx.state.pending++; } function popPendingState(ctx) { if (--ctx.state.pending <= 0) { onDone(ctx); } } function parseWithError(ctx, depth, current) { try { return parseSOS(ctx, depth, current); } catch (err) { onError(ctx, err); return NIL; } } function startStreamParse(ctx, current) { const parsed = parseWithError(ctx, 0, current); if (parsed) { onParseInternal(ctx, parsed, true); ctx.state.initial = false; flushStreamParse(ctx, ctx.state); if (ctx.state.pending <= 0) { destroyStreamParse(ctx); } } } function flushStreamParse(ctx, state) { for (let i = 0, len = state.buffer.length; i < len; i++) { onParseInternal(ctx, state.buffer[i], false); } } function destroyStreamParse(ctx) { if (ctx.state.alive) { onDone(ctx); ctx.state.alive = false; } } // src/core/cross/index.ts function crossSerialize(source, options = {}) { const plugins = resolvePlugins(options.plugins); const ctx = createSyncParserContext(2 /* Cross */, { plugins, disabledFeatures: options.disabledFeatures, refs: options.refs }); const tree = parseTop(ctx, source); const serial = createCrossSerializerContext({ plugins, features: ctx.base.features, scopeId: options.scopeId, markedRefs: ctx.base.marked }); return serializeTopCross(serial, tree); } async function crossSerializeAsync(source, options = {}) { const plugins = resolvePlugins(options.plugins); const ctx = createAsyncParserContext(2 /* Cross */, { plugins, disabledFeatures: options.disabledFeatures, refs: options.refs }); const tree = await parseTopAsync(ctx, source); const serial = createCrossSerializerContext({ plugins, features: ctx.base.features, scopeId: options.scopeId, markedRefs: ctx.base.marked }); return serializeTopCross(serial, tree); } function toCrossJSON(source, options = {}) { const plugins = resolvePlugins(options.plugins); const ctx = createSyncParserContext(2 /* Cross */, { plugins, disabledFeatures: options.disabledFeatures, refs: options.refs }); return parseTop(ctx, source); } async function toCrossJSONAsync(source, options = {}) { const plugins = resolvePlugins(options.plugins); const ctx = createAsyncParserContext(2 /* Cross */, { plugins, disabledFeatures: options.disabledFeatures, refs: options.refs }); return await parseTopAsync(ctx, source); } function crossSerializeStream(source, options) { const plugins = resolvePlugins(options.plugins); const ctx = createStreamParserContext({ plugins, refs: options.refs, disabledFeatures: options.disabledFeatures, onParse(node, initial) { const serial = createCrossSerializerContext({ plugins, features: ctx.base.features, scopeId: options.scopeId, markedRefs: ctx.base.marked }); let serialized; try { serialized = serializeTopCross(serial, node); } catch (err) { if (options.onError) { options.onError(err); } return; } options.onSerialize(serialized, initial); }, onError: options.onError, onDone: options.onDone }); startStreamParse(ctx, source); return destroyStreamParse.bind(null, ctx); } function toCrossJSONStream(source, options) { const plugins = resolvePlugins(options.plugins); const ctx = createStreamParserContext({ plugins, refs: options.refs, disabledFeatures: options.disabledFeatures, onParse: options.onParse, onError: options.onError, onDone: options.onDone }); startStreamParse(ctx, source); return destroyStreamParse.bind(null, ctx); } function fromCrossJSON(source, options) { const plugins = resolvePlugins(options.plugins); const ctx = createCrossDeserializerContext({ plugins, refs: options.refs, features: options.features, disabledFeatures: options.disabledFeatures }); return deserializeTop(ctx, source); } // src/core/Serializer.ts var Serializer = class { constructor(options) { this.options = options; this.alive = true; this.flushed = false; this.done = false; this.pending = 0; this.cleanups = []; this.refs = /* @__PURE__ */ new Map(); this.keys = /* @__PURE__ */ new Set(); this.ids = 0; this.plugins = resolvePlugins(options.plugins); } write(key, value) { if (this.alive && !this.flushed) { this.pending++; this.keys.add(key); this.cleanups.push( crossSerializeStream(value, { plugins: this.plugins, scopeId: this.options.scopeId, refs: this.refs, disabledFeatures: this.options.disabledFeatures, onError: this.options.onError, onSerialize: (data, initial) => { if (this.alive) { this.options.onData( initial ? this.options.globalIdentifier + '["' + serializeString(key) + '"]=' + data : data ); } }, onDone: () => { if (this.alive) { this.pending--; if (this.pending <= 0 && this.flushed && !this.done && this.options.onDone) { this.options.onDone(); this.done = true; } } } }) ); } } getNextID() { while (this.keys.has("" + this.ids)) { this.ids++; } return "" + this.ids; } push(value) { const newID = this.getNextID(); this.write(newID, value); return newID; } flush() { if (this.alive) { this.flushed = true; if (this.pending <= 0 && !this.done && this.options.onDone) { this.options.onDone(); this.done = true; } } } close() { if (this.alive) { for (let i = 0, len = this.cleanups.length; i < len; i++) { this.cleanups[i](); } if (!this.done && this.options.onDone) { this.options.onDone(); this.done = true; } this.alive = false; } } }; // src/core/tree/index.ts function serialize2(source, options = {}) { const plugins = resolvePlugins(options.plugins); const ctx = createSyncParserContext(1 /* Vanilla */, { plugins, disabledFeatures: options.disabledFeatures }); const tree = parseTop(ctx, source); const serial = createVanillaSerializerContext({ plugins, features: ctx.base.features, markedRefs: ctx.base.marked }); return serializeTopVanilla(serial, tree); } async function serializeAsync(source, options = {}) { const plugins = resolvePlugins(options.plugins); const ctx = createAsyncParserContext(1 /* Vanilla */, { plugins, disabledFeatures: options.disabledFeatures }); const tree = await parseTopAsync(ctx, source); const serial = createVanillaSerializerContext({ plugins, features: ctx.base.features, markedRefs: ctx.base.marked }); return serializeTopVanilla(serial, tree); } function deserialize2(source) { return (0, eval)(source); } function toJSON(source, options = {}) { const plugins = resolvePlugins(options.plugins); const ctx = createSyncParserContext(1 /* Vanilla */, { plugins, disabledFeatures: options.disabledFeatures }); return { t: parseTop(ctx, source), f: ctx.base.features, m: Array.from(ctx.base.marked) }; } async function toJSONAsync(source, options = {}) { const plugins = resolvePlugins(options.plugins); const ctx = createAsyncParserContext(1 /* Vanilla */, { plugins, disabledFeatures: options.disabledFeatures }); return { t: await parseTopAsync(ctx, source), f: ctx.base.features, m: Array.from(ctx.base.marked) }; } function compileJSON(source, options = {}) { const plugins = resolvePlugins(options.plugins); const ctx = createVanillaSerializerContext({ plugins, features: source.f, markedRefs: source.m }); return serializeTopVanilla(ctx, source.t); } function fromJSON(source, options = {}) { var _a; const plugins = resolvePlugins(options.plugins); const disabledFeatures = options.disabledFeatures || 0; const sourceFeatures = (_a = source.f) != null ? _a : ALL_ENABLED; const ctx = createVanillaDeserializerContext({ plugins, markedRefs: source.m, features: sourceFeatures & ~disabledFeatures, disabledFeatures }); return deserializeTop(ctx, source.t); } //# sourceMappingURL=index.cjs.map