seroval
Version:
Stringify JS values
4 lines • 252 kB
Source Map (JSON)
{
"version": 3,
"sources": ["../../../src/index.ts", "../../../src/core/compat.ts", "../../../src/core/symbols.ts", "../../../src/core/constants.ts", "../../../src/core/node.ts", "../../../src/core/literals.ts", "../../../src/core/string.ts", "../../../src/core/keys.ts", "../../../src/core/reference.ts", "../../../src/core/utils/error.ts", "../../../src/core/utils/get-object-flag.ts", "../../../src/core/base-primitives.ts", "../../../src/core/errors.ts", "../../../src/core/opaque-reference.ts", "../../../src/core/constructors.ts", "../../../src/core/sequence.ts", "../../../src/core/special-reference.ts", "../../../src/core/stream.ts", "../../../src/core/utils/promise-to-result.ts", "../../../src/core/context/parser.ts", "../../../src/core/context/async-parser.ts", "../../../src/core/plugin.ts", "../../../src/core/utils/typed-array.ts", "../../../src/core/context/deserializer.ts", "../../../src/core/function-string.ts", "../../../src/core/utils/get-identifier.ts", "../../../src/core/utils/is-valid-identifier.ts", "../../../src/core/context/serializer.ts", "../../../src/core/context/sync-parser.ts", "../../../src/core/cross/index.ts", "../../../src/core/Serializer.ts", "../../../src/core/tree/index.ts"],
"sourcesContent": ["export { Feature } from './core/compat';\nexport type {\n AsyncParsePluginContext,\n AsyncParserContextOptions,\n} from './core/context/async-parser';\nexport type {\n BaseDeserializerContextOptions,\n CrossDeserializerContextOptions,\n DeserializePluginContext,\n VanillaDeserializerContextOptions,\n} from './core/context/deserializer';\nexport type { BaseParserContextOptions } from './core/context/parser';\nexport type {\n BaseSerializerContextOptions,\n CrossContextOptions,\n CrossSerializerContextOptions,\n SerializePluginContext,\n VanillaSerializerContextOptions,\n} from './core/context/serializer';\nexport type {\n StreamParsePluginContext,\n StreamParserContextOptions,\n SyncParsePluginContext,\n SyncParserContextOptions,\n} from './core/context/sync-parser';\nexport * from './core/cross';\nexport * from './core/errors';\nexport { getCrossReferenceHeader } from './core/keys';\nexport { OpaqueReference } from './core/opaque-reference';\nexport * from './core/plugin';\nexport { createReference } from './core/reference';\nexport { default as Serializer } from './core/Serializer';\nexport { createStream } from './core/stream';\nexport type { Stream, StreamListener } from './core/stream';\nexport * from './core/tree';\nexport type { SerovalNode } from './core/types';\n", "/**\n * References\n * - https://compat-table.github.io/compat-table/es6/\n * - MDN\n */\n\nexport enum Feature {\n AggregateError = 0x01,\n // @deprecated\n ArrowFunction = 0x02,\n ErrorPrototypeStack = 0x04,\n ObjectAssign = 0x08,\n BigIntTypedArray = 0x10,\n RegExp = 0x20,\n}\n\nexport const ALL_ENABLED =\n Feature.AggregateError |\n Feature.ArrowFunction |\n Feature.ErrorPrototypeStack |\n Feature.ObjectAssign |\n Feature.BigIntTypedArray |\n Feature.RegExp;\n", "export const SYM_ASYNC_ITERATOR: typeof Symbol.asyncIterator = Symbol.asyncIterator;\nexport const SYM_HAS_INSTANCE: typeof Symbol.hasInstance = Symbol.hasInstance;\nexport const SYM_IS_CONCAT_SPREADABLE: typeof Symbol.isConcatSpreadable = Symbol.isConcatSpreadable;\nexport const SYM_ITERATOR: typeof Symbol.iterator = Symbol.iterator;\nexport const SYM_MATCH: typeof Symbol.match = Symbol.match;\nexport const SYM_MATCH_ALL: typeof Symbol.matchAll = Symbol.matchAll;\nexport const SYM_REPLACE: typeof Symbol.replace = Symbol.replace;\nexport const SYM_SEARCH: typeof Symbol.search = Symbol.search;\nexport const SYM_SPECIES: typeof Symbol.species = Symbol.species;\nexport const SYM_SPLIT: typeof Symbol.split = Symbol.split;\nexport const SYM_TO_PRIMITIVE: typeof Symbol.toPrimitive = Symbol.toPrimitive;\nexport const SYM_TO_STRING_TAG: typeof Symbol.toStringTag = Symbol.toStringTag;\nexport const SYM_UNSCOPABLES: typeof Symbol.unscopables = Symbol.unscopables;\n\n// For the future\n\n// export const SYM_DISPOSE = Symbol.dispose;\n// export const SYM_ASYNC_DISPOSE = Symbol.asyncDispose;\n", "import {\n SYM_ASYNC_ITERATOR,\n SYM_HAS_INSTANCE,\n SYM_IS_CONCAT_SPREADABLE,\n SYM_ITERATOR,\n SYM_MATCH,\n SYM_MATCH_ALL,\n SYM_REPLACE,\n SYM_SEARCH,\n SYM_SPECIES,\n SYM_SPLIT,\n SYM_TO_PRIMITIVE,\n SYM_TO_STRING_TAG,\n SYM_UNSCOPABLES,\n} from './symbols';\n\nexport const enum SerovalConstant {\n Null = 0,\n Undefined = 1,\n True = 2,\n False = 3,\n NegZero = 4,\n Inf = 5,\n NegInf = 6,\n Nan = 7,\n}\n\nexport const enum SerovalNodeType {\n Number = 0,\n String = 1,\n Constant = 2,\n BigInt = 3,\n IndexedValue = 4,\n Date = 5,\n RegExp = 6,\n Set = 7,\n Map = 8,\n Array = 9,\n Object = 10,\n NullConstructor = 11,\n Promise = 12,\n Error = 13,\n AggregateError = 14,\n TypedArray = 15,\n BigIntTypedArray = 16,\n WKSymbol = 17,\n Reference = 18,\n ArrayBuffer = 19,\n DataView = 20,\n Boxed = 21,\n PromiseConstructor = 22,\n PromiseSuccess = 23,\n PromiseFailure = 24,\n Plugin = 25,\n SpecialReference = 26,\n IteratorFactory = 27,\n IteratorFactoryInstance = 28,\n AsyncIteratorFactory = 29,\n AsyncIteratorFactoryInstance = 30,\n StreamConstructor = 31,\n StreamNext = 32,\n StreamThrow = 33,\n StreamReturn = 34,\n Sequence = 35,\n}\n\nexport const enum SerovalObjectFlags {\n None = 0,\n NonExtensible = 1,\n Sealed = 2,\n Frozen = 3,\n}\n\nexport const enum Symbols {\n AsyncIterator = 0,\n HasInstance = 1,\n IsConcatSpreadable = 2,\n Iterator = 3,\n Match = 4,\n MatchAll = 5,\n Replace = 6,\n Search = 7,\n Species = 8,\n Split = 9,\n ToPrimitive = 10,\n ToStringTag = 11,\n Unscopables = 12,\n}\n\nexport const SYMBOL_STRING: Record<Symbols, string> = {\n [Symbols.AsyncIterator]: 'Symbol.asyncIterator',\n [Symbols.HasInstance]: 'Symbol.hasInstance',\n [Symbols.IsConcatSpreadable]: 'Symbol.isConcatSpreadable',\n [Symbols.Iterator]: 'Symbol.iterator',\n [Symbols.Match]: 'Symbol.match',\n [Symbols.MatchAll]: 'Symbol.matchAll',\n [Symbols.Replace]: 'Symbol.replace',\n [Symbols.Search]: 'Symbol.search',\n [Symbols.Species]: 'Symbol.species',\n [Symbols.Split]: 'Symbol.split',\n [Symbols.ToPrimitive]: 'Symbol.toPrimitive',\n [Symbols.ToStringTag]: 'Symbol.toStringTag',\n [Symbols.Unscopables]: 'Symbol.unscopables',\n};\n\nexport const INV_SYMBOL_REF = /* @__PURE__ */ {\n [SYM_ASYNC_ITERATOR]: Symbols.AsyncIterator,\n [SYM_HAS_INSTANCE]: Symbols.HasInstance,\n [SYM_IS_CONCAT_SPREADABLE]: Symbols.IsConcatSpreadable,\n [SYM_ITERATOR]: Symbols.Iterator,\n [SYM_MATCH]: Symbols.Match,\n [SYM_MATCH_ALL]: Symbols.MatchAll,\n [SYM_REPLACE]: Symbols.Replace,\n [SYM_SEARCH]: Symbols.Search,\n [SYM_SPECIES]: Symbols.Species,\n [SYM_SPLIT]: Symbols.Split,\n [SYM_TO_PRIMITIVE]: Symbols.ToPrimitive,\n [SYM_TO_STRING_TAG]: Symbols.ToStringTag,\n [SYM_UNSCOPABLES]: Symbols.Unscopables,\n};\n\nexport type WellKnownSymbols = keyof typeof INV_SYMBOL_REF;\n\nexport const SYMBOL_REF: Record<Symbols, WellKnownSymbols> = {\n [Symbols.AsyncIterator]: SYM_ASYNC_ITERATOR,\n [Symbols.HasInstance]: SYM_HAS_INSTANCE,\n [Symbols.IsConcatSpreadable]: SYM_IS_CONCAT_SPREADABLE,\n [Symbols.Iterator]: SYM_ITERATOR,\n [Symbols.Match]: SYM_MATCH,\n [Symbols.MatchAll]: SYM_MATCH_ALL,\n [Symbols.Replace]: SYM_REPLACE,\n [Symbols.Search]: SYM_SEARCH,\n [Symbols.Species]: SYM_SPECIES,\n [Symbols.Split]: SYM_SPLIT,\n [Symbols.ToPrimitive]: SYM_TO_PRIMITIVE,\n [Symbols.ToStringTag]: SYM_TO_STRING_TAG,\n [Symbols.Unscopables]: SYM_UNSCOPABLES,\n};\n\nexport const CONSTANT_STRING: Record<SerovalConstant, string> = {\n [SerovalConstant.True]: '!0',\n [SerovalConstant.False]: '!1',\n [SerovalConstant.Undefined]: 'void 0',\n [SerovalConstant.Null]: 'null',\n [SerovalConstant.NegZero]: '-0',\n [SerovalConstant.Inf]: '1/0',\n [SerovalConstant.NegInf]: '-1/0',\n [SerovalConstant.Nan]: '0/0',\n};\n\nexport const NIL = void 0;\n\nexport const CONSTANT_VAL: Record<SerovalConstant, unknown> = {\n [SerovalConstant.True]: true,\n [SerovalConstant.False]: false,\n [SerovalConstant.Undefined]: NIL,\n [SerovalConstant.Null]: null,\n [SerovalConstant.NegZero]: -0,\n [SerovalConstant.Inf]: Number.POSITIVE_INFINITY,\n [SerovalConstant.NegInf]: Number.NEGATIVE_INFINITY,\n [SerovalConstant.Nan]: Number.NaN,\n};\n\nexport const enum ErrorConstructorTag {\n Error = 0,\n EvalError = 1,\n RangeError = 2,\n ReferenceError = 3,\n SyntaxError = 4,\n TypeError = 5,\n URIError = 6,\n}\n\nexport const ERROR_CONSTRUCTOR_STRING: Record<ErrorConstructorTag, string> = {\n [ErrorConstructorTag.Error]: 'Error',\n [ErrorConstructorTag.EvalError]: 'EvalError',\n [ErrorConstructorTag.RangeError]: 'RangeError',\n [ErrorConstructorTag.ReferenceError]: 'ReferenceError',\n [ErrorConstructorTag.SyntaxError]: 'SyntaxError',\n [ErrorConstructorTag.TypeError]: 'TypeError',\n [ErrorConstructorTag.URIError]: 'URIError',\n};\n\ntype ErrorConstructors =\n | ErrorConstructor\n | EvalErrorConstructor\n | RangeErrorConstructor\n | ReferenceErrorConstructor\n | SyntaxErrorConstructor\n | TypeErrorConstructor\n | URIErrorConstructor;\n\nexport const ERROR_CONSTRUCTOR: Record<ErrorConstructorTag, ErrorConstructors> =\n {\n [ErrorConstructorTag.Error]: Error,\n [ErrorConstructorTag.EvalError]: EvalError,\n [ErrorConstructorTag.RangeError]: RangeError,\n [ErrorConstructorTag.ReferenceError]: ReferenceError,\n [ErrorConstructorTag.SyntaxError]: SyntaxError,\n [ErrorConstructorTag.TypeError]: TypeError,\n [ErrorConstructorTag.URIError]: URIError,\n };\n", "import type { SerovalNodeType } from './constants';\nimport type { SerovalNode } from './types';\n\ntype ExtractedNodeType<T extends SerovalNodeType> = Extract<\n SerovalNode,\n { t: T }\n>;\n\nexport function createSerovalNode<\n T extends SerovalNodeType,\n N extends ExtractedNodeType<T>,\n>(\n t: T,\n i: N['i'],\n s: N['s'],\n c: N['c'],\n m: N['m'],\n p: N['p'],\n e: N['e'],\n a: N['a'],\n f: N['f'],\n b: N['b'],\n o: N['o'],\n l: N['l'],\n): N {\n return {\n t,\n i,\n s,\n c,\n m,\n p,\n e,\n a,\n f,\n b,\n o,\n l,\n } as N;\n}\n", "import { NIL, SerovalConstant, SerovalNodeType } from './constants';\nimport { createSerovalNode } from './node';\nimport type { SerovalConstantNode } from './types';\n\nfunction createConstantNode(value: SerovalConstant): SerovalConstantNode {\n return createSerovalNode(\n SerovalNodeType.Constant,\n NIL,\n value,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport const TRUE_NODE = /* @__PURE__ */ createConstantNode(\n SerovalConstant.True,\n);\nexport const FALSE_NODE = /* @__PURE__ */ createConstantNode(\n SerovalConstant.False,\n);\nexport const UNDEFINED_NODE = /* @__PURE__ */ createConstantNode(\n SerovalConstant.Undefined,\n);\nexport const NULL_NODE = /* @__PURE__ */ createConstantNode(\n SerovalConstant.Null,\n);\nexport const NEG_ZERO_NODE = /* @__PURE__ */ createConstantNode(\n SerovalConstant.NegZero,\n);\nexport const INFINITY_NODE = /* @__PURE__ */ createConstantNode(\n SerovalConstant.Inf,\n);\nexport const NEG_INFINITY_NODE = /* @__PURE__ */ createConstantNode(\n SerovalConstant.NegInf,\n);\nexport const NAN_NODE = /* @__PURE__ */ createConstantNode(SerovalConstant.Nan);\n", "import { NIL } from './constants';\n\nexport function serializeChar(str: string): string | undefined {\n switch (str) {\n case '\"':\n return '\\\\\"';\n case '\\\\':\n return '\\\\\\\\';\n case '\\n':\n return '\\\\n';\n case '\\r':\n return '\\\\r';\n case '\\b':\n return '\\\\b';\n case '\\t':\n return '\\\\t';\n case '\\f':\n return '\\\\f';\n case '<':\n return '\\\\x3C';\n case '\\u2028':\n return '\\\\u2028';\n case '\\u2029':\n return '\\\\u2029';\n default:\n return NIL;\n }\n}\n\n// Written by https://github.com/DylanPiercey and is distributed under the MIT license.\n// Creates a JavaScript double quoted string and escapes all characters\n// not listed as DoubleStringCharacters on\n// Also includes \"<\" to escape \"</script>\" and \"\\\" to avoid invalid escapes in the output.\n// http://www.ecma-international.org/ecma-262/5.1/#sec-7.8.4\nexport function serializeString(str: string): string {\n let result = '';\n let lastPos = 0;\n let replacement: string | undefined;\n for (let i = 0, len = str.length; i < len; i++) {\n replacement = serializeChar(str[i]);\n if (replacement) {\n result += str.slice(lastPos, i) + replacement;\n lastPos = i + 1;\n }\n }\n if (lastPos === 0) {\n result = str;\n } else {\n result += str.slice(lastPos);\n }\n return result;\n}\n\nfunction deserializeReplacer(str: string): string {\n switch (str) {\n case '\\\\\\\\':\n return '\\\\';\n case '\\\\\"':\n return '\"';\n case '\\\\n':\n return '\\n';\n case '\\\\r':\n return '\\r';\n case '\\\\b':\n return '\\b';\n case '\\\\t':\n return '\\t';\n case '\\\\f':\n return '\\f';\n case '\\\\x3C':\n return '\\x3C';\n case '\\\\u2028':\n return '\\u2028';\n case '\\\\u2029':\n return '\\u2029';\n default:\n return str;\n }\n}\n\nexport function deserializeString(str: string): string {\n return str.replace(\n /(\\\\\\\\|\\\\\"|\\\\n|\\\\r|\\\\b|\\\\t|\\\\f|\\\\u2028|\\\\u2029|\\\\x3C)/g,\n deserializeReplacer,\n );\n}\n", "import { serializeString } from './string';\n\n// Used for mapping isomorphic references\nexport const REFERENCES_KEY = '__SEROVAL_REFS__';\n\nexport const GLOBAL_CONTEXT_REFERENCES = '$R';\n\nconst GLOBAL_CONTEXT_R = `self.${GLOBAL_CONTEXT_REFERENCES}`;\n\nexport function getCrossReferenceHeader(id?: string): string {\n if (id == null) {\n return `${GLOBAL_CONTEXT_R}=${GLOBAL_CONTEXT_R}||[]`;\n }\n return `(${GLOBAL_CONTEXT_R}=${GLOBAL_CONTEXT_R}||{})[\"${serializeString(\n id,\n )}\"]=[]`;\n}\n", "import {\n SerovalMissingReferenceError,\n SerovalMissingReferenceForIdError,\n} from '..';\nimport { REFERENCES_KEY } from './keys';\n\nconst REFERENCE = new Map<unknown, string>();\nconst INV_REFERENCE = new Map<string, unknown>();\n\nexport function createReference<T>(id: string, value: T): T {\n REFERENCE.set(value, id);\n INV_REFERENCE.set(id, value);\n return value;\n}\n\nexport function hasReferenceID<T>(value: T): boolean {\n return REFERENCE.has(value);\n}\n\nexport function hasReference(id: string): boolean {\n return INV_REFERENCE.has(id);\n}\n\nexport function getReferenceID<T>(value: T): string {\n if (hasReferenceID(value)) {\n return REFERENCE.get(value)!;\n }\n throw new SerovalMissingReferenceError(value);\n}\n\nexport function getReference<T>(id: string): T {\n if (hasReference(id)) {\n return INV_REFERENCE.get(id) as T;\n }\n throw new SerovalMissingReferenceForIdError(id);\n}\n\nif (typeof globalThis !== 'undefined') {\n Object.defineProperty(globalThis, REFERENCES_KEY, {\n value: INV_REFERENCE,\n configurable: true,\n writable: false,\n enumerable: false,\n });\n} else if (typeof window !== 'undefined') {\n Object.defineProperty(window, REFERENCES_KEY, {\n value: INV_REFERENCE,\n configurable: true,\n writable: false,\n enumerable: false,\n });\n} else if (typeof self !== 'undefined') {\n Object.defineProperty(self, REFERENCES_KEY, {\n value: INV_REFERENCE,\n configurable: true,\n writable: false,\n enumerable: false,\n });\n} else if (typeof global !== 'undefined') {\n Object.defineProperty(global, REFERENCES_KEY, {\n value: INV_REFERENCE,\n configurable: true,\n writable: false,\n enumerable: false,\n });\n}\n", "import { Feature } from '../compat';\nimport { ERROR_CONSTRUCTOR_STRING, ErrorConstructorTag } from '../constants';\n\ntype ErrorValue =\n | Error\n | AggregateError\n | EvalError\n | RangeError\n | ReferenceError\n | TypeError\n | SyntaxError\n | URIError;\n\nexport function getErrorConstructor(error: ErrorValue): ErrorConstructorTag {\n if (error instanceof EvalError) {\n return ErrorConstructorTag.EvalError;\n }\n if (error instanceof RangeError) {\n return ErrorConstructorTag.RangeError;\n }\n if (error instanceof ReferenceError) {\n return ErrorConstructorTag.ReferenceError;\n }\n if (error instanceof SyntaxError) {\n return ErrorConstructorTag.SyntaxError;\n }\n if (error instanceof TypeError) {\n return ErrorConstructorTag.TypeError;\n }\n if (error instanceof URIError) {\n return ErrorConstructorTag.URIError;\n }\n return ErrorConstructorTag.Error;\n}\n\nfunction getInitialErrorOptions(\n error: Error,\n): Record<string, unknown> | undefined {\n const construct = ERROR_CONSTRUCTOR_STRING[getErrorConstructor(error)];\n // Name has been modified\n if (error.name !== construct) {\n return { name: error.name };\n }\n if (error.constructor.name !== construct) {\n // Otherwise, name is overriden because\n // the Error class is extended\n return { name: error.constructor.name };\n }\n return {};\n}\n\nexport function getErrorOptions(\n error: Error,\n features: number,\n): Record<string, unknown> | undefined {\n let options = getInitialErrorOptions(error);\n const names = Object.getOwnPropertyNames(error);\n for (let i = 0, len = names.length, name: string; i < len; i++) {\n name = names[i];\n if (name !== 'name' && name !== 'message') {\n if (name === 'stack') {\n if (features & Feature.ErrorPrototypeStack) {\n options = options || {};\n options[name] = error[name as keyof Error];\n }\n } else {\n options = options || {};\n options[name] = error[name as keyof Error];\n }\n }\n }\n return options;\n}\n", "import { SerovalObjectFlags } from '../constants';\n\nexport function getObjectFlag(obj: unknown): SerovalObjectFlags {\n if (Object.isFrozen(obj)) {\n return SerovalObjectFlags.Frozen;\n }\n if (Object.isSealed(obj)) {\n return SerovalObjectFlags.Sealed;\n }\n if (Object.isExtensible(obj)) {\n return SerovalObjectFlags.None;\n }\n return SerovalObjectFlags.NonExtensible;\n}\n", "import type { WellKnownSymbols } from './constants';\nimport { INV_SYMBOL_REF, NIL, SerovalNodeType } from './constants';\nimport {\n INFINITY_NODE,\n NAN_NODE,\n NEG_INFINITY_NODE,\n NEG_ZERO_NODE,\n} from './literals';\nimport { createSerovalNode } from './node';\nimport { getReferenceID } from './reference';\nimport { serializeString } from './string';\nimport type {\n SerovalAggregateErrorNode,\n SerovalArrayNode,\n SerovalAsyncIteratorFactoryInstanceNode,\n SerovalBigIntNode,\n SerovalBigIntTypedArrayNode,\n SerovalBoxedNode,\n SerovalConstantNode,\n SerovalDataViewNode,\n SerovalDateNode,\n SerovalErrorNode,\n SerovalIndexedValueNode,\n SerovalIteratorFactoryInstanceNode,\n SerovalNode,\n SerovalNodeWithID,\n SerovalNumberNode,\n SerovalObjectRecordNode,\n SerovalPluginNode,\n SerovalReferenceNode,\n SerovalRegExpNode,\n SerovalSequenceNode,\n SerovalSetNode,\n SerovalStreamConstructorNode,\n SerovalStreamNextNode,\n SerovalStreamReturnNode,\n SerovalStreamThrowNode,\n SerovalStringNode,\n SerovalTypedArrayNode,\n SerovalWKSymbolNode,\n} from './types';\nimport { getErrorConstructor } from './utils/error';\nimport { getObjectFlag } from './utils/get-object-flag';\nimport type {\n BigIntTypedArrayValue,\n TypedArrayValue,\n} from './utils/typed-array';\n\nexport function createNumberNode(\n value: number,\n): SerovalConstantNode | SerovalNumberNode {\n switch (value) {\n case Number.POSITIVE_INFINITY:\n return INFINITY_NODE;\n case Number.NEGATIVE_INFINITY:\n return NEG_INFINITY_NODE;\n }\n if (value !== value) {\n return NAN_NODE;\n }\n if (Object.is(value, -0)) {\n return NEG_ZERO_NODE;\n }\n return createSerovalNode(\n SerovalNodeType.Number,\n NIL,\n value,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createStringNode(value: string): SerovalStringNode {\n return createSerovalNode(\n SerovalNodeType.String,\n NIL,\n serializeString(value),\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createBigIntNode(current: bigint): SerovalBigIntNode {\n return createSerovalNode(\n SerovalNodeType.BigInt,\n NIL,\n '' + current,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createIndexedValueNode(id: number): SerovalIndexedValueNode {\n return createSerovalNode(\n SerovalNodeType.IndexedValue,\n id,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createDateNode(id: number, current: Date): SerovalDateNode {\n const timestamp = current.valueOf();\n return createSerovalNode(\n SerovalNodeType.Date,\n id,\n timestamp !== timestamp ? '' : current.toISOString(),\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createRegExpNode(\n id: number,\n current: RegExp,\n): SerovalRegExpNode {\n return createSerovalNode(\n SerovalNodeType.RegExp,\n id,\n NIL,\n serializeString(current.source),\n current.flags,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createWKSymbolNode(\n id: number,\n current: WellKnownSymbols,\n): SerovalWKSymbolNode {\n return createSerovalNode(\n SerovalNodeType.WKSymbol,\n id,\n INV_SYMBOL_REF[current],\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createReferenceNode<T>(\n id: number,\n ref: T,\n): SerovalReferenceNode {\n return createSerovalNode(\n SerovalNodeType.Reference,\n id,\n serializeString(getReferenceID(ref)),\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createPluginNode(\n id: number,\n tag: string,\n value: Record<string, SerovalNode>,\n): SerovalPluginNode {\n return createSerovalNode(\n SerovalNodeType.Plugin,\n id,\n value,\n serializeString(tag),\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createArrayNode(\n id: number,\n current: unknown[],\n parsedItems: SerovalArrayNode['a'],\n): SerovalArrayNode {\n return createSerovalNode(\n SerovalNodeType.Array,\n id,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n parsedItems,\n NIL,\n NIL,\n getObjectFlag(current),\n NIL,\n );\n}\n\nexport function createBoxedNode(\n id: number,\n boxed: SerovalNode,\n): SerovalBoxedNode {\n return createSerovalNode(\n SerovalNodeType.Boxed,\n id,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n boxed,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createTypedArrayNode(\n id: number,\n current: TypedArrayValue,\n buffer: SerovalNode,\n): SerovalTypedArrayNode {\n return createSerovalNode(\n SerovalNodeType.TypedArray,\n id,\n NIL,\n current.constructor.name,\n NIL,\n NIL,\n NIL,\n NIL,\n buffer,\n current.byteOffset,\n NIL,\n current.length,\n );\n}\n\nexport function createBigIntTypedArrayNode(\n id: number,\n current: BigIntTypedArrayValue,\n buffer: SerovalNode,\n): SerovalBigIntTypedArrayNode {\n return createSerovalNode(\n SerovalNodeType.BigIntTypedArray,\n id,\n NIL,\n current.constructor.name,\n NIL,\n NIL,\n NIL,\n NIL,\n buffer,\n current.byteOffset,\n NIL,\n current.byteLength,\n );\n}\n\nexport function createDataViewNode(\n id: number,\n current: DataView,\n buffer: SerovalNode,\n): SerovalDataViewNode {\n return createSerovalNode(\n SerovalNodeType.DataView,\n id,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n buffer,\n current.byteOffset,\n NIL,\n current.byteLength,\n );\n}\n\nexport function createErrorNode(\n id: number,\n current: Error,\n options: SerovalObjectRecordNode | undefined,\n): SerovalErrorNode {\n return createSerovalNode(\n SerovalNodeType.Error,\n id,\n getErrorConstructor(current),\n NIL,\n serializeString(current.message),\n options,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createAggregateErrorNode(\n id: number,\n current: AggregateError,\n options: SerovalObjectRecordNode | undefined,\n): SerovalAggregateErrorNode {\n return createSerovalNode(\n SerovalNodeType.AggregateError,\n id,\n getErrorConstructor(current),\n NIL,\n serializeString(current.message),\n options,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createSetNode(\n id: number,\n items: SerovalNode[],\n): SerovalSetNode {\n return createSerovalNode(\n SerovalNodeType.Set,\n id,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n items,\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createIteratorFactoryInstanceNode(\n factory: SerovalNodeWithID,\n items: SerovalNodeWithID,\n): SerovalIteratorFactoryInstanceNode {\n return createSerovalNode(\n SerovalNodeType.IteratorFactoryInstance,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n [factory, items],\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createAsyncIteratorFactoryInstanceNode(\n factory: SerovalNodeWithID,\n items: SerovalNodeWithID,\n): SerovalAsyncIteratorFactoryInstanceNode {\n return createSerovalNode(\n SerovalNodeType.AsyncIteratorFactoryInstance,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n [factory, items],\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createStreamConstructorNode(\n id: number,\n factory: SerovalNodeWithID,\n sequence: SerovalNode[],\n): SerovalStreamConstructorNode {\n return createSerovalNode(\n SerovalNodeType.StreamConstructor,\n id,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n sequence,\n factory,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createStreamNextNode(\n id: number,\n parsed: SerovalNode,\n): SerovalStreamNextNode {\n return createSerovalNode(\n SerovalNodeType.StreamNext,\n id,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n parsed,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createStreamThrowNode(\n id: number,\n parsed: SerovalNode,\n): SerovalStreamThrowNode {\n return createSerovalNode(\n SerovalNodeType.StreamThrow,\n id,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n parsed,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createStreamReturnNode(\n id: number,\n parsed: SerovalNode,\n): SerovalStreamReturnNode {\n return createSerovalNode(\n SerovalNodeType.StreamReturn,\n id,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n parsed,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function createSequenceNode(\n id: number,\n sequence: SerovalNode[],\n throwAt: number,\n doneAt: number,\n): SerovalSequenceNode {\n return createSerovalNode(\n SerovalNodeType.Sequence,\n id,\n throwAt,\n NIL,\n NIL,\n NIL,\n NIL,\n sequence,\n NIL,\n NIL,\n NIL,\n doneAt,\n );\n}\n", "/// <reference types=\"pridepack/env\" />\n\nimport { serializeString } from './string';\nimport type { SerovalNode } from './types';\n\nconst { toString: objectToString } = /* @__PURE__ */ Object.prototype;\n\nconst enum StepErrorCodes {\n Parse = 1,\n Serialize = 2,\n Deserialize = 3,\n}\n\nfunction getErrorMessageDev(type: string, cause: unknown): string {\n if (cause instanceof Error) {\n return `Seroval caught an error during the ${type} process.\n\n${cause.name}\n${cause.message}\n\n- For more information, please check the \"cause\" property of this error.\n- If you believe this is an error in Seroval, please submit an issue at https://github.com/lxsmnsyc/seroval/issues/new`;\n }\n return `Seroval caught an error during the ${type} process.\n\n\"${objectToString.call(cause)}\"\n\nFor more information, please check the \"cause\" property of this error.`;\n}\n\nconst STEP_ERROR_CODES: Record<string, StepErrorCodes> = {\n parsing: StepErrorCodes.Parse,\n serialization: StepErrorCodes.Serialize,\n deserialization: StepErrorCodes.Deserialize,\n};\n\nfunction getErrorMessageProd(type: string): string {\n return `Seroval Error (step: ${STEP_ERROR_CODES[type]})`;\n}\n\nconst getErrorMessage = (type: string, cause: any) =>\n import.meta.env.PROD\n ? getErrorMessageProd(type)\n : getErrorMessageDev(type, cause);\n\nexport class SerovalError extends Error {\n constructor(\n type: string,\n public cause: unknown,\n ) {\n super(getErrorMessage(type, cause));\n }\n}\n\nexport class SerovalParserError extends SerovalError {\n constructor(cause: unknown) {\n super('parsing', cause);\n }\n}\n\nexport class SerovalSerializationError extends SerovalError {\n constructor(cause: unknown) {\n super('serialization', cause);\n }\n}\n\nexport class SerovalDeserializationError extends SerovalError {\n constructor(cause: unknown) {\n super('deserialization', cause);\n }\n}\n\nconst enum SpecificErrorCodes {\n UnsupportedType = 1,\n UnsupportedNode = 2,\n MissingPlugin = 3,\n MissingInstance = 4,\n MissingReference = 5,\n MissingReferenceForId = 6,\n UnknownTypedArray = 7,\n MalformedNode = 8,\n ConflictedNodeId = 9,\n DepthLimit = 10,\n}\n\nfunction getSpecificErrorMessage(code: SpecificErrorCodes): string {\n return `Seroval Error (specific: ${code})`;\n}\n\nexport class SerovalUnsupportedTypeError extends Error {\n constructor(public value: unknown) {\n super(\n import.meta.env.PROD\n ? getSpecificErrorMessage(SpecificErrorCodes.UnsupportedType)\n : `The value ${objectToString.call(value)} of type \"${typeof value}\" cannot be parsed/serialized.\n \nThere are few workarounds for this problem:\n- Transform the value in a way that it can be serialized.\n- If the reference is present on multiple runtimes (isomorphic), you can use the Reference API to map the references.`,\n );\n }\n}\n\nexport class SerovalUnsupportedNodeError extends Error {\n constructor(node: SerovalNode) {\n super(\n import.meta.env.PROD\n ? getSpecificErrorMessage(SpecificErrorCodes.UnsupportedNode)\n : 'Unsupported node type \"' + node.t + '\".',\n );\n }\n}\n\nexport class SerovalMissingPluginError extends Error {\n constructor(tag: string) {\n super(\n import.meta.env.PROD\n ? getSpecificErrorMessage(SpecificErrorCodes.MissingPlugin)\n : 'Missing plugin for tag \"' + tag + '\".',\n );\n }\n}\n\nexport class SerovalMissingInstanceError extends Error {\n constructor(tag: string) {\n super(\n import.meta.env.PROD\n ? getSpecificErrorMessage(SpecificErrorCodes.MissingInstance)\n : 'Missing \"' + tag + '\" instance.',\n );\n }\n}\n\nexport class SerovalMissingReferenceError extends Error {\n constructor(public value: unknown) {\n super(\n import.meta.env.PROD\n ? getSpecificErrorMessage(SpecificErrorCodes.MissingReference)\n : 'Missing reference for the value \"' +\n objectToString.call(value) +\n '\" of type \"' +\n typeof value +\n '\"',\n );\n }\n}\n\nexport class SerovalMissingReferenceForIdError extends Error {\n constructor(id: string) {\n super(\n import.meta.env.PROD\n ? getSpecificErrorMessage(SpecificErrorCodes.MissingReferenceForId)\n : 'Missing reference for id \"' + serializeString(id) + '\"',\n );\n }\n}\n\nexport class SerovalUnknownTypedArrayError extends Error {\n constructor(name: string) {\n super(\n import.meta.env.PROD\n ? getSpecificErrorMessage(SpecificErrorCodes.UnknownTypedArray)\n : 'Unknown TypedArray \"' + name + '\"',\n );\n }\n}\n\nexport class SerovalMalformedNodeError extends Error {\n constructor(node: SerovalNode) {\n super(\n import.meta.env.PROD\n ? getSpecificErrorMessage(SpecificErrorCodes.MalformedNode)\n : 'Malformed node type \"' + node.t + '\".',\n );\n }\n}\n\nexport class SerovalConflictedNodeIdError extends Error {\n constructor(node: SerovalNode) {\n super(\n import.meta.env.PROD\n ? getSpecificErrorMessage(SpecificErrorCodes.ConflictedNodeId)\n : 'Conflicted node id \"' + node.i + '\".',\n );\n }\n}\n\nexport class SerovalDepthLimitError extends Error {\n constructor(limit: number) {\n super(\n import.meta.env.PROD\n ? getSpecificErrorMessage(SpecificErrorCodes.ConflictedNodeId)\n : 'Depth limit of ' + limit + ' reached',\n );\n }\n}\n", "/**\n * An opaque reference allows hiding values from the serializer.\n */\nexport class OpaqueReference<V, R = undefined> {\n constructor(\n public readonly value: V,\n public readonly replacement?: R,\n ) {}\n}\n", "import { Sequence } from './sequence';\nimport type { Stream } from './stream';\n\ntype SpecialPromise = Promise<unknown> & { s?: 1 | 2; v?: unknown };\n\nexport interface PromiseConstructorResolver {\n p: SpecialPromise;\n s: (value: unknown) => void;\n f: (value: unknown) => void;\n}\n\nexport const PROMISE_CONSTRUCTOR = (): PromiseConstructorResolver => {\n const resolver = {\n p: 0,\n s: 0,\n f: 0,\n } as unknown as PromiseConstructorResolver;\n resolver.p = new Promise((resolve, reject) => {\n resolver.s = resolve;\n resolver.f = reject;\n });\n return resolver;\n};\n\nexport const PROMISE_SUCCESS = (\n resolver: PromiseConstructorResolver,\n data: unknown,\n): void => {\n resolver.s(data);\n resolver.p.s = 1;\n resolver.p.v = data;\n};\n\nexport const PROMISE_FAILURE = (\n resolver: PromiseConstructorResolver,\n data: unknown,\n): void => {\n resolver.f(data);\n resolver.p.s = 2;\n resolver.p.v = data;\n};\n\nexport const SERIALIZED_PROMISE_CONSTRUCTOR =\n /* @__PURE__ */ PROMISE_CONSTRUCTOR.toString();\nexport const SERIALIZED_PROMISE_SUCCESS =\n /* @__PURE__ */ PROMISE_SUCCESS.toString();\nexport const SERIALIZED_PROMISE_FAILURE =\n /* @__PURE__ */ PROMISE_FAILURE.toString();\n\ninterface StreamListener<T> {\n next(value: T): void;\n throw(value: unknown): void;\n return(value: T): void;\n}\n\nexport const STREAM_CONSTRUCTOR = () => {\n const buffer: unknown[] = [];\n const listeners: StreamListener<unknown>[] = [];\n let alive = true;\n let success = false;\n let count = 0;\n const flush = (\n value: unknown,\n mode: keyof StreamListener<unknown>,\n x?: number,\n ) => {\n for (x = 0; x < count; x++) {\n if (listeners[x]) {\n listeners[x][mode](value);\n }\n }\n };\n const up = (\n listener: StreamListener<unknown>,\n x?: number,\n z?: number,\n current?: unknown,\n ) => {\n for (x = 0, z = buffer.length; x < z; x++) {\n current = buffer[x];\n if (!alive && x === z - 1) {\n listener[success ? 'return' : 'throw'](current);\n } else {\n listener.next(current);\n }\n }\n };\n const on = (listener: StreamListener<unknown>, temp?: number) => {\n if (alive) {\n temp = count++;\n listeners[temp] = listener;\n }\n up(listener);\n return () => {\n if (alive) {\n listeners[temp!] = listeners[count];\n listeners[count--] = undefined as any;\n }\n };\n };\n return {\n __SEROVAL_STREAM__: true,\n on: (listener: StreamListener<unknown>) => on(listener),\n next: (value: unknown) => {\n if (alive) {\n buffer.push(value);\n flush(value, 'next');\n }\n },\n throw: (value: unknown) => {\n if (alive) {\n buffer.push(value);\n flush(value, 'throw');\n alive = false;\n success = false;\n listeners.length = 0;\n }\n },\n return: (value: unknown) => {\n if (alive) {\n buffer.push(value);\n flush(value, 'return');\n alive = false;\n success = true;\n listeners.length = 0;\n }\n },\n };\n};\n\nexport const SERIALIZED_STREAM_CONSTRUCTOR =\n /* @__PURE__ */ STREAM_CONSTRUCTOR.toString();\n\nexport const ITERATOR_CONSTRUCTOR =\n (symbol: symbol) => (sequence: Sequence) => () => {\n let index = 0;\n const instance = {\n [symbol]: () => instance,\n next: () => {\n if (index > sequence.d) {\n return {\n done: true,\n value: undefined,\n };\n }\n const currentIndex = index++;\n const data = sequence.v[currentIndex];\n if (currentIndex === sequence.t) {\n throw data;\n }\n return {\n done: currentIndex === sequence.d,\n value: data,\n };\n },\n };\n return instance;\n };\n\nexport const SERIALIZED_ITERATOR_CONSTRUCTOR =\n /* @__PURE__ */ ITERATOR_CONSTRUCTOR.toString();\n\nexport const ASYNC_ITERATOR_CONSTRUCTOR =\n (symbol: symbol, createPromise: typeof PROMISE_CONSTRUCTOR) =>\n (stream: Stream<unknown>) =>\n () => {\n let count = 0;\n let doneAt = -1;\n let isThrow = false;\n const buffer: unknown[] = [];\n const pending: PromiseConstructorResolver[] = [];\n const finalize = (i = 0, len = pending.length) => {\n for (; i < len; i++) {\n pending[i].s({\n done: true,\n value: undefined,\n });\n }\n };\n stream.on({\n next: value => {\n const temp = pending.shift();\n if (temp) {\n temp.s({ done: false, value });\n }\n buffer.push(value);\n },\n throw: value => {\n const temp = pending.shift();\n if (temp) {\n temp.f(value);\n }\n finalize();\n doneAt = buffer.length;\n isThrow = true;\n buffer.push(value);\n },\n return: value => {\n const temp = pending.shift();\n if (temp) {\n temp.s({ done: true, value });\n }\n finalize();\n doneAt = buffer.length;\n buffer.push(value);\n },\n });\n\n const instance = {\n [symbol]: () => instance,\n next: () => {\n if (doneAt === -1) {\n const index = count++;\n if (index >= buffer.length) {\n const temp = createPromise();\n pending.push(temp);\n return temp.p;\n }\n return {\n done: false,\n value: buffer[index],\n };\n }\n if (count > doneAt) {\n return {\n done: true,\n value: undefined,\n };\n }\n const index = count++;\n const value = buffer[index];\n if (index !== doneAt) {\n return {\n done: false,\n value,\n };\n }\n if (isThrow) {\n throw value;\n }\n return {\n done: true,\n value,\n };\n },\n };\n\n return instance;\n };\n\nexport const SERIALIZED_ASYNC_ITERATOR_CONSTRUCTOR =\n /* @__PURE__ */ ASYNC_ITERATOR_CONSTRUCTOR.toString();\n\nexport const ARRAY_BUFFER_CONSTRUCTOR = (b64: string) => {\n const decoded = atob(b64);\n const length = decoded.length;\n const arr = new Uint8Array(length);\n for (let i = 0; i < length; i++) {\n arr[i] = decoded.charCodeAt(i);\n }\n return arr.buffer;\n};\n\nexport const SERIALIZED_ARRAY_BUFFER_CONSTRUCTOR =\n /* @__PURE__ */ ARRAY_BUFFER_CONSTRUCTOR.toString();\n", "import { ITERATOR_CONSTRUCTOR } from \"./constructors\";\nimport { SYM_ITERATOR } from \"./symbols\";\n\nexport interface Sequence {\n __SEROVAL_SEQUENCE__: true;\n\n v: unknown[];\n t: number;\n d: number;\n}\n\nexport function isSequence(value: object): value is Sequence {\n return '__SEROVAL_SEQUENCE__' in value;\n}\n\nexport function createSequence(values: unknown[], throwAt: number, doneAt: number): Sequence {\n return {\n __SEROVAL_SEQUENCE__: true,\n\n v: values,\n t: throwAt,\n d: doneAt,\n };\n}\n\nexport function createSequenceFromIterable<T>(source: Iterable<T>): Sequence {\n const values: unknown[] = [];\n let throwsAt = -1;\n let doneAt = -1;\n const iterator = source[SYM_ITERATOR]();\n\n while (true) {\n try {\n const value = iterator.next();\n values.push(value.value);\n if (value.done) {\n doneAt = values.length - 1;\n break;\n }\n } catch (error) {\n throwsAt = values.length;\n values.push(error);\n }\n }\n\n return createSequence(values, throwsAt, doneAt);\n}\n\nconst createIterator = ITERATOR_CONSTRUCTOR(SYM_ITERATOR);\n\nexport function sequenceToIterator<T>(\n sequence: Sequence,\n): () => IterableIterator<T> {\n return createIterator(sequence) as unknown as () => IterableIterator<T>;\n}\n", "import {\n SERIALIZED_ARRAY_BUFFER_CONSTRUCTOR,\n SERIALIZED_PROMISE_CONSTRUCTOR,\n SERIALIZED_PROMISE_FAILURE,\n SERIALIZED_PROMISE_SUCCESS,\n SERIALIZED_STREAM_CONSTRUCTOR,\n} from './constructors';\n\nexport const ITERATOR = {};\n\nexport const ASYNC_ITERATOR = {};\n\nexport const enum SpecialReference {\n MapSentinel = 0,\n PromiseConstructor = 1,\n PromiseSuccess = 2,\n PromiseFailure = 3,\n StreamConstructor = 4,\n ArrayBufferConstructor = 5,\n}\n\n/**\n * Placeholder references\n */\nexport const SPECIAL_REFS: Record<SpecialReference, unknown> = {\n [SpecialReference.MapSentinel]: {},\n [SpecialReference.PromiseConstructor]: {},\n [SpecialReference.PromiseSuccess]: {},\n [SpecialReference.PromiseFailure]: {},\n [SpecialReference.StreamConstructor]: {},\n [SpecialReference.ArrayBufferConstructor]: {},\n};\n\nexport const SPECIAL_REF_STRING: Record<SpecialReference, string> = {\n [SpecialReference.MapSentinel]: '[]',\n [SpecialReference.PromiseConstructor]: SERIALIZED_PROMISE_CONSTRUCTOR,\n [SpecialReference.PromiseSuccess]: SERIALIZED_PROMISE_SUCCESS,\n [SpecialReference.PromiseFailure]: SERIALIZED_PROMISE_FAILURE,\n [SpecialReference.StreamConstructor]: SERIALIZED_STREAM_CONSTRUCTOR,\n [SpecialReference.ArrayBufferConstructor]:\n SERIALIZED_ARRAY_BUFFER_CONSTRUCTOR,\n};\n", "import {\n ASYNC_ITERATOR_CONSTRUCTOR,\n PROMISE_CONSTRUCTOR,\n STREAM_CONSTRUCTOR,\n} from './constructors';\nimport { SYM_ASYNC_ITERATOR } from './symbols';\n\nexport interface StreamListener<T> {\n next(value: T): void;\n throw(value: unknown): void;\n return(value: T): void;\n}\n\nexport interface Stream<T> {\n __SEROVAL_STREAM__: true;\n\n on(listener: StreamListener<T>): () => void;\n\n next(value: T): void;\n throw(value: unknown): void;\n return(value: T): void;\n}\n\nexport function isStream<T>(value: object): value is Stream<T> {\n return '__SEROVAL_STREAM__' in value;\n}\n\nexport function createStream<T>(): Stream<T> {\n return STREAM_CONSTRUCTOR() as unknown as Stream<T>;\n}\n\nexport function createStreamFromAsyncIterable<T>(\n iterable: AsyncIterable<T>,\n): Stream<T> {\n const stream = createStream<T>();\n\n const iterator = iterable[SYM_ASYNC_ITERATOR]();\n\n async function push(): Promise<void> {\n try {\n const value = await iterator.next();\n if (value.done) {\n stream.return(value.value as T);\n } else {\n stream.next(value.value);\n await push();\n }\n } catch (error) {\n stream.throw(error);\n }\n }\n\n push().catch(() => {\n // no-op\n });\n\n return stream;\n}\n\nconst createAsyncIterable = ASYNC_ITERATOR_CONSTRUCTOR(\n SYM_ASYNC_ITERATOR,\n PROMISE_CONSTRUCTOR,\n);\n\nexport function streamToAsyncIterable<T>(\n stream: Stream<T>,\n): () => AsyncIterableIterator<T> {\n return createAsyncIterable(\n stream,\n ) as unknown as () => AsyncIterableIterator<T>;\n}\n", "export default async function promiseToResult(\n current: Promise<unknown>,\n): Promise<[0 | 1, unknown]> {\n try {\n return [1, await current];\n } catch (e) {\n return [0, e];\n }\n}\n", "import {\n createIndexedValueNode,\n createReferenceNode,\n createWKSymbolNode,\n} from '../base-primitives';\nimport { ALL_ENABLED } from '../compat';\nimport type { WellKnownSymbols } from '../constants';\nimport { INV_SYMBOL_REF, NIL, SerovalNodeType } from '../constants';\nimport { SerovalUnsupportedTypeError } from '../errors';\nimport { createSerovalNode } from '../node';\nimport type { PluginAccessOptions, SerovalMode } from '../plugin';\nimport { hasReferenceID } from '../reference';\nimport {\n ASYNC_ITERATOR,\n ITERATOR,\n SPECIAL_REFS,\n SpecialReference,\n} from '../special-reference';\nimport { serializeString } from '../string';\nimport { SYM_ASYNC_ITERATOR, SYM_ITERATOR } from '../symbols';\nimport type {\n SerovalArrayBufferNode,\n SerovalAsyncIteratorFactoryNode,\n SerovalIndexedValueNode,\n SerovalIteratorFactoryNode,\n SerovalMapNode,\n SerovalNode,\n SerovalNullConstructorNode,\n SerovalObjectNode,\n SerovalObjectRecordNode,\n SerovalPromiseConstructorNode,\n SerovalReferenceNode,\n SerovalSpecialReferenceNode,\n SerovalWKSymbolNode,\n} from '../types';\nimport { getObjectFlag } from '../utils/get-object-flag';\n\nexport interface BaseParserContextOptions extends PluginAccessOptions {\n disabledFeatures?: number;\n refs?: Map<unknown, number>;\n depthLimit?: number;\n}\n\nexport const enum ParserNodeType {\n Fresh = 0,\n Indexed = 1,\n Referenced = 2,\n}\n\nexport interface FreshNode {\n type: ParserNodeType.Fresh;\n value: number;\n}\n\nexport interface IndexedNode {\n type: ParserNodeType.Indexed;\n value: SerovalIndexedValueNode;\n}\n\nexport interface ReferencedNode {\n type: ParserNodeType.Referenced;\n value: SerovalReferenceNode;\n}\n\ntype ObjectNode = FreshNode | IndexedNode | ReferencedNode;\n\nexport interface BaseParserContext extends PluginAccessOptions {\n readonly mode: SerovalMode;\n\n marked: Set<number>;\n\n refs: Map<unknown, number>;\n\n features: number;\n\n depthLimit: number;\n}\n\nexport function createBaseParserContext(\n mode: SerovalMode,\n options: BaseParserContextOptions,\n): BaseParserContext {\n return {\n plugins: options.plugins,\n mode,\n marked: new Set(),\n features: ALL_ENABLED ^ (options.disabledFeatures || 0),\n refs: options.refs || new Map(),\n depthLimit: options.depthLimit || 1000,\n };\n}\n\n/**\n * Ensures that the value (based on an identifier) has been visited by the parser.\n * @param ctx\n * @param id\n */\nexport function markParserRef(ctx: BaseParserContext, id: number): void {\n ctx.marked.add(id);\n}\n\nexport function isParserRefMarked(ctx: BaseParserContext, id: number): boolean {\n return ctx.marked.has(id);\n}\n\n/**\n * Creates an identifier for a value\n * @param ctx\n * @param current\n */\nexport function createIndexForValue<T>(\n ctx: BaseParserContext,\n current: T,\n): number {\n const id = ctx.refs.size;\n ctx.refs.set(current, id);\n return id;\n}\n\nexport function getNodeForIndexedValue<T>(\n ctx: BaseParserContext,\n current: T,\n): FreshNode | IndexedNode {\n const registeredId = ctx.refs.get(current);\n if (registeredId != null) {\n markParserRef(ctx, registeredId);\n return {\n type: ParserNodeType.Indexed,\n value: createIndexedValueNode(registeredId),\n };\n }\n return {\n type: ParserNodeType.Fresh,\n value: createIndexForValue(ctx, current),\n };\n}\n\nexport function getReferenceNode<T>(\n ctx: BaseParserContext,\n current: T,\n): ObjectNode {\n const indexed = getNodeForIndexedValue(ctx, current);\n if (indexed.type === ParserNodeType.Indexed) {\n return indexed;\n }\n // Special references are special ;)\n if (hasReferenceID(current)) {\n return {\n type: ParserNodeType.Referenced,\n value: createReferenceNode(indexed.value, current),\n };\n }\n return indexed;\n}\n\n/**\n * Parsing methods\n */\nexport function parseWellKnownSymbol(\n ctx: BaseParserContext,\n current: symbol,\n): SerovalIndexedValueNode | SerovalWKSymbolNode | SerovalReferenceNode {\n const ref = getReferenceNode(ctx, current);\n if (ref.type !== ParserNodeType.Fresh) {\n return ref.value;\n }\n if (current in INV_SYMBOL_REF) {\n return createWKSymbolNode(ref.value, current as WellKnownSymbols);\n }\n throw new SerovalUnsupportedTypeError(current);\n}\n\nexport function parseSpecialReference(\n ctx: BaseParserContext,\n ref: SpecialReference,\n): SerovalIndexedValueNode | SerovalSpecialReferenceNode {\n const result = getNodeForIndexedValue(ctx, SPECIAL_REFS[ref]);\n if (result.type === ParserNodeType.Indexed) {\n return result.value;\n }\n return createSerovalNode(\n SerovalNodeType.SpecialReference,\n result.value,\n ref,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function parseIteratorFactory(\n ctx: BaseParserContext,\n): SerovalIndexedValueNode | SerovalIteratorFactoryNode {\n const result = getNodeForIndexedValue(ctx, ITERATOR);\n if (result.type === ParserNodeType.Indexed) {\n return result.value;\n }\n return createSerovalNode(\n SerovalNodeType.IteratorFactory,\n result.value,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n NIL,\n parseWellKnownSymbol(ctx, SYM_ITERATOR),\n NIL,\n NIL,\n NIL,\n );\n}\n\nexport function parseAsyncIteratorFactory(\n ctx: BaseParserContext,\n): SerovalIndexedValueNode | SerovalAsyncIteratorFactoryNode {\n const result = getNodeForIndexedValue(ctx, ASYNC_ITERATOR);\n if (result.type === ParserNodeType.Indexed) {\n