From b8057478ae0076afe4d14147c40e6e32043dd061 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 9 Nov 2023 10:29:24 +0800 Subject: [PATCH 01/82] Rework Iterable serialization and function string output --- packages/seroval/src/core/base/async.ts | 3 +- packages/seroval/src/core/base/sync.ts | 3 +- packages/seroval/src/core/cross/serialize.ts | 11 +- packages/seroval/src/core/function-string.ts | 29 + .../seroval/src/core/iterator-to-sequence.ts | 47 + packages/seroval/src/core/plugin.ts | 2 +- .../src/core/serializer-context.new.ts | 1168 ----------------- ...r-context.old.ts => serializer-context.ts} | 72 +- packages/seroval/src/core/tree/deserialize.ts | 6 +- packages/seroval/src/core/tree/serialize.ts | 20 +- .../test/__snapshots__/array.test.ts.snap | 18 +- .../__snapshots__/boxed-bigint.test.ts.snap | 8 +- .../__snapshots__/boxed-boolean.test.ts.snap | 16 +- .../__snapshots__/boxed-number.test.ts.snap | 40 +- .../__snapshots__/boxed-string.test.ts.snap | 16 +- .../test/__snapshots__/data-view.test.ts.snap | 8 +- .../test/__snapshots__/date.test.ts.snap | 8 +- .../test/__snapshots__/error.test.ts.snap | 26 +- .../__snapshots__/frozen-object.test.ts.snap | 42 +- .../test/__snapshots__/iterable.test.ts.snap | 40 +- .../test/__snapshots__/map.test.ts.snap | 22 +- .../__snapshots__/mutual-cycle.test.ts.snap | 30 +- .../null-constructor.test.ts.snap | 42 +- .../test/__snapshots__/object.test.ts.snap | 42 +- .../test/__snapshots__/plugin.test.ts.snap | 8 +- .../test/__snapshots__/promise.test.ts.snap | 4 +- .../test/__snapshots__/reference.test.ts.snap | 8 +- .../test/__snapshots__/regexp.test.ts.snap | 8 +- .../__snapshots__/sealed-object.test.ts.snap | 42 +- .../test/__snapshots__/set.test.ts.snap | 20 +- .../__snapshots__/sparse-array.test.ts.snap | 8 +- .../__snapshots__/typed-array.test.ts.snap | 8 +- .../__snapshots__/wk-symbols.test.ts.snap | 104 +- .../web-api/__snapshots__/blob.test.ts.snap | 2 +- .../__snapshots__/custom-event.test.ts.snap | 8 +- .../__snapshots__/dom-exception.test.ts.snap | 8 +- .../web-api/__snapshots__/event.test.ts.snap | 8 +- .../web-api/__snapshots__/file.test.ts.snap | 2 +- .../__snapshots__/form-data.test.ts.snap | 8 +- .../__snapshots__/headers.test.ts.snap | 8 +- .../readable-stream.test.ts.snap | 14 +- .../__snapshots__/request.test.ts.snap | 8 +- .../__snapshots__/response.test.ts.snap | 8 +- .../url-search-params.test.ts.snap | 8 +- .../web-api/__snapshots__/url.test.ts.snap | 8 +- 45 files changed, 459 insertions(+), 1560 deletions(-) create mode 100644 packages/seroval/src/core/function-string.ts create mode 100644 packages/seroval/src/core/iterator-to-sequence.ts delete mode 100644 packages/seroval/src/core/serializer-context.new.ts rename packages/seroval/src/core/{serializer-context.old.ts => serializer-context.ts} (95%) diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index 108bbf17..eb957dc8 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -28,6 +28,7 @@ import { FALSE_NODE, UNDEFINED_NODE, } from '../literals'; +import { iteratorToSequence } from '../iterator-to-sequence'; import { BaseParserContext } from '../parser-context'; import promiseToResult from '../promise-to-result'; import { hasReferenceID } from '../reference'; @@ -226,7 +227,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { if (this.features & Feature.Symbol) { if (Symbol.iterator in properties) { keyNodes.push(SerovalObjectRecordSpecialKey.SymbolIterator); - valueNodes.push(await this.parse(Array.from(properties as Iterable))); + valueNodes.push(await this.parse(iteratorToSequence(properties as Iterable))); } } return { diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index 6cee70ad..ff8fc986 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -24,6 +24,7 @@ import { TRUE_NODE, UNDEFINED_NODE, } from '../literals'; +import { iteratorToSequence } from '../iterator-to-sequence'; import type { BaseParserContextOptions } from '../parser-context'; import { BaseParserContext } from '../parser-context'; import { hasReferenceID } from '../reference'; @@ -140,7 +141,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { if (this.features & Feature.Symbol) { if (Symbol.iterator in properties) { keyNodes.push(SerovalObjectRecordSpecialKey.SymbolIterator); - valueNodes.push(this.parse(Array.from(properties as Iterable))); + valueNodes.push(this.parse(iteratorToSequence(properties as Iterable))); } } return { diff --git a/packages/seroval/src/core/cross/serialize.ts b/packages/seroval/src/core/cross/serialize.ts index b359a6db..de7e2a1a 100644 --- a/packages/seroval/src/core/cross/serialize.ts +++ b/packages/seroval/src/core/cross/serialize.ts @@ -17,12 +17,12 @@ import { GLOBAL_CONTEXT_STREAM_EMIT, GLOBAL_CONTEXT_API, } from '../keys'; -import type { BaseSerializerContextOptions } from '../serializer-context.old'; -import BaseSerializerContext from '../serializer-context.old'; +import type { BaseSerializerContextOptions } from '../serializer-context'; +import BaseSerializerContext from '../serializer-context'; import type { SerovalMode } from '../plugin'; -import { Feature } from '../compat'; import { serializeString } from '../string'; import type { CrossContextOptions } from './cross-parser'; +import { createFunction } from '../function-string'; export interface CrossSerializerContextOptions extends BaseSerializerContextOptions, CrossContextOptions { @@ -109,9 +109,6 @@ export default class CrossSerializerContext extends BaseSerializerContext { } const args = this.scopeId == null ? '()' : '(' + GLOBAL_CONTEXT_REFERENCES + '["' + serializeString(this.scopeId) + '"])'; const body = mainBody + (patches ? ref : ''); - if (this.features & Feature.ArrowFunction) { - return '(' + params + '=>(' + body + '))' + args; - } - return '(function(' + params + '){return ' + body + '})' + args; + return '(' + createFunction(this.features, [params], body) + ')' + args; } } diff --git a/packages/seroval/src/core/function-string.ts b/packages/seroval/src/core/function-string.ts new file mode 100644 index 00000000..74bded12 --- /dev/null +++ b/packages/seroval/src/core/function-string.ts @@ -0,0 +1,29 @@ +import { Feature } from './compat'; + +export function createFunction( + features: number, + parameters: string[], + body: string, +): string { + if (features & Feature.ArrowFunction) { + const joined = parameters.length === 1 + ? parameters[0] + : '(' + parameters.join(',') + ')'; + return joined + '=>' + body; + } + return 'function(' + parameters.join(',') + '){return' + body + '}'; +} + +export function createEffectulFunction( + features: number, + parameters: string[], + body: string, +): string { + if (features & Feature.ArrowFunction) { + const joined = parameters.length === 1 + ? parameters[0] + : '(' + parameters.join(',') + ')'; + return joined + '=>{' + body + '}'; + } + return 'function(' + parameters.join(',') + '){' + body + '}'; +} diff --git a/packages/seroval/src/core/iterator-to-sequence.ts b/packages/seroval/src/core/iterator-to-sequence.ts new file mode 100644 index 00000000..05efda85 --- /dev/null +++ b/packages/seroval/src/core/iterator-to-sequence.ts @@ -0,0 +1,47 @@ +export interface Sequence { + v: unknown[]; + t: number; +} + +export function iteratorToSequence(source: Iterable): Sequence { + const values: unknown[] = []; + let throwsAt = -1; + + const iterator = source[Symbol.iterator](); + + while (true) { + try { + const value = iterator.next(); + values.push(value.value); + if (value.done) { + break; + } + } catch (error) { + throwsAt = values.length; + values.push(error); + } + } + + return { + v: values, + t: throwsAt, + }; +} + +export function sequenceToIterator(sequence: Sequence): Iterator { + let index = 0; + + return { + next(): IteratorResult { + const currentIndex = index++; + const currentItem = sequence.v[currentIndex]; + if (currentIndex === sequence.t) { + throw currentItem; + } + return { + done: currentIndex === sequence.v.length - 1, + value: currentItem as T, + }; + }, + }; +} diff --git a/packages/seroval/src/core/plugin.ts b/packages/seroval/src/core/plugin.ts index cc63a76a..e6ba7239 100644 --- a/packages/seroval/src/core/plugin.ts +++ b/packages/seroval/src/core/plugin.ts @@ -1,7 +1,7 @@ import type BaseAsyncParserContext from './base/async'; import type BaseStreamParserContext from './base/stream'; import type BaseSyncParserContext from './base/sync'; -import type BaseSerializerContext from './serializer-context.old'; +import type BaseSerializerContext from './serializer-context'; import type VanillaDeserializerContext from './tree/deserialize'; export type SerovalMode = 'vanilla' | 'cross'; diff --git a/packages/seroval/src/core/serializer-context.new.ts b/packages/seroval/src/core/serializer-context.new.ts deleted file mode 100644 index a97dbd71..00000000 --- a/packages/seroval/src/core/serializer-context.new.ts +++ /dev/null @@ -1,1168 +0,0 @@ -import { Feature } from './compat'; -import { - CONSTANT_STRING, - ERROR_CONSTRUCTOR_STRING, - SYMBOL_STRING, - SerovalNodeType, - SerovalObjectFlags, -} from './constants'; -import getIdentifier from './get-identifier'; -import { REFERENCES_KEY } from './keys'; -import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; -import { isValidIdentifier } from './shared'; -import type { - SerovalArrayNode, - SerovalIndexedValueNode, - SerovalNode, - SerovalObjectRecordKey, - SerovalObjectRecordNode, - SerovalReferenceNode, - SerovalObjectNode, - SerovalNullConstructorNode, - SerovalRegExpNode, - SerovalDateNode, - SerovalSetNode, - SerovalMapNode, - SerovalArrayBufferNode, - SerovalTypedArrayNode, - SerovalBigIntTypedArrayNode, - SerovalDataViewNode, - SerovalAggregateErrorNode, - SerovalErrorNode, - SerovalPromiseNode, - SerovalWKSymbolNode, - SerovalURLNode, - SerovalURLSearchParamsNode, - SerovalBlobNode, - SerovalFileNode, - SerovalHeadersNode, - SerovalFormDataNode, - SerovalBoxedNode, - SerovalRequestNode, - SerovalResponseNode, - SerovalEventNode, - SerovalCustomEventNode, - SerovalDOMExceptionNode, - SerovalPluginNode, - SerovalPromiseConstructorNode, - SerovalPromiseResolveNode, - SerovalPromiseRejectNode, - SerovalReadableStreamConstructorNode, - SerovalReadableStreamEnqueueNode, - SerovalReadableStreamErrorNode, - SerovalReadableStreamCloseNode, -} from './types'; -import { - SerovalObjectRecordSpecialKey, -} from './types'; - -interface IndexAssignment { - t: 'index'; - s: string; - k: undefined; - v: string; -} - -interface SetAssignment { - t: 'set'; - s: string; - k: string; - v: string; -} - -interface AddAssignment { - t: 'add'; - s: string; - k: undefined; - v: string; -} - -interface DeleteAssignment { - t: 'delete'; - s: string; - k: string; - v: undefined; -} - -// Array of assignments to be done (used for recursion) -type Assignment = - | IndexAssignment - | AddAssignment - | SetAssignment - | DeleteAssignment; - -export interface FlaggedObject { - type: SerovalObjectFlags; - value: string; -} - -function getAssignmentExpression(assignment: Assignment): string { - switch (assignment.t) { - case 'index': - return assignment.s + '=' + assignment.v; - case 'set': - return assignment.s + '.set(' + assignment.k + ',' + assignment.v + ')'; - case 'add': - return assignment.s + '.add(' + assignment.v + ')'; - case 'delete': - return assignment.s + '.delete(' + assignment.k + ')'; - default: - return ''; - } -} - -function mergeAssignments(assignments: Assignment[]): Assignment[] { - const newAssignments: Assignment[] = []; - let current = assignments[0]; - for (let i = 1, len = assignments.length, item: Assignment, prev = current; i < len; i++) { - item = assignments[i]; - if (item.t === 'index' && item.v === prev.v) { - // Merge if the right-hand value is the same - // saves at least 2 chars - current = { - t: 'index', - s: item.s, - k: undefined, - v: getAssignmentExpression(current), - } as IndexAssignment; - } else if (item.t === 'set' && item.s === prev.s) { - // Maps has chaining methods, merge if source is the same - current = { - t: 'set', - s: getAssignmentExpression(current), - k: item.k, - v: item.v, - } as SetAssignment; - } else if (item.t === 'add' && item.s === prev.s) { - // Sets has chaining methods too - current = { - t: 'add', - s: getAssignmentExpression(current), - k: undefined, - v: item.v, - } as AddAssignment; - } else if (item.t === 'delete' && item.s === prev.s) { - // Maps has chaining methods, merge if source is the same - current = { - t: 'delete', - s: getAssignmentExpression(current), - k: item.k, - v: undefined, - } as DeleteAssignment; - } else { - // Different assignment, push current - newAssignments.push(current); - current = item; - } - prev = item; - } - - newAssignments.push(current); - - return newAssignments; -} - -function resolveAssignments(assignments: Assignment[]): string | undefined { - 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 undefined; -} - -const SET_CONSTRUCTOR = 'new Set'; -const MAP_CONSTRUCTOR = 'new Map'; - -const enum SpecialReference { - Sentinel = 0, - Symbol = 1, - SymbolIterator = 2, - Object = 3, - ObjectFreeze = 4, - ObjectSeal = 5, - ObjectPreventExtensions = 6, - ObjectAssign = 7, - ObjectCreate = 8, - Promise = 9, - PromiseResolve = 10, - PromiseReject = 11, -} - -const OBJECT_FLAG_CONSTRUCTOR: Record = { - [SerovalObjectFlags.Frozen]: SpecialReference.ObjectFreeze, - [SerovalObjectFlags.Sealed]: SpecialReference.ObjectSeal, - [SerovalObjectFlags.NonExtensible]: SpecialReference.ObjectPreventExtensions, - [SerovalObjectFlags.None]: undefined, -}; - -export interface BaseSerializerContextOptions extends PluginAccessOptions { - features: number; - markedRefs: number[] | Set; -} - -export default abstract class BaseSerializerContext implements PluginAccessOptions { - /** - * @private - */ - features: number; - - /** - * To check if an object is synchronously referencing itself - * @private - */ - stack: number[] = []; - - /** - * Array of object mutations - * @private - */ - flags: FlaggedObject[] = []; - - /** - * Array of assignments to be done (used for recursion) - * @private - */ - assignments: Assignment[] = []; - - plugins?: Plugin[] | undefined; - - /** - * Refs that are...referenced - * @private - */ - marked: Set; - - constructor(options: BaseSerializerContextOptions) { - this.plugins = options.plugins; - this.features = options.features; - this.marked = new Set(options.markedRefs); - } - - abstract readonly mode: SerovalMode; - - /** - * A tiny function that tells if a reference - * is to be accessed. This is a requirement for - * deciding whether or not we should generate - * an identifier for the object - */ - protected markRef(id: number): void { - this.marked.add(id); - } - - protected isMarked(id: number): boolean { - return this.marked.has(id); - } - - /** - * Converts the ID of a reference into a identifier string - * that is used to refer to the object instance in the - * generated script. - */ - abstract getRefParam(id: number | string): string; - - private specials = new Set(); - - protected getSpecialReferenceValue(ref: SpecialReference): string { - switch (ref) { - case SpecialReference.Sentinel: - return '[]'; - case SpecialReference.Symbol: - return 'Symbol'; - case SpecialReference.SymbolIterator: - return this.getSpecialReference(SpecialReference.Symbol, true) + '.iterator'; - case SpecialReference.Object: - return 'Object'; - case SpecialReference.ObjectFreeze: - return this.getSpecialReference(SpecialReference.Object, true) + '.freeze'; - case SpecialReference.ObjectSeal: - return this.getSpecialReference(SpecialReference.Object, true) + '.seal'; - case SpecialReference.ObjectPreventExtensions: - return this.getSpecialReference(SpecialReference.Object, true) + '.preventExtensions'; - case SpecialReference.ObjectAssign: - return this.getSpecialReference(SpecialReference.Object, true) + '.assign'; - case SpecialReference.ObjectCreate: - return this.getSpecialReference(SpecialReference.Object, true) + '.create'; - case SpecialReference.Promise: - return 'Promise'; - case SpecialReference.PromiseResolve: - return this.getSpecialReference(SpecialReference.Promise, true) + '.resolve.bind(' + this.getSpecialReference(SpecialReference.Promise, false) + ')'; - case SpecialReference.PromiseReject: - return this.getSpecialReference(SpecialReference.Promise, true) + '.reject.bind(' + this.getSpecialReference(SpecialReference.Promise, false) + ')'; - default: - throw new Error('unknown special reference'); - } - } - - /** - * Generates special references that isn't provided by the user - * but by the script. - */ - protected getSpecialReference(ref: SpecialReference, call: boolean): string { - const param = this.getRefParam('_' + getIdentifier(ref)); - if (this.specials.has(ref)) { - return param; - } - this.specials.add(ref); - const expr = param + '=' + this.getSpecialReferenceValue(ref); - if (call) { - return '(' + expr + ')'; - } - return expr; - } - - protected pushObjectFlag(flag: SerovalObjectFlags, id: number): void { - if (flag !== SerovalObjectFlags.None) { - this.markRef(id); - this.flags.push({ - type: flag, - value: this.getRefParam(id), - }); - } - } - - private resolveFlags(): string | undefined { - let result = ''; - for (let i = 0, current = this.flags, len = current.length; i < len; i++) { - const flag = current[i]; - const constructor = OBJECT_FLAG_CONSTRUCTOR[flag.type]; - if (constructor) { - const ref = this.getSpecialReference(constructor, true); - result += ref + '(' + flag.value + '),'; - } - } - return result; - } - - protected resolvePatches(): string | undefined { - const assignments = resolveAssignments(this.assignments); - const flags = this.resolveFlags(); - if (assignments) { - if (flags) { - return assignments + flags; - } - return assignments; - } - return flags; - } - - /** - * Generates the inlined assignment for the reference - * This is different from the assignments array as this one - * signifies creation rather than mutation - */ - protected createAssignment( - source: string, - value: string, - ): void { - this.assignments.push({ - t: 'index', - s: source, - k: undefined, - v: value, - }); - } - - protected createAddAssignment( - ref: number, - value: string, - ): void { - this.assignments.push({ - t: 'add', - s: this.getRefParam(ref), - k: undefined, - v: value, - }); - } - - protected createSetAssignment( - ref: number, - key: string, - value: string, - ): void { - this.assignments.push({ - t: 'set', - s: this.getRefParam(ref), - k: key, - v: value, - }); - } - - protected createDeleteAssignment( - ref: number, - key: string, - ): void { - this.assignments.push({ - t: 'delete', - s: this.getRefParam(ref), - k: key, - v: undefined, - }); - } - - protected createArrayAssign( - ref: number, - index: number | string, - value: string, - ): void { - this.createAssignment(this.getRefParam(ref) + '[' + index + ']', value); - } - - protected createObjectAssign( - ref: number, - key: string, - value: string, - ): void { - this.createAssignment(this.getRefParam(ref) + '.' + key, value); - } - - /** - * Checks if the value is in the stack. Stack here is a reference - * structure to know if a object is to be accessed in a TDZ. - */ - isIndexedValueInStack( - node: SerovalNode, - ): boolean { - return node.t === SerovalNodeType.IndexedValue && this.stack.includes(node.i); - } - - /** - * Produces an assignment expression. `id` generates a reference - * parameter (through `getRefParam`) and has the option to - * return the reference parameter directly or assign a value to - * it. - */ - protected abstract assignIndexedValue( - id: number, - value: string, - ): string; - - protected serializeReference( - node: SerovalReferenceNode, - ): string { - return this.assignIndexedValue(node.i, REFERENCES_KEY + '.get("' + node.s + '")'); - } - - protected getIterableAccess(): string { - return this.features & Feature.ArrayPrototypeValues - ? '.values()' - : '[' + this.getSpecialReference(SpecialReference.SymbolIterator, false) + ']()'; - } - - protected serializeIterable( - node: SerovalNode, - ): string { - const key = '[' + this.getSpecialReference(SpecialReference.SymbolIterator, false) + ']'; - const parent = this.stack; - this.stack = []; - let serialized = this.serialize(node) + this.getIterableAccess(); - this.stack = parent; - if (this.features & Feature.ArrowFunction) { - serialized = ':()=>' + serialized; - } else if (this.features & Feature.MethodShorthand) { - serialized = '(){return ' + serialized + '}'; - } else { - serialized = ':function(){return ' + serialized + '}'; - } - return key + serialized; - } - - protected serializeArrayItem( - id: number, - item: SerovalNode | undefined, - index: number, - ): string { - // Check if index is a hole - if (item) { - // Check if item is a parent - if (this.isIndexedValueInStack(item)) { - this.markRef(id); - this.createArrayAssign(id, index, this.getRefParam((item as SerovalIndexedValueNode).i)); - return ''; - } - return this.serialize(item); - } - return ''; - } - - protected serializeArray( - node: SerovalArrayNode, - ): string { - const id = node.i; - if (node.l) { - this.stack.push(id); - // This is different than Map and Set - // because we also need to serialize - // the holes of the Array - const list = node.a; - let values = this.serializeArrayItem(id, list[0], 0); - let isHoley = values === ''; - for (let i = 1, len = node.l, item: string; i < len; i++) { - item = this.serializeArrayItem(id, list[i], i); - values += ',' + item; - isHoley = item === ''; - } - this.stack.pop(); - this.pushObjectFlag(node.o, node.i); - return this.assignIndexedValue(id, '[' + values + (isHoley ? ',]' : ']')); - } - return this.assignIndexedValue(id, '[]'); - } - - protected serializeProperty( - id: number, - key: SerovalObjectRecordKey, - val: SerovalNode, - ): string { - // Only reason this is a switch is so that - // in the future, maybe other Symbols are going - // to be introduced and/or has merit to be added - // E.g. Symbol.asyncIterator - switch (key) { - case SerovalObjectRecordSpecialKey.SymbolIterator: - return this.serializeIterable(val); - default: { - const check = Number(key); - // Test if key is a valid number or JS identifier - // so that we don't have to serialize the key and wrap with brackets - const isIdentifier = check >= 0 || isValidIdentifier(key); - if (this.isIndexedValueInStack(val)) { - const refParam = this.getRefParam((val as SerovalIndexedValueNode).i); - this.markRef(id); - // eslint-disable-next-line no-self-compare - if (isIdentifier && check !== check) { - this.createObjectAssign(id, key, refParam); - } else { - this.createArrayAssign(id, isIdentifier ? key : ('"' + key + '"'), refParam); - } - return ''; - } - return (isIdentifier ? key : ('"' + key + '"')) + ':' + this.serialize(val); - } - } - } - - protected serializeProperties( - sourceID: number, - node: SerovalObjectRecordNode, - ): string { - const len = node.s; - if (len) { - this.stack.push(sourceID); - const keys = node.k; - const values = node.v; - let result = this.serializeProperty(sourceID, keys[0], values[0]); - for (let i = 1, item = result; i < len; i++) { - item = this.serializeProperty(sourceID, keys[i], values[i]); - result += (item && result && ',') + item; - } - this.stack.pop(); - return '{' + result + '}'; - } - return '{}'; - } - - protected serializeObject( - node: SerovalObjectNode, - ): string { - this.pushObjectFlag(node.o, node.i); - return this.assignIndexedValue(node.i, this.serializeProperties(node.i, node.p)); - } - - protected serializeWithObjectAssign( - value: SerovalObjectRecordNode, - id: number, - serialized: string, - ): string { - const fields = this.serializeProperties(id, value); - if (fields !== '{}') { - return this.getSpecialReference(SpecialReference.ObjectAssign, true) + '(' + serialized + ',' + fields + ')'; - } - return serialized; - } - - protected serializeAssignment( - sourceID: number, - mainAssignments: Assignment[], - key: SerovalObjectRecordKey, - value: SerovalNode, - ): void { - switch (key) { - case SerovalObjectRecordSpecialKey.SymbolIterator: { - const parent = this.stack; - this.stack = []; - const serialized = this.serialize(value) + this.getIterableAccess(); - this.stack = parent; - const parentAssignment = this.assignments; - this.assignments = mainAssignments; - this.createArrayAssign( - sourceID, - this.getSpecialReference(SpecialReference.Sentinel, false), - this.features & Feature.ArrowFunction - ? '()=>' + serialized - : 'function(){return ' + serialized + '}', - ); - this.assignments = parentAssignment; - } - break; - default: { - const serialized = this.serialize(value); - const check = Number(key); - // Test if key is a valid number or JS identifier - // so that we don't have to serialize the key and wrap with brackets - const isIdentifier = check >= 0 || isValidIdentifier(key); - if (this.isIndexedValueInStack(value)) { - // eslint-disable-next-line no-self-compare - if (isIdentifier && check !== check) { - this.createObjectAssign(sourceID, key, serialized); - } else { - this.createArrayAssign(sourceID, isIdentifier ? key : ('"' + key + '"'), serialized); - } - } else { - const parentAssignment = this.assignments; - this.assignments = mainAssignments; - if (isIdentifier) { - this.createObjectAssign(sourceID, key, serialized); - } else { - this.createArrayAssign(sourceID, isIdentifier ? key : ('"' + key + '"'), serialized); - } - this.assignments = parentAssignment; - } - } - } - } - - protected serializeAssignments( - sourceID: number, - node: SerovalObjectRecordNode, - ): string | undefined { - const len = node.s; - if (len) { - this.stack.push(sourceID); - const mainAssignments: Assignment[] = []; - const keys = node.k; - const values = node.v; - for (let i = 0; i < len; i++) { - this.serializeAssignment(sourceID, mainAssignments, keys[i], values[i]); - } - this.stack.pop(); - return resolveAssignments(mainAssignments); - } - return undefined; - } - - protected serializeDictionary( - i: number, - p: SerovalObjectRecordNode | undefined, - init: string, - ): string { - if (p) { - if (this.features & Feature.ObjectAssign) { - init = this.serializeWithObjectAssign(p, i, init); - } else { - this.markRef(i); - const assignments = this.serializeAssignments(i, p); - if (assignments) { - return '(' + this.assignIndexedValue(i, init) + ',' + assignments + this.getRefParam(i) + ')'; - } - } - } - return this.assignIndexedValue(i, init); - } - - protected serializeNullConstructor( - node: SerovalNullConstructorNode, - ): string { - this.pushObjectFlag(node.o, node.i); - return this.serializeDictionary(node.i, node.p, this.getSpecialReference(SpecialReference.ObjectCreate, true) + '(null)'); - } - - protected serializeDate( - node: SerovalDateNode, - ): string { - return this.assignIndexedValue(node.i, 'new Date("' + node.s + '")'); - } - - protected serializeRegExp( - node: SerovalRegExpNode, - ): string { - return this.assignIndexedValue(node.i, '/' + node.c + '/' + node.m); - } - - protected serializeSetItem( - id: number, - item: SerovalNode, - ): string { - if (this.isIndexedValueInStack(item)) { - this.markRef(id); - this.createAddAssignment(id, this.getRefParam((item as SerovalIndexedValueNode).i)); - return ''; - } - return this.serialize(item); - } - - protected serializeSet( - node: SerovalSetNode, - ): string { - let serialized = SET_CONSTRUCTOR; - const size = node.l; - const id = node.i; - if (size) { - const items = node.a; - this.stack.push(id); - let result = this.serializeSetItem(id, items[0]); - for (let i = 1, item = result; i < size; i++) { - item = this.serializeSetItem(id, items[i]); - result += (item && result && ',') + item; - } - this.stack.pop(); - if (result) { - serialized += '([' + result + '])'; - } - } - return this.assignIndexedValue(id, serialized); - } - - protected serializeMapEntry( - id: number, - key: SerovalNode, - val: SerovalNode, - ): string { - if (this.isIndexedValueInStack(key)) { - // Create reference for the map instance - const keyRef = this.getRefParam((key as SerovalIndexedValueNode).i); - this.markRef(id); - // Check if value is a parent - if (this.isIndexedValueInStack(val)) { - const valueRef = this.getRefParam((val as SerovalIndexedValueNode).i); - // Register an assignment since - // both key and value are a parent of this - // Map instance - this.createSetAssignment(id, keyRef, valueRef); - return ''; - } - // Reset the stack - // This is required because the serialized - // value is no longer part of the expression - // tree and has been moved to the deferred - // assignment - if (val.t !== SerovalNodeType.IndexedValue && val.i != null && this.isMarked(val.i)) { - // We use a trick here using sequence (or comma) expressions - // basically we serialize the intended object in place WITHOUT - // actually returning it, this is by returning a placeholder - // value that we will remove sometime after. - const serialized = '(' + this.serialize(val) + ',[' + this.getSpecialReference(SpecialReference.Sentinel, false) + ',' + this.getSpecialReference(SpecialReference.Sentinel, false) + '])'; - this.createSetAssignment(id, keyRef, this.getRefParam(val.i)); - this.createDeleteAssignment(id, this.getSpecialReference(SpecialReference.Sentinel, false)); - return serialized; - } - const parent = this.stack; - this.stack = []; - this.createSetAssignment(id, keyRef, this.serialize(val)); - this.stack = parent; - return ''; - } - if (this.isIndexedValueInStack(val)) { - // Create ref for the Map instance - const valueRef = this.getRefParam((val as SerovalIndexedValueNode).i); - this.markRef(id); - if (key.t !== SerovalNodeType.IndexedValue && key.i != null && this.isMarked(key.i)) { - const serialized = '(' + this.serialize(key) + ',[' + this.getSpecialReference(SpecialReference.Sentinel, false) + ',' + this.getSpecialReference(SpecialReference.Sentinel, false) + '])'; - this.createSetAssignment(id, this.getRefParam(key.i), valueRef); - this.createDeleteAssignment(id, this.getSpecialReference(SpecialReference.Sentinel, false)); - return serialized; - } - // Reset stack for the key serialization - const parent = this.stack; - this.stack = []; - this.createSetAssignment(id, this.serialize(key), valueRef); - this.stack = parent; - return ''; - } - - return '[' + this.serialize(key) + ',' + this.serialize(val) + ']'; - } - - protected serializeMap( - node: SerovalMapNode, - ): string { - let serialized = MAP_CONSTRUCTOR; - const size = node.e.s; - const id = node.i; - if (size) { - const keys = node.e.k; - const vals = node.e.v; - this.stack.push(id); - let result = this.serializeMapEntry(id, keys[0], vals[0]); - for (let i = 1, item = result; i < size; i++) { - item = this.serializeMapEntry(id, keys[i], vals[i]); - result += (item && result && ',') + item; - } - this.stack.pop(); - // Check if there are any values - // so that the empty Map constructor - // can be used instead - if (result) { - serialized += '([' + result + '])'; - } - } - return this.assignIndexedValue(id, serialized); - } - - protected serializeArrayBuffer( - node: SerovalArrayBufferNode, - ): string { - let result = 'new Uint8Array('; - const buffer = node.s; - const len = buffer.length; - if (len) { - result += '[' + buffer[0]; - for (let i = 1; i < len; i++) { - result += ',' + buffer[i]; - } - result += ']'; - } - return this.assignIndexedValue(node.i, result + ').buffer'); - } - - protected serializeTypedArray( - node: SerovalTypedArrayNode | SerovalBigIntTypedArrayNode, - ): string { - return this.assignIndexedValue( - node.i, - 'new ' + node.c + '(' + this.serialize(node.f) + ',' + node.b + ',' + node.l + ')', - ); - } - - protected serializeDataView( - node: SerovalDataViewNode, - ): string { - return this.assignIndexedValue( - node.i, - 'new DataView(' + this.serialize(node.f) + ',' + node.b + ',' + node.l + ')', - ); - } - - protected serializeAggregateError( - node: SerovalAggregateErrorNode, - ): string { - // Serialize the required arguments - const id = node.i; - this.stack.push(id); - const serialized = 'new AggregateError([],"' + node.m + '")'; - this.stack.pop(); - // `AggregateError` might've been extended - // either through class or custom properties - // Make sure to assign extra properties - return this.serializeDictionary(id, node.p, serialized); - } - - protected serializeError( - node: SerovalErrorNode, - ): string { - return this.serializeDictionary(node.i, node.p, 'new ' + ERROR_CONSTRUCTOR_STRING[node.s] + '("' + node.m + '")'); - } - - protected serializePromise( - node: SerovalPromiseNode, - ): string { - let serialized: string; - // Check if resolved value is a parent expression - const fulfilled = node.f; - const id = node.i; - const specialRef = node.s ? SpecialReference.PromiseResolve : SpecialReference.PromiseReject; - const constructor = this.getSpecialReference(specialRef, true); - if (this.isIndexedValueInStack(fulfilled)) { - // A Promise trick, reference the value - // inside the `then` expression so that - // the Promise evaluates after the parent - // has initialized - const ref = this.getRefParam((fulfilled as SerovalIndexedValueNode).i); - if (this.features & Feature.ArrowFunction) { - if (node.s) { - serialized = constructor + '().then(()=>' + ref + ')'; - } else { - serialized = constructor + '().catch(()=>{throw ' + ref + '})'; - } - } else if (node.s) { - serialized = constructor + '().then(function(){return ' + ref + '})'; - } else { - serialized = constructor + '().catch(function(){throw ' + ref + '})'; - } - } else { - this.stack.push(id); - const result = this.serialize(fulfilled); - this.stack.pop(); - // just inline the value/reference here - serialized = constructor + '(' + result + ')'; - } - return this.assignIndexedValue(id, serialized); - } - - protected serializeWKSymbol( - node: SerovalWKSymbolNode, - ): string { - return this.assignIndexedValue(node.i, SYMBOL_STRING[node.s]); - } - - protected serializeURL( - node: SerovalURLNode, - ): string { - return this.assignIndexedValue(node.i, 'new URL("' + node.s + '")'); - } - - protected serializeURLSearchParams( - node: SerovalURLSearchParamsNode, - ): string { - return this.assignIndexedValue( - node.i, - node.s ? 'new URLSearchParams("' + node.s + '")' : 'new URLSearchParams', - ); - } - - protected serializeBlob( - node: SerovalBlobNode, - ): string { - return this.assignIndexedValue( - node.i, - 'new Blob([' + this.serialize(node.f) + '],{type:"' + node.c + '"})', - ); - } - - protected serializeFile( - node: SerovalFileNode, - ): string { - return this.assignIndexedValue( - node.i, - 'new File([' + this.serialize(node.f) + '],"' + node.m + '",{type:"' + node.c + '",lastModified:' + node.b + '})', - ); - } - - protected serializeHeaders( - node: SerovalHeadersNode, - ): string { - return this.assignIndexedValue( - node.i, - 'new Headers(' + this.serializeProperties(node.i, node.e) + ')', - ); - } - - protected serializeFormDataEntry(id: number, key: string, value: SerovalNode): string { - return this.getRefParam(id) + '.append("' + key + '",' + this.serialize(value) + ')'; - } - - protected serializeFormDataEntries( - node: SerovalFormDataNode, - size: number, - ): string { - const keys = node.e.k; - const vals = node.e.v; - const id = node.i; - let result = this.serializeFormDataEntry(id, keys[0], vals[0]); - for (let i = 1; i < size; i++) { - result += ',' + this.serializeFormDataEntry(id, keys[i], vals[i]); - } - return result; - } - - protected serializeFormData( - node: SerovalFormDataNode, - ): string { - const size = node.e.s; - const id = node.i; - if (size) { - this.markRef(id); - } - const result = this.assignIndexedValue(id, 'new FormData()'); - if (size) { - const entries = this.serializeFormDataEntries(node, size); - return '(' + result + ',' + (entries ? entries + ',' : '') + this.getRefParam(id) + ')'; - } - return result; - } - - protected serializeBoxed( - node: SerovalBoxedNode, - ): string { - return this.assignIndexedValue(node.i, 'Object(' + this.serialize(node.f) + ')'); - } - - protected serializeRequest( - node: SerovalRequestNode, - ): string { - return this.assignIndexedValue(node.i, 'new Request("' + node.s + '",' + this.serialize(node.f) + ')'); - } - - protected serializeResponse( - node: SerovalResponseNode, - ): string { - return this.assignIndexedValue( - node.i, - 'new Response(' + this.serialize(node.a[0]) + ',' + this.serialize(node.a[1]) + ')', - ); - } - - protected serializeEvent( - node: SerovalEventNode, - ): string { - return this.assignIndexedValue( - node.i, - 'new Event("' + node.s + '",' + this.serialize(node.f) + ')', - ); - } - - protected serializeCustomEvent( - node: SerovalCustomEventNode, - ): string { - return this.assignIndexedValue( - node.i, - 'new CustomEvent("' + node.s + '",' + this.serialize(node.f) + ')', - ); - } - - protected serializeDOMException( - node: SerovalDOMExceptionNode, - ): string { - return this.assignIndexedValue( - node.i, - 'new DOMException("' + node.s + '","' + node.c + '")', - ); - } - - protected serializePlugin( - node: SerovalPluginNode, - ): string { - const currentPlugins = this.plugins; - if (currentPlugins) { - for (let i = 0, len = currentPlugins.length; i < len; i++) { - const plugin = currentPlugins[i]; - if (plugin.tag === node.c) { - return plugin.serialize(node.s, this, { - id: node.i, - }); - } - } - } - throw new Error('Missing plugin for tag "' + node.c + '".'); - } - - protected abstract serializePromiseConstructor( - node: SerovalPromiseConstructorNode, - ): string; - - protected abstract serializePromiseResolve( - node: SerovalPromiseResolveNode, - ): string; - - protected abstract serializePromiseReject( - node: SerovalPromiseRejectNode, - ): string; - - protected abstract serializeReadableStreamConstructor( - node: SerovalReadableStreamConstructorNode, - ): string; - - protected abstract serializeReadableStreamEnqueue( - node: SerovalReadableStreamEnqueueNode, - ): string; - - protected abstract serializeReadableStreamError( - node: SerovalReadableStreamErrorNode, - ): string; - - protected abstract serializeReadableStreamClose( - node: SerovalReadableStreamCloseNode, - ): string; - - serialize(node: SerovalNode): string { - switch (node.t) { - case SerovalNodeType.Constant: - return CONSTANT_STRING[node.s]; - case SerovalNodeType.Number: - return '' + node.s; - case SerovalNodeType.String: - return '"' + node.s + '"'; - case SerovalNodeType.BigInt: - return node.s + 'n'; - case SerovalNodeType.IndexedValue: - return this.getRefParam(node.i); - case SerovalNodeType.Reference: - return this.serializeReference(node); - case SerovalNodeType.Array: - return this.serializeArray(node); - case SerovalNodeType.Object: - return this.serializeObject(node); - case SerovalNodeType.NullConstructor: - return this.serializeNullConstructor(node); - case SerovalNodeType.Date: - return this.serializeDate(node); - case SerovalNodeType.RegExp: - return this.serializeRegExp(node); - case SerovalNodeType.Set: - return this.serializeSet(node); - case SerovalNodeType.Map: - return this.serializeMap(node); - case SerovalNodeType.ArrayBuffer: - return this.serializeArrayBuffer(node); - case SerovalNodeType.BigIntTypedArray: - case SerovalNodeType.TypedArray: - return this.serializeTypedArray(node); - case SerovalNodeType.DataView: - return this.serializeDataView(node); - case SerovalNodeType.AggregateError: - return this.serializeAggregateError(node); - case SerovalNodeType.Error: - return this.serializeError(node); - case SerovalNodeType.Promise: - return this.serializePromise(node); - case SerovalNodeType.WKSymbol: - return this.serializeWKSymbol(node); - case SerovalNodeType.URL: - return this.serializeURL(node); - case SerovalNodeType.URLSearchParams: - return this.serializeURLSearchParams(node); - case SerovalNodeType.Blob: - return this.serializeBlob(node); - case SerovalNodeType.File: - return this.serializeFile(node); - case SerovalNodeType.Headers: - return this.serializeHeaders(node); - case SerovalNodeType.FormData: - return this.serializeFormData(node); - case SerovalNodeType.Boxed: - return this.serializeBoxed(node); - case SerovalNodeType.PromiseConstructor: - return this.serializePromiseConstructor(node); - case SerovalNodeType.PromiseResolve: - return this.serializePromiseResolve(node); - case SerovalNodeType.PromiseReject: - return this.serializePromiseReject(node); - case SerovalNodeType.ReadableStreamConstructor: - return this.serializeReadableStreamConstructor(node); - case SerovalNodeType.ReadableStreamEnqueue: - return this.serializeReadableStreamEnqueue(node); - case SerovalNodeType.ReadableStreamError: - return this.serializeReadableStreamError(node); - case SerovalNodeType.ReadableStreamClose: - return this.serializeReadableStreamClose(node); - case SerovalNodeType.Request: - return this.serializeRequest(node); - case SerovalNodeType.Response: - return this.serializeResponse(node); - case SerovalNodeType.Event: - return this.serializeEvent(node); - case SerovalNodeType.CustomEvent: - return this.serializeCustomEvent(node); - case SerovalNodeType.DOMException: - return this.serializeDOMException(node); - case SerovalNodeType.Plugin: - return this.serializePlugin(node); - default: - throw new Error('invariant'); - } - } -} diff --git a/packages/seroval/src/core/serializer-context.old.ts b/packages/seroval/src/core/serializer-context.ts similarity index 95% rename from packages/seroval/src/core/serializer-context.old.ts rename to packages/seroval/src/core/serializer-context.ts index cff1c5b5..79341ac8 100644 --- a/packages/seroval/src/core/serializer-context.old.ts +++ b/packages/seroval/src/core/serializer-context.ts @@ -6,6 +6,7 @@ import { SerovalNodeType, SerovalObjectFlags, } from './constants'; +import { createEffectulFunction, createFunction } from './function-string'; import { REFERENCES_KEY } from './keys'; import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; import { isValidIdentifier } from './shared'; @@ -184,12 +185,9 @@ const SYMBOL_ITERATOR = 'Symbol.iterator'; const enum SpecialReference { Sentinel = 0, + SymbolIteratorFactory = 1, } -const SPECIAL_REFERENCE_VALUE: Record = { - [SpecialReference.Sentinel]: '[]', -}; - const OBJECT_FLAG_CONSTRUCTOR: Record = { [SerovalObjectFlags.Frozen]: 'Object.freeze', [SerovalObjectFlags.Sealed]: 'Object.seal', @@ -265,6 +263,25 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio private specials = new Set(); + private getSpecialReferenceValue(ref: SpecialReference): string { + switch (ref) { + case SpecialReference.Sentinel: + return '[]'; + case SpecialReference.SymbolIteratorFactory: + return createFunction( + this.features, + ['f', 'i', 's', 'c', 'd'], + '(' + createFunction( + this.features, + [], + '(s=f(),i=0,{next:' + createEffectulFunction(this.features, [], 'c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}') + '})', + ) + ')', + ); + default: + return ''; + } + } + /** * Generates special references that isn't provided by the user * but by the script. @@ -275,7 +292,7 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio return param; } this.specials.add(ref); - return param + '=' + SPECIAL_REFERENCE_VALUE[ref]; + return '(' + param + '=' + this.getSpecialReferenceValue(ref) + ')'; } protected pushObjectFlag(flag: SerovalObjectFlags, id: number): void { @@ -406,28 +423,17 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio return this.assignIndexedValue(node.i, REFERENCES_KEY + '.get("' + node.s + '")'); } - protected getIterableAccess(): string { - return this.features & Feature.ArrayPrototypeValues - ? '.values()' - : '[' + SYMBOL_ITERATOR + ']()'; - } - protected serializeIterable( node: SerovalNode, ): string { - const key = '[' + SYMBOL_ITERATOR + ']'; + const key = '[' + SYMBOL_ITERATOR + ']:'; const parent = this.stack; this.stack = []; - let serialized = this.serialize(node) + this.getIterableAccess(); + const serialized = this.serialize(node); this.stack = parent; - if (this.features & Feature.ArrowFunction) { - serialized = ':()=>' + serialized; - } else if (this.features & Feature.MethodShorthand) { - serialized = '(){return ' + serialized + '}'; - } else { - serialized = ':function(){return ' + serialized + '}'; - } - return key + serialized; + const param = createFunction(this.features, [], '(' + serialized + ')'); + const constructor = this.getSpecialReference(SpecialReference.SymbolIteratorFactory); + return key + constructor + '(' + param + ')'; } protected serializeArrayItem( @@ -554,16 +560,16 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio case SerovalObjectRecordSpecialKey.SymbolIterator: { const parent = this.stack; this.stack = []; - const serialized = this.serialize(value) + this.getIterableAccess(); + const serialized = this.serialize(value); this.stack = parent; const parentAssignment = this.assignments; this.assignments = mainAssignments; + const param = createFunction(this.features, [], '(' + serialized + ')'); + const constructor = this.getSpecialReference(SpecialReference.SymbolIteratorFactory); this.createArrayAssign( sourceID, this.getSpecialReference(SpecialReference.Sentinel), - this.features & Feature.ArrowFunction - ? '()=>' + serialized - : 'function(){return ' + serialized + '}', + constructor + '(' + param + ')', ); this.assignments = parentAssignment; } @@ -840,17 +846,11 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio // the Promise evaluates after the parent // has initialized const ref = this.getRefParam((fulfilled as SerovalIndexedValueNode).i); - if (this.features & Feature.ArrowFunction) { - if (node.s) { - serialized = constructor + '().then(()=>' + ref + ')'; - } else { - serialized = constructor + '().catch(()=>{throw ' + ref + '})'; - } - } else if (node.s) { - serialized = constructor + '().then(function(){return ' + ref + '})'; - } else { - serialized = constructor + '().catch(function(){throw ' + ref + '})'; - } + serialized = constructor + ( + node.s + ? '().then(' + createFunction(this.features, [], ref) + ')' + : '().catch(' + createEffectulFunction(this.features, [], 'throw ' + ref) + ')' + ); } else { this.stack.push(id); const result = this.serialize(fulfilled); diff --git a/packages/seroval/src/core/tree/deserialize.ts b/packages/seroval/src/core/tree/deserialize.ts index 12965b6c..4bab8df5 100644 --- a/packages/seroval/src/core/tree/deserialize.ts +++ b/packages/seroval/src/core/tree/deserialize.ts @@ -47,6 +47,8 @@ import { SerovalObjectFlags, } from '../constants'; import type { Plugin, PluginAccessOptions } from '../plugin'; +import type { Sequence } from '../iterator-to-sequence'; +import { sequenceToIterator } from '../iterator-to-sequence'; function applyObjectFlag(obj: unknown, flag: SerovalObjectFlags): unknown { switch (flag) { @@ -161,8 +163,8 @@ export default class VanillaDeserializerContext implements PluginAccessOptions { value = this.deserialize(vals[i]); switch (key) { case SerovalObjectRecordSpecialKey.SymbolIterator: { - const current = value as unknown[]; - result[Symbol.iterator] = (): IterableIterator => current.values(); + const current = value as Sequence; + result[Symbol.iterator] = (): Iterator => sequenceToIterator(current); } break; default: diff --git a/packages/seroval/src/core/tree/serialize.ts b/packages/seroval/src/core/tree/serialize.ts index 5f45073b..85a25158 100644 --- a/packages/seroval/src/core/tree/serialize.ts +++ b/packages/seroval/src/core/tree/serialize.ts @@ -8,12 +8,12 @@ import type { SerovalReadableStreamEnqueueNode, SerovalReadableStreamErrorNode, } from '../types'; -import type { BaseSerializerContextOptions } from '../serializer-context.old'; -import BaseSerializerContext from '../serializer-context.old'; +import type { BaseSerializerContextOptions } from '../serializer-context'; +import BaseSerializerContext from '../serializer-context'; import getIdentifier from '../get-identifier'; import type { SerovalMode } from '../plugin'; -import { Feature } from '../compat'; import { SerovalNodeType } from '../constants'; +import { createFunction } from '../function-string'; export type VanillaSerializerContextOptions = BaseSerializerContextOptions @@ -30,7 +30,7 @@ export default class VanillaSerializerContext extends BaseSerializerContext { * Variables * @private */ - vars: (string | undefined)[] = []; + vars: string[] = []; /** * Increments the number of references the referenced value has @@ -131,17 +131,7 @@ export default class VanillaSerializerContext extends BaseSerializerContext { body = index + '=' + body; } } - let params = this.vars.length > 1 - ? this.vars.join(',') - : this.vars[0]; - // Source is probably already assigned - if (this.features & Feature.ArrowFunction) { - params = this.vars.length > 1 || this.vars.length === 0 - ? '(' + params + ')' - : params; - return '(' + params + '=>(' + body + '))()'; - } - return '(function(' + params + '){return ' + body + '})()'; + return '(' + createFunction(this.features, this.vars, '(' + body + ')') + ')()'; } if (tree.t === SerovalNodeType.Object) { return '(' + result + ')'; diff --git a/packages/seroval/test/__snapshots__/array.test.ts.snap b/packages/seroval/test/__snapshots__/array.test.ts.snap index ee3d7aea..d3b481b0 100644 --- a/packages/seroval/test/__snapshots__/array.test.ts.snap +++ b/packages/seroval/test/__snapshots__/array.test.ts.snap @@ -1,30 +1,30 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`arrays > crossSerialize > scoped > supports Arrays 1`] = `"($R=>($R[0]=[1,2,3]))($R[\\"example\\"])"`; +exports[`arrays > crossSerialize > scoped > supports Arrays 1`] = `"($R=>$R[0]=[1,2,3])($R[\\"example\\"])"`; -exports[`arrays > crossSerialize > scoped > supports self recursion 1`] = `"($R=>($R[0]=[,,],$R[0][1]=$R[0][0]=$R[0],$R[0]))($R[\\"example\\"])"`; +exports[`arrays > crossSerialize > scoped > supports self recursion 1`] = `"($R=>$R[0]=[,,],$R[0][1]=$R[0][0]=$R[0],$R[0])($R[\\"example\\"])"`; exports[`arrays > crossSerialize > supports Arrays 1`] = `"$R[0]=[1,2,3]"`; exports[`arrays > crossSerialize > supports self recursion 1`] = `"($R[0]=[,,],$R[0][1]=$R[0][0]=$R[0],$R[0])"`; -exports[`arrays > crossSerializeAsync > scoped > supports Arrays 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=[1,2,3])))($R[\\"example\\"])"`; +exports[`arrays > crossSerializeAsync > scoped > supports Arrays 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=[1,2,3]))($R[\\"example\\"])"`; -exports[`arrays > crossSerializeAsync > scoped > supports self recursion 1`] = `"($R=>($R[0]=[$R[1]=Promise.resolve().then(()=>$R[0]),$R[2]=Promise.resolve().then(()=>$R[0])]))($R[\\"example\\"])"`; +exports[`arrays > crossSerializeAsync > scoped > supports self recursion 1`] = `"($R=>$R[0]=[$R[1]=Promise.resolve().then(()=>$R[0]),$R[2]=Promise.resolve().then(()=>$R[0])])($R[\\"example\\"])"`; exports[`arrays > crossSerializeAsync > supports Arrays 1`] = `"$R[0]=Promise.resolve($R[1]=[1,2,3])"`; exports[`arrays > crossSerializeAsync > supports self recursion 1`] = `"$R[0]=[$R[1]=Promise.resolve().then(()=>$R[0]),$R[2]=Promise.resolve().then(()=>$R[0])]"`; -exports[`arrays > crossSerializeStream > scoped > supports Arrays 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`arrays > crossSerializeStream > scoped > supports Arrays 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`arrays > crossSerializeStream > scoped > supports Arrays 2`] = `"($R=>(_$.Ps($R[0],$R[1]=[1,2,3])))($R[\\"example\\"])"`; +exports[`arrays > crossSerializeStream > scoped > supports Arrays 2`] = `"($R=>_$.Ps($R[0],$R[1]=[1,2,3]))($R[\\"example\\"])"`; -exports[`arrays > crossSerializeStream > scoped > supports self recursion 1`] = `"($R=>($R[0]=[$R[1]=_$.P(),$R[2]=_$.P()]))($R[\\"example\\"])"`; +exports[`arrays > crossSerializeStream > scoped > supports self recursion 1`] = `"($R=>$R[0]=[$R[1]=_$.P(),$R[2]=_$.P()])($R[\\"example\\"])"`; -exports[`arrays > crossSerializeStream > scoped > supports self recursion 2`] = `"($R=>(_$.Ps($R[1],$R[0])))($R[\\"example\\"])"`; +exports[`arrays > crossSerializeStream > scoped > supports self recursion 2`] = `"($R=>_$.Ps($R[1],$R[0]))($R[\\"example\\"])"`; -exports[`arrays > crossSerializeStream > scoped > supports self recursion 3`] = `"($R=>(_$.Ps($R[2],$R[0])))($R[\\"example\\"])"`; +exports[`arrays > crossSerializeStream > scoped > supports self recursion 3`] = `"($R=>_$.Ps($R[2],$R[0]))($R[\\"example\\"])"`; exports[`arrays > crossSerializeStream > supports Arrays 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap b/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap index 6c12cf8e..9bc0d47b 100644 --- a/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap @@ -4,17 +4,17 @@ exports[`boxed bigint > compat > should throw an error for unsupported target 1` exports[`boxed bigint > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object BigInt]\\""`; -exports[`boxed bigint > crossSerialize > scoped > supports boxed bigint 1`] = `"($R=>($R[0]=Object(9007199254740991n)))($R[\\"example\\"])"`; +exports[`boxed bigint > crossSerialize > scoped > supports boxed bigint 1`] = `"($R=>$R[0]=Object(9007199254740991n))($R[\\"example\\"])"`; exports[`boxed bigint > crossSerialize > supports boxed bigint 1`] = `"$R[0]=Object(9007199254740991n)"`; -exports[`boxed bigint > crossSerializeAsync > scoped > supports boxed bigint 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=Object(9007199254740991n))))($R[\\"example\\"])"`; +exports[`boxed bigint > crossSerializeAsync > scoped > supports boxed bigint 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object(9007199254740991n)))($R[\\"example\\"])"`; exports[`boxed bigint > crossSerializeAsync > supports boxed bigint 1`] = `"$R[0]=Promise.resolve($R[1]=Object(9007199254740991n))"`; -exports[`boxed bigint > crossSerializeStream > scoped > supports boxed bigint 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`boxed bigint > crossSerializeStream > scoped > supports boxed bigint 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`boxed bigint > crossSerializeStream > scoped > supports boxed bigint 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object(9007199254740991n))))($R[\\"example\\"])"`; +exports[`boxed bigint > crossSerializeStream > scoped > supports boxed bigint 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object(9007199254740991n)))($R[\\"example\\"])"`; exports[`boxed bigint > crossSerializeStream > supports boxed bigint 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/__snapshots__/boxed-boolean.test.ts.snap b/packages/seroval/test/__snapshots__/boxed-boolean.test.ts.snap index bb03e6d0..bb333974 100644 --- a/packages/seroval/test/__snapshots__/boxed-boolean.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boxed-boolean.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`boxed boolean > crossSerialize > scoped > supports boolean 1`] = `"($R=>($R[0]=Object(!0)))($R[\\"example\\"])"`; +exports[`boxed boolean > crossSerialize > scoped > supports boolean 1`] = `"($R=>$R[0]=Object(!0))($R[\\"example\\"])"`; -exports[`boxed boolean > crossSerialize > scoped > supports boolean 2`] = `"($R=>($R[0]=Object(!1)))($R[\\"example\\"])"`; +exports[`boxed boolean > crossSerialize > scoped > supports boolean 2`] = `"($R=>$R[0]=Object(!1))($R[\\"example\\"])"`; exports[`boxed boolean > crossSerialize > supports boolean 1`] = `"$R[0]=Object(!0)"`; exports[`boxed boolean > crossSerialize > supports boolean 2`] = `"$R[0]=Object(!1)"`; -exports[`boxed boolean > crossSerializeAsync > scoped > supports boolean 1`] = `"($R=>($R[0]=Object(!0)))($R[\\"example\\"])"`; +exports[`boxed boolean > crossSerializeAsync > scoped > supports boolean 1`] = `"($R=>$R[0]=Object(!0))($R[\\"example\\"])"`; -exports[`boxed boolean > crossSerializeAsync > scoped > supports boolean 2`] = `"($R=>($R[0]=Object(!1)))($R[\\"example\\"])"`; +exports[`boxed boolean > crossSerializeAsync > scoped > supports boolean 2`] = `"($R=>$R[0]=Object(!1))($R[\\"example\\"])"`; exports[`boxed boolean > crossSerializeAsync > supports boolean 1`] = `"$R[0]=Object(!0)"`; @@ -24,10 +24,10 @@ exports[`boxed boolean > crossSerializeStream > supports boxed true 1`] = `"$R[0 exports[`boxed boolean > crossSerializeStream > supports boxed true 2`] = `"_$.Ps($R[0],$R[1]=Object(!0))"`; -exports[`boxed boolean > scoped > supports boxed false 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`boxed boolean > scoped > supports boxed false 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`boxed boolean > scoped > supports boxed false 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object(!1))))($R[\\"example\\"])"`; +exports[`boxed boolean > scoped > supports boxed false 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object(!1)))($R[\\"example\\"])"`; -exports[`boxed boolean > scoped > supports boxed true 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`boxed boolean > scoped > supports boxed true 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`boxed boolean > scoped > supports boxed true 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object(!0))))($R[\\"example\\"])"`; +exports[`boxed boolean > scoped > supports boxed true 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object(!0)))($R[\\"example\\"])"`; diff --git a/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap b/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap index 0085c836..b4562b1f 100644 --- a/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap @@ -1,14 +1,14 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`boxed number > crossSerialize > scoped > supports boxed numbers 1`] = `"($R=>($R[0]=Object(3735928559)))($R[\\"example\\"])"`; +exports[`boxed number > crossSerialize > scoped > supports boxed numbers 1`] = `"($R=>$R[0]=Object(3735928559))($R[\\"example\\"])"`; -exports[`boxed number > crossSerialize > scoped > supports boxed numbers 2`] = `"($R=>($R[0]=Object(0/0)))($R[\\"example\\"])"`; +exports[`boxed number > crossSerialize > scoped > supports boxed numbers 2`] = `"($R=>$R[0]=Object(0/0))($R[\\"example\\"])"`; -exports[`boxed number > crossSerialize > scoped > supports boxed numbers 3`] = `"($R=>($R[0]=Object(1/0)))($R[\\"example\\"])"`; +exports[`boxed number > crossSerialize > scoped > supports boxed numbers 3`] = `"($R=>$R[0]=Object(1/0))($R[\\"example\\"])"`; -exports[`boxed number > crossSerialize > scoped > supports boxed numbers 4`] = `"($R=>($R[0]=Object(-1/0)))($R[\\"example\\"])"`; +exports[`boxed number > crossSerialize > scoped > supports boxed numbers 4`] = `"($R=>$R[0]=Object(-1/0))($R[\\"example\\"])"`; -exports[`boxed number > crossSerialize > scoped > supports boxed numbers 5`] = `"($R=>($R[0]=Object(-0)))($R[\\"example\\"])"`; +exports[`boxed number > crossSerialize > scoped > supports boxed numbers 5`] = `"($R=>$R[0]=Object(-0))($R[\\"example\\"])"`; exports[`boxed number > crossSerialize > supports boxed numbers 1`] = `"$R[0]=Object(3735928559)"`; @@ -20,15 +20,15 @@ exports[`boxed number > crossSerialize > supports boxed numbers 4`] = `"$R[0]=Ob exports[`boxed number > crossSerialize > supports boxed numbers 5`] = `"$R[0]=Object(-0)"`; -exports[`boxed number > crossSerializeAsync > scoped > supports boxed numbers 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=Object(3735928559))))($R[\\"example\\"])"`; +exports[`boxed number > crossSerializeAsync > scoped > supports boxed numbers 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object(3735928559)))($R[\\"example\\"])"`; -exports[`boxed number > crossSerializeAsync > scoped > supports boxed numbers 2`] = `"($R=>($R[0]=Promise.resolve($R[1]=Object(0/0))))($R[\\"example\\"])"`; +exports[`boxed number > crossSerializeAsync > scoped > supports boxed numbers 2`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object(0/0)))($R[\\"example\\"])"`; -exports[`boxed number > crossSerializeAsync > scoped > supports boxed numbers 3`] = `"($R=>($R[0]=Promise.resolve($R[1]=Object(1/0))))($R[\\"example\\"])"`; +exports[`boxed number > crossSerializeAsync > scoped > supports boxed numbers 3`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object(1/0)))($R[\\"example\\"])"`; -exports[`boxed number > crossSerializeAsync > scoped > supports boxed numbers 4`] = `"($R=>($R[0]=Promise.resolve($R[1]=Object(-1/0))))($R[\\"example\\"])"`; +exports[`boxed number > crossSerializeAsync > scoped > supports boxed numbers 4`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object(-1/0)))($R[\\"example\\"])"`; -exports[`boxed number > crossSerializeAsync > scoped > supports boxed numbers 5`] = `"($R=>($R[0]=Promise.resolve($R[1]=Object(-0))))($R[\\"example\\"])"`; +exports[`boxed number > crossSerializeAsync > scoped > supports boxed numbers 5`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object(-0)))($R[\\"example\\"])"`; exports[`boxed number > crossSerializeAsync > supports boxed numbers 1`] = `"$R[0]=Promise.resolve($R[1]=Object(3735928559))"`; @@ -40,25 +40,25 @@ exports[`boxed number > crossSerializeAsync > supports boxed numbers 4`] = `"$R[ exports[`boxed number > crossSerializeAsync > supports boxed numbers 5`] = `"$R[0]=Promise.resolve($R[1]=Object(-0))"`; -exports[`boxed number > crossSerializeStream > scoped > supports boxed -0 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`boxed number > crossSerializeStream > scoped > supports boxed -0 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`boxed number > crossSerializeStream > scoped > supports boxed -0 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object(-0))))($R[\\"example\\"])"`; +exports[`boxed number > crossSerializeStream > scoped > supports boxed -0 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object(-0)))($R[\\"example\\"])"`; -exports[`boxed number > crossSerializeStream > scoped > supports boxed -Infinity 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`boxed number > crossSerializeStream > scoped > supports boxed -Infinity 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`boxed number > crossSerializeStream > scoped > supports boxed -Infinity 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object(-1/0))))($R[\\"example\\"])"`; +exports[`boxed number > crossSerializeStream > scoped > supports boxed -Infinity 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object(-1/0)))($R[\\"example\\"])"`; -exports[`boxed number > crossSerializeStream > scoped > supports boxed Infinity 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`boxed number > crossSerializeStream > scoped > supports boxed Infinity 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`boxed number > crossSerializeStream > scoped > supports boxed Infinity 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object(1/0))))($R[\\"example\\"])"`; +exports[`boxed number > crossSerializeStream > scoped > supports boxed Infinity 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object(1/0)))($R[\\"example\\"])"`; -exports[`boxed number > crossSerializeStream > scoped > supports boxed NaN 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`boxed number > crossSerializeStream > scoped > supports boxed NaN 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`boxed number > crossSerializeStream > scoped > supports boxed NaN 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object(0/0))))($R[\\"example\\"])"`; +exports[`boxed number > crossSerializeStream > scoped > supports boxed NaN 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object(0/0)))($R[\\"example\\"])"`; -exports[`boxed number > crossSerializeStream > scoped > supports boxed numbers 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`boxed number > crossSerializeStream > scoped > supports boxed numbers 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`boxed number > crossSerializeStream > scoped > supports boxed numbers 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object(3735928559))))($R[\\"example\\"])"`; +exports[`boxed number > crossSerializeStream > scoped > supports boxed numbers 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object(3735928559)))($R[\\"example\\"])"`; exports[`boxed number > crossSerializeStream > supports boxed -0 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap b/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap index f9234e24..adeec73b 100644 --- a/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap @@ -1,28 +1,28 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`boxed string > crossSerialize > scoped > supports boxed strings 1`] = `"($R=>($R[0]=Object(\\"\\\\\\"hello\\\\\\"\\")))($R[\\"example\\"])"`; +exports[`boxed string > crossSerialize > scoped > supports boxed strings 1`] = `"($R=>$R[0]=Object(\\"\\\\\\"hello\\\\\\"\\"))($R[\\"example\\"])"`; -exports[`boxed string > crossSerialize > scoped > supports boxed strings 2`] = `"($R=>($R[0]=Object(\\"\\\\x3Cscript>\\\\x3C/script>\\")))($R[\\"example\\"])"`; +exports[`boxed string > crossSerialize > scoped > supports boxed strings 2`] = `"($R=>$R[0]=Object(\\"\\\\x3Cscript>\\\\x3C/script>\\"))($R[\\"example\\"])"`; exports[`boxed string > crossSerialize > supports boxed strings 1`] = `"$R[0]=Object(\\"\\\\\\"hello\\\\\\"\\")"`; exports[`boxed string > crossSerialize > supports boxed strings 2`] = `"$R[0]=Object(\\"\\\\x3Cscript>\\\\x3C/script>\\")"`; -exports[`boxed string > crossSerializeAsync > scoped > supports boxed strings 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=Object(\\"\\\\\\"hello\\\\\\"\\"))))($R[\\"example\\"])"`; +exports[`boxed string > crossSerializeAsync > scoped > supports boxed strings 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object(\\"\\\\\\"hello\\\\\\"\\")))($R[\\"example\\"])"`; -exports[`boxed string > crossSerializeAsync > scoped > supports boxed strings 2`] = `"($R=>($R[0]=Promise.resolve($R[1]=Object(\\"\\\\x3Cscript>\\\\x3C/script>\\"))))($R[\\"example\\"])"`; +exports[`boxed string > crossSerializeAsync > scoped > supports boxed strings 2`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object(\\"\\\\x3Cscript>\\\\x3C/script>\\")))($R[\\"example\\"])"`; exports[`boxed string > crossSerializeAsync > supports boxed strings 1`] = `"$R[0]=Promise.resolve($R[1]=Object(\\"\\\\\\"hello\\\\\\"\\"))"`; exports[`boxed string > crossSerializeAsync > supports boxed strings 2`] = `"$R[0]=Promise.resolve($R[1]=Object(\\"\\\\x3Cscript>\\\\x3C/script>\\"))"`; -exports[`boxed string > crossSerializeStream > scoped > supports boxed sanitized strings 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`boxed string > crossSerializeStream > scoped > supports boxed sanitized strings 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`boxed string > crossSerializeStream > scoped > supports boxed sanitized strings 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object(\\"\\\\x3Cscript>\\\\x3C/script>\\"))))($R[\\"example\\"])"`; +exports[`boxed string > crossSerializeStream > scoped > supports boxed sanitized strings 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object(\\"\\\\x3Cscript>\\\\x3C/script>\\")))($R[\\"example\\"])"`; -exports[`boxed string > crossSerializeStream > scoped > supports boxed strings 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`boxed string > crossSerializeStream > scoped > supports boxed strings 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`boxed string > crossSerializeStream > scoped > supports boxed strings 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object(\\"\\\\\\"hello\\\\\\"\\"))))($R[\\"example\\"])"`; +exports[`boxed string > crossSerializeStream > scoped > supports boxed strings 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object(\\"\\\\\\"hello\\\\\\"\\")))($R[\\"example\\"])"`; exports[`boxed string > crossSerializeStream > supports boxed sanitized strings 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/__snapshots__/data-view.test.ts.snap b/packages/seroval/test/__snapshots__/data-view.test.ts.snap index 87ce3634..2d8a4cfc 100644 --- a/packages/seroval/test/__snapshots__/data-view.test.ts.snap +++ b/packages/seroval/test/__snapshots__/data-view.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`DataView > crossSerialize > scoped > supports DataView 1`] = `"($R=>($R[0]=new DataView($R[1]=new Uint8Array([0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]).buffer,0,16)))($R[\\"example\\"])"`; +exports[`DataView > crossSerialize > scoped > supports DataView 1`] = `"($R=>$R[0]=new DataView($R[1]=new Uint8Array([0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]).buffer,0,16))($R[\\"example\\"])"`; exports[`DataView > crossSerialize > supports DataView 1`] = `"$R[0]=new DataView($R[1]=new Uint8Array([0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]).buffer,0,16)"`; -exports[`DataView > crossSerializeAsync > scoped > supports DataView 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=new DataView($R[2]=new Uint8Array([0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]).buffer,0,16))))($R[\\"example\\"])"`; +exports[`DataView > crossSerializeAsync > scoped > supports DataView 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new DataView($R[2]=new Uint8Array([0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]).buffer,0,16)))($R[\\"example\\"])"`; exports[`DataView > crossSerializeAsync > supports DataView 1`] = `"$R[0]=Promise.resolve($R[1]=new DataView($R[2]=new Uint8Array([0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]).buffer,0,16))"`; -exports[`DataView > crossSerializeStream > scoped > supports DataView 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`DataView > crossSerializeStream > scoped > supports DataView 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`DataView > crossSerializeStream > scoped > supports DataView 2`] = `"($R=>(_$.Ps($R[0],$R[1]=new DataView($R[2]=new Uint8Array([0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]).buffer,0,16))))($R[\\"example\\"])"`; +exports[`DataView > crossSerializeStream > scoped > supports DataView 2`] = `"($R=>_$.Ps($R[0],$R[1]=new DataView($R[2]=new Uint8Array([0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]).buffer,0,16)))($R[\\"example\\"])"`; exports[`DataView > crossSerializeStream > supports DataView 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/__snapshots__/date.test.ts.snap b/packages/seroval/test/__snapshots__/date.test.ts.snap index 521b4435..cdd42704 100644 --- a/packages/seroval/test/__snapshots__/date.test.ts.snap +++ b/packages/seroval/test/__snapshots__/date.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Date > crossSerialize > scoped > supports Date 1`] = `"($R=>($R[0]=new Date(\\"2023-03-14T11:16:24.879Z\\")))($R[\\"example\\"])"`; +exports[`Date > crossSerialize > scoped > supports Date 1`] = `"($R=>$R[0]=new Date(\\"2023-03-14T11:16:24.879Z\\"))($R[\\"example\\"])"`; exports[`Date > crossSerialize > supports Date 1`] = `"$R[0]=new Date(\\"2023-03-14T11:16:24.879Z\\")"`; -exports[`Date > crossSerializeAsync > scoped > supports Date 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=new Date(\\"2023-03-14T11:16:24.879Z\\"))))($R[\\"example\\"])"`; +exports[`Date > crossSerializeAsync > scoped > supports Date 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new Date(\\"2023-03-14T11:16:24.879Z\\")))($R[\\"example\\"])"`; exports[`Date > crossSerializeAsync > supports Date 1`] = `"$R[0]=Promise.resolve($R[1]=new Date(\\"2023-03-14T11:16:24.879Z\\"))"`; -exports[`Date > crossSerializeStream > scoped > supports Date 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`Date > crossSerializeStream > scoped > supports Date 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Date > crossSerializeStream > scoped > supports Date 2`] = `"($R=>(_$.Ps($R[0],$R[1]=new Date(\\"2023-03-14T11:16:24.879Z\\"))))($R[\\"example\\"])"`; +exports[`Date > crossSerializeStream > scoped > supports Date 2`] = `"($R=>_$.Ps($R[0],$R[1]=new Date(\\"2023-03-14T11:16:24.879Z\\")))($R[\\"example\\"])"`; exports[`Date > crossSerializeStream > supports Date 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/__snapshots__/error.test.ts.snap b/packages/seroval/test/__snapshots__/error.test.ts.snap index 74b6d7e9..6d230a89 100644 --- a/packages/seroval/test/__snapshots__/error.test.ts.snap +++ b/packages/seroval/test/__snapshots__/error.test.ts.snap @@ -1,10 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Error > crossSerialize > scoped > supports Error.prototype.cause 1`] = `"($R=>($R[0]=Object.assign(new Error(\\"B\\"),{stack:\\"\\",cause:$R[1]=Object.assign(new Error(\\"A\\"),{stack:\\"\\"})})))($R[\\"example\\"])"`; +exports[`Error > crossSerialize > scoped > supports Error.prototype.cause 1`] = `"($R=>$R[0]=Object.assign(new Error(\\"B\\"),{stack:\\"\\",cause:$R[1]=Object.assign(new Error(\\"A\\"),{stack:\\"\\"})}))($R[\\"example\\"])"`; -exports[`Error > crossSerialize > scoped > supports Error.prototype.name 1`] = `"($R=>($R[0]=Object.assign(new Error(\\"A\\"),{name:\\"ExampleError\\",stack:\\"\\"})))($R[\\"example\\"])"`; +exports[`Error > crossSerialize > scoped > supports Error.prototype.name 1`] = `"($R=>$R[0]=Object.assign(new Error(\\"A\\"),{name:\\"ExampleError\\",stack:\\"\\"}))($R[\\"example\\"])"`; -exports[`Error > crossSerialize > scoped > supports other Error classes 1`] = `"($R=>($R[0]=Object.assign(new ReferenceError(\\"A\\"),{stack:\\"\\"})))($R[\\"example\\"])"`; +exports[`Error > crossSerialize > scoped > supports other Error classes 1`] = `"($R=>$R[0]=Object.assign(new ReferenceError(\\"A\\"),{stack:\\"\\"}))($R[\\"example\\"])"`; exports[`Error > crossSerialize > supports Error.prototype.cause 1`] = `"$R[0]=Object.assign(new Error(\\"B\\"),{stack:\\"\\",cause:$R[1]=Object.assign(new Error(\\"A\\"),{stack:\\"\\"})})"`; @@ -12,11 +12,11 @@ exports[`Error > crossSerialize > supports Error.prototype.name 1`] = `"$R[0]=Ob exports[`Error > crossSerialize > supports other Error classes 1`] = `"$R[0]=Object.assign(new ReferenceError(\\"A\\"),{stack:\\"\\"})"`; -exports[`Error > crossSerializeAsync > scoped > supports Error.prototype.cause 1`] = `"($R=>($R[0]=Object.assign(new Error(\\"B\\"),{stack:\\"\\",cause:$R[1]=Promise.resolve($R[2]=Object.assign(new Error(\\"A\\"),{stack:\\"\\"}))})))($R[\\"example\\"])"`; +exports[`Error > crossSerializeAsync > scoped > supports Error.prototype.cause 1`] = `"($R=>$R[0]=Object.assign(new Error(\\"B\\"),{stack:\\"\\",cause:$R[1]=Promise.resolve($R[2]=Object.assign(new Error(\\"A\\"),{stack:\\"\\"}))}))($R[\\"example\\"])"`; -exports[`Error > crossSerializeAsync > scoped > supports Error.prototype.name 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=Object.assign(new Error(\\"A\\"),{name:\\"ExampleError\\",stack:\\"\\"}))))($R[\\"example\\"])"`; +exports[`Error > crossSerializeAsync > scoped > supports Error.prototype.name 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(new Error(\\"A\\"),{name:\\"ExampleError\\",stack:\\"\\"})))($R[\\"example\\"])"`; -exports[`Error > crossSerializeAsync > scoped > supports other Error classes 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=Object.assign(new ReferenceError(\\"A\\"),{stack:\\"\\"}))))($R[\\"example\\"])"`; +exports[`Error > crossSerializeAsync > scoped > supports other Error classes 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(new ReferenceError(\\"A\\"),{stack:\\"\\"})))($R[\\"example\\"])"`; exports[`Error > crossSerializeAsync > supports Error.prototype.cause 1`] = `"$R[0]=Object.assign(new Error(\\"B\\"),{stack:\\"\\",cause:$R[1]=Promise.resolve($R[2]=Object.assign(new Error(\\"A\\"),{stack:\\"\\"}))})"`; @@ -24,19 +24,19 @@ exports[`Error > crossSerializeAsync > supports Error.prototype.name 1`] = `"$R[ exports[`Error > crossSerializeAsync > supports other Error classes 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(new ReferenceError(\\"A\\"),{stack:\\"\\"}))"`; -exports[`Error > crossSerializeStream > scoped > supports Error.prototype.cause 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`Error > crossSerializeStream > scoped > supports Error.prototype.cause 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Error > crossSerializeStream > scoped > supports Error.prototype.cause 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object.assign(new Error(\\"B\\"),{stack:\\"\\",cause:$R[2]=_$.P()}))))($R[\\"example\\"])"`; +exports[`Error > crossSerializeStream > scoped > supports Error.prototype.cause 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(new Error(\\"B\\"),{stack:\\"\\",cause:$R[2]=_$.P()})))($R[\\"example\\"])"`; -exports[`Error > crossSerializeStream > scoped > supports Error.prototype.cause 3`] = `"($R=>(_$.Ps($R[2],$R[3]=Object.assign(new Error(\\"A\\"),{stack:\\"\\"}))))($R[\\"example\\"])"`; +exports[`Error > crossSerializeStream > scoped > supports Error.prototype.cause 3`] = `"($R=>_$.Ps($R[2],$R[3]=Object.assign(new Error(\\"A\\"),{stack:\\"\\"})))($R[\\"example\\"])"`; -exports[`Error > crossSerializeStream > scoped > supports Error.prototype.name 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`Error > crossSerializeStream > scoped > supports Error.prototype.name 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Error > crossSerializeStream > scoped > supports Error.prototype.name 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object.assign(new Error(\\"A\\"),{name:\\"ExampleError\\",stack:\\"\\"}))))($R[\\"example\\"])"`; +exports[`Error > crossSerializeStream > scoped > supports Error.prototype.name 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(new Error(\\"A\\"),{name:\\"ExampleError\\",stack:\\"\\"})))($R[\\"example\\"])"`; -exports[`Error > crossSerializeStream > scoped > supports other Error classes 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`Error > crossSerializeStream > scoped > supports other Error classes 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Error > crossSerializeStream > scoped > supports other Error classes 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object.assign(new ReferenceError(\\"A\\"),{stack:\\"\\"}))))($R[\\"example\\"])"`; +exports[`Error > crossSerializeStream > scoped > supports other Error classes 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(new ReferenceError(\\"A\\"),{stack:\\"\\"})))($R[\\"example\\"])"`; exports[`Error > crossSerializeStream > supports Error.prototype.cause 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap index cf3e35eb..0d759508 100644 --- a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap @@ -1,44 +1,44 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`frozen object > crossSerialize > scoped > supports Objects 1`] = `"($R=>($R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0]))($R[\\"example\\"])"`; +exports[`frozen object > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>($R[0]={[Symbol.iterator]:()=>$R[1]=[1,2,3].values()},Object.freeze($R[0]),$R[0]))($R[\\"example\\"])"`; +exports[`frozen object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>($R[0]={},$R[0].b=$R[0].a=$R[0],Object.freeze($R[0]),$R[0]))($R[\\"example\\"])"`; +exports[`frozen object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])"`; -exports[`frozen object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[Symbol.iterator]:()=>$R[1]=[1,2,3].values()},Object.freeze($R[0]),$R[0])"`; +exports[`frozen object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))},Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],Object.freeze($R[0]),$R[0])"`; -exports[`frozen object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0]))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>($R[0]=Promise.resolve($R[1]={[Symbol.iterator]:()=>$R[2]=[1,2,3].values()}),Object.freeze($R[1]),$R[0]))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0]))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])"`; -exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[Symbol.iterator]:()=>$R[2]=[1,2,3].values()}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.freeze($R[1]),$R[0])"`; exports[`frozen object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Objects 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Objects 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>(_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0]))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>(_$.Ps($R[0],$R[1]={[Symbol.iterator]:()=>$R[2]=[1,2,3].values()}),Object.freeze($R[1]),$R[0]))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>(_$.Ps($R[0],$R[1]={a:$R[2]=_$.P(),b:$R[3]=_$.P()}),Object.freeze($R[1]),$R[0]))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>_$.Ps($R[0],$R[1]={a:$R[2]=_$.P(),b:$R[3]=_$.P()}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>(_$.Ps($R[2],$R[1])))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>_$.Ps($R[2],$R[1]))($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 4`] = `"($R=>(_$.Ps($R[3],$R[1])))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 4`] = `"($R=>_$.Ps($R[3],$R[1]))($R[\\"example\\"])"`; exports[`frozen object > crossSerializeStream > supports Objects 1`] = `"$R[0]=_$.P()"`; @@ -46,7 +46,7 @@ exports[`frozen object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps( exports[`frozen object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[Symbol.iterator]:()=>$R[2]=[1,2,3].values()}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.freeze($R[1]),$R[0])"`; exports[`frozen object > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -58,24 +58,24 @@ exports[`frozen object > crossSerializeStream > supports self-recursion 4`] = `" exports[`frozen object > serialize > supports Objects 1`] = `"(h=>(h={hello:\\"world\\"},Object.freeze(h),h))()"`; -exports[`frozen object > serialize > supports Symbol.iterator 1`] = `"(h=>(h={[Symbol.iterator]:()=>[1,2,3].values()},Object.freeze(h),h))()"`; +exports[`frozen object > serialize > supports Symbol.iterator 1`] = `"((h,j)=>(h={[Symbol.iterator]:(j=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))},Object.freeze(h),h))()"`; exports[`frozen object > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a=h,Object.freeze(h),h))()"`; exports[`frozen object > serializeAsync > supports Objects 1`] = `"((h,j)=>(j=Promise.resolve(h={hello:\\"world\\"}),Object.freeze(h),j))()"`; -exports[`frozen object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j)=>(j=Promise.resolve(h={[Symbol.iterator]:()=>[1,2,3].values()}),Object.freeze(h),j))()"`; +exports[`frozen object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[Symbol.iterator]:(j=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))}),Object.freeze(h),k))()"`; exports[`frozen object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.freeze(h),h))()"`; exports[`frozen object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3},\\"f\\":16383,\\"m\\":[]}"`; -exports[`frozen object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}],\\"s\\":1},\\"o\\":3},\\"f\\":16383,\\"m\\":[]}"`; +exports[`frozen object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":3},\\"f\\":16383,\\"m\\":[]}"`; exports[`frozen object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":3},\\"f\\":16383,\\"m\\":[0]}"`; exports[`frozen object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`frozen object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}],\\"s\\":1},\\"o\\":3}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`frozen object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":3}},\\"f\\":16383,\\"m\\":[]}"`; exports[`frozen object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":3},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/iterable.test.ts.snap b/packages/seroval/test/__snapshots__/iterable.test.ts.snap index 9791a3a4..40727930 100644 --- a/packages/seroval/test/__snapshots__/iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/iterable.test.ts.snap @@ -1,43 +1,43 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Iterable > compat > should use Symbol.iterator instead of Array.values. 1`] = `"(h=>(h={[Symbol.iterator]:()=>[h][Symbol.iterator]()}))()"`; +exports[`Iterable > compat > should use Symbol.iterator instead of Array.values. 1`] = `"((h,j)=>(h={[Symbol.iterator]:(j=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[h,void 0],t:-1}))}))()"`; -exports[`Iterable > compat > should use functions instead of method shorthand. 1`] = `"(function(h){return h={[Symbol.iterator]:function(){return [h].values()}}})()"`; +exports[`Iterable > compat > should use functions instead of method shorthand. 1`] = `"(function(h,j){return(h={[Symbol.iterator]:(j=function(f,i,s,c,d){return(function(){return(s=f(),i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})})})(function(){return({v:[h,void 0],t:-1})})})})()"`; -exports[`Iterable > compat > should use method shorthand instead of arrow functions. 1`] = `"(function(h){return h={[Symbol.iterator](){return [h].values()}}})()"`; +exports[`Iterable > compat > should use method shorthand instead of arrow functions. 1`] = `"(function(h,j){return(h={[Symbol.iterator]:(j=function(f,i,s,c,d){return(function(){return(s=f(),i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})})})(function(){return({v:[h,void 0],t:-1})})})})()"`; -exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":0}],\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16381,\\"m\\":[0]}"`; +exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16381,\\"m\\":[0]}"`; -exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 2`] = `"(h=>(h={[Symbol.iterator]:()=>[h][Symbol.iterator]()}))()"`; +exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 2`] = `"((h,j)=>(h={[Symbol.iterator]:(j=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[h,void 0],t:-1}))}))()"`; -exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":0}],\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16315,\\"m\\":[0]}"`; +exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16315,\\"m\\":[0]}"`; -exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 2`] = `"(function(h){return h={[Symbol.iterator]:function(){return [h].values()}}})()"`; +exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 2`] = `"(function(h,j){return(h={[Symbol.iterator]:(j=function(f,i,s,c,d){return(function(){return(s=f(),i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})})})(function(){return({v:[h,void 0],t:-1})})})})()"`; -exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":0}],\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16379,\\"m\\":[0]}"`; +exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16379,\\"m\\":[0]}"`; -exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 2`] = `"(function(h){return h={[Symbol.iterator](){return [h].values()}}})()"`; +exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 2`] = `"(function(h,j){return(h={[Symbol.iterator]:(j=function(f,i,s,c,d){return(function(){return(s=f(),i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})})})(function(){return({v:[h,void 0],t:-1})})})})()"`; -exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>($R[0]={title:\\"Hello World\\",[Symbol.iterator]:()=>$R[1]=[1,2,3].values()}))($R[\\"example\\"])"`; +exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))})($R[\\"example\\"])"`; -exports[`Iterable > crossSerialize > supports Iterables 1`] = `"$R[0]={title:\\"Hello World\\",[Symbol.iterator]:()=>$R[1]=[1,2,3].values()}"`; +exports[`Iterable > crossSerialize > supports Iterables 1`] = `"$R[0]={title:\\"Hello World\\",[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))}"`; -exports[`Iterable > crossSerializeAsync > scoped > supports Iterables 1`] = `"($R=>($R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[Symbol.iterator]:()=>$R[2]=[1,2,3].values()})))($R[\\"example\\"])"`; +exports[`Iterable > crossSerializeAsync > scoped > supports Iterables 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}))($R[\\"example\\"])"`; -exports[`Iterable > crossSerializeAsync > supports Iterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[Symbol.iterator]:()=>$R[2]=[1,2,3].values()})"`; +exports[`Iterable > crossSerializeAsync > supports Iterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))})"`; -exports[`Iterable > crossSerializeStream > scoped > supports Iterables 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`Iterable > crossSerializeStream > scoped > supports Iterables 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Iterable > crossSerializeStream > scoped > supports Iterables 2`] = `"($R=>(_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[Symbol.iterator]:()=>$R[2]=[1,2,3].values()})))($R[\\"example\\"])"`; +exports[`Iterable > crossSerializeStream > scoped > supports Iterables 2`] = `"($R=>_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}))($R[\\"example\\"])"`; exports[`Iterable > crossSerializeStream > supports Iterables 1`] = `"$R[0]=_$.P()"`; -exports[`Iterable > crossSerializeStream > supports Iterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[Symbol.iterator]:()=>$R[2]=[1,2,3].values()})"`; +exports[`Iterable > crossSerializeStream > supports Iterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))})"`; -exports[`Iterable > serialize > supports Iterables 1`] = `"({title:\\"Hello World\\",[Symbol.iterator]:()=>[1,2,3].values()})"`; +exports[`Iterable > serialize > supports Iterables 1`] = `"(h=>({title:\\"Hello World\\",[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))}))()"`; -exports[`Iterable > serializeAsync > supports Iterables 1`] = `"Promise.resolve({title:\\"Hello World\\",[Symbol.iterator]:()=>[1,2,3].values()})"`; +exports[`Iterable > serializeAsync > supports Iterables 1`] = `"(h=>(Promise.resolve({title:\\"Hello World\\",[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))})))()"`; -exports[`Iterable > toJSON > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":9,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Iterable > toJSON > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Iterable > toJSONAsync > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":9,\\"i\\":2,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}],\\"s\\":2},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Iterable > toJSONAsync > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":2},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/map.test.ts.snap b/packages/seroval/test/__snapshots__/map.test.ts.snap index 78004061..36dd961c 100644 --- a/packages/seroval/test/__snapshots__/map.test.ts.snap +++ b/packages/seroval/test/__snapshots__/map.test.ts.snap @@ -1,38 +1,38 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"Object.assign(Object.create(null),{[Symbol.iterator]:()=>[].values()})"`; +exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[void 0],t:-1}))})))()"`; exports[`Map > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; -exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":0,\\"a\\":[],\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16351,\\"m\\":[]}"`; +exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16351,\\"m\\":[]}"`; exports[`Map > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; -exports[`Map > crossSerialize > scoped > supports Map 1`] = `"($R=>($R[0]=new Map([[1,2],[3,4]])))($R[\\"example\\"])"`; +exports[`Map > crossSerialize > scoped > supports Map 1`] = `"($R=>$R[0]=new Map([[1,2],[3,4]]))($R[\\"example\\"])"`; -exports[`Map > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>($R[0]=new Map,$R[0].set($R[0],$R[0]),$R[0]))($R[\\"example\\"])"`; +exports[`Map > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]=new Map,$R[0].set($R[0],$R[0]),$R[0])($R[\\"example\\"])"`; exports[`Map > crossSerialize > supports Map 1`] = `"$R[0]=new Map([[1,2],[3,4]])"`; exports[`Map > crossSerialize > supports self-recursion 1`] = `"($R[0]=new Map,$R[0].set($R[0],$R[0]),$R[0])"`; -exports[`Map > crossSerializeAsync > scoped > supports Map 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=new Map([[1,2],[3,4]]))))($R[\\"example\\"])"`; +exports[`Map > crossSerializeAsync > scoped > supports Map 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new Map([[1,2],[3,4]])))($R[\\"example\\"])"`; -exports[`Map > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>($R[0]=new Map([[$R[1]=Promise.resolve().then(()=>$R[0]),$R[2]=Promise.resolve().then(()=>$R[0])]])))($R[\\"example\\"])"`; +exports[`Map > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]=new Map([[$R[1]=Promise.resolve().then(()=>$R[0]),$R[2]=Promise.resolve().then(()=>$R[0])]]))($R[\\"example\\"])"`; exports[`Map > crossSerializeAsync > supports Map 1`] = `"$R[0]=Promise.resolve($R[1]=new Map([[1,2],[3,4]]))"`; exports[`Map > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]=new Map([[$R[1]=Promise.resolve().then(()=>$R[0]),$R[2]=Promise.resolve().then(()=>$R[0])]])"`; -exports[`Map > crossSerializeStream > scoped > supports Map 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`Map > crossSerializeStream > scoped > supports Map 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Map > crossSerializeStream > scoped > supports Map 2`] = `"($R=>(_$.Ps($R[0],$R[1]=new Map([[1,2],[3,4]]))))($R[\\"example\\"])"`; +exports[`Map > crossSerializeStream > scoped > supports Map 2`] = `"($R=>_$.Ps($R[0],$R[1]=new Map([[1,2],[3,4]])))($R[\\"example\\"])"`; -exports[`Map > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>($R[0]=new Map([[$R[1]=_$.P(),$R[2]=_$.P()]])))($R[\\"example\\"])"`; +exports[`Map > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=new Map([[$R[1]=_$.P(),$R[2]=_$.P()]]))($R[\\"example\\"])"`; -exports[`Map > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>(_$.Ps($R[1],$R[0])))($R[\\"example\\"])"`; +exports[`Map > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>_$.Ps($R[1],$R[0]))($R[\\"example\\"])"`; -exports[`Map > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>(_$.Ps($R[2],$R[0])))($R[\\"example\\"])"`; +exports[`Map > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>_$.Ps($R[2],$R[0]))($R[\\"example\\"])"`; exports[`Map > crossSerializeStream > supports Map 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap b/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap index 847e51ba..8b5e7331 100644 --- a/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap +++ b/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap @@ -1,10 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`mutual cyclic references > crossSerialize > scoped > supports Arrays and Arrays 1`] = `"($R=>($R[0]=[$R[1]=[$R[2]=[,]],$R[2]],$R[2][0]=$R[1],$R[0]))($R[\\"example\\"])"`; +exports[`mutual cyclic references > crossSerialize > scoped > supports Arrays and Arrays 1`] = `"($R=>$R[0]=[$R[1]=[$R[2]=[,]],$R[2]],$R[2][0]=$R[1],$R[0])($R[\\"example\\"])"`; -exports[`mutual cyclic references > crossSerialize > scoped > supports Arrays and Objects 1`] = `"($R=>($R[0]=[$R[1]=[$R[2]={}],$R[2]],$R[2][0]=$R[1],$R[0]))($R[\\"example\\"])"`; +exports[`mutual cyclic references > crossSerialize > scoped > supports Arrays and Objects 1`] = `"($R=>$R[0]=[$R[1]=[$R[2]={}],$R[2]],$R[2][0]=$R[1],$R[0])($R[\\"example\\"])"`; -exports[`mutual cyclic references > crossSerialize > scoped > supports Objects and Objects 1`] = `"($R=>($R[0]=[$R[1]={0:$R[2]={}},$R[2]],$R[2][0]=$R[1],$R[0]))($R[\\"example\\"])"`; +exports[`mutual cyclic references > crossSerialize > scoped > supports Objects and Objects 1`] = `"($R=>$R[0]=[$R[1]={0:$R[2]={}},$R[2]],$R[2][0]=$R[1],$R[0])($R[\\"example\\"])"`; exports[`mutual cyclic references > crossSerialize > supports Arrays and Arrays 1`] = `"($R[0]=[$R[1]=[$R[2]=[,]],$R[2]],$R[2][0]=$R[1],$R[0])"`; @@ -12,11 +12,11 @@ exports[`mutual cyclic references > crossSerialize > supports Arrays and Objects exports[`mutual cyclic references > crossSerialize > supports Objects and Objects 1`] = `"($R[0]=[$R[1]={0:$R[2]={}},$R[2]],$R[2][0]=$R[1],$R[0])"`; -exports[`mutual cyclic references > crossSerializeAsync > scoped > supports Arrays and Arrays 1`] = `"($R=>($R[0]=[$R[1]=[$R[2]=Promise.resolve($R[3]=[$R[4]=Promise.resolve().then(()=>$R[1])])],$R[3]]))($R[\\"example\\"])"`; +exports[`mutual cyclic references > crossSerializeAsync > scoped > supports Arrays and Arrays 1`] = `"($R=>$R[0]=[$R[1]=[$R[2]=Promise.resolve($R[3]=[$R[4]=Promise.resolve().then(()=>$R[1])])],$R[3]])($R[\\"example\\"])"`; -exports[`mutual cyclic references > crossSerializeAsync > scoped > supports Arrays and Objects 1`] = `"($R=>($R[0]=[$R[1]=[$R[2]=Promise.resolve($R[3]={0:$R[4]=Promise.resolve().then(()=>$R[1])})],$R[3]]))($R[\\"example\\"])"`; +exports[`mutual cyclic references > crossSerializeAsync > scoped > supports Arrays and Objects 1`] = `"($R=>$R[0]=[$R[1]=[$R[2]=Promise.resolve($R[3]={0:$R[4]=Promise.resolve().then(()=>$R[1])})],$R[3]])($R[\\"example\\"])"`; -exports[`mutual cyclic references > crossSerializeAsync > scoped > supports Objects and Objects 1`] = `"($R=>($R[0]=[$R[1]={0:$R[2]=Promise.resolve($R[3]={0:$R[4]=Promise.resolve().then(()=>$R[1])})},$R[3]]))($R[\\"example\\"])"`; +exports[`mutual cyclic references > crossSerializeAsync > scoped > supports Objects and Objects 1`] = `"($R=>$R[0]=[$R[1]={0:$R[2]=Promise.resolve($R[3]={0:$R[4]=Promise.resolve().then(()=>$R[1])})},$R[3]])($R[\\"example\\"])"`; exports[`mutual cyclic references > crossSerializeAsync > supports Arrays and Arrays 1`] = `"$R[0]=[$R[1]=[$R[2]=Promise.resolve($R[3]=[$R[4]=Promise.resolve().then(()=>$R[1])])],$R[3]]"`; @@ -24,23 +24,23 @@ exports[`mutual cyclic references > crossSerializeAsync > supports Arrays and Ob exports[`mutual cyclic references > crossSerializeAsync > supports Objects and Objects 1`] = `"$R[0]=[$R[1]={0:$R[2]=Promise.resolve($R[3]={0:$R[4]=Promise.resolve().then(()=>$R[1])})},$R[3]]"`; -exports[`mutual cyclic references > crossSerializeStream > scoped > supports Arrays and Arrays 1`] = `"($R=>($R[0]=[$R[1]=[$R[2]=_$.P()],$R[3]=[$R[4]=_$.P()]]))($R[\\"example\\"])"`; +exports[`mutual cyclic references > crossSerializeStream > scoped > supports Arrays and Arrays 1`] = `"($R=>$R[0]=[$R[1]=[$R[2]=_$.P()],$R[3]=[$R[4]=_$.P()]])($R[\\"example\\"])"`; -exports[`mutual cyclic references > crossSerializeStream > scoped > supports Arrays and Arrays 2`] = `"($R=>(_$.Ps($R[2],$R[3])))($R[\\"example\\"])"`; +exports[`mutual cyclic references > crossSerializeStream > scoped > supports Arrays and Arrays 2`] = `"($R=>_$.Ps($R[2],$R[3]))($R[\\"example\\"])"`; -exports[`mutual cyclic references > crossSerializeStream > scoped > supports Arrays and Arrays 3`] = `"($R=>(_$.Ps($R[4],$R[1])))($R[\\"example\\"])"`; +exports[`mutual cyclic references > crossSerializeStream > scoped > supports Arrays and Arrays 3`] = `"($R=>_$.Ps($R[4],$R[1]))($R[\\"example\\"])"`; -exports[`mutual cyclic references > crossSerializeStream > scoped > supports Arrays and Objects 1`] = `"($R=>($R[0]=[$R[1]=[$R[2]=_$.P()],$R[3]={0:$R[4]=_$.P()}]))($R[\\"example\\"])"`; +exports[`mutual cyclic references > crossSerializeStream > scoped > supports Arrays and Objects 1`] = `"($R=>$R[0]=[$R[1]=[$R[2]=_$.P()],$R[3]={0:$R[4]=_$.P()}])($R[\\"example\\"])"`; -exports[`mutual cyclic references > crossSerializeStream > scoped > supports Arrays and Objects 2`] = `"($R=>(_$.Ps($R[2],$R[3])))($R[\\"example\\"])"`; +exports[`mutual cyclic references > crossSerializeStream > scoped > supports Arrays and Objects 2`] = `"($R=>_$.Ps($R[2],$R[3]))($R[\\"example\\"])"`; -exports[`mutual cyclic references > crossSerializeStream > scoped > supports Arrays and Objects 3`] = `"($R=>(_$.Ps($R[4],$R[1])))($R[\\"example\\"])"`; +exports[`mutual cyclic references > crossSerializeStream > scoped > supports Arrays and Objects 3`] = `"($R=>_$.Ps($R[4],$R[1]))($R[\\"example\\"])"`; -exports[`mutual cyclic references > crossSerializeStream > scoped > supports Objects and Objects 1`] = `"($R=>($R[0]=[$R[1]={0:$R[2]=_$.P()},$R[3]={0:$R[4]=_$.P()}]))($R[\\"example\\"])"`; +exports[`mutual cyclic references > crossSerializeStream > scoped > supports Objects and Objects 1`] = `"($R=>$R[0]=[$R[1]={0:$R[2]=_$.P()},$R[3]={0:$R[4]=_$.P()}])($R[\\"example\\"])"`; -exports[`mutual cyclic references > crossSerializeStream > scoped > supports Objects and Objects 2`] = `"($R=>(_$.Ps($R[2],$R[3])))($R[\\"example\\"])"`; +exports[`mutual cyclic references > crossSerializeStream > scoped > supports Objects and Objects 2`] = `"($R=>_$.Ps($R[2],$R[3]))($R[\\"example\\"])"`; -exports[`mutual cyclic references > crossSerializeStream > scoped > supports Objects and Objects 3`] = `"($R=>(_$.Ps($R[4],$R[1])))($R[\\"example\\"])"`; +exports[`mutual cyclic references > crossSerializeStream > scoped > supports Objects and Objects 3`] = `"($R=>_$.Ps($R[4],$R[1]))($R[\\"example\\"])"`; exports[`mutual cyclic references > crossSerializeStream > supports Arrays and Arrays 1`] = `"$R[0]=[$R[1]=[$R[2]=_$.P()],$R[3]=[$R[4]=_$.P()]]"`; diff --git a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap index d020ff66..627ba817 100644 --- a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap +++ b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap @@ -6,45 +6,45 @@ exports[`null-constructor > compat#toJSON > should use manual assignment instead exports[`null-constructor > compat#toJSON > should use manual assignment instead of Object.assign 2`] = `"(h=>((h=Object.create(null),h.hello=\\"world\\",h)))()"`; -exports[`null-constructor > crossSerialize > scoped > supports Objects 1`] = `"($R=>($R[0]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>($R[0]=Object.assign(Object.create(null),{[Symbol.iterator]:()=>$R[1]=[1,2,3].values()})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))}))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>($R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0]))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; exports[`null-constructor > crossSerialize > supports Objects 1`] = `"$R[0]=Object.assign(Object.create(null),{hello:\\"world\\"})"`; -exports[`null-constructor > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[Symbol.iterator]:()=>$R[1]=[1,2,3].values()})"`; +exports[`null-constructor > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))})"`; exports[`null-constructor > crossSerialize > supports self-recursion 1`] = `"($R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])"`; -exports[`null-constructor > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:()=>$R[2]=[1,2,3].values()}))))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>($R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:()=>$R[2]=[1,2,3].values()}))"`; +exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}))"`; exports[`null-constructor > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Objects 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Objects 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:()=>$R[2]=[1,2,3].values()}))))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{a:$R[2]=_$.P(),b:$R[3]=_$.P()}))))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{a:$R[2]=_$.P(),b:$R[3]=_$.P()})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>(_$.Ps($R[2],$R[1])))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>_$.Ps($R[2],$R[1]))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 4`] = `"($R=>(_$.Ps($R[3],$R[1])))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 4`] = `"($R=>_$.Ps($R[3],$R[1]))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeStream > supports Objects 1`] = `"$R[0]=_$.P()"`; @@ -52,7 +52,7 @@ exports[`null-constructor > crossSerializeStream > supports Objects 2`] = `"_$.P exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:()=>$R[2]=[1,2,3].values()}))"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}))"`; exports[`null-constructor > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -64,24 +64,24 @@ exports[`null-constructor > crossSerializeStream > supports self-recursion 4`] = exports[`null-constructor > serialize > supports Object.create(null) 1`] = `"Object.assign(Object.create(null),{hello:\\"world\\"})"`; -exports[`null-constructor > serialize > supports Symbol.iterator 1`] = `"Object.assign(Object.create(null),{[Symbol.iterator]:()=>[1,2,3].values()})"`; +exports[`null-constructor > serialize > supports Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))})))()"`; exports[`null-constructor > serialize > supports self-recursion 1`] = `"(h=>(h=Object.create(null),h.b=h.a=h,h))()"`; exports[`null-constructor > serializeAsync > supports Object.create(null) 1`] = `"Promise.resolve(Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > serializeAsync > supports Symbol.iterator 1`] = `"Promise.resolve(Object.assign(Object.create(null),{[Symbol.iterator]:()=>[1,2,3].values()}))"`; +exports[`null-constructor > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve(Object.assign(Object.create(null),{[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))}))))()"`; exports[`null-constructor > serializeAsync > supports self-recursion 1`] = `"(h=>(h=Object.assign(Object.create(null),{a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)})))()"`; exports[`null-constructor > toJSON > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`null-constructor > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`null-constructor > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; exports[`null-constructor > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; exports[`null-constructor > toJSONAsync > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`null-constructor > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`null-constructor > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; exports[`null-constructor > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/object.test.ts.snap b/packages/seroval/test/__snapshots__/object.test.ts.snap index 93974ceb..e005c9e2 100644 --- a/packages/seroval/test/__snapshots__/object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/object.test.ts.snap @@ -6,45 +6,45 @@ exports[`objects > compat#toJSON > should use manual assignment instead of Objec exports[`objects > compat#toJSON > should use manual assignment instead of Object.assign 2`] = `"({hello:\\"world\\"})"`; -exports[`objects > crossSerialize > scoped > supports Objects 1`] = `"($R=>($R[0]={hello:\\"world\\"}))($R[\\"example\\"])"`; +exports[`objects > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"})($R[\\"example\\"])"`; -exports[`objects > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>($R[0]={[Symbol.iterator]:()=>$R[1]=[1,2,3].values()}))($R[\\"example\\"])"`; +exports[`objects > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))})($R[\\"example\\"])"`; -exports[`objects > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>($R[0]={},$R[0].b=$R[0].a=$R[0],$R[0]))($R[\\"example\\"])"`; +exports[`objects > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; exports[`objects > crossSerialize > supports Objects 1`] = `"$R[0]={hello:\\"world\\"}"`; -exports[`objects > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]={[Symbol.iterator]:()=>$R[1]=[1,2,3].values()}"`; +exports[`objects > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))}"`; exports[`objects > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],$R[0])"`; -exports[`objects > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>($R[0]=Promise.resolve($R[1]={hello:\\"world\\"})))($R[\\"example\\"])"`; +exports[`objects > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>($R[0]=Promise.resolve($R[1]={[Symbol.iterator]:()=>$R[2]=[1,2,3].values()})))($R[\\"example\\"])"`; +exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]={hello:\\"world\\"})"`; -exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:()=>$R[2]=[1,2,3].values()})"`; +exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))})"`; exports[`objects > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}"`; -exports[`objects > crossSerializeStream > scoped > supports Objects 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Objects 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>(_$.Ps($R[0],$R[1]={hello:\\"world\\"})))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]={hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>(_$.Ps($R[0],$R[1]={[Symbol.iterator]:()=>$R[2]=[1,2,3].values()})))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>(_$.Ps($R[0],$R[1]={a:$R[2]=_$.P(),b:$R[3]=_$.P()})))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>_$.Ps($R[0],$R[1]={a:$R[2]=_$.P(),b:$R[3]=_$.P()}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>(_$.Ps($R[2],$R[1])))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>_$.Ps($R[2],$R[1]))($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports self-recursion 4`] = `"($R=>(_$.Ps($R[3],$R[1])))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports self-recursion 4`] = `"($R=>_$.Ps($R[3],$R[1]))($R[\\"example\\"])"`; exports[`objects > crossSerializeStream > supports Objects 1`] = `"$R[0]=_$.P()"`; @@ -52,7 +52,7 @@ exports[`objects > crossSerializeStream > supports Objects 2`] = `"_$.Ps($R[0],$ exports[`objects > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[Symbol.iterator]:()=>$R[2]=[1,2,3].values()})"`; +exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))})"`; exports[`objects > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -64,24 +64,24 @@ exports[`objects > crossSerializeStream > supports self-recursion 4`] = `"_$.Ps( exports[`objects > serialize > supports Objects 1`] = `"({hello:\\"world\\"})"`; -exports[`objects > serialize > supports Symbol.iterator 1`] = `"({[Symbol.iterator]:()=>[1,2,3].values()})"`; +exports[`objects > serialize > supports Symbol.iterator 1`] = `"(h=>({[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))}))()"`; exports[`objects > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a=h,h))()"`; exports[`objects > serializeAsync > supports Objects 1`] = `"Promise.resolve({hello:\\"world\\"})"`; -exports[`objects > serializeAsync > supports Symbol.iterator 1`] = `"Promise.resolve({[Symbol.iterator]:()=>[1,2,3].values()})"`; +exports[`objects > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve({[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))})))()"`; exports[`objects > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)}))()"`; exports[`objects > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`objects > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`objects > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; exports[`objects > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; exports[`objects > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`objects > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`objects > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; exports[`objects > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/plugin.test.ts.snap b/packages/seroval/test/__snapshots__/plugin.test.ts.snap index 9fae2401..9f940019 100644 --- a/packages/seroval/test/__snapshots__/plugin.test.ts.snap +++ b/packages/seroval/test/__snapshots__/plugin.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Plugin > crossSerialize > scoped > supports Plugin 1`] = `"($R=>(Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\")))($R[\\"example\\"])"`; +exports[`Plugin > crossSerialize > scoped > supports Plugin 1`] = `"($R=>Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\"))($R[\\"example\\"])"`; exports[`Plugin > crossSerialize > supports Plugin 1`] = `"Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\")"`; -exports[`Plugin > crossSerializeAsync > scoped > supports Plugin 1`] = `"($R=>($R[0]=Promise.resolve(Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\"))))($R[\\"example\\"])"`; +exports[`Plugin > crossSerializeAsync > scoped > supports Plugin 1`] = `"($R=>$R[0]=Promise.resolve(Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\")))($R[\\"example\\"])"`; exports[`Plugin > crossSerializeAsync > supports Plugin 1`] = `"$R[0]=Promise.resolve(Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\"))"`; -exports[`Plugin > crossSerializeStream > scoped > supports Plugin 1`] = `"($R=>($R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[Symbol.iterator]:()=>$R[1]=[72,101,108,108,111,44,32,87,111,114,108,100,33].values()})))($R[\\"example\\"])"`; +exports[`Plugin > crossSerializeStream > scoped > supports Plugin 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1}))}))($R[\\"example\\"])"`; -exports[`Plugin > crossSerializeStream > supports Plugin 1`] = `"$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[Symbol.iterator]:()=>$R[1]=[72,101,108,108,111,44,32,87,111,114,108,100,33].values()})"`; +exports[`Plugin > crossSerializeStream > supports Plugin 1`] = `"$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1}))})"`; exports[`Plugin > serialize > supports Plugin 1`] = `"Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\")"`; diff --git a/packages/seroval/test/__snapshots__/promise.test.ts.snap b/packages/seroval/test/__snapshots__/promise.test.ts.snap index d2226fa4..9d6a60dd 100644 --- a/packages/seroval/test/__snapshots__/promise.test.ts.snap +++ b/packages/seroval/test/__snapshots__/promise.test.ts.snap @@ -2,8 +2,8 @@ exports[`Promise > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Promise]\\""`; -exports[`Promise > compat > should use function expression instead of arrow functions 1`] = `"(function(h){return h={self:Promise.resolve().then(function(){return h})}})()"`; +exports[`Promise > compat > should use function expression instead of arrow functions 1`] = `"(function(h){return(h={self:Promise.resolve().then(function(){returnh})})})()"`; -exports[`Promise > compat > should use function expression instead of arrow functions 2`] = `"(function(h){return h={self:Promise.reject().catch(function(){throw h})}})()"`; +exports[`Promise > compat > should use function expression instead of arrow functions 2`] = `"(function(h){return(h={self:Promise.reject().catch(function(){throw h})})})()"`; exports[`Promise > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Promise]\\""`; diff --git a/packages/seroval/test/__snapshots__/reference.test.ts.snap b/packages/seroval/test/__snapshots__/reference.test.ts.snap index 651b2a46..4f67b7cc 100644 --- a/packages/seroval/test/__snapshots__/reference.test.ts.snap +++ b/packages/seroval/test/__snapshots__/reference.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Reference > crossSerialize > crossSerialize > supports Reference 1`] = `"($R=>($R[0]=__SEROVAL_REFS__.get(\\"example\\")))($R[\\"example\\"])"`; +exports[`Reference > crossSerialize > crossSerialize > supports Reference 1`] = `"($R=>$R[0]=__SEROVAL_REFS__.get(\\"example\\"))($R[\\"example\\"])"`; exports[`Reference > crossSerialize > supports Reference 1`] = `"$R[0]=__SEROVAL_REFS__.get(\\"example\\")"`; -exports[`Reference > crossSerializeAsync > scoped > supports Reference 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=__SEROVAL_REFS__.get(\\"example\\"))))($R[\\"example\\"])"`; +exports[`Reference > crossSerializeAsync > scoped > supports Reference 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=__SEROVAL_REFS__.get(\\"example\\")))($R[\\"example\\"])"`; exports[`Reference > crossSerializeAsync > supports Reference 1`] = `"$R[0]=Promise.resolve($R[1]=__SEROVAL_REFS__.get(\\"example\\"))"`; -exports[`Reference > crossSerializeStream > scoped > supports Reference 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`Reference > crossSerializeStream > scoped > supports Reference 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Reference > crossSerializeStream > scoped > supports Reference 2`] = `"($R=>(_$.Ps($R[0],$R[1]=__SEROVAL_REFS__.get(\\"example\\"))))($R[\\"example\\"])"`; +exports[`Reference > crossSerializeStream > scoped > supports Reference 2`] = `"($R=>_$.Ps($R[0],$R[1]=__SEROVAL_REFS__.get(\\"example\\")))($R[\\"example\\"])"`; exports[`Reference > crossSerializeStream > supports Reference 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/__snapshots__/regexp.test.ts.snap b/packages/seroval/test/__snapshots__/regexp.test.ts.snap index 85ca4758..7b483994 100644 --- a/packages/seroval/test/__snapshots__/regexp.test.ts.snap +++ b/packages/seroval/test/__snapshots__/regexp.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`RegExp > crossSerialize > scoped > supports RegExp 1`] = `"($R=>($R[0]=/[a-z0-9]+/i))($R[\\"example\\"])"`; +exports[`RegExp > crossSerialize > scoped > supports RegExp 1`] = `"($R=>$R[0]=/[a-z0-9]+/i)($R[\\"example\\"])"`; exports[`RegExp > crossSerialize > supports RegExp 1`] = `"$R[0]=/[a-z0-9]+/i"`; -exports[`RegExp > crossSerializeAsync > scoped > supports RegExp 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=/[a-z0-9]+/i)))($R[\\"example\\"])"`; +exports[`RegExp > crossSerializeAsync > scoped > supports RegExp 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=/[a-z0-9]+/i))($R[\\"example\\"])"`; exports[`RegExp > crossSerializeAsync > supports RegExp 1`] = `"$R[0]=Promise.resolve($R[1]=/[a-z0-9]+/i)"`; -exports[`RegExp > crossSerializeStream > scoped > supports RegExp 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`RegExp > crossSerializeStream > scoped > supports RegExp 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`RegExp > crossSerializeStream > scoped > supports RegExp 2`] = `"($R=>(_$.Ps($R[0],$R[1]=/[a-z0-9]+/i)))($R[\\"example\\"])"`; +exports[`RegExp > crossSerializeStream > scoped > supports RegExp 2`] = `"($R=>_$.Ps($R[0],$R[1]=/[a-z0-9]+/i))($R[\\"example\\"])"`; exports[`RegExp > crossSerializeStream > supports RegExp 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap index f2aaceab..6be0bcdd 100644 --- a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap @@ -1,44 +1,44 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`sealed object > crossSerialize > scoped > supports Objects 1`] = `"($R=>($R[0]={hello:\\"world\\"},Object.seal($R[0]),$R[0]))($R[\\"example\\"])"`; +exports[`sealed object > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>($R[0]={[Symbol.iterator]:()=>$R[1]=[1,2,3].values()},Object.seal($R[0]),$R[0]))($R[\\"example\\"])"`; +exports[`sealed object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>($R[0]={},$R[0].b=$R[0].a=$R[0],Object.seal($R[0]),$R[0]))($R[\\"example\\"])"`; +exports[`sealed object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.seal($R[0]),$R[0])"`; -exports[`sealed object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[Symbol.iterator]:()=>$R[1]=[1,2,3].values()},Object.seal($R[0]),$R[0])"`; +exports[`sealed object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))},Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],Object.seal($R[0]),$R[0])"`; -exports[`sealed object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0]))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>($R[0]=Promise.resolve($R[1]={[Symbol.iterator]:()=>$R[2]=[1,2,3].values()}),Object.seal($R[1]),$R[0]))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0]))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])"`; -exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[Symbol.iterator]:()=>$R[2]=[1,2,3].values()}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.seal($R[1]),$R[0])"`; exports[`sealed object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Objects 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Objects 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>(_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0]))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>(_$.Ps($R[0],$R[1]={[Symbol.iterator]:()=>$R[2]=[1,2,3].values()}),Object.seal($R[1]),$R[0]))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>(_$.Ps($R[0],$R[1]={a:$R[2]=_$.P(),b:$R[3]=_$.P()}),Object.seal($R[1]),$R[0]))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>_$.Ps($R[0],$R[1]={a:$R[2]=_$.P(),b:$R[3]=_$.P()}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>(_$.Ps($R[2],$R[1])))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>_$.Ps($R[2],$R[1]))($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 4`] = `"($R=>(_$.Ps($R[3],$R[1])))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 4`] = `"($R=>_$.Ps($R[3],$R[1]))($R[\\"example\\"])"`; exports[`sealed object > crossSerializeStream > supports Objects 1`] = `"$R[0]=_$.P()"`; @@ -46,7 +46,7 @@ exports[`sealed object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps( exports[`sealed object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[Symbol.iterator]:()=>$R[2]=[1,2,3].values()}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.seal($R[1]),$R[0])"`; exports[`sealed object > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -58,24 +58,24 @@ exports[`sealed object > crossSerializeStream > supports self-recursion 4`] = `" exports[`sealed object > serialize > supports Objects 1`] = `"(h=>(h={hello:\\"world\\"},Object.seal(h),h))()"`; -exports[`sealed object > serialize > supports Symbol.iterator 1`] = `"(h=>(h={[Symbol.iterator]:()=>[1,2,3].values()},Object.seal(h),h))()"`; +exports[`sealed object > serialize > supports Symbol.iterator 1`] = `"((h,j)=>(h={[Symbol.iterator]:(j=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))},Object.seal(h),h))()"`; exports[`sealed object > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a=h,Object.seal(h),h))()"`; exports[`sealed object > serializeAsync > supports Objects 1`] = `"((h,j)=>(j=Promise.resolve(h={hello:\\"world\\"}),Object.seal(h),j))()"`; -exports[`sealed object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j)=>(j=Promise.resolve(h={[Symbol.iterator]:()=>[1,2,3].values()}),Object.seal(h),j))()"`; +exports[`sealed object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[Symbol.iterator]:(j=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))}),Object.seal(h),k))()"`; exports[`sealed object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.seal(h),h))()"`; exports[`sealed object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2},\\"f\\":16383,\\"m\\":[]}"`; -exports[`sealed object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}],\\"s\\":1},\\"o\\":2},\\"f\\":16383,\\"m\\":[]}"`; +exports[`sealed object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":2},\\"f\\":16383,\\"m\\":[]}"`; exports[`sealed object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":2},\\"f\\":16383,\\"m\\":[0]}"`; exports[`sealed object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`sealed object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}],\\"s\\":1},\\"o\\":2}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`sealed object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":2}},\\"f\\":16383,\\"m\\":[]}"`; exports[`sealed object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":2},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/set.test.ts.snap b/packages/seroval/test/__snapshots__/set.test.ts.snap index 029e1dfe..db3b7894 100644 --- a/packages/seroval/test/__snapshots__/set.test.ts.snap +++ b/packages/seroval/test/__snapshots__/set.test.ts.snap @@ -1,36 +1,36 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Set > compat > should fallback to Symbol.iterator 1`] = `"Object.assign(Object.create(null),{[Symbol.iterator]:()=>[1,2,3].values()})"`; +exports[`Set > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))})))()"`; exports[`Set > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; -exports[`Set > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":15871,\\"m\\":[]}"`; +exports[`Set > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":15871,\\"m\\":[]}"`; exports[`Set > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; -exports[`Set > crossSerialize > scoped > supports Set 1`] = `"($R=>($R[0]=new Set([1,2,3])))($R[\\"example\\"])"`; +exports[`Set > crossSerialize > scoped > supports Set 1`] = `"($R=>$R[0]=new Set([1,2,3]))($R[\\"example\\"])"`; -exports[`Set > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>($R[0]=new Set,$R[0].add($R[0]),$R[0]))($R[\\"example\\"])"`; +exports[`Set > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]=new Set,$R[0].add($R[0]),$R[0])($R[\\"example\\"])"`; exports[`Set > crossSerialize > supports Set 1`] = `"$R[0]=new Set([1,2,3])"`; exports[`Set > crossSerialize > supports self-recursion 1`] = `"($R[0]=new Set,$R[0].add($R[0]),$R[0])"`; -exports[`Set > crossSerializeAsync > scoped > supports Set 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=new Set([1,2,3]))))($R[\\"example\\"])"`; +exports[`Set > crossSerializeAsync > scoped > supports Set 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new Set([1,2,3])))($R[\\"example\\"])"`; -exports[`Set > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>($R[0]=new Set([$R[1]=Promise.resolve().then(()=>$R[0])])))($R[\\"example\\"])"`; +exports[`Set > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]=new Set([$R[1]=Promise.resolve().then(()=>$R[0])]))($R[\\"example\\"])"`; exports[`Set > crossSerializeAsync > supports Set 1`] = `"$R[0]=Promise.resolve($R[1]=new Set([1,2,3]))"`; exports[`Set > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]=new Set([$R[1]=Promise.resolve().then(()=>$R[0])])"`; -exports[`Set > crossSerializeStream > scoped > supports Set 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`Set > crossSerializeStream > scoped > supports Set 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Set > crossSerializeStream > scoped > supports Set 2`] = `"($R=>(_$.Ps($R[0],$R[1]=new Set([1,2,3]))))($R[\\"example\\"])"`; +exports[`Set > crossSerializeStream > scoped > supports Set 2`] = `"($R=>_$.Ps($R[0],$R[1]=new Set([1,2,3])))($R[\\"example\\"])"`; -exports[`Set > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>($R[0]=new Set([$R[1]=_$.P()])))($R[\\"example\\"])"`; +exports[`Set > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=new Set([$R[1]=_$.P()]))($R[\\"example\\"])"`; -exports[`Set > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>(_$.Ps($R[1],$R[0])))($R[\\"example\\"])"`; +exports[`Set > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>_$.Ps($R[1],$R[0]))($R[\\"example\\"])"`; exports[`Set > crossSerializeStream > supports Set 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap b/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap index 0ef23626..e121d37c 100644 --- a/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap +++ b/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`sparse arrays > crossSerialize > scoped > supports sparse arrays 1`] = `"($R=>($R[0]=[,,,,,,,,,,]))($R[\\"example\\"])"`; +exports[`sparse arrays > crossSerialize > scoped > supports sparse arrays 1`] = `"($R=>$R[0]=[,,,,,,,,,,])($R[\\"example\\"])"`; exports[`sparse arrays > crossSerialize > supports sparse arrays 1`] = `"$R[0]=[,,,,,,,,,,]"`; -exports[`sparse arrays > crossSerializeAsync > scoped > supports sparse arrays 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=[,,,,,,,,,,])))($R[\\"example\\"])"`; +exports[`sparse arrays > crossSerializeAsync > scoped > supports sparse arrays 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=[,,,,,,,,,,]))($R[\\"example\\"])"`; exports[`sparse arrays > crossSerializeAsync > supports sparse arrays 1`] = `"$R[0]=Promise.resolve($R[1]=[,,,,,,,,,,])"`; -exports[`sparse arrays > crossSerializeStream > scoped > supports sparse arrays 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`sparse arrays > crossSerializeStream > scoped > supports sparse arrays 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`sparse arrays > crossSerializeStream > scoped > supports sparse arrays 2`] = `"($R=>(_$.Ps($R[0],$R[1]=[,,,,,,,,,,])))($R[\\"example\\"])"`; +exports[`sparse arrays > crossSerializeStream > scoped > supports sparse arrays 2`] = `"($R=>_$.Ps($R[0],$R[1]=[,,,,,,,,,,]))($R[\\"example\\"])"`; exports[`sparse arrays > crossSerializeStream > supports sparse arrays 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/__snapshots__/typed-array.test.ts.snap b/packages/seroval/test/__snapshots__/typed-array.test.ts.snap index 316a1200..766504ba 100644 --- a/packages/seroval/test/__snapshots__/typed-array.test.ts.snap +++ b/packages/seroval/test/__snapshots__/typed-array.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`typed arrays > crossSerialize > scoped > supports typed arrays 1`] = `"($R=>($R[0]=new Uint32Array($R[1]=new Uint8Array([255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]).buffer,0,4)))($R[\\"example\\"])"`; +exports[`typed arrays > crossSerialize > scoped > supports typed arrays 1`] = `"($R=>$R[0]=new Uint32Array($R[1]=new Uint8Array([255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]).buffer,0,4))($R[\\"example\\"])"`; exports[`typed arrays > crossSerialize > supports typed arrays 1`] = `"$R[0]=new Uint32Array($R[1]=new Uint8Array([255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]).buffer,0,4)"`; -exports[`typed arrays > crossSerializeAsync > scoped > supports typed arrays 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=new Uint32Array($R[2]=new Uint8Array([255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]).buffer,0,4))))($R[\\"example\\"])"`; +exports[`typed arrays > crossSerializeAsync > scoped > supports typed arrays 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new Uint32Array($R[2]=new Uint8Array([255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]).buffer,0,4)))($R[\\"example\\"])"`; exports[`typed arrays > crossSerializeAsync > supports typed arrays 1`] = `"$R[0]=Promise.resolve($R[1]=new Uint32Array($R[2]=new Uint8Array([255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]).buffer,0,4))"`; -exports[`typed arrays > crossSerializeStream > scoped > supports typed arrays 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`typed arrays > crossSerializeStream > scoped > supports typed arrays 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`typed arrays > crossSerializeStream > scoped > supports typed arrays 2`] = `"($R=>(_$.Ps($R[0],$R[1]=new Uint32Array($R[2]=new Uint8Array([255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]).buffer,0,4))))($R[\\"example\\"])"`; +exports[`typed arrays > crossSerializeStream > scoped > supports typed arrays 2`] = `"($R=>_$.Ps($R[0],$R[1]=new Uint32Array($R[2]=new Uint8Array([255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]).buffer,0,4)))($R[\\"example\\"])"`; exports[`typed arrays > crossSerializeStream > supports typed arrays 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap b/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap index 6ab822b9..19a147d1 100644 --- a/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap +++ b/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap @@ -1,30 +1,30 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 1`] = `"($R=>($R[0]=Symbol.asyncIterator))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 1`] = `"($R=>$R[0]=Symbol.asyncIterator)($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 2`] = `"($R=>($R[0]=Symbol.hasInstance))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 2`] = `"($R=>$R[0]=Symbol.hasInstance)($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 3`] = `"($R=>($R[0]=Symbol.isConcatSpreadable))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 3`] = `"($R=>$R[0]=Symbol.isConcatSpreadable)($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 4`] = `"($R=>($R[0]=Symbol.iterator))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 4`] = `"($R=>$R[0]=Symbol.iterator)($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 5`] = `"($R=>($R[0]=Symbol.match))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 5`] = `"($R=>$R[0]=Symbol.match)($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 6`] = `"($R=>($R[0]=Symbol.matchAll))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 6`] = `"($R=>$R[0]=Symbol.matchAll)($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 7`] = `"($R=>($R[0]=Symbol.replace))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 7`] = `"($R=>$R[0]=Symbol.replace)($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 8`] = `"($R=>($R[0]=Symbol.search))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 8`] = `"($R=>$R[0]=Symbol.search)($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 9`] = `"($R=>($R[0]=Symbol.species))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 9`] = `"($R=>$R[0]=Symbol.species)($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 10`] = `"($R=>($R[0]=Symbol.split))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 10`] = `"($R=>$R[0]=Symbol.split)($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 11`] = `"($R=>($R[0]=Symbol.toPrimitive))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 11`] = `"($R=>$R[0]=Symbol.toPrimitive)($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 12`] = `"($R=>($R[0]=Symbol.toStringTag))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 12`] = `"($R=>$R[0]=Symbol.toStringTag)($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 13`] = `"($R=>($R[0]=Symbol.unscopables))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerialize > scoped > supports well-known symbols 13`] = `"($R=>$R[0]=Symbol.unscopables)($R[\\"example\\"])"`; exports[`well-known symbols > crossSerialize > supports well-known symbols 1`] = `"$R[0]=Symbol.asyncIterator"`; @@ -52,31 +52,31 @@ exports[`well-known symbols > crossSerialize > supports well-known symbols 12`] exports[`well-known symbols > crossSerialize > supports well-known symbols 13`] = `"$R[0]=Symbol.unscopables"`; -exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=Symbol.asyncIterator)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Symbol.asyncIterator))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 2`] = `"($R=>($R[0]=Promise.resolve($R[1]=Symbol.hasInstance)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 2`] = `"($R=>$R[0]=Promise.resolve($R[1]=Symbol.hasInstance))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 3`] = `"($R=>($R[0]=Promise.resolve($R[1]=Symbol.isConcatSpreadable)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 3`] = `"($R=>$R[0]=Promise.resolve($R[1]=Symbol.isConcatSpreadable))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 4`] = `"($R=>($R[0]=Promise.resolve($R[1]=Symbol.iterator)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 4`] = `"($R=>$R[0]=Promise.resolve($R[1]=Symbol.iterator))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 5`] = `"($R=>($R[0]=Promise.resolve($R[1]=Symbol.match)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 5`] = `"($R=>$R[0]=Promise.resolve($R[1]=Symbol.match))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 6`] = `"($R=>($R[0]=Promise.resolve($R[1]=Symbol.matchAll)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 6`] = `"($R=>$R[0]=Promise.resolve($R[1]=Symbol.matchAll))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 7`] = `"($R=>($R[0]=Promise.resolve($R[1]=Symbol.replace)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 7`] = `"($R=>$R[0]=Promise.resolve($R[1]=Symbol.replace))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 8`] = `"($R=>($R[0]=Promise.resolve($R[1]=Symbol.search)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 8`] = `"($R=>$R[0]=Promise.resolve($R[1]=Symbol.search))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 9`] = `"($R=>($R[0]=Promise.resolve($R[1]=Symbol.species)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 9`] = `"($R=>$R[0]=Promise.resolve($R[1]=Symbol.species))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 10`] = `"($R=>($R[0]=Promise.resolve($R[1]=Symbol.split)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 10`] = `"($R=>$R[0]=Promise.resolve($R[1]=Symbol.split))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 11`] = `"($R=>($R[0]=Promise.resolve($R[1]=Symbol.toPrimitive)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 11`] = `"($R=>$R[0]=Promise.resolve($R[1]=Symbol.toPrimitive))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 12`] = `"($R=>($R[0]=Promise.resolve($R[1]=Symbol.toStringTag)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 12`] = `"($R=>$R[0]=Promise.resolve($R[1]=Symbol.toStringTag))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 13`] = `"($R=>($R[0]=Promise.resolve($R[1]=Symbol.unscopables)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeAsync > scoped > supports well-known symbols 13`] = `"($R=>$R[0]=Promise.resolve($R[1]=Symbol.unscopables))($R[\\"example\\"])"`; exports[`well-known symbols > crossSerializeAsync > supports well-known symbols 1`] = `"$R[0]=Promise.resolve($R[1]=Symbol.asyncIterator)"`; @@ -104,57 +104,57 @@ exports[`well-known symbols > crossSerializeAsync > supports well-known symbols exports[`well-known symbols > crossSerializeAsync > supports well-known symbols 13`] = `"$R[0]=Promise.resolve($R[1]=Symbol.unscopables)"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Symbol.asyncIterator)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Symbol.asyncIterator))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.hasInstance 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.hasInstance 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.hasInstance 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Symbol.hasInstance)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.hasInstance 2`] = `"($R=>_$.Ps($R[0],$R[1]=Symbol.hasInstance))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.isConcatSpreadable 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.isConcatSpreadable 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.isConcatSpreadable 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Symbol.isConcatSpreadable)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.isConcatSpreadable 2`] = `"($R=>_$.Ps($R[0],$R[1]=Symbol.isConcatSpreadable))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Symbol.iterator)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Symbol.iterator))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.match 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.match 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.match 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Symbol.match)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.match 2`] = `"($R=>_$.Ps($R[0],$R[1]=Symbol.match))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.matchAll 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.matchAll 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.matchAll 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Symbol.matchAll)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.matchAll 2`] = `"($R=>_$.Ps($R[0],$R[1]=Symbol.matchAll))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.replace 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.replace 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.replace 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Symbol.replace)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.replace 2`] = `"($R=>_$.Ps($R[0],$R[1]=Symbol.replace))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.search 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.search 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.search 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Symbol.search)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.search 2`] = `"($R=>_$.Ps($R[0],$R[1]=Symbol.search))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.species 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.species 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.species 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Symbol.species)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.species 2`] = `"($R=>_$.Ps($R[0],$R[1]=Symbol.species))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.split 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.split 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.split 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Symbol.split)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.split 2`] = `"($R=>_$.Ps($R[0],$R[1]=Symbol.split))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.toPrimitive 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.toPrimitive 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.toPrimitive 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Symbol.toPrimitive)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.toPrimitive 2`] = `"($R=>_$.Ps($R[0],$R[1]=Symbol.toPrimitive))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.toStringTag 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.toStringTag 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.toStringTag 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Symbol.toStringTag)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.toStringTag 2`] = `"($R=>_$.Ps($R[0],$R[1]=Symbol.toStringTag))($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.unscopables 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.unscopables 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.unscopables 2`] = `"($R=>(_$.Ps($R[0],$R[1]=Symbol.unscopables)))($R[\\"example\\"])"`; +exports[`well-known symbols > crossSerializeStream > scoped > supports Symbol.unscopables 2`] = `"($R=>_$.Ps($R[0],$R[1]=Symbol.unscopables))($R[\\"example\\"])"`; exports[`well-known symbols > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap index 16f04e2a..53debf42 100644 --- a/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap @@ -1,6 +1,6 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Blob > crossSerializeAsync > scoped > supports Blob 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=new Blob([$R[2]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],{type:\\"text/plain\\"}))))($R[\\"example\\"])"`; +exports[`Blob > crossSerializeAsync > scoped > supports Blob 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new Blob([$R[2]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],{type:\\"text/plain\\"})))($R[\\"example\\"])"`; exports[`Blob > crossSerializeAsync > supports Blob 1`] = `"$R[0]=Promise.resolve($R[1]=new Blob([$R[2]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],{type:\\"text/plain\\"}))"`; diff --git a/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap index d489c954..d8ea0bd6 100644 --- a/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`CustomEvent > crossSerialize > scoped > supports CustomEvent 1`] = `"($R=>($R[0]=new CustomEvent(\\"example\\",$R[1]={detail:$R[2]={},bubbles:!1,cancelable:!1,composed:!1}),$R[2].self=$R[2],$R[0]))($R[\\"example\\"])"`; +exports[`CustomEvent > crossSerialize > scoped > supports CustomEvent 1`] = `"($R=>$R[0]=new CustomEvent(\\"example\\",$R[1]={detail:$R[2]={},bubbles:!1,cancelable:!1,composed:!1}),$R[2].self=$R[2],$R[0])($R[\\"example\\"])"`; exports[`CustomEvent > crossSerialize > supports CustomEvent 1`] = `"($R[0]=new CustomEvent(\\"example\\",$R[1]={detail:$R[2]={},bubbles:!1,cancelable:!1,composed:!1}),$R[2].self=$R[2],$R[0])"`; -exports[`CustomEvent > crossSerializeAsync > scoped > supports CustomEvent 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=new CustomEvent(\\"example\\",$R[2]={detail:$R[3]={},bubbles:!1,cancelable:!1,composed:!1})),$R[3].self=$R[3],$R[0]))($R[\\"example\\"])"`; +exports[`CustomEvent > crossSerializeAsync > scoped > supports CustomEvent 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new CustomEvent(\\"example\\",$R[2]={detail:$R[3]={},bubbles:!1,cancelable:!1,composed:!1})),$R[3].self=$R[3],$R[0])($R[\\"example\\"])"`; exports[`CustomEvent > crossSerializeAsync > supports CustomEvent 1`] = `"($R[0]=Promise.resolve($R[1]=new CustomEvent(\\"example\\",$R[2]={detail:$R[3]={},bubbles:!1,cancelable:!1,composed:!1})),$R[3].self=$R[3],$R[0])"`; -exports[`CustomEvent > crossSerializeStream > scoped > supports CustomEvent 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`CustomEvent > crossSerializeStream > scoped > supports CustomEvent 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`CustomEvent > crossSerializeStream > scoped > supports CustomEvent 2`] = `"($R=>(_$.Ps($R[0],$R[1]=new CustomEvent(\\"example\\",$R[2]={detail:$R[3]={},bubbles:!1,cancelable:!1,composed:!1})),$R[3].self=$R[3],$R[0]))($R[\\"example\\"])"`; +exports[`CustomEvent > crossSerializeStream > scoped > supports CustomEvent 2`] = `"($R=>_$.Ps($R[0],$R[1]=new CustomEvent(\\"example\\",$R[2]={detail:$R[3]={},bubbles:!1,cancelable:!1,composed:!1})),$R[3].self=$R[3],$R[0])($R[\\"example\\"])"`; exports[`CustomEvent > crossSerializeStream > supports CustomEvent 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap index 47e43503..7ef3b042 100644 --- a/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`DOMException > crossSerialize > scoped > supports DOMException 1`] = `"($R=>($R[0]=new DOMException(\\"This is an example message.\\",\\"Example\\")))($R[\\"example\\"])"`; +exports[`DOMException > crossSerialize > scoped > supports DOMException 1`] = `"($R=>$R[0]=new DOMException(\\"This is an example message.\\",\\"Example\\"))($R[\\"example\\"])"`; exports[`DOMException > crossSerialize > supports DOMException 1`] = `"$R[0]=new DOMException(\\"This is an example message.\\",\\"Example\\")"`; -exports[`DOMException > crossSerializeAsync > scoped > supports DOMException 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=new DOMException(\\"This is an example message.\\",\\"Example\\"))))($R[\\"example\\"])"`; +exports[`DOMException > crossSerializeAsync > scoped > supports DOMException 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new DOMException(\\"This is an example message.\\",\\"Example\\")))($R[\\"example\\"])"`; exports[`DOMException > crossSerializeAsync > supports DOMException 1`] = `"$R[0]=Promise.resolve($R[1]=new DOMException(\\"This is an example message.\\",\\"Example\\"))"`; -exports[`DOMException > crossSerializeStream > scoped > supports DOMException 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`DOMException > crossSerializeStream > scoped > supports DOMException 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`DOMException > crossSerializeStream > scoped > supports DOMException 2`] = `"($R=>(_$.Ps($R[0],$R[1]=new DOMException(\\"This is an example message.\\",\\"Example\\"))))($R[\\"example\\"])"`; +exports[`DOMException > crossSerializeStream > scoped > supports DOMException 2`] = `"($R=>_$.Ps($R[0],$R[1]=new DOMException(\\"This is an example message.\\",\\"Example\\")))($R[\\"example\\"])"`; exports[`DOMException > crossSerializeStream > supports DOMException 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap index 1aae1165..b30424f2 100644 --- a/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Event > crossSerialize > scoped > supports Event 1`] = `"($R=>($R[0]=new Event(\\"example\\",$R[1]={bubbles:!1,cancelable:!1,composed:!1})))($R[\\"example\\"])"`; +exports[`Event > crossSerialize > scoped > supports Event 1`] = `"($R=>$R[0]=new Event(\\"example\\",$R[1]={bubbles:!1,cancelable:!1,composed:!1}))($R[\\"example\\"])"`; exports[`Event > crossSerialize > supports Event 1`] = `"$R[0]=new Event(\\"example\\",$R[1]={bubbles:!1,cancelable:!1,composed:!1})"`; -exports[`Event > crossSerializeAsync > scoped > supports Event 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=new Event(\\"example\\",$R[2]={bubbles:!1,cancelable:!1,composed:!1}))))($R[\\"example\\"])"`; +exports[`Event > crossSerializeAsync > scoped > supports Event 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new Event(\\"example\\",$R[2]={bubbles:!1,cancelable:!1,composed:!1})))($R[\\"example\\"])"`; exports[`Event > crossSerializeAsync > supports Event 1`] = `"$R[0]=Promise.resolve($R[1]=new Event(\\"example\\",$R[2]={bubbles:!1,cancelable:!1,composed:!1}))"`; -exports[`Event > crossSerializeStream > scoped > supports Event 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`Event > crossSerializeStream > scoped > supports Event 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Event > crossSerializeStream > scoped > supports Event 2`] = `"($R=>(_$.Ps($R[0],$R[1]=new Event(\\"example\\",$R[2]={bubbles:!1,cancelable:!1,composed:!1}))))($R[\\"example\\"])"`; +exports[`Event > crossSerializeStream > scoped > supports Event 2`] = `"($R=>_$.Ps($R[0],$R[1]=new Event(\\"example\\",$R[2]={bubbles:!1,cancelable:!1,composed:!1})))($R[\\"example\\"])"`; exports[`Event > crossSerializeStream > supports Event 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap index 5ae680d8..cddf69a6 100644 --- a/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap @@ -1,6 +1,6 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`File > crossSerializeAsync > scoped > supports File 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=new File([$R[2]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680}))))($R[\\"example\\"])"`; +exports[`File > crossSerializeAsync > scoped > supports File 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new File([$R[2]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})))($R[\\"example\\"])"`; exports[`File > crossSerializeAsync > supports File 1`] = `"$R[0]=Promise.resolve($R[1]=new File([$R[2]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680}))"`; diff --git a/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap index e5a2f210..13036c83 100644 --- a/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`FormData > crossSerialize > scoped > supports FormData 1`] = `"($R=>(($R[0]=new FormData(),$R[0].append(\\"hello\\",\\"world\\"),$R[0].append(\\"foo\\",\\"bar\\"),$R[0])))($R[\\"example\\"])"`; +exports[`FormData > crossSerialize > scoped > supports FormData 1`] = `"($R=>($R[0]=new FormData(),$R[0].append(\\"hello\\",\\"world\\"),$R[0].append(\\"foo\\",\\"bar\\"),$R[0]))($R[\\"example\\"])"`; exports[`FormData > crossSerialize > supports FormData 1`] = `"($R[0]=new FormData(),$R[0].append(\\"hello\\",\\"world\\"),$R[0].append(\\"foo\\",\\"bar\\"),$R[0])"`; -exports[`FormData > crossSerializeAsync > scoped > supports FormData 1`] = `"($R=>($R[0]=Promise.resolve(($R[1]=new FormData(),$R[1].append(\\"hello-world\\",$R[2]=new File([$R[3]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),$R[1].append(\\"foo-bar\\",$R[4]=new File([$R[5]=new Uint8Array([70,111,111,32,66,97,114]).buffer],\\"foo-bar.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),$R[1]))))($R[\\"example\\"])"`; +exports[`FormData > crossSerializeAsync > scoped > supports FormData 1`] = `"($R=>$R[0]=Promise.resolve(($R[1]=new FormData(),$R[1].append(\\"hello-world\\",$R[2]=new File([$R[3]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),$R[1].append(\\"foo-bar\\",$R[4]=new File([$R[5]=new Uint8Array([70,111,111,32,66,97,114]).buffer],\\"foo-bar.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),$R[1])))($R[\\"example\\"])"`; exports[`FormData > crossSerializeAsync > supports FormData 1`] = `"$R[0]=Promise.resolve(($R[1]=new FormData(),$R[1].append(\\"hello-world\\",$R[2]=new File([$R[3]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),$R[1].append(\\"foo-bar\\",$R[4]=new File([$R[5]=new Uint8Array([70,111,111,32,66,97,114]).buffer],\\"foo-bar.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),$R[1]))"`; -exports[`FormData > crossSerializeStream > scoped > supports FormData 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`FormData > crossSerializeStream > scoped > supports FormData 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`FormData > crossSerializeStream > scoped > supports FormData 2`] = `"($R=>(_$.Ps($R[0],($R[1]=new FormData(),$R[1].append(\\"hello\\",\\"world\\"),$R[1].append(\\"foo\\",\\"bar\\"),$R[1]))))($R[\\"example\\"])"`; +exports[`FormData > crossSerializeStream > scoped > supports FormData 2`] = `"($R=>_$.Ps($R[0],($R[1]=new FormData(),$R[1].append(\\"hello\\",\\"world\\"),$R[1].append(\\"foo\\",\\"bar\\"),$R[1])))($R[\\"example\\"])"`; exports[`FormData > crossSerializeStream > supports FormData 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap index 4ae1ed7d..37a43a5a 100644 --- a/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Headers > crossSerialize > scoped > supports Headers 1`] = `"($R=>($R[0]=new Headers({\\"content-encoding\\":\\"gzip\\",\\"content-type\\":\\"text/plain\\"})))($R[\\"example\\"])"`; +exports[`Headers > crossSerialize > scoped > supports Headers 1`] = `"($R=>$R[0]=new Headers({\\"content-encoding\\":\\"gzip\\",\\"content-type\\":\\"text/plain\\"}))($R[\\"example\\"])"`; exports[`Headers > crossSerialize > supports Headers 1`] = `"$R[0]=new Headers({\\"content-encoding\\":\\"gzip\\",\\"content-type\\":\\"text/plain\\"})"`; -exports[`Headers > crossSerializeAsync > scoped > supports Headers 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=new Headers({\\"content-encoding\\":\\"gzip\\",\\"content-type\\":\\"text/plain\\"}))))($R[\\"example\\"])"`; +exports[`Headers > crossSerializeAsync > scoped > supports Headers 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new Headers({\\"content-encoding\\":\\"gzip\\",\\"content-type\\":\\"text/plain\\"})))($R[\\"example\\"])"`; exports[`Headers > crossSerializeAsync > supports Headers 1`] = `"$R[0]=Promise.resolve($R[1]=new Headers({\\"content-encoding\\":\\"gzip\\",\\"content-type\\":\\"text/plain\\"}))"`; -exports[`Headers > crossSerializeStream > scoped > supports Headers 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`Headers > crossSerializeStream > scoped > supports Headers 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Headers > crossSerializeStream > scoped > supports Headers 2`] = `"($R=>(_$.Ps($R[0],$R[1]=new Headers({\\"content-encoding\\":\\"gzip\\",\\"content-type\\":\\"text/plain\\"}))))($R[\\"example\\"])"`; +exports[`Headers > crossSerializeStream > scoped > supports Headers 2`] = `"($R=>_$.Ps($R[0],$R[1]=new Headers({\\"content-encoding\\":\\"gzip\\",\\"content-type\\":\\"text/plain\\"})))($R[\\"example\\"])"`; exports[`Headers > crossSerializeStream > supports Headers 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap index 19f2f6af..989cdcea 100644 --- a/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap @@ -1,18 +1,18 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 1`] = `"($R=>($R[0]=_$.S()))($R[\\"example\\"])"`; +exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 1`] = `"($R=>$R[0]=_$.S())($R[\\"example\\"])"`; -exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 2`] = `"($R=>(_$.Se($R[0],0,\\"foo\\")))($R[\\"example\\"])"`; +exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 2`] = `"($R=>_$.Se($R[0],0,\\"foo\\"))($R[\\"example\\"])"`; -exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 3`] = `"($R=>(_$.Se($R[0],0,\\"bar\\")))($R[\\"example\\"])"`; +exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 3`] = `"($R=>_$.Se($R[0],0,\\"bar\\"))($R[\\"example\\"])"`; -exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 4`] = `"($R=>(_$.Se($R[0],0,\\"baz\\")))($R[\\"example\\"])"`; +exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 4`] = `"($R=>_$.Se($R[0],0,\\"baz\\"))($R[\\"example\\"])"`; -exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 5`] = `"($R=>(_$.Se($R[0],2)))($R[\\"example\\"])"`; +exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 5`] = `"($R=>_$.Se($R[0],2))($R[\\"example\\"])"`; -exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream errors 1`] = `"($R=>($R[0]=_$.S()))($R[\\"example\\"])"`; +exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream errors 1`] = `"($R=>$R[0]=_$.S())($R[\\"example\\"])"`; -exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream errors 2`] = `"($R=>(_$.Se($R[0],1,$R[1]=Object.assign(new Error(\\"Oops!\\"),{stack:\\"\\"}))))($R[\\"example\\"])"`; +exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream errors 2`] = `"($R=>_$.Se($R[0],1,$R[1]=Object.assign(new Error(\\"Oops!\\"),{stack:\\"\\"})))($R[\\"example\\"])"`; exports[`ReadableStream > crossSerializeStream > supports ReadableStream 1`] = `"$R[0]=_$.S()"`; diff --git a/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap index 24b84c66..d12a3ad0 100644 --- a/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap @@ -1,14 +1,14 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Request > crossSerializeAsync > scoped > supports Blob 1`] = `"($R=>($R[0]=new Request(\\"http://localhost:3000/\\",$R[1]={body:$R[2]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,cache:\\"default\\",credentials:\\"same-origin\\",headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),integrity:\\"\\",keepalive:!1,method:\\"POST\\",mode:\\"cors\\",redirect:\\"follow\\",referrer:\\"about:client\\",referrerPolicy:\\"\\"})))($R[\\"example\\"])"`; +exports[`Request > crossSerializeAsync > scoped > supports Blob 1`] = `"($R=>$R[0]=new Request(\\"http://localhost:3000/\\",$R[1]={body:$R[2]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,cache:\\"default\\",credentials:\\"same-origin\\",headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),integrity:\\"\\",keepalive:!1,method:\\"POST\\",mode:\\"cors\\",redirect:\\"follow\\",referrer:\\"about:client\\",referrerPolicy:\\"\\"}))($R[\\"example\\"])"`; exports[`Request > crossSerializeAsync > supports Blob 1`] = `"$R[0]=new Request(\\"http://localhost:3000/\\",$R[1]={body:$R[2]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,cache:\\"default\\",credentials:\\"same-origin\\",headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),integrity:\\"\\",keepalive:!1,method:\\"POST\\",mode:\\"cors\\",redirect:\\"follow\\",referrer:\\"about:client\\",referrerPolicy:\\"\\"})"`; -exports[`Request > crossSerializeStream > scoped > supports Request 1`] = `"($R=>($R[0]=new Request(\\"http://localhost:3000/\\",$R[1]={body:$R[2]=_$.S(),cache:\\"default\\",credentials:\\"same-origin\\",headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),integrity:\\"\\",keepalive:!1,method:\\"POST\\",mode:\\"cors\\",redirect:\\"follow\\",referrer:\\"about:client\\",referrerPolicy:\\"\\"})))($R[\\"example\\"])"`; +exports[`Request > crossSerializeStream > scoped > supports Request 1`] = `"($R=>$R[0]=new Request(\\"http://localhost:3000/\\",$R[1]={body:$R[2]=_$.S(),cache:\\"default\\",credentials:\\"same-origin\\",headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),integrity:\\"\\",keepalive:!1,method:\\"POST\\",mode:\\"cors\\",redirect:\\"follow\\",referrer:\\"about:client\\",referrerPolicy:\\"\\"}))($R[\\"example\\"])"`; -exports[`Request > crossSerializeStream > scoped > supports Request 2`] = `"($R=>(_$.Se($R[2],0,$R[4]=new Uint8Array($R[5]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,0,12))))($R[\\"example\\"])"`; +exports[`Request > crossSerializeStream > scoped > supports Request 2`] = `"($R=>_$.Se($R[2],0,$R[4]=new Uint8Array($R[5]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,0,12)))($R[\\"example\\"])"`; -exports[`Request > crossSerializeStream > scoped > supports Request 3`] = `"($R=>(_$.Se($R[2],2)))($R[\\"example\\"])"`; +exports[`Request > crossSerializeStream > scoped > supports Request 3`] = `"($R=>_$.Se($R[2],2))($R[\\"example\\"])"`; exports[`Request > crossSerializeStream > supports Request 1`] = `"$R[0]=new Request(\\"http://localhost:3000/\\",$R[1]={body:$R[2]=_$.S(),cache:\\"default\\",credentials:\\"same-origin\\",headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),integrity:\\"\\",keepalive:!1,method:\\"POST\\",mode:\\"cors\\",redirect:\\"follow\\",referrer:\\"about:client\\",referrerPolicy:\\"\\"})"`; diff --git a/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap index 79600a67..41e8a77e 100644 --- a/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap @@ -1,14 +1,14 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Response > crossSerializeAsync > scoped > supports Blob 1`] = `"($R=>($R[0]=new Response($R[1]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,$R[2]={headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),status:200,statusText:\\"\\"})))($R[\\"example\\"])"`; +exports[`Response > crossSerializeAsync > scoped > supports Blob 1`] = `"($R=>$R[0]=new Response($R[1]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,$R[2]={headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),status:200,statusText:\\"\\"}))($R[\\"example\\"])"`; exports[`Response > crossSerializeAsync > supports Blob 1`] = `"$R[0]=new Response($R[1]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,$R[2]={headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),status:200,statusText:\\"\\"})"`; -exports[`Response > crossSerializeStream > scoped > supports Response 1`] = `"($R=>($R[0]=new Response($R[1]=_$.S(),$R[2]={headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),status:200,statusText:\\"\\"})))($R[\\"example\\"])"`; +exports[`Response > crossSerializeStream > scoped > supports Response 1`] = `"($R=>$R[0]=new Response($R[1]=_$.S(),$R[2]={headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),status:200,statusText:\\"\\"}))($R[\\"example\\"])"`; -exports[`Response > crossSerializeStream > scoped > supports Response 2`] = `"($R=>(_$.Se($R[1],0,$R[4]=new Uint8Array($R[5]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,0,12))))($R[\\"example\\"])"`; +exports[`Response > crossSerializeStream > scoped > supports Response 2`] = `"($R=>_$.Se($R[1],0,$R[4]=new Uint8Array($R[5]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,0,12)))($R[\\"example\\"])"`; -exports[`Response > crossSerializeStream > scoped > supports Response 3`] = `"($R=>(_$.Se($R[1],2)))($R[\\"example\\"])"`; +exports[`Response > crossSerializeStream > scoped > supports Response 3`] = `"($R=>_$.Se($R[1],2))($R[\\"example\\"])"`; exports[`Response > crossSerializeStream > supports Response 1`] = `"$R[0]=new Response($R[1]=_$.S(),$R[2]={headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),status:200,statusText:\\"\\"})"`; diff --git a/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap index 817e1370..4c99f18c 100644 --- a/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`URLSearchParams > crossSerialize > scoped > supports URLSearchParams 1`] = `"($R=>($R[0]=new URLSearchParams(\\"hello=world&foo=bar\\")))($R[\\"example\\"])"`; +exports[`URLSearchParams > crossSerialize > scoped > supports URLSearchParams 1`] = `"($R=>$R[0]=new URLSearchParams(\\"hello=world&foo=bar\\"))($R[\\"example\\"])"`; exports[`URLSearchParams > crossSerialize > supports URLSearchParams 1`] = `"$R[0]=new URLSearchParams(\\"hello=world&foo=bar\\")"`; -exports[`URLSearchParams > crossSerializeAsync > scoped > supports URLSearchParams 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=new URLSearchParams(\\"hello=world&foo=bar\\"))))($R[\\"example\\"])"`; +exports[`URLSearchParams > crossSerializeAsync > scoped > supports URLSearchParams 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new URLSearchParams(\\"hello=world&foo=bar\\")))($R[\\"example\\"])"`; exports[`URLSearchParams > crossSerializeAsync > supports URLSearchParams 1`] = `"$R[0]=Promise.resolve($R[1]=new URLSearchParams(\\"hello=world&foo=bar\\"))"`; -exports[`URLSearchParams > crossSerializeStream > scoped > supports URLSearchParams 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`URLSearchParams > crossSerializeStream > scoped > supports URLSearchParams 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`URLSearchParams > crossSerializeStream > scoped > supports URLSearchParams 2`] = `"($R=>(_$.Ps($R[0],$R[1]=new URLSearchParams(\\"hello=world&foo=bar\\"))))($R[\\"example\\"])"`; +exports[`URLSearchParams > crossSerializeStream > scoped > supports URLSearchParams 2`] = `"($R=>_$.Ps($R[0],$R[1]=new URLSearchParams(\\"hello=world&foo=bar\\")))($R[\\"example\\"])"`; exports[`URLSearchParams > crossSerializeStream > supports URLSearchParams 1`] = `"$R[0]=_$.P()"`; diff --git a/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap index 6a350cb2..b6fd200a 100644 --- a/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`URL > crossSerialize > scoped > supports URL 1`] = `"($R=>($R[0]=new URL(\\"https://github.com/lxsmnsyc/seroval?hello=world\\")))($R[\\"example\\"])"`; +exports[`URL > crossSerialize > scoped > supports URL 1`] = `"($R=>$R[0]=new URL(\\"https://github.com/lxsmnsyc/seroval?hello=world\\"))($R[\\"example\\"])"`; exports[`URL > crossSerialize > supports URL 1`] = `"$R[0]=new URL(\\"https://github.com/lxsmnsyc/seroval?hello=world\\")"`; -exports[`URL > crossSerializeAsync > scoped > supports URL 1`] = `"($R=>($R[0]=Promise.resolve($R[1]=new URL(\\"https://github.com/lxsmnsyc/seroval?hello=world\\"))))($R[\\"example\\"])"`; +exports[`URL > crossSerializeAsync > scoped > supports URL 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new URL(\\"https://github.com/lxsmnsyc/seroval?hello=world\\")))($R[\\"example\\"])"`; exports[`URL > crossSerializeAsync > supports URL 1`] = `"$R[0]=Promise.resolve($R[1]=new URL(\\"https://github.com/lxsmnsyc/seroval?hello=world\\"))"`; -exports[`URL > crossSerializeStream > scoped > supports URL 1`] = `"($R=>($R[0]=_$.P()))($R[\\"example\\"])"`; +exports[`URL > crossSerializeStream > scoped > supports URL 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`URL > crossSerializeStream > scoped > supports URL 2`] = `"($R=>(_$.Ps($R[0],$R[1]=new URL(\\"https://github.com/lxsmnsyc/seroval?hello=world\\"))))($R[\\"example\\"])"`; +exports[`URL > crossSerializeStream > scoped > supports URL 2`] = `"($R=>_$.Ps($R[0],$R[1]=new URL(\\"https://github.com/lxsmnsyc/seroval?hello=world\\")))($R[\\"example\\"])"`; exports[`URL > crossSerializeStream > supports URL 1`] = `"$R[0]=_$.P()"`; From e5167125660fe59d8fc07eab2c0cf06c24e3d7bc Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 9 Nov 2023 13:11:17 +0800 Subject: [PATCH 02/82] Fix iterator output --- docs/serialization.md | 3 - packages/seroval/src/core/base/async.ts | 97 +++++-------------- packages/seroval/src/core/base/sync.ts | 95 ++++-------------- packages/seroval/src/core/constants.ts | 12 +++ packages/seroval/src/core/function-string.ts | 2 +- .../seroval/src/core/iterator-to-sequence.ts | 6 +- packages/seroval/src/core/parser-context.ts | 78 ++------------- packages/seroval/src/core/plugin.ts | 2 +- .../seroval/src/core/serializer-context.ts | 38 ++++---- packages/seroval/src/example.ts | 3 - .../__snapshots__/frozen-object.test.ts.snap | 20 ++-- .../test/__snapshots__/iterable.test.ts.snap | 38 ++++---- .../test/__snapshots__/map.test.ts.snap | 12 +-- .../null-constructor.test.ts.snap | 20 ++-- .../test/__snapshots__/object.test.ts.snap | 20 ++-- .../test/__snapshots__/plugin.test.ts.snap | 4 +- .../__snapshots__/sealed-object.test.ts.snap | 20 ++-- .../test/__snapshots__/set.test.ts.snap | 4 +- 18 files changed, 156 insertions(+), 318 deletions(-) diff --git a/docs/serialization.md b/docs/serialization.md index 9bc28050..aa7156a6 100644 --- a/docs/serialization.md +++ b/docs/serialization.md @@ -117,8 +117,5 @@ const BufferPlugin = createPlugin({ deserialize(node, ctx) { return Buffer.from(ctx.deserialize(node) as string, 'base64'); }, - isIterable() { - return true; - }, }); ``` diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index eb957dc8..a280a269 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -15,7 +15,11 @@ import { } from '../base-primitives'; import { BIGINT_FLAG, Feature } from '../compat'; import type { WellKnownSymbols } from '../constants'; -import { SerovalNodeType, UNIVERSAL_SENTINEL } from '../constants'; +import { + SerovalNodeType, + SpecialReference, + UNIVERSAL_SENTINEL, +} from '../constants'; import { createRequestOptions, createResponseOptions, @@ -73,22 +77,10 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { private async parseItems( current: unknown[], ): Promise { - const size = current.length; const nodes = []; - const deferred = []; - for (let i = 0, item: unknown; i < size; i++) { + for (let i = 0, len = current.length; i < len; i++) { if (i in current) { - item = current[i]; - if (this.isIterable(item)) { - deferred[i] = item; - } else { - nodes[i] = await this.parse(item); - } - } - } - for (let i = 0; i < size; i++) { - if (i in deferred) { - nodes[i] = await this.parse(deferred[i]); + nodes[i] = await this.parse(current[i]); } } return nodes; @@ -200,32 +192,23 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { const entries = Object.entries(properties); const keyNodes: SerovalObjectRecordKey[] = []; const valueNodes: SerovalNode[] = []; - const deferredKeys: string[] = []; - const deferredValues: unknown[] = []; for ( - let i = 0, len = entries.length, key: string, item: unknown; + let i = 0, len = entries.length; i < len; i++ ) { - key = serializeString(entries[i][0]); - item = entries[i][1]; - // Defer iterables since iterables have lazy evaluation. - // Of course this doesn't include types seroval supports. - if (this.isIterable(item)) { - deferredKeys.push(key); - deferredValues.push(item); - } else { - keyNodes.push(key); - valueNodes.push(await this.parse(item)); - } - } - for (let i = 0, len = deferredKeys.length; i < len; i++) { - keyNodes.push(deferredKeys[i]); - valueNodes.push(await this.parse(deferredValues[i])); + keyNodes.push(serializeString(entries[i][0])); + valueNodes.push(await this.parse(entries[i][1])); } // Check special properties if (this.features & Feature.Symbol) { if (Symbol.iterator in properties) { + const specialRef = SpecialReference.SymbolIteratorFactory; + if (this.hasSpecial[specialRef]) { + this.markRef(-(specialRef + 1)); + } else { + this.hasSpecial[specialRef] = true; + } keyNodes.push(SerovalObjectRecordSpecialKey.SymbolIterator); valueNodes.push(await this.parse(iteratorToSequence(properties as Iterable))); } @@ -286,23 +269,12 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { id: number, current: Map, ): Promise { + this.markRef(-(SpecialReference.Sentinel + 1)); const keyNodes: SerovalNode[] = []; const valueNodes: SerovalNode[] = []; - const deferredKey: unknown[] = []; - const deferredValue: unknown[] = []; for (const [key, value] of current.entries()) { - // Either key or value might be an iterable - if (this.isIterable(key) || this.isIterable(value)) { - deferredKey.push(key); - deferredValue.push(value); - } else { - keyNodes.push(await this.parse(key)); - valueNodes.push(await this.parse(value)); - } - } - for (let i = 0, len = deferredKey.length; i < len; i++) { - keyNodes.push(await this.parse(deferredKey[i])); - valueNodes.push(await this.parse(deferredValue[i])); + keyNodes.push(await this.parse(key)); + valueNodes.push(await this.parse(value)); } return { t: SerovalNodeType.Map, @@ -325,18 +297,8 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { current: Set, ): Promise { const nodes: SerovalNode[] = []; - const deferred: unknown[] = []; for (const item of current.keys()) { - // Iterables are lazy, so the evaluation must be deferred - if (this.isIterable(item)) { - deferred.push(item); - } else { - nodes.push(await this.parse(item)); - } - } - // Parse deferred items - for (let i = 0, len = deferred.length; i < len; i++) { - nodes.push(await this.parse(deferred[i])); + nodes.push(await this.parse(item)); } return { t: SerovalNodeType.Set, @@ -400,22 +362,9 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { const size = entries.length; const keyNodes: string[] = []; const valueNodes: SerovalNode[] = []; - const deferredKeys: string[] = []; - const deferredValues: unknown[] = []; - for (let i = 0, key: string, item: unknown; i < size; i++) { - key = serializeString(entries[i][0]); - item = entries[i][1]; - if (this.isIterable(item)) { - deferredKeys.push(key); - deferredValues.push(item); - } else { - keyNodes.push(key); - valueNodes.push(await this.parse(item)); - } - } - for (let i = 0, len = deferredKeys.length; i < len; i++) { - keyNodes.push(deferredKeys[i]); - valueNodes.push(await this.parse(deferredValues[i])); + for (let i = 0; i < size; i++) { + keyNodes.push(serializeString(entries[i][0])); + valueNodes.push(await this.parse(entries[i][1])); } return { k: keyNodes, diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index ff8fc986..55d98ae6 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -15,7 +15,9 @@ import { import { BIGINT_FLAG, Feature } from '../compat'; import type { WellKnownSymbols } from '../constants'; import { - SerovalNodeType, UNIVERSAL_SENTINEL, + SerovalNodeType, + SpecialReference, + UNIVERSAL_SENTINEL, } from '../constants'; import { createCustomEventOptions, createEventOptions } from '../constructors'; import { @@ -67,22 +69,10 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { protected parseItems( current: unknown[], ): SerovalNode[] { - const size = current.length; const nodes = []; - const deferred = []; - for (let i = 0, item: unknown; i < size; i++) { + for (let i = 0, len = current.length; i < len; i++) { if (i in current) { - item = current[i]; - if (this.isIterable(item)) { - deferred[i] = item; - } else { - nodes[i] = this.parse(item); - } - } - } - for (let i = 0; i < size; i++) { - if (i in deferred) { - nodes[i] = this.parse(deferred[i]); + nodes[i] = this.parse(current[i]); } } return nodes; @@ -114,32 +104,23 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { const entries = Object.entries(properties); const keyNodes: SerovalObjectRecordKey[] = []; const valueNodes: SerovalNode[] = []; - const deferredKeys: string[] = []; - const deferredValues: unknown[] = []; for ( - let i = 0, len = entries.length, key: string, item: unknown; + let i = 0, len = entries.length; i < len; i++ ) { - key = serializeString(entries[i][0]); - item = entries[i][1]; - // Defer iterables since iterables have lazy evaluation. - // Of course this doesn't include types seroval supports. - if (this.isIterable(item)) { - deferredKeys.push(key); - deferredValues.push(item); - } else { - keyNodes.push(key); - valueNodes.push(this.parse(item)); - } - } - for (let i = 0, len = deferredKeys.length; i < len; i++) { - keyNodes.push(deferredKeys[i]); - valueNodes.push(this.parse(deferredValues[i])); + keyNodes.push(serializeString(entries[i][0])); + valueNodes.push(this.parse(entries[i][1])); } // Check special properties, symbols in this case if (this.features & Feature.Symbol) { if (Symbol.iterator in properties) { + const specialRef = SpecialReference.SymbolIteratorFactory; + if (this.hasSpecial[specialRef]) { + this.markRef(-(specialRef + 1)); + } else { + this.hasSpecial[specialRef] = true; + } keyNodes.push(SerovalObjectRecordSpecialKey.SymbolIterator); valueNodes.push(this.parse(iteratorToSequence(properties as Iterable))); } @@ -280,23 +261,12 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { id: number, current: Map, ): SerovalMapNode { + this.markRef(-(SpecialReference.Sentinel + 1)); const keyNodes: SerovalNode[] = []; const valueNodes: SerovalNode[] = []; - const deferredKey: unknown[] = []; - const deferredValue: unknown[] = []; for (const [key, value] of current.entries()) { - // Either key or value might be an iterable - if (this.isIterable(key) || this.isIterable(value)) { - deferredKey.push(key); - deferredValue.push(value); - } else { - keyNodes.push(this.parse(key)); - valueNodes.push(this.parse(value)); - } - } - for (let i = 0, len = deferredKey.length; i < len; i++) { - keyNodes.push(this.parse(deferredKey[i])); - valueNodes.push(this.parse(deferredValue[i])); + keyNodes.push(this.parse(key)); + valueNodes.push(this.parse(value)); } return { t: SerovalNodeType.Map, @@ -319,18 +289,8 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { current: Set, ): SerovalSetNode { const nodes: SerovalNode[] = []; - const deferred: unknown[] = []; for (const item of current.keys()) { - // Iterables are lazy, so the evaluation must be deferred - if (this.isIterable(item)) { - deferred.push(item); - } else { - nodes.push(this.parse(item)); - } - } - // Parse deferred items - for (let i = 0, len = deferred.length; i < len; i++) { - nodes.push(this.parse(deferred[i])); + nodes.push(this.parse(item)); } return { t: SerovalNodeType.Set, @@ -354,22 +314,9 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { const size = entries.length; const keyNodes: string[] = []; const valueNodes: SerovalNode[] = []; - const deferredKeys: string[] = []; - const deferredValues: unknown[] = []; - for (let i = 0, key: string, item: unknown; i < size; i++) { - key = serializeString(entries[i][0]); - item = entries[i][1]; - if (this.isIterable(item)) { - deferredKeys.push(key); - deferredValues.push(item); - } else { - keyNodes.push(key); - valueNodes.push(this.parse(item)); - } - } - for (let i = 0, len = deferredKeys.length; i < len; i++) { - keyNodes.push(deferredKeys[i]); - valueNodes.push(this.parse(deferredValues[i])); + for (let i = 0; i < size; i++) { + keyNodes.push(serializeString(entries[i][0])); + valueNodes.push(this.parse(entries[i][1])); } return { k: keyNodes, diff --git a/packages/seroval/src/core/constants.ts b/packages/seroval/src/core/constants.ts index f20ca6d1..4b4e712a 100644 --- a/packages/seroval/src/core/constants.ts +++ b/packages/seroval/src/core/constants.ts @@ -188,3 +188,15 @@ export const ERROR_CONSTRUCTOR: Record = }; export const UNIVERSAL_SENTINEL = Symbol('why'); + +// These represents special references that are not provided +// by the user but are accessed by the serial output +export const enum SpecialReference { + // A sentinel ref is used to allow recursive Map + // assignments to be serialized in their original + // sequence. The sentinel ref is used as a placeholder + // value + Sentinel = 0, + // A factory for creating iterators + SymbolIteratorFactory = 1, +} diff --git a/packages/seroval/src/core/function-string.ts b/packages/seroval/src/core/function-string.ts index 74bded12..2224784b 100644 --- a/packages/seroval/src/core/function-string.ts +++ b/packages/seroval/src/core/function-string.ts @@ -14,7 +14,7 @@ export function createFunction( return 'function(' + parameters.join(',') + '){return' + body + '}'; } -export function createEffectulFunction( +export function createEffectfulFunction( features: number, parameters: string[], body: string, diff --git a/packages/seroval/src/core/iterator-to-sequence.ts b/packages/seroval/src/core/iterator-to-sequence.ts index 05efda85..b3742dd7 100644 --- a/packages/seroval/src/core/iterator-to-sequence.ts +++ b/packages/seroval/src/core/iterator-to-sequence.ts @@ -1,11 +1,13 @@ export interface Sequence { v: unknown[]; t: number; + d: number; } export function iteratorToSequence(source: Iterable): Sequence { const values: unknown[] = []; let throwsAt = -1; + let doneAt = -1; const iterator = source[Symbol.iterator](); @@ -14,6 +16,7 @@ export function iteratorToSequence(source: Iterable): Sequence { const value = iterator.next(); values.push(value.value); if (value.done) { + doneAt = values.length - 1; break; } } catch (error) { @@ -25,6 +28,7 @@ export function iteratorToSequence(source: Iterable): Sequence { return { v: values, t: throwsAt, + d: doneAt, }; } @@ -39,7 +43,7 @@ export function sequenceToIterator(sequence: Sequence): Iterator { throw currentItem; } return { - done: currentIndex === sequence.v.length - 1, + done: currentIndex === sequence.d, value: currentItem as T, }; }, diff --git a/packages/seroval/src/core/parser-context.ts b/packages/seroval/src/core/parser-context.ts index 9f697c4f..99ee1948 100644 --- a/packages/seroval/src/core/parser-context.ts +++ b/packages/seroval/src/core/parser-context.ts @@ -1,5 +1,6 @@ import { createIndexedValueNode, createReferenceNode } from './base-primitives'; -import { ALL_ENABLED, BIGINT_FLAG, Feature } from './compat'; +import { ALL_ENABLED } from './compat'; +import { SpecialReference } from './constants'; import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; import { hasReferenceID } from './reference'; import type { SerovalIndexedValueNode, SerovalReferenceNode } from './types'; @@ -20,6 +21,11 @@ export abstract class BaseParserContext implements PluginAccessOptions { plugins?: Plugin[] | undefined; + hasSpecial: Record = { + [SpecialReference.Sentinel]: false, + [SpecialReference.SymbolIteratorFactory]: false, + }; + constructor(options: BaseParserContextOptions) { this.plugins = options.plugins; this.features = ALL_ENABLED ^ (options.disabledFeatures || 0); @@ -58,74 +64,4 @@ export abstract class BaseParserContext implements PluginAccessOptions { this.refs.set(current, id); return createReferenceNode(id, current); } - - /** - * @private - */ - protected isIterable( - value: unknown, - ): value is Iterable { - if (!value || typeof value !== 'object') { - return false; - } - if (Array.isArray(value)) { - return false; - } - const currentClass = value.constructor; - const currentFeatures = this.features; - if (currentFeatures & Feature.TypedArray) { - switch (currentClass) { - case Int8Array: - case Int16Array: - case Int32Array: - case Uint8Array: - case Uint16Array: - case Uint32Array: - case Uint8ClampedArray: - case Float32Array: - case Float64Array: - return false; - default: - break; - } - } - // BigInt Typed Arrays - if ((currentFeatures & BIGINT_FLAG) === BIGINT_FLAG) { - switch (currentClass) { - case BigInt64Array: - case BigUint64Array: - return false; - default: - break; - } - } - // ES Collection - if (currentFeatures & Feature.Map && currentClass === Map) { - return false; - } - if (currentFeatures & Feature.Set && currentClass === Set) { - return false; - } - if (currentFeatures & Feature.WebAPI) { - if (typeof Headers !== 'undefined' && currentClass === Headers) { - return false; - } - if (typeof File !== 'undefined' && currentClass === File) { - return false; - } - } - const currentPlugins = this.plugins; - if (currentPlugins) { - for (let i = 0, len = currentPlugins.length; i < len; i++) { - const plugin = currentPlugins[i]; - if (plugin.test(value) && plugin.isIterable && plugin.isIterable(value)) { - return false; - } - } - } - if (currentFeatures & Feature.Symbol) { - return Symbol.iterator in value; - } - return false; - } } diff --git a/packages/seroval/src/core/plugin.ts b/packages/seroval/src/core/plugin.ts index e6ba7239..7862e6fb 100644 --- a/packages/seroval/src/core/plugin.ts +++ b/packages/seroval/src/core/plugin.ts @@ -40,7 +40,7 @@ export interface Plugin { ctx: VanillaDeserializerContext, data: PluginData, ): Value; - isIterable?: (value: Value) => boolean; + // isIterable?: (value: Value) => boolean; // isSerializable?: (value: Value) => boolean; } diff --git a/packages/seroval/src/core/serializer-context.ts b/packages/seroval/src/core/serializer-context.ts index 79341ac8..49328b40 100644 --- a/packages/seroval/src/core/serializer-context.ts +++ b/packages/seroval/src/core/serializer-context.ts @@ -5,8 +5,9 @@ import { SYMBOL_STRING, SerovalNodeType, SerovalObjectFlags, + SpecialReference, } from './constants'; -import { createEffectulFunction, createFunction } from './function-string'; +import { createEffectfulFunction, createFunction } from './function-string'; import { REFERENCES_KEY } from './keys'; import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; import { isValidIdentifier } from './shared'; @@ -183,11 +184,6 @@ const PROMISE_REJECT = 'Promise.reject'; const SYMBOL_ITERATOR = 'Symbol.iterator'; -const enum SpecialReference { - Sentinel = 0, - SymbolIteratorFactory = 1, -} - const OBJECT_FLAG_CONSTRUCTOR: Record = { [SerovalObjectFlags.Frozen]: 'Object.freeze', [SerovalObjectFlags.Sealed]: 'Object.seal', @@ -261,8 +257,6 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio */ abstract getRefParam(id: number | string): string; - private specials = new Set(); - private getSpecialReferenceValue(ref: SpecialReference): string { switch (ref) { case SpecialReference.Sentinel: @@ -270,11 +264,11 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio case SpecialReference.SymbolIteratorFactory: return createFunction( this.features, - ['f', 'i', 's', 'c', 'd'], + ['s'], '(' + createFunction( this.features, - [], - '(s=f(),i=0,{next:' + createEffectulFunction(this.features, [], 'c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}') + '})', + ['i', 'c', 'd'], + '(i=0,{next:' + createEffectfulFunction(this.features, [], 'c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}') + '})', ) + ')', ); default: @@ -282,17 +276,21 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio } } + private hasSpecial = new Set(); + /** * Generates special references that isn't provided by the user * but by the script. */ protected getSpecialReference(ref: SpecialReference): string { - const param = this.getRefParam('_' + ref); - if (this.specials.has(ref)) { - return param; + if (this.hasSpecial.has(ref)) { + return this.getRefParam(-(ref + 1)); } - this.specials.add(ref); - return '(' + param + '=' + this.getSpecialReferenceValue(ref) + ')'; + this.hasSpecial.add(ref); + return this.assignIndexedValue( + -(ref + 1), + this.getSpecialReferenceValue(ref), + ); } protected pushObjectFlag(flag: SerovalObjectFlags, id: number): void { @@ -431,9 +429,8 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio this.stack = []; const serialized = this.serialize(node); this.stack = parent; - const param = createFunction(this.features, [], '(' + serialized + ')'); const constructor = this.getSpecialReference(SpecialReference.SymbolIteratorFactory); - return key + constructor + '(' + param + ')'; + return key + '(' + constructor + ')(' + serialized + ')'; } protected serializeArrayItem( @@ -564,12 +561,11 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio this.stack = parent; const parentAssignment = this.assignments; this.assignments = mainAssignments; - const param = createFunction(this.features, [], '(' + serialized + ')'); const constructor = this.getSpecialReference(SpecialReference.SymbolIteratorFactory); this.createArrayAssign( sourceID, this.getSpecialReference(SpecialReference.Sentinel), - constructor + '(' + param + ')', + '(' + constructor + ')(' + serialized + ')', ); this.assignments = parentAssignment; } @@ -849,7 +845,7 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio serialized = constructor + ( node.s ? '().then(' + createFunction(this.features, [], ref) + ')' - : '().catch(' + createEffectulFunction(this.features, [], 'throw ' + ref) + ')' + : '().catch(' + createEffectfulFunction(this.features, [], 'throw ' + ref) + ')' ); } else { this.stack.push(id); diff --git a/packages/seroval/src/example.ts b/packages/seroval/src/example.ts index d64ff487..1b5cc079 100644 --- a/packages/seroval/src/example.ts +++ b/packages/seroval/src/example.ts @@ -22,7 +22,4 @@ const BufferPlugin = createPlugin({ deserialize(node, ctx) { return Buffer.from(ctx.deserialize(node) as string, 'base64'); }, - isIterable() { - return true; - }, }); diff --git a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap index 0d759508..58893392 100644 --- a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap @@ -2,25 +2,25 @@ exports[`frozen object > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])"`; -exports[`frozen object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))},Object.freeze($R[0]),$R[0])"`; +exports[`frozen object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])"`; -exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; exports[`frozen object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])"`; @@ -30,7 +30,7 @@ exports[`frozen object > crossSerializeStream > scoped > supports Objects 2`] = exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -46,7 +46,7 @@ exports[`frozen object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps( exports[`frozen object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; exports[`frozen object > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -58,24 +58,24 @@ exports[`frozen object > crossSerializeStream > supports self-recursion 4`] = `" exports[`frozen object > serialize > supports Objects 1`] = `"(h=>(h={hello:\\"world\\"},Object.freeze(h),h))()"`; -exports[`frozen object > serialize > supports Symbol.iterator 1`] = `"((h,j)=>(h={[Symbol.iterator]:(j=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))},Object.freeze(h),h))()"`; +exports[`frozen object > serialize > supports Symbol.iterator 1`] = `"(h=>(h={[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.freeze(h),h))()"`; exports[`frozen object > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a=h,Object.freeze(h),h))()"`; exports[`frozen object > serializeAsync > supports Objects 1`] = `"((h,j)=>(j=Promise.resolve(h={hello:\\"world\\"}),Object.freeze(h),j))()"`; -exports[`frozen object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[Symbol.iterator]:(j=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))}),Object.freeze(h),k))()"`; +exports[`frozen object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j)=>(j=Promise.resolve(h={[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}),Object.freeze(h),j))()"`; exports[`frozen object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.freeze(h),h))()"`; exports[`frozen object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3},\\"f\\":16383,\\"m\\":[]}"`; -exports[`frozen object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":3},\\"f\\":16383,\\"m\\":[]}"`; +exports[`frozen object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":3},\\"f\\":16383,\\"m\\":[]}"`; exports[`frozen object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":3},\\"f\\":16383,\\"m\\":[0]}"`; exports[`frozen object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`frozen object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":3}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`frozen object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":3}},\\"f\\":16383,\\"m\\":[]}"`; exports[`frozen object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":3},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/iterable.test.ts.snap b/packages/seroval/test/__snapshots__/iterable.test.ts.snap index 40727930..cc4447b6 100644 --- a/packages/seroval/test/__snapshots__/iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/iterable.test.ts.snap @@ -1,43 +1,43 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Iterable > compat > should use Symbol.iterator instead of Array.values. 1`] = `"((h,j)=>(h={[Symbol.iterator]:(j=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[h,void 0],t:-1}))}))()"`; +exports[`Iterable > compat > should use Symbol.iterator instead of Array.values. 1`] = `"(h=>(h={[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[h,void 0],t:-1,d:1})}))()"`; -exports[`Iterable > compat > should use functions instead of method shorthand. 1`] = `"(function(h,j){return(h={[Symbol.iterator]:(j=function(f,i,s,c,d){return(function(){return(s=f(),i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})})})(function(){return({v:[h,void 0],t:-1})})})})()"`; +exports[`Iterable > compat > should use functions instead of method shorthand. 1`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > compat > should use method shorthand instead of arrow functions. 1`] = `"(function(h,j){return(h={[Symbol.iterator]:(j=function(f,i,s,c,d){return(function(){return(s=f(),i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})})})(function(){return({v:[h,void 0],t:-1})})})})()"`; +exports[`Iterable > compat > should use method shorthand instead of arrow functions. 1`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16381,\\"m\\":[0]}"`; +exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16381,\\"m\\":[0]}"`; -exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 2`] = `"((h,j)=>(h={[Symbol.iterator]:(j=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[h,void 0],t:-1}))}))()"`; +exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 2`] = `"(h=>(h={[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[h,void 0],t:-1,d:1})}))()"`; -exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16315,\\"m\\":[0]}"`; +exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16315,\\"m\\":[0]}"`; -exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 2`] = `"(function(h,j){return(h={[Symbol.iterator]:(j=function(f,i,s,c,d){return(function(){return(s=f(),i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})})})(function(){return({v:[h,void 0],t:-1})})})})()"`; +exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 2`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16379,\\"m\\":[0]}"`; +exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16379,\\"m\\":[0]}"`; -exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 2`] = `"(function(h,j){return(h={[Symbol.iterator]:(j=function(f,i,s,c,d){return(function(){return(s=f(),i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})})})(function(){return({v:[h,void 0],t:-1})})})})()"`; +exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 2`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))})($R[\\"example\\"])"`; +exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; -exports[`Iterable > crossSerialize > supports Iterables 1`] = `"$R[0]={title:\\"Hello World\\",[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))}"`; +exports[`Iterable > crossSerialize > supports Iterables 1`] = `"$R[0]={title:\\"Hello World\\",[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; -exports[`Iterable > crossSerializeAsync > scoped > supports Iterables 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}))($R[\\"example\\"])"`; +exports[`Iterable > crossSerializeAsync > scoped > supports Iterables 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; -exports[`Iterable > crossSerializeAsync > supports Iterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))})"`; +exports[`Iterable > crossSerializeAsync > supports Iterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`Iterable > crossSerializeStream > scoped > supports Iterables 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Iterable > crossSerializeStream > scoped > supports Iterables 2`] = `"($R=>_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}))($R[\\"example\\"])"`; +exports[`Iterable > crossSerializeStream > scoped > supports Iterables 2`] = `"($R=>_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`Iterable > crossSerializeStream > supports Iterables 1`] = `"$R[0]=_$.P()"`; -exports[`Iterable > crossSerializeStream > supports Iterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))})"`; +exports[`Iterable > crossSerializeStream > supports Iterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; -exports[`Iterable > serialize > supports Iterables 1`] = `"(h=>({title:\\"Hello World\\",[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))}))()"`; +exports[`Iterable > serialize > supports Iterables 1`] = `"({title:\\"Hello World\\",[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})"`; -exports[`Iterable > serializeAsync > supports Iterables 1`] = `"(h=>(Promise.resolve({title:\\"Hello World\\",[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))})))()"`; +exports[`Iterable > serializeAsync > supports Iterables 1`] = `"Promise.resolve({title:\\"Hello World\\",[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})"`; -exports[`Iterable > toJSON > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Iterable > toJSON > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Iterable > toJSONAsync > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":2},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Iterable > toJSONAsync > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":2},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/map.test.ts.snap b/packages/seroval/test/__snapshots__/map.test.ts.snap index 36dd961c..e0d5a512 100644 --- a/packages/seroval/test/__snapshots__/map.test.ts.snap +++ b/packages/seroval/test/__snapshots__/map.test.ts.snap @@ -1,10 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[void 0],t:-1}))})))()"`; +exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"Object.assign(Object.create(null),{[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[void 0],t:-1,d:0})})"`; exports[`Map > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; -exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16351,\\"m\\":[]}"`; +exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":0}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16351,\\"m\\":[]}"`; exports[`Map > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; @@ -52,10 +52,10 @@ exports[`Map > serializeAsync > supports Map 1`] = `"Promise.resolve(new Map([[1 exports[`Map > serializeAsync > supports self-recursion 1`] = `"(h=>(h=new Map([[Promise.resolve().then(()=>h),Promise.resolve().then(()=>h)]])))()"`; -exports[`Map > toJSON > supports Map 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Map > toJSON > supports Map 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[-1]}"`; -exports[`Map > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":4,\\"i\\":0}],\\"v\\":[{\\"t\\":4,\\"i\\":0}],\\"s\\":1}},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`Map > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":4,\\"i\\":0}],\\"v\\":[{\\"t\\":4,\\"i\\":0}],\\"s\\":1}},\\"f\\":16383,\\"m\\":[-1,0]}"`; -exports[`Map > toJSONAsync > supports Map 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Map > toJSONAsync > supports Map 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[-1]}"`; -exports[`Map > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":1}},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`Map > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":1}},\\"f\\":16383,\\"m\\":[-1,0]}"`; diff --git a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap index 627ba817..23902c78 100644 --- a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap +++ b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap @@ -8,25 +8,25 @@ exports[`null-constructor > compat#toJSON > should use manual assignment instead exports[`null-constructor > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))}))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; exports[`null-constructor > crossSerialize > supports Objects 1`] = `"$R[0]=Object.assign(Object.create(null),{hello:\\"world\\"})"`; -exports[`null-constructor > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))})"`; +exports[`null-constructor > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`null-constructor > crossSerialize > supports self-recursion 1`] = `"($R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])"`; exports[`null-constructor > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}))"`; +exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; exports[`null-constructor > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})"`; @@ -36,7 +36,7 @@ exports[`null-constructor > crossSerializeStream > scoped > supports Objects 2`] exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -52,7 +52,7 @@ exports[`null-constructor > crossSerializeStream > supports Objects 2`] = `"_$.P exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}))"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; exports[`null-constructor > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -64,24 +64,24 @@ exports[`null-constructor > crossSerializeStream > supports self-recursion 4`] = exports[`null-constructor > serialize > supports Object.create(null) 1`] = `"Object.assign(Object.create(null),{hello:\\"world\\"})"`; -exports[`null-constructor > serialize > supports Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))})))()"`; +exports[`null-constructor > serialize > supports Symbol.iterator 1`] = `"Object.assign(Object.create(null),{[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})"`; exports[`null-constructor > serialize > supports self-recursion 1`] = `"(h=>(h=Object.create(null),h.b=h.a=h,h))()"`; exports[`null-constructor > serializeAsync > supports Object.create(null) 1`] = `"Promise.resolve(Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve(Object.assign(Object.create(null),{[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))}))))()"`; +exports[`null-constructor > serializeAsync > supports Symbol.iterator 1`] = `"Promise.resolve(Object.assign(Object.create(null),{[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))"`; exports[`null-constructor > serializeAsync > supports self-recursion 1`] = `"(h=>(h=Object.assign(Object.create(null),{a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)})))()"`; exports[`null-constructor > toJSON > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`null-constructor > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`null-constructor > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; exports[`null-constructor > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; exports[`null-constructor > toJSONAsync > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`null-constructor > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`null-constructor > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; exports[`null-constructor > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/object.test.ts.snap b/packages/seroval/test/__snapshots__/object.test.ts.snap index e005c9e2..2d21beb7 100644 --- a/packages/seroval/test/__snapshots__/object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/object.test.ts.snap @@ -8,25 +8,25 @@ exports[`objects > compat#toJSON > should use manual assignment instead of Objec exports[`objects > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"})($R[\\"example\\"])"`; -exports[`objects > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))})($R[\\"example\\"])"`; +exports[`objects > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; exports[`objects > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; exports[`objects > crossSerialize > supports Objects 1`] = `"$R[0]={hello:\\"world\\"}"`; -exports[`objects > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))}"`; +exports[`objects > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; exports[`objects > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],$R[0])"`; exports[`objects > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]={hello:\\"world\\"})"`; -exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))})"`; +exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`objects > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}"`; @@ -36,7 +36,7 @@ exports[`objects > crossSerializeStream > scoped > supports Objects 2`] = `"($R= exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`objects > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -52,7 +52,7 @@ exports[`objects > crossSerializeStream > supports Objects 2`] = `"_$.Ps($R[0],$ exports[`objects > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))})"`; +exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`objects > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -64,24 +64,24 @@ exports[`objects > crossSerializeStream > supports self-recursion 4`] = `"_$.Ps( exports[`objects > serialize > supports Objects 1`] = `"({hello:\\"world\\"})"`; -exports[`objects > serialize > supports Symbol.iterator 1`] = `"(h=>({[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))}))()"`; +exports[`objects > serialize > supports Symbol.iterator 1`] = `"({[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})"`; exports[`objects > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a=h,h))()"`; exports[`objects > serializeAsync > supports Objects 1`] = `"Promise.resolve({hello:\\"world\\"})"`; -exports[`objects > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve({[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))})))()"`; +exports[`objects > serializeAsync > supports Symbol.iterator 1`] = `"Promise.resolve({[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})"`; exports[`objects > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)}))()"`; exports[`objects > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`objects > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`objects > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; exports[`objects > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; exports[`objects > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`objects > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`objects > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; exports[`objects > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/plugin.test.ts.snap b/packages/seroval/test/__snapshots__/plugin.test.ts.snap index 9f940019..e27cd775 100644 --- a/packages/seroval/test/__snapshots__/plugin.test.ts.snap +++ b/packages/seroval/test/__snapshots__/plugin.test.ts.snap @@ -8,9 +8,9 @@ exports[`Plugin > crossSerializeAsync > scoped > supports Plugin 1`] = `"($R=>$R exports[`Plugin > crossSerializeAsync > supports Plugin 1`] = `"$R[0]=Promise.resolve(Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\"))"`; -exports[`Plugin > crossSerializeStream > scoped > supports Plugin 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1}))}))($R[\\"example\\"])"`; +exports[`Plugin > crossSerializeStream > scoped > supports Plugin 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})}))($R[\\"example\\"])"`; -exports[`Plugin > crossSerializeStream > supports Plugin 1`] = `"$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1}))})"`; +exports[`Plugin > crossSerializeStream > supports Plugin 1`] = `"$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})})"`; exports[`Plugin > serialize > supports Plugin 1`] = `"Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\")"`; diff --git a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap index 6be0bcdd..64e12fd8 100644 --- a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap @@ -2,25 +2,25 @@ exports[`sealed object > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.seal($R[0]),$R[0])"`; -exports[`sealed object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[1]={v:$R[2]=[1,2,3,void 0],t:-1}))},Object.seal($R[0]),$R[0])"`; +exports[`sealed object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])"`; -exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; exports[`sealed object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])"`; @@ -30,7 +30,7 @@ exports[`sealed object > crossSerializeStream > scoped > supports Objects 2`] = exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -46,7 +46,7 @@ exports[`sealed object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps( exports[`sealed object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R._1=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>($R[2]={v:$R[3]=[1,2,3,void 0],t:-1}))}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; exports[`sealed object > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -58,24 +58,24 @@ exports[`sealed object > crossSerializeStream > supports self-recursion 4`] = `" exports[`sealed object > serialize > supports Objects 1`] = `"(h=>(h={hello:\\"world\\"},Object.seal(h),h))()"`; -exports[`sealed object > serialize > supports Symbol.iterator 1`] = `"((h,j)=>(h={[Symbol.iterator]:(j=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))},Object.seal(h),h))()"`; +exports[`sealed object > serialize > supports Symbol.iterator 1`] = `"(h=>(h={[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.seal(h),h))()"`; exports[`sealed object > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a=h,Object.seal(h),h))()"`; exports[`sealed object > serializeAsync > supports Objects 1`] = `"((h,j)=>(j=Promise.resolve(h={hello:\\"world\\"}),Object.seal(h),j))()"`; -exports[`sealed object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[Symbol.iterator]:(j=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))}),Object.seal(h),k))()"`; +exports[`sealed object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j)=>(j=Promise.resolve(h={[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}),Object.seal(h),j))()"`; exports[`sealed object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.seal(h),h))()"`; exports[`sealed object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2},\\"f\\":16383,\\"m\\":[]}"`; -exports[`sealed object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":2},\\"f\\":16383,\\"m\\":[]}"`; +exports[`sealed object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":2},\\"f\\":16383,\\"m\\":[]}"`; exports[`sealed object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":2},\\"f\\":16383,\\"m\\":[0]}"`; exports[`sealed object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`sealed object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":2}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`sealed object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":2}},\\"f\\":16383,\\"m\\":[]}"`; exports[`sealed object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":2},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/set.test.ts.snap b/packages/seroval/test/__snapshots__/set.test.ts.snap index db3b7894..65706c5c 100644 --- a/packages/seroval/test/__snapshots__/set.test.ts.snap +++ b/packages/seroval/test/__snapshots__/set.test.ts.snap @@ -1,10 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Set > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[Symbol.iterator]:(h=(f,i,s,c,d)=>(()=>(s=f(),i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.v.length-1,value:d}}})))(()=>({v:[1,2,3,void 0],t:-1}))})))()"`; +exports[`Set > compat > should fallback to Symbol.iterator 1`] = `"Object.assign(Object.create(null),{[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})"`; exports[`Set > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; -exports[`Set > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1}],\\"s\\":2},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":15871,\\"m\\":[]}"`; +exports[`Set > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":15871,\\"m\\":[]}"`; exports[`Set > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; From c351ff487f8b83da2eec6d5d48c70814f6cd4204 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 9 Nov 2023 13:29:59 +0800 Subject: [PATCH 03/82] Add special reference state --- packages/seroval/src/core/Serializer.ts | 4 ++ packages/seroval/src/core/base/async.ts | 6 +-- packages/seroval/src/core/base/sync.ts | 6 +-- packages/seroval/src/core/constants.ts | 12 ----- packages/seroval/src/core/cross/index.ts | 6 +++ packages/seroval/src/core/parser-context.ts | 10 ++-- .../seroval/src/core/serializer-context.ts | 34 ++++-------- .../seroval/src/core/special-reference.ts | 43 +++++++++++++++ packages/seroval/src/core/tree/index.ts | 7 +++ .../test/__snapshots__/array.test.ts.snap | 8 +-- .../test/__snapshots__/bigint.test.ts.snap | 4 +- .../test/__snapshots__/boolean.test.ts.snap | 8 +-- .../__snapshots__/boxed-bigint.test.ts.snap | 4 +- .../__snapshots__/boxed-number.test.ts.snap | 20 +++---- .../__snapshots__/boxed-string.test.ts.snap | 8 +-- .../test/__snapshots__/data-view.test.ts.snap | 4 +- .../test/__snapshots__/date.test.ts.snap | 4 +- .../test/__snapshots__/error.test.ts.snap | 12 ++--- .../__snapshots__/frozen-object.test.ts.snap | 12 ++--- .../test/__snapshots__/iterable.test.ts.snap | 10 ++-- .../test/__snapshots__/map.test.ts.snap | 10 ++-- .../__snapshots__/mutual-cycle.test.ts.snap | 12 ++--- .../null-constructor.test.ts.snap | 14 ++--- .../test/__snapshots__/number.test.ts.snap | 20 +++---- .../test/__snapshots__/object.test.ts.snap | 14 ++--- .../test/__snapshots__/plugin.test.ts.snap | 4 +- .../test/__snapshots__/reference.test.ts.snap | 4 +- .../test/__snapshots__/regexp.test.ts.snap | 4 +- .../__snapshots__/sealed-object.test.ts.snap | 12 ++--- .../test/__snapshots__/set.test.ts.snap | 10 ++-- .../__snapshots__/sparse-array.test.ts.snap | 4 +- .../test/__snapshots__/string.test.ts.snap | 8 +-- .../__snapshots__/typed-array.test.ts.snap | 4 +- .../__snapshots__/wk-symbols.test.ts.snap | 52 +++++++++---------- .../web-api/__snapshots__/blob.test.ts.snap | 2 +- .../__snapshots__/custom-event.test.ts.snap | 4 +- .../__snapshots__/dom-exception.test.ts.snap | 4 +- .../web-api/__snapshots__/event.test.ts.snap | 4 +- .../web-api/__snapshots__/file.test.ts.snap | 2 +- .../__snapshots__/form-data.test.ts.snap | 4 +- .../__snapshots__/headers.test.ts.snap | 4 +- .../__snapshots__/request.test.ts.snap | 2 +- .../__snapshots__/response.test.ts.snap | 2 +- .../url-search-params.test.ts.snap | 4 +- .../web-api/__snapshots__/url.test.ts.snap | 4 +- 45 files changed, 231 insertions(+), 199 deletions(-) create mode 100644 packages/seroval/src/core/special-reference.ts diff --git a/packages/seroval/src/core/Serializer.ts b/packages/seroval/src/core/Serializer.ts index 69c6401c..2443a825 100644 --- a/packages/seroval/src/core/Serializer.ts +++ b/packages/seroval/src/core/Serializer.ts @@ -1,4 +1,5 @@ import { crossSerializeStream } from './cross'; +import { createSpecialReferenceState } from './special-reference'; import { serializeString } from './string'; export interface SerializerOptions { @@ -23,6 +24,8 @@ export default class Serializer { private refs = new Map(); + private specials = createSpecialReferenceState(); + constructor( private options: SerializerOptions, ) { @@ -37,6 +40,7 @@ export default class Serializer { this.cleanups.push(crossSerializeStream(value, { scopeId: this.options.scopeId, refs: this.refs, + specials: this.specials, disabledFeatures: this.options.disabledFeatures, onError: this.options.onError, onSerialize: (data, initial) => { diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index a280a269..acffcb71 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -17,7 +17,6 @@ import { BIGINT_FLAG, Feature } from '../compat'; import type { WellKnownSymbols } from '../constants'; import { SerovalNodeType, - SpecialReference, UNIVERSAL_SENTINEL, } from '../constants'; import { @@ -67,6 +66,7 @@ import type { SerovalDataViewNode, } from '../types'; import { createURLNode, createURLSearchParamsNode, createDOMExceptionNode } from '../web-api'; +import { SpecialReference } from '../special-reference'; type ObjectLikeNode = | SerovalObjectNode @@ -204,10 +204,10 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { if (this.features & Feature.Symbol) { if (Symbol.iterator in properties) { const specialRef = SpecialReference.SymbolIteratorFactory; - if (this.hasSpecial[specialRef]) { + if (this.specials[specialRef]) { this.markRef(-(specialRef + 1)); } else { - this.hasSpecial[specialRef] = true; + this.specials[specialRef] = 1; } keyNodes.push(SerovalObjectRecordSpecialKey.SymbolIterator); valueNodes.push(await this.parse(iteratorToSequence(properties as Iterable))); diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index 55d98ae6..5510713b 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -16,7 +16,6 @@ import { BIGINT_FLAG, Feature } from '../compat'; import type { WellKnownSymbols } from '../constants'; import { SerovalNodeType, - SpecialReference, UNIVERSAL_SENTINEL, } from '../constants'; import { createCustomEventOptions, createEventOptions } from '../constructors'; @@ -56,6 +55,7 @@ import type { SerovalDataViewNode, } from '../types'; import { createDOMExceptionNode, createURLNode, createURLSearchParamsNode } from '../web-api'; +import { SpecialReference } from '../special-reference'; type ObjectLikeNode = | SerovalObjectNode @@ -116,10 +116,10 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { if (this.features & Feature.Symbol) { if (Symbol.iterator in properties) { const specialRef = SpecialReference.SymbolIteratorFactory; - if (this.hasSpecial[specialRef]) { + if (this.specials[specialRef]) { this.markRef(-(specialRef + 1)); } else { - this.hasSpecial[specialRef] = true; + this.specials[specialRef] = 1; } keyNodes.push(SerovalObjectRecordSpecialKey.SymbolIterator); valueNodes.push(this.parse(iteratorToSequence(properties as Iterable))); diff --git a/packages/seroval/src/core/constants.ts b/packages/seroval/src/core/constants.ts index 4b4e712a..f20ca6d1 100644 --- a/packages/seroval/src/core/constants.ts +++ b/packages/seroval/src/core/constants.ts @@ -188,15 +188,3 @@ export const ERROR_CONSTRUCTOR: Record = }; export const UNIVERSAL_SENTINEL = Symbol('why'); - -// These represents special references that are not provided -// by the user but are accessed by the serial output -export const enum SpecialReference { - // A sentinel ref is used to allow recursive Map - // assignments to be serialized in their original - // sequence. The sentinel ref is used as a placeholder - // value - Sentinel = 0, - // A factory for creating iterators - SymbolIteratorFactory = 1, -} diff --git a/packages/seroval/src/core/cross/index.ts b/packages/seroval/src/core/cross/index.ts index 3898bab4..dcd1b02f 100644 --- a/packages/seroval/src/core/cross/index.ts +++ b/packages/seroval/src/core/cross/index.ts @@ -19,6 +19,7 @@ export function crossSerialize( plugins: options.plugins, disabledFeatures: options.disabledFeatures, refs: options.refs, + specials: options.specials, }); const tree = ctx.parse(source); const serial = new CrossSerializerContext({ @@ -26,6 +27,7 @@ export function crossSerialize( features: ctx.features, scopeId: options.scopeId, markedRefs: ctx.marked, + specials: ctx.specials, }); return serial.serializeTop(tree); } @@ -42,6 +44,7 @@ export async function crossSerializeAsync( plugins: options.plugins, disabledFeatures: options.disabledFeatures, refs: options.refs, + specials: options.specials, }); const tree = await ctx.parse(source); const serial = new CrossSerializerContext({ @@ -49,6 +52,7 @@ export async function crossSerializeAsync( features: ctx.features, scopeId: options.scopeId, markedRefs: ctx.marked, + specials: ctx.specials, }); return serial.serializeTop(tree); } @@ -110,6 +114,7 @@ export function crossSerializeStream( ): () => void { const ctx = new StreamCrossParserContext({ refs: options.refs, + specials: options.specials, disabledFeatures: options.disabledFeatures, onParse(node, initial): void { const serial = new CrossSerializerContext({ @@ -117,6 +122,7 @@ export function crossSerializeStream( features: ctx.features, scopeId: options.scopeId, markedRefs: ctx.marked, + specials: ctx.specials, }); let serialized: string; diff --git a/packages/seroval/src/core/parser-context.ts b/packages/seroval/src/core/parser-context.ts index 99ee1948..e199cb4a 100644 --- a/packages/seroval/src/core/parser-context.ts +++ b/packages/seroval/src/core/parser-context.ts @@ -1,13 +1,15 @@ import { createIndexedValueNode, createReferenceNode } from './base-primitives'; import { ALL_ENABLED } from './compat'; -import { SpecialReference } from './constants'; import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; import { hasReferenceID } from './reference'; +import type { SpecialReferenceState } from './special-reference'; +import { createSpecialReferenceState } from './special-reference'; import type { SerovalIndexedValueNode, SerovalReferenceNode } from './types'; export interface BaseParserContextOptions extends PluginAccessOptions { disabledFeatures?: number; refs?: Map; + specials?: SpecialReferenceState; } export abstract class BaseParserContext implements PluginAccessOptions { @@ -21,15 +23,13 @@ export abstract class BaseParserContext implements PluginAccessOptions { plugins?: Plugin[] | undefined; - hasSpecial: Record = { - [SpecialReference.Sentinel]: false, - [SpecialReference.SymbolIteratorFactory]: false, - }; + specials: SpecialReferenceState; constructor(options: BaseParserContextOptions) { this.plugins = options.plugins; this.features = ALL_ENABLED ^ (options.disabledFeatures || 0); this.refs = options.refs || new Map(); + this.specials = options.specials || createSpecialReferenceState(); } protected markRef(id: number): void { diff --git a/packages/seroval/src/core/serializer-context.ts b/packages/seroval/src/core/serializer-context.ts index 49328b40..ca4e2cc3 100644 --- a/packages/seroval/src/core/serializer-context.ts +++ b/packages/seroval/src/core/serializer-context.ts @@ -5,12 +5,13 @@ import { SYMBOL_STRING, SerovalNodeType, SerovalObjectFlags, - SpecialReference, } from './constants'; import { createEffectfulFunction, createFunction } from './function-string'; import { REFERENCES_KEY } from './keys'; import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; import { isValidIdentifier } from './shared'; +import type { SpecialReferenceState } from './special-reference'; +import { SpecialReference, getSpecialReferenceValue } from './special-reference'; import type { SerovalArrayNode, SerovalIndexedValueNode, @@ -194,6 +195,7 @@ const OBJECT_FLAG_CONSTRUCTOR: Record = export interface BaseSerializerContextOptions extends PluginAccessOptions { features: number; markedRefs: number[] | Set; + specials: SpecialReferenceState; } export default abstract class BaseSerializerContext implements PluginAccessOptions { @@ -228,10 +230,13 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio */ marked: Set; + specials: SpecialReferenceState; + constructor(options: BaseSerializerContextOptions) { this.plugins = options.plugins; this.features = options.features; this.marked = new Set(options.markedRefs); + this.specials = options.specials; } abstract readonly mode: SerovalMode; @@ -257,39 +262,18 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio */ abstract getRefParam(id: number | string): string; - private getSpecialReferenceValue(ref: SpecialReference): string { - switch (ref) { - case SpecialReference.Sentinel: - return '[]'; - case SpecialReference.SymbolIteratorFactory: - return createFunction( - this.features, - ['s'], - '(' + createFunction( - this.features, - ['i', 'c', 'd'], - '(i=0,{next:' + createEffectfulFunction(this.features, [], 'c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}') + '})', - ) + ')', - ); - default: - return ''; - } - } - - private hasSpecial = new Set(); - /** * Generates special references that isn't provided by the user * but by the script. */ protected getSpecialReference(ref: SpecialReference): string { - if (this.hasSpecial.has(ref)) { + if (this.specials[ref] === 2) { return this.getRefParam(-(ref + 1)); } - this.hasSpecial.add(ref); + this.specials[ref] = 2; return this.assignIndexedValue( -(ref + 1), - this.getSpecialReferenceValue(ref), + getSpecialReferenceValue(this.features, ref), ); } diff --git a/packages/seroval/src/core/special-reference.ts b/packages/seroval/src/core/special-reference.ts new file mode 100644 index 00000000..34a0f72a --- /dev/null +++ b/packages/seroval/src/core/special-reference.ts @@ -0,0 +1,43 @@ + +// These represents special references that are not provided + +import { createEffectfulFunction, createFunction } from "./function-string"; + +// by the user but are accessed by the serial output +export const enum SpecialReference { + // A sentinel ref is used to allow recursive Map + // assignments to be serialized in their original + // sequence. The sentinel ref is used as a placeholder + // value + Sentinel = 0, + // A factory for creating iterators + SymbolIteratorFactory = 1, +} + +export type SpecialReferenceState = Record; + +export function createSpecialReferenceState(): SpecialReferenceState { + return { + [SpecialReference.Sentinel]: 0, + [SpecialReference.SymbolIteratorFactory]: 0, + }; +} + +export function getSpecialReferenceValue(features: number, ref: SpecialReference): string { + switch (ref) { + case SpecialReference.Sentinel: + return '[]'; + case SpecialReference.SymbolIteratorFactory: + return createFunction( + features, + ['s'], + '(' + createFunction( + features, + ['i', 'c', 'd'], + '(i=0,{next:' + createEffectfulFunction(features, [], 'c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}') + '})', + ) + ')', + ); + default: + return ''; + } +} diff --git a/packages/seroval/src/core/tree/index.ts b/packages/seroval/src/core/tree/index.ts index 22ba6e7e..9d075966 100644 --- a/packages/seroval/src/core/tree/index.ts +++ b/packages/seroval/src/core/tree/index.ts @@ -1,4 +1,5 @@ import type { PluginAccessOptions } from '../plugin'; +import type { SpecialReferenceState } from '../special-reference'; import type { SerovalNode } from '../types'; import type { AsyncParserContextOptions } from './async'; import AsyncParserContext from './async'; @@ -20,6 +21,7 @@ export function serialize( plugins: options.plugins, features: ctx.features, markedRefs: ctx.marked, + specials: ctx.specials, }); return serial.serializeTop(tree); } @@ -37,6 +39,7 @@ export async function serializeAsync( plugins: options.plugins, features: ctx.features, markedRefs: ctx.marked, + specials: ctx.specials, }); return serial.serializeTop(tree); } @@ -50,6 +53,7 @@ export interface SerovalJSON { t: SerovalNode; f: number; m: number[]; + s: SpecialReferenceState; } export function toJSON( @@ -64,6 +68,7 @@ export function toJSON( t: ctx.parse(source), f: ctx.features, m: Array.from(ctx.marked), + s: ctx.specials, }; } @@ -79,6 +84,7 @@ export async function toJSONAsync( t: await ctx.parse(source), f: ctx.features, m: Array.from(ctx.marked), + s: ctx.specials, }; } @@ -87,6 +93,7 @@ export function compileJSON(source: SerovalJSON, options: PluginAccessOptions = plugins: options.plugins, features: source.f, markedRefs: source.m, + specials: source.s, }); return ctx.serializeTop(source.t); } diff --git a/packages/seroval/test/__snapshots__/array.test.ts.snap b/packages/seroval/test/__snapshots__/array.test.ts.snap index d3b481b0..ac03c0a3 100644 --- a/packages/seroval/test/__snapshots__/array.test.ts.snap +++ b/packages/seroval/test/__snapshots__/array.test.ts.snap @@ -44,10 +44,10 @@ exports[`arrays > serializeAsync > supports Arrays 1`] = `"Promise.resolve([1,2, exports[`arrays > serializeAsync > supports self recursion 1`] = `"(h=>(h=[Promise.resolve().then(()=>h),Promise.resolve().then(()=>h)]))()"`; -exports[`arrays > toJSON > supports Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`arrays > toJSON > supports Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`arrays > toJSON > supports self recursion 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`arrays > toJSON > supports self recursion 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"o\\":0},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`arrays > toJSONAsync > supports Arrays 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`arrays > toJSONAsync > supports Arrays 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`arrays > toJSONAsync > supports self recursion 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`arrays > toJSONAsync > supports self recursion 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"o\\":0},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/bigint.test.ts.snap b/packages/seroval/test/__snapshots__/bigint.test.ts.snap index c803bef9..f1308049 100644 --- a/packages/seroval/test/__snapshots__/bigint.test.ts.snap +++ b/packages/seroval/test/__snapshots__/bigint.test.ts.snap @@ -16,6 +16,6 @@ exports[`bigint > serialize > supports bigint 1`] = `"9007199254740991n"`; exports[`bigint > serializeAsync > supports bigint 1`] = `"Promise.resolve(9007199254740991n)"`; -exports[`bigint > toJSON > supports bigint 1`] = `"{\\"t\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"},\\"f\\":16383,\\"m\\":[]}"`; +exports[`bigint > toJSON > supports bigint 1`] = `"{\\"t\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`bigint > toJSONAsync > supports bigint 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`bigint > toJSONAsync > supports bigint 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/boolean.test.ts.snap b/packages/seroval/test/__snapshots__/boolean.test.ts.snap index 220227f1..0a0519ed 100644 --- a/packages/seroval/test/__snapshots__/boolean.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boolean.test.ts.snap @@ -16,10 +16,10 @@ exports[`boolean > crossSerializeAsync > supports true value 1`] = `"$R[0]=_$.P( exports[`boolean > crossSerializeAsync > supports true value 2`] = `"_$.Ps($R[0],!0)"`; -exports[`boolean > serializeAsync > supports boolean 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boolean > serializeAsync > supports boolean 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boolean > serializeAsync > supports boolean 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":3}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boolean > serializeAsync > supports boolean 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":3}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boolean > toJSON > supports boolean 1`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":2},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boolean > toJSON > supports boolean 1`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":2},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boolean > toJSON > supports boolean 2`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":3},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boolean > toJSON > supports boolean 2`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":3},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap b/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap index 9bc0d47b..96007539 100644 --- a/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap @@ -24,6 +24,6 @@ exports[`boxed bigint > serialize > supports boxed bigint 1`] = `"Object(9007199 exports[`boxed bigint > serializeAsync > supports boxed bigint 1`] = `"Promise.resolve(Object(9007199254740991n))"`; -exports[`boxed bigint > toJSON > supports boxed bigint 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed bigint > toJSON > supports boxed bigint 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boxed bigint > toJSONAsync > supports boxed bigint 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed bigint > toJSONAsync > supports boxed bigint 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap b/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap index b4562b1f..b17f797f 100644 --- a/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap @@ -80,22 +80,22 @@ exports[`boxed number > crossSerializeStream > supports boxed numbers 1`] = `"$R exports[`boxed number > crossSerializeStream > supports boxed numbers 2`] = `"_$.Ps($R[0],$R[1]=Object(3735928559))"`; -exports[`boxed number > toJSON > supports boxed numbers 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed number > toJSON > supports boxed numbers 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boxed number > toJSON > supports boxed numbers 2`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":7}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed number > toJSON > supports boxed numbers 2`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":7}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boxed number > toJSON > supports boxed numbers 3`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":5}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed number > toJSON > supports boxed numbers 3`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":5}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boxed number > toJSON > supports boxed numbers 4`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":6}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed number > toJSON > supports boxed numbers 4`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":6}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boxed number > toJSON > supports boxed numbers 5`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":4}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed number > toJSON > supports boxed numbers 5`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":4}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boxed number > toJSONAsync > supports boxed numbers 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed number > toJSONAsync > supports boxed numbers 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boxed number > toJSONAsync > supports boxed numbers 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":7}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed number > toJSONAsync > supports boxed numbers 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":7}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boxed number > toJSONAsync > supports boxed numbers 3`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":5}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed number > toJSONAsync > supports boxed numbers 3`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":5}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boxed number > toJSONAsync > supports boxed numbers 4`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":6}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed number > toJSONAsync > supports boxed numbers 4`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":6}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boxed number > toJSONAsync > supports boxed numbers 5`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":4}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed number > toJSONAsync > supports boxed numbers 5`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":4}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap b/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap index adeec73b..2852d8db 100644 --- a/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap @@ -40,10 +40,10 @@ exports[`boxed string > serializeAsync > supports boxed strings 1`] = `"Promise. exports[`boxed string > serializeAsync > supports boxed strings 2`] = `"Promise.resolve(Object(\\"\\\\x3Cscript>\\\\x3C/script>\\"))"`; -exports[`boxed string > toJSON > supports boxed strings 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed string > toJSON > supports boxed strings 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boxed string > toJSON > supports boxed strings 2`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed string > toJSON > supports boxed strings 2`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boxed string > toJSONAsync > supports boxed strings 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed string > toJSONAsync > supports boxed strings 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`boxed string > toJSONAsync > supports boxed strings 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boxed string > toJSONAsync > supports boxed strings 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/data-view.test.ts.snap b/packages/seroval/test/__snapshots__/data-view.test.ts.snap index 2d8a4cfc..032d2372 100644 --- a/packages/seroval/test/__snapshots__/data-view.test.ts.snap +++ b/packages/seroval/test/__snapshots__/data-view.test.ts.snap @@ -20,6 +20,6 @@ exports[`DataView > serialize > supports DataView 1`] = `"new DataView(new Uint8 exports[`DataView > serializeAsync > supports DataView 1`] = `"Promise.resolve(new DataView(new Uint8Array([0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]).buffer,0,16))"`; -exports[`DataView > toJSON > supports DataView 1`] = `"{\\"t\\":{\\"t\\":22,\\"i\\":0,\\"l\\":16,\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]},\\"b\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`DataView > toJSON > supports DataView 1`] = `"{\\"t\\":{\\"t\\":22,\\"i\\":0,\\"l\\":16,\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]},\\"b\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`DataView > toJSONAsync > supports DataView 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":22,\\"i\\":1,\\"l\\":16,\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]},\\"b\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`DataView > toJSONAsync > supports DataView 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":22,\\"i\\":1,\\"l\\":16,\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]},\\"b\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/date.test.ts.snap b/packages/seroval/test/__snapshots__/date.test.ts.snap index cdd42704..021ff2fd 100644 --- a/packages/seroval/test/__snapshots__/date.test.ts.snap +++ b/packages/seroval/test/__snapshots__/date.test.ts.snap @@ -20,6 +20,6 @@ exports[`Date > serialize > supports Date 1`] = `"new Date(\\"2023-03-14T11:16:2 exports[`Date > serializeAsync > supports Date 1`] = `"Promise.resolve(new Date(\\"2023-03-14T11:16:24.879Z\\"))"`; -exports[`Date > toJSON > supports Date 1`] = `"{\\"t\\":{\\"t\\":5,\\"i\\":0,\\"s\\":\\"2023-03-14T11:16:24.879Z\\"},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Date > toJSON > supports Date 1`] = `"{\\"t\\":{\\"t\\":5,\\"i\\":0,\\"s\\":\\"2023-03-14T11:16:24.879Z\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Date > toJSONAsync > supports Date 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":5,\\"i\\":1,\\"s\\":\\"2023-03-14T11:16:24.879Z\\"}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Date > toJSONAsync > supports Date 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":5,\\"i\\":1,\\"s\\":\\"2023-03-14T11:16:24.879Z\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/error.test.ts.snap b/packages/seroval/test/__snapshots__/error.test.ts.snap index 6d230a89..c813743c 100644 --- a/packages/seroval/test/__snapshots__/error.test.ts.snap +++ b/packages/seroval/test/__snapshots__/error.test.ts.snap @@ -64,14 +64,14 @@ exports[`Error > serializeAsync > supports Error.prototype.name 1`] = `"Promise. exports[`Error > serializeAsync > supports other Error classes 1`] = `"Promise.resolve(Object.assign(new ReferenceError(\\"A\\"),{stack:\\"\\"}))"`; -exports[`Error > toJSON > supports Error.prototype.cause 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"B\\",\\"p\\":{\\"k\\":[\\"stack\\",\\"cause\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":13,\\"i\\":1,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Error > toJSON > supports Error.prototype.cause 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"B\\",\\"p\\":{\\"k\\":[\\"stack\\",\\"cause\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":13,\\"i\\":1,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Error > toJSON > supports Error.prototype.name 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"name\\",\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"ExampleError\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Error > toJSON > supports Error.prototype.name 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"name\\",\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"ExampleError\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Error > toJSON > supports other Error classes 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":3,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Error > toJSON > supports other Error classes 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":3,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Error > toJSONAsync > supports Error.prototype.cause 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"B\\",\\"p\\":{\\"k\\":[\\"stack\\",\\"cause\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":13,\\"i\\":2,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Error > toJSONAsync > supports Error.prototype.cause 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"B\\",\\"p\\":{\\"k\\":[\\"stack\\",\\"cause\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":13,\\"i\\":2,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Error > toJSONAsync > supports Error.prototype.name 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":13,\\"i\\":1,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"name\\",\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"ExampleError\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Error > toJSONAsync > supports Error.prototype.name 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":13,\\"i\\":1,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"name\\",\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"ExampleError\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Error > toJSONAsync > supports other Error classes 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":13,\\"i\\":1,\\"s\\":3,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Error > toJSONAsync > supports other Error classes 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":13,\\"i\\":1,\\"s\\":3,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap index 58893392..d6621244 100644 --- a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap @@ -68,14 +68,14 @@ exports[`frozen object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j exports[`frozen object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.freeze(h),h))()"`; -exports[`frozen object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3},\\"f\\":16383,\\"m\\":[]}"`; +exports[`frozen object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`frozen object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":3},\\"f\\":16383,\\"m\\":[]}"`; +exports[`frozen object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":3},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; -exports[`frozen object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":3},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`frozen object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":3},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`frozen object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`frozen object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`frozen object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":3}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`frozen object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":3}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; -exports[`frozen object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":3},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`frozen object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":3},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/iterable.test.ts.snap b/packages/seroval/test/__snapshots__/iterable.test.ts.snap index cc4447b6..a98ab1c3 100644 --- a/packages/seroval/test/__snapshots__/iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/iterable.test.ts.snap @@ -6,15 +6,15 @@ exports[`Iterable > compat > should use functions instead of method shorthand. 1 exports[`Iterable > compat > should use method shorthand instead of arrow functions. 1`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16381,\\"m\\":[0]}"`; +exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16381,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 2`] = `"(h=>(h={[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[h,void 0],t:-1,d:1})}))()"`; -exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16315,\\"m\\":[0]}"`; +exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16315,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 2`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16379,\\"m\\":[0]}"`; +exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16379,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 2`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; @@ -38,6 +38,6 @@ exports[`Iterable > serialize > supports Iterables 1`] = `"({title:\\"Hello Worl exports[`Iterable > serializeAsync > supports Iterables 1`] = `"Promise.resolve({title:\\"Hello World\\",[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})"`; -exports[`Iterable > toJSON > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Iterable > toJSON > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; -exports[`Iterable > toJSONAsync > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":2},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Iterable > toJSONAsync > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":2},\\"o\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; diff --git a/packages/seroval/test/__snapshots__/map.test.ts.snap b/packages/seroval/test/__snapshots__/map.test.ts.snap index e0d5a512..8a4ec80d 100644 --- a/packages/seroval/test/__snapshots__/map.test.ts.snap +++ b/packages/seroval/test/__snapshots__/map.test.ts.snap @@ -4,7 +4,7 @@ exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"Object.assign exports[`Map > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; -exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":0}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16351,\\"m\\":[]}"`; +exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":0}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16351,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; exports[`Map > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; @@ -52,10 +52,10 @@ exports[`Map > serializeAsync > supports Map 1`] = `"Promise.resolve(new Map([[1 exports[`Map > serializeAsync > supports self-recursion 1`] = `"(h=>(h=new Map([[Promise.resolve().then(()=>h),Promise.resolve().then(()=>h)]])))()"`; -exports[`Map > toJSON > supports Map 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[-1]}"`; +exports[`Map > toJSON > supports Map 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[-1],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Map > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":4,\\"i\\":0}],\\"v\\":[{\\"t\\":4,\\"i\\":0}],\\"s\\":1}},\\"f\\":16383,\\"m\\":[-1,0]}"`; +exports[`Map > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":4,\\"i\\":0}],\\"v\\":[{\\"t\\":4,\\"i\\":0}],\\"s\\":1}},\\"f\\":16383,\\"m\\":[-1,0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Map > toJSONAsync > supports Map 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[-1]}"`; +exports[`Map > toJSONAsync > supports Map 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[-1],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Map > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":1}},\\"f\\":16383,\\"m\\":[-1,0]}"`; +exports[`Map > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":1}},\\"f\\":16383,\\"m\\":[-1,0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap b/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap index 8b5e7331..3d4fb461 100644 --- a/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap +++ b/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap @@ -72,14 +72,14 @@ exports[`mutual cyclic references > serializeAsync > supports Arrays and Objects exports[`mutual cyclic references > serializeAsync > supports Objects and Objects 1`] = `"((h,j)=>([h={0:Promise.resolve(j={0:Promise.resolve().then(()=>h)})},j]))()"`; -exports[`mutual cyclic references > toJSON > supports Arrays and Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":1}],\\"o\\":0}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2]}"`; +exports[`mutual cyclic references > toJSON > supports Arrays and Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":1}],\\"o\\":0}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`mutual cyclic references > toJSON > supports Arrays and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2]}"`; +exports[`mutual cyclic references > toJSON > supports Arrays and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`mutual cyclic references > toJSON > supports Objects and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0}],\\"s\\":1},\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2]}"`; +exports[`mutual cyclic references > toJSON > supports Objects and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0}],\\"s\\":1},\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`mutual cyclic references > toJSONAsync > supports Arrays and Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":3,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"o\\":0}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3]}"`; +exports[`mutual cyclic references > toJSONAsync > supports Arrays and Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":3,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"o\\":0}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`mutual cyclic references > toJSONAsync > supports Arrays and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3]}"`; +exports[`mutual cyclic references > toJSONAsync > supports Arrays and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`mutual cyclic references > toJSONAsync > supports Objects and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0}}],\\"s\\":1},\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3]}"`; +exports[`mutual cyclic references > toJSONAsync > supports Objects and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0}}],\\"s\\":1},\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap index 23902c78..566a5ce7 100644 --- a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap +++ b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap @@ -2,7 +2,7 @@ exports[`null-constructor > compat > should use manual assignment instead of Object.assign 1`] = `"(h=>((h=Object.create(null),h.hello=\\"world\\",h)))()"`; -exports[`null-constructor > compat#toJSON > should use manual assignment instead of Object.assign 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16255,\\"m\\":[]}"`; +exports[`null-constructor > compat#toJSON > should use manual assignment instead of Object.assign 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16255,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; exports[`null-constructor > compat#toJSON > should use manual assignment instead of Object.assign 2`] = `"(h=>((h=Object.create(null),h.hello=\\"world\\",h)))()"`; @@ -74,14 +74,14 @@ exports[`null-constructor > serializeAsync > supports Symbol.iterator 1`] = `"Pr exports[`null-constructor > serializeAsync > supports self-recursion 1`] = `"(h=>(h=Object.assign(Object.create(null),{a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)})))()"`; -exports[`null-constructor > toJSON > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`null-constructor > toJSON > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`null-constructor > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`null-constructor > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; -exports[`null-constructor > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`null-constructor > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`null-constructor > toJSONAsync > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`null-constructor > toJSONAsync > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`null-constructor > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`null-constructor > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; -exports[`null-constructor > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`null-constructor > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/number.test.ts.snap b/packages/seroval/test/__snapshots__/number.test.ts.snap index 6c57479c..94b30087 100644 --- a/packages/seroval/test/__snapshots__/number.test.ts.snap +++ b/packages/seroval/test/__snapshots__/number.test.ts.snap @@ -40,22 +40,22 @@ exports[`number > crossSerializeStream > supports numbers 1`] = `"$R[0]=_$.P()"` exports[`number > crossSerializeStream > supports numbers 2`] = `"_$.Ps($R[0],3735928559)"`; -exports[`number > toJSON > supports numbers 1`] = `"{\\"t\\":{\\"t\\":0,\\"s\\":3735928559},\\"f\\":16383,\\"m\\":[]}"`; +exports[`number > toJSON > supports numbers 1`] = `"{\\"t\\":{\\"t\\":0,\\"s\\":3735928559},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`number > toJSON > supports numbers 2`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":7},\\"f\\":16383,\\"m\\":[]}"`; +exports[`number > toJSON > supports numbers 2`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":7},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`number > toJSON > supports numbers 3`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":5},\\"f\\":16383,\\"m\\":[]}"`; +exports[`number > toJSON > supports numbers 3`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":5},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`number > toJSON > supports numbers 4`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":6},\\"f\\":16383,\\"m\\":[]}"`; +exports[`number > toJSON > supports numbers 4`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":6},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`number > toJSON > supports numbers 5`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":4},\\"f\\":16383,\\"m\\":[]}"`; +exports[`number > toJSON > supports numbers 5`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":4},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`number > toJSONAsync > supports numbers 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`number > toJSONAsync > supports numbers 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`number > toJSONAsync > supports numbers 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":7}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`number > toJSONAsync > supports numbers 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":7}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`number > toJSONAsync > supports numbers 3`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":5}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`number > toJSONAsync > supports numbers 3`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":5}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`number > toJSONAsync > supports numbers 4`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":6}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`number > toJSONAsync > supports numbers 4`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":6}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`number > toJSONAsync > supports numbers 5`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":4}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`number > toJSONAsync > supports numbers 5`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":4}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/object.test.ts.snap b/packages/seroval/test/__snapshots__/object.test.ts.snap index 2d21beb7..b93ca6b9 100644 --- a/packages/seroval/test/__snapshots__/object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/object.test.ts.snap @@ -2,7 +2,7 @@ exports[`objects > compat > should use manual assignment instead of Object.assign 1`] = `"({hello:\\"world\\"})"`; -exports[`objects > compat#toJSON > should use manual assignment instead of Object.assign 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16255,\\"m\\":[]}"`; +exports[`objects > compat#toJSON > should use manual assignment instead of Object.assign 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16255,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; exports[`objects > compat#toJSON > should use manual assignment instead of Object.assign 2`] = `"({hello:\\"world\\"})"`; @@ -74,14 +74,14 @@ exports[`objects > serializeAsync > supports Symbol.iterator 1`] = `"Promise.res exports[`objects > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)}))()"`; -exports[`objects > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`objects > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`objects > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`objects > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; -exports[`objects > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`objects > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`objects > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`objects > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`objects > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`objects > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; -exports[`objects > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`objects > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/plugin.test.ts.snap b/packages/seroval/test/__snapshots__/plugin.test.ts.snap index e27cd775..30d4da25 100644 --- a/packages/seroval/test/__snapshots__/plugin.test.ts.snap +++ b/packages/seroval/test/__snapshots__/plugin.test.ts.snap @@ -16,6 +16,6 @@ exports[`Plugin > serialize > supports Plugin 1`] = `"Buffer.from(\\"SGVsbG8sIFd exports[`Plugin > serializeAsync > supports Plugin 1`] = `"Promise.resolve(Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\"))"`; -exports[`Plugin > serializeAsync > supports Plugin 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":40,\\"i\\":1,\\"s\\":{\\"t\\":1,\\"s\\":\\"SGVsbG8sIFdvcmxkIQ==\\"},\\"c\\":\\"Buffer\\"}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Plugin > serializeAsync > supports Plugin 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":40,\\"i\\":1,\\"s\\":{\\"t\\":1,\\"s\\":\\"SGVsbG8sIFdvcmxkIQ==\\"},\\"c\\":\\"Buffer\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Plugin > toJSON > supports Plugin 1`] = `"{\\"t\\":{\\"t\\":40,\\"i\\":0,\\"s\\":{\\"t\\":1,\\"s\\":\\"SGVsbG8sIFdvcmxkIQ==\\"},\\"c\\":\\"Buffer\\"},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Plugin > toJSON > supports Plugin 1`] = `"{\\"t\\":{\\"t\\":40,\\"i\\":0,\\"s\\":{\\"t\\":1,\\"s\\":\\"SGVsbG8sIFdvcmxkIQ==\\"},\\"c\\":\\"Buffer\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/reference.test.ts.snap b/packages/seroval/test/__snapshots__/reference.test.ts.snap index 4f67b7cc..bd7e6bf2 100644 --- a/packages/seroval/test/__snapshots__/reference.test.ts.snap +++ b/packages/seroval/test/__snapshots__/reference.test.ts.snap @@ -20,6 +20,6 @@ exports[`Reference > serialize > supports Reference 1`] = `"__SEROVAL_REFS__.get exports[`Reference > serializeAsync > supports Reference 1`] = `"Promise.resolve(__SEROVAL_REFS__.get(\\"example\\"))"`; -exports[`Reference > toJSON > supports Reference 1`] = `"{\\"t\\":{\\"t\\":20,\\"i\\":0,\\"s\\":\\"example\\"},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Reference > toJSON > supports Reference 1`] = `"{\\"t\\":{\\"t\\":20,\\"i\\":0,\\"s\\":\\"example\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Reference > toJSONAsync > supports Reference 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":20,\\"i\\":1,\\"s\\":\\"example\\"}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Reference > toJSONAsync > supports Reference 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":20,\\"i\\":1,\\"s\\":\\"example\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/regexp.test.ts.snap b/packages/seroval/test/__snapshots__/regexp.test.ts.snap index 7b483994..530e448c 100644 --- a/packages/seroval/test/__snapshots__/regexp.test.ts.snap +++ b/packages/seroval/test/__snapshots__/regexp.test.ts.snap @@ -20,6 +20,6 @@ exports[`RegExp > serialize > supports RegExp 1`] = `"/[a-z0-9]+/i"`; exports[`RegExp > serializeAsync > supports RegExp 1`] = `"Promise.resolve(/[a-z0-9]+/i)"`; -exports[`RegExp > toJSON > supports RegExp 1`] = `"{\\"t\\":{\\"t\\":6,\\"i\\":0,\\"c\\":\\"[a-z0-9]+\\",\\"m\\":\\"i\\"},\\"f\\":16383,\\"m\\":[]}"`; +exports[`RegExp > toJSON > supports RegExp 1`] = `"{\\"t\\":{\\"t\\":6,\\"i\\":0,\\"c\\":\\"[a-z0-9]+\\",\\"m\\":\\"i\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`RegExp > toJSONAsync > supports RegExp 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":6,\\"i\\":1,\\"c\\":\\"[a-z0-9]+\\",\\"m\\":\\"i\\"}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`RegExp > toJSONAsync > supports RegExp 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":6,\\"i\\":1,\\"c\\":\\"[a-z0-9]+\\",\\"m\\":\\"i\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap index 64e12fd8..0fc93292 100644 --- a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap @@ -68,14 +68,14 @@ exports[`sealed object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j exports[`sealed object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.seal(h),h))()"`; -exports[`sealed object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2},\\"f\\":16383,\\"m\\":[]}"`; +exports[`sealed object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`sealed object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":2},\\"f\\":16383,\\"m\\":[]}"`; +exports[`sealed object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":2},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; -exports[`sealed object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":2},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`sealed object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":2},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`sealed object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`sealed object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`sealed object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":2}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`sealed object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; -exports[`sealed object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":2},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`sealed object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":2},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/set.test.ts.snap b/packages/seroval/test/__snapshots__/set.test.ts.snap index 65706c5c..ea9a7cff 100644 --- a/packages/seroval/test/__snapshots__/set.test.ts.snap +++ b/packages/seroval/test/__snapshots__/set.test.ts.snap @@ -4,7 +4,7 @@ exports[`Set > compat > should fallback to Symbol.iterator 1`] = `"Object.assign exports[`Set > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; -exports[`Set > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":15871,\\"m\\":[]}"`; +exports[`Set > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":15871,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; exports[`Set > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; @@ -48,10 +48,10 @@ exports[`Set > serializeAsync > supports Set 1`] = `"Promise.resolve(new Set([1, exports[`Set > serializeAsync > supports self-recursion 1`] = `"(h=>(h=new Set([Promise.resolve().then(()=>h)])))()"`; -exports[`Set > toJSON > supports Set 1`] = `"{\\"t\\":{\\"t\\":7,\\"i\\":0,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}]},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Set > toJSON > supports Set 1`] = `"{\\"t\\":{\\"t\\":7,\\"i\\":0,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}]},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Set > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":7,\\"i\\":0,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":0}]},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`Set > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":7,\\"i\\":0,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":0}]},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Set > toJSONAsync > supports Set 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":7,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}]}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Set > toJSONAsync > supports Set 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":7,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}]}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Set > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":7,\\"i\\":0,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}]},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`Set > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":7,\\"i\\":0,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}]},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap b/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap index e121d37c..cae8b9d5 100644 --- a/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap +++ b/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap @@ -20,6 +20,6 @@ exports[`sparse arrays > serialize > supports sparse arrays 1`] = `"[,,,,,,,,,,] exports[`sparse arrays > serializeAsync > supports sparse arrays 1`] = `"Promise.resolve([,,,,,,,,,,])"`; -exports[`sparse arrays > toJSON > supports sparse arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":10,\\"a\\":[],\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`sparse arrays > toJSON > supports sparse arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":10,\\"a\\":[],\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`sparse arrays > toJSONAsync > supports sparse arrays 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":1,\\"l\\":10,\\"a\\":[],\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`sparse arrays > toJSONAsync > supports sparse arrays 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":1,\\"l\\":10,\\"a\\":[],\\"o\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/string.test.ts.snap b/packages/seroval/test/__snapshots__/string.test.ts.snap index b9d81b0a..8eeec09c 100644 --- a/packages/seroval/test/__snapshots__/string.test.ts.snap +++ b/packages/seroval/test/__snapshots__/string.test.ts.snap @@ -24,10 +24,10 @@ exports[`string > serializeAsync > supports strings 1`] = `"Promise.resolve(\\"\ exports[`string > serializeAsync > supports strings 2`] = `"Promise.resolve(\\"\\\\x3Cscript>\\\\x3C/script>\\")"`; -exports[`string > toJSON > supports strings 1`] = `"{\\"t\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"},\\"f\\":16383,\\"m\\":[]}"`; +exports[`string > toJSON > supports strings 1`] = `"{\\"t\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`string > toJSON > supports strings 2`] = `"{\\"t\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"},\\"f\\":16383,\\"m\\":[]}"`; +exports[`string > toJSON > supports strings 2`] = `"{\\"t\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`string > toJSONAsync > supports strings 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`string > toJSONAsync > supports strings 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`string > toJSONAsync > supports strings 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`string > toJSONAsync > supports strings 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/typed-array.test.ts.snap b/packages/seroval/test/__snapshots__/typed-array.test.ts.snap index 766504ba..115d7816 100644 --- a/packages/seroval/test/__snapshots__/typed-array.test.ts.snap +++ b/packages/seroval/test/__snapshots__/typed-array.test.ts.snap @@ -20,6 +20,6 @@ exports[`typed arrays > serialize > supports typed arrays 1`] = `"new Uint32Arra exports[`typed arrays > serializeAsync > supports typed arrays 1`] = `"Promise.resolve(new Uint32Array(new Uint8Array([255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]).buffer,0,4))"`; -exports[`typed arrays > toJSON > supports typed arrays 1`] = `"{\\"t\\":{\\"t\\":15,\\"i\\":0,\\"l\\":4,\\"c\\":\\"Uint32Array\\",\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]},\\"b\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`typed arrays > toJSON > supports typed arrays 1`] = `"{\\"t\\":{\\"t\\":15,\\"i\\":0,\\"l\\":4,\\"c\\":\\"Uint32Array\\",\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]},\\"b\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`typed arrays > toJSONAsync > supports typed arrays 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":15,\\"i\\":1,\\"l\\":4,\\"c\\":\\"Uint32Array\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]},\\"b\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`typed arrays > toJSONAsync > supports typed arrays 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":15,\\"i\\":1,\\"l\\":4,\\"c\\":\\"Uint32Array\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]},\\"b\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap b/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap index 19a147d1..8781d972 100644 --- a/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap +++ b/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap @@ -260,54 +260,54 @@ exports[`well-known symbols > serializeAsync > supports well-known symbols 12`] exports[`well-known symbols > serializeAsync > supports well-known symbols 13`] = `"Promise.resolve(Symbol.unscopables)"`; -exports[`well-known symbols > toJSON > supports well-known symbols 1`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":0},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 1`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 2`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":1},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 2`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":1},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 3`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":2},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 3`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":2},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 4`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":3},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 4`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":3},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 5`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":4},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 5`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":4},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 6`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":5},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 6`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":5},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 7`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":6},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 7`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":6},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 8`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":7},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 8`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":7},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 9`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":8},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 9`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":8},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 10`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":9},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 10`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":9},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 11`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":10},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 11`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":10},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 12`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":11},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 12`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":11},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 13`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":12},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 13`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":12},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":1}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":1}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 3`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 3`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 4`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":3}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 4`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":3}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 5`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":4}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 5`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":4}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 6`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":5}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 6`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":5}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 7`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":6}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 7`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":6}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 8`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":7}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 8`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":7}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 9`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":8}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 9`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":8}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 10`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":9}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 10`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":9}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 11`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":10}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 11`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":10}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 12`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":11}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 12`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":11}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 13`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":12}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 13`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":12}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap index 53debf42..1c59685d 100644 --- a/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap @@ -6,4 +6,4 @@ exports[`Blob > crossSerializeAsync > supports Blob 1`] = `"$R[0]=Promise.resolv exports[`Blob > serializeAsync > supports Blob 1`] = `"Promise.resolve(new Blob([new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],{type:\\"text/plain\\"}))"`; -exports[`Blob > toJSONAsync > supports Blob 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":23,\\"i\\":1,\\"c\\":\\"text/plain\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Blob > toJSONAsync > supports Blob 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":23,\\"i\\":1,\\"c\\":\\"text/plain\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap index d8ea0bd6..c240654c 100644 --- a/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap @@ -20,6 +20,6 @@ exports[`CustomEvent > serialize > supports CustomEvent 1`] = `"((h,j)=>(j=new C exports[`CustomEvent > serializeAsync > supports CustomEvent 1`] = `"((h,j)=>(j=Promise.resolve(new CustomEvent(\\"example\\",{detail:h={},bubbles:!1,cancelable:!1,composed:!1})),h.self=h,j))()"`; -exports[`CustomEvent > toJSON > supports CustomEvent 1`] = `"{\\"t\\":{\\"t\\":38,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":2}],\\"s\\":1},\\"o\\":0},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0}},\\"f\\":16383,\\"m\\":[2]}"`; +exports[`CustomEvent > toJSON > supports CustomEvent 1`] = `"{\\"t\\":{\\"t\\":38,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":2}],\\"s\\":1},\\"o\\":0},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0}},\\"f\\":16383,\\"m\\":[2],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`CustomEvent > toJSONAsync > supports CustomEvent 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":38,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":3}],\\"s\\":1},\\"o\\":0},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0}}},\\"f\\":16383,\\"m\\":[3]}"`; +exports[`CustomEvent > toJSONAsync > supports CustomEvent 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":38,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":3}],\\"s\\":1},\\"o\\":0},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0}}},\\"f\\":16383,\\"m\\":[3],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap index 7ef3b042..7cb25461 100644 --- a/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap @@ -20,6 +20,6 @@ exports[`DOMException > serialize > supports DOMException 1`] = `"new DOMExcepti exports[`DOMException > serializeAsync > supports DOMException 1`] = `"Promise.resolve(new DOMException(\\"This is an example message.\\",\\"Example\\"))"`; -exports[`DOMException > toJSON > supports DOMException 1`] = `"{\\"t\\":{\\"t\\":39,\\"i\\":0,\\"s\\":\\"This is an example message.\\",\\"c\\":\\"Example\\"},\\"f\\":16383,\\"m\\":[]}"`; +exports[`DOMException > toJSON > supports DOMException 1`] = `"{\\"t\\":{\\"t\\":39,\\"i\\":0,\\"s\\":\\"This is an example message.\\",\\"c\\":\\"Example\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`DOMException > toJSONAsync > supports DOMException 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":39,\\"i\\":1,\\"s\\":\\"This is an example message.\\",\\"c\\":\\"Example\\"}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`DOMException > toJSONAsync > supports DOMException 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":39,\\"i\\":1,\\"s\\":\\"This is an example message.\\",\\"c\\":\\"Example\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap index b30424f2..42485f82 100644 --- a/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap @@ -20,6 +20,6 @@ exports[`Event > serialize > supports Event 1`] = `"new Event(\\"example\\",{bub exports[`Event > serializeAsync > supports Event 1`] = `"Promise.resolve(new Event(\\"example\\",{bubbles:!1,cancelable:!1,composed:!1}))"`; -exports[`Event > toJSON > supports Event 1`] = `"{\\"t\\":{\\"t\\":37,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Event > toJSON > supports Event 1`] = `"{\\"t\\":{\\"t\\":37,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Event > toJSONAsync > supports Event 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":37,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Event > toJSONAsync > supports Event 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":37,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap index cddf69a6..b11cd21c 100644 --- a/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap @@ -6,4 +6,4 @@ exports[`File > crossSerializeAsync > supports File 1`] = `"$R[0]=Promise.resolv exports[`File > serializeAsync > supports File 1`] = `"Promise.resolve(new File([new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680}))"`; -exports[`File > toJSONAsync > supports File 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":24,\\"i\\":1,\\"c\\":\\"text/plain\\",\\"m\\":\\"hello.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]},\\"b\\":1681027542680}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`File > toJSONAsync > supports File 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":24,\\"i\\":1,\\"c\\":\\"text/plain\\",\\"m\\":\\"hello.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]},\\"b\\":1681027542680}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap index 13036c83..99f9b1ff 100644 --- a/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap @@ -20,6 +20,6 @@ exports[`FormData > serialize > supports FormData 1`] = `"(h=>((h=new FormData() exports[`FormData > serializeAsync > supports FormData 1`] = `"(h=>(Promise.resolve((h=new FormData(),h.append(\\"hello-world\\",new File([new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),h.append(\\"foo-bar\\",new File([new Uint8Array([70,111,111,32,66,97,114]).buffer],\\"foo-bar.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),h))))()"`; -exports[`FormData > toJSON > supports FormData 1`] = `"{\\"t\\":{\\"t\\":26,\\"i\\":0,\\"e\\":{\\"k\\":[\\"hello\\",\\"foo\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"},{\\"t\\":1,\\"s\\":\\"bar\\"}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`FormData > toJSON > supports FormData 1`] = `"{\\"t\\":{\\"t\\":26,\\"i\\":0,\\"e\\":{\\"k\\":[\\"hello\\",\\"foo\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"},{\\"t\\":1,\\"s\\":\\"bar\\"}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`FormData > toJSONAsync > supports FormData 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":26,\\"i\\":1,\\"e\\":{\\"k\\":[\\"example\\",\\"foo-bar\\"],\\"v\\":[{\\"t\\":24,\\"i\\":2,\\"c\\":\\"text/plain\\",\\"m\\":\\"hello.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":3,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]},\\"b\\":1681027542680},{\\"t\\":24,\\"i\\":4,\\"c\\":\\"text/plain\\",\\"m\\":\\"foo-bar.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":5,\\"s\\":[70,111,111,32,66,97,114]},\\"b\\":1681027542680}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`FormData > toJSONAsync > supports FormData 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":26,\\"i\\":1,\\"e\\":{\\"k\\":[\\"example\\",\\"foo-bar\\"],\\"v\\":[{\\"t\\":24,\\"i\\":2,\\"c\\":\\"text/plain\\",\\"m\\":\\"hello.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":3,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]},\\"b\\":1681027542680},{\\"t\\":24,\\"i\\":4,\\"c\\":\\"text/plain\\",\\"m\\":\\"foo-bar.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":5,\\"s\\":[70,111,111,32,66,97,114]},\\"b\\":1681027542680}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap index 37a43a5a..d40ea12c 100644 --- a/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap @@ -20,6 +20,6 @@ exports[`Headers > serialize > supports Headers 1`] = `"new Headers({\\"content- exports[`Headers > serializeAsync > supports Headers 1`] = `"Promise.resolve(new Headers({\\"content-encoding\\":\\"gzip\\",\\"content-type\\":\\"text/plain\\"}))"`; -exports[`Headers > toJSON > supports Headers 1`] = `"{\\"t\\":{\\"t\\":25,\\"i\\":0,\\"e\\":{\\"k\\":[\\"content-encoding\\",\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"gzip\\"},{\\"t\\":1,\\"s\\":\\"text/plain\\"}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Headers > toJSON > supports Headers 1`] = `"{\\"t\\":{\\"t\\":25,\\"i\\":0,\\"e\\":{\\"k\\":[\\"content-encoding\\",\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"gzip\\"},{\\"t\\":1,\\"s\\":\\"text/plain\\"}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`Headers > toJSONAsync > supports Headers 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":25,\\"i\\":1,\\"e\\":{\\"k\\":[\\"content-encoding\\",\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"gzip\\"},{\\"t\\":1,\\"s\\":\\"text/plain\\"}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Headers > toJSONAsync > supports Headers 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":25,\\"i\\":1,\\"e\\":{\\"k\\":[\\"content-encoding\\",\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"gzip\\"},{\\"t\\":1,\\"s\\":\\"text/plain\\"}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap index d12a3ad0..c5b60f17 100644 --- a/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap @@ -18,4 +18,4 @@ exports[`Request > crossSerializeStream > supports Request 3`] = `"_$.Se($R[2],2 exports[`Request > serializeAsync > supports Request 1`] = `"new Request(\\"http://localhost:3000/\\",{body:new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,cache:\\"default\\",credentials:\\"same-origin\\",headers:new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),integrity:\\"\\",keepalive:!1,method:\\"POST\\",mode:\\"cors\\",redirect:\\"follow\\",referrer:\\"about:client\\",referrerPolicy:\\"\\"})"`; -exports[`Request > toJSONAsync > supports Request 1`] = `"{\\"t\\":{\\"t\\":35,\\"i\\":0,\\"s\\":\\"http://localhost:3000/\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"body\\",\\"cache\\",\\"credentials\\",\\"headers\\",\\"integrity\\",\\"keepalive\\",\\"method\\",\\"mode\\",\\"redirect\\",\\"referrer\\",\\"referrerPolicy\\"],\\"v\\":[{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":1,\\"s\\":\\"default\\"},{\\"t\\":1,\\"s\\":\\"same-origin\\"},{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":2,\\"s\\":3},{\\"t\\":1,\\"s\\":\\"POST\\"},{\\"t\\":1,\\"s\\":\\"cors\\"},{\\"t\\":1,\\"s\\":\\"follow\\"},{\\"t\\":1,\\"s\\":\\"about:client\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":11},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Request > toJSONAsync > supports Request 1`] = `"{\\"t\\":{\\"t\\":35,\\"i\\":0,\\"s\\":\\"http://localhost:3000/\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"body\\",\\"cache\\",\\"credentials\\",\\"headers\\",\\"integrity\\",\\"keepalive\\",\\"method\\",\\"mode\\",\\"redirect\\",\\"referrer\\",\\"referrerPolicy\\"],\\"v\\":[{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":1,\\"s\\":\\"default\\"},{\\"t\\":1,\\"s\\":\\"same-origin\\"},{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":2,\\"s\\":3},{\\"t\\":1,\\"s\\":\\"POST\\"},{\\"t\\":1,\\"s\\":\\"cors\\"},{\\"t\\":1,\\"s\\":\\"follow\\"},{\\"t\\":1,\\"s\\":\\"about:client\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":11},\\"o\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap index 41e8a77e..be9435e6 100644 --- a/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap @@ -18,4 +18,4 @@ exports[`Response > crossSerializeStream > supports Response 3`] = `"_$.Se($R[1] exports[`Response > serializeAsync > supports Response 1`] = `"new Response(new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,{headers:new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),status:200,statusText:\\"\\"})"`; -exports[`Response > toJSONAsync > supports Response 1`] = `"{\\"t\\":{\\"t\\":36,\\"i\\":0,\\"a\\":[{\\"t\\":21,\\"i\\":1,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"headers\\",\\"status\\",\\"statusText\\"],\\"v\\":[{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":0,\\"s\\":200},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":3},\\"o\\":0}]},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Response > toJSONAsync > supports Response 1`] = `"{\\"t\\":{\\"t\\":36,\\"i\\":0,\\"a\\":[{\\"t\\":21,\\"i\\":1,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"headers\\",\\"status\\",\\"statusText\\"],\\"v\\":[{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":0,\\"s\\":200},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":3},\\"o\\":0}]},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap index 4c99f18c..c0228ee5 100644 --- a/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap @@ -20,6 +20,6 @@ exports[`URLSearchParams > serialize > supports URLSearchParams 1`] = `"new URLS exports[`URLSearchParams > serializeAsync > supports URLSearchParams 1`] = `"Promise.resolve(new URLSearchParams(\\"hello=world&foo=bar\\"))"`; -exports[`URLSearchParams > toJSON > supports URLSearchParams 1`] = `"{\\"t\\":{\\"t\\":19,\\"i\\":0,\\"s\\":\\"hello=world&foo=bar\\"},\\"f\\":16383,\\"m\\":[]}"`; +exports[`URLSearchParams > toJSON > supports URLSearchParams 1`] = `"{\\"t\\":{\\"t\\":19,\\"i\\":0,\\"s\\":\\"hello=world&foo=bar\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`URLSearchParams > toJSONAsync > supports URLSearchParams 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":19,\\"i\\":1,\\"s\\":\\"hello=world&foo=bar\\"}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`URLSearchParams > toJSONAsync > supports URLSearchParams 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":19,\\"i\\":1,\\"s\\":\\"hello=world&foo=bar\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap index b6fd200a..85179e7a 100644 --- a/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap @@ -20,6 +20,6 @@ exports[`URL > serialize > supports URL 1`] = `"new URL(\\"https://github.com/lx exports[`URL > serializeAsync > supports URL 1`] = `"Promise.resolve(new URL(\\"https://github.com/lxsmnsyc/seroval?hello=world\\"))"`; -exports[`URL > toJSON > supports URL 1`] = `"{\\"t\\":{\\"t\\":18,\\"i\\":0,\\"s\\":\\"https://github.com/lxsmnsyc/seroval?hello=world\\"},\\"f\\":16383,\\"m\\":[]}"`; +exports[`URL > toJSON > supports URL 1`] = `"{\\"t\\":{\\"t\\":18,\\"i\\":0,\\"s\\":\\"https://github.com/lxsmnsyc/seroval?hello=world\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; -exports[`URL > toJSONAsync > supports URL 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":18,\\"i\\":1,\\"s\\":\\"https://github.com/lxsmnsyc/seroval?hello=world\\"}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`URL > toJSONAsync > supports URL 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":18,\\"i\\":1,\\"s\\":\\"https://github.com/lxsmnsyc/seroval?hello=world\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; From a0054f72bec92983e79bf1e3de13bb5d5d3ae954 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 9 Nov 2023 18:16:50 +0800 Subject: [PATCH 04/82] Remove special reference state, add new `x` field --- packages/seroval/src/core/Serializer.ts | 4 - packages/seroval/src/core/base-primitives.ts | 10 + packages/seroval/src/core/base/async.ts | 41 +++- packages/seroval/src/core/base/stream.ts | 9 + packages/seroval/src/core/base/sync.ts | 36 +++- packages/seroval/src/core/constants.ts | 1 + packages/seroval/src/core/cross/index.ts | 6 - packages/seroval/src/core/literals.ts | 1 + packages/seroval/src/core/parser-context.ts | 37 +++- .../seroval/src/core/serializer-context.ts | 187 ++++++++++-------- .../seroval/src/core/special-reference.ts | 25 ++- packages/seroval/src/core/tree/index.ts | 7 - packages/seroval/src/core/types.ts | 25 ++- packages/seroval/src/core/web-api.ts | 3 + .../test/__snapshots__/array.test.ts.snap | 8 +- .../test/__snapshots__/bigint.test.ts.snap | 4 +- .../test/__snapshots__/boolean.test.ts.snap | 8 +- .../__snapshots__/boxed-bigint.test.ts.snap | 4 +- .../__snapshots__/boxed-number.test.ts.snap | 20 +- .../__snapshots__/boxed-string.test.ts.snap | 8 +- .../test/__snapshots__/data-view.test.ts.snap | 4 +- .../test/__snapshots__/date.test.ts.snap | 4 +- .../test/__snapshots__/error.test.ts.snap | 12 +- .../__snapshots__/frozen-object.test.ts.snap | 24 +-- .../test/__snapshots__/iterable.test.ts.snap | 22 +-- .../test/__snapshots__/map.test.ts.snap | 42 ++-- .../__snapshots__/mutual-cycle.test.ts.snap | 12 +- .../null-constructor.test.ts.snap | 26 +-- .../test/__snapshots__/number.test.ts.snap | 20 +- .../test/__snapshots__/object.test.ts.snap | 26 +-- .../test/__snapshots__/plugin.test.ts.snap | 8 +- .../test/__snapshots__/reference.test.ts.snap | 4 +- .../test/__snapshots__/regexp.test.ts.snap | 4 +- .../__snapshots__/sealed-object.test.ts.snap | 24 +-- .../test/__snapshots__/set.test.ts.snap | 10 +- .../__snapshots__/sparse-array.test.ts.snap | 4 +- .../test/__snapshots__/string.test.ts.snap | 8 +- .../__snapshots__/typed-array.test.ts.snap | 4 +- .../__snapshots__/wk-symbols.test.ts.snap | 52 ++--- .../web-api/__snapshots__/blob.test.ts.snap | 2 +- .../__snapshots__/custom-event.test.ts.snap | 4 +- .../__snapshots__/dom-exception.test.ts.snap | 4 +- .../web-api/__snapshots__/event.test.ts.snap | 4 +- .../web-api/__snapshots__/file.test.ts.snap | 2 +- .../__snapshots__/form-data.test.ts.snap | 4 +- .../__snapshots__/headers.test.ts.snap | 4 +- .../__snapshots__/request.test.ts.snap | 2 +- .../__snapshots__/response.test.ts.snap | 2 +- .../url-search-params.test.ts.snap | 4 +- .../web-api/__snapshots__/url.test.ts.snap | 4 +- 50 files changed, 452 insertions(+), 338 deletions(-) diff --git a/packages/seroval/src/core/Serializer.ts b/packages/seroval/src/core/Serializer.ts index 2443a825..69c6401c 100644 --- a/packages/seroval/src/core/Serializer.ts +++ b/packages/seroval/src/core/Serializer.ts @@ -1,5 +1,4 @@ import { crossSerializeStream } from './cross'; -import { createSpecialReferenceState } from './special-reference'; import { serializeString } from './string'; export interface SerializerOptions { @@ -24,8 +23,6 @@ export default class Serializer { private refs = new Map(); - private specials = createSpecialReferenceState(); - constructor( private options: SerializerOptions, ) { @@ -40,7 +37,6 @@ export default class Serializer { this.cleanups.push(crossSerializeStream(value, { scopeId: this.options.scopeId, refs: this.refs, - specials: this.specials, disabledFeatures: this.options.disabledFeatures, onError: this.options.onError, onSerialize: (data, initial) => { diff --git a/packages/seroval/src/core/base-primitives.ts b/packages/seroval/src/core/base-primitives.ts index a60e744d..8b468e54 100644 --- a/packages/seroval/src/core/base-primitives.ts +++ b/packages/seroval/src/core/base-primitives.ts @@ -50,6 +50,7 @@ export function createNumberNode(value: number): SerovalConstantNode | SerovalNu f: undefined, b: undefined, o: undefined, + x: undefined, }; } } @@ -68,6 +69,7 @@ export function createStringNode(value: string): SerovalStringNode { f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -87,6 +89,7 @@ export function createBigIntNode( f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -104,6 +107,7 @@ export function createIndexedValueNode(id: number): SerovalIndexedValueNode { f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -121,6 +125,7 @@ export function createDateNode(id: number, current: Date): SerovalDateNode { a: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -138,6 +143,7 @@ export function createRegExpNode(id: number, current: RegExp): SerovalRegExpNode f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -164,6 +170,7 @@ export function createArrayBufferNode( f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -185,6 +192,7 @@ export function createWKSymbolNode( f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -205,6 +213,7 @@ export function createReferenceNode( f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -226,5 +235,6 @@ export function createPluginNode( f: undefined, b: undefined, o: undefined, + x: undefined, }; } diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index acffcb71..a8ebd8d9 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -103,6 +103,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: getObjectFlag(current), + x: undefined, }; } @@ -123,6 +124,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: await this.parse(current.valueOf()), b: undefined, o: undefined, + x: undefined, }; } @@ -143,6 +145,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: await this.parse(current.buffer), b: current.byteOffset, o: undefined, + x: undefined, }; } @@ -163,6 +166,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: await this.parse(current.buffer), b: current.byteOffset, o: undefined, + x: undefined, }; } @@ -183,6 +187,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: await this.parse(current.buffer), b: current.byteOffset, o: undefined, + x: undefined, }; } @@ -203,12 +208,6 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { // Check special properties if (this.features & Feature.Symbol) { if (Symbol.iterator in properties) { - const specialRef = SpecialReference.SymbolIteratorFactory; - if (this.specials[specialRef]) { - this.markRef(-(specialRef + 1)); - } else { - this.specials[specialRef] = 1; - } keyNodes.push(SerovalObjectRecordSpecialKey.SymbolIterator); valueNodes.push(await this.parse(iteratorToSequence(properties as Iterable))); } @@ -238,6 +237,20 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: getObjectFlag(current), + x: { + [SpecialReference.SymbolIterator]: ( + this.features & Feature.Symbol && Symbol.iterator in current + ? await this.parse(Symbol.iterator) + : undefined + ), + [SpecialReference.Iterator]: ( + this.features & Feature.Symbol && Symbol.iterator in current + ? this.parseSpecialReference( + SpecialReference.Iterator, + ) + : undefined + ), + }, }; } @@ -262,6 +275,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -269,7 +283,6 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { id: number, current: Map, ): Promise { - this.markRef(-(SpecialReference.Sentinel + 1)); const keyNodes: SerovalNode[] = []; const valueNodes: SerovalNode[] = []; for (const [key, value] of current.entries()) { @@ -289,6 +302,9 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, + x: { + [SpecialReference.Sentinel]: this.parseSpecialReference(SpecialReference.Sentinel), + }, }; } @@ -313,6 +329,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -333,6 +350,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { a: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -353,6 +371,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { a: undefined, b: current.lastModified, o: undefined, + x: undefined, }; } @@ -394,6 +413,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -418,6 +438,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -440,6 +461,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { a: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -465,6 +487,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { ], b: undefined, o: undefined, + x: undefined, }; } @@ -485,6 +508,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: await this.parse(createEventOptions(current)), b: undefined, o: undefined, + x: undefined, }; } @@ -505,6 +529,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: await this.parse(createCustomEventOptions(current)), b: undefined, o: undefined, + x: undefined, }; } @@ -529,6 +554,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -550,6 +576,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: await this.parse(result), b: undefined, o: undefined, + x: undefined, }; } diff --git a/packages/seroval/src/core/base/stream.ts b/packages/seroval/src/core/base/stream.ts index 5a4e59c1..2d1a6f53 100644 --- a/packages/seroval/src/core/base/stream.ts +++ b/packages/seroval/src/core/base/stream.ts @@ -105,6 +105,7 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont f: undefined, b: undefined, o: undefined, + x: undefined, }, false); this.popPendingState(); } else { @@ -123,6 +124,7 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont f: parsed, b: undefined, o: undefined, + x: undefined, }, false); this.pushReadableStreamReader(id, reader); } @@ -146,6 +148,7 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont f: parsed, b: undefined, o: undefined, + x: undefined, }, false); this.popPendingState(); } @@ -175,6 +178,7 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -197,6 +201,7 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont a: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -222,6 +227,7 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont ], b: undefined, o: undefined, + x: undefined, }; } @@ -246,6 +252,7 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont f: parsed, b: undefined, o: undefined, + x: undefined, }, false); this.popPendingState(); } @@ -267,6 +274,7 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont f: parsed, b: undefined, o: undefined, + x: undefined, }, false); this.popPendingState(); } @@ -287,6 +295,7 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont f: undefined, b: undefined, o: undefined, + x: undefined, }; } diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index 5510713b..ae0970fb 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -95,6 +95,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: getObjectFlag(current), + x: undefined, }; } @@ -115,12 +116,6 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { // Check special properties, symbols in this case if (this.features & Feature.Symbol) { if (Symbol.iterator in properties) { - const specialRef = SpecialReference.SymbolIteratorFactory; - if (this.specials[specialRef]) { - this.markRef(-(specialRef + 1)); - } else { - this.specials[specialRef] = 1; - } keyNodes.push(SerovalObjectRecordSpecialKey.SymbolIterator); valueNodes.push(this.parse(iteratorToSequence(properties as Iterable))); } @@ -150,6 +145,20 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: getObjectFlag(current), + x: { + [SpecialReference.SymbolIterator]: ( + this.features & Feature.Symbol && Symbol.iterator in current + ? this.parse(Symbol.iterator) + : undefined + ), + [SpecialReference.Iterator]: ( + this.features & Feature.Symbol && Symbol.iterator in current + ? this.parseSpecialReference( + SpecialReference.Iterator, + ) + : undefined + ), + }, }; } @@ -170,6 +179,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: this.parse(current.valueOf()), b: undefined, o: undefined, + x: undefined, }; } @@ -190,6 +200,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: this.parse(current.buffer), b: current.byteOffset, o: undefined, + x: undefined, }; } @@ -210,6 +221,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: this.parse(current.buffer), b: current.byteOffset, o: undefined, + x: undefined, }; } @@ -230,6 +242,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: this.parse(current.buffer), b: current.byteOffset, o: undefined, + x: undefined, }; } @@ -254,6 +267,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -261,7 +275,6 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { id: number, current: Map, ): SerovalMapNode { - this.markRef(-(SpecialReference.Sentinel + 1)); const keyNodes: SerovalNode[] = []; const valueNodes: SerovalNode[] = []; for (const [key, value] of current.entries()) { @@ -281,6 +294,9 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, + x: { + [SpecialReference.Sentinel]: this.parseSpecialReference(SpecialReference.Sentinel), + }, }; } @@ -305,6 +321,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -346,6 +363,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -370,6 +388,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -390,6 +409,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: this.parse(createEventOptions(current)), b: undefined, o: undefined, + x: undefined, }; } @@ -410,6 +430,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: this.parse(createCustomEventOptions(current)), b: undefined, o: undefined, + x: undefined, }; } @@ -434,6 +455,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, + x: undefined, }; } diff --git a/packages/seroval/src/core/constants.ts b/packages/seroval/src/core/constants.ts index f20ca6d1..a78833c5 100644 --- a/packages/seroval/src/core/constants.ts +++ b/packages/seroval/src/core/constants.ts @@ -51,6 +51,7 @@ export const enum SerovalNodeType { CustomEvent = 38, DOMException = 39, Plugin = 40, + SpecialReference = 41, } export const enum SerovalObjectFlags { diff --git a/packages/seroval/src/core/cross/index.ts b/packages/seroval/src/core/cross/index.ts index dcd1b02f..3898bab4 100644 --- a/packages/seroval/src/core/cross/index.ts +++ b/packages/seroval/src/core/cross/index.ts @@ -19,7 +19,6 @@ export function crossSerialize( plugins: options.plugins, disabledFeatures: options.disabledFeatures, refs: options.refs, - specials: options.specials, }); const tree = ctx.parse(source); const serial = new CrossSerializerContext({ @@ -27,7 +26,6 @@ export function crossSerialize( features: ctx.features, scopeId: options.scopeId, markedRefs: ctx.marked, - specials: ctx.specials, }); return serial.serializeTop(tree); } @@ -44,7 +42,6 @@ export async function crossSerializeAsync( plugins: options.plugins, disabledFeatures: options.disabledFeatures, refs: options.refs, - specials: options.specials, }); const tree = await ctx.parse(source); const serial = new CrossSerializerContext({ @@ -52,7 +49,6 @@ export async function crossSerializeAsync( features: ctx.features, scopeId: options.scopeId, markedRefs: ctx.marked, - specials: ctx.specials, }); return serial.serializeTop(tree); } @@ -114,7 +110,6 @@ export function crossSerializeStream( ): () => void { const ctx = new StreamCrossParserContext({ refs: options.refs, - specials: options.specials, disabledFeatures: options.disabledFeatures, onParse(node, initial): void { const serial = new CrossSerializerContext({ @@ -122,7 +117,6 @@ export function crossSerializeStream( features: ctx.features, scopeId: options.scopeId, markedRefs: ctx.marked, - specials: ctx.specials, }); let serialized: string; diff --git a/packages/seroval/src/core/literals.ts b/packages/seroval/src/core/literals.ts index 8963c81c..3cc14314 100644 --- a/packages/seroval/src/core/literals.ts +++ b/packages/seroval/src/core/literals.ts @@ -15,6 +15,7 @@ function createConstantNode(value: SerovalConstant): SerovalConstantNode { f: undefined, b: undefined, o: undefined, + x: undefined, }; } diff --git a/packages/seroval/src/core/parser-context.ts b/packages/seroval/src/core/parser-context.ts index e199cb4a..b11d3d32 100644 --- a/packages/seroval/src/core/parser-context.ts +++ b/packages/seroval/src/core/parser-context.ts @@ -1,15 +1,17 @@ import { createIndexedValueNode, createReferenceNode } from './base-primitives'; import { ALL_ENABLED } from './compat'; +import { SerovalNodeType } from './constants'; import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; import { hasReferenceID } from './reference'; -import type { SpecialReferenceState } from './special-reference'; -import { createSpecialReferenceState } from './special-reference'; -import type { SerovalIndexedValueNode, SerovalReferenceNode } from './types'; +import type { SpecialReference } from './special-reference'; +import { SPECIAL_REF_SYMBOL } from './special-reference'; +import type { + SerovalIndexedValueNode, SerovalReferenceNode, SerovalSpecialReferenceNode, +} from './types'; export interface BaseParserContextOptions extends PluginAccessOptions { disabledFeatures?: number; refs?: Map; - specials?: SpecialReferenceState; } export abstract class BaseParserContext implements PluginAccessOptions { @@ -23,13 +25,10 @@ export abstract class BaseParserContext implements PluginAccessOptions { plugins?: Plugin[] | undefined; - specials: SpecialReferenceState; - constructor(options: BaseParserContextOptions) { this.plugins = options.plugins; this.features = ALL_ENABLED ^ (options.disabledFeatures || 0); this.refs = options.refs || new Map(); - this.specials = options.specials || createSpecialReferenceState(); } protected markRef(id: number): void { @@ -64,4 +63,28 @@ export abstract class BaseParserContext implements PluginAccessOptions { this.refs.set(current, id); return createReferenceNode(id, current); } + + protected parseSpecialReference( + current: SpecialReference, + ): SerovalIndexedValueNode | SerovalReferenceNode | SerovalSpecialReferenceNode { + const ref = this.getReference(SPECIAL_REF_SYMBOL[current]); + if (typeof ref === 'number') { + return { + t: SerovalNodeType.SpecialReference, + i: ref, + s: current, + l: undefined, + c: undefined, + m: undefined, + p: undefined, + e: undefined, + a: undefined, + f: undefined, + b: undefined, + o: undefined, + x: undefined, + }; + } + return ref; + } } diff --git a/packages/seroval/src/core/serializer-context.ts b/packages/seroval/src/core/serializer-context.ts index ca4e2cc3..b264d194 100644 --- a/packages/seroval/src/core/serializer-context.ts +++ b/packages/seroval/src/core/serializer-context.ts @@ -10,7 +10,6 @@ import { createEffectfulFunction, createFunction } from './function-string'; import { REFERENCES_KEY } from './keys'; import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; import { isValidIdentifier } from './shared'; -import type { SpecialReferenceState } from './special-reference'; import { SpecialReference, getSpecialReferenceValue } from './special-reference'; import type { SerovalArrayNode, @@ -53,6 +52,7 @@ import type { SerovalReadableStreamEnqueueNode, SerovalReadableStreamErrorNode, SerovalReadableStreamCloseNode, + SerovalSpecialReferenceNode, } from './types'; import { SerovalObjectRecordSpecialKey, @@ -183,8 +183,6 @@ const MAP_CONSTRUCTOR = 'new Map'; const PROMISE_RESOLVE = 'Promise.resolve'; const PROMISE_REJECT = 'Promise.reject'; -const SYMBOL_ITERATOR = 'Symbol.iterator'; - const OBJECT_FLAG_CONSTRUCTOR: Record = { [SerovalObjectFlags.Frozen]: 'Object.freeze', [SerovalObjectFlags.Sealed]: 'Object.seal', @@ -192,10 +190,16 @@ const OBJECT_FLAG_CONSTRUCTOR: Record = [SerovalObjectFlags.None]: undefined, }; +type SerovalNodeWithProperties = + | SerovalObjectNode + | SerovalNullConstructorNode + | SerovalAggregateErrorNode + | SerovalErrorNode + | SerovalHeadersNode; + export interface BaseSerializerContextOptions extends PluginAccessOptions { features: number; markedRefs: number[] | Set; - specials: SpecialReferenceState; } export default abstract class BaseSerializerContext implements PluginAccessOptions { @@ -230,13 +234,10 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio */ marked: Set; - specials: SpecialReferenceState; - constructor(options: BaseSerializerContextOptions) { this.plugins = options.plugins; this.features = options.features; this.marked = new Set(options.markedRefs); - this.specials = options.specials; } abstract readonly mode: SerovalMode; @@ -262,21 +263,6 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio */ abstract getRefParam(id: number | string): string; - /** - * Generates special references that isn't provided by the user - * but by the script. - */ - protected getSpecialReference(ref: SpecialReference): string { - if (this.specials[ref] === 2) { - return this.getRefParam(-(ref + 1)); - } - this.specials[ref] = 2; - return this.assignIndexedValue( - -(ref + 1), - getSpecialReferenceValue(this.features, ref), - ); - } - protected pushObjectFlag(flag: SerovalObjectFlags, id: number): void { if (flag !== SerovalObjectFlags.None) { this.markRef(id); @@ -406,15 +392,23 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio } protected serializeIterable( + source: SerovalNodeWithProperties, node: SerovalNode, ): string { - const key = '[' + SYMBOL_ITERATOR + ']:'; - const parent = this.stack; - this.stack = []; - const serialized = this.serialize(node); - this.stack = parent; - const constructor = this.getSpecialReference(SpecialReference.SymbolIteratorFactory); - return key + '(' + constructor + ')(' + serialized + ')'; + if ( + source.x + && source.x[SpecialReference.SymbolIterator] + && source.x[SpecialReference.Iterator] + ) { + const key = '[' + this.serialize(source.x[SpecialReference.SymbolIterator]) + ']:'; + const parent = this.stack; + this.stack = []; + const serialized = this.serialize(node); + this.stack = parent; + const constructor = this.serialize(source.x[SpecialReference.Iterator]); + return key + '(' + constructor + ')(' + serialized + ')'; + } + return ''; } protected serializeArrayItem( @@ -460,7 +454,7 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio } protected serializeProperty( - id: number, + source: SerovalNodeWithProperties, key: SerovalObjectRecordKey, val: SerovalNode, ): string { @@ -470,7 +464,7 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio // E.g. Symbol.asyncIterator switch (key) { case SerovalObjectRecordSpecialKey.SymbolIterator: - return this.serializeIterable(val); + return this.serializeIterable(source, val); default: { const check = Number(key); // Test if key is a valid number or JS identifier @@ -478,12 +472,12 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio const isIdentifier = check >= 0 || isValidIdentifier(key); if (this.isIndexedValueInStack(val)) { const refParam = this.getRefParam((val as SerovalIndexedValueNode).i); - this.markRef(id); + this.markRef(source.i); // eslint-disable-next-line no-self-compare if (isIdentifier && check !== check) { - this.createObjectAssign(id, key, refParam); + this.createObjectAssign(source.i, key, refParam); } else { - this.createArrayAssign(id, isIdentifier ? key : ('"' + key + '"'), refParam); + this.createArrayAssign(source.i, isIdentifier ? key : ('"' + key + '"'), refParam); } return ''; } @@ -493,17 +487,17 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio } protected serializeProperties( - sourceID: number, - node: SerovalObjectRecordNode, + source: SerovalNodeWithProperties, + record: SerovalObjectRecordNode, ): string { - const len = node.s; + const len = record.s; if (len) { - this.stack.push(sourceID); - const keys = node.k; - const values = node.v; - let result = this.serializeProperty(sourceID, keys[0], values[0]); + this.stack.push(source.i); + const keys = record.k; + const values = record.v; + let result = this.serializeProperty(source, keys[0], values[0]); for (let i = 1, item = result; i < len; i++) { - item = this.serializeProperty(sourceID, keys[i], values[i]); + item = this.serializeProperty(source, keys[i], values[i]); result += (item && result && ',') + item; } this.stack.pop(); @@ -516,15 +510,15 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio node: SerovalObjectNode, ): string { this.pushObjectFlag(node.o, node.i); - return this.assignIndexedValue(node.i, this.serializeProperties(node.i, node.p)); + return this.assignIndexedValue(node.i, this.serializeProperties(node, node.p)); } protected serializeWithObjectAssign( + source: SerovalNodeWithProperties, value: SerovalObjectRecordNode, - id: number, serialized: string, ): string { - const fields = this.serializeProperties(id, value); + const fields = this.serializeProperties(source, value); if (fields !== '{}') { return 'Object.assign(' + serialized + ',' + fields + ')'; } @@ -532,27 +526,31 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio } protected serializeAssignment( - sourceID: number, + source: SerovalNodeWithProperties, mainAssignments: Assignment[], key: SerovalObjectRecordKey, value: SerovalNode, ): void { switch (key) { - case SerovalObjectRecordSpecialKey.SymbolIterator: { - const parent = this.stack; - this.stack = []; - const serialized = this.serialize(value); - this.stack = parent; - const parentAssignment = this.assignments; - this.assignments = mainAssignments; - const constructor = this.getSpecialReference(SpecialReference.SymbolIteratorFactory); - this.createArrayAssign( - sourceID, - this.getSpecialReference(SpecialReference.Sentinel), - '(' + constructor + ')(' + serialized + ')', - ); - this.assignments = parentAssignment; - } + case SerovalObjectRecordSpecialKey.SymbolIterator: + if ( + source.x + && source.x[SpecialReference.Iterator] + && source.x[SpecialReference.SymbolIterator] + ) { + const parent = this.stack; + this.stack = []; + const serialized = this.serialize(value); + this.stack = parent; + const parentAssignment = this.assignments; + this.assignments = mainAssignments; + this.createArrayAssign( + source.i, + this.serialize(source.x[SpecialReference.SymbolIterator]), + '(' + this.serialize(source.x[SpecialReference.Iterator]) + ')(' + serialized + ')', + ); + this.assignments = parentAssignment; + } break; default: { const serialized = this.serialize(value); @@ -563,17 +561,17 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio if (this.isIndexedValueInStack(value)) { // eslint-disable-next-line no-self-compare if (isIdentifier && check !== check) { - this.createObjectAssign(sourceID, key, serialized); + this.createObjectAssign(source.i, key, serialized); } else { - this.createArrayAssign(sourceID, isIdentifier ? key : ('"' + key + '"'), serialized); + this.createArrayAssign(source.i, isIdentifier ? key : ('"' + key + '"'), serialized); } } else { const parentAssignment = this.assignments; this.assignments = mainAssignments; if (isIdentifier) { - this.createObjectAssign(sourceID, key, serialized); + this.createObjectAssign(source.i, key, serialized); } else { - this.createArrayAssign(sourceID, isIdentifier ? key : ('"' + key + '"'), serialized); + this.createArrayAssign(source.i, isIdentifier ? key : ('"' + key + '"'), serialized); } this.assignments = parentAssignment; } @@ -582,17 +580,17 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio } protected serializeAssignments( - sourceID: number, + source: SerovalNodeWithProperties, node: SerovalObjectRecordNode, ): string | undefined { const len = node.s; if (len) { - this.stack.push(sourceID); + this.stack.push(source.i); const mainAssignments: Assignment[] = []; const keys = node.k; const values = node.v; for (let i = 0; i < len; i++) { - this.serializeAssignment(sourceID, mainAssignments, keys[i], values[i]); + this.serializeAssignment(source, mainAssignments, keys[i], values[i]); } this.stack.pop(); return resolveAssignments(mainAssignments); @@ -601,29 +599,28 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio } protected serializeDictionary( - i: number, - p: SerovalObjectRecordNode | undefined, + node: SerovalNodeWithProperties, init: string, ): string { - if (p) { + if (node.p) { if (this.features & Feature.ObjectAssign) { - init = this.serializeWithObjectAssign(p, i, init); + init = this.serializeWithObjectAssign(node, node.p, init); } else { - this.markRef(i); - const assignments = this.serializeAssignments(i, p); + this.markRef(node.i); + const assignments = this.serializeAssignments(node, node.p); if (assignments) { - return '(' + this.assignIndexedValue(i, init) + ',' + assignments + this.getRefParam(i) + ')'; + return '(' + this.assignIndexedValue(node.i, init) + ',' + assignments + this.getRefParam(node.i) + ')'; } } } - return this.assignIndexedValue(i, init); + return this.assignIndexedValue(node.i, init); } protected serializeNullConstructor( node: SerovalNullConstructorNode, ): string { this.pushObjectFlag(node.o, node.i); - return this.serializeDictionary(node.i, node.p, NULL_CONSTRUCTOR); + return this.serializeDictionary(node, NULL_CONSTRUCTOR); } protected serializeDate( @@ -676,6 +673,7 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio id: number, key: SerovalNode, val: SerovalNode, + sentinel: string, ): string { if (this.isIndexedValueInStack(key)) { // Create reference for the map instance @@ -700,9 +698,9 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio // basically we serialize the intended object in place WITHOUT // actually returning it, this is by returning a placeholder // value that we will remove sometime after. - const serialized = '(' + this.serialize(val) + ',[' + this.getSpecialReference(SpecialReference.Sentinel) + ',' + this.getSpecialReference(SpecialReference.Sentinel) + '])'; + const serialized = '(' + this.serialize(val) + ',[' + sentinel + ',' + sentinel + '])'; this.createSetAssignment(id, keyRef, this.getRefParam(val.i)); - this.createDeleteAssignment(id, this.getSpecialReference(SpecialReference.Sentinel)); + this.createDeleteAssignment(id, sentinel); return serialized; } const parent = this.stack; @@ -716,9 +714,9 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio const valueRef = this.getRefParam((val as SerovalIndexedValueNode).i); this.markRef(id); if (key.t !== SerovalNodeType.IndexedValue && key.i != null && this.isMarked(key.i)) { - const serialized = '(' + this.serialize(key) + ',[' + this.getSpecialReference(SpecialReference.Sentinel) + ',' + this.getSpecialReference(SpecialReference.Sentinel) + '])'; + const serialized = '(' + this.serialize(key) + ',[' + sentinel + ',' + sentinel + '])'; this.createSetAssignment(id, this.getRefParam(key.i), valueRef); - this.createDeleteAssignment(id, this.getSpecialReference(SpecialReference.Sentinel)); + this.createDeleteAssignment(id, sentinel); return serialized; } // Reset stack for the key serialization @@ -738,13 +736,15 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio let serialized = MAP_CONSTRUCTOR; const size = node.e.s; const id = node.i; + const sentinel = node.x[SpecialReference.Sentinel]; + const sentinelID = this.getRefParam(sentinel.i); if (size) { const keys = node.e.k; const vals = node.e.v; this.stack.push(id); - let result = this.serializeMapEntry(id, keys[0], vals[0]); + let result = this.serializeMapEntry(id, keys[0], vals[0], sentinelID); for (let i = 1, item = result; i < size; i++) { - item = this.serializeMapEntry(id, keys[i], vals[i]); + item = this.serializeMapEntry(id, keys[i], vals[i], sentinelID); result += (item && result && ',') + item; } this.stack.pop(); @@ -755,6 +755,10 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio serialized += '([' + result + '])'; } } + if (sentinel.t === SerovalNodeType.SpecialReference) { + this.markRef(sentinel.i); + serialized = '(' + this.serialize(sentinel) + ',' + serialized + ')'; + } return this.assignIndexedValue(id, serialized); } @@ -803,13 +807,13 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio // `AggregateError` might've been extended // either through class or custom properties // Make sure to assign extra properties - return this.serializeDictionary(id, node.p, serialized); + return this.serializeDictionary(node, serialized); } protected serializeError( node: SerovalErrorNode, ): string { - return this.serializeDictionary(node.i, node.p, 'new ' + ERROR_CONSTRUCTOR_STRING[node.s] + '("' + node.m + '")'); + return this.serializeDictionary(node, 'new ' + ERROR_CONSTRUCTOR_STRING[node.s] + '("' + node.m + '")'); } protected serializePromise( @@ -885,7 +889,7 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio ): string { return this.assignIndexedValue( node.i, - 'new Headers(' + this.serializeProperties(node.i, node.e) + ')', + 'new Headers(' + this.serializeProperties(node, node.e) + ')', ); } @@ -1016,6 +1020,15 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio node: SerovalReadableStreamCloseNode, ): string; + protected serializeSpecialReference( + node: SerovalSpecialReferenceNode, + ): string { + return this.assignIndexedValue( + node.i, + getSpecialReferenceValue(this.features, node.s), + ); + } + serialize(node: SerovalNode): string { switch (node.t) { case SerovalNodeType.Constant: @@ -1099,6 +1112,8 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio return this.serializeDOMException(node); case SerovalNodeType.Plugin: return this.serializePlugin(node); + case SerovalNodeType.SpecialReference: + return this.serializeSpecialReference(node); default: throw new Error('invariant'); } diff --git a/packages/seroval/src/core/special-reference.ts b/packages/seroval/src/core/special-reference.ts index 34a0f72a..e4c0c6ee 100644 --- a/packages/seroval/src/core/special-reference.ts +++ b/packages/seroval/src/core/special-reference.ts @@ -1,8 +1,5 @@ - +import { createEffectfulFunction, createFunction } from './function-string'; // These represents special references that are not provided - -import { createEffectfulFunction, createFunction } from "./function-string"; - // by the user but are accessed by the serial output export const enum SpecialReference { // A sentinel ref is used to allow recursive Map @@ -11,23 +8,21 @@ export const enum SpecialReference { // value Sentinel = 0, // A factory for creating iterators - SymbolIteratorFactory = 1, + Iterator = 1, + SymbolIterator = 2, } -export type SpecialReferenceState = Record; - -export function createSpecialReferenceState(): SpecialReferenceState { - return { - [SpecialReference.Sentinel]: 0, - [SpecialReference.SymbolIteratorFactory]: 0, - }; -} +export const SPECIAL_REF_SYMBOL: Record = { + [SpecialReference.Sentinel]: Symbol(''), + [SpecialReference.Iterator]: Symbol(''), + [SpecialReference.SymbolIterator]: Symbol.iterator, +}; export function getSpecialReferenceValue(features: number, ref: SpecialReference): string { switch (ref) { case SpecialReference.Sentinel: return '[]'; - case SpecialReference.SymbolIteratorFactory: + case SpecialReference.Iterator: return createFunction( features, ['s'], @@ -37,6 +32,8 @@ export function getSpecialReferenceValue(features: number, ref: SpecialReference '(i=0,{next:' + createEffectfulFunction(features, [], 'c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}') + '})', ) + ')', ); + case SpecialReference.SymbolIterator: + return 'Symbol.iterator'; default: return ''; } diff --git a/packages/seroval/src/core/tree/index.ts b/packages/seroval/src/core/tree/index.ts index 9d075966..22ba6e7e 100644 --- a/packages/seroval/src/core/tree/index.ts +++ b/packages/seroval/src/core/tree/index.ts @@ -1,5 +1,4 @@ import type { PluginAccessOptions } from '../plugin'; -import type { SpecialReferenceState } from '../special-reference'; import type { SerovalNode } from '../types'; import type { AsyncParserContextOptions } from './async'; import AsyncParserContext from './async'; @@ -21,7 +20,6 @@ export function serialize( plugins: options.plugins, features: ctx.features, markedRefs: ctx.marked, - specials: ctx.specials, }); return serial.serializeTop(tree); } @@ -39,7 +37,6 @@ export async function serializeAsync( plugins: options.plugins, features: ctx.features, markedRefs: ctx.marked, - specials: ctx.specials, }); return serial.serializeTop(tree); } @@ -53,7 +50,6 @@ export interface SerovalJSON { t: SerovalNode; f: number; m: number[]; - s: SpecialReferenceState; } export function toJSON( @@ -68,7 +64,6 @@ export function toJSON( t: ctx.parse(source), f: ctx.features, m: Array.from(ctx.marked), - s: ctx.specials, }; } @@ -84,7 +79,6 @@ export async function toJSONAsync( t: await ctx.parse(source), f: ctx.features, m: Array.from(ctx.marked), - s: ctx.specials, }; } @@ -93,7 +87,6 @@ export function compileJSON(source: SerovalJSON, options: PluginAccessOptions = plugins: options.plugins, features: source.f, markedRefs: source.m, - specials: source.s, }); return ctx.serializeTop(source.t); } diff --git a/packages/seroval/src/core/types.ts b/packages/seroval/src/core/types.ts index 4a3ebd42..873faa76 100644 --- a/packages/seroval/src/core/types.ts +++ b/packages/seroval/src/core/types.ts @@ -5,6 +5,7 @@ import type { Symbols, ErrorConstructorTag, } from './constants'; +import type { SpecialReference } from './special-reference'; export interface SerovalBaseNode { // Type of the node @@ -31,6 +32,8 @@ export interface SerovalBaseNode { b: number | undefined; // object flag o: SerovalObjectFlags | undefined; + // x + x: Partial> | undefined; } export const enum SerovalObjectRecordSpecialKey { @@ -166,6 +169,9 @@ export interface SerovalMapNode extends SerovalBaseNode { i: number; // key/value pairs e: SerovalMapRecordNode; + x: { + [SpecialReference.Sentinel]: SerovalNodeWithID; + }; } export interface SerovalArrayNode extends SerovalBaseNode { @@ -184,6 +190,10 @@ export interface SerovalObjectNode extends SerovalBaseNode { p: SerovalObjectRecordNode; i: number; o: SerovalObjectFlags; + x: { + [SpecialReference.SymbolIterator]: SerovalNode | undefined; + [SpecialReference.Iterator]: SerovalNode | undefined; + }; } export interface SerovalNullConstructorNode extends SerovalBaseNode { @@ -192,6 +202,10 @@ export interface SerovalNullConstructorNode extends SerovalBaseNode { p: SerovalObjectRecordNode; i: number; o: SerovalObjectFlags; + x: { + [SpecialReference.SymbolIterator]: SerovalNode | undefined; + [SpecialReference.Iterator]: SerovalNode | undefined; + }; } export interface SerovalPromiseNode extends SerovalBaseNode { @@ -392,6 +406,12 @@ export interface SerovalPluginNode extends SerovalBaseNode { c: string; } +export interface SerovalSpecialReferenceNode extends SerovalBaseNode { + t: SerovalNodeType.SpecialReference; + i: number; + s: SpecialReference; +} + export type SerovalSyncNode = | SerovalPrimitiveNode | SerovalIndexedValueNode @@ -418,7 +438,8 @@ export type SerovalSyncNode = | SerovalEventNode | SerovalCustomEventNode | SerovalDOMExceptionNode - | SerovalPluginNode; + | SerovalPluginNode + | SerovalSpecialReferenceNode; export type SerovalAsyncNode = | SerovalPromiseNode @@ -437,3 +458,5 @@ export type SerovalAsyncNode = export type SerovalNode = | SerovalSyncNode | SerovalAsyncNode; + +export type SerovalNodeWithID = Extract; diff --git a/packages/seroval/src/core/web-api.ts b/packages/seroval/src/core/web-api.ts index 4609b310..762dbe95 100644 --- a/packages/seroval/src/core/web-api.ts +++ b/packages/seroval/src/core/web-api.ts @@ -19,6 +19,7 @@ export function createURLNode( a: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -39,6 +40,7 @@ export function createURLSearchParamsNode( a: undefined, b: undefined, o: undefined, + x: undefined, }; } @@ -59,5 +61,6 @@ export function createDOMExceptionNode( f: undefined, b: undefined, o: undefined, + x: undefined, }; } diff --git a/packages/seroval/test/__snapshots__/array.test.ts.snap b/packages/seroval/test/__snapshots__/array.test.ts.snap index ac03c0a3..d3b481b0 100644 --- a/packages/seroval/test/__snapshots__/array.test.ts.snap +++ b/packages/seroval/test/__snapshots__/array.test.ts.snap @@ -44,10 +44,10 @@ exports[`arrays > serializeAsync > supports Arrays 1`] = `"Promise.resolve([1,2, exports[`arrays > serializeAsync > supports self recursion 1`] = `"(h=>(h=[Promise.resolve().then(()=>h),Promise.resolve().then(()=>h)]))()"`; -exports[`arrays > toJSON > supports Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`arrays > toJSON > supports Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`arrays > toJSON > supports self recursion 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"o\\":0},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`arrays > toJSON > supports self recursion 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; -exports[`arrays > toJSONAsync > supports Arrays 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`arrays > toJSONAsync > supports Arrays 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`arrays > toJSONAsync > supports self recursion 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"o\\":0},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`arrays > toJSONAsync > supports self recursion 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/bigint.test.ts.snap b/packages/seroval/test/__snapshots__/bigint.test.ts.snap index f1308049..c803bef9 100644 --- a/packages/seroval/test/__snapshots__/bigint.test.ts.snap +++ b/packages/seroval/test/__snapshots__/bigint.test.ts.snap @@ -16,6 +16,6 @@ exports[`bigint > serialize > supports bigint 1`] = `"9007199254740991n"`; exports[`bigint > serializeAsync > supports bigint 1`] = `"Promise.resolve(9007199254740991n)"`; -exports[`bigint > toJSON > supports bigint 1`] = `"{\\"t\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`bigint > toJSON > supports bigint 1`] = `"{\\"t\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"},\\"f\\":16383,\\"m\\":[]}"`; -exports[`bigint > toJSONAsync > supports bigint 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`bigint > toJSONAsync > supports bigint 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/boolean.test.ts.snap b/packages/seroval/test/__snapshots__/boolean.test.ts.snap index 0a0519ed..220227f1 100644 --- a/packages/seroval/test/__snapshots__/boolean.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boolean.test.ts.snap @@ -16,10 +16,10 @@ exports[`boolean > crossSerializeAsync > supports true value 1`] = `"$R[0]=_$.P( exports[`boolean > crossSerializeAsync > supports true value 2`] = `"_$.Ps($R[0],!0)"`; -exports[`boolean > serializeAsync > supports boolean 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boolean > serializeAsync > supports boolean 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boolean > serializeAsync > supports boolean 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":3}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boolean > serializeAsync > supports boolean 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":3}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boolean > toJSON > supports boolean 1`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":2},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boolean > toJSON > supports boolean 1`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":2},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boolean > toJSON > supports boolean 2`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":3},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boolean > toJSON > supports boolean 2`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":3},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap b/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap index 96007539..9bc0d47b 100644 --- a/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap @@ -24,6 +24,6 @@ exports[`boxed bigint > serialize > supports boxed bigint 1`] = `"Object(9007199 exports[`boxed bigint > serializeAsync > supports boxed bigint 1`] = `"Promise.resolve(Object(9007199254740991n))"`; -exports[`boxed bigint > toJSON > supports boxed bigint 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed bigint > toJSON > supports boxed bigint 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed bigint > toJSONAsync > supports boxed bigint 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed bigint > toJSONAsync > supports boxed bigint 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap b/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap index b17f797f..b4562b1f 100644 --- a/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap @@ -80,22 +80,22 @@ exports[`boxed number > crossSerializeStream > supports boxed numbers 1`] = `"$R exports[`boxed number > crossSerializeStream > supports boxed numbers 2`] = `"_$.Ps($R[0],$R[1]=Object(3735928559))"`; -exports[`boxed number > toJSON > supports boxed numbers 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed number > toJSON > supports boxed numbers 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed number > toJSON > supports boxed numbers 2`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":7}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed number > toJSON > supports boxed numbers 2`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":7}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed number > toJSON > supports boxed numbers 3`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":5}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed number > toJSON > supports boxed numbers 3`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":5}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed number > toJSON > supports boxed numbers 4`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":6}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed number > toJSON > supports boxed numbers 4`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":6}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed number > toJSON > supports boxed numbers 5`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":4}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed number > toJSON > supports boxed numbers 5`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":4}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed number > toJSONAsync > supports boxed numbers 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed number > toJSONAsync > supports boxed numbers 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed number > toJSONAsync > supports boxed numbers 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":7}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed number > toJSONAsync > supports boxed numbers 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":7}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed number > toJSONAsync > supports boxed numbers 3`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":5}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed number > toJSONAsync > supports boxed numbers 3`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":5}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed number > toJSONAsync > supports boxed numbers 4`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":6}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed number > toJSONAsync > supports boxed numbers 4`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":6}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed number > toJSONAsync > supports boxed numbers 5`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":4}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed number > toJSONAsync > supports boxed numbers 5`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":4}}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap b/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap index 2852d8db..adeec73b 100644 --- a/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap @@ -40,10 +40,10 @@ exports[`boxed string > serializeAsync > supports boxed strings 1`] = `"Promise. exports[`boxed string > serializeAsync > supports boxed strings 2`] = `"Promise.resolve(Object(\\"\\\\x3Cscript>\\\\x3C/script>\\"))"`; -exports[`boxed string > toJSON > supports boxed strings 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed string > toJSON > supports boxed strings 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed string > toJSON > supports boxed strings 2`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed string > toJSON > supports boxed strings 2`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed string > toJSONAsync > supports boxed strings 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed string > toJSONAsync > supports boxed strings 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed string > toJSONAsync > supports boxed strings 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`boxed string > toJSONAsync > supports boxed strings 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/data-view.test.ts.snap b/packages/seroval/test/__snapshots__/data-view.test.ts.snap index 032d2372..2d8a4cfc 100644 --- a/packages/seroval/test/__snapshots__/data-view.test.ts.snap +++ b/packages/seroval/test/__snapshots__/data-view.test.ts.snap @@ -20,6 +20,6 @@ exports[`DataView > serialize > supports DataView 1`] = `"new DataView(new Uint8 exports[`DataView > serializeAsync > supports DataView 1`] = `"Promise.resolve(new DataView(new Uint8Array([0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]).buffer,0,16))"`; -exports[`DataView > toJSON > supports DataView 1`] = `"{\\"t\\":{\\"t\\":22,\\"i\\":0,\\"l\\":16,\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]},\\"b\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`DataView > toJSON > supports DataView 1`] = `"{\\"t\\":{\\"t\\":22,\\"i\\":0,\\"l\\":16,\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]},\\"b\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`DataView > toJSONAsync > supports DataView 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":22,\\"i\\":1,\\"l\\":16,\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]},\\"b\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`DataView > toJSONAsync > supports DataView 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":22,\\"i\\":1,\\"l\\":16,\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]},\\"b\\":0}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/date.test.ts.snap b/packages/seroval/test/__snapshots__/date.test.ts.snap index 021ff2fd..cdd42704 100644 --- a/packages/seroval/test/__snapshots__/date.test.ts.snap +++ b/packages/seroval/test/__snapshots__/date.test.ts.snap @@ -20,6 +20,6 @@ exports[`Date > serialize > supports Date 1`] = `"new Date(\\"2023-03-14T11:16:2 exports[`Date > serializeAsync > supports Date 1`] = `"Promise.resolve(new Date(\\"2023-03-14T11:16:24.879Z\\"))"`; -exports[`Date > toJSON > supports Date 1`] = `"{\\"t\\":{\\"t\\":5,\\"i\\":0,\\"s\\":\\"2023-03-14T11:16:24.879Z\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Date > toJSON > supports Date 1`] = `"{\\"t\\":{\\"t\\":5,\\"i\\":0,\\"s\\":\\"2023-03-14T11:16:24.879Z\\"},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Date > toJSONAsync > supports Date 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":5,\\"i\\":1,\\"s\\":\\"2023-03-14T11:16:24.879Z\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Date > toJSONAsync > supports Date 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":5,\\"i\\":1,\\"s\\":\\"2023-03-14T11:16:24.879Z\\"}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/error.test.ts.snap b/packages/seroval/test/__snapshots__/error.test.ts.snap index c813743c..6d230a89 100644 --- a/packages/seroval/test/__snapshots__/error.test.ts.snap +++ b/packages/seroval/test/__snapshots__/error.test.ts.snap @@ -64,14 +64,14 @@ exports[`Error > serializeAsync > supports Error.prototype.name 1`] = `"Promise. exports[`Error > serializeAsync > supports other Error classes 1`] = `"Promise.resolve(Object.assign(new ReferenceError(\\"A\\"),{stack:\\"\\"}))"`; -exports[`Error > toJSON > supports Error.prototype.cause 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"B\\",\\"p\\":{\\"k\\":[\\"stack\\",\\"cause\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":13,\\"i\\":1,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Error > toJSON > supports Error.prototype.cause 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"B\\",\\"p\\":{\\"k\\":[\\"stack\\",\\"cause\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":13,\\"i\\":1,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Error > toJSON > supports Error.prototype.name 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"name\\",\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"ExampleError\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Error > toJSON > supports Error.prototype.name 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"name\\",\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"ExampleError\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Error > toJSON > supports other Error classes 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":3,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Error > toJSON > supports other Error classes 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":3,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Error > toJSONAsync > supports Error.prototype.cause 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"B\\",\\"p\\":{\\"k\\":[\\"stack\\",\\"cause\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":13,\\"i\\":2,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Error > toJSONAsync > supports Error.prototype.cause 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"B\\",\\"p\\":{\\"k\\":[\\"stack\\",\\"cause\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":13,\\"i\\":2,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Error > toJSONAsync > supports Error.prototype.name 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":13,\\"i\\":1,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"name\\",\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"ExampleError\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Error > toJSONAsync > supports Error.prototype.name 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":13,\\"i\\":1,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"name\\",\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"ExampleError\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Error > toJSONAsync > supports other Error classes 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":13,\\"i\\":1,\\"s\\":3,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Error > toJSONAsync > supports other Error classes 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":13,\\"i\\":1,\\"s\\":3,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap index d6621244..bb7d9b15 100644 --- a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap @@ -2,25 +2,25 @@ exports[`frozen object > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])"`; -exports[`frozen object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; +exports[`frozen object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])"`; -exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; exports[`frozen object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])"`; @@ -30,7 +30,7 @@ exports[`frozen object > crossSerializeStream > scoped > supports Objects 2`] = exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -46,7 +46,7 @@ exports[`frozen object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps( exports[`frozen object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; exports[`frozen object > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -68,14 +68,14 @@ exports[`frozen object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j exports[`frozen object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.freeze(h),h))()"`; -exports[`frozen object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`frozen object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`frozen object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":3},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; +exports[`frozen object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`frozen object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":3},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`frozen object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":3,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; -exports[`frozen object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`frozen object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`frozen object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":3}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; +exports[`frozen object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":5,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3}}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`frozen object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":3},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`frozen object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":3,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/iterable.test.ts.snap b/packages/seroval/test/__snapshots__/iterable.test.ts.snap index a98ab1c3..32eb774e 100644 --- a/packages/seroval/test/__snapshots__/iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/iterable.test.ts.snap @@ -6,38 +6,38 @@ exports[`Iterable > compat > should use functions instead of method shorthand. 1 exports[`Iterable > compat > should use method shorthand instead of arrow functions. 1`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16381,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; +exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16381,\\"m\\":[0]}"`; exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 2`] = `"(h=>(h={[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[h,void 0],t:-1,d:1})}))()"`; -exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16315,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; +exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16315,\\"m\\":[0]}"`; exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 2`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16379,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; +exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16379,\\"m\\":[0]}"`; exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 2`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; -exports[`Iterable > crossSerialize > supports Iterables 1`] = `"$R[0]={title:\\"Hello World\\",[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`Iterable > crossSerialize > supports Iterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; -exports[`Iterable > crossSerializeAsync > scoped > supports Iterables 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`Iterable > crossSerializeAsync > scoped > supports Iterables 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; -exports[`Iterable > crossSerializeAsync > supports Iterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`Iterable > crossSerializeAsync > supports Iterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`Iterable > crossSerializeStream > scoped > supports Iterables 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Iterable > crossSerializeStream > scoped > supports Iterables 2`] = `"($R=>_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`Iterable > crossSerializeStream > scoped > supports Iterables 2`] = `"($R=>_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`Iterable > crossSerializeStream > supports Iterables 1`] = `"$R[0]=_$.P()"`; -exports[`Iterable > crossSerializeStream > supports Iterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`Iterable > crossSerializeStream > supports Iterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`Iterable > serialize > supports Iterables 1`] = `"({title:\\"Hello World\\",[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})"`; exports[`Iterable > serializeAsync > supports Iterables 1`] = `"Promise.resolve({title:\\"Hello World\\",[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})"`; -exports[`Iterable > toJSON > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; +exports[`Iterable > toJSON > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Iterable > toJSONAsync > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":2},\\"o\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; +exports[`Iterable > toJSONAsync > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":5,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3}}}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/map.test.ts.snap b/packages/seroval/test/__snapshots__/map.test.ts.snap index 8a4ec80d..25d3fb45 100644 --- a/packages/seroval/test/__snapshots__/map.test.ts.snap +++ b/packages/seroval/test/__snapshots__/map.test.ts.snap @@ -4,31 +4,31 @@ exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"Object.assign exports[`Map > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; -exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":0}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16351,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; +exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":0}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16351,\\"m\\":[]}"`; exports[`Map > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; -exports[`Map > crossSerialize > scoped > supports Map 1`] = `"($R=>$R[0]=new Map([[1,2],[3,4]]))($R[\\"example\\"])"`; +exports[`Map > crossSerialize > scoped > supports Map 1`] = `"($R=>$R[0]=($R[1]=[],new Map([[1,2],[3,4]])))($R[\\"example\\"])"`; -exports[`Map > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]=new Map,$R[0].set($R[0],$R[0]),$R[0])($R[\\"example\\"])"`; +exports[`Map > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]=($R[1]=[],new Map),$R[0].set($R[0],$R[0]),$R[0])($R[\\"example\\"])"`; -exports[`Map > crossSerialize > supports Map 1`] = `"$R[0]=new Map([[1,2],[3,4]])"`; +exports[`Map > crossSerialize > supports Map 1`] = `"$R[0]=($R[1]=[],new Map([[1,2],[3,4]]))"`; -exports[`Map > crossSerialize > supports self-recursion 1`] = `"($R[0]=new Map,$R[0].set($R[0],$R[0]),$R[0])"`; +exports[`Map > crossSerialize > supports self-recursion 1`] = `"($R[0]=($R[1]=[],new Map),$R[0].set($R[0],$R[0]),$R[0])"`; -exports[`Map > crossSerializeAsync > scoped > supports Map 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new Map([[1,2],[3,4]])))($R[\\"example\\"])"`; +exports[`Map > crossSerializeAsync > scoped > supports Map 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=($R[2]=[],new Map([[1,2],[3,4]]))))($R[\\"example\\"])"`; -exports[`Map > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]=new Map([[$R[1]=Promise.resolve().then(()=>$R[0]),$R[2]=Promise.resolve().then(()=>$R[0])]]))($R[\\"example\\"])"`; +exports[`Map > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]=($R[3]=[],new Map([[$R[1]=Promise.resolve().then(()=>$R[0]),$R[2]=Promise.resolve().then(()=>$R[0])]])))($R[\\"example\\"])"`; -exports[`Map > crossSerializeAsync > supports Map 1`] = `"$R[0]=Promise.resolve($R[1]=new Map([[1,2],[3,4]]))"`; +exports[`Map > crossSerializeAsync > supports Map 1`] = `"$R[0]=Promise.resolve($R[1]=($R[2]=[],new Map([[1,2],[3,4]])))"`; -exports[`Map > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]=new Map([[$R[1]=Promise.resolve().then(()=>$R[0]),$R[2]=Promise.resolve().then(()=>$R[0])]])"`; +exports[`Map > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]=($R[3]=[],new Map([[$R[1]=Promise.resolve().then(()=>$R[0]),$R[2]=Promise.resolve().then(()=>$R[0])]]))"`; exports[`Map > crossSerializeStream > scoped > supports Map 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Map > crossSerializeStream > scoped > supports Map 2`] = `"($R=>_$.Ps($R[0],$R[1]=new Map([[1,2],[3,4]])))($R[\\"example\\"])"`; +exports[`Map > crossSerializeStream > scoped > supports Map 2`] = `"($R=>_$.Ps($R[0],$R[1]=($R[2]=[],new Map([[1,2],[3,4]]))))($R[\\"example\\"])"`; -exports[`Map > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=new Map([[$R[1]=_$.P(),$R[2]=_$.P()]]))($R[\\"example\\"])"`; +exports[`Map > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=($R[3]=[],new Map([[$R[1]=_$.P(),$R[2]=_$.P()]])))($R[\\"example\\"])"`; exports[`Map > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>_$.Ps($R[1],$R[0]))($R[\\"example\\"])"`; @@ -36,26 +36,26 @@ exports[`Map > crossSerializeStream > scoped > supports self-recursion 3`] = `"( exports[`Map > crossSerializeStream > supports Map 1`] = `"$R[0]=_$.P()"`; -exports[`Map > crossSerializeStream > supports Map 2`] = `"_$.Ps($R[0],$R[1]=new Map([[1,2],[3,4]]))"`; +exports[`Map > crossSerializeStream > supports Map 2`] = `"_$.Ps($R[0],$R[1]=($R[2]=[],new Map([[1,2],[3,4]])))"`; -exports[`Map > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=new Map([[$R[1]=_$.P(),$R[2]=_$.P()]])"`; +exports[`Map > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=($R[3]=[],new Map([[$R[1]=_$.P(),$R[2]=_$.P()]]))"`; exports[`Map > crossSerializeStream > supports self-recursion 2`] = `"_$.Ps($R[1],$R[0])"`; exports[`Map > crossSerializeStream > supports self-recursion 3`] = `"_$.Ps($R[2],$R[0])"`; -exports[`Map > serialize > supports Map 1`] = `"new Map([[1,2],[3,4]])"`; +exports[`Map > serialize > supports Map 1`] = `"(h=>((h=[],new Map([[1,2],[3,4]]))))()"`; -exports[`Map > serialize > supports self-recursion 1`] = `"(h=>(h=new Map,h.set(h,h),h))()"`; +exports[`Map > serialize > supports self-recursion 1`] = `"((h,j)=>(j=(h=[],new Map),j.set(j,j),j))()"`; -exports[`Map > serializeAsync > supports Map 1`] = `"Promise.resolve(new Map([[1,2],[3,4]]))"`; +exports[`Map > serializeAsync > supports Map 1`] = `"(h=>(Promise.resolve((h=[],new Map([[1,2],[3,4]])))))()"`; -exports[`Map > serializeAsync > supports self-recursion 1`] = `"(h=>(h=new Map([[Promise.resolve().then(()=>h),Promise.resolve().then(()=>h)]])))()"`; +exports[`Map > serializeAsync > supports self-recursion 1`] = `"((h,j)=>(j=(h=[],new Map([[Promise.resolve().then(()=>j),Promise.resolve().then(()=>j)]]))))()"`; -exports[`Map > toJSON > supports Map 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[-1],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Map > toJSON > supports Map 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":1,\\"s\\":0}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Map > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":4,\\"i\\":0}],\\"v\\":[{\\"t\\":4,\\"i\\":0}],\\"s\\":1}},\\"f\\":16383,\\"m\\":[-1,0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Map > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":4,\\"i\\":0}],\\"v\\":[{\\"t\\":4,\\"i\\":0}],\\"s\\":1},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":1,\\"s\\":0}}},\\"f\\":16383,\\"m\\":[0]}"`; -exports[`Map > toJSONAsync > supports Map 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[-1],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Map > toJSONAsync > supports Map 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":2,\\"s\\":0}}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Map > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":1}},\\"f\\":16383,\\"m\\":[-1,0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Map > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":1},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":3,\\"s\\":0}}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap b/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap index 3d4fb461..fb2189d3 100644 --- a/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap +++ b/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap @@ -72,14 +72,14 @@ exports[`mutual cyclic references > serializeAsync > supports Arrays and Objects exports[`mutual cyclic references > serializeAsync > supports Objects and Objects 1`] = `"((h,j)=>([h={0:Promise.resolve(j={0:Promise.resolve().then(()=>h)})},j]))()"`; -exports[`mutual cyclic references > toJSON > supports Arrays and Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":1}],\\"o\\":0}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`mutual cyclic references > toJSON > supports Arrays and Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":1}],\\"o\\":0}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2]}"`; -exports[`mutual cyclic references > toJSON > supports Arrays and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`mutual cyclic references > toJSON > supports Arrays and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2]}"`; -exports[`mutual cyclic references > toJSON > supports Objects and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0}],\\"s\\":1},\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`mutual cyclic references > toJSON > supports Objects and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2]}"`; -exports[`mutual cyclic references > toJSONAsync > supports Arrays and Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":3,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"o\\":0}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`mutual cyclic references > toJSONAsync > supports Arrays and Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":3,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"o\\":0}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3]}"`; -exports[`mutual cyclic references > toJSONAsync > supports Arrays and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`mutual cyclic references > toJSONAsync > supports Arrays and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3]}"`; -exports[`mutual cyclic references > toJSONAsync > supports Objects and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0}}],\\"s\\":1},\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`mutual cyclic references > toJSONAsync > supports Objects and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3]}"`; diff --git a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap index 566a5ce7..e298d868 100644 --- a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap +++ b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap @@ -2,31 +2,31 @@ exports[`null-constructor > compat > should use manual assignment instead of Object.assign 1`] = `"(h=>((h=Object.create(null),h.hello=\\"world\\",h)))()"`; -exports[`null-constructor > compat#toJSON > should use manual assignment instead of Object.assign 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16255,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`null-constructor > compat#toJSON > should use manual assignment instead of Object.assign 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16255,\\"m\\":[]}"`; exports[`null-constructor > compat#toJSON > should use manual assignment instead of Object.assign 2`] = `"(h=>((h=Object.create(null),h.hello=\\"world\\",h)))()"`; exports[`null-constructor > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; exports[`null-constructor > crossSerialize > supports Objects 1`] = `"$R[0]=Object.assign(Object.create(null),{hello:\\"world\\"})"`; -exports[`null-constructor > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`null-constructor > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`null-constructor > crossSerialize > supports self-recursion 1`] = `"($R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])"`; exports[`null-constructor > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; +exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; exports[`null-constructor > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})"`; @@ -36,7 +36,7 @@ exports[`null-constructor > crossSerializeStream > scoped > supports Objects 2`] exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -52,7 +52,7 @@ exports[`null-constructor > crossSerializeStream > supports Objects 2`] = `"_$.P exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; exports[`null-constructor > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -74,14 +74,14 @@ exports[`null-constructor > serializeAsync > supports Symbol.iterator 1`] = `"Pr exports[`null-constructor > serializeAsync > supports self-recursion 1`] = `"(h=>(h=Object.assign(Object.create(null),{a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)})))()"`; -exports[`null-constructor > toJSON > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`null-constructor > toJSON > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`null-constructor > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; +exports[`null-constructor > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`null-constructor > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`null-constructor > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; -exports[`null-constructor > toJSONAsync > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`null-constructor > toJSONAsync > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`null-constructor > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; +exports[`null-constructor > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":5,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3}}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`null-constructor > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`null-constructor > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/number.test.ts.snap b/packages/seroval/test/__snapshots__/number.test.ts.snap index 94b30087..6c57479c 100644 --- a/packages/seroval/test/__snapshots__/number.test.ts.snap +++ b/packages/seroval/test/__snapshots__/number.test.ts.snap @@ -40,22 +40,22 @@ exports[`number > crossSerializeStream > supports numbers 1`] = `"$R[0]=_$.P()"` exports[`number > crossSerializeStream > supports numbers 2`] = `"_$.Ps($R[0],3735928559)"`; -exports[`number > toJSON > supports numbers 1`] = `"{\\"t\\":{\\"t\\":0,\\"s\\":3735928559},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`number > toJSON > supports numbers 1`] = `"{\\"t\\":{\\"t\\":0,\\"s\\":3735928559},\\"f\\":16383,\\"m\\":[]}"`; -exports[`number > toJSON > supports numbers 2`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":7},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`number > toJSON > supports numbers 2`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":7},\\"f\\":16383,\\"m\\":[]}"`; -exports[`number > toJSON > supports numbers 3`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":5},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`number > toJSON > supports numbers 3`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":5},\\"f\\":16383,\\"m\\":[]}"`; -exports[`number > toJSON > supports numbers 4`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":6},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`number > toJSON > supports numbers 4`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":6},\\"f\\":16383,\\"m\\":[]}"`; -exports[`number > toJSON > supports numbers 5`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":4},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`number > toJSON > supports numbers 5`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":4},\\"f\\":16383,\\"m\\":[]}"`; -exports[`number > toJSONAsync > supports numbers 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`number > toJSONAsync > supports numbers 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`number > toJSONAsync > supports numbers 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":7}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`number > toJSONAsync > supports numbers 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":7}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`number > toJSONAsync > supports numbers 3`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":5}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`number > toJSONAsync > supports numbers 3`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":5}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`number > toJSONAsync > supports numbers 4`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":6}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`number > toJSONAsync > supports numbers 4`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":6}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`number > toJSONAsync > supports numbers 5`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":4}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`number > toJSONAsync > supports numbers 5`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":4}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/object.test.ts.snap b/packages/seroval/test/__snapshots__/object.test.ts.snap index b93ca6b9..b40501e7 100644 --- a/packages/seroval/test/__snapshots__/object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/object.test.ts.snap @@ -2,31 +2,31 @@ exports[`objects > compat > should use manual assignment instead of Object.assign 1`] = `"({hello:\\"world\\"})"`; -exports[`objects > compat#toJSON > should use manual assignment instead of Object.assign 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16255,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`objects > compat#toJSON > should use manual assignment instead of Object.assign 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16255,\\"m\\":[]}"`; exports[`objects > compat#toJSON > should use manual assignment instead of Object.assign 2`] = `"({hello:\\"world\\"})"`; exports[`objects > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"})($R[\\"example\\"])"`; -exports[`objects > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`objects > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; exports[`objects > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; exports[`objects > crossSerialize > supports Objects 1`] = `"$R[0]={hello:\\"world\\"}"`; -exports[`objects > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`objects > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; exports[`objects > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],$R[0])"`; exports[`objects > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]={hello:\\"world\\"})"`; -exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`objects > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}"`; @@ -36,7 +36,7 @@ exports[`objects > crossSerializeStream > scoped > supports Objects 2`] = `"($R= exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`objects > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -52,7 +52,7 @@ exports[`objects > crossSerializeStream > supports Objects 2`] = `"_$.Ps($R[0],$ exports[`objects > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`objects > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -74,14 +74,14 @@ exports[`objects > serializeAsync > supports Symbol.iterator 1`] = `"Promise.res exports[`objects > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)}))()"`; -exports[`objects > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`objects > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`objects > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; +exports[`objects > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`objects > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`objects > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; -exports[`objects > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`objects > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`objects > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; +exports[`objects > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":5,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3}}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`objects > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`objects > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/plugin.test.ts.snap b/packages/seroval/test/__snapshots__/plugin.test.ts.snap index 30d4da25..859989d7 100644 --- a/packages/seroval/test/__snapshots__/plugin.test.ts.snap +++ b/packages/seroval/test/__snapshots__/plugin.test.ts.snap @@ -8,14 +8,14 @@ exports[`Plugin > crossSerializeAsync > scoped > supports Plugin 1`] = `"($R=>$R exports[`Plugin > crossSerializeAsync > supports Plugin 1`] = `"$R[0]=Promise.resolve(Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\"))"`; -exports[`Plugin > crossSerializeStream > scoped > supports Plugin 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})}))($R[\\"example\\"])"`; +exports[`Plugin > crossSerializeStream > scoped > supports Plugin 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})}))($R[\\"example\\"])"`; -exports[`Plugin > crossSerializeStream > supports Plugin 1`] = `"$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})})"`; +exports[`Plugin > crossSerializeStream > supports Plugin 1`] = `"$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})})"`; exports[`Plugin > serialize > supports Plugin 1`] = `"Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\")"`; exports[`Plugin > serializeAsync > supports Plugin 1`] = `"Promise.resolve(Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\"))"`; -exports[`Plugin > serializeAsync > supports Plugin 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":40,\\"i\\":1,\\"s\\":{\\"t\\":1,\\"s\\":\\"SGVsbG8sIFdvcmxkIQ==\\"},\\"c\\":\\"Buffer\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Plugin > serializeAsync > supports Plugin 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":40,\\"i\\":1,\\"s\\":{\\"t\\":1,\\"s\\":\\"SGVsbG8sIFdvcmxkIQ==\\"},\\"c\\":\\"Buffer\\"}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Plugin > toJSON > supports Plugin 1`] = `"{\\"t\\":{\\"t\\":40,\\"i\\":0,\\"s\\":{\\"t\\":1,\\"s\\":\\"SGVsbG8sIFdvcmxkIQ==\\"},\\"c\\":\\"Buffer\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Plugin > toJSON > supports Plugin 1`] = `"{\\"t\\":{\\"t\\":40,\\"i\\":0,\\"s\\":{\\"t\\":1,\\"s\\":\\"SGVsbG8sIFdvcmxkIQ==\\"},\\"c\\":\\"Buffer\\"},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/reference.test.ts.snap b/packages/seroval/test/__snapshots__/reference.test.ts.snap index bd7e6bf2..4f67b7cc 100644 --- a/packages/seroval/test/__snapshots__/reference.test.ts.snap +++ b/packages/seroval/test/__snapshots__/reference.test.ts.snap @@ -20,6 +20,6 @@ exports[`Reference > serialize > supports Reference 1`] = `"__SEROVAL_REFS__.get exports[`Reference > serializeAsync > supports Reference 1`] = `"Promise.resolve(__SEROVAL_REFS__.get(\\"example\\"))"`; -exports[`Reference > toJSON > supports Reference 1`] = `"{\\"t\\":{\\"t\\":20,\\"i\\":0,\\"s\\":\\"example\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Reference > toJSON > supports Reference 1`] = `"{\\"t\\":{\\"t\\":20,\\"i\\":0,\\"s\\":\\"example\\"},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Reference > toJSONAsync > supports Reference 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":20,\\"i\\":1,\\"s\\":\\"example\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Reference > toJSONAsync > supports Reference 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":20,\\"i\\":1,\\"s\\":\\"example\\"}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/regexp.test.ts.snap b/packages/seroval/test/__snapshots__/regexp.test.ts.snap index 530e448c..7b483994 100644 --- a/packages/seroval/test/__snapshots__/regexp.test.ts.snap +++ b/packages/seroval/test/__snapshots__/regexp.test.ts.snap @@ -20,6 +20,6 @@ exports[`RegExp > serialize > supports RegExp 1`] = `"/[a-z0-9]+/i"`; exports[`RegExp > serializeAsync > supports RegExp 1`] = `"Promise.resolve(/[a-z0-9]+/i)"`; -exports[`RegExp > toJSON > supports RegExp 1`] = `"{\\"t\\":{\\"t\\":6,\\"i\\":0,\\"c\\":\\"[a-z0-9]+\\",\\"m\\":\\"i\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`RegExp > toJSON > supports RegExp 1`] = `"{\\"t\\":{\\"t\\":6,\\"i\\":0,\\"c\\":\\"[a-z0-9]+\\",\\"m\\":\\"i\\"},\\"f\\":16383,\\"m\\":[]}"`; -exports[`RegExp > toJSONAsync > supports RegExp 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":6,\\"i\\":1,\\"c\\":\\"[a-z0-9]+\\",\\"m\\":\\"i\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`RegExp > toJSONAsync > supports RegExp 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":6,\\"i\\":1,\\"c\\":\\"[a-z0-9]+\\",\\"m\\":\\"i\\"}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap index 0fc93292..b321fc78 100644 --- a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap @@ -2,25 +2,25 @@ exports[`sealed object > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.seal($R[0]),$R[0])"`; -exports[`sealed object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; +exports[`sealed object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])"`; -exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; exports[`sealed object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])"`; @@ -30,7 +30,7 @@ exports[`sealed object > crossSerializeStream > scoped > supports Objects 2`] = exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -46,7 +46,7 @@ exports[`sealed object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps( exports[`sealed object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[Symbol.iterator]:($R[-2]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; exports[`sealed object > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -68,14 +68,14 @@ exports[`sealed object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j exports[`sealed object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.seal(h),h))()"`; -exports[`sealed object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`sealed object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`sealed object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":2},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; +exports[`sealed object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`sealed object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":2},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`sealed object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":2,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; -exports[`sealed object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`sealed object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`sealed object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; +exports[`sealed object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":5,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3}}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`sealed object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":2},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`sealed object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":2,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/set.test.ts.snap b/packages/seroval/test/__snapshots__/set.test.ts.snap index ea9a7cff..3cc264d4 100644 --- a/packages/seroval/test/__snapshots__/set.test.ts.snap +++ b/packages/seroval/test/__snapshots__/set.test.ts.snap @@ -4,7 +4,7 @@ exports[`Set > compat > should fallback to Symbol.iterator 1`] = `"Object.assign exports[`Set > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; -exports[`Set > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}],\\"s\\":1},\\"o\\":0},\\"f\\":15871,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":1}}"`; +exports[`Set > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":15871,\\"m\\":[]}"`; exports[`Set > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; @@ -48,10 +48,10 @@ exports[`Set > serializeAsync > supports Set 1`] = `"Promise.resolve(new Set([1, exports[`Set > serializeAsync > supports self-recursion 1`] = `"(h=>(h=new Set([Promise.resolve().then(()=>h)])))()"`; -exports[`Set > toJSON > supports Set 1`] = `"{\\"t\\":{\\"t\\":7,\\"i\\":0,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}]},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Set > toJSON > supports Set 1`] = `"{\\"t\\":{\\"t\\":7,\\"i\\":0,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}]},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Set > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":7,\\"i\\":0,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":0}]},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Set > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":7,\\"i\\":0,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":0}]},\\"f\\":16383,\\"m\\":[0]}"`; -exports[`Set > toJSONAsync > supports Set 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":7,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}]}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Set > toJSONAsync > supports Set 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":7,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}]}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Set > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":7,\\"i\\":0,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}]},\\"f\\":16383,\\"m\\":[0],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Set > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":7,\\"i\\":0,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}]},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap b/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap index cae8b9d5..e121d37c 100644 --- a/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap +++ b/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap @@ -20,6 +20,6 @@ exports[`sparse arrays > serialize > supports sparse arrays 1`] = `"[,,,,,,,,,,] exports[`sparse arrays > serializeAsync > supports sparse arrays 1`] = `"Promise.resolve([,,,,,,,,,,])"`; -exports[`sparse arrays > toJSON > supports sparse arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":10,\\"a\\":[],\\"o\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`sparse arrays > toJSON > supports sparse arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":10,\\"a\\":[],\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`sparse arrays > toJSONAsync > supports sparse arrays 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":1,\\"l\\":10,\\"a\\":[],\\"o\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`sparse arrays > toJSONAsync > supports sparse arrays 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":1,\\"l\\":10,\\"a\\":[],\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/string.test.ts.snap b/packages/seroval/test/__snapshots__/string.test.ts.snap index 8eeec09c..b9d81b0a 100644 --- a/packages/seroval/test/__snapshots__/string.test.ts.snap +++ b/packages/seroval/test/__snapshots__/string.test.ts.snap @@ -24,10 +24,10 @@ exports[`string > serializeAsync > supports strings 1`] = `"Promise.resolve(\\"\ exports[`string > serializeAsync > supports strings 2`] = `"Promise.resolve(\\"\\\\x3Cscript>\\\\x3C/script>\\")"`; -exports[`string > toJSON > supports strings 1`] = `"{\\"t\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`string > toJSON > supports strings 1`] = `"{\\"t\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"},\\"f\\":16383,\\"m\\":[]}"`; -exports[`string > toJSON > supports strings 2`] = `"{\\"t\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`string > toJSON > supports strings 2`] = `"{\\"t\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"},\\"f\\":16383,\\"m\\":[]}"`; -exports[`string > toJSONAsync > supports strings 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`string > toJSONAsync > supports strings 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`string > toJSONAsync > supports strings 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`string > toJSONAsync > supports strings 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/typed-array.test.ts.snap b/packages/seroval/test/__snapshots__/typed-array.test.ts.snap index 115d7816..766504ba 100644 --- a/packages/seroval/test/__snapshots__/typed-array.test.ts.snap +++ b/packages/seroval/test/__snapshots__/typed-array.test.ts.snap @@ -20,6 +20,6 @@ exports[`typed arrays > serialize > supports typed arrays 1`] = `"new Uint32Arra exports[`typed arrays > serializeAsync > supports typed arrays 1`] = `"Promise.resolve(new Uint32Array(new Uint8Array([255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]).buffer,0,4))"`; -exports[`typed arrays > toJSON > supports typed arrays 1`] = `"{\\"t\\":{\\"t\\":15,\\"i\\":0,\\"l\\":4,\\"c\\":\\"Uint32Array\\",\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]},\\"b\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`typed arrays > toJSON > supports typed arrays 1`] = `"{\\"t\\":{\\"t\\":15,\\"i\\":0,\\"l\\":4,\\"c\\":\\"Uint32Array\\",\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]},\\"b\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`typed arrays > toJSONAsync > supports typed arrays 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":15,\\"i\\":1,\\"l\\":4,\\"c\\":\\"Uint32Array\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]},\\"b\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`typed arrays > toJSONAsync > supports typed arrays 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":15,\\"i\\":1,\\"l\\":4,\\"c\\":\\"Uint32Array\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]},\\"b\\":0}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap b/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap index 8781d972..19a147d1 100644 --- a/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap +++ b/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap @@ -260,54 +260,54 @@ exports[`well-known symbols > serializeAsync > supports well-known symbols 12`] exports[`well-known symbols > serializeAsync > supports well-known symbols 13`] = `"Promise.resolve(Symbol.unscopables)"`; -exports[`well-known symbols > toJSON > supports well-known symbols 1`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":0},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 1`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 2`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":1},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 2`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":1},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 3`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":2},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 3`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":2},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 4`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":3},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 4`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":3},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 5`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":4},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 5`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":4},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 6`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":5},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 6`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":5},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 7`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":6},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 7`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":6},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 8`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":7},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 8`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":7},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 9`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":8},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 9`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":8},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 10`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":9},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 10`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":9},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 11`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":10},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 11`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":10},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 12`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":11},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 12`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":11},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSON > supports well-known symbols 13`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":12},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSON > supports well-known symbols 13`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":12},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":0}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":1}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":1}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 3`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 3`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 4`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":3}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 4`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":3}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 5`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":4}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 5`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":4}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 6`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":5}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 6`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":5}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 7`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":6}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 7`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":6}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 8`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":7}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 8`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":7}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 9`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":8}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 9`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":8}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 10`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":9}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 10`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":9}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 11`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":10}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 11`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":10}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 12`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":11}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 12`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":11}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`well-known symbols > toJSONAsync > supports well-known symbols 13`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":12}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`well-known symbols > toJSONAsync > supports well-known symbols 13`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":12}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap index 1c59685d..53debf42 100644 --- a/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap @@ -6,4 +6,4 @@ exports[`Blob > crossSerializeAsync > supports Blob 1`] = `"$R[0]=Promise.resolv exports[`Blob > serializeAsync > supports Blob 1`] = `"Promise.resolve(new Blob([new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],{type:\\"text/plain\\"}))"`; -exports[`Blob > toJSONAsync > supports Blob 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":23,\\"i\\":1,\\"c\\":\\"text/plain\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Blob > toJSONAsync > supports Blob 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":23,\\"i\\":1,\\"c\\":\\"text/plain\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]}}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap index c240654c..ec5a4e3c 100644 --- a/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap @@ -20,6 +20,6 @@ exports[`CustomEvent > serialize > supports CustomEvent 1`] = `"((h,j)=>(j=new C exports[`CustomEvent > serializeAsync > supports CustomEvent 1`] = `"((h,j)=>(j=Promise.resolve(new CustomEvent(\\"example\\",{detail:h={},bubbles:!1,cancelable:!1,composed:!1})),h.self=h,j))()"`; -exports[`CustomEvent > toJSON > supports CustomEvent 1`] = `"{\\"t\\":{\\"t\\":38,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":2}],\\"s\\":1},\\"o\\":0},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0}},\\"f\\":16383,\\"m\\":[2],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`CustomEvent > toJSON > supports CustomEvent 1`] = `"{\\"t\\":{\\"t\\":38,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":2}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[2]}"`; -exports[`CustomEvent > toJSONAsync > supports CustomEvent 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":38,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":3}],\\"s\\":1},\\"o\\":0},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0}}},\\"f\\":16383,\\"m\\":[3],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`CustomEvent > toJSONAsync > supports CustomEvent 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":38,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":3}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0,\\"x\\":{}}}},\\"f\\":16383,\\"m\\":[3]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap index 7cb25461..7ef3b042 100644 --- a/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap @@ -20,6 +20,6 @@ exports[`DOMException > serialize > supports DOMException 1`] = `"new DOMExcepti exports[`DOMException > serializeAsync > supports DOMException 1`] = `"Promise.resolve(new DOMException(\\"This is an example message.\\",\\"Example\\"))"`; -exports[`DOMException > toJSON > supports DOMException 1`] = `"{\\"t\\":{\\"t\\":39,\\"i\\":0,\\"s\\":\\"This is an example message.\\",\\"c\\":\\"Example\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`DOMException > toJSON > supports DOMException 1`] = `"{\\"t\\":{\\"t\\":39,\\"i\\":0,\\"s\\":\\"This is an example message.\\",\\"c\\":\\"Example\\"},\\"f\\":16383,\\"m\\":[]}"`; -exports[`DOMException > toJSONAsync > supports DOMException 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":39,\\"i\\":1,\\"s\\":\\"This is an example message.\\",\\"c\\":\\"Example\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`DOMException > toJSONAsync > supports DOMException 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":39,\\"i\\":1,\\"s\\":\\"This is an example message.\\",\\"c\\":\\"Example\\"}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap index 42485f82..0c26f6dc 100644 --- a/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap @@ -20,6 +20,6 @@ exports[`Event > serialize > supports Event 1`] = `"new Event(\\"example\\",{bub exports[`Event > serializeAsync > supports Event 1`] = `"Promise.resolve(new Event(\\"example\\",{bubbles:!1,cancelable:!1,composed:!1}))"`; -exports[`Event > toJSON > supports Event 1`] = `"{\\"t\\":{\\"t\\":37,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Event > toJSON > supports Event 1`] = `"{\\"t\\":{\\"t\\":37,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Event > toJSONAsync > supports Event 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":37,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Event > toJSONAsync > supports Event 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":37,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap index b11cd21c..cddf69a6 100644 --- a/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap @@ -6,4 +6,4 @@ exports[`File > crossSerializeAsync > supports File 1`] = `"$R[0]=Promise.resolv exports[`File > serializeAsync > supports File 1`] = `"Promise.resolve(new File([new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680}))"`; -exports[`File > toJSONAsync > supports File 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":24,\\"i\\":1,\\"c\\":\\"text/plain\\",\\"m\\":\\"hello.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]},\\"b\\":1681027542680}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`File > toJSONAsync > supports File 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":24,\\"i\\":1,\\"c\\":\\"text/plain\\",\\"m\\":\\"hello.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]},\\"b\\":1681027542680}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap index 99f9b1ff..13036c83 100644 --- a/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap @@ -20,6 +20,6 @@ exports[`FormData > serialize > supports FormData 1`] = `"(h=>((h=new FormData() exports[`FormData > serializeAsync > supports FormData 1`] = `"(h=>(Promise.resolve((h=new FormData(),h.append(\\"hello-world\\",new File([new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),h.append(\\"foo-bar\\",new File([new Uint8Array([70,111,111,32,66,97,114]).buffer],\\"foo-bar.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),h))))()"`; -exports[`FormData > toJSON > supports FormData 1`] = `"{\\"t\\":{\\"t\\":26,\\"i\\":0,\\"e\\":{\\"k\\":[\\"hello\\",\\"foo\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"},{\\"t\\":1,\\"s\\":\\"bar\\"}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`FormData > toJSON > supports FormData 1`] = `"{\\"t\\":{\\"t\\":26,\\"i\\":0,\\"e\\":{\\"k\\":[\\"hello\\",\\"foo\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"},{\\"t\\":1,\\"s\\":\\"bar\\"}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`FormData > toJSONAsync > supports FormData 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":26,\\"i\\":1,\\"e\\":{\\"k\\":[\\"example\\",\\"foo-bar\\"],\\"v\\":[{\\"t\\":24,\\"i\\":2,\\"c\\":\\"text/plain\\",\\"m\\":\\"hello.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":3,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]},\\"b\\":1681027542680},{\\"t\\":24,\\"i\\":4,\\"c\\":\\"text/plain\\",\\"m\\":\\"foo-bar.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":5,\\"s\\":[70,111,111,32,66,97,114]},\\"b\\":1681027542680}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`FormData > toJSONAsync > supports FormData 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":26,\\"i\\":1,\\"e\\":{\\"k\\":[\\"example\\",\\"foo-bar\\"],\\"v\\":[{\\"t\\":24,\\"i\\":2,\\"c\\":\\"text/plain\\",\\"m\\":\\"hello.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":3,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]},\\"b\\":1681027542680},{\\"t\\":24,\\"i\\":4,\\"c\\":\\"text/plain\\",\\"m\\":\\"foo-bar.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":5,\\"s\\":[70,111,111,32,66,97,114]},\\"b\\":1681027542680}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap index d40ea12c..37a43a5a 100644 --- a/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap @@ -20,6 +20,6 @@ exports[`Headers > serialize > supports Headers 1`] = `"new Headers({\\"content- exports[`Headers > serializeAsync > supports Headers 1`] = `"Promise.resolve(new Headers({\\"content-encoding\\":\\"gzip\\",\\"content-type\\":\\"text/plain\\"}))"`; -exports[`Headers > toJSON > supports Headers 1`] = `"{\\"t\\":{\\"t\\":25,\\"i\\":0,\\"e\\":{\\"k\\":[\\"content-encoding\\",\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"gzip\\"},{\\"t\\":1,\\"s\\":\\"text/plain\\"}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Headers > toJSON > supports Headers 1`] = `"{\\"t\\":{\\"t\\":25,\\"i\\":0,\\"e\\":{\\"k\\":[\\"content-encoding\\",\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"gzip\\"},{\\"t\\":1,\\"s\\":\\"text/plain\\"}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Headers > toJSONAsync > supports Headers 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":25,\\"i\\":1,\\"e\\":{\\"k\\":[\\"content-encoding\\",\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"gzip\\"},{\\"t\\":1,\\"s\\":\\"text/plain\\"}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Headers > toJSONAsync > supports Headers 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":25,\\"i\\":1,\\"e\\":{\\"k\\":[\\"content-encoding\\",\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"gzip\\"},{\\"t\\":1,\\"s\\":\\"text/plain\\"}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap index c5b60f17..a24b7465 100644 --- a/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap @@ -18,4 +18,4 @@ exports[`Request > crossSerializeStream > supports Request 3`] = `"_$.Se($R[2],2 exports[`Request > serializeAsync > supports Request 1`] = `"new Request(\\"http://localhost:3000/\\",{body:new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,cache:\\"default\\",credentials:\\"same-origin\\",headers:new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),integrity:\\"\\",keepalive:!1,method:\\"POST\\",mode:\\"cors\\",redirect:\\"follow\\",referrer:\\"about:client\\",referrerPolicy:\\"\\"})"`; -exports[`Request > toJSONAsync > supports Request 1`] = `"{\\"t\\":{\\"t\\":35,\\"i\\":0,\\"s\\":\\"http://localhost:3000/\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"body\\",\\"cache\\",\\"credentials\\",\\"headers\\",\\"integrity\\",\\"keepalive\\",\\"method\\",\\"mode\\",\\"redirect\\",\\"referrer\\",\\"referrerPolicy\\"],\\"v\\":[{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":1,\\"s\\":\\"default\\"},{\\"t\\":1,\\"s\\":\\"same-origin\\"},{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":2,\\"s\\":3},{\\"t\\":1,\\"s\\":\\"POST\\"},{\\"t\\":1,\\"s\\":\\"cors\\"},{\\"t\\":1,\\"s\\":\\"follow\\"},{\\"t\\":1,\\"s\\":\\"about:client\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":11},\\"o\\":0}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Request > toJSONAsync > supports Request 1`] = `"{\\"t\\":{\\"t\\":35,\\"i\\":0,\\"s\\":\\"http://localhost:3000/\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"body\\",\\"cache\\",\\"credentials\\",\\"headers\\",\\"integrity\\",\\"keepalive\\",\\"method\\",\\"mode\\",\\"redirect\\",\\"referrer\\",\\"referrerPolicy\\"],\\"v\\":[{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":1,\\"s\\":\\"default\\"},{\\"t\\":1,\\"s\\":\\"same-origin\\"},{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":2,\\"s\\":3},{\\"t\\":1,\\"s\\":\\"POST\\"},{\\"t\\":1,\\"s\\":\\"cors\\"},{\\"t\\":1,\\"s\\":\\"follow\\"},{\\"t\\":1,\\"s\\":\\"about:client\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":11},\\"o\\":0,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap index be9435e6..140d86e0 100644 --- a/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap @@ -18,4 +18,4 @@ exports[`Response > crossSerializeStream > supports Response 3`] = `"_$.Se($R[1] exports[`Response > serializeAsync > supports Response 1`] = `"new Response(new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,{headers:new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),status:200,statusText:\\"\\"})"`; -exports[`Response > toJSONAsync > supports Response 1`] = `"{\\"t\\":{\\"t\\":36,\\"i\\":0,\\"a\\":[{\\"t\\":21,\\"i\\":1,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"headers\\",\\"status\\",\\"statusText\\"],\\"v\\":[{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":0,\\"s\\":200},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":3},\\"o\\":0}]},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`Response > toJSONAsync > supports Response 1`] = `"{\\"t\\":{\\"t\\":36,\\"i\\":0,\\"a\\":[{\\"t\\":21,\\"i\\":1,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"headers\\",\\"status\\",\\"statusText\\"],\\"v\\":[{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":0,\\"s\\":200},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}]},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap index c0228ee5..4c99f18c 100644 --- a/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap @@ -20,6 +20,6 @@ exports[`URLSearchParams > serialize > supports URLSearchParams 1`] = `"new URLS exports[`URLSearchParams > serializeAsync > supports URLSearchParams 1`] = `"Promise.resolve(new URLSearchParams(\\"hello=world&foo=bar\\"))"`; -exports[`URLSearchParams > toJSON > supports URLSearchParams 1`] = `"{\\"t\\":{\\"t\\":19,\\"i\\":0,\\"s\\":\\"hello=world&foo=bar\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`URLSearchParams > toJSON > supports URLSearchParams 1`] = `"{\\"t\\":{\\"t\\":19,\\"i\\":0,\\"s\\":\\"hello=world&foo=bar\\"},\\"f\\":16383,\\"m\\":[]}"`; -exports[`URLSearchParams > toJSONAsync > supports URLSearchParams 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":19,\\"i\\":1,\\"s\\":\\"hello=world&foo=bar\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`URLSearchParams > toJSONAsync > supports URLSearchParams 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":19,\\"i\\":1,\\"s\\":\\"hello=world&foo=bar\\"}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap index 85179e7a..b6fd200a 100644 --- a/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap @@ -20,6 +20,6 @@ exports[`URL > serialize > supports URL 1`] = `"new URL(\\"https://github.com/lx exports[`URL > serializeAsync > supports URL 1`] = `"Promise.resolve(new URL(\\"https://github.com/lxsmnsyc/seroval?hello=world\\"))"`; -exports[`URL > toJSON > supports URL 1`] = `"{\\"t\\":{\\"t\\":18,\\"i\\":0,\\"s\\":\\"https://github.com/lxsmnsyc/seroval?hello=world\\"},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`URL > toJSON > supports URL 1`] = `"{\\"t\\":{\\"t\\":18,\\"i\\":0,\\"s\\":\\"https://github.com/lxsmnsyc/seroval?hello=world\\"},\\"f\\":16383,\\"m\\":[]}"`; -exports[`URL > toJSONAsync > supports URL 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":18,\\"i\\":1,\\"s\\":\\"https://github.com/lxsmnsyc/seroval?hello=world\\"}},\\"f\\":16383,\\"m\\":[],\\"s\\":{\\"0\\":0,\\"1\\":0}}"`; +exports[`URL > toJSONAsync > supports URL 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":18,\\"i\\":1,\\"s\\":\\"https://github.com/lxsmnsyc/seroval?hello=world\\"}},\\"f\\":16383,\\"m\\":[]}"`; From ae33b9497cdbd323ca7195c7fcd12790cbd4a9df Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Tue, 14 Nov 2023 12:03:20 +0800 Subject: [PATCH 05/82] Remove `MethodShorthand` and `ArrayPrototypeValues` --- docs/compatibility.md | 5 -- packages/seroval/src/core/compat.ts | 2 - .../test/__snapshots__/iterable.test.ts.snap | 8 +--- packages/seroval/test/iterable.test.ts | 26 +--------- packages/seroval/test2.js | 48 ++++++++++++------- 5 files changed, 35 insertions(+), 54 deletions(-) diff --git a/docs/compatibility.md b/docs/compatibility.md index d745a90f..02a4ab9c 100644 --- a/docs/compatibility.md +++ b/docs/compatibility.md @@ -46,8 +46,6 @@ By default, all feature flags are enabled. The following are the feature flags a - [`AggregateError`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/AggregateError) - Compiles down to `Error` instead. -- [`ArrayPrototypeValues`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/values) - - Used for `Iterable`, uses `Symbol.iterator` instead. - [`ArrowFunction`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions) - Uses function expressions for top-level and for deferred `Promise` values - method shorthands (if `MethodShortand` is not set) or function expressions for `Iterable`. @@ -58,9 +56,6 @@ By default, all feature flags are enabled. The following are the feature flags a - Affects both `Error` and `AggregateError` - [`Map`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map) - Disables serialization of `Map` -- [`MethodShorthand`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Method_definitions) - - Uses function expressions instead. - - Only affects `Iterable` - [`ObjectAssign`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) - Uses manual object assignments instead. - Affects `Iterable`, `Error`, `AggregateError` and `Object.create(null)` diff --git a/packages/seroval/src/core/compat.ts b/packages/seroval/src/core/compat.ts index 9b341462..32eaff9d 100644 --- a/packages/seroval/src/core/compat.ts +++ b/packages/seroval/src/core/compat.ts @@ -6,12 +6,10 @@ export const enum Feature { AggregateError = 0x01, - ArrayPrototypeValues = 0x02, ArrowFunction = 0x04, BigInt = 0x08, ErrorPrototypeStack = 0x10, Map = 0x20, - MethodShorthand = 0x40, ObjectAssign = 0x80, Promise = 0x100, Set = 0x200, diff --git a/packages/seroval/test/__snapshots__/iterable.test.ts.snap b/packages/seroval/test/__snapshots__/iterable.test.ts.snap index 32eb774e..4f9a8c91 100644 --- a/packages/seroval/test/__snapshots__/iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/iterable.test.ts.snap @@ -1,16 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Iterable > compat > should use Symbol.iterator instead of Array.values. 1`] = `"(h=>(h={[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[h,void 0],t:-1,d:1})}))()"`; - exports[`Iterable > compat > should use functions instead of method shorthand. 1`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; exports[`Iterable > compat > should use method shorthand instead of arrow functions. 1`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16381,\\"m\\":[0]}"`; - -exports[`Iterable > compat#toJSON > should use Symbol.iterator instead of Array.values. 2`] = `"(h=>(h={[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[h,void 0],t:-1,d:1})}))()"`; - -exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16315,\\"m\\":[0]}"`; +exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16379,\\"m\\":[0]}"`; exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 2`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; diff --git a/packages/seroval/test/iterable.test.ts b/packages/seroval/test/iterable.test.ts index e38cc653..596e5f00 100644 --- a/packages/seroval/test/iterable.test.ts +++ b/packages/seroval/test/iterable.test.ts @@ -196,16 +196,6 @@ describe('Iterable', () => { }); }); describe('compat', () => { - it('should use Symbol.iterator instead of Array.values.', () => { - const example = { - * [Symbol.iterator](): unknown { - yield example; - }, - }; - expect(serialize(example, { - disabledFeatures: Feature.ArrayPrototypeValues, - })).toMatchSnapshot(); - }); it('should use method shorthand instead of arrow functions.', () => { const example = { * [Symbol.iterator](): unknown { @@ -223,23 +213,11 @@ describe('Iterable', () => { }, }; expect(serialize(example, { - disabledFeatures: Feature.MethodShorthand | Feature.ArrowFunction, + disabledFeatures: Feature.ArrowFunction, })).toMatchSnapshot(); }); }); describe('compat#toJSON', () => { - it('should use Symbol.iterator instead of Array.values.', () => { - const example = { - * [Symbol.iterator](): unknown { - yield example; - }, - }; - const result = toJSON(example, { - disabledFeatures: Feature.ArrayPrototypeValues, - }); - expect(JSON.stringify(result)).toMatchSnapshot(); - expect(compileJSON(result)).toMatchSnapshot(); - }); it('should use method shorthand instead of arrow functions.', () => { const example = { * [Symbol.iterator](): unknown { @@ -259,7 +237,7 @@ describe('Iterable', () => { }, }; const result = toJSON(example, { - disabledFeatures: Feature.MethodShorthand | Feature.ArrowFunction, + disabledFeatures: Feature.ArrowFunction, }); expect(JSON.stringify(result)).toMatchSnapshot(); expect(compileJSON(result)).toMatchSnapshot(); diff --git a/packages/seroval/test2.js b/packages/seroval/test2.js index 665407ff..b9d4d16d 100644 --- a/packages/seroval/test2.js +++ b/packages/seroval/test2.js @@ -1,17 +1,33 @@ -import { crossSerializeStream } from './dist/esm/development/index.mjs'; - -const source = new ReadableStream({ - start(controller) { - controller.enqueue('Hello'); - controller.enqueue('World'); - controller.close(); - } -}) - -crossSerializeStream(source, { - scopeId: 'example', - onSerialize(data) { - console.log([data]); - } -}); +import { serialize } from './dist/esm/development/index.mjs'; + +// const instance = new Serializer({ +// globalIdentifier: 'test', +// onData: console.log, +// }); + +// const example = { foo: 'bar' }; + +// function* hello() { +// yield example; +// } + +// instance.write('foo', hello()); +// instance.write('bar', hello()); + +const example = { + a: new Map(), + b: new Set(), +}; + +example.a.set(example.a, example.b); + +const example2 = { + foo: new Map(), + bar: new Set(), +}; + +example2.foo.set(example2.foo, example2.bar); +example2.heck = example; + +console.log(serialize(example2)); \ No newline at end of file From 81ef387c85e86f426343f435c2929441b638cd79 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Tue, 14 Nov 2023 12:37:06 +0800 Subject: [PATCH 06/82] Rename`SPECIAL_REF_SYMBOL` --- packages/seroval/src/core/base/sync.ts | 4 +--- packages/seroval/src/core/cross/cross-parser.ts | 4 +--- packages/seroval/src/core/parser-context.ts | 4 ++-- packages/seroval/src/core/special-reference.ts | 6 +++--- 4 files changed, 7 insertions(+), 11 deletions(-) diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index ae0970fb..1d6692d9 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -61,9 +61,7 @@ type ObjectLikeNode = | SerovalObjectNode | SerovalNullConstructorNode; -export interface BaseSyncParserContextOptions extends BaseParserContextOptions { - refs?: Map; -} +export type BaseSyncParserContextOptions = BaseParserContextOptions export default abstract class BaseSyncParserContext extends BaseParserContext { protected parseItems( diff --git a/packages/seroval/src/core/cross/cross-parser.ts b/packages/seroval/src/core/cross/cross-parser.ts index 99932aa7..b5ea8040 100644 --- a/packages/seroval/src/core/cross/cross-parser.ts +++ b/packages/seroval/src/core/cross/cross-parser.ts @@ -1,8 +1,6 @@ import type { BaseParserContextOptions } from '../parser-context'; -export interface CrossParserContextOptions extends BaseParserContextOptions { - refs?: Map; -} +export type CrossParserContextOptions = BaseParserContextOptions export interface CrossContextOptions { scopeId?: string; diff --git a/packages/seroval/src/core/parser-context.ts b/packages/seroval/src/core/parser-context.ts index b11d3d32..cb11b3a4 100644 --- a/packages/seroval/src/core/parser-context.ts +++ b/packages/seroval/src/core/parser-context.ts @@ -4,7 +4,7 @@ import { SerovalNodeType } from './constants'; import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; import { hasReferenceID } from './reference'; import type { SpecialReference } from './special-reference'; -import { SPECIAL_REF_SYMBOL } from './special-reference'; +import { SPECIAL_REFS } from './special-reference'; import type { SerovalIndexedValueNode, SerovalReferenceNode, SerovalSpecialReferenceNode, } from './types'; @@ -67,7 +67,7 @@ export abstract class BaseParserContext implements PluginAccessOptions { protected parseSpecialReference( current: SpecialReference, ): SerovalIndexedValueNode | SerovalReferenceNode | SerovalSpecialReferenceNode { - const ref = this.getReference(SPECIAL_REF_SYMBOL[current]); + const ref = this.getReference(SPECIAL_REFS[current]); if (typeof ref === 'number') { return { t: SerovalNodeType.SpecialReference, diff --git a/packages/seroval/src/core/special-reference.ts b/packages/seroval/src/core/special-reference.ts index e4c0c6ee..e2607790 100644 --- a/packages/seroval/src/core/special-reference.ts +++ b/packages/seroval/src/core/special-reference.ts @@ -12,9 +12,9 @@ export const enum SpecialReference { SymbolIterator = 2, } -export const SPECIAL_REF_SYMBOL: Record = { - [SpecialReference.Sentinel]: Symbol(''), - [SpecialReference.Iterator]: Symbol(''), +export const SPECIAL_REFS: Record = { + [SpecialReference.Sentinel]: [], + [SpecialReference.Iterator]: [], [SpecialReference.SymbolIterator]: Symbol.iterator, }; From 96a3b325cc8719ccec0785041e4ed2206b672c12 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Tue, 14 Nov 2023 15:11:50 +0800 Subject: [PATCH 07/82] Change `SPECIAL_REFS` to a mapper function --- packages/seroval/src/core/parser-context.ts | 6 ++++-- .../seroval/src/core/special-reference.ts | 20 ++++++++++++++----- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/packages/seroval/src/core/parser-context.ts b/packages/seroval/src/core/parser-context.ts index cb11b3a4..b7cf610e 100644 --- a/packages/seroval/src/core/parser-context.ts +++ b/packages/seroval/src/core/parser-context.ts @@ -4,7 +4,7 @@ import { SerovalNodeType } from './constants'; import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; import { hasReferenceID } from './reference'; import type { SpecialReference } from './special-reference'; -import { SPECIAL_REFS } from './special-reference'; +import { getSpecialReferenceSource } from './special-reference'; import type { SerovalIndexedValueNode, SerovalReferenceNode, SerovalSpecialReferenceNode, } from './types'; @@ -67,7 +67,9 @@ export abstract class BaseParserContext implements PluginAccessOptions { protected parseSpecialReference( current: SpecialReference, ): SerovalIndexedValueNode | SerovalReferenceNode | SerovalSpecialReferenceNode { - const ref = this.getReference(SPECIAL_REFS[current]); + const ref = this.getReference( + getSpecialReferenceSource(this.features, current), + ); if (typeof ref === 'number') { return { t: SerovalNodeType.SpecialReference, diff --git a/packages/seroval/src/core/special-reference.ts b/packages/seroval/src/core/special-reference.ts index e2607790..1e505798 100644 --- a/packages/seroval/src/core/special-reference.ts +++ b/packages/seroval/src/core/special-reference.ts @@ -12,11 +12,21 @@ export const enum SpecialReference { SymbolIterator = 2, } -export const SPECIAL_REFS: Record = { - [SpecialReference.Sentinel]: [], - [SpecialReference.Iterator]: [], - [SpecialReference.SymbolIterator]: Symbol.iterator, -}; +const SENTINEL_REF: never[] = []; +const ITERATOR_REF: never[] = []; + +export function getSpecialReferenceSource(features: number, ref: SpecialReference): unknown { + switch (ref) { + case SpecialReference.Sentinel: + return SENTINEL_REF; + case SpecialReference.Iterator: + return ITERATOR_REF; + case SpecialReference.SymbolIterator: + return Symbol.iterator; + default: + throw new Error('unknown special reference ' + ref); + } +} export function getSpecialReferenceValue(features: number, ref: SpecialReference): string { switch (ref) { From b3fbdb5dbfef9750a9b39fbe6d67e87313a3f952 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Tue, 14 Nov 2023 15:14:10 +0800 Subject: [PATCH 08/82] Remove use of symbols --- packages/seroval/src/core/constants.ts | 2 +- packages/seroval/src/core/special-reference.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/seroval/src/core/constants.ts b/packages/seroval/src/core/constants.ts index a78833c5..997c41c8 100644 --- a/packages/seroval/src/core/constants.ts +++ b/packages/seroval/src/core/constants.ts @@ -188,4 +188,4 @@ export const ERROR_CONSTRUCTOR: Record = [ErrorConstructorTag.URIError]: URIError, }; -export const UNIVERSAL_SENTINEL = Symbol('why'); +export const UNIVERSAL_SENTINEL = {}; diff --git a/packages/seroval/src/core/special-reference.ts b/packages/seroval/src/core/special-reference.ts index 1e505798..f7f256fb 100644 --- a/packages/seroval/src/core/special-reference.ts +++ b/packages/seroval/src/core/special-reference.ts @@ -12,8 +12,8 @@ export const enum SpecialReference { SymbolIterator = 2, } -const SENTINEL_REF: never[] = []; -const ITERATOR_REF: never[] = []; +const SENTINEL_REF = {}; +const ITERATOR_REF = {}; export function getSpecialReferenceSource(features: number, ref: SpecialReference): unknown { switch (ref) { From c5384390861a4054a4f42a6303da06ccc270dace Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Tue, 14 Nov 2023 15:18:54 +0800 Subject: [PATCH 09/82] Revert special refs map --- packages/seroval/src/core/parser-context.ts | 4 ++-- .../seroval/src/core/special-reference.ts | 20 +++++-------------- 2 files changed, 7 insertions(+), 17 deletions(-) diff --git a/packages/seroval/src/core/parser-context.ts b/packages/seroval/src/core/parser-context.ts index b7cf610e..1e24b410 100644 --- a/packages/seroval/src/core/parser-context.ts +++ b/packages/seroval/src/core/parser-context.ts @@ -4,7 +4,7 @@ import { SerovalNodeType } from './constants'; import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; import { hasReferenceID } from './reference'; import type { SpecialReference } from './special-reference'; -import { getSpecialReferenceSource } from './special-reference'; +import { SPECIAL_REFS } from './special-reference'; import type { SerovalIndexedValueNode, SerovalReferenceNode, SerovalSpecialReferenceNode, } from './types'; @@ -68,7 +68,7 @@ export abstract class BaseParserContext implements PluginAccessOptions { current: SpecialReference, ): SerovalIndexedValueNode | SerovalReferenceNode | SerovalSpecialReferenceNode { const ref = this.getReference( - getSpecialReferenceSource(this.features, current), + SPECIAL_REFS[current], ); if (typeof ref === 'number') { return { diff --git a/packages/seroval/src/core/special-reference.ts b/packages/seroval/src/core/special-reference.ts index f7f256fb..465f051f 100644 --- a/packages/seroval/src/core/special-reference.ts +++ b/packages/seroval/src/core/special-reference.ts @@ -12,21 +12,11 @@ export const enum SpecialReference { SymbolIterator = 2, } -const SENTINEL_REF = {}; -const ITERATOR_REF = {}; - -export function getSpecialReferenceSource(features: number, ref: SpecialReference): unknown { - switch (ref) { - case SpecialReference.Sentinel: - return SENTINEL_REF; - case SpecialReference.Iterator: - return ITERATOR_REF; - case SpecialReference.SymbolIterator: - return Symbol.iterator; - default: - throw new Error('unknown special reference ' + ref); - } -} +export const SPECIAL_REFS: Record = { + [SpecialReference.Sentinel]: {}, + [SpecialReference.Iterator]: {}, + [SpecialReference.SymbolIterator]: Symbol.iterator, +}; export function getSpecialReferenceValue(features: number, ref: SpecialReference): string { switch (ref) { From ccc3538cc90c0d3a60f374cc133389eb82487e4d Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Wed, 15 Nov 2023 20:51:04 +0800 Subject: [PATCH 10/82] Rework SpecialReference node --- packages/seroval/src/core/base-primitives.ts | 25 +++ packages/seroval/src/core/base/async.ts | 74 ++------ packages/seroval/src/core/base/sync.ts | 59 ++----- packages/seroval/src/core/constants.ts | 3 +- packages/seroval/src/core/parser-context.ts | 164 ++++++++++++++---- .../seroval/src/core/serializer-context.ts | 35 +++- .../seroval/src/core/special-reference.ts | 43 +---- packages/seroval/src/core/types.ts | 52 ++++-- .../__snapshots__/frozen-object.test.ts.snap | 20 +-- .../test/__snapshots__/iterable.test.ts.snap | 32 ++-- .../test/__snapshots__/map.test.ts.snap | 12 +- .../null-constructor.test.ts.snap | 20 +-- .../test/__snapshots__/object.test.ts.snap | 20 +-- .../test/__snapshots__/plugin.test.ts.snap | 4 +- .../__snapshots__/sealed-object.test.ts.snap | 20 +-- .../test/__snapshots__/set.test.ts.snap | 4 +- 16 files changed, 329 insertions(+), 258 deletions(-) diff --git a/packages/seroval/src/core/base-primitives.ts b/packages/seroval/src/core/base-primitives.ts index 8b468e54..a97de36e 100644 --- a/packages/seroval/src/core/base-primitives.ts +++ b/packages/seroval/src/core/base-primitives.ts @@ -8,13 +8,16 @@ import { NEG_ZERO_NODE, } from './literals'; import { getReferenceID } from './reference'; +import { getObjectFlag } from './shared'; import { serializeString } from './string'; import type { SerovalArrayBufferNode, + SerovalArrayNode, SerovalBigIntNode, SerovalConstantNode, SerovalDateNode, SerovalIndexedValueNode, + SerovalNode, SerovalNumberNode, SerovalPluginNode, SerovalReferenceNode, @@ -238,3 +241,25 @@ export function createPluginNode( x: undefined, }; } + +export function createArrayNode( + id: number, + current: unknown[], + parsedItems: SerovalNode[], +): SerovalArrayNode { + return { + t: SerovalNodeType.Array, + i: id, + s: undefined, + l: current.length, + c: undefined, + m: undefined, + p: undefined, + e: undefined, + a: parsedItems, + f: undefined, + b: undefined, + o: getObjectFlag(current), + x: undefined, + }; +} diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index a8ebd8d9..0a4a26a7 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -8,13 +8,12 @@ import { createDateNode, createRegExpNode, createArrayBufferNode, - createWKSymbolNode, createBigIntNode, createStringNode, createNumberNode, + createArrayNode, } from '../base-primitives'; import { BIGINT_FLAG, Feature } from '../compat'; -import type { WellKnownSymbols } from '../constants'; import { SerovalNodeType, UNIVERSAL_SENTINEL, @@ -34,8 +33,7 @@ import { import { iteratorToSequence } from '../iterator-to-sequence'; import { BaseParserContext } from '../parser-context'; import promiseToResult from '../promise-to-result'; -import { hasReferenceID } from '../reference'; -import { getErrorConstructor, getErrorOptions, getObjectFlag } from '../shared'; +import { getErrorConstructor, getErrorOptions } from '../shared'; import { serializeString } from '../string'; import { SerovalObjectRecordSpecialKey } from '../types'; import type { @@ -90,21 +88,11 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { id: number, current: unknown[], ): Promise { - return { - t: SerovalNodeType.Array, - i: id, - s: undefined, - l: current.length, - c: undefined, - m: undefined, - p: undefined, - e: undefined, - a: await this.parseItems(current), - f: undefined, - b: undefined, - o: getObjectFlag(current), - x: undefined, - }; + return createArrayNode( + id, + current, + await this.parseItems(current), + ); } private async parseBoxed( @@ -224,34 +212,12 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { current: Record, empty: boolean, ): Promise { - return { - t: empty ? SerovalNodeType.NullConstructor : SerovalNodeType.Object, - i: id, - s: undefined, - l: undefined, - c: undefined, - m: undefined, - p: await this.parseProperties(current), - e: undefined, - a: undefined, - f: undefined, - b: undefined, - o: getObjectFlag(current), - x: { - [SpecialReference.SymbolIterator]: ( - this.features & Feature.Symbol && Symbol.iterator in current - ? await this.parse(Symbol.iterator) - : undefined - ), - [SpecialReference.Iterator]: ( - this.features & Feature.Symbol && Symbol.iterator in current - ? this.parseSpecialReference( - SpecialReference.Iterator, - ) - : undefined - ), - }, - }; + return this.createObjectNode( + id, + current, + empty, + await this.parseProperties(current), + ); } private async parseError( @@ -303,7 +269,9 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { b: undefined, o: undefined, x: { - [SpecialReference.Sentinel]: this.parseSpecialReference(SpecialReference.Sentinel), + [SpecialReference.Sentinel]: this.parseMapSentinel(), + [SpecialReference.SymbolIterator]: undefined, + [SpecialReference.Iterator]: undefined, }, }; } @@ -766,14 +734,10 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { const id = this.getReference(current); return typeof id === 'number' ? this.parseObject(id, current as object) : id; } - case 'symbol': { - assert(this.features & Feature.Symbol, new UnsupportedTypeError(current)); - const id = this.getReference(current); - return typeof id === 'number' ? createWKSymbolNode(id, current as WellKnownSymbols) : id; - } + case 'symbol': + return this.parseWKSymbol(current); case 'function': - assert(hasReferenceID(current), new Error('Cannot serialize function without reference ID.')); - return this.getStrictReference(current); + return this.parseFunction(current); default: throw new UnsupportedTypeError(current); } diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index 1d6692d9..971909f8 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -4,6 +4,7 @@ import UnsupportedTypeError from '../UnsupportedTypeError'; import assert from '../assert'; import { createArrayBufferNode, + createArrayNode, createBigIntNode, createDateNode, createNumberNode, @@ -29,7 +30,7 @@ import { iteratorToSequence } from '../iterator-to-sequence'; import type { BaseParserContextOptions } from '../parser-context'; import { BaseParserContext } from '../parser-context'; import { hasReferenceID } from '../reference'; -import { getErrorConstructor, getErrorOptions, getObjectFlag } from '../shared'; +import { getErrorConstructor, getErrorOptions } from '../shared'; import { serializeString } from '../string'; import { SerovalObjectRecordSpecialKey } from '../types'; import type { @@ -80,21 +81,11 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { id: number, current: unknown[], ): SerovalArrayNode { - return { - t: SerovalNodeType.Array, - i: id, - s: undefined, - l: current.length, - c: undefined, - m: undefined, - p: undefined, - e: undefined, - a: this.parseItems(current), - f: undefined, - b: undefined, - o: getObjectFlag(current), - x: undefined, - }; + return createArrayNode( + id, + current, + this.parseItems(current), + ); } protected parseProperties( @@ -130,34 +121,12 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { current: Record, empty: boolean, ): ObjectLikeNode { - return { - t: empty ? SerovalNodeType.NullConstructor : SerovalNodeType.Object, - i: id, - s: undefined, - l: undefined, - c: undefined, - m: undefined, - p: this.parseProperties(current), - e: undefined, - a: undefined, - f: undefined, - b: undefined, - o: getObjectFlag(current), - x: { - [SpecialReference.SymbolIterator]: ( - this.features & Feature.Symbol && Symbol.iterator in current - ? this.parse(Symbol.iterator) - : undefined - ), - [SpecialReference.Iterator]: ( - this.features & Feature.Symbol && Symbol.iterator in current - ? this.parseSpecialReference( - SpecialReference.Iterator, - ) - : undefined - ), - }, - }; + return this.createObjectNode( + id, + current, + empty, + this.parseProperties(current), + ); } protected parseBoxed( @@ -293,7 +262,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { b: undefined, o: undefined, x: { - [SpecialReference.Sentinel]: this.parseSpecialReference(SpecialReference.Sentinel), + [SpecialReference.Sentinel]: this.parseMapSentinel(), }, }; } diff --git a/packages/seroval/src/core/constants.ts b/packages/seroval/src/core/constants.ts index 997c41c8..ee506005 100644 --- a/packages/seroval/src/core/constants.ts +++ b/packages/seroval/src/core/constants.ts @@ -51,7 +51,8 @@ export const enum SerovalNodeType { CustomEvent = 38, DOMException = 39, Plugin = 40, - SpecialReference = 41, + MapSentinel = 41, + Iterator = 42, } export const enum SerovalObjectFlags { diff --git a/packages/seroval/src/core/parser-context.ts b/packages/seroval/src/core/parser-context.ts index 1e24b410..d193facc 100644 --- a/packages/seroval/src/core/parser-context.ts +++ b/packages/seroval/src/core/parser-context.ts @@ -1,12 +1,30 @@ -import { createIndexedValueNode, createReferenceNode } from './base-primitives'; -import { ALL_ENABLED } from './compat'; -import { SerovalNodeType } from './constants'; +import UnsupportedTypeError from './UnsupportedTypeError'; +import assert from './assert'; +import { + createIndexedValueNode, + createReferenceNode, + createWKSymbolNode, +} from './base-primitives'; +import { ALL_ENABLED, Feature } from './compat'; +import type { WellKnownSymbols } from './constants'; +import { + INV_SYMBOL_REF, + SerovalNodeType, +} from './constants'; import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; import { hasReferenceID } from './reference'; -import type { SpecialReference } from './special-reference'; -import { SPECIAL_REFS } from './special-reference'; +import { getObjectFlag } from './shared'; +import { ITERATOR, MAP_SENTINEL, SpecialReference } from './special-reference'; import type { - SerovalIndexedValueNode, SerovalReferenceNode, SerovalSpecialReferenceNode, + SerovalIndexedValueNode, + SerovalIteratorNode, + SerovalMapSentinelNode, + SerovalNode, + SerovalNullConstructorNode, + SerovalObjectNode, + SerovalObjectRecordNode, + SerovalReferenceNode, + SerovalWKSymbolNode, } from './types'; export interface BaseParserContextOptions extends PluginAccessOptions { @@ -64,29 +82,117 @@ export abstract class BaseParserContext implements PluginAccessOptions { return createReferenceNode(id, current); } - protected parseSpecialReference( - current: SpecialReference, - ): SerovalIndexedValueNode | SerovalReferenceNode | SerovalSpecialReferenceNode { - const ref = this.getReference( - SPECIAL_REFS[current], - ); - if (typeof ref === 'number') { - return { - t: SerovalNodeType.SpecialReference, - i: ref, - s: current, - l: undefined, - c: undefined, - m: undefined, - p: undefined, - e: undefined, - a: undefined, - f: undefined, - b: undefined, - o: undefined, - x: undefined, - }; + // eslint-disable-next-line @typescript-eslint/ban-types + protected parseFunction(current: Function): SerovalNode { + assert(hasReferenceID(current), new Error('Cannot serialize function without reference ID.')); + return this.getStrictReference(current); + } + + protected parseWKSymbol( + current: symbol, + ): SerovalIndexedValueNode | SerovalWKSymbolNode | SerovalReferenceNode { + assert(this.features & Feature.Symbol, new UnsupportedTypeError(current)); + const registeredID = this.refs.get(current); + if (registeredID != null) { + this.markRef(registeredID); + return createIndexedValueNode(registeredID); + } + const isValid = current in INV_SYMBOL_REF; + assert(current in INV_SYMBOL_REF || hasReferenceID(current), new Error('Cannot serialize symbol without reference ID.')); + const id = this.refs.size; + this.refs.set(current, id); + if (isValid) { + return createWKSymbolNode(id, current as WellKnownSymbols); + } + return createReferenceNode(id, current); + } + + protected parseMapSentinel(): SerovalIndexedValueNode | SerovalMapSentinelNode { + const registeredID = this.refs.get(MAP_SENTINEL); + if (registeredID != null) { + this.markRef(registeredID); + return createIndexedValueNode(registeredID); } - return ref; + const id = this.refs.size; + this.refs.set(MAP_SENTINEL, id); + return { + t: SerovalNodeType.MapSentinel, + i: id, + s: undefined, + l: undefined, + c: undefined, + m: undefined, + p: undefined, + e: undefined, + a: undefined, + f: undefined, + b: undefined, + o: undefined, + x: undefined, + }; + } + + protected parseIterator(): SerovalIndexedValueNode | SerovalIteratorNode { + const registeredID = this.refs.get(ITERATOR); + if (registeredID != null) { + this.markRef(registeredID); + return createIndexedValueNode(registeredID); + } + const id = this.refs.size; + this.refs.set(ITERATOR, id); + return { + t: SerovalNodeType.Iterator, + i: id, + s: undefined, + l: undefined, + c: undefined, + m: undefined, + p: undefined, + e: undefined, + a: undefined, + f: undefined, + b: undefined, + o: undefined, + x: { + [SpecialReference.Sentinel]: undefined, + [SpecialReference.SymbolIterator]: this.parseWKSymbol(Symbol.iterator), + [SpecialReference.Iterator]: undefined, + }, + }; + } + + protected createObjectNode( + id: number, + current: Record, + empty: boolean, + record: SerovalObjectRecordNode, + ): SerovalObjectNode | SerovalNullConstructorNode { + return { + t: empty ? SerovalNodeType.NullConstructor : SerovalNodeType.Object, + i: id, + s: undefined, + l: undefined, + c: undefined, + m: undefined, + p: record, + e: undefined, + a: undefined, + f: undefined, + b: undefined, + o: getObjectFlag(current), + x: { + [SpecialReference.Sentinel]: undefined, + [SpecialReference.SymbolIterator]: ( + this.features & Feature.Symbol && Symbol.iterator in current + ? this.parseWKSymbol(Symbol.iterator) + : undefined + ), + [SpecialReference.Iterator]: ( + this.features & Feature.Symbol && Symbol.iterator in current + ? this.parseIterator() + : undefined + ), + }, + }; } } diff --git a/packages/seroval/src/core/serializer-context.ts b/packages/seroval/src/core/serializer-context.ts index b264d194..7b4f9d01 100644 --- a/packages/seroval/src/core/serializer-context.ts +++ b/packages/seroval/src/core/serializer-context.ts @@ -10,7 +10,7 @@ import { createEffectfulFunction, createFunction } from './function-string'; import { REFERENCES_KEY } from './keys'; import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; import { isValidIdentifier } from './shared'; -import { SpecialReference, getSpecialReferenceValue } from './special-reference'; +import { SpecialReference } from './special-reference'; import type { SerovalArrayNode, SerovalIndexedValueNode, @@ -52,7 +52,8 @@ import type { SerovalReadableStreamEnqueueNode, SerovalReadableStreamErrorNode, SerovalReadableStreamCloseNode, - SerovalSpecialReferenceNode, + SerovalMapSentinelNode, + SerovalIteratorNode, } from './types'; import { SerovalObjectRecordSpecialKey, @@ -755,7 +756,7 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio serialized += '([' + result + '])'; } } - if (sentinel.t === SerovalNodeType.SpecialReference) { + if (sentinel.t === SerovalNodeType.MapSentinel) { this.markRef(sentinel.i); serialized = '(' + this.serialize(sentinel) + ',' + serialized + ')'; } @@ -1020,12 +1021,26 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio node: SerovalReadableStreamCloseNode, ): string; - protected serializeSpecialReference( - node: SerovalSpecialReferenceNode, - ): string { + protected serializeMapSentinel(node: SerovalMapSentinelNode): string { + return this.assignIndexedValue( + node.i, + '[]', + ); + } + + protected serializeIterator(node: SerovalIteratorNode): string { return this.assignIndexedValue( node.i, - getSpecialReferenceValue(this.features, node.s), + createFunction( + this.features, + ['s'], + '(' + createFunction( + this.features, + ['i', 'c', 'd'], + '(i=0,{[' + this.serialize(node.x[SpecialReference.SymbolIterator]) + ']:' + createFunction(this.features, [], 'this') + ',' + + 'next:' + createEffectfulFunction(this.features, [], 'c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}') + '})', + ) + ')', + ), ); } @@ -1112,8 +1127,10 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio return this.serializeDOMException(node); case SerovalNodeType.Plugin: return this.serializePlugin(node); - case SerovalNodeType.SpecialReference: - return this.serializeSpecialReference(node); + case SerovalNodeType.MapSentinel: + return this.serializeMapSentinel(node); + case SerovalNodeType.Iterator: + return this.serializeIterator(node); default: throw new Error('invariant'); } diff --git a/packages/seroval/src/core/special-reference.ts b/packages/seroval/src/core/special-reference.ts index 465f051f..c36a0b63 100644 --- a/packages/seroval/src/core/special-reference.ts +++ b/packages/seroval/src/core/special-reference.ts @@ -1,40 +1,9 @@ -import { createEffectfulFunction, createFunction } from './function-string'; -// These represents special references that are not provided -// by the user but are accessed by the serial output -export const enum SpecialReference { - // A sentinel ref is used to allow recursive Map - // assignments to be serialized in their original - // sequence. The sentinel ref is used as a placeholder - // value - Sentinel = 0, - // A factory for creating iterators - Iterator = 1, - SymbolIterator = 2, -} +export const MAP_SENTINEL = {}; -export const SPECIAL_REFS: Record = { - [SpecialReference.Sentinel]: {}, - [SpecialReference.Iterator]: {}, - [SpecialReference.SymbolIterator]: Symbol.iterator, -}; +export const ITERATOR = {}; -export function getSpecialReferenceValue(features: number, ref: SpecialReference): string { - switch (ref) { - case SpecialReference.Sentinel: - return '[]'; - case SpecialReference.Iterator: - return createFunction( - features, - ['s'], - '(' + createFunction( - features, - ['i', 'c', 'd'], - '(i=0,{next:' + createEffectfulFunction(features, [], 'c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}') + '})', - ) + ')', - ); - case SpecialReference.SymbolIterator: - return 'Symbol.iterator'; - default: - return ''; - } +export const enum SpecialReference { + Sentinel = 0, + SymbolIterator = 1, + Iterator = 2, } diff --git a/packages/seroval/src/core/types.ts b/packages/seroval/src/core/types.ts index 873faa76..46fac5c5 100644 --- a/packages/seroval/src/core/types.ts +++ b/packages/seroval/src/core/types.ts @@ -33,9 +33,13 @@ export interface SerovalBaseNode { // object flag o: SerovalObjectFlags | undefined; // x - x: Partial> | undefined; + x: SerovalX | undefined; } +export type SerovalX = { + [key in SpecialReference]?: SerovalNode | undefined; +}; + export const enum SerovalObjectRecordSpecialKey { SymbolIterator = 0, } @@ -164,14 +168,16 @@ export interface SerovalSetNode extends SerovalBaseNode { a: SerovalNode[]; } +export interface SerovalMapX extends SerovalX { + [SpecialReference.Sentinel]: SerovalMapSentinelNode | SerovalIndexedValueNode; +} + export interface SerovalMapNode extends SerovalBaseNode { t: SerovalNodeType.Map; i: number; // key/value pairs e: SerovalMapRecordNode; - x: { - [SpecialReference.Sentinel]: SerovalNodeWithID; - }; + x: SerovalMapX; } export interface SerovalArrayNode extends SerovalBaseNode { @@ -184,16 +190,23 @@ export interface SerovalArrayNode extends SerovalBaseNode { o: SerovalObjectFlags; } +export interface SerovalObjectX extends SerovalX { + [SpecialReference.SymbolIterator]: SerovalNodeWithID | undefined; + [SpecialReference.Iterator]: SerovalNodeWithID | undefined; +} + export interface SerovalObjectNode extends SerovalBaseNode { t: SerovalNodeType.Object; // key/value pairs p: SerovalObjectRecordNode; i: number; o: SerovalObjectFlags; - x: { - [SpecialReference.SymbolIterator]: SerovalNode | undefined; - [SpecialReference.Iterator]: SerovalNode | undefined; - }; + x: SerovalObjectX; +} + +export interface SerovalNullConstructorX extends SerovalX { + [SpecialReference.SymbolIterator]: SerovalNodeWithID | undefined; + [SpecialReference.Iterator]: SerovalNodeWithID | undefined; } export interface SerovalNullConstructorNode extends SerovalBaseNode { @@ -202,10 +215,7 @@ export interface SerovalNullConstructorNode extends SerovalBaseNode { p: SerovalObjectRecordNode; i: number; o: SerovalObjectFlags; - x: { - [SpecialReference.SymbolIterator]: SerovalNode | undefined; - [SpecialReference.Iterator]: SerovalNode | undefined; - }; + x: SerovalNullConstructorX; } export interface SerovalPromiseNode extends SerovalBaseNode { @@ -406,10 +416,19 @@ export interface SerovalPluginNode extends SerovalBaseNode { c: string; } -export interface SerovalSpecialReferenceNode extends SerovalBaseNode { - t: SerovalNodeType.SpecialReference; +export interface SerovalMapSentinelNode extends SerovalBaseNode { + t: SerovalNodeType.MapSentinel; + i: number; +} + +export interface SerovalIteratorX extends SerovalX { + [SpecialReference.SymbolIterator]: SerovalNodeWithID; +} + +export interface SerovalIteratorNode extends SerovalBaseNode { + t: SerovalNodeType.Iterator; i: number; - s: SpecialReference; + x: SerovalIteratorX; } export type SerovalSyncNode = @@ -439,7 +458,8 @@ export type SerovalSyncNode = | SerovalCustomEventNode | SerovalDOMExceptionNode | SerovalPluginNode - | SerovalSpecialReferenceNode; + | SerovalMapSentinelNode + | SerovalIteratorNode; export type SerovalAsyncNode = | SerovalPromiseNode diff --git a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap index bb7d9b15..ffd44f49 100644 --- a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap @@ -2,25 +2,25 @@ exports[`frozen object > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])"`; -exports[`frozen object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; +exports[`frozen object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])"`; -exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; exports[`frozen object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])"`; @@ -30,7 +30,7 @@ exports[`frozen object > crossSerializeStream > scoped > supports Objects 2`] = exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -46,7 +46,7 @@ exports[`frozen object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps( exports[`frozen object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; exports[`frozen object > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -58,24 +58,24 @@ exports[`frozen object > crossSerializeStream > supports self-recursion 4`] = `" exports[`frozen object > serialize > supports Objects 1`] = `"(h=>(h={hello:\\"world\\"},Object.freeze(h),h))()"`; -exports[`frozen object > serialize > supports Symbol.iterator 1`] = `"(h=>(h={[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.freeze(h),h))()"`; +exports[`frozen object > serialize > supports Symbol.iterator 1`] = `"((h,j)=>(h={[j=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[j]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.freeze(h),h))()"`; exports[`frozen object > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a=h,Object.freeze(h),h))()"`; exports[`frozen object > serializeAsync > supports Objects 1`] = `"((h,j)=>(j=Promise.resolve(h={hello:\\"world\\"}),Object.freeze(h),j))()"`; -exports[`frozen object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j)=>(j=Promise.resolve(h={[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}),Object.freeze(h),j))()"`; +exports[`frozen object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[j=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[j]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}),Object.freeze(h),k))()"`; exports[`frozen object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.freeze(h),h))()"`; exports[`frozen object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`frozen object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`frozen object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; exports[`frozen object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":3,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; exports[`frozen object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`frozen object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":5,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3}}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`frozen object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}},\\"f\\":16383,\\"m\\":[4]}"`; exports[`frozen object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":3,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/iterable.test.ts.snap b/packages/seroval/test/__snapshots__/iterable.test.ts.snap index 4f9a8c91..f7b9a100 100644 --- a/packages/seroval/test/__snapshots__/iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/iterable.test.ts.snap @@ -1,37 +1,37 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Iterable > compat > should use functions instead of method shorthand. 1`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; +exports[`Iterable > compat > should use functions instead of method shorthand. 1`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{[h]:function(){returnthis},next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > compat > should use method shorthand instead of arrow functions. 1`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; +exports[`Iterable > compat > should use method shorthand instead of arrow functions. 1`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{[h]:function(){returnthis},next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16379,\\"m\\":[0]}"`; +exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[0,3]}"`; -exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 2`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; +exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 2`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{[h]:function(){returnthis},next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16379,\\"m\\":[0]}"`; +exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[0,3]}"`; -exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 2`] = `"(function(h){return(h={[Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[h,void 0],t:-1,d:1})})})()"`; +exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 2`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{[h]:function(){returnthis},next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; -exports[`Iterable > crossSerialize > supports Iterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`Iterable > crossSerialize > supports Iterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; -exports[`Iterable > crossSerializeAsync > scoped > supports Iterables 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`Iterable > crossSerializeAsync > scoped > supports Iterables 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; -exports[`Iterable > crossSerializeAsync > supports Iterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`Iterable > crossSerializeAsync > supports Iterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`Iterable > crossSerializeStream > scoped > supports Iterables 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Iterable > crossSerializeStream > scoped > supports Iterables 2`] = `"($R=>_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`Iterable > crossSerializeStream > scoped > supports Iterables 2`] = `"($R=>_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`Iterable > crossSerializeStream > supports Iterables 1`] = `"$R[0]=_$.P()"`; -exports[`Iterable > crossSerializeStream > supports Iterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`Iterable > crossSerializeStream > supports Iterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; -exports[`Iterable > serialize > supports Iterables 1`] = `"({title:\\"Hello World\\",[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})"`; +exports[`Iterable > serialize > supports Iterables 1`] = `"(h=>({title:\\"Hello World\\",[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; -exports[`Iterable > serializeAsync > supports Iterables 1`] = `"Promise.resolve({title:\\"Hello World\\",[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})"`; +exports[`Iterable > serializeAsync > supports Iterables 1`] = `"(h=>(Promise.resolve({title:\\"Hello World\\",[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; -exports[`Iterable > toJSON > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Iterable > toJSON > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; -exports[`Iterable > toJSONAsync > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":5,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3}}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Iterable > toJSONAsync > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}},\\"f\\":16383,\\"m\\":[4]}"`; diff --git a/packages/seroval/test/__snapshots__/map.test.ts.snap b/packages/seroval/test/__snapshots__/map.test.ts.snap index 25d3fb45..9822854f 100644 --- a/packages/seroval/test/__snapshots__/map.test.ts.snap +++ b/packages/seroval/test/__snapshots__/map.test.ts.snap @@ -1,10 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"Object.assign(Object.create(null),{[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[void 0],t:-1,d:0})})"`; +exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[void 0],t:-1,d:0})})))()"`; exports[`Map > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; -exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":0}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16351,\\"m\\":[]}"`; +exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":0}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16351,\\"m\\":[3]}"`; exports[`Map > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; @@ -52,10 +52,10 @@ exports[`Map > serializeAsync > supports Map 1`] = `"(h=>(Promise.resolve((h=[], exports[`Map > serializeAsync > supports self-recursion 1`] = `"((h,j)=>(j=(h=[],new Map([[Promise.resolve().then(()=>j),Promise.resolve().then(()=>j)]]))))()"`; -exports[`Map > toJSON > supports Map 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":1,\\"s\\":0}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Map > toJSON > supports Map 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":1}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Map > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":4,\\"i\\":0}],\\"v\\":[{\\"t\\":4,\\"i\\":0}],\\"s\\":1},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":1,\\"s\\":0}}},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`Map > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":4,\\"i\\":0}],\\"v\\":[{\\"t\\":4,\\"i\\":0}],\\"s\\":1},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":1}}},\\"f\\":16383,\\"m\\":[0]}"`; -exports[`Map > toJSONAsync > supports Map 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":2,\\"s\\":0}}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Map > toJSONAsync > supports Map 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":2}}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Map > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":1},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":3,\\"s\\":0}}},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`Map > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":1},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":3}}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap index e298d868..82638af0 100644 --- a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap +++ b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap @@ -8,25 +8,25 @@ exports[`null-constructor > compat#toJSON > should use manual assignment instead exports[`null-constructor > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; exports[`null-constructor > crossSerialize > supports Objects 1`] = `"$R[0]=Object.assign(Object.create(null),{hello:\\"world\\"})"`; -exports[`null-constructor > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`null-constructor > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`null-constructor > crossSerialize > supports self-recursion 1`] = `"($R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])"`; exports[`null-constructor > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; +exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; exports[`null-constructor > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})"`; @@ -36,7 +36,7 @@ exports[`null-constructor > crossSerializeStream > scoped > supports Objects 2`] exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -52,7 +52,7 @@ exports[`null-constructor > crossSerializeStream > supports Objects 2`] = `"_$.P exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; exports[`null-constructor > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -64,24 +64,24 @@ exports[`null-constructor > crossSerializeStream > supports self-recursion 4`] = exports[`null-constructor > serialize > supports Object.create(null) 1`] = `"Object.assign(Object.create(null),{hello:\\"world\\"})"`; -exports[`null-constructor > serialize > supports Symbol.iterator 1`] = `"Object.assign(Object.create(null),{[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})"`; +exports[`null-constructor > serialize > supports Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; exports[`null-constructor > serialize > supports self-recursion 1`] = `"(h=>(h=Object.create(null),h.b=h.a=h,h))()"`; exports[`null-constructor > serializeAsync > supports Object.create(null) 1`] = `"Promise.resolve(Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > serializeAsync > supports Symbol.iterator 1`] = `"Promise.resolve(Object.assign(Object.create(null),{[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))"`; +exports[`null-constructor > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))))()"`; exports[`null-constructor > serializeAsync > supports self-recursion 1`] = `"(h=>(h=Object.assign(Object.create(null),{a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)})))()"`; exports[`null-constructor > toJSON > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`null-constructor > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`null-constructor > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; exports[`null-constructor > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; exports[`null-constructor > toJSONAsync > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`null-constructor > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":5,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3}}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`null-constructor > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}},\\"f\\":16383,\\"m\\":[4]}"`; exports[`null-constructor > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/object.test.ts.snap b/packages/seroval/test/__snapshots__/object.test.ts.snap index b40501e7..00dadd2b 100644 --- a/packages/seroval/test/__snapshots__/object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/object.test.ts.snap @@ -8,25 +8,25 @@ exports[`objects > compat#toJSON > should use manual assignment instead of Objec exports[`objects > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"})($R[\\"example\\"])"`; -exports[`objects > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`objects > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; exports[`objects > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; exports[`objects > crossSerialize > supports Objects 1`] = `"$R[0]={hello:\\"world\\"}"`; -exports[`objects > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`objects > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; exports[`objects > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],$R[0])"`; exports[`objects > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]={hello:\\"world\\"})"`; -exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`objects > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}"`; @@ -36,7 +36,7 @@ exports[`objects > crossSerializeStream > scoped > supports Objects 2`] = `"($R= exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`objects > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -52,7 +52,7 @@ exports[`objects > crossSerializeStream > supports Objects 2`] = `"_$.Ps($R[0],$ exports[`objects > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`objects > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -64,24 +64,24 @@ exports[`objects > crossSerializeStream > supports self-recursion 4`] = `"_$.Ps( exports[`objects > serialize > supports Objects 1`] = `"({hello:\\"world\\"})"`; -exports[`objects > serialize > supports Symbol.iterator 1`] = `"({[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})"`; +exports[`objects > serialize > supports Symbol.iterator 1`] = `"(h=>({[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; exports[`objects > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a=h,h))()"`; exports[`objects > serializeAsync > supports Objects 1`] = `"Promise.resolve({hello:\\"world\\"})"`; -exports[`objects > serializeAsync > supports Symbol.iterator 1`] = `"Promise.resolve({[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})"`; +exports[`objects > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve({[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; exports[`objects > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)}))()"`; exports[`objects > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`objects > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`objects > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; exports[`objects > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; exports[`objects > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`objects > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":5,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3}}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`objects > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}},\\"f\\":16383,\\"m\\":[4]}"`; exports[`objects > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/plugin.test.ts.snap b/packages/seroval/test/__snapshots__/plugin.test.ts.snap index 859989d7..e48e04b8 100644 --- a/packages/seroval/test/__snapshots__/plugin.test.ts.snap +++ b/packages/seroval/test/__snapshots__/plugin.test.ts.snap @@ -8,9 +8,9 @@ exports[`Plugin > crossSerializeAsync > scoped > supports Plugin 1`] = `"($R=>$R exports[`Plugin > crossSerializeAsync > supports Plugin 1`] = `"$R[0]=Promise.resolve(Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\"))"`; -exports[`Plugin > crossSerializeStream > scoped > supports Plugin 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})}))($R[\\"example\\"])"`; +exports[`Plugin > crossSerializeStream > scoped > supports Plugin 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})}))($R[\\"example\\"])"`; -exports[`Plugin > crossSerializeStream > supports Plugin 1`] = `"$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})})"`; +exports[`Plugin > crossSerializeStream > supports Plugin 1`] = `"$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})})"`; exports[`Plugin > serialize > supports Plugin 1`] = `"Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\")"`; diff --git a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap index b321fc78..2bb74a57 100644 --- a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap @@ -2,25 +2,25 @@ exports[`sealed object > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.seal($R[0]),$R[0])"`; -exports[`sealed object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; +exports[`sealed object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])"`; -exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; exports[`sealed object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])"`; @@ -30,7 +30,7 @@ exports[`sealed object > crossSerializeStream > scoped > supports Objects 2`] = exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -46,7 +46,7 @@ exports[`sealed object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps( exports[`sealed object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; exports[`sealed object > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -58,24 +58,24 @@ exports[`sealed object > crossSerializeStream > supports self-recursion 4`] = `" exports[`sealed object > serialize > supports Objects 1`] = `"(h=>(h={hello:\\"world\\"},Object.seal(h),h))()"`; -exports[`sealed object > serialize > supports Symbol.iterator 1`] = `"(h=>(h={[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.seal(h),h))()"`; +exports[`sealed object > serialize > supports Symbol.iterator 1`] = `"((h,j)=>(h={[j=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[j]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.seal(h),h))()"`; exports[`sealed object > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a=h,Object.seal(h),h))()"`; exports[`sealed object > serializeAsync > supports Objects 1`] = `"((h,j)=>(j=Promise.resolve(h={hello:\\"world\\"}),Object.seal(h),j))()"`; -exports[`sealed object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j)=>(j=Promise.resolve(h={[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}),Object.seal(h),j))()"`; +exports[`sealed object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[j=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[j]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}),Object.seal(h),k))()"`; exports[`sealed object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.seal(h),h))()"`; exports[`sealed object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`sealed object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`sealed object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; exports[`sealed object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":2,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; exports[`sealed object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`sealed object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":5,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3}}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`sealed object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}},\\"f\\":16383,\\"m\\":[4]}"`; exports[`sealed object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":2,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/set.test.ts.snap b/packages/seroval/test/__snapshots__/set.test.ts.snap index 3cc264d4..8825927d 100644 --- a/packages/seroval/test/__snapshots__/set.test.ts.snap +++ b/packages/seroval/test/__snapshots__/set.test.ts.snap @@ -1,10 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Set > compat > should fallback to Symbol.iterator 1`] = `"Object.assign(Object.create(null),{[Symbol.iterator]:(s=>((i,c,d)=>(i=0,{next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})"`; +exports[`Set > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; exports[`Set > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; -exports[`Set > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":41,\\"i\\":4,\\"s\\":1},\\"2\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3}}},\\"f\\":15871,\\"m\\":[]}"`; +exports[`Set > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":15871,\\"m\\":[3]}"`; exports[`Set > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; From 2dc97b4072278830f94cc27a4fd0cfc21bfbfd48 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Wed, 15 Nov 2023 20:54:18 +0800 Subject: [PATCH 11/82] Dedupe Boxed node --- packages/seroval/src/core/base-primitives.ts | 22 +++++ packages/seroval/src/core/base/async.ts | 99 +++++++++----------- packages/seroval/src/core/base/sync.ts | 17 +--- 3 files changed, 67 insertions(+), 71 deletions(-) diff --git a/packages/seroval/src/core/base-primitives.ts b/packages/seroval/src/core/base-primitives.ts index a97de36e..634c089a 100644 --- a/packages/seroval/src/core/base-primitives.ts +++ b/packages/seroval/src/core/base-primitives.ts @@ -14,6 +14,7 @@ import type { SerovalArrayBufferNode, SerovalArrayNode, SerovalBigIntNode, + SerovalBoxedNode, SerovalConstantNode, SerovalDateNode, SerovalIndexedValueNode, @@ -263,3 +264,24 @@ export function createArrayNode( x: undefined, }; } + +export function createBoxedNode( + id: number, + boxed: SerovalNode, +): SerovalBoxedNode { + return { + t: SerovalNodeType.Boxed, + i: id, + s: undefined, + l: undefined, + c: undefined, + m: undefined, + p: undefined, + e: undefined, + a: undefined, + f: boxed, + b: undefined, + o: undefined, + x: undefined, + }; +} diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index 0a4a26a7..35037dae 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -12,6 +12,7 @@ import { createStringNode, createNumberNode, createArrayNode, + createBoxedNode, } from '../base-primitives'; import { BIGINT_FLAG, Feature } from '../compat'; import { @@ -95,25 +96,52 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { ); } + private async parseProperties( + properties: Record, + ): Promise { + const entries = Object.entries(properties); + const keyNodes: SerovalObjectRecordKey[] = []; + const valueNodes: SerovalNode[] = []; + for ( + let i = 0, len = entries.length; + i < len; + i++ + ) { + keyNodes.push(serializeString(entries[i][0])); + valueNodes.push(await this.parse(entries[i][1])); + } + // Check special properties + if (this.features & Feature.Symbol) { + if (Symbol.iterator in properties) { + keyNodes.push(SerovalObjectRecordSpecialKey.SymbolIterator); + valueNodes.push(await this.parse(iteratorToSequence(properties as Iterable))); + } + } + return { + k: keyNodes, + v: valueNodes, + s: keyNodes.length, + }; + } + + private async parsePlainObject( + id: number, + current: Record, + empty: boolean, + ): Promise { + return this.createObjectNode( + id, + current, + empty, + await this.parseProperties(current), + ); + } + private async parseBoxed( id: number, current: object, ): Promise { - return { - t: SerovalNodeType.Boxed, - i: id, - s: undefined, - l: undefined, - c: undefined, - m: undefined, - p: undefined, - e: undefined, - a: undefined, - f: await this.parse(current.valueOf()), - b: undefined, - o: undefined, - x: undefined, - }; + return createBoxedNode(id, await this.parse(current.valueOf())); } private async parseTypedArray( @@ -179,47 +207,6 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { }; } - private async parseProperties( - properties: Record, - ): Promise { - const entries = Object.entries(properties); - const keyNodes: SerovalObjectRecordKey[] = []; - const valueNodes: SerovalNode[] = []; - for ( - let i = 0, len = entries.length; - i < len; - i++ - ) { - keyNodes.push(serializeString(entries[i][0])); - valueNodes.push(await this.parse(entries[i][1])); - } - // Check special properties - if (this.features & Feature.Symbol) { - if (Symbol.iterator in properties) { - keyNodes.push(SerovalObjectRecordSpecialKey.SymbolIterator); - valueNodes.push(await this.parse(iteratorToSequence(properties as Iterable))); - } - } - return { - k: keyNodes, - v: valueNodes, - s: keyNodes.length, - }; - } - - private async parsePlainObject( - id: number, - current: Record, - empty: boolean, - ): Promise { - return this.createObjectNode( - id, - current, - empty, - await this.parseProperties(current), - ); - } - private async parseError( id: number, current: Error, diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index 971909f8..58d3546c 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -6,6 +6,7 @@ import { createArrayBufferNode, createArrayNode, createBigIntNode, + createBoxedNode, createDateNode, createNumberNode, createPluginNode, @@ -133,21 +134,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { id: number, current: object, ): SerovalBoxedNode { - return { - t: SerovalNodeType.Boxed, - i: id, - s: undefined, - l: undefined, - c: undefined, - m: undefined, - p: undefined, - e: undefined, - a: undefined, - f: this.parse(current.valueOf()), - b: undefined, - o: undefined, - x: undefined, - }; + return createBoxedNode(id, this.parse(current.valueOf())); } protected parseTypedArray( From 73c1e499046348950ef859b8e1ed48b8de2cea1e Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Wed, 15 Nov 2023 20:56:10 +0800 Subject: [PATCH 12/82] Dedupe TypedArray node --- packages/seroval/src/core/base-primitives.ts | 24 ++++++++++++++++++++ packages/seroval/src/core/base/async.ts | 17 ++------------ packages/seroval/src/core/base/sync.ts | 17 ++------------ 3 files changed, 28 insertions(+), 30 deletions(-) diff --git a/packages/seroval/src/core/base-primitives.ts b/packages/seroval/src/core/base-primitives.ts index 634c089a..30be3c51 100644 --- a/packages/seroval/src/core/base-primitives.ts +++ b/packages/seroval/src/core/base-primitives.ts @@ -1,3 +1,4 @@ +import type { TypedArrayValue } from '../types'; import assert from './assert'; import type { WellKnownSymbols } from './constants'; import { INV_SYMBOL_REF, SerovalNodeType } from './constants'; @@ -24,6 +25,7 @@ import type { SerovalReferenceNode, SerovalRegExpNode, SerovalStringNode, + SerovalTypedArrayNode, SerovalWKSymbolNode, } from './types'; @@ -285,3 +287,25 @@ export function createBoxedNode( x: undefined, }; } + +export function createTypedArrayNode( + id: number, + current: TypedArrayValue, + buffer: SerovalNode, +): SerovalTypedArrayNode { + return { + t: SerovalNodeType.TypedArray, + i: id, + s: undefined, + l: current.length, + c: current.constructor.name, + m: undefined, + p: undefined, + e: undefined, + a: undefined, + f: buffer, + b: current.byteOffset, + o: undefined, + x: undefined, + }; +} diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index 35037dae..587d340f 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -13,6 +13,7 @@ import { createNumberNode, createArrayNode, createBoxedNode, + createTypedArrayNode, } from '../base-primitives'; import { BIGINT_FLAG, Feature } from '../compat'; import { @@ -148,21 +149,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { id: number, current: TypedArrayValue, ): Promise { - return { - t: SerovalNodeType.TypedArray, - i: id, - s: undefined, - l: current.length, - c: current.constructor.name, - m: undefined, - p: undefined, - e: undefined, - a: undefined, - f: await this.parse(current.buffer), - b: current.byteOffset, - o: undefined, - x: undefined, - }; + return createTypedArrayNode(id, current, await this.parse(current.buffer)); } private async parseBigIntTypedArray( diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index 58d3546c..fc94af62 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -12,6 +12,7 @@ import { createPluginNode, createRegExpNode, createStringNode, + createTypedArrayNode, createWKSymbolNode, } from '../base-primitives'; import { BIGINT_FLAG, Feature } from '../compat'; @@ -141,21 +142,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { id: number, current: TypedArrayValue, ): SerovalTypedArrayNode { - return { - t: SerovalNodeType.TypedArray, - i: id, - s: undefined, - l: current.length, - c: current.constructor.name, - m: undefined, - p: undefined, - e: undefined, - a: undefined, - f: this.parse(current.buffer), - b: current.byteOffset, - o: undefined, - x: undefined, - }; + return createTypedArrayNode(id, current, this.parse(current.buffer)); } protected parseBigIntTypedArray( From 25d67a6f3ef736a9477d18a6c4d3b3230cc66dac Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Wed, 15 Nov 2023 20:59:08 +0800 Subject: [PATCH 13/82] Dedupe BigIntTypedArray node --- packages/seroval/src/core/base-primitives.ts | 25 +++++++++++++++++++- packages/seroval/src/core/base/async.ts | 17 ++----------- packages/seroval/src/core/base/sync.ts | 17 ++----------- 3 files changed, 28 insertions(+), 31 deletions(-) diff --git a/packages/seroval/src/core/base-primitives.ts b/packages/seroval/src/core/base-primitives.ts index 30be3c51..b3e1e8a7 100644 --- a/packages/seroval/src/core/base-primitives.ts +++ b/packages/seroval/src/core/base-primitives.ts @@ -1,4 +1,4 @@ -import type { TypedArrayValue } from '../types'; +import type { BigIntTypedArrayValue, TypedArrayValue } from '../types'; import assert from './assert'; import type { WellKnownSymbols } from './constants'; import { INV_SYMBOL_REF, SerovalNodeType } from './constants'; @@ -15,6 +15,7 @@ import type { SerovalArrayBufferNode, SerovalArrayNode, SerovalBigIntNode, + SerovalBigIntTypedArrayNode, SerovalBoxedNode, SerovalConstantNode, SerovalDateNode, @@ -309,3 +310,25 @@ export function createTypedArrayNode( x: undefined, }; } + +export function createBigIntTypedArrayNode( + id: number, + current: BigIntTypedArrayValue, + buffer: SerovalNode, +): SerovalBigIntTypedArrayNode { + return { + t: SerovalNodeType.BigIntTypedArray, + i: id, + s: undefined, + l: current.length, + c: current.constructor.name, + m: undefined, + p: undefined, + e: undefined, + a: undefined, + f: buffer, + b: current.byteOffset, + o: undefined, + x: undefined, + }; +} diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index 587d340f..11b1e3a0 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -14,6 +14,7 @@ import { createArrayNode, createBoxedNode, createTypedArrayNode, + createBigIntTypedArrayNode, } from '../base-primitives'; import { BIGINT_FLAG, Feature } from '../compat'; import { @@ -156,21 +157,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { id: number, current: BigIntTypedArrayValue, ): Promise { - return { - t: SerovalNodeType.BigIntTypedArray, - i: id, - s: undefined, - l: current.length, - c: current.constructor.name, - m: undefined, - p: undefined, - e: undefined, - a: undefined, - f: await this.parse(current.buffer), - b: current.byteOffset, - o: undefined, - x: undefined, - }; + return createBigIntTypedArrayNode(id, current, await this.parse(current.buffer)); } private async parseDataView( diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index fc94af62..b2890591 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -6,6 +6,7 @@ import { createArrayBufferNode, createArrayNode, createBigIntNode, + createBigIntTypedArrayNode, createBoxedNode, createDateNode, createNumberNode, @@ -149,21 +150,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { id: number, current: BigIntTypedArrayValue, ): SerovalBigIntTypedArrayNode { - return { - t: SerovalNodeType.BigIntTypedArray, - i: id, - s: undefined, - l: current.length, - c: current.constructor.name, - m: undefined, - p: undefined, - e: undefined, - a: undefined, - f: this.parse(current.buffer), - b: current.byteOffset, - o: undefined, - x: undefined, - }; + return createBigIntTypedArrayNode(id, current, this.parse(current.buffer)); } protected parseDataView( From c3b4a508d35496f342ce9d587933be5e2bf219d5 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Wed, 15 Nov 2023 21:02:00 +0800 Subject: [PATCH 14/82] Dedupe DataView --- packages/seroval/src/core/base-primitives.ts | 23 ++++++++++++++++++++ packages/seroval/src/core/base/async.ts | 17 ++------------- packages/seroval/src/core/base/sync.ts | 17 ++------------- 3 files changed, 27 insertions(+), 30 deletions(-) diff --git a/packages/seroval/src/core/base-primitives.ts b/packages/seroval/src/core/base-primitives.ts index b3e1e8a7..11d32c3a 100644 --- a/packages/seroval/src/core/base-primitives.ts +++ b/packages/seroval/src/core/base-primitives.ts @@ -18,6 +18,7 @@ import type { SerovalBigIntTypedArrayNode, SerovalBoxedNode, SerovalConstantNode, + SerovalDataViewNode, SerovalDateNode, SerovalIndexedValueNode, SerovalNode, @@ -332,3 +333,25 @@ export function createBigIntTypedArrayNode( x: undefined, }; } + +export function createDataViewNode( + id: number, + current: DataView, + buffer: SerovalNode, +): SerovalDataViewNode { + return { + t: SerovalNodeType.DataView, + i: id, + s: undefined, + l: current.byteLength, + c: undefined, + m: undefined, + p: undefined, + e: undefined, + a: undefined, + f: buffer, + b: current.byteOffset, + o: undefined, + x: undefined, + }; +} diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index 11b1e3a0..41c85eae 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -15,6 +15,7 @@ import { createBoxedNode, createTypedArrayNode, createBigIntTypedArrayNode, + createDataViewNode, } from '../base-primitives'; import { BIGINT_FLAG, Feature } from '../compat'; import { @@ -164,21 +165,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { id: number, current: DataView, ): Promise { - return { - t: SerovalNodeType.DataView, - i: id, - s: undefined, - l: current.byteLength, - c: undefined, - m: undefined, - p: undefined, - e: undefined, - a: undefined, - f: await this.parse(current.buffer), - b: current.byteOffset, - o: undefined, - x: undefined, - }; + return createDataViewNode(id, current, await this.parse(current.buffer)); } private async parseError( diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index b2890591..45bb70b0 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -8,6 +8,7 @@ import { createBigIntNode, createBigIntTypedArrayNode, createBoxedNode, + createDataViewNode, createDateNode, createNumberNode, createPluginNode, @@ -157,21 +158,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { id: number, current: DataView, ): SerovalDataViewNode { - return { - t: SerovalNodeType.DataView, - i: id, - s: undefined, - l: current.byteLength, - c: undefined, - m: undefined, - p: undefined, - e: undefined, - a: undefined, - f: this.parse(current.buffer), - b: current.byteOffset, - o: undefined, - x: undefined, - }; + return createDataViewNode(id, current, this.parse(current.buffer)); } protected parseError( From 8f44c1d1112da3b4f3d0f3d2ce47cb6c2f227bad Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Wed, 15 Nov 2023 21:11:10 +0800 Subject: [PATCH 15/82] Dedupe Error node --- packages/seroval/src/core/base-primitives.ts | 26 +++++++++++++++++- packages/seroval/src/core/base/async.ts | 28 +++++++------------- packages/seroval/src/core/base/sync.ts | 28 +++++++------------- 3 files changed, 43 insertions(+), 39 deletions(-) diff --git a/packages/seroval/src/core/base-primitives.ts b/packages/seroval/src/core/base-primitives.ts index 11d32c3a..9682c1d9 100644 --- a/packages/seroval/src/core/base-primitives.ts +++ b/packages/seroval/src/core/base-primitives.ts @@ -9,7 +9,7 @@ import { NEG_ZERO_NODE, } from './literals'; import { getReferenceID } from './reference'; -import { getObjectFlag } from './shared'; +import { getErrorConstructor, getObjectFlag } from './shared'; import { serializeString } from './string'; import type { SerovalArrayBufferNode, @@ -20,9 +20,11 @@ import type { SerovalConstantNode, SerovalDataViewNode, SerovalDateNode, + SerovalErrorNode, SerovalIndexedValueNode, SerovalNode, SerovalNumberNode, + SerovalObjectRecordNode, SerovalPluginNode, SerovalReferenceNode, SerovalRegExpNode, @@ -355,3 +357,25 @@ export function createDataViewNode( x: undefined, }; } + +export function createErrorNode( + id: number, + current: Error, + options: SerovalObjectRecordNode | undefined, +): SerovalErrorNode { + return { + t: SerovalNodeType.Error, + i: id, + s: getErrorConstructor(current), + l: undefined, + c: undefined, + m: serializeString(current.message), + p: options, + e: undefined, + a: undefined, + f: undefined, + b: undefined, + o: undefined, + x: undefined, + }; +} diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index 41c85eae..dc2c86e3 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -16,6 +16,7 @@ import { createTypedArrayNode, createBigIntTypedArrayNode, createDataViewNode, + createErrorNode, } from '../base-primitives'; import { BIGINT_FLAG, Feature } from '../compat'; import { @@ -37,7 +38,7 @@ import { import { iteratorToSequence } from '../iterator-to-sequence'; import { BaseParserContext } from '../parser-context'; import promiseToResult from '../promise-to-result'; -import { getErrorConstructor, getErrorOptions } from '../shared'; +import { getErrorOptions } from '../shared'; import { serializeString } from '../string'; import { SerovalObjectRecordSpecialKey } from '../types'; import type { @@ -173,24 +174,13 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { current: Error, ): Promise { const options = getErrorOptions(current, this.features); - const optionsNode = options - ? await this.parseProperties(options) - : undefined; - return { - t: SerovalNodeType.Error, - i: id, - s: getErrorConstructor(current), - l: undefined, - c: undefined, - m: serializeString(current.message), - p: optionsNode, - e: undefined, - a: undefined, - f: undefined, - b: undefined, - o: undefined, - x: undefined, - }; + return createErrorNode( + id, + current, + options + ? await this.parseProperties(options) + : undefined, + ); } private async parseMap( diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index 45bb70b0..2a033ee4 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -10,6 +10,7 @@ import { createBoxedNode, createDataViewNode, createDateNode, + createErrorNode, createNumberNode, createPluginNode, createRegExpNode, @@ -34,7 +35,7 @@ import { iteratorToSequence } from '../iterator-to-sequence'; import type { BaseParserContextOptions } from '../parser-context'; import { BaseParserContext } from '../parser-context'; import { hasReferenceID } from '../reference'; -import { getErrorConstructor, getErrorOptions } from '../shared'; +import { getErrorOptions } from '../shared'; import { serializeString } from '../string'; import { SerovalObjectRecordSpecialKey } from '../types'; import type { @@ -166,24 +167,13 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { current: Error, ): SerovalErrorNode { const options = getErrorOptions(current, this.features); - const optionsNode = options - ? this.parseProperties(options) - : undefined; - return { - t: SerovalNodeType.Error, - i: id, - s: getErrorConstructor(current), - l: undefined, - c: undefined, - m: serializeString(current.message), - p: optionsNode, - e: undefined, - a: undefined, - f: undefined, - b: undefined, - o: undefined, - x: undefined, - }; + return createErrorNode( + id, + current, + options + ? this.parseProperties(options) + : undefined, + ); } protected parseMap( From 2ed83e577bf77829df2720e0d7af5c513aefb663 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Wed, 15 Nov 2023 21:23:58 +0800 Subject: [PATCH 16/82] Dedupe Map node --- packages/seroval/src/core/base/async.ts | 26 +++++-------------- packages/seroval/src/core/base/sync.ts | 24 +++++------------- packages/seroval/src/core/parser-context.ts | 28 +++++++++++++++++++++ 3 files changed, 40 insertions(+), 38 deletions(-) diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index dc2c86e3..85e44b60 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -69,7 +69,6 @@ import type { SerovalDataViewNode, } from '../types'; import { createURLNode, createURLSearchParamsNode, createDOMExceptionNode } from '../web-api'; -import { SpecialReference } from '../special-reference'; type ObjectLikeNode = | SerovalObjectNode @@ -193,25 +192,12 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { keyNodes.push(await this.parse(key)); valueNodes.push(await this.parse(value)); } - return { - t: SerovalNodeType.Map, - i: id, - s: undefined, - l: undefined, - c: undefined, - m: undefined, - p: undefined, - e: { k: keyNodes, v: valueNodes, s: current.size }, - a: undefined, - f: undefined, - b: undefined, - o: undefined, - x: { - [SpecialReference.Sentinel]: this.parseMapSentinel(), - [SpecialReference.SymbolIterator]: undefined, - [SpecialReference.Iterator]: undefined, - }, - }; + return this.createMapNode( + id, + keyNodes, + valueNodes, + current.size, + ); } private async parseSet( diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index 2a033ee4..6bb02cb8 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -61,7 +61,6 @@ import type { SerovalDataViewNode, } from '../types'; import { createDOMExceptionNode, createURLNode, createURLSearchParamsNode } from '../web-api'; -import { SpecialReference } from '../special-reference'; type ObjectLikeNode = | SerovalObjectNode @@ -186,23 +185,12 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { keyNodes.push(this.parse(key)); valueNodes.push(this.parse(value)); } - return { - t: SerovalNodeType.Map, - i: id, - s: undefined, - l: undefined, - c: undefined, - m: undefined, - p: undefined, - e: { k: keyNodes, v: valueNodes, s: current.size }, - a: undefined, - f: undefined, - b: undefined, - o: undefined, - x: { - [SpecialReference.Sentinel]: this.parseMapSentinel(), - }, - }; + return this.createMapNode( + id, + keyNodes, + valueNodes, + current.size, + ); } protected parseSet( diff --git a/packages/seroval/src/core/parser-context.ts b/packages/seroval/src/core/parser-context.ts index d193facc..bf90c321 100644 --- a/packages/seroval/src/core/parser-context.ts +++ b/packages/seroval/src/core/parser-context.ts @@ -18,6 +18,7 @@ import { ITERATOR, MAP_SENTINEL, SpecialReference } from './special-reference'; import type { SerovalIndexedValueNode, SerovalIteratorNode, + SerovalMapNode, SerovalMapSentinelNode, SerovalNode, SerovalNullConstructorNode, @@ -195,4 +196,31 @@ export abstract class BaseParserContext implements PluginAccessOptions { }, }; } + + protected createMapNode( + id: number, + k: SerovalNode[], + v: SerovalNode[], + s: number, + ): SerovalMapNode { + return { + t: SerovalNodeType.Map, + i: id, + s: undefined, + l: undefined, + c: undefined, + m: undefined, + p: undefined, + e: { k, v, s }, + a: undefined, + f: undefined, + b: undefined, + o: undefined, + x: { + [SpecialReference.Sentinel]: this.parseMapSentinel(), + [SpecialReference.SymbolIterator]: undefined, + [SpecialReference.Iterator]: undefined, + }, + }; + } } From 51735579e119ff399f7b6358d56ab40eb4d05f9d Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Wed, 15 Nov 2023 21:27:25 +0800 Subject: [PATCH 17/82] Dedupe Set node --- packages/seroval/src/core/base-primitives.ts | 23 ++++++++++++++++++++ packages/seroval/src/core/base/async.ts | 21 ++++-------------- packages/seroval/src/core/base/sync.ts | 21 ++++-------------- 3 files changed, 31 insertions(+), 34 deletions(-) diff --git a/packages/seroval/src/core/base-primitives.ts b/packages/seroval/src/core/base-primitives.ts index 9682c1d9..38136a2e 100644 --- a/packages/seroval/src/core/base-primitives.ts +++ b/packages/seroval/src/core/base-primitives.ts @@ -28,6 +28,7 @@ import type { SerovalPluginNode, SerovalReferenceNode, SerovalRegExpNode, + SerovalSetNode, SerovalStringNode, SerovalTypedArrayNode, SerovalWKSymbolNode, @@ -379,3 +380,25 @@ export function createErrorNode( x: undefined, }; } + +export function createSetNode( + id: number, + size: number, + items: SerovalNode[], +): SerovalSetNode { + return { + t: SerovalNodeType.Set, + i: id, + s: undefined, + l: size, + c: undefined, + m: undefined, + p: undefined, + e: undefined, + a: items, + f: undefined, + b: undefined, + o: undefined, + x: undefined, + }; +} diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index 85e44b60..9ec5001f 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -17,6 +17,7 @@ import { createBigIntTypedArrayNode, createDataViewNode, createErrorNode, + createSetNode, } from '../base-primitives'; import { BIGINT_FLAG, Feature } from '../compat'; import { @@ -204,25 +205,11 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { id: number, current: Set, ): Promise { - const nodes: SerovalNode[] = []; + const items: SerovalNode[] = []; for (const item of current.keys()) { - nodes.push(await this.parse(item)); + items.push(await this.parse(item)); } - return { - t: SerovalNodeType.Set, - i: id, - s: undefined, - l: current.size, - c: undefined, - m: undefined, - p: undefined, - e: undefined, - a: nodes, - f: undefined, - b: undefined, - o: undefined, - x: undefined, - }; + return createSetNode(id, current.size, items); } private async parseBlob( diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index 6bb02cb8..17c8587d 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -14,6 +14,7 @@ import { createNumberNode, createPluginNode, createRegExpNode, + createSetNode, createStringNode, createTypedArrayNode, createWKSymbolNode, @@ -197,25 +198,11 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { id: number, current: Set, ): SerovalSetNode { - const nodes: SerovalNode[] = []; + const items: SerovalNode[] = []; for (const item of current.keys()) { - nodes.push(this.parse(item)); + items.push(this.parse(item)); } - return { - t: SerovalNodeType.Set, - i: id, - s: undefined, - l: current.size, - c: undefined, - m: undefined, - p: undefined, - e: undefined, - a: nodes, - f: undefined, - b: undefined, - o: undefined, - x: undefined, - }; + return createSetNode(id, current.size, items); } protected parsePlainProperties( From 448895453d0f8c70f26d48d8aeda50b02c3a68ba Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Wed, 15 Nov 2023 21:47:34 +0800 Subject: [PATCH 18/82] Dedupe Event node --- packages/seroval/src/core/base/async.ts | 23 ++++++------------- packages/seroval/src/core/base/sync.ts | 23 ++++++------------- packages/seroval/src/core/web-api.ts | 30 ++++++++++++++++++++++++- 3 files changed, 43 insertions(+), 33 deletions(-) diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index 9ec5001f..53eea1d0 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -69,7 +69,12 @@ import type { SerovalSetNode, SerovalDataViewNode, } from '../types'; -import { createURLNode, createURLSearchParamsNode, createDOMExceptionNode } from '../web-api'; +import { + createURLNode, + createURLSearchParamsNode, + createDOMExceptionNode, + createEventNode, +} from '../web-api'; type ObjectLikeNode = | SerovalObjectNode @@ -374,21 +379,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { id: number, current: Event, ): Promise { - return { - t: SerovalNodeType.Event, - i: id, - s: serializeString(current.type), - l: undefined, - c: undefined, - m: undefined, - p: undefined, - e: undefined, - a: undefined, - f: await this.parse(createEventOptions(current)), - b: undefined, - o: undefined, - x: undefined, - }; + return createEventNode(id, current.type, await this.parse(createEventOptions(current))); } private async parseCustomEvent( diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index 17c8587d..93044b93 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -61,7 +61,12 @@ import type { SerovalBigIntTypedArrayNode, SerovalDataViewNode, } from '../types'; -import { createDOMExceptionNode, createURLNode, createURLSearchParamsNode } from '../web-api'; +import { + createDOMExceptionNode, + createEventNode, + createURLNode, + createURLSearchParamsNode, +} from '../web-api'; type ObjectLikeNode = | SerovalObjectNode @@ -276,21 +281,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { id: number, current: Event, ): SerovalEventNode { - return { - t: SerovalNodeType.Event, - i: id, - s: serializeString(current.type), - l: undefined, - c: undefined, - m: undefined, - p: undefined, - e: undefined, - a: undefined, - f: this.parse(createEventOptions(current)), - b: undefined, - o: undefined, - x: undefined, - }; + return createEventNode(id, current.type, this.parse(createEventOptions(current))); } protected parseCustomEvent( diff --git a/packages/seroval/src/core/web-api.ts b/packages/seroval/src/core/web-api.ts index 762dbe95..6b647a1f 100644 --- a/packages/seroval/src/core/web-api.ts +++ b/packages/seroval/src/core/web-api.ts @@ -1,6 +1,12 @@ import { SerovalNodeType } from './constants'; import { serializeString } from './string'; -import type { SerovalDOMExceptionNode, SerovalURLNode, SerovalURLSearchParamsNode } from './types'; +import type { + SerovalDOMExceptionNode, + SerovalEventNode, + SerovalNode, + SerovalURLNode, + SerovalURLSearchParamsNode, +} from './types'; export function createURLNode( id: number, @@ -64,3 +70,25 @@ export function createDOMExceptionNode( x: undefined, }; } + +export function createEventNode( + id: number, + type: string, + options: SerovalNode, +): SerovalEventNode { + return { + t: SerovalNodeType.Event, + i: id, + s: serializeString(type), + l: undefined, + c: undefined, + m: undefined, + p: undefined, + e: undefined, + a: undefined, + f: options, + b: undefined, + o: undefined, + x: undefined, + }; +} From 2bd5a97dc51356436a8ff14e903524d9a1536c7f Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Wed, 15 Nov 2023 21:49:59 +0800 Subject: [PATCH 19/82] Dedupe CustomEvent node --- packages/seroval/src/core/base/async.ts | 21 ++++++--------------- packages/seroval/src/core/base/sync.ts | 17 ++--------------- packages/seroval/src/core/web-api.ts | 23 +++++++++++++++++++++++ 3 files changed, 31 insertions(+), 30 deletions(-) diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index 53eea1d0..50531475 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -74,6 +74,7 @@ import { createURLSearchParamsNode, createDOMExceptionNode, createEventNode, + createCustomEVentNode, } from '../web-api'; type ObjectLikeNode = @@ -386,21 +387,11 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { id: number, current: CustomEvent, ): Promise { - return { - t: SerovalNodeType.CustomEvent, - i: id, - s: serializeString(current.type), - l: undefined, - c: undefined, - m: undefined, - p: undefined, - e: undefined, - a: undefined, - f: await this.parse(createCustomEventOptions(current)), - b: undefined, - o: undefined, - x: undefined, - }; + return createCustomEVentNode( + id, + current.type, + await this.parse(createCustomEventOptions(current)), + ); } private async parseAggregateError( diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index 93044b93..9312a117 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -62,6 +62,7 @@ import type { SerovalDataViewNode, } from '../types'; import { + createCustomEVentNode, createDOMExceptionNode, createEventNode, createURLNode, @@ -288,21 +289,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { id: number, current: CustomEvent, ): SerovalCustomEventNode { - return { - t: SerovalNodeType.CustomEvent, - i: id, - s: serializeString(current.type), - l: undefined, - c: undefined, - m: undefined, - p: undefined, - e: undefined, - a: undefined, - f: this.parse(createCustomEventOptions(current)), - b: undefined, - o: undefined, - x: undefined, - }; + return createCustomEVentNode(id, current.type, this.parse(createCustomEventOptions(current))); } protected parseAggregateError( diff --git a/packages/seroval/src/core/web-api.ts b/packages/seroval/src/core/web-api.ts index 6b647a1f..df044198 100644 --- a/packages/seroval/src/core/web-api.ts +++ b/packages/seroval/src/core/web-api.ts @@ -1,6 +1,7 @@ import { SerovalNodeType } from './constants'; import { serializeString } from './string'; import type { + SerovalCustomEventNode, SerovalDOMExceptionNode, SerovalEventNode, SerovalNode, @@ -92,3 +93,25 @@ export function createEventNode( x: undefined, }; } + +export function createCustomEVentNode( + id: number, + type: string, + options: SerovalNode, +): SerovalCustomEventNode { + return { + t: SerovalNodeType.CustomEvent, + i: id, + s: serializeString(type), + l: undefined, + c: undefined, + m: undefined, + p: undefined, + e: undefined, + a: undefined, + f: options, + b: undefined, + o: undefined, + x: undefined, + }; +} From f6881d7c3d78d8d058ad64a25d064c7511efd5b4 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Wed, 15 Nov 2023 21:51:42 +0800 Subject: [PATCH 20/82] Dedupe AggregateError node --- packages/seroval/src/core/base-primitives.ts | 23 +++++++++++ packages/seroval/src/core/base/async.ts | 40 ++++++++------------ packages/seroval/src/core/base/sync.ts | 40 ++++++++------------ 3 files changed, 53 insertions(+), 50 deletions(-) diff --git a/packages/seroval/src/core/base-primitives.ts b/packages/seroval/src/core/base-primitives.ts index 38136a2e..060e7de4 100644 --- a/packages/seroval/src/core/base-primitives.ts +++ b/packages/seroval/src/core/base-primitives.ts @@ -12,6 +12,7 @@ import { getReferenceID } from './reference'; import { getErrorConstructor, getObjectFlag } from './shared'; import { serializeString } from './string'; import type { + SerovalAggregateErrorNode, SerovalArrayBufferNode, SerovalArrayNode, SerovalBigIntNode, @@ -381,6 +382,28 @@ export function createErrorNode( }; } +export function createAggregateErrorNode( + id: number, + current: AggregateError, + options: SerovalObjectRecordNode | undefined, +): SerovalAggregateErrorNode { + return { + t: SerovalNodeType.AggregateError, + i: id, + s: getErrorConstructor(current), + l: undefined, + c: undefined, + m: serializeString(current.message), + p: options, + e: undefined, + a: undefined, + f: undefined, + b: undefined, + o: undefined, + x: undefined, + }; +} + export function createSetNode( id: number, size: number, diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index 50531475..e5454bae 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -18,6 +18,7 @@ import { createDataViewNode, createErrorNode, createSetNode, + createAggregateErrorNode, } from '../base-primitives'; import { BIGINT_FLAG, Feature } from '../compat'; import { @@ -189,6 +190,20 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { ); } + private async parseAggregateError( + id: number, + current: AggregateError, + ): Promise { + const options = getErrorOptions(current, this.features); + return createAggregateErrorNode( + id, + current, + options + ? await this.parseProperties(options) + : undefined, + ); + } + private async parseMap( id: number, current: Map, @@ -394,31 +409,6 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { ); } - private async parseAggregateError( - id: number, - current: AggregateError, - ): Promise { - const options = getErrorOptions(current, this.features); - const optionsNode = options - ? await this.parseProperties(options) - : undefined; - return { - t: SerovalNodeType.AggregateError, - i: id, - s: undefined, - l: undefined, - c: undefined, - m: serializeString(current.message), - p: optionsNode, - e: undefined, - a: undefined, - f: undefined, - b: undefined, - o: undefined, - x: undefined, - }; - } - private async parsePromise( id: number, current: Promise, diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index 9312a117..a7641574 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -3,6 +3,7 @@ import type { BigIntTypedArrayValue, TypedArrayValue } from '../../types'; import UnsupportedTypeError from '../UnsupportedTypeError'; import assert from '../assert'; import { + createAggregateErrorNode, createArrayBufferNode, createArrayNode, createBigIntNode, @@ -182,6 +183,20 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { ); } + protected parseAggregateError( + id: number, + current: AggregateError, + ): SerovalAggregateErrorNode { + const options = getErrorOptions(current, this.features); + return createAggregateErrorNode( + id, + current, + options + ? this.parseProperties(options) + : undefined, + ); + } + protected parseMap( id: number, current: Map, @@ -292,31 +307,6 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { return createCustomEVentNode(id, current.type, this.parse(createCustomEventOptions(current))); } - protected parseAggregateError( - id: number, - current: AggregateError, - ): SerovalAggregateErrorNode { - const options = getErrorOptions(current, this.features); - const optionsNode = options - ? this.parseProperties(options) - : undefined; - return { - t: SerovalNodeType.AggregateError, - i: id, - s: undefined, - l: undefined, - c: undefined, - m: serializeString(current.message), - p: optionsNode, - e: undefined, - a: undefined, - f: undefined, - b: undefined, - o: undefined, - x: undefined, - }; - } - protected parsePlugin( id: number, current: unknown, From 4a3439fae145316cc35fd8efebbc5c35386e239e Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Wed, 15 Nov 2023 21:58:01 +0800 Subject: [PATCH 21/82] Change `ReadableStream` serialization --- packages/seroval/assets/global-header.js | 21 ++++++++++---------- packages/seroval/src/core/cross/serialize.ts | 10 ++++++---- packages/seroval/src/core/keys.ts | 10 ++++++++-- 3 files changed, 24 insertions(+), 17 deletions(-) diff --git a/packages/seroval/assets/global-header.js b/packages/seroval/assets/global-header.js index 3f4b93a6..82a5764e 100644 --- a/packages/seroval/assets/global-header.js +++ b/packages/seroval/assets/global-header.js @@ -36,17 +36,16 @@ self._$ = self._$ || { uS(stream) { delete stream.c; }, - Se(stream, type, data, controller) { - controller = stream.c; - switch (type) { - case 0: return controller.enqueue(data); - case 1: - this.uS(stream); - return controller.error(data); - case 2: - this.uS(stream); - return controller.close(); - } + Se(stream, data) { + stream.c.enqueue(data); + }, + St(stream, data) { + stream.c.error(data); + this.uS(stream); + }, + Sc(stream) { + stream.c.close(); + this.uS(stream); }, // ReadableStream constructor S(stream, controller) { diff --git a/packages/seroval/src/core/cross/serialize.ts b/packages/seroval/src/core/cross/serialize.ts index de7e2a1a..fb3c68b0 100644 --- a/packages/seroval/src/core/cross/serialize.ts +++ b/packages/seroval/src/core/cross/serialize.ts @@ -14,7 +14,9 @@ import { GLOBAL_CONTEXT_PROMISE_CONSTRUCTOR, GLOBAL_CONTEXT_REFERENCES, GLOBAL_CONTEXT_STREAM_CONSTRUCTOR, - GLOBAL_CONTEXT_STREAM_EMIT, + GLOBAL_CONTEXT_STREAM_ENQUEUE, + GLOBAL_CONTEXT_STREAM_CLOSE, + GLOBAL_CONTEXT_STREAM_ERROR, GLOBAL_CONTEXT_API, } from '../keys'; import type { BaseSerializerContextOptions } from '../serializer-context'; @@ -79,19 +81,19 @@ export default class CrossSerializerContext extends BaseSerializerContext { protected serializeReadableStreamEnqueue( node: SerovalReadableStreamEnqueueNode, ): string { - return GLOBAL_CONTEXT_API + '.' + GLOBAL_CONTEXT_STREAM_EMIT + '(' + this.getRefParam(node.i) + ',0,' + this.serialize(node.f) + ')'; + return GLOBAL_CONTEXT_API + '.' + GLOBAL_CONTEXT_STREAM_ENQUEUE + '(' + this.getRefParam(node.i) + ',' + this.serialize(node.f) + ')'; } protected serializeReadableStreamError( node: SerovalReadableStreamErrorNode, ): string { - return GLOBAL_CONTEXT_API + '.' + GLOBAL_CONTEXT_STREAM_EMIT + '(' + this.getRefParam(node.i) + ',1,' + this.serialize(node.f) + ')'; + return GLOBAL_CONTEXT_API + '.' + GLOBAL_CONTEXT_STREAM_ERROR + '(' + this.getRefParam(node.i) + ',' + this.serialize(node.f) + ')'; } protected serializeReadableStreamClose( node: SerovalReadableStreamCloseNode, ): string { - return GLOBAL_CONTEXT_API + '.' + GLOBAL_CONTEXT_STREAM_EMIT + '(' + this.getRefParam(node.i) + ',2)'; + return GLOBAL_CONTEXT_API + '.' + GLOBAL_CONTEXT_STREAM_CLOSE + '(' + this.getRefParam(node.i) + ')'; } serializeTop(tree: SerovalNode): string { diff --git a/packages/seroval/src/core/keys.ts b/packages/seroval/src/core/keys.ts index 92f9c855..5c6c2716 100644 --- a/packages/seroval/src/core/keys.ts +++ b/packages/seroval/src/core/keys.ts @@ -21,7 +21,11 @@ export const LOCAL_CONTEXT_STREAM_CONTROLLER = 'c'; export const GLOBAL_CONTEXT_STREAM_CONSTRUCTOR = 'S'; -export const GLOBAL_CONTEXT_STREAM_EMIT = 'Se'; +export const GLOBAL_CONTEXT_STREAM_ENQUEUE = 'Se'; + +export const GLOBAL_CONTEXT_STREAM_ERROR = 'St'; + +export const GLOBAL_CONTEXT_STREAM_CLOSE = 'Sc'; const GLOBAL_CONTEXT_API_REF = `self.${GLOBAL_CONTEXT_API}`; @@ -31,7 +35,9 @@ export const GLOBAL_CONTEXT_API_SCRIPT = `${GLOBAL_CONTEXT_API_REF}=${GLOBAL_CON + `${GLOBAL_CONTEXT_PROMISE_RESOLVE}:function(p,d){p.${LOCAL_CONTEXT_PROMISE_RESOLVE}(d),p.status="success",p.value=d,this.uP(p)},` + `${GLOBAL_CONTEXT_PROMISE_REJECT}:function(p,d){p.${LOCAL_CONTEXT_PROMISE_REJECT}(d),p.status="failure",p.value=d,this.uP(p)},` + `uS:function(s){delete s.${LOCAL_CONTEXT_STREAM_CONTROLLER}},` - + `${GLOBAL_CONTEXT_STREAM_EMIT}:function(s,t,d,c){switch(c=s.${LOCAL_CONTEXT_STREAM_CONTROLLER},t){case 0:return c.enqueue(d);case 1:return(this.uS(s),c.error(d));case 2:return(this.uS(s),c.close())}},` + + `${GLOBAL_CONTEXT_STREAM_CLOSE}:function(s){s.${LOCAL_CONTEXT_STREAM_CONTROLLER}.close(),this.uS(s)},` + + `${GLOBAL_CONTEXT_STREAM_ERROR}:function(s,e){s.${LOCAL_CONTEXT_STREAM_CONTROLLER}.error(e),this.uS(s)},` + + `${GLOBAL_CONTEXT_STREAM_ENQUEUE}:function(s,d){s.${LOCAL_CONTEXT_STREAM_CONTROLLER}.enqueue(d)},` + `${GLOBAL_CONTEXT_STREAM_CONSTRUCTOR}:function(s,c){return(s=new ReadableStream({start:function(x){c=x}})).${LOCAL_CONTEXT_STREAM_CONTROLLER}=c,s}` + '}'; From 4b780947abd30daef5af0934bb91003e70e44d7f Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Wed, 15 Nov 2023 22:00:01 +0800 Subject: [PATCH 22/82] Fix snapshots --- .../readable-stream.test.ts.snap | 20 +++++++++---------- .../__snapshots__/request.test.ts.snap | 8 ++++---- .../__snapshots__/response.test.ts.snap | 8 ++++---- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap index 989cdcea..2e32399e 100644 --- a/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap @@ -2,28 +2,28 @@ exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 1`] = `"($R=>$R[0]=_$.S())($R[\\"example\\"])"`; -exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 2`] = `"($R=>_$.Se($R[0],0,\\"foo\\"))($R[\\"example\\"])"`; +exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 2`] = `"($R=>_$.Se($R[0],\\"foo\\"))($R[\\"example\\"])"`; -exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 3`] = `"($R=>_$.Se($R[0],0,\\"bar\\"))($R[\\"example\\"])"`; +exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 3`] = `"($R=>_$.Se($R[0],\\"bar\\"))($R[\\"example\\"])"`; -exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 4`] = `"($R=>_$.Se($R[0],0,\\"baz\\"))($R[\\"example\\"])"`; +exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 4`] = `"($R=>_$.Se($R[0],\\"baz\\"))($R[\\"example\\"])"`; -exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 5`] = `"($R=>_$.Se($R[0],2))($R[\\"example\\"])"`; +exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 5`] = `"($R=>_$.Sc($R[0]))($R[\\"example\\"])"`; exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream errors 1`] = `"($R=>$R[0]=_$.S())($R[\\"example\\"])"`; -exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream errors 2`] = `"($R=>_$.Se($R[0],1,$R[1]=Object.assign(new Error(\\"Oops!\\"),{stack:\\"\\"})))($R[\\"example\\"])"`; +exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream errors 2`] = `"($R=>_$.St($R[0],$R[1]=Object.assign(new Error(\\"Oops!\\"),{stack:\\"\\"})))($R[\\"example\\"])"`; exports[`ReadableStream > crossSerializeStream > supports ReadableStream 1`] = `"$R[0]=_$.S()"`; -exports[`ReadableStream > crossSerializeStream > supports ReadableStream 2`] = `"_$.Se($R[0],0,\\"foo\\")"`; +exports[`ReadableStream > crossSerializeStream > supports ReadableStream 2`] = `"_$.Se($R[0],\\"foo\\")"`; -exports[`ReadableStream > crossSerializeStream > supports ReadableStream 3`] = `"_$.Se($R[0],0,\\"bar\\")"`; +exports[`ReadableStream > crossSerializeStream > supports ReadableStream 3`] = `"_$.Se($R[0],\\"bar\\")"`; -exports[`ReadableStream > crossSerializeStream > supports ReadableStream 4`] = `"_$.Se($R[0],0,\\"baz\\")"`; +exports[`ReadableStream > crossSerializeStream > supports ReadableStream 4`] = `"_$.Se($R[0],\\"baz\\")"`; -exports[`ReadableStream > crossSerializeStream > supports ReadableStream 5`] = `"_$.Se($R[0],2)"`; +exports[`ReadableStream > crossSerializeStream > supports ReadableStream 5`] = `"_$.Sc($R[0])"`; exports[`ReadableStream > crossSerializeStream > supports ReadableStream errors 1`] = `"$R[0]=_$.S()"`; -exports[`ReadableStream > crossSerializeStream > supports ReadableStream errors 2`] = `"_$.Se($R[0],1,$R[1]=Object.assign(new Error(\\"Oops!\\"),{stack:\\"\\"}))"`; +exports[`ReadableStream > crossSerializeStream > supports ReadableStream errors 2`] = `"_$.St($R[0],$R[1]=Object.assign(new Error(\\"Oops!\\"),{stack:\\"\\"}))"`; diff --git a/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap index a24b7465..c6a28619 100644 --- a/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap @@ -6,15 +6,15 @@ exports[`Request > crossSerializeAsync > supports Blob 1`] = `"$R[0]=new Request exports[`Request > crossSerializeStream > scoped > supports Request 1`] = `"($R=>$R[0]=new Request(\\"http://localhost:3000/\\",$R[1]={body:$R[2]=_$.S(),cache:\\"default\\",credentials:\\"same-origin\\",headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),integrity:\\"\\",keepalive:!1,method:\\"POST\\",mode:\\"cors\\",redirect:\\"follow\\",referrer:\\"about:client\\",referrerPolicy:\\"\\"}))($R[\\"example\\"])"`; -exports[`Request > crossSerializeStream > scoped > supports Request 2`] = `"($R=>_$.Se($R[2],0,$R[4]=new Uint8Array($R[5]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,0,12)))($R[\\"example\\"])"`; +exports[`Request > crossSerializeStream > scoped > supports Request 2`] = `"($R=>_$.Se($R[2],$R[4]=new Uint8Array($R[5]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,0,12)))($R[\\"example\\"])"`; -exports[`Request > crossSerializeStream > scoped > supports Request 3`] = `"($R=>_$.Se($R[2],2))($R[\\"example\\"])"`; +exports[`Request > crossSerializeStream > scoped > supports Request 3`] = `"($R=>_$.Sc($R[2]))($R[\\"example\\"])"`; exports[`Request > crossSerializeStream > supports Request 1`] = `"$R[0]=new Request(\\"http://localhost:3000/\\",$R[1]={body:$R[2]=_$.S(),cache:\\"default\\",credentials:\\"same-origin\\",headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),integrity:\\"\\",keepalive:!1,method:\\"POST\\",mode:\\"cors\\",redirect:\\"follow\\",referrer:\\"about:client\\",referrerPolicy:\\"\\"})"`; -exports[`Request > crossSerializeStream > supports Request 2`] = `"_$.Se($R[2],0,$R[4]=new Uint8Array($R[5]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,0,12))"`; +exports[`Request > crossSerializeStream > supports Request 2`] = `"_$.Se($R[2],$R[4]=new Uint8Array($R[5]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,0,12))"`; -exports[`Request > crossSerializeStream > supports Request 3`] = `"_$.Se($R[2],2)"`; +exports[`Request > crossSerializeStream > supports Request 3`] = `"_$.Sc($R[2])"`; exports[`Request > serializeAsync > supports Request 1`] = `"new Request(\\"http://localhost:3000/\\",{body:new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,cache:\\"default\\",credentials:\\"same-origin\\",headers:new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),integrity:\\"\\",keepalive:!1,method:\\"POST\\",mode:\\"cors\\",redirect:\\"follow\\",referrer:\\"about:client\\",referrerPolicy:\\"\\"})"`; diff --git a/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap index 140d86e0..5ad86d31 100644 --- a/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap @@ -6,15 +6,15 @@ exports[`Response > crossSerializeAsync > supports Blob 1`] = `"$R[0]=new Respon exports[`Response > crossSerializeStream > scoped > supports Response 1`] = `"($R=>$R[0]=new Response($R[1]=_$.S(),$R[2]={headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),status:200,statusText:\\"\\"}))($R[\\"example\\"])"`; -exports[`Response > crossSerializeStream > scoped > supports Response 2`] = `"($R=>_$.Se($R[1],0,$R[4]=new Uint8Array($R[5]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,0,12)))($R[\\"example\\"])"`; +exports[`Response > crossSerializeStream > scoped > supports Response 2`] = `"($R=>_$.Se($R[1],$R[4]=new Uint8Array($R[5]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,0,12)))($R[\\"example\\"])"`; -exports[`Response > crossSerializeStream > scoped > supports Response 3`] = `"($R=>_$.Se($R[1],2))($R[\\"example\\"])"`; +exports[`Response > crossSerializeStream > scoped > supports Response 3`] = `"($R=>_$.Sc($R[1]))($R[\\"example\\"])"`; exports[`Response > crossSerializeStream > supports Response 1`] = `"$R[0]=new Response($R[1]=_$.S(),$R[2]={headers:$R[3]=new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),status:200,statusText:\\"\\"})"`; -exports[`Response > crossSerializeStream > supports Response 2`] = `"_$.Se($R[1],0,$R[4]=new Uint8Array($R[5]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,0,12))"`; +exports[`Response > crossSerializeStream > supports Response 2`] = `"_$.Se($R[1],$R[4]=new Uint8Array($R[5]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,0,12))"`; -exports[`Response > crossSerializeStream > supports Response 3`] = `"_$.Se($R[1],2)"`; +exports[`Response > crossSerializeStream > supports Response 3`] = `"_$.Sc($R[1])"`; exports[`Response > serializeAsync > supports Response 1`] = `"new Response(new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,{headers:new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),status:200,statusText:\\"\\"})"`; From c7308f7c4a04d9f944b2750cdca0f8b47f1dda77 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Wed, 15 Nov 2023 23:30:51 +0800 Subject: [PATCH 23/82] Add initial support for `AsyncIterable` --- packages/seroval/src/core/base/async.ts | 12 ++- packages/seroval/src/core/base/stream.ts | 54 +++++++++-- packages/seroval/src/core/constants.ts | 1 + packages/seroval/src/core/cross/serialize.ts | 28 +++++- .../seroval/src/core/iterator-to-sequence.ts | 93 ++++++++++++++++++- packages/seroval/src/core/parser-context.ts | 51 +++++++++- .../seroval/src/core/serializer-context.ts | 27 +++++- .../seroval/src/core/special-reference.ts | 4 + packages/seroval/src/core/types.ts | 15 +++ 9 files changed, 270 insertions(+), 15 deletions(-) diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index e5454bae..7869551b 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -37,7 +37,7 @@ import { FALSE_NODE, UNDEFINED_NODE, } from '../literals'; -import { iteratorToSequence } from '../iterator-to-sequence'; +import { asyncIteratorToSequence, iteratorToSequence } from '../iterator-to-sequence'; import { BaseParserContext } from '../parser-context'; import promiseToResult from '../promise-to-result'; import { getErrorOptions } from '../shared'; @@ -125,7 +125,15 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { if (this.features & Feature.Symbol) { if (Symbol.iterator in properties) { keyNodes.push(SerovalObjectRecordSpecialKey.SymbolIterator); - valueNodes.push(await this.parse(iteratorToSequence(properties as Iterable))); + valueNodes.push( + await this.parse(iteratorToSequence(properties as Iterable)), + ); + } + if (Symbol.asyncIterator in properties) { + keyNodes.push(SerovalObjectRecordSpecialKey.SymbolAsyncIterator); + valueNodes.push( + await this.parse(asyncIteratorToSequence(properties as AsyncIterable)), + ); } } return { diff --git a/packages/seroval/src/core/base/stream.ts b/packages/seroval/src/core/base/stream.ts index 2d1a6f53..e2a864a0 100644 --- a/packages/seroval/src/core/base/stream.ts +++ b/packages/seroval/src/core/base/stream.ts @@ -13,15 +13,19 @@ import { SerovalNodeType, UNIVERSAL_SENTINEL } from '../constants'; import { createRequestOptions, createResponseOptions } from '../constructors'; import { NULL_NODE } from '../literals'; import { serializeString } from '../string'; -import type { - SerovalNode, - SerovalPluginNode, - SerovalPromiseConstructorNode, - SerovalReadableStreamConstructorNode, - SerovalRequestNode, - SerovalResponseNode, +import { + SerovalObjectRecordSpecialKey, + type SerovalNode, + type SerovalObjectRecordKey, + type SerovalObjectRecordNode, + type SerovalPluginNode, + type SerovalPromiseConstructorNode, + type SerovalReadableStreamConstructorNode, + type SerovalRequestNode, + type SerovalResponseNode, } from '../types'; import { createDOMExceptionNode, createURLNode, createURLSearchParamsNode } from '../web-api'; +import { asyncIteratorToReadableStream, iteratorToSequence } from '../iterator-to-sequence'; export interface BaseStreamParserContextOptions extends BaseSyncParserContextOptions { onParse: (node: SerovalNode, initial: boolean) => void; @@ -84,6 +88,42 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont } } + protected parseProperties( + properties: Record, + ): SerovalObjectRecordNode { + const entries = Object.entries(properties); + const keyNodes: SerovalObjectRecordKey[] = []; + const valueNodes: SerovalNode[] = []; + for ( + let i = 0, len = entries.length; + i < len; + i++ + ) { + keyNodes.push(serializeString(entries[i][0])); + valueNodes.push(this.parse(entries[i][1])); + } + // Check special properties, symbols in this case + if (this.features & Feature.Symbol) { + if (Symbol.iterator in properties) { + keyNodes.push(SerovalObjectRecordSpecialKey.SymbolIterator); + valueNodes.push( + this.parse(iteratorToSequence(properties as Iterable)), + ); + } + if (Symbol.asyncIterator in properties) { + keyNodes.push(SerovalObjectRecordSpecialKey.SymbolAsyncIterator); + valueNodes.push( + this.parse(asyncIteratorToReadableStream(properties as AsyncIterable)), + ); + } + } + return { + k: keyNodes, + v: valueNodes, + s: keyNodes.length, + }; + } + private pushReadableStreamReader( id: number, reader: ReadableStreamDefaultReader, diff --git a/packages/seroval/src/core/constants.ts b/packages/seroval/src/core/constants.ts index ee506005..d0700c0a 100644 --- a/packages/seroval/src/core/constants.ts +++ b/packages/seroval/src/core/constants.ts @@ -53,6 +53,7 @@ export const enum SerovalNodeType { Plugin = 40, MapSentinel = 41, Iterator = 42, + AsyncIterator = 43, } export const enum SerovalObjectFlags { diff --git a/packages/seroval/src/core/cross/serialize.ts b/packages/seroval/src/core/cross/serialize.ts index fb3c68b0..4eeaf72a 100644 --- a/packages/seroval/src/core/cross/serialize.ts +++ b/packages/seroval/src/core/cross/serialize.ts @@ -7,6 +7,7 @@ import type { SerovalReadableStreamErrorNode, SerovalReadableStreamConstructorNode, SerovalNode, + SerovalAsyncIteratorNode, } from '../types'; import { GLOBAL_CONTEXT_PROMISE_REJECT, @@ -24,7 +25,8 @@ import BaseSerializerContext from '../serializer-context'; import type { SerovalMode } from '../plugin'; import { serializeString } from '../string'; import type { CrossContextOptions } from './cross-parser'; -import { createFunction } from '../function-string'; +import { createEffectfulFunction, createFunction } from '../function-string'; +import { SpecialReference } from '../special-reference'; export interface CrossSerializerContextOptions extends BaseSerializerContextOptions, CrossContextOptions { @@ -96,6 +98,30 @@ export default class CrossSerializerContext extends BaseSerializerContext { return GLOBAL_CONTEXT_API + '.' + GLOBAL_CONTEXT_STREAM_CLOSE + '(' + this.getRefParam(node.i) + ')'; } + protected serializeAsyncIterator(node: SerovalAsyncIteratorNode): string { + return this.assignIndexedValue( + node.i, + createFunction( + this.features, + ['s'], + '(' + createFunction( + this.features, + ['b'], + 'b=s.tee(),s=b[0],b=b[1].getReader(),{[' + this.serialize(node.x[SpecialReference.SymbolAsyncIterator]) + ']:' + createFunction(this.features, [], 'this') + ',' + + 'next:' + createFunction( + this.features, + [], + 'b.read().then(' + createEffectfulFunction( + this.features, + ['d'], + 'if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}', + ) + ')', + ) + '})', + ) + ')', + ), + ); + } + serializeTop(tree: SerovalNode): string { const result = this.serialize(tree); const id = tree.i; diff --git a/packages/seroval/src/core/iterator-to-sequence.ts b/packages/seroval/src/core/iterator-to-sequence.ts index b3742dd7..dd949615 100644 --- a/packages/seroval/src/core/iterator-to-sequence.ts +++ b/packages/seroval/src/core/iterator-to-sequence.ts @@ -32,11 +32,17 @@ export function iteratorToSequence(source: Iterable): Sequence { }; } -export function sequenceToIterator(sequence: Sequence): Iterator { +export function sequenceToIterator(sequence: Sequence): IterableIterator { let index = 0; return { next(): IteratorResult { + if (index > sequence.d) { + return { + done: true, + value: undefined, + }; + } const currentIndex = index++; const currentItem = sequence.v[currentIndex]; if (currentIndex === sequence.t) { @@ -47,5 +53,90 @@ export function sequenceToIterator(sequence: Sequence): Iterator { value: currentItem as T, }; }, + [Symbol.iterator](): IterableIterator { + return this; + }, + }; +} + +export async function asyncIteratorToSequence(source: AsyncIterable): Promise { + const values: unknown[] = []; + let throwsAt = -1; + let doneAt = -1; + + const iterator = source[Symbol.asyncIterator](); + + async function push(): Promise { + try { + const value = await iterator.next(); + values.push(value.value); + if (value.done) { + doneAt = values.length - 1; + } else { + await push(); + } + } catch (error) { + throwsAt = values.length; + values.push(error); + } + } + + await push(); + + return { + v: values, + t: throwsAt, + d: doneAt, + }; +} + +export function sequenceToAsyncIterator(sequence: Sequence): AsyncIterableIterator { + let index = 0; + + return { + async next(): Promise> { + if (index > sequence.d) { + return { + done: true, + value: undefined, + }; + } + const currentIndex = index++; + const currentItem = sequence.v[currentIndex]; + if (currentIndex === sequence.t) { + throw currentItem; + } + return Promise.resolve({ + done: currentIndex === sequence.d, + value: currentItem as T, + }); + }, + [Symbol.asyncIterator](): AsyncIterableIterator { + return this; + }, }; } + +export function asyncIteratorToReadableStream( + source: AsyncIterable, +): ReadableStream { + return new ReadableStream({ + async start(controller): Promise { + const iterator = source[Symbol.asyncIterator](); + async function push(): Promise { + try { + const result = await iterator.next(); + controller.enqueue([result.done ? 2 : 0, result.value]); + if (result.done) { + controller.close(); + } else { + await push(); + } + } catch (error) { + controller.enqueue([1, error]); + } + } + await push(); + }, + }); +} diff --git a/packages/seroval/src/core/parser-context.ts b/packages/seroval/src/core/parser-context.ts index bf90c321..5239a13a 100644 --- a/packages/seroval/src/core/parser-context.ts +++ b/packages/seroval/src/core/parser-context.ts @@ -14,8 +14,14 @@ import { import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; import { hasReferenceID } from './reference'; import { getObjectFlag } from './shared'; -import { ITERATOR, MAP_SENTINEL, SpecialReference } from './special-reference'; +import { + ASYNC_ITERATOR, + ITERATOR, + MAP_SENTINEL, + SpecialReference, +} from './special-reference'; import type { + SerovalAsyncIteratorNode, SerovalIndexedValueNode, SerovalIteratorNode, SerovalMapNode, @@ -162,6 +168,37 @@ export abstract class BaseParserContext implements PluginAccessOptions { }; } + protected parseAsyncIterator(): SerovalIndexedValueNode | SerovalAsyncIteratorNode { + const registeredID = this.refs.get(ASYNC_ITERATOR); + if (registeredID != null) { + this.markRef(registeredID); + return createIndexedValueNode(registeredID); + } + const id = this.refs.size; + this.refs.set(ASYNC_ITERATOR, id); + return { + t: SerovalNodeType.AsyncIterator, + i: id, + s: undefined, + l: undefined, + c: undefined, + m: undefined, + p: undefined, + e: undefined, + a: undefined, + f: undefined, + b: undefined, + o: undefined, + x: { + [SpecialReference.Sentinel]: undefined, + [SpecialReference.SymbolIterator]: undefined, + [SpecialReference.Iterator]: undefined, + [SpecialReference.SymbolAsyncIterator]: this.parseWKSymbol(Symbol.asyncIterator), + [SpecialReference.AsyncIterator]: undefined, + }, + }; + } + protected createObjectNode( id: number, current: Record, @@ -193,6 +230,16 @@ export abstract class BaseParserContext implements PluginAccessOptions { ? this.parseIterator() : undefined ), + [SpecialReference.SymbolAsyncIterator]: ( + this.features & Feature.Symbol && Symbol.asyncIterator in current + ? this.parseWKSymbol(Symbol.asyncIterator) + : undefined + ), + [SpecialReference.AsyncIterator]: ( + this.features & Feature.Symbol && Symbol.asyncIterator in current + ? this.parseIterator() + : undefined + ), }, }; } @@ -220,6 +267,8 @@ export abstract class BaseParserContext implements PluginAccessOptions { [SpecialReference.Sentinel]: this.parseMapSentinel(), [SpecialReference.SymbolIterator]: undefined, [SpecialReference.Iterator]: undefined, + [SpecialReference.SymbolAsyncIterator]: undefined, + [SpecialReference.AsyncIterator]: undefined, }, }; } diff --git a/packages/seroval/src/core/serializer-context.ts b/packages/seroval/src/core/serializer-context.ts index 7b4f9d01..5a4e42b2 100644 --- a/packages/seroval/src/core/serializer-context.ts +++ b/packages/seroval/src/core/serializer-context.ts @@ -54,6 +54,7 @@ import type { SerovalReadableStreamCloseNode, SerovalMapSentinelNode, SerovalIteratorNode, + SerovalAsyncIteratorNode, } from './types'; import { SerovalObjectRecordSpecialKey, @@ -466,6 +467,8 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio switch (key) { case SerovalObjectRecordSpecialKey.SymbolIterator: return this.serializeIterable(source, val); + case SerovalObjectRecordSpecialKey.SymbolAsyncIterator: + return ''; default: { const check = Number(key); // Test if key is a valid number or JS identifier @@ -553,6 +556,8 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio this.assignments = parentAssignment; } break; + case SerovalObjectRecordSpecialKey.SymbolAsyncIterator: + break; default: { const serialized = this.serialize(value); const check = Number(key); @@ -1036,9 +1041,25 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio ['s'], '(' + createFunction( this.features, - ['i', 'c', 'd'], - '(i=0,{[' + this.serialize(node.x[SpecialReference.SymbolIterator]) + ']:' + createFunction(this.features, [], 'this') + ',' - + 'next:' + createEffectfulFunction(this.features, [], 'c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}') + '})', + ['i', 'c', 'd', 't'], + '(i=0,t={[' + this.serialize(node.x[SpecialReference.SymbolIterator]) + ']:' + createFunction(this.features, [], 't') + ',' + + 'next:' + createEffectfulFunction(this.features, [], 'if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}') + '})', + ) + ')', + ), + ); + } + + protected serializeAsyncIterator(node: SerovalAsyncIteratorNode): string { + return this.assignIndexedValue( + node.i, + createFunction( + this.features, + ['s'], + '(' + createFunction( + this.features, + ['i', 'c', 'd', 't'], + '(i=0,t={[' + this.serialize(node.x[SpecialReference.SymbolAsyncIterator]) + ']:' + createFunction(this.features, [], 't') + ',' + + 'next:async ' + createEffectfulFunction(this.features, [], 'if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}') + '})', ) + ')', ), ); diff --git a/packages/seroval/src/core/special-reference.ts b/packages/seroval/src/core/special-reference.ts index c36a0b63..6df8616e 100644 --- a/packages/seroval/src/core/special-reference.ts +++ b/packages/seroval/src/core/special-reference.ts @@ -2,8 +2,12 @@ export const MAP_SENTINEL = {}; export const ITERATOR = {}; +export const ASYNC_ITERATOR = {}; + export const enum SpecialReference { Sentinel = 0, SymbolIterator = 1, Iterator = 2, + SymbolAsyncIterator = 3, + AsyncIterator = 4, } diff --git a/packages/seroval/src/core/types.ts b/packages/seroval/src/core/types.ts index 46fac5c5..7064e79b 100644 --- a/packages/seroval/src/core/types.ts +++ b/packages/seroval/src/core/types.ts @@ -42,6 +42,7 @@ export type SerovalX = { export const enum SerovalObjectRecordSpecialKey { SymbolIterator = 0, + SymbolAsyncIterator = 1, } export type SerovalObjectRecordKey = @@ -193,6 +194,8 @@ export interface SerovalArrayNode extends SerovalBaseNode { export interface SerovalObjectX extends SerovalX { [SpecialReference.SymbolIterator]: SerovalNodeWithID | undefined; [SpecialReference.Iterator]: SerovalNodeWithID | undefined; + [SpecialReference.SymbolAsyncIterator]: SerovalNodeWithID | undefined; + [SpecialReference.Iterator]: SerovalNodeWithID | undefined; } export interface SerovalObjectNode extends SerovalBaseNode { @@ -207,6 +210,8 @@ export interface SerovalObjectNode extends SerovalBaseNode { export interface SerovalNullConstructorX extends SerovalX { [SpecialReference.SymbolIterator]: SerovalNodeWithID | undefined; [SpecialReference.Iterator]: SerovalNodeWithID | undefined; + [SpecialReference.SymbolAsyncIterator]: SerovalNodeWithID | undefined; + [SpecialReference.Iterator]: SerovalNodeWithID | undefined; } export interface SerovalNullConstructorNode extends SerovalBaseNode { @@ -431,6 +436,16 @@ export interface SerovalIteratorNode extends SerovalBaseNode { x: SerovalIteratorX; } +export interface SerovalAsyncIteratorX extends SerovalX { + [SpecialReference.SymbolAsyncIterator]: SerovalNodeWithID; +} + +export interface SerovalAsyncIteratorNode extends SerovalBaseNode { + t: SerovalNodeType.AsyncIterator; + i: number; + x: SerovalAsyncIteratorX; +} + export type SerovalSyncNode = | SerovalPrimitiveNode | SerovalIndexedValueNode From 3a04d3221e7e9156985ceccc418d555a6366fae8 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 16 Nov 2023 00:25:22 +0800 Subject: [PATCH 24/82] Fix `AsyncIterable` serialization --- packages/seroval/src/core/base/async.ts | 5 ++- packages/seroval/src/core/base/stream.ts | 5 ++- packages/seroval/src/core/base/sync.ts | 5 ++- packages/seroval/src/core/cross/serialize.ts | 2 +- packages/seroval/src/core/parser-context.ts | 2 +- .../seroval/src/core/serializer-context.ts | 42 ++++++++++++++++++- packages/seroval/src/core/tree/deserialize.ts | 9 +++- packages/seroval/src/core/types.ts | 3 +- .../__snapshots__/frozen-object.test.ts.snap | 16 +++---- .../test/__snapshots__/iterable.test.ts.snap | 24 +++++------ .../test/__snapshots__/map.test.ts.snap | 2 +- .../null-constructor.test.ts.snap | 16 +++---- .../test/__snapshots__/object.test.ts.snap | 16 +++---- .../test/__snapshots__/plugin.test.ts.snap | 4 +- .../__snapshots__/sealed-object.test.ts.snap | 16 +++---- .../test/__snapshots__/set.test.ts.snap | 2 +- 16 files changed, 113 insertions(+), 56 deletions(-) diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index 7869551b..5b4bc9f5 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -601,7 +601,10 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { } // Generator functions don't have a global constructor // despite existing - if (currentFeatures & Feature.Symbol && Symbol.iterator in current) { + if ( + currentFeatures & Feature.Symbol + && (Symbol.iterator in current || Symbol.asyncIterator in current) + ) { return this.parsePlainObject(id, current, !!currentClass); } throw new UnsupportedTypeError(current); diff --git a/packages/seroval/src/core/base/stream.ts b/packages/seroval/src/core/base/stream.ts index e2a864a0..dd5fe37a 100644 --- a/packages/seroval/src/core/base/stream.ts +++ b/packages/seroval/src/core/base/stream.ts @@ -499,7 +499,10 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont } // Generator functions don't have a global constructor // despite existing - if (currentFeatures & Feature.Symbol && Symbol.iterator in current) { + if ( + currentFeatures & Feature.Symbol + && (Symbol.iterator in current || Symbol.asyncIterator in current) + ) { return this.parsePlainObject(id, current, !!currentClass); } throw new UnsupportedTypeError(current); diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index a7641574..b95c97fb 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -454,7 +454,10 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { } // Generator functions don't have a global constructor // despite existing - if (currentFeatures & Feature.Symbol && Symbol.iterator in current) { + if ( + currentFeatures & Feature.Symbol + && Symbol.iterator in current + ) { return this.parsePlainObject(id, current, !!currentClass); } throw new UnsupportedTypeError(current); diff --git a/packages/seroval/src/core/cross/serialize.ts b/packages/seroval/src/core/cross/serialize.ts index 4eeaf72a..c13de849 100644 --- a/packages/seroval/src/core/cross/serialize.ts +++ b/packages/seroval/src/core/cross/serialize.ts @@ -107,7 +107,7 @@ export default class CrossSerializerContext extends BaseSerializerContext { '(' + createFunction( this.features, ['b'], - 'b=s.tee(),s=b[0],b=b[1].getReader(),{[' + this.serialize(node.x[SpecialReference.SymbolAsyncIterator]) + ']:' + createFunction(this.features, [], 'this') + ',' + '(b=s.tee(),s=b[0],b=b[1].getReader(),{[' + this.serialize(node.x[SpecialReference.SymbolAsyncIterator]) + ']:' + createFunction(this.features, [], 'this') + ',' + 'next:' + createFunction( this.features, [], diff --git a/packages/seroval/src/core/parser-context.ts b/packages/seroval/src/core/parser-context.ts index 5239a13a..3565e19a 100644 --- a/packages/seroval/src/core/parser-context.ts +++ b/packages/seroval/src/core/parser-context.ts @@ -237,7 +237,7 @@ export abstract class BaseParserContext implements PluginAccessOptions { ), [SpecialReference.AsyncIterator]: ( this.features & Feature.Symbol && Symbol.asyncIterator in current - ? this.parseIterator() + ? this.parseAsyncIterator() : undefined ), }, diff --git a/packages/seroval/src/core/serializer-context.ts b/packages/seroval/src/core/serializer-context.ts index 5a4e42b2..d9ba756a 100644 --- a/packages/seroval/src/core/serializer-context.ts +++ b/packages/seroval/src/core/serializer-context.ts @@ -413,6 +413,26 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio return ''; } + protected serializeAsyncIterable( + source: SerovalNodeWithProperties, + node: SerovalNode, + ): string { + if ( + source.x + && source.x[SpecialReference.SymbolAsyncIterator] + && source.x[SpecialReference.AsyncIterator] + ) { + const key = '[' + this.serialize(source.x[SpecialReference.SymbolAsyncIterator]) + ']:'; + const parent = this.stack; + this.stack = []; + const serialized = this.serialize(node); + this.stack = parent; + const constructor = this.serialize(source.x[SpecialReference.AsyncIterator]); + return key + '(' + constructor + ')(' + serialized + ')'; + } + return ''; + } + protected serializeArrayItem( id: number, item: SerovalNode | undefined, @@ -468,7 +488,7 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio case SerovalObjectRecordSpecialKey.SymbolIterator: return this.serializeIterable(source, val); case SerovalObjectRecordSpecialKey.SymbolAsyncIterator: - return ''; + return this.serializeAsyncIterable(source, val); default: { const check = Number(key); // Test if key is a valid number or JS identifier @@ -557,6 +577,24 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio } break; case SerovalObjectRecordSpecialKey.SymbolAsyncIterator: + if ( + source.x + && source.x[SpecialReference.AsyncIterator] + && source.x[SpecialReference.SymbolAsyncIterator] + ) { + const parent = this.stack; + this.stack = []; + const serialized = this.serialize(value); + this.stack = parent; + const parentAssignment = this.assignments; + this.assignments = mainAssignments; + this.createArrayAssign( + source.i, + this.serialize(source.x[SpecialReference.SymbolAsyncIterator]), + '(' + this.serialize(source.x[SpecialReference.AsyncIterator]) + ')(' + serialized + ')', + ); + this.assignments = parentAssignment; + } break; default: { const serialized = this.serialize(value); @@ -1152,6 +1190,8 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio return this.serializeMapSentinel(node); case SerovalNodeType.Iterator: return this.serializeIterator(node); + case SerovalNodeType.AsyncIterator: + return this.serializeAsyncIterator(node); default: throw new Error('invariant'); } diff --git a/packages/seroval/src/core/tree/deserialize.ts b/packages/seroval/src/core/tree/deserialize.ts index 4bab8df5..cd4a9c37 100644 --- a/packages/seroval/src/core/tree/deserialize.ts +++ b/packages/seroval/src/core/tree/deserialize.ts @@ -48,7 +48,7 @@ import { } from '../constants'; import type { Plugin, PluginAccessOptions } from '../plugin'; import type { Sequence } from '../iterator-to-sequence'; -import { sequenceToIterator } from '../iterator-to-sequence'; +import { sequenceToAsyncIterator, sequenceToIterator } from '../iterator-to-sequence'; function applyObjectFlag(obj: unknown, flag: SerovalObjectFlags): unknown { switch (flag) { @@ -167,6 +167,13 @@ export default class VanillaDeserializerContext implements PluginAccessOptions { result[Symbol.iterator] = (): Iterator => sequenceToIterator(current); } break; + case SerovalObjectRecordSpecialKey.SymbolAsyncIterator: { + const current = value as Sequence; + result[Symbol.asyncIterator] = ( + (): AsyncIterator => sequenceToAsyncIterator(current) + ); + } + break; default: result[deserializeString(key)] = value; break; diff --git a/packages/seroval/src/core/types.ts b/packages/seroval/src/core/types.ts index 7064e79b..0fe089c7 100644 --- a/packages/seroval/src/core/types.ts +++ b/packages/seroval/src/core/types.ts @@ -474,7 +474,8 @@ export type SerovalSyncNode = | SerovalDOMExceptionNode | SerovalPluginNode | SerovalMapSentinelNode - | SerovalIteratorNode; + | SerovalIteratorNode + | SerovalAsyncIteratorNode; export type SerovalAsyncNode = | SerovalPromiseNode diff --git a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap index ffd44f49..d5d46ad2 100644 --- a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap @@ -2,25 +2,25 @@ exports[`frozen object > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])"`; -exports[`frozen object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; +exports[`frozen object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])"`; -exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; exports[`frozen object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])"`; @@ -30,7 +30,7 @@ exports[`frozen object > crossSerializeStream > scoped > supports Objects 2`] = exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -46,7 +46,7 @@ exports[`frozen object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps( exports[`frozen object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; exports[`frozen object > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -58,13 +58,13 @@ exports[`frozen object > crossSerializeStream > supports self-recursion 4`] = `" exports[`frozen object > serialize > supports Objects 1`] = `"(h=>(h={hello:\\"world\\"},Object.freeze(h),h))()"`; -exports[`frozen object > serialize > supports Symbol.iterator 1`] = `"((h,j)=>(h={[j=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[j]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.freeze(h),h))()"`; +exports[`frozen object > serialize > supports Symbol.iterator 1`] = `"((h,j)=>(h={[j=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[j]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.freeze(h),h))()"`; exports[`frozen object > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a=h,Object.freeze(h),h))()"`; exports[`frozen object > serializeAsync > supports Objects 1`] = `"((h,j)=>(j=Promise.resolve(h={hello:\\"world\\"}),Object.freeze(h),j))()"`; -exports[`frozen object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[j=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[j]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}),Object.freeze(h),k))()"`; +exports[`frozen object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[j=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[j]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}),Object.freeze(h),k))()"`; exports[`frozen object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.freeze(h),h))()"`; diff --git a/packages/seroval/test/__snapshots__/iterable.test.ts.snap b/packages/seroval/test/__snapshots__/iterable.test.ts.snap index f7b9a100..909857b8 100644 --- a/packages/seroval/test/__snapshots__/iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/iterable.test.ts.snap @@ -1,36 +1,36 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Iterable > compat > should use functions instead of method shorthand. 1`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{[h]:function(){returnthis},next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; +exports[`Iterable > compat > should use functions instead of method shorthand. 1`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > compat > should use method shorthand instead of arrow functions. 1`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{[h]:function(){returnthis},next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; +exports[`Iterable > compat > should use method shorthand instead of arrow functions. 1`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[0,3]}"`; -exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 2`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{[h]:function(){returnthis},next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; +exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 2`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[0,3]}"`; -exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 2`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d){return(i=0,{[h]:function(){returnthis},next:function(){c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; +exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 2`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; -exports[`Iterable > crossSerialize > supports Iterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`Iterable > crossSerialize > supports Iterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; -exports[`Iterable > crossSerializeAsync > scoped > supports Iterables 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`Iterable > crossSerializeAsync > scoped > supports Iterables 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; -exports[`Iterable > crossSerializeAsync > supports Iterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`Iterable > crossSerializeAsync > supports Iterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`Iterable > crossSerializeStream > scoped > supports Iterables 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Iterable > crossSerializeStream > scoped > supports Iterables 2`] = `"($R=>_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`Iterable > crossSerializeStream > scoped > supports Iterables 2`] = `"($R=>_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`Iterable > crossSerializeStream > supports Iterables 1`] = `"$R[0]=_$.P()"`; -exports[`Iterable > crossSerializeStream > supports Iterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`Iterable > crossSerializeStream > supports Iterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; -exports[`Iterable > serialize > supports Iterables 1`] = `"(h=>({title:\\"Hello World\\",[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; +exports[`Iterable > serialize > supports Iterables 1`] = `"(h=>({title:\\"Hello World\\",[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; -exports[`Iterable > serializeAsync > supports Iterables 1`] = `"(h=>(Promise.resolve({title:\\"Hello World\\",[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; +exports[`Iterable > serializeAsync > supports Iterables 1`] = `"(h=>(Promise.resolve({title:\\"Hello World\\",[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; exports[`Iterable > toJSON > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; diff --git a/packages/seroval/test/__snapshots__/map.test.ts.snap b/packages/seroval/test/__snapshots__/map.test.ts.snap index 9822854f..d6171d24 100644 --- a/packages/seroval/test/__snapshots__/map.test.ts.snap +++ b/packages/seroval/test/__snapshots__/map.test.ts.snap @@ -1,6 +1,6 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[void 0],t:-1,d:0})})))()"`; +exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[void 0],t:-1,d:0})})))()"`; exports[`Map > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; diff --git a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap index 82638af0..25864bec 100644 --- a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap +++ b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap @@ -8,25 +8,25 @@ exports[`null-constructor > compat#toJSON > should use manual assignment instead exports[`null-constructor > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; exports[`null-constructor > crossSerialize > supports Objects 1`] = `"$R[0]=Object.assign(Object.create(null),{hello:\\"world\\"})"`; -exports[`null-constructor > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`null-constructor > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`null-constructor > crossSerialize > supports self-recursion 1`] = `"($R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])"`; exports[`null-constructor > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; +exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; exports[`null-constructor > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})"`; @@ -36,7 +36,7 @@ exports[`null-constructor > crossSerializeStream > scoped > supports Objects 2`] exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -52,7 +52,7 @@ exports[`null-constructor > crossSerializeStream > supports Objects 2`] = `"_$.P exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; exports[`null-constructor > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -64,13 +64,13 @@ exports[`null-constructor > crossSerializeStream > supports self-recursion 4`] = exports[`null-constructor > serialize > supports Object.create(null) 1`] = `"Object.assign(Object.create(null),{hello:\\"world\\"})"`; -exports[`null-constructor > serialize > supports Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; +exports[`null-constructor > serialize > supports Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; exports[`null-constructor > serialize > supports self-recursion 1`] = `"(h=>(h=Object.create(null),h.b=h.a=h,h))()"`; exports[`null-constructor > serializeAsync > supports Object.create(null) 1`] = `"Promise.resolve(Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))))()"`; +exports[`null-constructor > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))))()"`; exports[`null-constructor > serializeAsync > supports self-recursion 1`] = `"(h=>(h=Object.assign(Object.create(null),{a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)})))()"`; diff --git a/packages/seroval/test/__snapshots__/object.test.ts.snap b/packages/seroval/test/__snapshots__/object.test.ts.snap index 00dadd2b..0b311786 100644 --- a/packages/seroval/test/__snapshots__/object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/object.test.ts.snap @@ -8,25 +8,25 @@ exports[`objects > compat#toJSON > should use manual assignment instead of Objec exports[`objects > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"})($R[\\"example\\"])"`; -exports[`objects > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`objects > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; exports[`objects > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; exports[`objects > crossSerialize > supports Objects 1`] = `"$R[0]={hello:\\"world\\"}"`; -exports[`objects > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`objects > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; exports[`objects > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],$R[0])"`; exports[`objects > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]={hello:\\"world\\"})"`; -exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`objects > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}"`; @@ -36,7 +36,7 @@ exports[`objects > crossSerializeStream > scoped > supports Objects 2`] = `"($R= exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`objects > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -52,7 +52,7 @@ exports[`objects > crossSerializeStream > supports Objects 2`] = `"_$.Ps($R[0],$ exports[`objects > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`objects > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -64,13 +64,13 @@ exports[`objects > crossSerializeStream > supports self-recursion 4`] = `"_$.Ps( exports[`objects > serialize > supports Objects 1`] = `"({hello:\\"world\\"})"`; -exports[`objects > serialize > supports Symbol.iterator 1`] = `"(h=>({[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; +exports[`objects > serialize > supports Symbol.iterator 1`] = `"(h=>({[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; exports[`objects > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a=h,h))()"`; exports[`objects > serializeAsync > supports Objects 1`] = `"Promise.resolve({hello:\\"world\\"})"`; -exports[`objects > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve({[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; +exports[`objects > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve({[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; exports[`objects > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)}))()"`; diff --git a/packages/seroval/test/__snapshots__/plugin.test.ts.snap b/packages/seroval/test/__snapshots__/plugin.test.ts.snap index e48e04b8..fecfb7eb 100644 --- a/packages/seroval/test/__snapshots__/plugin.test.ts.snap +++ b/packages/seroval/test/__snapshots__/plugin.test.ts.snap @@ -8,9 +8,9 @@ exports[`Plugin > crossSerializeAsync > scoped > supports Plugin 1`] = `"($R=>$R exports[`Plugin > crossSerializeAsync > supports Plugin 1`] = `"$R[0]=Promise.resolve(Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\"))"`; -exports[`Plugin > crossSerializeStream > scoped > supports Plugin 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})}))($R[\\"example\\"])"`; +exports[`Plugin > crossSerializeStream > scoped > supports Plugin 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})}))($R[\\"example\\"])"`; -exports[`Plugin > crossSerializeStream > supports Plugin 1`] = `"$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})})"`; +exports[`Plugin > crossSerializeStream > supports Plugin 1`] = `"$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})})"`; exports[`Plugin > serialize > supports Plugin 1`] = `"Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\")"`; diff --git a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap index 2bb74a57..0e0a92c3 100644 --- a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap @@ -2,25 +2,25 @@ exports[`sealed object > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.seal($R[0]),$R[0])"`; -exports[`sealed object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d)=>(i=0,{[$R[3]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; +exports[`sealed object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])"`; -exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; exports[`sealed object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])"`; @@ -30,7 +30,7 @@ exports[`sealed object > crossSerializeStream > scoped > supports Objects 2`] = exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -46,7 +46,7 @@ exports[`sealed object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps( exports[`sealed object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d)=>(i=0,{[$R[4]]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; exports[`sealed object > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; @@ -58,13 +58,13 @@ exports[`sealed object > crossSerializeStream > supports self-recursion 4`] = `" exports[`sealed object > serialize > supports Objects 1`] = `"(h=>(h={hello:\\"world\\"},Object.seal(h),h))()"`; -exports[`sealed object > serialize > supports Symbol.iterator 1`] = `"((h,j)=>(h={[j=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[j]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.seal(h),h))()"`; +exports[`sealed object > serialize > supports Symbol.iterator 1`] = `"((h,j)=>(h={[j=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[j]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.seal(h),h))()"`; exports[`sealed object > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a=h,Object.seal(h),h))()"`; exports[`sealed object > serializeAsync > supports Objects 1`] = `"((h,j)=>(j=Promise.resolve(h={hello:\\"world\\"}),Object.seal(h),j))()"`; -exports[`sealed object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[j=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[j]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}),Object.seal(h),k))()"`; +exports[`sealed object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[j=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[j]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}),Object.seal(h),k))()"`; exports[`sealed object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.seal(h),h))()"`; diff --git a/packages/seroval/test/__snapshots__/set.test.ts.snap b/packages/seroval/test/__snapshots__/set.test.ts.snap index 8825927d..11ec6488 100644 --- a/packages/seroval/test/__snapshots__/set.test.ts.snap +++ b/packages/seroval/test/__snapshots__/set.test.ts.snap @@ -1,6 +1,6 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Set > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d)=>(i=0,{[h]:()=>this,next:()=>{c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; +exports[`Set > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; exports[`Set > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; From 2f7619b8804d11a8f5df9691d066882478657d39 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 16 Nov 2023 12:58:47 +0800 Subject: [PATCH 25/82] Fix tests and AsyncIterable deserialization --- docs/compatibility.md | 3 +- packages/seroval/src/core/base/async.ts | 2 +- .../__snapshots__/async-iterable.test.ts.snap | 43 +++++ .../__snapshots__/frozen-object.test.ts.snap | 32 ++++ .../test/__snapshots__/iterable.test.ts.snap | 12 +- .../null-constructor.test.ts.snap | 32 ++++ .../test/__snapshots__/object.test.ts.snap | 32 ++++ .../__snapshots__/sealed-object.test.ts.snap | 32 ++++ packages/seroval/test/async-iterable.test.ts | 159 ++++++++++++++++++ packages/seroval/test/frozen-object.test.ts | 105 ++++++++++++ packages/seroval/test/iterable.test.ts | 34 +--- .../seroval/test/null-constructor.test.ts | 103 ++++++++++++ packages/seroval/test/object.test.ts | 103 ++++++++++++ packages/seroval/test/sealed-object.test.ts | 105 ++++++++++++ 14 files changed, 758 insertions(+), 39 deletions(-) create mode 100644 packages/seroval/test/__snapshots__/async-iterable.test.ts.snap create mode 100644 packages/seroval/test/async-iterable.test.ts diff --git a/docs/compatibility.md b/docs/compatibility.md index 02a4ab9c..6f9083d4 100644 --- a/docs/compatibility.md +++ b/docs/compatibility.md @@ -48,7 +48,8 @@ By default, all feature flags are enabled. The following are the feature flags a - Compiles down to `Error` instead. - [`ArrowFunction`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions) - Uses function expressions for top-level and for deferred `Promise` values - - method shorthands (if `MethodShortand` is not set) or function expressions for `Iterable`. + - Uses function expressions for `Iterable` + - Uses function expressions for `AsyncIterable` - [`BigInt`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt) - Disables serialization of `BigInt`, `BigInt64Array` and `BigUint64Array` - [`ErrorPrototypeStack`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error/stack) diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index 5b4bc9f5..15f5e8ba 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -132,7 +132,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { if (Symbol.asyncIterator in properties) { keyNodes.push(SerovalObjectRecordSpecialKey.SymbolAsyncIterator); valueNodes.push( - await this.parse(asyncIteratorToSequence(properties as AsyncIterable)), + await this.parse(await asyncIteratorToSequence(properties as AsyncIterable)), ); } } diff --git a/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap b/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap new file mode 100644 index 00000000..9c4179eb --- /dev/null +++ b/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap @@ -0,0 +1,43 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`AsyncIterable > compat > should use function expressions instead of arrow functions. 1`] = `"(function(h,j){return(j={[h=Symbol.asyncIterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:async function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; + +exports[`AsyncIterable > compat#toJSONAsync > should use function expression instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[0,3]}"`; + +exports[`AsyncIterable > compat#toJSONAsync > should use function expression instead of arrow functions. 2`] = `"(function(h,j){return(j={[h=Symbol.asyncIterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:async function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; + +exports[`AsyncIterable > crossSerializeAsync > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.asyncIterator]:($R[5]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[4]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; + +exports[`AsyncIterable > crossSerializeAsync > supports AsyncIterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.asyncIterator]:($R[5]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[4]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; + +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; + +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 2`] = `"($R=>_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[2]=_$.S())}))($R[\\"example\\"])"`; + +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 3`] = `"($R=>_$.Se($R[2],$R[5]=[0,1]))($R[\\"example\\"])"`; + +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 4`] = `"($R=>_$.Se($R[2],$R[6]=[0,2]))($R[\\"example\\"])"`; + +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 5`] = `"($R=>_$.Se($R[2],$R[7]=[0,3]))($R[\\"example\\"])"`; + +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 6`] = `"($R=>_$.Se($R[2],$R[8]=[2,void 0]))($R[\\"example\\"])"`; + +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 7`] = `"($R=>_$.Sc($R[2]))($R[\\"example\\"])"`; + +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 1`] = `"$R[0]=_$.P()"`; + +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[2]=_$.S())})"`; + +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 3`] = `"_$.Se($R[2],$R[5]=[0,1])"`; + +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 4`] = `"_$.Se($R[2],$R[6]=[0,2])"`; + +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 5`] = `"_$.Se($R[2],$R[7]=[0,3])"`; + +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 6`] = `"_$.Se($R[2],$R[8]=[2,void 0])"`; + +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 7`] = `"_$.Sc($R[2])"`; + +exports[`AsyncIterable > serializeAsync > supports AsyncIterables 1`] = `"(h=>({title:\\"Hello World\\",[h=Symbol.asyncIterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:async ()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; + +exports[`AsyncIterable > toJSONAsync > supports AsyncIterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",1],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; diff --git a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap index d5d46ad2..f962a274 100644 --- a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap @@ -14,12 +14,16 @@ exports[`frozen object > crossSerialize > supports self-recursion 1`] = `"($R[0] exports[`frozen object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; + exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; + exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; exports[`frozen object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])"`; @@ -28,6 +32,18 @@ exports[`frozen object > crossSerializeStream > scoped > supports Objects 1`] = exports[`frozen object > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; + +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[1],$R[4]=[0,1]))($R[\\"example\\"])"`; + +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 3`] = `"($R=>_$.Se($R[1],$R[5]=[0,2]))($R[\\"example\\"])"`; + +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 4`] = `"($R=>_$.Se($R[1],$R[6]=[0,3]))($R[\\"example\\"])"`; + +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 5`] = `"($R=>_$.Se($R[1],$R[7]=[2,void 0]))($R[\\"example\\"])"`; + +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 6`] = `"($R=>_$.Sc($R[1]))($R[\\"example\\"])"`; + exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; @@ -44,6 +60,18 @@ exports[`frozen object > crossSerializeStream > supports Objects 1`] = `"$R[0]=_ exports[`frozen object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())},Object.freeze($R[0]),$R[0])"`; + +exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[1],$R[4]=[0,1])"`; + +exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 3`] = `"_$.Se($R[1],$R[5]=[0,2])"`; + +exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 4`] = `"_$.Se($R[1],$R[6]=[0,3])"`; + +exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 5`] = `"_$.Se($R[1],$R[7]=[2,void 0])"`; + +exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 6`] = `"_$.Sc($R[1])"`; + exports[`frozen object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; @@ -64,6 +92,8 @@ exports[`frozen object > serialize > supports self-recursion 1`] = `"(h=>(h={},h exports[`frozen object > serializeAsync > supports Objects 1`] = `"((h,j)=>(j=Promise.resolve(h={hello:\\"world\\"}),Object.freeze(h),j))()"`; +exports[`frozen object > serializeAsync > supports Symbol.asyncIterator 1`] = `"((h,j)=>(h={[j=Symbol.asyncIterator]:(s=>((i,c,d,t)=>(i=0,t={[j]:()=>t,next:async ()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.freeze(h),h))()"`; + exports[`frozen object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[j=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[j]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}),Object.freeze(h),k))()"`; exports[`frozen object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.freeze(h),h))()"`; @@ -76,6 +106,8 @@ exports[`frozen object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t exports[`frozen object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`frozen object > toJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; + exports[`frozen object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}},\\"f\\":16383,\\"m\\":[4]}"`; exports[`frozen object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":3,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/iterable.test.ts.snap b/packages/seroval/test/__snapshots__/iterable.test.ts.snap index 909857b8..978ccb25 100644 --- a/packages/seroval/test/__snapshots__/iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/iterable.test.ts.snap @@ -1,16 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Iterable > compat > should use functions instead of method shorthand. 1`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; +exports[`Iterable > compat > should use function expression instead of arrow functions. 1`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; -exports[`Iterable > compat > should use method shorthand instead of arrow functions. 1`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; +exports[`Iterable > compat#toJSON > should use function expression instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[0,3]}"`; -exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[0,3]}"`; - -exports[`Iterable > compat#toJSON > should use functions instead of method shorthand. 2`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; - -exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[0,3]}"`; - -exports[`Iterable > compat#toJSON > should use method shorthand instead of arrow functions. 2`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; +exports[`Iterable > compat#toJSON > should use function expression instead of arrow functions. 2`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; diff --git a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap index 25864bec..ced42dae 100644 --- a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap +++ b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap @@ -20,12 +20,16 @@ exports[`null-constructor > crossSerialize > supports self-recursion 1`] = `"($R exports[`null-constructor > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; + exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; +exports[`null-constructor > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; + exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; exports[`null-constructor > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})"`; @@ -34,6 +38,18 @@ exports[`null-constructor > crossSerializeStream > scoped > supports Objects 1`] exports[`null-constructor > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())}))($R[\\"example\\"])"`; + +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[1],$R[4]=[0,1]))($R[\\"example\\"])"`; + +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 3`] = `"($R=>_$.Se($R[1],$R[5]=[0,2]))($R[\\"example\\"])"`; + +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 4`] = `"($R=>_$.Se($R[1],$R[6]=[0,3]))($R[\\"example\\"])"`; + +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 5`] = `"($R=>_$.Se($R[1],$R[7]=[2,void 0]))($R[\\"example\\"])"`; + +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 6`] = `"($R=>_$.Sc($R[1]))($R[\\"example\\"])"`; + exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; @@ -50,6 +66,18 @@ exports[`null-constructor > crossSerializeStream > supports Objects 1`] = `"$R[0 exports[`null-constructor > crossSerializeStream > supports Objects 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())})"`; + +exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[1],$R[4]=[0,1])"`; + +exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 3`] = `"_$.Se($R[1],$R[5]=[0,2])"`; + +exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 4`] = `"_$.Se($R[1],$R[6]=[0,3])"`; + +exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 5`] = `"_$.Se($R[1],$R[7]=[2,void 0])"`; + +exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 6`] = `"_$.Sc($R[1])"`; + exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; @@ -70,6 +98,8 @@ exports[`null-constructor > serialize > supports self-recursion 1`] = `"(h=>(h=O exports[`null-constructor > serializeAsync > supports Object.create(null) 1`] = `"Promise.resolve(Object.assign(Object.create(null),{hello:\\"world\\"}))"`; +exports[`null-constructor > serializeAsync > supports Symbol.asyncIterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.asyncIterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:async ()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; + exports[`null-constructor > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))))()"`; exports[`null-constructor > serializeAsync > supports self-recursion 1`] = `"(h=>(h=Object.assign(Object.create(null),{a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)})))()"`; @@ -82,6 +112,8 @@ exports[`null-constructor > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\ exports[`null-constructor > toJSONAsync > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`null-constructor > toJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; + exports[`null-constructor > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}},\\"f\\":16383,\\"m\\":[4]}"`; exports[`null-constructor > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/object.test.ts.snap b/packages/seroval/test/__snapshots__/object.test.ts.snap index 0b311786..1b397d9c 100644 --- a/packages/seroval/test/__snapshots__/object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/object.test.ts.snap @@ -20,12 +20,16 @@ exports[`objects > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R exports[`objects > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; + exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]={hello:\\"world\\"})"`; +exports[`objects > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; + exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`objects > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}"`; @@ -34,6 +38,18 @@ exports[`objects > crossSerializeStream > scoped > supports Objects 1`] = `"($R= exports[`objects > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]={hello:\\"world\\"}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())})($R[\\"example\\"])"`; + +exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[1],$R[4]=[0,1]))($R[\\"example\\"])"`; + +exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 3`] = `"($R=>_$.Se($R[1],$R[5]=[0,2]))($R[\\"example\\"])"`; + +exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 4`] = `"($R=>_$.Se($R[1],$R[6]=[0,3]))($R[\\"example\\"])"`; + +exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 5`] = `"($R=>_$.Se($R[1],$R[7]=[2,void 0]))($R[\\"example\\"])"`; + +exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 6`] = `"($R=>_$.Sc($R[1]))($R[\\"example\\"])"`; + exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; @@ -50,6 +66,18 @@ exports[`objects > crossSerializeStream > supports Objects 1`] = `"$R[0]=_$.P()" exports[`objects > crossSerializeStream > supports Objects 2`] = `"_$.Ps($R[0],$R[1]={hello:\\"world\\"})"`; +exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())}"`; + +exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[1],$R[4]=[0,1])"`; + +exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 3`] = `"_$.Se($R[1],$R[5]=[0,2])"`; + +exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 4`] = `"_$.Se($R[1],$R[6]=[0,3])"`; + +exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 5`] = `"_$.Se($R[1],$R[7]=[2,void 0])"`; + +exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 6`] = `"_$.Sc($R[1])"`; + exports[`objects > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; @@ -70,6 +98,8 @@ exports[`objects > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a exports[`objects > serializeAsync > supports Objects 1`] = `"Promise.resolve({hello:\\"world\\"})"`; +exports[`objects > serializeAsync > supports Symbol.asyncIterator 1`] = `"(h=>({[h=Symbol.asyncIterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:async ()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; + exports[`objects > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve({[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; exports[`objects > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)}))()"`; @@ -82,6 +112,8 @@ exports[`objects > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10 exports[`objects > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`objects > toJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; + exports[`objects > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}},\\"f\\":16383,\\"m\\":[4]}"`; exports[`objects > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap index 0e0a92c3..fd26545e 100644 --- a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap @@ -14,12 +14,16 @@ exports[`sealed object > crossSerialize > supports self-recursion 1`] = `"($R[0] exports[`sealed object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; + exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; + exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; exports[`sealed object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])"`; @@ -28,6 +32,18 @@ exports[`sealed object > crossSerializeStream > scoped > supports Objects 1`] = exports[`sealed object > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; + +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[1],$R[4]=[0,1]))($R[\\"example\\"])"`; + +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 3`] = `"($R=>_$.Se($R[1],$R[5]=[0,2]))($R[\\"example\\"])"`; + +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 4`] = `"($R=>_$.Se($R[1],$R[6]=[0,3]))($R[\\"example\\"])"`; + +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 5`] = `"($R=>_$.Se($R[1],$R[7]=[2,void 0]))($R[\\"example\\"])"`; + +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 6`] = `"($R=>_$.Sc($R[1]))($R[\\"example\\"])"`; + exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; @@ -44,6 +60,18 @@ exports[`sealed object > crossSerializeStream > supports Objects 1`] = `"$R[0]=_ exports[`sealed object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())},Object.seal($R[0]),$R[0])"`; + +exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[1],$R[4]=[0,1])"`; + +exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 3`] = `"_$.Se($R[1],$R[5]=[0,2])"`; + +exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 4`] = `"_$.Se($R[1],$R[6]=[0,3])"`; + +exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 5`] = `"_$.Se($R[1],$R[7]=[2,void 0])"`; + +exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 6`] = `"_$.Sc($R[1])"`; + exports[`sealed object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; @@ -64,6 +92,8 @@ exports[`sealed object > serialize > supports self-recursion 1`] = `"(h=>(h={},h exports[`sealed object > serializeAsync > supports Objects 1`] = `"((h,j)=>(j=Promise.resolve(h={hello:\\"world\\"}),Object.seal(h),j))()"`; +exports[`sealed object > serializeAsync > supports Symbol.asyncIterator 1`] = `"((h,j)=>(h={[j=Symbol.asyncIterator]:(s=>((i,c,d,t)=>(i=0,t={[j]:()=>t,next:async ()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.seal(h),h))()"`; + exports[`sealed object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[j=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[j]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}),Object.seal(h),k))()"`; exports[`sealed object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.seal(h),h))()"`; @@ -76,6 +106,8 @@ exports[`sealed object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t exports[`sealed object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`sealed object > toJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; + exports[`sealed object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}},\\"f\\":16383,\\"m\\":[4]}"`; exports[`sealed object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":2,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/async-iterable.test.ts b/packages/seroval/test/async-iterable.test.ts new file mode 100644 index 00000000..4c58b604 --- /dev/null +++ b/packages/seroval/test/async-iterable.test.ts @@ -0,0 +1,159 @@ +import { describe, it, expect } from 'vitest'; +import { + compileJSON, + crossSerializeAsync, + crossSerializeStream, + deserialize, + Feature, + fromJSON, + serializeAsync, + toJSONAsync, +} from '../src'; + +describe('AsyncIterable', () => { + describe('serializeAsync', () => { + it('supports AsyncIterables', async () => { + const example = { + title: 'Hello World', + async* [Symbol.asyncIterator](): AsyncIterator { + await Promise.resolve(); + yield 1; + yield 2; + yield 3; + }, + }; + const result = await serializeAsync(example); + expect(result).toMatchSnapshot(); + const back = deserialize(result); + expect(back.title).toBe(example.title); + expect(Symbol.asyncIterator in back).toBe(true); + const iterator = back[Symbol.asyncIterator](); + expect((await iterator.next()).value).toBe(1); + expect((await iterator.next()).value).toBe(2); + expect((await iterator.next()).value).toBe(3); + }); + }); + describe('toJSONAsync', () => { + it('supports AsyncIterables', async () => { + const example = { + title: 'Hello World', + async* [Symbol.asyncIterator](): AsyncIterator { + await Promise.resolve(); + yield 1; + yield 2; + yield 3; + }, + }; + const result = await toJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromJSON(result); + expect(back.title).toBe(example.title); + expect(Symbol.asyncIterator in back).toBe(true); + const iterator = back[Symbol.asyncIterator](); + expect((await iterator.next()).value).toBe(1); + expect((await iterator.next()).value).toBe(2); + expect((await iterator.next()).value).toBe(3); + }); + }); + describe('crossSerializeAsync', () => { + it('supports AsyncIterables', async () => { + const example = Promise.resolve({ + title: 'Hello World', + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + yield 2; + yield 3; + }, + }); + const result = await crossSerializeAsync(example); + expect(result).toMatchSnapshot(); + }); + describe('scoped', () => { + it('supports AsyncIterables', async () => { + const example = Promise.resolve({ + title: 'Hello World', + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + yield 2; + yield 3; + }, + }); + const result = await crossSerializeAsync(example, { scopeId: 'example' }); + expect(result).toMatchSnapshot(); + }); + }); + }); + describe('crossSerializeStream', () => { + it('supports AsyncIterables', async () => new Promise((done) => { + const example = Promise.resolve({ + title: 'Hello World', + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + yield 2; + yield 3; + }, + }); + crossSerializeStream(example, { + onSerialize(data) { + expect(data).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + describe('scoped', () => { + it('supports AsyncIterables', async () => new Promise((done) => { + const example = Promise.resolve({ + title: 'Hello World', + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + yield 2; + yield 3; + }, + }); + crossSerializeStream(example, { + scopeId: 'example', + onSerialize(data) { + expect(data).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); + }); + describe('compat', () => { + it('should use function expressions instead of arrow functions.', async () => { + const example = { + async* [Symbol.asyncIterator](): unknown { + await Promise.resolve(); + yield example; + }, + }; + expect(await serializeAsync(example, { + disabledFeatures: Feature.ArrowFunction, + })).toMatchSnapshot(); + }); + }); + describe('compat#toJSONAsync', () => { + it('should use function expression instead of arrow functions.', async () => { + const example = { + async* [Symbol.asyncIterator](): unknown { + await Promise.resolve(); + yield example; + }, + }; + const result = await toJSONAsync(example, { + disabledFeatures: Feature.ArrowFunction, + }); + expect(JSON.stringify(result)).toMatchSnapshot(); + expect(compileJSON(result)).toMatchSnapshot(); + }); + }); +}); diff --git a/packages/seroval/test/frozen-object.test.ts b/packages/seroval/test/frozen-object.test.ts index fff2c3d8..b0ad1fdc 100644 --- a/packages/seroval/test/frozen-object.test.ts +++ b/packages/seroval/test/frozen-object.test.ts @@ -89,6 +89,24 @@ describe('frozen object', () => { expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); }); + it('supports Symbol.asyncIterator', async () => { + const example = Object.freeze({ + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable); + const result = await serializeAsync(example); + expect(result).toMatchSnapshot(); + const back = deserialize>(result); + expect(Object.isFrozen(back)).toBe(true); + expect(back.constructor).toBe(Object); + expect(Symbol.asyncIterator in back).toBe(true); + }); }); describe('toJSON', () => { it('supports Objects', () => { @@ -166,6 +184,24 @@ describe('frozen object', () => { expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); }); + it('supports Symbol.asyncIterator', async () => { + const example = Object.freeze({ + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable); + const result = await toJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromJSON>(result); + expect(Object.isFrozen(back)).toBe(true); + expect(back.constructor).toBe(Object); + expect(Symbol.asyncIterator in back).toBe(true); + }); }); describe('crossSerialize', () => { it('supports Objects', () => { @@ -248,6 +284,20 @@ describe('frozen object', () => { const result = await crossSerializeAsync(example); expect(result).toMatchSnapshot(); }); + it('supports Symbol.asyncIterator', async () => { + const example = Object.freeze({ + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable); + const result = await crossSerializeAsync(example); + expect(result).toMatchSnapshot(); + }); describe('scoped', () => { it('supports Objects', async () => { const example = Promise.resolve(Object.freeze({ hello: 'world' }) as { hello: string }); @@ -273,6 +323,20 @@ describe('frozen object', () => { const result = await crossSerializeAsync(example, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); + it('supports Symbol.asyncIterator', async () => { + const example = Object.freeze({ + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable); + const result = await crossSerializeAsync(example, { scopeId: 'example' }); + expect(result).toMatchSnapshot(); + }); }); }); describe('crossSerializeStream', () => { @@ -318,6 +382,26 @@ describe('frozen object', () => { }, }); })); + it('supports Symbol.asyncIterator', async () => new Promise((done) => { + const example = Object.freeze({ + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable); + crossSerializeStream(example, { + onSerialize(data) { + expect(data).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); describe('scoped', () => { it('supports Objects', async () => new Promise((done) => { const example = Promise.resolve(Object.freeze({ hello: 'world' }) as { hello: string }); @@ -364,6 +448,27 @@ describe('frozen object', () => { }, }); })); + it('supports Symbol.asyncIterator', async () => new Promise((done) => { + const example = Object.freeze({ + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable); + crossSerializeStream(example, { + scopeId: 'example', + onSerialize(data) { + expect(data).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); }); }); }); diff --git a/packages/seroval/test/iterable.test.ts b/packages/seroval/test/iterable.test.ts index 596e5f00..c284d9ad 100644 --- a/packages/seroval/test/iterable.test.ts +++ b/packages/seroval/test/iterable.test.ts @@ -28,7 +28,7 @@ describe('Iterable', () => { expect(result).toMatchSnapshot(); const back = deserialize & { title: string }>(result); expect(back.title).toBe(example.title); - expect(Symbol.iterator in back).toBeTruthy(); + expect(Symbol.iterator in back).toBe(true); const iterator = back[Symbol.iterator](); expect(iterator.next().value).toBe(1); expect(iterator.next().value).toBe(2); @@ -49,7 +49,7 @@ describe('Iterable', () => { expect(result).toMatchSnapshot(); const back = await deserialize(result); expect(back.title).toBe((await example).title); - expect(Symbol.iterator in back).toBeTruthy(); + expect(Symbol.iterator in back).toBe(true); const iterator = back[Symbol.iterator](); expect(iterator.next().value).toBe(1); expect(iterator.next().value).toBe(2); @@ -70,7 +70,7 @@ describe('Iterable', () => { expect(JSON.stringify(result)).toMatchSnapshot(); const back = fromJSON & { title: string }>(result); expect(back.title).toBe(example.title); - expect(Symbol.iterator in back).toBeTruthy(); + expect(Symbol.iterator in back).toBe(true); const iterator = back[Symbol.iterator](); expect(iterator.next().value).toBe(1); expect(iterator.next().value).toBe(2); @@ -91,7 +91,7 @@ describe('Iterable', () => { expect(JSON.stringify(result)).toMatchSnapshot(); const back = await fromJSON(result); expect(back.title).toBe((await example).title); - expect(Symbol.iterator in back).toBeTruthy(); + expect(Symbol.iterator in back).toBe(true); const iterator = back[Symbol.iterator](); expect(iterator.next().value).toBe(1); expect(iterator.next().value).toBe(2); @@ -196,17 +196,7 @@ describe('Iterable', () => { }); }); describe('compat', () => { - it('should use method shorthand instead of arrow functions.', () => { - const example = { - * [Symbol.iterator](): unknown { - yield example; - }, - }; - expect(serialize(example, { - disabledFeatures: Feature.ArrowFunction, - })).toMatchSnapshot(); - }); - it('should use functions instead of method shorthand.', () => { + it('should use function expression instead of arrow functions.', () => { const example = { * [Symbol.iterator](): unknown { yield example; @@ -218,19 +208,7 @@ describe('Iterable', () => { }); }); describe('compat#toJSON', () => { - it('should use method shorthand instead of arrow functions.', () => { - const example = { - * [Symbol.iterator](): unknown { - yield example; - }, - }; - const result = toJSON(example, { - disabledFeatures: Feature.ArrowFunction, - }); - expect(JSON.stringify(result)).toMatchSnapshot(); - expect(compileJSON(result)).toMatchSnapshot(); - }); - it('should use functions instead of method shorthand.', () => { + it('should use function expression instead of arrow functions.', () => { const example = { * [Symbol.iterator](): unknown { yield example; diff --git a/packages/seroval/test/null-constructor.test.ts b/packages/seroval/test/null-constructor.test.ts index 8a51aa98..6618b94a 100644 --- a/packages/seroval/test/null-constructor.test.ts +++ b/packages/seroval/test/null-constructor.test.ts @@ -81,6 +81,23 @@ describe('null-constructor', () => { expect(back.constructor).toBeUndefined(); expect([...back]).toMatchObject([1, 2, 3]); }); + it('supports Symbol.asyncIterator', async () => { + const example = Object.assign(Object.create(null), { + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + }) as AsyncIterable; + const result = await serializeAsync(example); + expect(result).toMatchSnapshot(); + const back = deserialize>(result); + expect(back.constructor).toBeUndefined(); + expect(Symbol.asyncIterator in back).toBe(true); + }); }); describe('toJSON', () => { it('supports Object.create(null)', () => { @@ -149,6 +166,23 @@ describe('null-constructor', () => { expect(back.constructor).toBeUndefined(); expect([...back]).toMatchObject([1, 2, 3]); }); + it('supports Symbol.asyncIterator', async () => { + const example = Object.assign(Object.create(null), { + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + }) as AsyncIterable; + const result = await toJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromJSON>(result); + expect(back.constructor).toBeUndefined(); + expect(Symbol.asyncIterator in back).toBe(true); + }); }); describe('crossSerialize', () => { it('supports Objects', () => { @@ -224,6 +258,20 @@ describe('null-constructor', () => { const result = await crossSerializeAsync(example); expect(result).toMatchSnapshot(); }); + it('supports Symbol.asyncIterator', async () => { + const example = Object.assign(Object.create(null), { + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + }) as AsyncIterable; + const result = await crossSerializeAsync(example); + expect(result).toMatchSnapshot(); + }); describe('scoped', () => { it('supports Objects', async () => { const example = Promise.resolve(Object.assign(Object.create(null), { hello: 'world' }) as { hello: string }); @@ -248,6 +296,20 @@ describe('null-constructor', () => { const result = await crossSerializeAsync(example, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); + it('supports Symbol.asyncIterator', async () => { + const example = Object.assign(Object.create(null), { + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + }) as AsyncIterable; + const result = await crossSerializeAsync(example, { scopeId: 'example' }); + expect(result).toMatchSnapshot(); + }); }); }); describe('crossSerializeStream', () => { @@ -292,6 +354,26 @@ describe('null-constructor', () => { }, }); })); + it('supports Symbol.asyncIterator', async () => new Promise((done) => { + const example = Object.assign(Object.create(null), { + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + }) as AsyncIterable; + crossSerializeStream(example, { + onSerialize(data) { + expect(data).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); describe('scoped', () => { it('supports Objects', async () => new Promise((done) => { const example = Promise.resolve(Object.assign(Object.create(null), { hello: 'world' }) as { hello: string }); @@ -337,6 +419,27 @@ describe('null-constructor', () => { }, }); })); + it('supports Symbol.asyncIterator', async () => new Promise((done) => { + const example = Object.assign(Object.create(null), { + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + }) as AsyncIterable; + crossSerializeStream(example, { + scopeId: 'example', + onSerialize(data) { + expect(data).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); }); }); describe('compat', () => { diff --git a/packages/seroval/test/object.test.ts b/packages/seroval/test/object.test.ts index a7bdf674..e57c95c0 100644 --- a/packages/seroval/test/object.test.ts +++ b/packages/seroval/test/object.test.ts @@ -81,6 +81,23 @@ describe('objects', () => { expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); }); + it('supports Symbol.asyncIterator', async () => { + const example = { + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable; + const result = await serializeAsync(example); + expect(result).toMatchSnapshot(); + const back = deserialize>(result); + expect(back.constructor).toBe(Object); + expect(Symbol.asyncIterator in back).toBe(true); + }); }); describe('toJSON', () => { it('supports Objects', () => { @@ -149,6 +166,23 @@ describe('objects', () => { expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); }); + it('supports Symbol.asyncIterator', async () => { + const example = { + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable; + const result = await toJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromJSON>(result); + expect(back.constructor).toBe(Object); + expect(Symbol.asyncIterator in back).toBe(true); + }); }); describe('crossSerialize', () => { it('supports Objects', () => { @@ -224,6 +258,20 @@ describe('objects', () => { const result = await crossSerializeAsync(example); expect(result).toMatchSnapshot(); }); + it('supports Symbol.asyncIterator', async () => { + const example = { + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable; + const result = await crossSerializeAsync(example); + expect(result).toMatchSnapshot(); + }); describe('scoped', () => { it('supports Objects', async () => { const example = Promise.resolve({ hello: 'world' } as { hello: string }); @@ -248,6 +296,20 @@ describe('objects', () => { const result = await crossSerializeAsync(example, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); + it('supports Symbol.asyncIterator', async () => { + const example = { + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable; + const result = await crossSerializeAsync(example, { scopeId: 'example' }); + expect(result).toMatchSnapshot(); + }); }); }); describe('crossSerializeStream', () => { @@ -292,6 +354,26 @@ describe('objects', () => { }, }); })); + it('supports Symbol.asyncIterator', async () => new Promise((done) => { + const example = { + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable; + crossSerializeStream(example, { + onSerialize(data) { + expect(data).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); describe('scoped', () => { it('supports Objects', async () => new Promise((done) => { const example = Promise.resolve({ hello: 'world' } as { hello: string }); @@ -337,6 +419,27 @@ describe('objects', () => { }, }); })); + it('supports Symbol.asyncIterator', async () => new Promise((done) => { + const example = { + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable; + crossSerializeStream(example, { + scopeId: 'example', + onSerialize(data) { + expect(data).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); }); }); describe('compat', () => { diff --git a/packages/seroval/test/sealed-object.test.ts b/packages/seroval/test/sealed-object.test.ts index 3f29b9cc..916e8300 100644 --- a/packages/seroval/test/sealed-object.test.ts +++ b/packages/seroval/test/sealed-object.test.ts @@ -89,6 +89,24 @@ describe('sealed object', () => { expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); }); + it('supports Symbol.asyncIterator', async () => { + const example = Object.seal({ + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable); + const result = await serializeAsync(example); + expect(result).toMatchSnapshot(); + const back = deserialize>(result); + expect(Object.isSealed(back)).toBe(true); + expect(back.constructor).toBe(Object); + expect(Symbol.asyncIterator in back).toBe(true); + }); }); describe('toJSON', () => { it('supports Objects', () => { @@ -166,6 +184,24 @@ describe('sealed object', () => { expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); }); + it('supports Symbol.asyncIterator', async () => { + const example = Object.seal({ + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable); + const result = await toJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromJSON>(result); + expect(Object.isSealed(back)).toBe(true); + expect(back.constructor).toBe(Object); + expect(Symbol.asyncIterator in back).toBe(true); + }); }); describe('crossSerialize', () => { it('supports Objects', () => { @@ -248,6 +284,20 @@ describe('sealed object', () => { const result = await crossSerializeAsync(example); expect(result).toMatchSnapshot(); }); + it('supports Symbol.asyncIterator', async () => { + const example = Object.seal({ + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable); + const result = await crossSerializeAsync(example); + expect(result).toMatchSnapshot(); + }); describe('scoped', () => { it('supports Objects', async () => { const example = Promise.resolve(Object.seal({ hello: 'world' }) as { hello: string }); @@ -273,6 +323,20 @@ describe('sealed object', () => { const result = await crossSerializeAsync(example, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); + it('supports Symbol.asyncIterator', async () => { + const example = Object.seal({ + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable); + const result = await crossSerializeAsync(example, { scopeId: 'example' }); + expect(result).toMatchSnapshot(); + }); }); }); describe('crossSerializeStream', () => { @@ -318,6 +382,26 @@ describe('sealed object', () => { }, }); })); + it('supports Symbol.asyncIterator', async () => new Promise((done) => { + const example = Object.seal({ + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable); + crossSerializeStream(example, { + onSerialize(data) { + expect(data).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); describe('scoped', () => { it('supports Objects', async () => new Promise((done) => { const example = Promise.resolve(Object.seal({ hello: 'world' }) as { hello: string }); @@ -364,6 +448,27 @@ describe('sealed object', () => { }, }); })); + it('supports Symbol.asyncIterator', async () => new Promise((done) => { + const example = Object.seal({ + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + await Promise.resolve(); + yield 2; + await Promise.resolve(); + yield 3; + }, + } as AsyncIterable); + crossSerializeStream(example, { + scopeId: 'example', + onSerialize(data) { + expect(data).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); }); }); }); From d11a178180d45095779bd31d181943a37436d4d0 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 16 Nov 2023 16:02:12 +0800 Subject: [PATCH 26/82] Remove unused file --- packages/seroval/src/core/tree/parser.ts | 45 ------------------------ 1 file changed, 45 deletions(-) delete mode 100644 packages/seroval/src/core/tree/parser.ts diff --git a/packages/seroval/src/core/tree/parser.ts b/packages/seroval/src/core/tree/parser.ts deleted file mode 100644 index 97e037be..00000000 --- a/packages/seroval/src/core/tree/parser.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { createIndexedValueNode, createReferenceNode } from '../base-primitives'; -import { hasReferenceID } from '../reference'; -import type { SerovalIndexedValueNode, SerovalReferenceNode } from '../types'; - -function createIndexedValue( - ids: Map, - marked: Set, - current: T, -): number { - const ref = ids.get(current); - if (ref == null) { - const id = ids.size; - ids.set(current, id); - return id; - } - marked.add(ref); - return ref; -} - -export function getVanillaReference( - ids: Map, - marked: Set, - current: T, -): number | SerovalIndexedValueNode | SerovalReferenceNode { - const id = createIndexedValue(ids, marked, current); - if (marked.has(id)) { - return createIndexedValueNode(id); - } - if (hasReferenceID(current)) { - return createReferenceNode(id, current); - } - return id; -} - -export function getStrictVanillaReference( - ids: Map, - marked: Set, - current: T, -): SerovalIndexedValueNode | SerovalReferenceNode { - const id = createIndexedValue(ids, marked, current); - if (marked.has(id)) { - return createIndexedValueNode(id); - } - return createReferenceNode(id, current); -} From 20cd59c970f3a54c14daca127797a00fb0c45b75 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 16 Nov 2023 16:10:17 +0800 Subject: [PATCH 27/82] Move files --- packages/seroval/src/core/base-primitives.ts | 5 +- packages/seroval/src/core/base/async.ts | 10 +-- packages/seroval/src/core/base/stream.ts | 4 +- packages/seroval/src/core/base/sync.ts | 8 +-- packages/seroval/src/core/cross/serialize.ts | 2 +- .../seroval/src/core/is-serializable.new.ts | 2 +- packages/seroval/src/core/parser-context.ts | 4 +- packages/seroval/src/core/reference.ts | 2 +- .../seroval/src/core/serializer-context.ts | 4 +- packages/seroval/src/core/tree/deserialize.ts | 6 +- packages/seroval/src/core/tree/serialize.ts | 4 +- .../seroval/src/core/{ => utils}/assert.ts | 0 .../src/core/{ => utils}/constructors.ts | 0 .../src/core/{shared.ts => utils/error.ts} | 63 +------------------ .../src/core/{ => utils}/function-string.ts | 2 +- .../src/core/{ => utils}/get-identifier.ts | 0 .../seroval/src/core/utils/get-object-flag.ts | 14 +++++ .../src/core/utils/is-valid-identifier.ts | 11 ++++ .../core/{ => utils}/iterator-to-sequence.ts | 0 .../src/core/{ => utils}/promise-to-result.ts | 0 .../seroval/src/core/utils/typed-array.ts | 30 +++++++++ 21 files changed, 85 insertions(+), 86 deletions(-) rename packages/seroval/src/core/{ => utils}/assert.ts (100%) rename packages/seroval/src/core/{ => utils}/constructors.ts (100%) rename packages/seroval/src/core/{shared.ts => utils/error.ts} (50%) rename packages/seroval/src/core/{ => utils}/function-string.ts (95%) rename packages/seroval/src/core/{ => utils}/get-identifier.ts (100%) create mode 100644 packages/seroval/src/core/utils/get-object-flag.ts create mode 100644 packages/seroval/src/core/utils/is-valid-identifier.ts rename packages/seroval/src/core/{ => utils}/iterator-to-sequence.ts (100%) rename packages/seroval/src/core/{ => utils}/promise-to-result.ts (100%) create mode 100644 packages/seroval/src/core/utils/typed-array.ts diff --git a/packages/seroval/src/core/base-primitives.ts b/packages/seroval/src/core/base-primitives.ts index 060e7de4..61f5dfdd 100644 --- a/packages/seroval/src/core/base-primitives.ts +++ b/packages/seroval/src/core/base-primitives.ts @@ -1,5 +1,5 @@ import type { BigIntTypedArrayValue, TypedArrayValue } from '../types'; -import assert from './assert'; +import assert from './utils/assert'; import type { WellKnownSymbols } from './constants'; import { INV_SYMBOL_REF, SerovalNodeType } from './constants'; import { @@ -9,7 +9,7 @@ import { NEG_ZERO_NODE, } from './literals'; import { getReferenceID } from './reference'; -import { getErrorConstructor, getObjectFlag } from './shared'; +import { getErrorConstructor } from './utils/error'; import { serializeString } from './string'; import type { SerovalAggregateErrorNode, @@ -34,6 +34,7 @@ import type { SerovalTypedArrayNode, SerovalWKSymbolNode, } from './types'; +import { getObjectFlag } from './utils/get-object-flag'; export function createNumberNode(value: number): SerovalConstantNode | SerovalNumberNode { switch (value) { diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base/async.ts index 15f5e8ba..74eeef34 100644 --- a/packages/seroval/src/core/base/async.ts +++ b/packages/seroval/src/core/base/async.ts @@ -2,7 +2,7 @@ /* eslint-disable no-await-in-loop */ import type { BigIntTypedArrayValue, TypedArrayValue } from '../../types'; import UnsupportedTypeError from '../UnsupportedTypeError'; -import assert from '../assert'; +import assert from '../utils/assert'; import { createPluginNode, createDateNode, @@ -30,17 +30,17 @@ import { createResponseOptions, createEventOptions, createCustomEventOptions, -} from '../constructors'; +} from '../utils/constructors'; import { NULL_NODE, TRUE_NODE, FALSE_NODE, UNDEFINED_NODE, } from '../literals'; -import { asyncIteratorToSequence, iteratorToSequence } from '../iterator-to-sequence'; +import { asyncIteratorToSequence, iteratorToSequence } from '../utils/iterator-to-sequence'; import { BaseParserContext } from '../parser-context'; -import promiseToResult from '../promise-to-result'; -import { getErrorOptions } from '../shared'; +import promiseToResult from '../utils/promise-to-result'; +import { getErrorOptions } from '../utils/error'; import { serializeString } from '../string'; import { SerovalObjectRecordSpecialKey } from '../types'; import type { diff --git a/packages/seroval/src/core/base/stream.ts b/packages/seroval/src/core/base/stream.ts index dd5fe37a..b1214543 100644 --- a/packages/seroval/src/core/base/stream.ts +++ b/packages/seroval/src/core/base/stream.ts @@ -10,7 +10,7 @@ import type { BaseSyncParserContextOptions } from './sync'; import BaseSyncParserContext from './sync'; import { BIGINT_FLAG, Feature } from '../compat'; import { SerovalNodeType, UNIVERSAL_SENTINEL } from '../constants'; -import { createRequestOptions, createResponseOptions } from '../constructors'; +import { createRequestOptions, createResponseOptions } from '../utils/constructors'; import { NULL_NODE } from '../literals'; import { serializeString } from '../string'; import { @@ -25,7 +25,7 @@ import { type SerovalResponseNode, } from '../types'; import { createDOMExceptionNode, createURLNode, createURLSearchParamsNode } from '../web-api'; -import { asyncIteratorToReadableStream, iteratorToSequence } from '../iterator-to-sequence'; +import { asyncIteratorToReadableStream, iteratorToSequence } from '../utils/iterator-to-sequence'; export interface BaseStreamParserContextOptions extends BaseSyncParserContextOptions { onParse: (node: SerovalNode, initial: boolean) => void; diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base/sync.ts index b95c97fb..826e9209 100644 --- a/packages/seroval/src/core/base/sync.ts +++ b/packages/seroval/src/core/base/sync.ts @@ -1,7 +1,7 @@ /* eslint-disable prefer-destructuring */ import type { BigIntTypedArrayValue, TypedArrayValue } from '../../types'; import UnsupportedTypeError from '../UnsupportedTypeError'; -import assert from '../assert'; +import assert from '../utils/assert'; import { createAggregateErrorNode, createArrayBufferNode, @@ -26,18 +26,18 @@ import { SerovalNodeType, UNIVERSAL_SENTINEL, } from '../constants'; -import { createCustomEventOptions, createEventOptions } from '../constructors'; +import { createCustomEventOptions, createEventOptions } from '../utils/constructors'; import { FALSE_NODE, NULL_NODE, TRUE_NODE, UNDEFINED_NODE, } from '../literals'; -import { iteratorToSequence } from '../iterator-to-sequence'; +import { iteratorToSequence } from '../utils/iterator-to-sequence'; import type { BaseParserContextOptions } from '../parser-context'; import { BaseParserContext } from '../parser-context'; import { hasReferenceID } from '../reference'; -import { getErrorOptions } from '../shared'; +import { getErrorOptions } from '../utils/error'; import { serializeString } from '../string'; import { SerovalObjectRecordSpecialKey } from '../types'; import type { diff --git a/packages/seroval/src/core/cross/serialize.ts b/packages/seroval/src/core/cross/serialize.ts index c13de849..d81ccab9 100644 --- a/packages/seroval/src/core/cross/serialize.ts +++ b/packages/seroval/src/core/cross/serialize.ts @@ -25,7 +25,7 @@ import BaseSerializerContext from '../serializer-context'; import type { SerovalMode } from '../plugin'; import { serializeString } from '../string'; import type { CrossContextOptions } from './cross-parser'; -import { createEffectfulFunction, createFunction } from '../function-string'; +import { createEffectfulFunction, createFunction } from '../utils/function-string'; import { SpecialReference } from '../special-reference'; export interface CrossSerializerContextOptions diff --git a/packages/seroval/src/core/is-serializable.new.ts b/packages/seroval/src/core/is-serializable.new.ts index a2ba15ff..b83816f8 100644 --- a/packages/seroval/src/core/is-serializable.new.ts +++ b/packages/seroval/src/core/is-serializable.new.ts @@ -2,7 +2,7 @@ import { ALL_ENABLED, BIGINT_FLAG, Feature } from './compat'; import { INV_SYMBOL_REF, UNIVERSAL_SENTINEL } from './constants'; import type { Plugin, PluginAccessOptions } from './plugin'; import { hasReferenceID } from './reference'; -import { getErrorOptions } from './shared'; +import { getErrorOptions } from './utils/error'; export type SerializationMode = 'sync' | 'async' | 'stream'; diff --git a/packages/seroval/src/core/parser-context.ts b/packages/seroval/src/core/parser-context.ts index 3565e19a..f90536e5 100644 --- a/packages/seroval/src/core/parser-context.ts +++ b/packages/seroval/src/core/parser-context.ts @@ -1,5 +1,5 @@ import UnsupportedTypeError from './UnsupportedTypeError'; -import assert from './assert'; +import assert from './utils/assert'; import { createIndexedValueNode, createReferenceNode, @@ -13,7 +13,6 @@ import { } from './constants'; import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; import { hasReferenceID } from './reference'; -import { getObjectFlag } from './shared'; import { ASYNC_ITERATOR, ITERATOR, @@ -33,6 +32,7 @@ import type { SerovalReferenceNode, SerovalWKSymbolNode, } from './types'; +import { getObjectFlag } from './utils/get-object-flag'; export interface BaseParserContextOptions extends PluginAccessOptions { disabledFeatures?: number; diff --git a/packages/seroval/src/core/reference.ts b/packages/seroval/src/core/reference.ts index 7ba8808c..7fa4a2dd 100644 --- a/packages/seroval/src/core/reference.ts +++ b/packages/seroval/src/core/reference.ts @@ -1,5 +1,5 @@ /* eslint-disable no-restricted-globals */ -import assert from './assert'; +import assert from './utils/assert'; import { REFERENCES_KEY } from './keys'; const REFERENCE = new Map(); diff --git a/packages/seroval/src/core/serializer-context.ts b/packages/seroval/src/core/serializer-context.ts index d9ba756a..d18780bd 100644 --- a/packages/seroval/src/core/serializer-context.ts +++ b/packages/seroval/src/core/serializer-context.ts @@ -6,10 +6,9 @@ import { SerovalNodeType, SerovalObjectFlags, } from './constants'; -import { createEffectfulFunction, createFunction } from './function-string'; +import { createEffectfulFunction, createFunction } from './utils/function-string'; import { REFERENCES_KEY } from './keys'; import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; -import { isValidIdentifier } from './shared'; import { SpecialReference } from './special-reference'; import type { SerovalArrayNode, @@ -59,6 +58,7 @@ import type { import { SerovalObjectRecordSpecialKey, } from './types'; +import { isValidIdentifier } from './utils/is-valid-identifier'; interface IndexAssignment { t: 'index'; diff --git a/packages/seroval/src/core/tree/deserialize.ts b/packages/seroval/src/core/tree/deserialize.ts index cd4a9c37..bc565efc 100644 --- a/packages/seroval/src/core/tree/deserialize.ts +++ b/packages/seroval/src/core/tree/deserialize.ts @@ -2,7 +2,6 @@ import { deserializeString } from '../string'; import type { BigIntTypedArrayValue, TypedArrayValue } from '../../types'; import { getReference } from '../reference'; -import { getTypedArrayConstructor } from '../shared'; import type { SerovalAggregateErrorNode, SerovalArrayBufferNode, @@ -47,8 +46,9 @@ import { SerovalObjectFlags, } from '../constants'; import type { Plugin, PluginAccessOptions } from '../plugin'; -import type { Sequence } from '../iterator-to-sequence'; -import { sequenceToAsyncIterator, sequenceToIterator } from '../iterator-to-sequence'; +import type { Sequence } from '../utils/iterator-to-sequence'; +import { sequenceToAsyncIterator, sequenceToIterator } from '../utils/iterator-to-sequence'; +import { getTypedArrayConstructor } from '../utils/typed-array'; function applyObjectFlag(obj: unknown, flag: SerovalObjectFlags): unknown { switch (flag) { diff --git a/packages/seroval/src/core/tree/serialize.ts b/packages/seroval/src/core/tree/serialize.ts index 85a25158..d78dc977 100644 --- a/packages/seroval/src/core/tree/serialize.ts +++ b/packages/seroval/src/core/tree/serialize.ts @@ -10,10 +10,10 @@ import type { } from '../types'; import type { BaseSerializerContextOptions } from '../serializer-context'; import BaseSerializerContext from '../serializer-context'; -import getIdentifier from '../get-identifier'; +import getIdentifier from '../utils/get-identifier'; import type { SerovalMode } from '../plugin'; import { SerovalNodeType } from '../constants'; -import { createFunction } from '../function-string'; +import { createFunction } from '../utils/function-string'; export type VanillaSerializerContextOptions = BaseSerializerContextOptions diff --git a/packages/seroval/src/core/assert.ts b/packages/seroval/src/core/utils/assert.ts similarity index 100% rename from packages/seroval/src/core/assert.ts rename to packages/seroval/src/core/utils/assert.ts diff --git a/packages/seroval/src/core/constructors.ts b/packages/seroval/src/core/utils/constructors.ts similarity index 100% rename from packages/seroval/src/core/constructors.ts rename to packages/seroval/src/core/utils/constructors.ts diff --git a/packages/seroval/src/core/shared.ts b/packages/seroval/src/core/utils/error.ts similarity index 50% rename from packages/seroval/src/core/shared.ts rename to packages/seroval/src/core/utils/error.ts index 6c60d72f..88a4abeb 100644 --- a/packages/seroval/src/core/shared.ts +++ b/packages/seroval/src/core/utils/error.ts @@ -1,12 +1,11 @@ import type { ErrorValue, -} from '../types'; -import { Feature } from './compat'; +} from '../../types'; +import { Feature } from '../compat'; import { ERROR_CONSTRUCTOR_STRING, ErrorConstructorTag, - SerovalObjectFlags, -} from './constants'; +} from '../constants'; export function getErrorConstructor(error: ErrorValue): ErrorConstructorTag { if (error instanceof EvalError) { @@ -30,62 +29,6 @@ export function getErrorConstructor(error: ErrorValue): ErrorConstructorTag { return ErrorConstructorTag.Error; } -type TypedArrayConstructor = - | Int8ArrayConstructor - | Int16ArrayConstructor - | Int32ArrayConstructor - | Uint8ArrayConstructor - | Uint16ArrayConstructor - | Uint32ArrayConstructor - | Uint8ClampedArrayConstructor - | Float32ArrayConstructor - | Float64ArrayConstructor - | BigInt64ArrayConstructor - | BigUint64ArrayConstructor; - -export function getTypedArrayConstructor(name: string): TypedArrayConstructor { - 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 Error(`Unknown TypedArray "${name}"`); - } -} - -const IDENTIFIER_CHECK = /^[$A-Z_][0-9A-Z_$]*$/i; - -export function isValidIdentifier(name: string): boolean { - const char = name[0]; - return ( - char === '$' - || char === '_' - || (char >= 'A' && char <= 'Z') - || (char >= 'a' && char <= 'z') - ) && IDENTIFIER_CHECK.test(name); -} - -export function getObjectFlag(obj: unknown): SerovalObjectFlags { - if (Object.isFrozen(obj)) { - return SerovalObjectFlags.Frozen; - } - if (Object.isSealed(obj)) { - return SerovalObjectFlags.Sealed; - } - if (Object.isExtensible(obj)) { - return SerovalObjectFlags.None; - } - return SerovalObjectFlags.NonExtensible; -} - export function getErrorOptions( error: Error, features: number, diff --git a/packages/seroval/src/core/function-string.ts b/packages/seroval/src/core/utils/function-string.ts similarity index 95% rename from packages/seroval/src/core/function-string.ts rename to packages/seroval/src/core/utils/function-string.ts index 2224784b..885a65a1 100644 --- a/packages/seroval/src/core/function-string.ts +++ b/packages/seroval/src/core/utils/function-string.ts @@ -1,4 +1,4 @@ -import { Feature } from './compat'; +import { Feature } from '../compat'; export function createFunction( features: number, diff --git a/packages/seroval/src/core/get-identifier.ts b/packages/seroval/src/core/utils/get-identifier.ts similarity index 100% rename from packages/seroval/src/core/get-identifier.ts rename to packages/seroval/src/core/utils/get-identifier.ts diff --git a/packages/seroval/src/core/utils/get-object-flag.ts b/packages/seroval/src/core/utils/get-object-flag.ts new file mode 100644 index 00000000..c8b0d771 --- /dev/null +++ b/packages/seroval/src/core/utils/get-object-flag.ts @@ -0,0 +1,14 @@ +import { SerovalObjectFlags } from '../constants'; + +export function getObjectFlag(obj: unknown): SerovalObjectFlags { + if (Object.isFrozen(obj)) { + return SerovalObjectFlags.Frozen; + } + if (Object.isSealed(obj)) { + return SerovalObjectFlags.Sealed; + } + if (Object.isExtensible(obj)) { + return SerovalObjectFlags.None; + } + return SerovalObjectFlags.NonExtensible; +} diff --git a/packages/seroval/src/core/utils/is-valid-identifier.ts b/packages/seroval/src/core/utils/is-valid-identifier.ts new file mode 100644 index 00000000..4e8a8fd5 --- /dev/null +++ b/packages/seroval/src/core/utils/is-valid-identifier.ts @@ -0,0 +1,11 @@ +const IDENTIFIER_CHECK = /^[$A-Z_][0-9A-Z_$]*$/i; + +export function isValidIdentifier(name: string): boolean { + const char = name[0]; + return ( + char === '$' + || char === '_' + || (char >= 'A' && char <= 'Z') + || (char >= 'a' && char <= 'z') + ) && IDENTIFIER_CHECK.test(name); +} diff --git a/packages/seroval/src/core/iterator-to-sequence.ts b/packages/seroval/src/core/utils/iterator-to-sequence.ts similarity index 100% rename from packages/seroval/src/core/iterator-to-sequence.ts rename to packages/seroval/src/core/utils/iterator-to-sequence.ts diff --git a/packages/seroval/src/core/promise-to-result.ts b/packages/seroval/src/core/utils/promise-to-result.ts similarity index 100% rename from packages/seroval/src/core/promise-to-result.ts rename to packages/seroval/src/core/utils/promise-to-result.ts diff --git a/packages/seroval/src/core/utils/typed-array.ts b/packages/seroval/src/core/utils/typed-array.ts new file mode 100644 index 00000000..9189436d --- /dev/null +++ b/packages/seroval/src/core/utils/typed-array.ts @@ -0,0 +1,30 @@ +type TypedArrayConstructor = + | Int8ArrayConstructor + | Int16ArrayConstructor + | Int32ArrayConstructor + | Uint8ArrayConstructor + | Uint16ArrayConstructor + | Uint32ArrayConstructor + | Uint8ClampedArrayConstructor + | Float32ArrayConstructor + | Float64ArrayConstructor + | BigInt64ArrayConstructor + | BigUint64ArrayConstructor; + +export function getTypedArrayConstructor(name: string): TypedArrayConstructor { + 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 Error(`Unknown TypedArray "${name}"`); + } +} From cbdeba54f7c7fdeec4f2941077122930f5f676ec Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 16 Nov 2023 16:10:55 +0800 Subject: [PATCH 28/82] Move files pt. 2 --- packages/seroval/src/core/{base => base-parser}/async.ts | 0 packages/seroval/src/core/{base => base-parser}/stream.ts | 0 packages/seroval/src/core/{base => base-parser}/sync.ts | 0 packages/seroval/src/core/cross/async.ts | 2 +- packages/seroval/src/core/cross/stream.ts | 4 ++-- packages/seroval/src/core/cross/sync.ts | 2 +- packages/seroval/src/core/plugin.ts | 6 +++--- packages/seroval/src/core/tree/async.ts | 2 +- packages/seroval/src/core/tree/sync.ts | 2 +- 9 files changed, 9 insertions(+), 9 deletions(-) rename packages/seroval/src/core/{base => base-parser}/async.ts (100%) rename packages/seroval/src/core/{base => base-parser}/stream.ts (100%) rename packages/seroval/src/core/{base => base-parser}/sync.ts (100%) diff --git a/packages/seroval/src/core/base/async.ts b/packages/seroval/src/core/base-parser/async.ts similarity index 100% rename from packages/seroval/src/core/base/async.ts rename to packages/seroval/src/core/base-parser/async.ts diff --git a/packages/seroval/src/core/base/stream.ts b/packages/seroval/src/core/base-parser/stream.ts similarity index 100% rename from packages/seroval/src/core/base/stream.ts rename to packages/seroval/src/core/base-parser/stream.ts diff --git a/packages/seroval/src/core/base/sync.ts b/packages/seroval/src/core/base-parser/sync.ts similarity index 100% rename from packages/seroval/src/core/base/sync.ts rename to packages/seroval/src/core/base-parser/sync.ts diff --git a/packages/seroval/src/core/cross/async.ts b/packages/seroval/src/core/cross/async.ts index 89c9c88a..29d29a2c 100644 --- a/packages/seroval/src/core/cross/async.ts +++ b/packages/seroval/src/core/cross/async.ts @@ -1,4 +1,4 @@ -import BaseAsyncParserContext from '../base/async'; +import BaseAsyncParserContext from '../base-parser/async'; import type { CrossParserContextOptions } from './cross-parser'; import type { SerovalMode } from '../plugin'; diff --git a/packages/seroval/src/core/cross/stream.ts b/packages/seroval/src/core/cross/stream.ts index 018f4d59..e2a09675 100644 --- a/packages/seroval/src/core/cross/stream.ts +++ b/packages/seroval/src/core/cross/stream.ts @@ -1,5 +1,5 @@ -import type { BaseStreamParserContextOptions } from '../base/stream'; -import BaseStreamParserContext from '../base/stream'; +import type { BaseStreamParserContextOptions } from '../base-parser/stream'; +import BaseStreamParserContext from '../base-parser/stream'; import type { SerovalMode } from '../plugin'; export type CrossStreamParserContextOptions = BaseStreamParserContextOptions diff --git a/packages/seroval/src/core/cross/sync.ts b/packages/seroval/src/core/cross/sync.ts index 4698c90d..3a05cb2a 100644 --- a/packages/seroval/src/core/cross/sync.ts +++ b/packages/seroval/src/core/cross/sync.ts @@ -1,4 +1,4 @@ -import BaseSyncParserContext from '../base/sync'; +import BaseSyncParserContext from '../base-parser/sync'; import type { SerovalMode } from '../plugin'; import type { CrossParserContextOptions } from './cross-parser'; diff --git a/packages/seroval/src/core/plugin.ts b/packages/seroval/src/core/plugin.ts index 7862e6fb..1aaa2396 100644 --- a/packages/seroval/src/core/plugin.ts +++ b/packages/seroval/src/core/plugin.ts @@ -1,6 +1,6 @@ -import type BaseAsyncParserContext from './base/async'; -import type BaseStreamParserContext from './base/stream'; -import type BaseSyncParserContext from './base/sync'; +import type BaseAsyncParserContext from './base-parser/async'; +import type BaseStreamParserContext from './base-parser/stream'; +import type BaseSyncParserContext from './base-parser/sync'; import type BaseSerializerContext from './serializer-context'; import type VanillaDeserializerContext from './tree/deserialize'; diff --git a/packages/seroval/src/core/tree/async.ts b/packages/seroval/src/core/tree/async.ts index 52ce872f..0ced0d22 100644 --- a/packages/seroval/src/core/tree/async.ts +++ b/packages/seroval/src/core/tree/async.ts @@ -1,4 +1,4 @@ -import BaseAsyncParserContext from '../base/async'; +import BaseAsyncParserContext from '../base-parser/async'; import type { BaseParserContextOptions } from '../parser-context'; import type { SerovalMode } from '../plugin'; diff --git a/packages/seroval/src/core/tree/sync.ts b/packages/seroval/src/core/tree/sync.ts index 8e730bfd..fb9f92c2 100644 --- a/packages/seroval/src/core/tree/sync.ts +++ b/packages/seroval/src/core/tree/sync.ts @@ -1,4 +1,4 @@ -import BaseSyncParserContext from '../base/sync'; +import BaseSyncParserContext from '../base-parser/sync'; import type { BaseParserContextOptions } from '../parser-context'; import type { SerovalMode } from '../plugin'; From f19085b0f58721bf3ccf1e88d95749f5123d791a Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 16 Nov 2023 16:14:33 +0800 Subject: [PATCH 29/82] Move files pt. 3 --- .../{parser-context.ts => context/parser.ts} | 22 ++++++------ .../{base-parser => context/parser}/async.ts | 32 ++++++++--------- .../{base-parser => context/parser}/stream.ts | 22 ++++++------ .../{base-parser => context/parser}/sync.ts | 36 +++++++++---------- .../serializer.ts} | 18 +++++----- packages/seroval/src/core/cross/async.ts | 2 +- .../seroval/src/core/cross/cross-parser.ts | 2 +- packages/seroval/src/core/cross/serialize.ts | 4 +-- packages/seroval/src/core/cross/stream.ts | 4 +-- packages/seroval/src/core/cross/sync.ts | 2 +- packages/seroval/src/core/plugin.ts | 8 ++--- packages/seroval/src/core/tree/async.ts | 4 +-- packages/seroval/src/core/tree/serialize.ts | 4 +-- packages/seroval/src/core/tree/sync.ts | 4 +-- 14 files changed, 82 insertions(+), 82 deletions(-) rename packages/seroval/src/core/{parser-context.ts => context/parser.ts} (94%) rename packages/seroval/src/core/{base-parser => context/parser}/async.ts (96%) rename packages/seroval/src/core/{base-parser => context/parser}/stream.ts (97%) rename packages/seroval/src/core/{base-parser => context/parser}/sync.ts (94%) rename packages/seroval/src/core/{serializer-context.ts => context/serializer.ts} (99%) diff --git a/packages/seroval/src/core/parser-context.ts b/packages/seroval/src/core/context/parser.ts similarity index 94% rename from packages/seroval/src/core/parser-context.ts rename to packages/seroval/src/core/context/parser.ts index f90536e5..fcbe1a68 100644 --- a/packages/seroval/src/core/parser-context.ts +++ b/packages/seroval/src/core/context/parser.ts @@ -1,24 +1,24 @@ -import UnsupportedTypeError from './UnsupportedTypeError'; -import assert from './utils/assert'; +import UnsupportedTypeError from '../UnsupportedTypeError'; +import assert from '../utils/assert'; import { createIndexedValueNode, createReferenceNode, createWKSymbolNode, -} from './base-primitives'; -import { ALL_ENABLED, Feature } from './compat'; -import type { WellKnownSymbols } from './constants'; +} from '../base-primitives'; +import { ALL_ENABLED, Feature } from '../compat'; +import type { WellKnownSymbols } from '../constants'; import { INV_SYMBOL_REF, SerovalNodeType, -} from './constants'; -import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; -import { hasReferenceID } from './reference'; +} from '../constants'; +import type { Plugin, PluginAccessOptions, SerovalMode } from '../plugin'; +import { hasReferenceID } from '../reference'; import { ASYNC_ITERATOR, ITERATOR, MAP_SENTINEL, SpecialReference, -} from './special-reference'; +} from '../special-reference'; import type { SerovalAsyncIteratorNode, SerovalIndexedValueNode, @@ -31,8 +31,8 @@ import type { SerovalObjectRecordNode, SerovalReferenceNode, SerovalWKSymbolNode, -} from './types'; -import { getObjectFlag } from './utils/get-object-flag'; +} from '../types'; +import { getObjectFlag } from '../utils/get-object-flag'; export interface BaseParserContextOptions extends PluginAccessOptions { disabledFeatures?: number; diff --git a/packages/seroval/src/core/base-parser/async.ts b/packages/seroval/src/core/context/parser/async.ts similarity index 96% rename from packages/seroval/src/core/base-parser/async.ts rename to packages/seroval/src/core/context/parser/async.ts index 74eeef34..84bfd5fb 100644 --- a/packages/seroval/src/core/base-parser/async.ts +++ b/packages/seroval/src/core/context/parser/async.ts @@ -1,8 +1,8 @@ /* eslint-disable prefer-destructuring */ /* eslint-disable no-await-in-loop */ -import type { BigIntTypedArrayValue, TypedArrayValue } from '../../types'; -import UnsupportedTypeError from '../UnsupportedTypeError'; -import assert from '../utils/assert'; +import type { BigIntTypedArrayValue, TypedArrayValue } from '../../../types'; +import UnsupportedTypeError from '../../UnsupportedTypeError'; +import assert from '../../utils/assert'; import { createPluginNode, createDateNode, @@ -19,30 +19,30 @@ import { createErrorNode, createSetNode, createAggregateErrorNode, -} from '../base-primitives'; -import { BIGINT_FLAG, Feature } from '../compat'; +} from '../../base-primitives'; +import { BIGINT_FLAG, Feature } from '../../compat'; import { SerovalNodeType, UNIVERSAL_SENTINEL, -} from '../constants'; +} from '../../constants'; import { createRequestOptions, createResponseOptions, createEventOptions, createCustomEventOptions, -} from '../utils/constructors'; +} from '../../utils/constructors'; import { NULL_NODE, TRUE_NODE, FALSE_NODE, UNDEFINED_NODE, -} from '../literals'; -import { asyncIteratorToSequence, iteratorToSequence } from '../utils/iterator-to-sequence'; -import { BaseParserContext } from '../parser-context'; -import promiseToResult from '../utils/promise-to-result'; -import { getErrorOptions } from '../utils/error'; -import { serializeString } from '../string'; -import { SerovalObjectRecordSpecialKey } from '../types'; +} from '../../literals'; +import { asyncIteratorToSequence, iteratorToSequence } from '../../utils/iterator-to-sequence'; +import { BaseParserContext } from '../parser'; +import promiseToResult from '../../utils/promise-to-result'; +import { getErrorOptions } from '../../utils/error'; +import { serializeString } from '../../string'; +import { SerovalObjectRecordSpecialKey } from '../../types'; import type { SerovalErrorNode, SerovalArrayNode, @@ -69,14 +69,14 @@ import type { SerovalResponseNode, SerovalSetNode, SerovalDataViewNode, -} from '../types'; +} from '../../types'; import { createURLNode, createURLSearchParamsNode, createDOMExceptionNode, createEventNode, createCustomEVentNode, -} from '../web-api'; +} from '../../web-api'; type ObjectLikeNode = | SerovalObjectNode diff --git a/packages/seroval/src/core/base-parser/stream.ts b/packages/seroval/src/core/context/parser/stream.ts similarity index 97% rename from packages/seroval/src/core/base-parser/stream.ts rename to packages/seroval/src/core/context/parser/stream.ts index b1214543..94548a21 100644 --- a/packages/seroval/src/core/base-parser/stream.ts +++ b/packages/seroval/src/core/context/parser/stream.ts @@ -1,18 +1,18 @@ -import type { BigIntTypedArrayValue, TypedArrayValue } from '../../types'; -import UnsupportedTypeError from '../UnsupportedTypeError'; +import type { BigIntTypedArrayValue, TypedArrayValue } from '../../../types'; +import UnsupportedTypeError from '../../UnsupportedTypeError'; import { createArrayBufferNode, createDateNode, createPluginNode, createRegExpNode, -} from '../base-primitives'; +} from '../../base-primitives'; import type { BaseSyncParserContextOptions } from './sync'; import BaseSyncParserContext from './sync'; -import { BIGINT_FLAG, Feature } from '../compat'; -import { SerovalNodeType, UNIVERSAL_SENTINEL } from '../constants'; -import { createRequestOptions, createResponseOptions } from '../utils/constructors'; -import { NULL_NODE } from '../literals'; -import { serializeString } from '../string'; +import { BIGINT_FLAG, Feature } from '../../compat'; +import { SerovalNodeType, UNIVERSAL_SENTINEL } from '../../constants'; +import { createRequestOptions, createResponseOptions } from '../../utils/constructors'; +import { NULL_NODE } from '../../literals'; +import { serializeString } from '../../string'; import { SerovalObjectRecordSpecialKey, type SerovalNode, @@ -23,9 +23,9 @@ import { type SerovalReadableStreamConstructorNode, type SerovalRequestNode, type SerovalResponseNode, -} from '../types'; -import { createDOMExceptionNode, createURLNode, createURLSearchParamsNode } from '../web-api'; -import { asyncIteratorToReadableStream, iteratorToSequence } from '../utils/iterator-to-sequence'; +} from '../../types'; +import { createDOMExceptionNode, createURLNode, createURLSearchParamsNode } from '../../web-api'; +import { asyncIteratorToReadableStream, iteratorToSequence } from '../../utils/iterator-to-sequence'; export interface BaseStreamParserContextOptions extends BaseSyncParserContextOptions { onParse: (node: SerovalNode, initial: boolean) => void; diff --git a/packages/seroval/src/core/base-parser/sync.ts b/packages/seroval/src/core/context/parser/sync.ts similarity index 94% rename from packages/seroval/src/core/base-parser/sync.ts rename to packages/seroval/src/core/context/parser/sync.ts index 826e9209..476160a8 100644 --- a/packages/seroval/src/core/base-parser/sync.ts +++ b/packages/seroval/src/core/context/parser/sync.ts @@ -1,7 +1,7 @@ /* eslint-disable prefer-destructuring */ -import type { BigIntTypedArrayValue, TypedArrayValue } from '../../types'; -import UnsupportedTypeError from '../UnsupportedTypeError'; -import assert from '../utils/assert'; +import type { BigIntTypedArrayValue, TypedArrayValue } from '../../../types'; +import UnsupportedTypeError from '../../UnsupportedTypeError'; +import assert from '../../utils/assert'; import { createAggregateErrorNode, createArrayBufferNode, @@ -19,27 +19,27 @@ import { createStringNode, createTypedArrayNode, createWKSymbolNode, -} from '../base-primitives'; -import { BIGINT_FLAG, Feature } from '../compat'; -import type { WellKnownSymbols } from '../constants'; +} from '../../base-primitives'; +import { BIGINT_FLAG, Feature } from '../../compat'; +import type { WellKnownSymbols } from '../../constants'; import { SerovalNodeType, UNIVERSAL_SENTINEL, -} from '../constants'; -import { createCustomEventOptions, createEventOptions } from '../utils/constructors'; +} from '../../constants'; +import { createCustomEventOptions, createEventOptions } from '../../utils/constructors'; import { FALSE_NODE, NULL_NODE, TRUE_NODE, UNDEFINED_NODE, -} from '../literals'; -import { iteratorToSequence } from '../utils/iterator-to-sequence'; -import type { BaseParserContextOptions } from '../parser-context'; -import { BaseParserContext } from '../parser-context'; -import { hasReferenceID } from '../reference'; -import { getErrorOptions } from '../utils/error'; -import { serializeString } from '../string'; -import { SerovalObjectRecordSpecialKey } from '../types'; +} from '../../literals'; +import { iteratorToSequence } from '../../utils/iterator-to-sequence'; +import type { BaseParserContextOptions } from '../parser'; +import { BaseParserContext } from '../parser'; +import { hasReferenceID } from '../../reference'; +import { getErrorOptions } from '../../utils/error'; +import { serializeString } from '../../string'; +import { SerovalObjectRecordSpecialKey } from '../../types'; import type { SerovalBoxedNode, SerovalArrayNode, @@ -61,14 +61,14 @@ import type { SerovalTypedArrayNode, SerovalBigIntTypedArrayNode, SerovalDataViewNode, -} from '../types'; +} from '../../types'; import { createCustomEVentNode, createDOMExceptionNode, createEventNode, createURLNode, createURLSearchParamsNode, -} from '../web-api'; +} from '../../web-api'; type ObjectLikeNode = | SerovalObjectNode diff --git a/packages/seroval/src/core/serializer-context.ts b/packages/seroval/src/core/context/serializer.ts similarity index 99% rename from packages/seroval/src/core/serializer-context.ts rename to packages/seroval/src/core/context/serializer.ts index d18780bd..a87d44bb 100644 --- a/packages/seroval/src/core/serializer-context.ts +++ b/packages/seroval/src/core/context/serializer.ts @@ -1,15 +1,15 @@ -import { Feature } from './compat'; +import { Feature } from '../compat'; import { CONSTANT_STRING, ERROR_CONSTRUCTOR_STRING, SYMBOL_STRING, SerovalNodeType, SerovalObjectFlags, -} from './constants'; -import { createEffectfulFunction, createFunction } from './utils/function-string'; -import { REFERENCES_KEY } from './keys'; -import type { Plugin, PluginAccessOptions, SerovalMode } from './plugin'; -import { SpecialReference } from './special-reference'; +} from '../constants'; +import { createEffectfulFunction, createFunction } from '../utils/function-string'; +import { REFERENCES_KEY } from '../keys'; +import type { Plugin, PluginAccessOptions, SerovalMode } from '../plugin'; +import { SpecialReference } from '../special-reference'; import type { SerovalArrayNode, SerovalIndexedValueNode, @@ -54,11 +54,11 @@ import type { SerovalMapSentinelNode, SerovalIteratorNode, SerovalAsyncIteratorNode, -} from './types'; +} from '../types'; import { SerovalObjectRecordSpecialKey, -} from './types'; -import { isValidIdentifier } from './utils/is-valid-identifier'; +} from '../types'; +import { isValidIdentifier } from '../utils/is-valid-identifier'; interface IndexAssignment { t: 'index'; diff --git a/packages/seroval/src/core/cross/async.ts b/packages/seroval/src/core/cross/async.ts index 29d29a2c..633e6f49 100644 --- a/packages/seroval/src/core/cross/async.ts +++ b/packages/seroval/src/core/cross/async.ts @@ -1,4 +1,4 @@ -import BaseAsyncParserContext from '../base-parser/async'; +import BaseAsyncParserContext from '../context/parser/async'; import type { CrossParserContextOptions } from './cross-parser'; import type { SerovalMode } from '../plugin'; diff --git a/packages/seroval/src/core/cross/cross-parser.ts b/packages/seroval/src/core/cross/cross-parser.ts index b5ea8040..631de6bc 100644 --- a/packages/seroval/src/core/cross/cross-parser.ts +++ b/packages/seroval/src/core/cross/cross-parser.ts @@ -1,4 +1,4 @@ -import type { BaseParserContextOptions } from '../parser-context'; +import type { BaseParserContextOptions } from '../context/parser'; export type CrossParserContextOptions = BaseParserContextOptions diff --git a/packages/seroval/src/core/cross/serialize.ts b/packages/seroval/src/core/cross/serialize.ts index d81ccab9..11d9ac76 100644 --- a/packages/seroval/src/core/cross/serialize.ts +++ b/packages/seroval/src/core/cross/serialize.ts @@ -20,8 +20,8 @@ import { GLOBAL_CONTEXT_STREAM_ERROR, GLOBAL_CONTEXT_API, } from '../keys'; -import type { BaseSerializerContextOptions } from '../serializer-context'; -import BaseSerializerContext from '../serializer-context'; +import type { BaseSerializerContextOptions } from '../context/serializer'; +import BaseSerializerContext from '../context/serializer'; import type { SerovalMode } from '../plugin'; import { serializeString } from '../string'; import type { CrossContextOptions } from './cross-parser'; diff --git a/packages/seroval/src/core/cross/stream.ts b/packages/seroval/src/core/cross/stream.ts index e2a09675..407637da 100644 --- a/packages/seroval/src/core/cross/stream.ts +++ b/packages/seroval/src/core/cross/stream.ts @@ -1,5 +1,5 @@ -import type { BaseStreamParserContextOptions } from '../base-parser/stream'; -import BaseStreamParserContext from '../base-parser/stream'; +import type { BaseStreamParserContextOptions } from '../context/parser/stream'; +import BaseStreamParserContext from '../context/parser/stream'; import type { SerovalMode } from '../plugin'; export type CrossStreamParserContextOptions = BaseStreamParserContextOptions diff --git a/packages/seroval/src/core/cross/sync.ts b/packages/seroval/src/core/cross/sync.ts index 3a05cb2a..f1cfb70a 100644 --- a/packages/seroval/src/core/cross/sync.ts +++ b/packages/seroval/src/core/cross/sync.ts @@ -1,4 +1,4 @@ -import BaseSyncParserContext from '../base-parser/sync'; +import BaseSyncParserContext from '../context/parser/sync'; import type { SerovalMode } from '../plugin'; import type { CrossParserContextOptions } from './cross-parser'; diff --git a/packages/seroval/src/core/plugin.ts b/packages/seroval/src/core/plugin.ts index 1aaa2396..77745733 100644 --- a/packages/seroval/src/core/plugin.ts +++ b/packages/seroval/src/core/plugin.ts @@ -1,7 +1,7 @@ -import type BaseAsyncParserContext from './base-parser/async'; -import type BaseStreamParserContext from './base-parser/stream'; -import type BaseSyncParserContext from './base-parser/sync'; -import type BaseSerializerContext from './serializer-context'; +import type BaseAsyncParserContext from './context/parser/async'; +import type BaseStreamParserContext from './context/parser/stream'; +import type BaseSyncParserContext from './context/parser/sync'; +import type BaseSerializerContext from './context/serializer'; import type VanillaDeserializerContext from './tree/deserialize'; export type SerovalMode = 'vanilla' | 'cross'; diff --git a/packages/seroval/src/core/tree/async.ts b/packages/seroval/src/core/tree/async.ts index 0ced0d22..312d9bbb 100644 --- a/packages/seroval/src/core/tree/async.ts +++ b/packages/seroval/src/core/tree/async.ts @@ -1,5 +1,5 @@ -import BaseAsyncParserContext from '../base-parser/async'; -import type { BaseParserContextOptions } from '../parser-context'; +import BaseAsyncParserContext from '../context/parser/async'; +import type { BaseParserContextOptions } from '../context/parser'; import type { SerovalMode } from '../plugin'; export type AsyncParserContextOptions = Omit diff --git a/packages/seroval/src/core/tree/serialize.ts b/packages/seroval/src/core/tree/serialize.ts index d78dc977..513ab911 100644 --- a/packages/seroval/src/core/tree/serialize.ts +++ b/packages/seroval/src/core/tree/serialize.ts @@ -8,8 +8,8 @@ import type { SerovalReadableStreamEnqueueNode, SerovalReadableStreamErrorNode, } from '../types'; -import type { BaseSerializerContextOptions } from '../serializer-context'; -import BaseSerializerContext from '../serializer-context'; +import type { BaseSerializerContextOptions } from '../context/serializer'; +import BaseSerializerContext from '../context/serializer'; import getIdentifier from '../utils/get-identifier'; import type { SerovalMode } from '../plugin'; import { SerovalNodeType } from '../constants'; diff --git a/packages/seroval/src/core/tree/sync.ts b/packages/seroval/src/core/tree/sync.ts index fb9f92c2..87b90907 100644 --- a/packages/seroval/src/core/tree/sync.ts +++ b/packages/seroval/src/core/tree/sync.ts @@ -1,5 +1,5 @@ -import BaseSyncParserContext from '../base-parser/sync'; -import type { BaseParserContextOptions } from '../parser-context'; +import BaseSyncParserContext from '../context/parser/sync'; +import type { BaseParserContextOptions } from '../context/parser'; import type { SerovalMode } from '../plugin'; export type SyncParserContextOptions = Omit; From d3858ec4d64bf535ceefc25dab1fe14c4e051fe4 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 16 Nov 2023 16:21:52 +0800 Subject: [PATCH 30/82] Move files pt. 4 --- .../deserializer.ts} | 24 +++++++++++-------- packages/seroval/src/core/cross/async.ts | 2 +- packages/seroval/src/core/cross/index.ts | 4 ++-- .../core/cross/{cross-parser.ts => parser.ts} | 0 .../cross/{serialize.ts => serializer.ts} | 2 +- packages/seroval/src/core/cross/sync.ts | 2 +- packages/seroval/src/core/plugin.ts | 4 ++-- .../seroval/src/core/tree/deserializer.ts | 9 +++++++ packages/seroval/src/core/tree/index.ts | 4 ++-- .../core/tree/{serialize.ts => serializer.ts} | 0 10 files changed, 32 insertions(+), 19 deletions(-) rename packages/seroval/src/core/{tree/deserialize.ts => context/deserializer.ts} (95%) rename packages/seroval/src/core/cross/{cross-parser.ts => parser.ts} (100%) rename packages/seroval/src/core/cross/{serialize.ts => serializer.ts} (98%) create mode 100644 packages/seroval/src/core/tree/deserializer.ts rename packages/seroval/src/core/tree/{serialize.ts => serializer.ts} (100%) diff --git a/packages/seroval/src/core/tree/deserialize.ts b/packages/seroval/src/core/context/deserializer.ts similarity index 95% rename from packages/seroval/src/core/tree/deserialize.ts rename to packages/seroval/src/core/context/deserializer.ts index bc565efc..55b58d95 100644 --- a/packages/seroval/src/core/tree/deserialize.ts +++ b/packages/seroval/src/core/context/deserializer.ts @@ -45,7 +45,7 @@ import { SerovalNodeType, SerovalObjectFlags, } from '../constants'; -import type { Plugin, PluginAccessOptions } from '../plugin'; +import type { Plugin, PluginAccessOptions, SerovalMode } from '../plugin'; import type { Sequence } from '../utils/iterator-to-sequence'; import { sequenceToAsyncIterator, sequenceToIterator } from '../utils/iterator-to-sequence'; import { getTypedArrayConstructor } from '../utils/typed-array'; @@ -89,36 +89,40 @@ function createDeferred(): Deferred { }; } -export interface DeserializerOptions extends PluginAccessOptions { +export interface BaseDeserializerOptions extends PluginAccessOptions { + refs?: Map; markedRefs: number[] | Set; } -export default class VanillaDeserializerContext implements PluginAccessOptions { +export default abstract class BaseDeserializerContext implements PluginAccessOptions { + abstract readonly mode: SerovalMode; + /** * Mapping ids to values * @private */ - values: Map = new Map(); + refs: Map; /** * Which refs are pre-marked * @private */ - refs: Set; + markedRefs: Set; plugins?: Plugin[] | undefined; - constructor(options: DeserializerOptions) { + constructor(options: BaseDeserializerOptions) { this.plugins = options.plugins; - this.refs = new Set(options.markedRefs); + this.refs = options.refs || new Map(); + this.markedRefs = new Set(options.markedRefs); } assignIndexedValue( index: number, value: T, ): T { - if (this.refs.has(index)) { - this.values.set(index, value); + if (this.markedRefs.has(index)) { + this.refs.set(index, value); } return value; } @@ -478,7 +482,7 @@ export default class VanillaDeserializerContext implements PluginAccessOptions { case SerovalNodeType.BigInt: return BigInt(node.s); case SerovalNodeType.IndexedValue: - return this.values.get(node.i); + return this.refs.get(node.i); case SerovalNodeType.Reference: return this.deserializeReference(node); case SerovalNodeType.Array: diff --git a/packages/seroval/src/core/cross/async.ts b/packages/seroval/src/core/cross/async.ts index 633e6f49..a8a242a0 100644 --- a/packages/seroval/src/core/cross/async.ts +++ b/packages/seroval/src/core/cross/async.ts @@ -1,5 +1,5 @@ import BaseAsyncParserContext from '../context/parser/async'; -import type { CrossParserContextOptions } from './cross-parser'; +import type { CrossParserContextOptions } from './parser'; import type { SerovalMode } from '../plugin'; export type CrossAsyncParserContextOptions = CrossParserContextOptions diff --git a/packages/seroval/src/core/cross/index.ts b/packages/seroval/src/core/cross/index.ts index 3898bab4..81544b5c 100644 --- a/packages/seroval/src/core/cross/index.ts +++ b/packages/seroval/src/core/cross/index.ts @@ -1,7 +1,7 @@ import type { CrossAsyncParserContextOptions } from './async'; import AsyncCrossParserContext from './async'; -import type { CrossContextOptions } from './cross-parser'; -import CrossSerializerContext from './serialize'; +import type { CrossContextOptions } from './parser'; +import CrossSerializerContext from './serializer'; import type { CrossStreamParserContextOptions } from './stream'; import StreamCrossParserContext from './stream'; import type { CrossSyncParserContextOptions } from './sync'; diff --git a/packages/seroval/src/core/cross/cross-parser.ts b/packages/seroval/src/core/cross/parser.ts similarity index 100% rename from packages/seroval/src/core/cross/cross-parser.ts rename to packages/seroval/src/core/cross/parser.ts diff --git a/packages/seroval/src/core/cross/serialize.ts b/packages/seroval/src/core/cross/serializer.ts similarity index 98% rename from packages/seroval/src/core/cross/serialize.ts rename to packages/seroval/src/core/cross/serializer.ts index 11d9ac76..09b98e20 100644 --- a/packages/seroval/src/core/cross/serialize.ts +++ b/packages/seroval/src/core/cross/serializer.ts @@ -24,7 +24,7 @@ import type { BaseSerializerContextOptions } from '../context/serializer'; import BaseSerializerContext from '../context/serializer'; import type { SerovalMode } from '../plugin'; import { serializeString } from '../string'; -import type { CrossContextOptions } from './cross-parser'; +import type { CrossContextOptions } from './parser'; import { createEffectfulFunction, createFunction } from '../utils/function-string'; import { SpecialReference } from '../special-reference'; diff --git a/packages/seroval/src/core/cross/sync.ts b/packages/seroval/src/core/cross/sync.ts index f1cfb70a..3d148fc1 100644 --- a/packages/seroval/src/core/cross/sync.ts +++ b/packages/seroval/src/core/cross/sync.ts @@ -1,6 +1,6 @@ import BaseSyncParserContext from '../context/parser/sync'; import type { SerovalMode } from '../plugin'; -import type { CrossParserContextOptions } from './cross-parser'; +import type { CrossParserContextOptions } from './parser'; export type CrossSyncParserContextOptions = CrossParserContextOptions diff --git a/packages/seroval/src/core/plugin.ts b/packages/seroval/src/core/plugin.ts index 77745733..b302294c 100644 --- a/packages/seroval/src/core/plugin.ts +++ b/packages/seroval/src/core/plugin.ts @@ -2,7 +2,7 @@ import type BaseAsyncParserContext from './context/parser/async'; import type BaseStreamParserContext from './context/parser/stream'; import type BaseSyncParserContext from './context/parser/sync'; import type BaseSerializerContext from './context/serializer'; -import type VanillaDeserializerContext from './tree/deserialize'; +import type BaseDeserializerContext from './context/deserializer'; export type SerovalMode = 'vanilla' | 'cross'; @@ -37,7 +37,7 @@ export interface Plugin { ): string; deserialize( node: Node, - ctx: VanillaDeserializerContext, + ctx: BaseDeserializerContext, data: PluginData, ): Value; // isIterable?: (value: Value) => boolean; diff --git a/packages/seroval/src/core/tree/deserializer.ts b/packages/seroval/src/core/tree/deserializer.ts new file mode 100644 index 00000000..8d66bd81 --- /dev/null +++ b/packages/seroval/src/core/tree/deserializer.ts @@ -0,0 +1,9 @@ +import BaseDeserializerContext from '../context/deserializer'; +import type { BaseDeserializerOptions } from '../context/deserializer'; +import type { SerovalMode } from '../plugin'; + +export type VanillaDeserializerContextOptions = Omit; + +export default class VanillaDeserializerContext extends BaseDeserializerContext { + readonly mode: SerovalMode = 'vanilla'; +} diff --git a/packages/seroval/src/core/tree/index.ts b/packages/seroval/src/core/tree/index.ts index 22ba6e7e..3521f984 100644 --- a/packages/seroval/src/core/tree/index.ts +++ b/packages/seroval/src/core/tree/index.ts @@ -2,8 +2,8 @@ import type { PluginAccessOptions } from '../plugin'; import type { SerovalNode } from '../types'; import type { AsyncParserContextOptions } from './async'; import AsyncParserContext from './async'; -import VanillaDeserializerContext from './deserialize'; -import VanillaSerializerContext from './serialize'; +import VanillaDeserializerContext from './deserializer'; +import VanillaSerializerContext from './serializer'; import type { SyncParserContextOptions } from './sync'; import SyncParserContext from './sync'; diff --git a/packages/seroval/src/core/tree/serialize.ts b/packages/seroval/src/core/tree/serializer.ts similarity index 100% rename from packages/seroval/src/core/tree/serialize.ts rename to packages/seroval/src/core/tree/serializer.ts From be8c025fa479a1003de69f392b266ee9f9509d03 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 16 Nov 2023 16:27:25 +0800 Subject: [PATCH 31/82] Fix vanilla constructors --- packages/seroval/src/core/tree/async.ts | 7 +++++++ packages/seroval/src/core/tree/deserializer.ts | 7 +++++++ packages/seroval/src/core/tree/sync.ts | 7 +++++++ 3 files changed, 21 insertions(+) diff --git a/packages/seroval/src/core/tree/async.ts b/packages/seroval/src/core/tree/async.ts index 312d9bbb..18feb26f 100644 --- a/packages/seroval/src/core/tree/async.ts +++ b/packages/seroval/src/core/tree/async.ts @@ -6,4 +6,11 @@ export type AsyncParserContextOptions = Omit export default class AsyncParserContext extends BaseAsyncParserContext { readonly mode: SerovalMode = 'vanilla'; + + constructor(options: AsyncParserContextOptions) { + super({ + plugins: options.plugins, + disabledFeatures: options.disabledFeatures, + }); + } } diff --git a/packages/seroval/src/core/tree/deserializer.ts b/packages/seroval/src/core/tree/deserializer.ts index 8d66bd81..495fc5f3 100644 --- a/packages/seroval/src/core/tree/deserializer.ts +++ b/packages/seroval/src/core/tree/deserializer.ts @@ -6,4 +6,11 @@ export type VanillaDeserializerContextOptions = Omit; export default class SyncParserContext extends BaseSyncParserContext { readonly mode: SerovalMode = 'vanilla'; + + constructor(options: SyncParserContextOptions) { + super({ + plugins: options.plugins, + disabledFeatures: options.disabledFeatures, + }); + } } From dc9fe3a78968ceebfaea8d9f0294b297d3fb5172 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 16 Nov 2023 16:45:19 +0800 Subject: [PATCH 32/82] Add streaming Promise to deserializer --- .../seroval/src/core/context/deserializer.ts | 82 +++++++++++-------- .../seroval/src/core/tree/deserializer.ts | 10 +++ packages/seroval/src/core/utils/deferred.ts | 21 +++++ 3 files changed, 80 insertions(+), 33 deletions(-) create mode 100644 packages/seroval/src/core/utils/deferred.ts diff --git a/packages/seroval/src/core/context/deserializer.ts b/packages/seroval/src/core/context/deserializer.ts index 55b58d95..794e6057 100644 --- a/packages/seroval/src/core/context/deserializer.ts +++ b/packages/seroval/src/core/context/deserializer.ts @@ -25,7 +25,10 @@ import type { SerovalObjectRecordKey, SerovalObjectRecordNode, SerovalPluginNode, + SerovalPromiseConstructorNode, SerovalPromiseNode, + SerovalPromiseRejectNode, + SerovalPromiseResolveNode, SerovalReferenceNode, SerovalRegExpNode, SerovalRequestNode, @@ -49,6 +52,9 @@ import type { Plugin, PluginAccessOptions, SerovalMode } from '../plugin'; import type { Sequence } from '../utils/iterator-to-sequence'; import { sequenceToAsyncIterator, sequenceToIterator } from '../utils/iterator-to-sequence'; import { getTypedArrayConstructor } from '../utils/typed-array'; +import type { Deferred } from '../utils/deferred'; +import { createDeferred } from '../utils/deferred'; +import assert from '../utils/assert'; function applyObjectFlag(obj: unknown, flag: SerovalObjectFlags): unknown { switch (flag) { @@ -66,29 +72,6 @@ function applyObjectFlag(obj: unknown, flag: SerovalObjectFlags): unknown { type AssignableValue = AggregateError | Error | Iterable type AssignableNode = SerovalAggregateErrorNode | SerovalErrorNode; -interface Deferred { - resolve(value: unknown): void; - reject(value: unknown): void; - promise: Promise; -} - -function createDeferred(): Deferred { - let resolve: Deferred['resolve']; - let reject: Deferred['reject']; - return { - resolve(v): void { - resolve(v); - }, - reject(v): void { - reject(v); - }, - promise: new Promise((res, rej) => { - resolve = res as Deferred['resolve']; - reject = rej as Deferred['reject']; - }), - }; -} - export interface BaseDeserializerOptions extends PluginAccessOptions { refs?: Map; markedRefs: number[] | Set; @@ -117,15 +100,10 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt this.markedRefs = new Set(options.markedRefs); } - assignIndexedValue( - index: number, + protected abstract assignIndexedValue( + id: number, value: T, - ): T { - if (this.markedRefs.has(index)) { - this.refs.set(index, value); - } - return value; - } + ): T; private deserializeReference( node: SerovalReferenceNode, @@ -318,9 +296,9 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt const result = this.assignIndexedValue(node.i, deferred.promise); const deserialized = this.deserialize(node.f); if (node.s) { - deferred.resolve(deserialized); + deferred.promise.resolve(deserialized); } else { - deferred.reject(deserialized); + deferred.promise.reject(deserialized); } return result; } @@ -471,6 +449,31 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt throw new Error('Missing plugin for tag "' + node.c + '".'); } + private deserializePromiseConstructor(node: SerovalPromiseConstructorNode): unknown { + return this.assignIndexedValue( + node.i, + createDeferred().promise, + ); + } + + private deserializePromiseResolve(node: SerovalPromiseResolveNode): unknown { + const deferred = this.refs.get(node.i) as Deferred | undefined; + assert(deferred, new Error('Missing Promise instance.')); + deferred.resolve( + this.deserialize(node.f), + ); + return undefined; + } + + private deserializePromiseReject(node: SerovalPromiseRejectNode): unknown { + const deferred = this.refs.get(node.i) as Deferred | undefined; + assert(deferred, new Error('Missing Promise instance.')); + deferred.reject( + this.deserialize(node.f), + ); + return undefined; + } + deserialize(node: SerovalNode): unknown { switch (node.t) { case SerovalNodeType.Constant: @@ -539,6 +542,19 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt return this.deserializeDOMException(node); case SerovalNodeType.Plugin: return this.deserializePlugin(node); + case SerovalNodeType.PromiseConstructor: + return this.deserializePromiseConstructor(node); + case SerovalNodeType.PromiseResolve: + return this.deserializePromiseResolve(node); + case SerovalNodeType.PromiseReject: + return this.deserializePromiseReject(node); + case SerovalNodeType.ReadableStreamConstructor: + case SerovalNodeType.ReadableStreamEnqueue: + case SerovalNodeType.ReadableStreamError: + case SerovalNodeType.ReadableStreamClose: + case SerovalNodeType.MapSentinel: + case SerovalNodeType.Iterator: + case SerovalNodeType.AsyncIterator: default: throw new Error('invariant'); } diff --git a/packages/seroval/src/core/tree/deserializer.ts b/packages/seroval/src/core/tree/deserializer.ts index 495fc5f3..c8b0e1aa 100644 --- a/packages/seroval/src/core/tree/deserializer.ts +++ b/packages/seroval/src/core/tree/deserializer.ts @@ -13,4 +13,14 @@ export default class VanillaDeserializerContext extends BaseDeserializerContext markedRefs: options.markedRefs, }); } + + assignIndexedValue( + index: number, + value: T, + ): T { + if (this.markedRefs.has(index)) { + this.refs.set(index, value); + } + return value; + } } diff --git a/packages/seroval/src/core/utils/deferred.ts b/packages/seroval/src/core/utils/deferred.ts new file mode 100644 index 00000000..c3260209 --- /dev/null +++ b/packages/seroval/src/core/utils/deferred.ts @@ -0,0 +1,21 @@ +export interface Deferred extends Promise { + resolve(value: unknown): void; + reject(value: unknown): void; +} + +export function createDeferred(): { promise: Deferred } { + let resolve: Deferred['resolve']; + let reject: Deferred['reject']; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }) as Deferred; + + promise.resolve = (value): void => { + resolve(value); + }; + promise.reject = (value): void => { + reject(value); + }; + return { promise }; +} From 43dc14647180d675c297ddd89b6f452a62930404 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 16 Nov 2023 16:47:22 +0800 Subject: [PATCH 33/82] Add `CrossDeserializerContext` --- .../seroval/src/core/cross/deserializer.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 packages/seroval/src/core/cross/deserializer.ts diff --git a/packages/seroval/src/core/cross/deserializer.ts b/packages/seroval/src/core/cross/deserializer.ts new file mode 100644 index 00000000..44e6b3d1 --- /dev/null +++ b/packages/seroval/src/core/cross/deserializer.ts @@ -0,0 +1,19 @@ +import BaseDeserializerContext from '../context/deserializer'; +import type { BaseDeserializerOptions } from '../context/deserializer'; +import type { SerovalMode } from '../plugin'; + +export type CrossDeserializerContextOptions = BaseDeserializerOptions; + +export default class CrossDeserializerContext extends BaseDeserializerContext { + readonly mode: SerovalMode = 'cross'; + + assignIndexedValue( + index: number, + value: T, + ): T { + if (!this.refs.has(index)) { + this.refs.set(index, value); + } + return value; + } +} From 5ae19bfd7fbbf43876a2072ba393300fcdd18f28 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 16 Nov 2023 23:31:37 +0800 Subject: [PATCH 34/82] Add `ReadableStream` support to deserializer --- .../seroval/src/core/context/deserializer.ts | 58 ++++++++++++++++--- packages/seroval/src/core/utils/deferred.ts | 52 +++++++++++++---- 2 files changed, 90 insertions(+), 20 deletions(-) diff --git a/packages/seroval/src/core/context/deserializer.ts b/packages/seroval/src/core/context/deserializer.ts index 794e6057..8191a39e 100644 --- a/packages/seroval/src/core/context/deserializer.ts +++ b/packages/seroval/src/core/context/deserializer.ts @@ -29,6 +29,10 @@ import type { SerovalPromiseNode, SerovalPromiseRejectNode, SerovalPromiseResolveNode, + SerovalReadableStreamCloseNode, + SerovalReadableStreamConstructorNode, + SerovalReadableStreamEnqueueNode, + SerovalReadableStreamErrorNode, SerovalReferenceNode, SerovalRegExpNode, SerovalRequestNode, @@ -52,8 +56,8 @@ import type { Plugin, PluginAccessOptions, SerovalMode } from '../plugin'; import type { Sequence } from '../utils/iterator-to-sequence'; import { sequenceToAsyncIterator, sequenceToIterator } from '../utils/iterator-to-sequence'; import { getTypedArrayConstructor } from '../utils/typed-array'; -import type { Deferred } from '../utils/deferred'; -import { createDeferred } from '../utils/deferred'; +import type { Deferred, DeferredStream } from '../utils/deferred'; +import { createDeferred, createDeferredStream } from '../utils/deferred'; import assert from '../utils/assert'; function applyObjectFlag(obj: unknown, flag: SerovalObjectFlags): unknown { @@ -293,14 +297,14 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt node: SerovalPromiseNode, ): Promise { const deferred = createDeferred(); - const result = this.assignIndexedValue(node.i, deferred.promise); + const result = this.assignIndexedValue(node.i, deferred); const deserialized = this.deserialize(node.f); if (node.s) { - deferred.promise.resolve(deserialized); + deferred.resolve(deserialized); } else { - deferred.promise.reject(deserialized); + deferred.reject(deserialized); } - return result; + return result.promise; } private deserializeURL( @@ -452,8 +456,8 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt private deserializePromiseConstructor(node: SerovalPromiseConstructorNode): unknown { return this.assignIndexedValue( node.i, - createDeferred().promise, - ); + createDeferred(), + ).promise; } private deserializePromiseResolve(node: SerovalPromiseResolveNode): unknown { @@ -474,6 +478,40 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt return undefined; } + private deserializeReadableStreamConstructor( + node: SerovalReadableStreamConstructorNode, + ): unknown { + return this.assignIndexedValue( + node.i, + createDeferredStream(), + ).stream; + } + + private deserializeReadableStreamEnqueue(node: SerovalReadableStreamEnqueueNode): unknown { + const deferred = this.refs.get(node.i) as DeferredStream | undefined; + assert(deferred, new Error('Missing ReadableStream instance.')); + deferred.enqueue( + this.deserialize(node.f), + ); + return undefined; + } + + private deserializeReadableStreamError(node: SerovalReadableStreamErrorNode): unknown { + const deferred = this.refs.get(node.i) as DeferredStream | undefined; + assert(deferred, new Error('Missing Promise instance.')); + deferred.error( + this.deserialize(node.f), + ); + return undefined; + } + + private deserializeReadableStreamClose(node: SerovalReadableStreamCloseNode): unknown { + const deferred = this.refs.get(node.i) as DeferredStream | undefined; + assert(deferred, new Error('Missing Promise instance.')); + deferred.close(); + return undefined; + } + deserialize(node: SerovalNode): unknown { switch (node.t) { case SerovalNodeType.Constant: @@ -549,9 +587,13 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt case SerovalNodeType.PromiseReject: return this.deserializePromiseReject(node); case SerovalNodeType.ReadableStreamConstructor: + return this.deserializeReadableStreamConstructor(node); case SerovalNodeType.ReadableStreamEnqueue: + return this.deserializeReadableStreamEnqueue(node); case SerovalNodeType.ReadableStreamError: + return this.deserializeReadableStreamError(node); case SerovalNodeType.ReadableStreamClose: + return this.deserializeReadableStreamClose(node); case SerovalNodeType.MapSentinel: case SerovalNodeType.Iterator: case SerovalNodeType.AsyncIterator: diff --git a/packages/seroval/src/core/utils/deferred.ts b/packages/seroval/src/core/utils/deferred.ts index c3260209..6906b6ce 100644 --- a/packages/seroval/src/core/utils/deferred.ts +++ b/packages/seroval/src/core/utils/deferred.ts @@ -1,21 +1,49 @@ -export interface Deferred extends Promise { +export interface Deferred { + promise: Promise; resolve(value: unknown): void; reject(value: unknown): void; } -export function createDeferred(): { promise: Deferred } { +export function createDeferred(): Deferred { let resolve: Deferred['resolve']; let reject: Deferred['reject']; - const promise = new Promise((res, rej) => { - resolve = res; - reject = rej; - }) as Deferred; - - promise.resolve = (value): void => { - resolve(value); + return { + promise: new Promise((res, rej) => { + resolve = res; + reject = rej; + }), + resolve(value): void { + resolve(value); + }, + reject(value): void { + reject(value); + }, }; - promise.reject = (value): void => { - reject(value); +} + +export interface DeferredStream { + stream: ReadableStream; + close(): void; + enqueue(chunk?: unknown): void; + error(e?: any): void; +} + +export function createDeferredStream(): DeferredStream { + let controller: ReadableStreamDefaultController; + return { + stream: new ReadableStream({ + start(current): void { + controller = current; + }, + }), + close(): void { + controller.close(); + }, + enqueue(data): void { + controller.enqueue(data); + }, + error(e): void { + controller.error(e); + }, }; - return { promise }; } From aab35b0ed562ad82a2a635d5c5c37ad83ceddbbe Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Thu, 16 Nov 2023 23:54:14 +0800 Subject: [PATCH 35/82] Add Cross JSON APIs --- .../seroval/src/core/context/deserializer.ts | 8 -- packages/seroval/src/core/cross/index.ts | 122 +++++++++++------- packages/seroval/src/core/tree/async.ts | 7 - .../seroval/src/core/tree/deserializer.ts | 11 +- packages/seroval/src/core/tree/sync.ts | 7 - 5 files changed, 84 insertions(+), 71 deletions(-) diff --git a/packages/seroval/src/core/context/deserializer.ts b/packages/seroval/src/core/context/deserializer.ts index 8191a39e..52429821 100644 --- a/packages/seroval/src/core/context/deserializer.ts +++ b/packages/seroval/src/core/context/deserializer.ts @@ -78,7 +78,6 @@ type AssignableNode = SerovalAggregateErrorNode | SerovalErrorNode; export interface BaseDeserializerOptions extends PluginAccessOptions { refs?: Map; - markedRefs: number[] | Set; } export default abstract class BaseDeserializerContext implements PluginAccessOptions { @@ -90,18 +89,11 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt */ refs: Map; - /** - * Which refs are pre-marked - * @private - */ - markedRefs: Set; - plugins?: Plugin[] | undefined; constructor(options: BaseDeserializerOptions) { this.plugins = options.plugins; this.refs = options.refs || new Map(); - this.markedRefs = new Set(options.markedRefs); } protected abstract assignIndexedValue( diff --git a/packages/seroval/src/core/cross/index.ts b/packages/seroval/src/core/cross/index.ts index 81544b5c..b5ca0c9a 100644 --- a/packages/seroval/src/core/cross/index.ts +++ b/packages/seroval/src/core/cross/index.ts @@ -1,6 +1,9 @@ +import type { SerovalNode } from '../types'; import type { CrossAsyncParserContextOptions } from './async'; import AsyncCrossParserContext from './async'; -import type { CrossContextOptions } from './parser'; +import type { CrossDeserializerContextOptions } from './deserializer'; +import CrossDeserializerContext from './deserializer'; +import type { CrossContextOptions, CrossParserContextOptions } from './parser'; import CrossSerializerContext from './serializer'; import type { CrossStreamParserContextOptions } from './stream'; import StreamCrossParserContext from './stream'; @@ -53,51 +56,44 @@ export async function crossSerializeAsync( return serial.serializeTop(tree); } -// export interface SerovalCrossJSON { -// t: SerovalNode; -// f: number; -// } - -// export function toCrossJSON( -// source: T, -// options?: CrossParserContextOptions, -// ): SerovalCrossJSON { -// const ctx = createCrossParserContext(options); -// return { -// t: parseSync(ctx, source), -// f: ctx.features, -// }; -// } - -// export async function toCrossJSONAsync( -// source: T, -// options?: CrossParserContextOptions, -// ): Promise { -// const ctx = createCrossParserContext(options); -// return { -// t: await parseAsync(ctx, source), -// f: ctx.features, -// }; -// } - -// export function compileCrossJSON(source: SerovalCrossJSON): string { -// const serial = createCrossSerializerContext({ -// features: source.f, -// }); -// const result = crossSerializeTree(serial, source.t); -// return finalize( -// serial, -// source.t.i, -// result, -// ); -// } - -// export function fromJSON(source: SerovalJSON): T { -// const serial = createDeserializerContext({ -// markedRefs: source.m, -// }); -// return deserializeTree(serial, source.t) as T; -// } +export interface SerovalCrossJSON { + t: SerovalNode; + f: number; +} + +export type ToCrossJSONOptions = CrossParserContextOptions; + +export function toCrossJSON( + source: T, + options: CrossParserContextOptions = {}, +): SerovalCrossJSON { + const ctx = new SyncCrossParserContext({ + plugins: options.plugins, + disabledFeatures: options.disabledFeatures, + refs: options.refs, + }); + return { + t: ctx.parse(source), + f: ctx.features, + }; +} + +export type ToCrossJSONAsyncOptions = CrossParserContextOptions; + +export async function toCrossJSONAsync( + source: T, + options: CrossParserContextOptions = {}, +): Promise { + const ctx = new AsyncCrossParserContext({ + plugins: options.plugins, + disabledFeatures: options.disabledFeatures, + refs: options.refs, + }); + return { + t: await ctx.parse(source), + f: ctx.features, + }; +} export interface CrossSerializeStreamOptions extends Omit, CrossContextOptions { @@ -145,3 +141,37 @@ export function crossSerializeStream( ctx.destroy(); }; } + +export type ToCrossJSONStreamOptions = CrossStreamParserContextOptions; + +export function toCrossJSONStream( + source: T, + options: ToCrossJSONStreamOptions, +): () => void { + const ctx = new StreamCrossParserContext({ + refs: options.refs, + disabledFeatures: options.disabledFeatures, + onParse: options.onParse, + onError: options.onError, + onDone: options.onDone, + }); + + ctx.start(source); + + return () => { + ctx.destroy(); + }; +} + +export type FromCrossJSONOptions = CrossDeserializerContextOptions; + +export function fromCrossJSON( + source: SerovalCrossJSON, + options: FromCrossJSONOptions, +): T { + const ctx = new CrossDeserializerContext({ + plugins: options.plugins, + refs: options.refs, + }); + return ctx.deserialize(source.t) as T; +} diff --git a/packages/seroval/src/core/tree/async.ts b/packages/seroval/src/core/tree/async.ts index 18feb26f..312d9bbb 100644 --- a/packages/seroval/src/core/tree/async.ts +++ b/packages/seroval/src/core/tree/async.ts @@ -6,11 +6,4 @@ export type AsyncParserContextOptions = Omit export default class AsyncParserContext extends BaseAsyncParserContext { readonly mode: SerovalMode = 'vanilla'; - - constructor(options: AsyncParserContextOptions) { - super({ - plugins: options.plugins, - disabledFeatures: options.disabledFeatures, - }); - } } diff --git a/packages/seroval/src/core/tree/deserializer.ts b/packages/seroval/src/core/tree/deserializer.ts index c8b0e1aa..07603418 100644 --- a/packages/seroval/src/core/tree/deserializer.ts +++ b/packages/seroval/src/core/tree/deserializer.ts @@ -2,23 +2,28 @@ import BaseDeserializerContext from '../context/deserializer'; import type { BaseDeserializerOptions } from '../context/deserializer'; import type { SerovalMode } from '../plugin'; -export type VanillaDeserializerContextOptions = Omit; +export interface VanillaDeserializerContextOptions extends Omit { + markedRefs: number[] | Set; +} export default class VanillaDeserializerContext extends BaseDeserializerContext { readonly mode: SerovalMode = 'vanilla'; + marked: Set; + constructor(options: VanillaDeserializerContextOptions) { super({ plugins: options.plugins, - markedRefs: options.markedRefs, + refs: undefined, }); + this.marked = new Set(options.markedRefs); } assignIndexedValue( index: number, value: T, ): T { - if (this.markedRefs.has(index)) { + if (this.marked.has(index)) { this.refs.set(index, value); } return value; diff --git a/packages/seroval/src/core/tree/sync.ts b/packages/seroval/src/core/tree/sync.ts index 5593c4bd..87b90907 100644 --- a/packages/seroval/src/core/tree/sync.ts +++ b/packages/seroval/src/core/tree/sync.ts @@ -6,11 +6,4 @@ export type SyncParserContextOptions = Omit; export default class SyncParserContext extends BaseSyncParserContext { readonly mode: SerovalMode = 'vanilla'; - - constructor(options: SyncParserContextOptions) { - super({ - plugins: options.plugins, - disabledFeatures: options.disabledFeatures, - }); - } } From 517f5356acfba8b2c15ee788bfcece0c5c4238b4 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 00:24:29 +0800 Subject: [PATCH 36/82] Fix Cross JSON output --- packages/seroval/src/core/cross/index.ts | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/packages/seroval/src/core/cross/index.ts b/packages/seroval/src/core/cross/index.ts index b5ca0c9a..292718bb 100644 --- a/packages/seroval/src/core/cross/index.ts +++ b/packages/seroval/src/core/cross/index.ts @@ -56,26 +56,18 @@ export async function crossSerializeAsync( return serial.serializeTop(tree); } -export interface SerovalCrossJSON { - t: SerovalNode; - f: number; -} - export type ToCrossJSONOptions = CrossParserContextOptions; export function toCrossJSON( source: T, options: CrossParserContextOptions = {}, -): SerovalCrossJSON { +): SerovalNode { const ctx = new SyncCrossParserContext({ plugins: options.plugins, disabledFeatures: options.disabledFeatures, refs: options.refs, }); - return { - t: ctx.parse(source), - f: ctx.features, - }; + return ctx.parse(source); } export type ToCrossJSONAsyncOptions = CrossParserContextOptions; @@ -83,16 +75,13 @@ export type ToCrossJSONAsyncOptions = CrossParserContextOptions; export async function toCrossJSONAsync( source: T, options: CrossParserContextOptions = {}, -): Promise { +): Promise { const ctx = new AsyncCrossParserContext({ plugins: options.plugins, disabledFeatures: options.disabledFeatures, refs: options.refs, }); - return { - t: await ctx.parse(source), - f: ctx.features, - }; + return ctx.parse(source); } export interface CrossSerializeStreamOptions @@ -166,12 +155,12 @@ export function toCrossJSONStream( export type FromCrossJSONOptions = CrossDeserializerContextOptions; export function fromCrossJSON( - source: SerovalCrossJSON, + source: SerovalNode, options: FromCrossJSONOptions, ): T { const ctx = new CrossDeserializerContext({ plugins: options.plugins, refs: options.refs, }); - return ctx.deserialize(source.t) as T; + return ctx.deserialize(source) as T; } From 51b3420184607f3355c5266658fff532b4b15d96 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 01:02:06 +0800 Subject: [PATCH 37/82] Update web-api tests --- .../web-api/__snapshots__/blob.test.ts.snap | 8 +- .../__snapshots__/custom-event.test.ts.snap | 8 ++ .../__snapshots__/dom-exception.test.ts.snap | 8 ++ .../web-api/__snapshots__/event.test.ts.snap | 8 ++ .../web-api/__snapshots__/file.test.ts.snap | 10 +- .../__snapshots__/form-data.test.ts.snap | 16 ++- .../__snapshots__/headers.test.ts.snap | 8 ++ .../readable-stream.test.ts.snap | 136 ++++++++++++++++++ .../__snapshots__/request.test.ts.snap | 8 ++ .../__snapshots__/response.test.ts.snap | 8 ++ .../url-search-params.test.ts.snap | 8 ++ .../web-api/__snapshots__/url.test.ts.snap | 8 ++ packages/seroval/test/web-api/blob.test.ts | 49 ++++--- .../seroval/test/web-api/custom-event.test.ts | 77 ++++++---- .../test/web-api/dom-exception.test.ts | 92 +++++++----- packages/seroval/test/web-api/event.test.ts | 76 ++++++---- packages/seroval/test/web-api/file.test.ts | 55 +++---- .../seroval/test/web-api/form-data.test.ts | 133 +++++++++-------- packages/seroval/test/web-api/headers.test.ts | 116 +++++++-------- .../test/web-api/readable-stream.test.ts | 39 ++++- packages/seroval/test/web-api/request.test.ts | 41 +++++- .../seroval/test/web-api/response.test.ts | 32 ++++- .../test/web-api/url-search-params.test.ts | 86 +++++++---- packages/seroval/test/web-api/url.test.ts | 84 +++++++---- 24 files changed, 788 insertions(+), 326 deletions(-) diff --git a/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap index 53debf42..3bdc07cc 100644 --- a/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/blob.test.ts.snap @@ -2,8 +2,10 @@ exports[`Blob > crossSerializeAsync > scoped > supports Blob 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new Blob([$R[2]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],{type:\\"text/plain\\"})))($R[\\"example\\"])"`; -exports[`Blob > crossSerializeAsync > supports Blob 1`] = `"$R[0]=Promise.resolve($R[1]=new Blob([$R[2]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],{type:\\"text/plain\\"}))"`; +exports[`Blob > crossSerializeAsync > supports Blob 1`] = `"$R[0]=new Blob([$R[1]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],{type:\\"text/plain\\"})"`; -exports[`Blob > serializeAsync > supports Blob 1`] = `"Promise.resolve(new Blob([new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],{type:\\"text/plain\\"}))"`; +exports[`Blob > serializeAsync > supports Blob 1`] = `"new Blob([new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],{type:\\"text/plain\\"})"`; -exports[`Blob > toJSONAsync > supports Blob 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":23,\\"i\\":1,\\"c\\":\\"text/plain\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Blob > toCrossJSONAsync > supports Blob 1`] = `"{\\"t\\":23,\\"i\\":0,\\"c\\":\\"text/plain\\",\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]}}"`; + +exports[`Blob > toJSONAsync > supports Blob 1`] = `"{\\"t\\":{\\"t\\":23,\\"i\\":0,\\"c\\":\\"text/plain\\",\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap index ec5a4e3c..61ddb7b7 100644 --- a/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap @@ -20,6 +20,14 @@ exports[`CustomEvent > serialize > supports CustomEvent 1`] = `"((h,j)=>(j=new C exports[`CustomEvent > serializeAsync > supports CustomEvent 1`] = `"((h,j)=>(j=Promise.resolve(new CustomEvent(\\"example\\",{detail:h={},bubbles:!1,cancelable:!1,composed:!1})),h.self=h,j))()"`; +exports[`CustomEvent > toCrossJSON > supports CustomEvent 1`] = `"{\\"t\\":38,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":2}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0,\\"x\\":{}}}"`; + +exports[`CustomEvent > toCrossJSONAsync > supports CustomEvent 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":38,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":3}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0,\\"x\\":{}}}}"`; + +exports[`CustomEvent > toCrossJSONStream > supports CustomEvent 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`CustomEvent > toCrossJSONStream > supports CustomEvent 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":38,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":3}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0,\\"x\\":{}}}}"`; + exports[`CustomEvent > toJSON > supports CustomEvent 1`] = `"{\\"t\\":{\\"t\\":38,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":2}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[2]}"`; exports[`CustomEvent > toJSONAsync > supports CustomEvent 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":38,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":3}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0,\\"x\\":{}}}},\\"f\\":16383,\\"m\\":[3]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap index 7ef3b042..3f8b61a3 100644 --- a/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/dom-exception.test.ts.snap @@ -20,6 +20,14 @@ exports[`DOMException > serialize > supports DOMException 1`] = `"new DOMExcepti exports[`DOMException > serializeAsync > supports DOMException 1`] = `"Promise.resolve(new DOMException(\\"This is an example message.\\",\\"Example\\"))"`; +exports[`DOMException > toCrossJSON > supports DOMException 1`] = `"{\\"t\\":39,\\"i\\":0,\\"s\\":\\"This is an example message.\\",\\"c\\":\\"Example\\"}"`; + +exports[`DOMException > toCrossJSONAsync > supports DOMException 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":39,\\"i\\":1,\\"s\\":\\"This is an example message.\\",\\"c\\":\\"Example\\"}}"`; + +exports[`DOMException > toCrossJSONStream > supports DOMException 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`DOMException > toCrossJSONStream > supports DOMException 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":39,\\"i\\":1,\\"s\\":\\"This is an example message.\\",\\"c\\":\\"Example\\"}}"`; + exports[`DOMException > toJSON > supports DOMException 1`] = `"{\\"t\\":{\\"t\\":39,\\"i\\":0,\\"s\\":\\"This is an example message.\\",\\"c\\":\\"Example\\"},\\"f\\":16383,\\"m\\":[]}"`; exports[`DOMException > toJSONAsync > supports DOMException 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":39,\\"i\\":1,\\"s\\":\\"This is an example message.\\",\\"c\\":\\"Example\\"}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap index 0c26f6dc..1989aed2 100644 --- a/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap @@ -20,6 +20,14 @@ exports[`Event > serialize > supports Event 1`] = `"new Event(\\"example\\",{bub exports[`Event > serializeAsync > supports Event 1`] = `"Promise.resolve(new Event(\\"example\\",{bubbles:!1,cancelable:!1,composed:!1}))"`; +exports[`Event > toCrossJSON > supports Event 1`] = `"{\\"t\\":37,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}}"`; + +exports[`Event > toCrossJSONAsync > supports Event 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":37,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}}}"`; + +exports[`Event > toCrossJSONStream > supports Event 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`Event > toCrossJSONStream > supports Event 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":37,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}}}"`; + exports[`Event > toJSON > supports Event 1`] = `"{\\"t\\":{\\"t\\":37,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; exports[`Event > toJSONAsync > supports Event 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":37,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap index cddf69a6..cf4946a2 100644 --- a/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/file.test.ts.snap @@ -1,9 +1,11 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`File > crossSerializeAsync > scoped > supports File 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=new File([$R[2]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})))($R[\\"example\\"])"`; +exports[`File > crossSerializeAsync > scoped > supports File 1`] = `"($R=>$R[0]=new File([$R[1]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680}))($R[\\"example\\"])"`; -exports[`File > crossSerializeAsync > supports File 1`] = `"$R[0]=Promise.resolve($R[1]=new File([$R[2]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680}))"`; +exports[`File > crossSerializeAsync > supports File 1`] = `"$R[0]=new File([$R[1]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})"`; -exports[`File > serializeAsync > supports File 1`] = `"Promise.resolve(new File([new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680}))"`; +exports[`File > serializeAsync > supports File 1`] = `"new File([new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})"`; -exports[`File > toJSONAsync > supports File 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":24,\\"i\\":1,\\"c\\":\\"text/plain\\",\\"m\\":\\"hello.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]},\\"b\\":1681027542680}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`File > toCrossJSONAsync > supports File 1`] = `"{\\"t\\":24,\\"i\\":0,\\"c\\":\\"text/plain\\",\\"m\\":\\"hello.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]},\\"b\\":1681027542680}"`; + +exports[`File > toJSONAsync > supports File 1`] = `"{\\"t\\":{\\"t\\":24,\\"i\\":0,\\"c\\":\\"text/plain\\",\\"m\\":\\"hello.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]},\\"b\\":1681027542680},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap index 13036c83..08697eab 100644 --- a/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/form-data.test.ts.snap @@ -4,9 +4,9 @@ exports[`FormData > crossSerialize > scoped > supports FormData 1`] = `"($R=>($R exports[`FormData > crossSerialize > supports FormData 1`] = `"($R[0]=new FormData(),$R[0].append(\\"hello\\",\\"world\\"),$R[0].append(\\"foo\\",\\"bar\\"),$R[0])"`; -exports[`FormData > crossSerializeAsync > scoped > supports FormData 1`] = `"($R=>$R[0]=Promise.resolve(($R[1]=new FormData(),$R[1].append(\\"hello-world\\",$R[2]=new File([$R[3]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),$R[1].append(\\"foo-bar\\",$R[4]=new File([$R[5]=new Uint8Array([70,111,111,32,66,97,114]).buffer],\\"foo-bar.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),$R[1])))($R[\\"example\\"])"`; +exports[`FormData > crossSerializeAsync > scoped > supports FormData 1`] = `"($R=>($R[0]=new FormData(),$R[0].append(\\"hello-world\\",$R[1]=new File([$R[2]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),$R[0].append(\\"foo-bar\\",$R[3]=new File([$R[4]=new Uint8Array([70,111,111,32,66,97,114]).buffer],\\"foo-bar.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),$R[0]))($R[\\"example\\"])"`; -exports[`FormData > crossSerializeAsync > supports FormData 1`] = `"$R[0]=Promise.resolve(($R[1]=new FormData(),$R[1].append(\\"hello-world\\",$R[2]=new File([$R[3]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),$R[1].append(\\"foo-bar\\",$R[4]=new File([$R[5]=new Uint8Array([70,111,111,32,66,97,114]).buffer],\\"foo-bar.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),$R[1]))"`; +exports[`FormData > crossSerializeAsync > supports FormData 1`] = `"($R[0]=new FormData(),$R[0].append(\\"hello-world\\",$R[1]=new File([$R[2]=new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),$R[0].append(\\"foo-bar\\",$R[3]=new File([$R[4]=new Uint8Array([70,111,111,32,66,97,114]).buffer],\\"foo-bar.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),$R[0])"`; exports[`FormData > crossSerializeStream > scoped > supports FormData 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; @@ -18,8 +18,16 @@ exports[`FormData > crossSerializeStream > supports FormData 2`] = `"_$.Ps($R[0] exports[`FormData > serialize > supports FormData 1`] = `"(h=>((h=new FormData(),h.append(\\"hello\\",\\"world\\"),h.append(\\"foo\\",\\"bar\\"),h)))()"`; -exports[`FormData > serializeAsync > supports FormData 1`] = `"(h=>(Promise.resolve((h=new FormData(),h.append(\\"hello-world\\",new File([new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),h.append(\\"foo-bar\\",new File([new Uint8Array([70,111,111,32,66,97,114]).buffer],\\"foo-bar.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),h))))()"`; +exports[`FormData > serializeAsync > supports FormData 1`] = `"(h=>((h=new FormData(),h.append(\\"hello-world\\",new File([new Uint8Array([72,101,108,108,111,32,87,111,114,108,100]).buffer],\\"hello.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),h.append(\\"foo-bar\\",new File([new Uint8Array([70,111,111,32,66,97,114]).buffer],\\"foo-bar.txt\\",{type:\\"text/plain\\",lastModified:1681027542680})),h)))()"`; + +exports[`FormData > toCrossJSON > supports FormData 1`] = `"{\\"t\\":26,\\"i\\":0,\\"e\\":{\\"k\\":[\\"hello\\",\\"foo\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"},{\\"t\\":1,\\"s\\":\\"bar\\"}],\\"s\\":2}}"`; + +exports[`FormData > toCrossJSONAsync > supports FormData 1`] = `"{\\"t\\":26,\\"i\\":0,\\"e\\":{\\"k\\":[\\"hello-world\\",\\"foo-bar\\"],\\"v\\":[{\\"t\\":24,\\"i\\":1,\\"c\\":\\"text/plain\\",\\"m\\":\\"hello.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]},\\"b\\":1681027542680},{\\"t\\":24,\\"i\\":3,\\"c\\":\\"text/plain\\",\\"m\\":\\"foo-bar.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":4,\\"s\\":[70,111,111,32,66,97,114]},\\"b\\":1681027542680}],\\"s\\":2}}"`; + +exports[`FormData > toCrossJSONStream > supports FormData 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`FormData > toCrossJSONStream > supports FormData 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":26,\\"i\\":1,\\"e\\":{\\"k\\":[\\"hello\\",\\"foo\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"},{\\"t\\":1,\\"s\\":\\"bar\\"}],\\"s\\":2}}}"`; exports[`FormData > toJSON > supports FormData 1`] = `"{\\"t\\":{\\"t\\":26,\\"i\\":0,\\"e\\":{\\"k\\":[\\"hello\\",\\"foo\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"},{\\"t\\":1,\\"s\\":\\"bar\\"}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`FormData > toJSONAsync > supports FormData 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":26,\\"i\\":1,\\"e\\":{\\"k\\":[\\"example\\",\\"foo-bar\\"],\\"v\\":[{\\"t\\":24,\\"i\\":2,\\"c\\":\\"text/plain\\",\\"m\\":\\"hello.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":3,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]},\\"b\\":1681027542680},{\\"t\\":24,\\"i\\":4,\\"c\\":\\"text/plain\\",\\"m\\":\\"foo-bar.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":5,\\"s\\":[70,111,111,32,66,97,114]},\\"b\\":1681027542680}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`FormData > toJSONAsync > supports FormData 1`] = `"{\\"t\\":{\\"t\\":26,\\"i\\":0,\\"e\\":{\\"k\\":[\\"hello-world\\",\\"foo-bar\\"],\\"v\\":[{\\"t\\":24,\\"i\\":1,\\"c\\":\\"text/plain\\",\\"m\\":\\"hello.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100]},\\"b\\":1681027542680},{\\"t\\":24,\\"i\\":3,\\"c\\":\\"text/plain\\",\\"m\\":\\"foo-bar.txt\\",\\"f\\":{\\"t\\":21,\\"i\\":4,\\"s\\":[70,111,111,32,66,97,114]},\\"b\\":1681027542680}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap index 37a43a5a..d2d66cd0 100644 --- a/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/headers.test.ts.snap @@ -20,6 +20,14 @@ exports[`Headers > serialize > supports Headers 1`] = `"new Headers({\\"content- exports[`Headers > serializeAsync > supports Headers 1`] = `"Promise.resolve(new Headers({\\"content-encoding\\":\\"gzip\\",\\"content-type\\":\\"text/plain\\"}))"`; +exports[`Headers > toCrossJSON > supports Headers 1`] = `"{\\"t\\":25,\\"i\\":0,\\"e\\":{\\"k\\":[\\"content-encoding\\",\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"gzip\\"},{\\"t\\":1,\\"s\\":\\"text/plain\\"}],\\"s\\":2}}"`; + +exports[`Headers > toCrossJSONAsync > supports Headers 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":25,\\"i\\":1,\\"e\\":{\\"k\\":[\\"content-encoding\\",\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"gzip\\"},{\\"t\\":1,\\"s\\":\\"text/plain\\"}],\\"s\\":2}}}"`; + +exports[`Headers > toCrossJSONStream > supports Headers 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`Headers > toCrossJSONStream > supports Headers 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":25,\\"i\\":1,\\"e\\":{\\"k\\":[\\"content-encoding\\",\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"gzip\\"},{\\"t\\":1,\\"s\\":\\"text/plain\\"}],\\"s\\":2}}}"`; + exports[`Headers > toJSON > supports Headers 1`] = `"{\\"t\\":{\\"t\\":25,\\"i\\":0,\\"e\\":{\\"k\\":[\\"content-encoding\\",\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"gzip\\"},{\\"t\\":1,\\"s\\":\\"text/plain\\"}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; exports[`Headers > toJSONAsync > supports Headers 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":25,\\"i\\":1,\\"e\\":{\\"k\\":[\\"content-encoding\\",\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"gzip\\"},{\\"t\\":1,\\"s\\":\\"text/plain\\"}],\\"s\\":2}}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap index 2e32399e..9ca78866 100644 --- a/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap @@ -27,3 +27,139 @@ exports[`ReadableStream > crossSerializeStream > supports ReadableStream 5`] = ` exports[`ReadableStream > crossSerializeStream > supports ReadableStream errors 1`] = `"$R[0]=_$.S()"`; exports[`ReadableStream > crossSerializeStream > supports ReadableStream errors 2`] = `"_$.St($R[0],$R[1]=Object.assign(new Error(\\"Oops!\\"),{stack:\\"\\"}))"`; + +exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 1`] = ` +{ + "a": undefined, + "b": undefined, + "c": undefined, + "e": undefined, + "f": undefined, + "i": 0, + "l": undefined, + "m": undefined, + "o": undefined, + "p": undefined, + "s": undefined, + "t": 31, + "x": undefined, +} +`; + +exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 2`] = ` +{ + "a": undefined, + "b": undefined, + "c": undefined, + "e": undefined, + "f": { + "a": undefined, + "b": undefined, + "c": undefined, + "e": undefined, + "f": undefined, + "i": undefined, + "l": undefined, + "m": undefined, + "o": undefined, + "p": undefined, + "s": "foo", + "t": 1, + "x": undefined, + }, + "i": 0, + "l": undefined, + "m": undefined, + "o": undefined, + "p": undefined, + "s": undefined, + "t": 32, + "x": undefined, +} +`; + +exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 3`] = ` +{ + "a": undefined, + "b": undefined, + "c": undefined, + "e": undefined, + "f": { + "a": undefined, + "b": undefined, + "c": undefined, + "e": undefined, + "f": undefined, + "i": undefined, + "l": undefined, + "m": undefined, + "o": undefined, + "p": undefined, + "s": "bar", + "t": 1, + "x": undefined, + }, + "i": 0, + "l": undefined, + "m": undefined, + "o": undefined, + "p": undefined, + "s": undefined, + "t": 32, + "x": undefined, +} +`; + +exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 4`] = ` +{ + "a": undefined, + "b": undefined, + "c": undefined, + "e": undefined, + "f": { + "a": undefined, + "b": undefined, + "c": undefined, + "e": undefined, + "f": undefined, + "i": undefined, + "l": undefined, + "m": undefined, + "o": undefined, + "p": undefined, + "s": "baz", + "t": 1, + "x": undefined, + }, + "i": 0, + "l": undefined, + "m": undefined, + "o": undefined, + "p": undefined, + "s": undefined, + "t": 32, + "x": undefined, +} +`; + +exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 5`] = ` +{ + "a": undefined, + "b": undefined, + "c": undefined, + "e": undefined, + "f": undefined, + "i": 0, + "l": undefined, + "m": undefined, + "o": undefined, + "p": undefined, + "s": undefined, + "t": 33, + "x": undefined, +} +`; + +exports[`ReadableStream > toCrossJSONStream > supports ReadableStream errors 1`] = `"{\\"t\\":31,\\"i\\":0}"`; + +exports[`ReadableStream > toCrossJSONStream > supports ReadableStream errors 2`] = `"{\\"t\\":34,\\"i\\":0,\\"f\\":{\\"t\\":13,\\"i\\":1,\\"s\\":0,\\"m\\":\\"Oops!\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap index c6a28619..3d9d2f77 100644 --- a/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap @@ -18,4 +18,12 @@ exports[`Request > crossSerializeStream > supports Request 3`] = `"_$.Sc($R[2])" exports[`Request > serializeAsync > supports Request 1`] = `"new Request(\\"http://localhost:3000/\\",{body:new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,cache:\\"default\\",credentials:\\"same-origin\\",headers:new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),integrity:\\"\\",keepalive:!1,method:\\"POST\\",mode:\\"cors\\",redirect:\\"follow\\",referrer:\\"about:client\\",referrerPolicy:\\"\\"})"`; +exports[`Request > toCrossJSONStream > supports Request 1`] = `"{\\"t\\":35,\\"i\\":0,\\"s\\":\\"http://localhost:3000/\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"body\\",\\"cache\\",\\"credentials\\",\\"headers\\",\\"integrity\\",\\"keepalive\\",\\"method\\",\\"mode\\",\\"redirect\\",\\"referrer\\",\\"referrerPolicy\\"],\\"v\\":[{\\"t\\":31,\\"i\\":2},{\\"t\\":1,\\"s\\":\\"default\\"},{\\"t\\":1,\\"s\\":\\"same-origin\\"},{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":2,\\"s\\":3},{\\"t\\":1,\\"s\\":\\"POST\\"},{\\"t\\":1,\\"s\\":\\"cors\\"},{\\"t\\":1,\\"s\\":\\"follow\\"},{\\"t\\":1,\\"s\\":\\"about:client\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":11},\\"o\\":0,\\"x\\":{}}}"`; + +exports[`Request > toCrossJSONStream > supports Request 2`] = `"{\\"t\\":32,\\"i\\":2,\\"f\\":{\\"t\\":15,\\"i\\":4,\\"l\\":12,\\"c\\":\\"Uint8Array\\",\\"f\\":{\\"t\\":21,\\"i\\":5,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},\\"b\\":0}}"`; + +exports[`Request > toCrossJSONStream > supports Request 3`] = `"{\\"t\\":33,\\"i\\":2}"`; + exports[`Request > toJSONAsync > supports Request 1`] = `"{\\"t\\":{\\"t\\":35,\\"i\\":0,\\"s\\":\\"http://localhost:3000/\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"body\\",\\"cache\\",\\"credentials\\",\\"headers\\",\\"integrity\\",\\"keepalive\\",\\"method\\",\\"mode\\",\\"redirect\\",\\"referrer\\",\\"referrerPolicy\\"],\\"v\\":[{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":1,\\"s\\":\\"default\\"},{\\"t\\":1,\\"s\\":\\"same-origin\\"},{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":2,\\"s\\":3},{\\"t\\":1,\\"s\\":\\"POST\\"},{\\"t\\":1,\\"s\\":\\"cors\\"},{\\"t\\":1,\\"s\\":\\"follow\\"},{\\"t\\":1,\\"s\\":\\"about:client\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":11},\\"o\\":0,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; + +exports[`Request > toJSONAsync > supports Request 2`] = `"{\\"t\\":35,\\"i\\":0,\\"s\\":\\"http://localhost:3000/\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"body\\",\\"cache\\",\\"credentials\\",\\"headers\\",\\"integrity\\",\\"keepalive\\",\\"method\\",\\"mode\\",\\"redirect\\",\\"referrer\\",\\"referrerPolicy\\"],\\"v\\":[{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":1,\\"s\\":\\"default\\"},{\\"t\\":1,\\"s\\":\\"same-origin\\"},{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":2,\\"s\\":3},{\\"t\\":1,\\"s\\":\\"POST\\"},{\\"t\\":1,\\"s\\":\\"cors\\"},{\\"t\\":1,\\"s\\":\\"follow\\"},{\\"t\\":1,\\"s\\":\\"about:client\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":11},\\"o\\":0,\\"x\\":{}}}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap index 5ad86d31..c722ccd6 100644 --- a/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap @@ -18,4 +18,12 @@ exports[`Response > crossSerializeStream > supports Response 3`] = `"_$.Sc($R[1] exports[`Response > serializeAsync > supports Response 1`] = `"new Response(new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,{headers:new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),status:200,statusText:\\"\\"})"`; +exports[`Response > toCrossJSONStream > supports Response 1`] = `"{\\"t\\":36,\\"i\\":0,\\"a\\":[{\\"t\\":31,\\"i\\":1},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"headers\\",\\"status\\",\\"statusText\\"],\\"v\\":[{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":0,\\"s\\":200},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}]}"`; + +exports[`Response > toCrossJSONStream > supports Response 2`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":15,\\"i\\":4,\\"l\\":12,\\"c\\":\\"Uint8Array\\",\\"f\\":{\\"t\\":21,\\"i\\":5,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},\\"b\\":0}}"`; + +exports[`Response > toCrossJSONStream > supports Response 3`] = `"{\\"t\\":33,\\"i\\":1}"`; + exports[`Response > toJSONAsync > supports Response 1`] = `"{\\"t\\":{\\"t\\":36,\\"i\\":0,\\"a\\":[{\\"t\\":21,\\"i\\":1,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"headers\\",\\"status\\",\\"statusText\\"],\\"v\\":[{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":0,\\"s\\":200},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}]},\\"f\\":16383,\\"m\\":[]}"`; + +exports[`Response > toJSONAsync > supports Response 2`] = `"{\\"t\\":36,\\"i\\":0,\\"a\\":[{\\"t\\":21,\\"i\\":1,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"headers\\",\\"status\\",\\"statusText\\"],\\"v\\":[{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":0,\\"s\\":200},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap index 4c99f18c..e3e91837 100644 --- a/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/url-search-params.test.ts.snap @@ -20,6 +20,14 @@ exports[`URLSearchParams > serialize > supports URLSearchParams 1`] = `"new URLS exports[`URLSearchParams > serializeAsync > supports URLSearchParams 1`] = `"Promise.resolve(new URLSearchParams(\\"hello=world&foo=bar\\"))"`; +exports[`URLSearchParams > toCrossJSONStream > supports URLSearchParams 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`URLSearchParams > toCrossJSONStream > supports URLSearchParams 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":19,\\"i\\":1,\\"s\\":\\"hello=world&foo=bar\\"}}"`; + exports[`URLSearchParams > toJSON > supports URLSearchParams 1`] = `"{\\"t\\":{\\"t\\":19,\\"i\\":0,\\"s\\":\\"hello=world&foo=bar\\"},\\"f\\":16383,\\"m\\":[]}"`; +exports[`URLSearchParams > toJSON > supports URLSearchParams 2`] = `"{\\"t\\":19,\\"i\\":0,\\"s\\":\\"hello=world&foo=bar\\"}"`; + exports[`URLSearchParams > toJSONAsync > supports URLSearchParams 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":19,\\"i\\":1,\\"s\\":\\"hello=world&foo=bar\\"}},\\"f\\":16383,\\"m\\":[]}"`; + +exports[`URLSearchParams > toJSONAsync > supports URLSearchParams 2`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":19,\\"i\\":1,\\"s\\":\\"hello=world&foo=bar\\"}}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap index b6fd200a..f8147f3a 100644 --- a/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/url.test.ts.snap @@ -20,6 +20,14 @@ exports[`URL > serialize > supports URL 1`] = `"new URL(\\"https://github.com/lx exports[`URL > serializeAsync > supports URL 1`] = `"Promise.resolve(new URL(\\"https://github.com/lxsmnsyc/seroval?hello=world\\"))"`; +exports[`URL > toCrossJSONStream > supports URL 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`URL > toCrossJSONStream > supports URL 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":18,\\"i\\":1,\\"s\\":\\"https://github.com/lxsmnsyc/seroval?hello=world\\"}}"`; + exports[`URL > toJSON > supports URL 1`] = `"{\\"t\\":{\\"t\\":18,\\"i\\":0,\\"s\\":\\"https://github.com/lxsmnsyc/seroval?hello=world\\"},\\"f\\":16383,\\"m\\":[]}"`; +exports[`URL > toJSON > supports URL 2`] = `"{\\"t\\":18,\\"i\\":0,\\"s\\":\\"https://github.com/lxsmnsyc/seroval?hello=world\\"}"`; + exports[`URL > toJSONAsync > supports URL 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":18,\\"i\\":1,\\"s\\":\\"https://github.com/lxsmnsyc/seroval?hello=world\\"}},\\"f\\":16383,\\"m\\":[]}"`; + +exports[`URL > toJSONAsync > supports URL 2`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":18,\\"i\\":1,\\"s\\":\\"https://github.com/lxsmnsyc/seroval?hello=world\\"}}"`; diff --git a/packages/seroval/test/web-api/blob.test.ts b/packages/seroval/test/web-api/blob.test.ts index aad0ade3..df2ea5a0 100644 --- a/packages/seroval/test/web-api/blob.test.ts +++ b/packages/seroval/test/web-api/blob.test.ts @@ -2,54 +2,59 @@ import { describe, it, expect } from 'vitest'; import { crossSerializeAsync, deserialize, + fromCrossJSON, fromJSON, serializeAsync, + toCrossJSONAsync, toJSONAsync, } from '../../src'; +const EXAMPLE = new Blob(['Hello World'], { + type: 'text/plain', +}); describe('Blob', () => { describe('serializeAsync', () => { it('supports Blob', async () => { - const example = new Blob(['Hello World'], { - type: 'text/plain', - }); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(EXAMPLE); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = deserialize(result); expect(back).toBeInstanceOf(Blob); - expect(await back.text()).toBe(await example.text()); - expect(back.type).toBe(example.type); + expect(await back.text()).toBe(await EXAMPLE.text()); + expect(back.type).toBe(EXAMPLE.type); }); }); describe('toJSONAsync', () => { it('supports Blob', async () => { - const example = new Blob(['Hello World'], { - type: 'text/plain', - }); - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(Blob); - expect(await back.text()).toBe(await example.text()); - expect(back.type).toBe(example.type); + expect(await back.text()).toBe(await EXAMPLE.text()); + expect(back.type).toBe(EXAMPLE.type); }); }); describe('crossSerializeAsync', () => { it('supports Blob', async () => { - const example = new Blob(['Hello World'], { - type: 'text/plain', - }); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Blob', async () => { - const example = new Blob(['Hello World'], { - type: 'text/plain', - }); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); + describe('toCrossJSONAsync', () => { + it('supports Blob', async () => { + const result = await toCrossJSONAsync(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Blob); + expect(await back.text()).toBe(await EXAMPLE.text()); + expect(back.type).toBe(EXAMPLE.type); + }); + }); }); diff --git a/packages/seroval/test/web-api/custom-event.test.ts b/packages/seroval/test/web-api/custom-event.test.ts index 90eeec3b..fbd47160 100644 --- a/packages/seroval/test/web-api/custom-event.test.ts +++ b/packages/seroval/test/web-api/custom-event.test.ts @@ -4,9 +4,13 @@ import { crossSerializeAsync, crossSerializeStream, deserialize, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../../src'; @@ -15,76 +19,69 @@ const EXAMPLE_EVENT_TYPE = 'example'; const EXAMPLE_DETAIL: Record = {}; EXAMPLE_DETAIL.self = EXAMPLE_DETAIL; const EXAMPLE_OPTIONS: CustomEventInit = { detail: EXAMPLE_DETAIL }; +const EXAMPLE = new CustomEvent(EXAMPLE_EVENT_TYPE, EXAMPLE_OPTIONS); describe('CustomEvent', () => { describe('serialize', () => { it('supports CustomEvent', () => { - const example = new CustomEvent(EXAMPLE_EVENT_TYPE, EXAMPLE_OPTIONS); - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back).toBeInstanceOf(CustomEvent); }); }); describe('serializeAsync', () => { it('supports CustomEvent', async () => { - const example = new CustomEvent(EXAMPLE_EVENT_TYPE, EXAMPLE_OPTIONS); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = await deserialize>(result); expect(back).toBeInstanceOf(CustomEvent); }); }); describe('toJSON', () => { it('supports CustomEvent', () => { - const example = new CustomEvent(EXAMPLE_EVENT_TYPE, EXAMPLE_OPTIONS); - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(CustomEvent); }); }); describe('toJSONAsync', () => { it('supports CustomEvent', async () => { - const example = new CustomEvent(EXAMPLE_EVENT_TYPE, EXAMPLE_OPTIONS); - const result = await toJSONAsync(Promise.resolve(example)); + const example = Promise.resolve(EXAMPLE); + const result = await toJSONAsync(example); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = await fromJSON(result); expect(back).toBeInstanceOf(CustomEvent); }); }); describe('crossSerialize', () => { it('supports CustomEvent', () => { - const example = new CustomEvent(EXAMPLE_EVENT_TYPE, EXAMPLE_OPTIONS); - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports CustomEvent', () => { - const example = new CustomEvent(EXAMPLE_EVENT_TYPE, EXAMPLE_OPTIONS); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports CustomEvent', async () => { - const example = new CustomEvent(EXAMPLE_EVENT_TYPE, EXAMPLE_OPTIONS); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports CustomEvent', async () => { - const example = new CustomEvent(EXAMPLE_EVENT_TYPE, EXAMPLE_OPTIONS); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports CustomEvent', async () => new Promise((done) => { - const example = new CustomEvent(EXAMPLE_EVENT_TYPE, EXAMPLE_OPTIONS); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -95,8 +92,7 @@ describe('CustomEvent', () => { })); describe('scoped', () => { it('supports CustomEvent', async () => new Promise((done) => { - const example = new CustomEvent(EXAMPLE_EVENT_TYPE, EXAMPLE_OPTIONS); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -108,4 +104,37 @@ describe('CustomEvent', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports CustomEvent', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(CustomEvent); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports CustomEvent', async () => { + const example = Promise.resolve(EXAMPLE); + const result = await toCrossJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(CustomEvent); + }); + }); + describe('toCrossJSONStream', () => { + it('supports CustomEvent', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); diff --git a/packages/seroval/test/web-api/dom-exception.test.ts b/packages/seroval/test/web-api/dom-exception.test.ts index 7c0492bf..bc3ee8db 100644 --- a/packages/seroval/test/web-api/dom-exception.test.ts +++ b/packages/seroval/test/web-api/dom-exception.test.ts @@ -4,93 +4,89 @@ import { crossSerializeAsync, crossSerializeStream, deserialize, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../../src'; const EXAMPLE_MESSAGE = 'This is an example message.'; const EXAMPLE_NAME = 'Example'; +const EXAMPLE = new DOMException(EXAMPLE_MESSAGE, EXAMPLE_NAME); describe('DOMException', () => { describe('serialize', () => { it('supports DOMException', () => { - const example = new DOMException(EXAMPLE_MESSAGE, EXAMPLE_NAME); - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back).toBeInstanceOf(DOMException); - expect(back.message).toBe(example.message); - expect(back.name).toBe(example.name); + expect(back.message).toBe(EXAMPLE.message); + expect(back.name).toBe(EXAMPLE.name); }); }); describe('serializeAsync', () => { it('supports DOMException', async () => { - const example = new DOMException(EXAMPLE_MESSAGE, EXAMPLE_NAME); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = await deserialize>(result); expect(back).toBeInstanceOf(DOMException); - expect(back.message).toBe(example.message); - expect(back.name).toBe(example.name); + expect(back.message).toBe(EXAMPLE.message); + expect(back.name).toBe(EXAMPLE.name); }); }); describe('toJSON', () => { it('supports DOMException', () => { - const example = new DOMException(EXAMPLE_MESSAGE, EXAMPLE_NAME); - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(DOMException); - expect(back.message).toBe(example.message); - expect(back.name).toBe(example.name); + expect(back.message).toBe(EXAMPLE.message); + expect(back.name).toBe(EXAMPLE.name); }); }); describe('toJSONAsync', () => { it('supports DOMException', async () => { - const example = new DOMException(EXAMPLE_MESSAGE, EXAMPLE_NAME); - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = await fromJSON>(result); expect(back).toBeInstanceOf(DOMException); - expect(back.message).toBe(example.message); - expect(back.name).toBe(example.name); + expect(back.message).toBe(EXAMPLE.message); + expect(back.name).toBe(EXAMPLE.name); }); }); describe('crossSerialize', () => { it('supports DOMException', () => { - const example = new DOMException(EXAMPLE_MESSAGE, EXAMPLE_NAME); - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports DOMException', () => { - const example = new DOMException(EXAMPLE_MESSAGE, EXAMPLE_NAME); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports DOMException', async () => { - const example = new DOMException(EXAMPLE_MESSAGE, EXAMPLE_NAME); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports DOMException', async () => { - const example = new DOMException(EXAMPLE_MESSAGE, EXAMPLE_NAME); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports DOMException', async () => new Promise((done) => { - const example = new DOMException(EXAMPLE_MESSAGE, EXAMPLE_NAME); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -101,8 +97,7 @@ describe('DOMException', () => { })); describe('scoped', () => { it('supports DOMException', async () => new Promise((done) => { - const example = new DOMException(EXAMPLE_MESSAGE, EXAMPLE_NAME); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -114,4 +109,37 @@ describe('DOMException', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports DOMException', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(DOMException); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports DOMException', async () => { + const example = Promise.resolve(EXAMPLE); + const result = await toCrossJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(DOMException); + }); + }); + describe('toCrossJSONStream', () => { + it('supports DOMException', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); diff --git a/packages/seroval/test/web-api/event.test.ts b/packages/seroval/test/web-api/event.test.ts index dad536e6..66c7eb27 100644 --- a/packages/seroval/test/web-api/event.test.ts +++ b/packages/seroval/test/web-api/event.test.ts @@ -4,84 +4,80 @@ import { crossSerializeAsync, crossSerializeStream, deserialize, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../../src'; const EXAMPLE_EVENT_TYPE = 'example'; +const EXAMPLE = new Event(EXAMPLE_EVENT_TYPE); describe('Event', () => { describe('serialize', () => { it('supports Event', () => { - const example = new Event(EXAMPLE_EVENT_TYPE); - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back).toBeInstanceOf(Event); }); }); describe('serializeAsync', () => { it('supports Event', async () => { - const example = new Event(EXAMPLE_EVENT_TYPE); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = await deserialize>(result); expect(back).toBeInstanceOf(Event); }); }); describe('toJSON', () => { it('supports Event', () => { - const example = new Event(EXAMPLE_EVENT_TYPE); - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(Event); }); }); describe('toJSONAsync', () => { it('supports Event', async () => { - const example = new Event(EXAMPLE_EVENT_TYPE); - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = await fromJSON>(result); expect(back).toBeInstanceOf(Event); }); }); describe('crossSerialize', () => { it('supports Event', () => { - const example = new Event(EXAMPLE_EVENT_TYPE); - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Event', () => { - const example = new Event(EXAMPLE_EVENT_TYPE); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports Event', async () => { - const example = new Event(EXAMPLE_EVENT_TYPE); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Event', async () => { - const example = new Event(EXAMPLE_EVENT_TYPE); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports Event', async () => new Promise((done) => { - const example = new Event(EXAMPLE_EVENT_TYPE); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -92,8 +88,7 @@ describe('Event', () => { })); describe('scoped', () => { it('supports Event', async () => new Promise((done) => { - const example = new Event(EXAMPLE_EVENT_TYPE); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -105,4 +100,37 @@ describe('Event', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports Event', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Event); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports Event', async () => { + const example = Promise.resolve(EXAMPLE); + const result = await toCrossJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Event); + }); + }); + describe('toCrossJSONStream', () => { + it('supports Event', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); diff --git a/packages/seroval/test/web-api/file.test.ts b/packages/seroval/test/web-api/file.test.ts index 7c264004..7f321e0e 100644 --- a/packages/seroval/test/web-api/file.test.ts +++ b/packages/seroval/test/web-api/file.test.ts @@ -2,58 +2,61 @@ import { describe, it, expect } from 'vitest'; import { crossSerializeAsync, deserialize, + fromCrossJSON, fromJSON, serializeAsync, + toCrossJSONAsync, toJSONAsync, } from '../../src'; +const EXAMPLE = new File(['Hello World'], 'hello.txt', { + type: 'text/plain', + lastModified: 1681027542680, +}); + describe('File', () => { describe('serializeAsync', () => { it('supports File', async () => { - const example = new File(['Hello World'], 'hello.txt', { - type: 'text/plain', - lastModified: 1681027542680, - }); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(EXAMPLE); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = deserialize(result); expect(back).toBeInstanceOf(File); - expect(await back.text()).toBe(await example.text()); - expect(back.type).toBe(example.type); + expect(await back.text()).toBe(await EXAMPLE.text()); + expect(back.type).toBe(EXAMPLE.type); }); }); describe('toJSONAsync', () => { it('supports File', async () => { - const example = new File(['Hello World'], 'hello.txt', { - type: 'text/plain', - lastModified: 1681027542680, - }); - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(File); - expect(await back.text()).toBe(await example.text()); - expect(back.type).toBe(example.type); + expect(await back.text()).toBe(await EXAMPLE.text()); + expect(back.type).toBe(EXAMPLE.type); }); }); describe('crossSerializeAsync', () => { it('supports File', async () => { - const example = new File(['Hello World'], 'hello.txt', { - type: 'text/plain', - lastModified: 1681027542680, - }); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports File', async () => { - const example = new File(['Hello World'], 'hello.txt', { - type: 'text/plain', - lastModified: 1681027542680, - }); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); + describe('toCrossJSONAsync', () => { + it('supports File', async () => { + const result = await toCrossJSONAsync(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(File); + expect(await back.text()).toBe(await EXAMPLE.text()); + expect(back.type).toBe(EXAMPLE.type); + }); + }); }); diff --git a/packages/seroval/test/web-api/form-data.test.ts b/packages/seroval/test/web-api/form-data.test.ts index c6b10628..6408736a 100644 --- a/packages/seroval/test/web-api/form-data.test.ts +++ b/packages/seroval/test/web-api/form-data.test.ts @@ -4,125 +4,91 @@ import { crossSerializeAsync, crossSerializeStream, deserialize, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../../src'; +const SYNC_EXAMPLE = new FormData(); +SYNC_EXAMPLE.set('hello', 'world'); +SYNC_EXAMPLE.set('foo', 'bar'); + +const ASYNC_EXAMPLE = new FormData(); +ASYNC_EXAMPLE.set('hello-world', new File(['Hello World'], 'hello.txt', { + type: 'text/plain', + lastModified: 1681027542680, +})); +ASYNC_EXAMPLE.set('foo-bar', new File(['Foo Bar'], 'foo-bar.txt', { + type: 'text/plain', + lastModified: 1681027542680, +})); + describe('FormData', () => { describe('serialize', () => { it('supports FormData', () => { - const example = new FormData(); - example.set('hello', 'world'); - example.set('foo', 'bar'); - const result = serialize(example); + const result = serialize(SYNC_EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back).toBeInstanceOf(FormData); }); }); describe('serializeAsync', () => { it('supports FormData', async () => { - const example = new FormData(); - example.set('hello-world', new File(['Hello World'], 'hello.txt', { - type: 'text/plain', - lastModified: 1681027542680, - })); - example.set('foo-bar', new File(['Foo Bar'], 'foo-bar.txt', { - type: 'text/plain', - lastModified: 1681027542680, - })); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(ASYNC_EXAMPLE); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = deserialize(result); expect(back).toBeInstanceOf(FormData); }); }); describe('toJSON', () => { it('supports FormData', () => { - const example = new FormData(); - example.set('hello', 'world'); - example.set('foo', 'bar'); - const result = toJSON(example); + const result = toJSON(SYNC_EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(FormData); }); }); describe('toJSONAsync', () => { it('supports FormData', async () => { - const example = new FormData(); - example.set('example', new File(['Hello World'], 'hello.txt', { - type: 'text/plain', - lastModified: 1681027542680, - })); - example.set('foo-bar', new File(['Foo Bar'], 'foo-bar.txt', { - type: 'text/plain', - lastModified: 1681027542680, - })); - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(ASYNC_EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(FormData); - expect(String(back)).toBe(String(example)); }); }); describe('crossSerialize', () => { it('supports FormData', () => { - const example = new FormData(); - example.set('hello', 'world'); - example.set('foo', 'bar'); - const result = crossSerialize(example); + const result = crossSerialize(SYNC_EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports FormData', () => { - const example = new FormData(); - example.set('hello', 'world'); - example.set('foo', 'bar'); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(SYNC_EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports FormData', async () => { - const example = new FormData(); - example.set('hello-world', new File(['Hello World'], 'hello.txt', { - type: 'text/plain', - lastModified: 1681027542680, - })); - example.set('foo-bar', new File(['Foo Bar'], 'foo-bar.txt', { - type: 'text/plain', - lastModified: 1681027542680, - })); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(ASYNC_EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports FormData', async () => { - const example = new FormData(); - example.set('hello-world', new File(['Hello World'], 'hello.txt', { - type: 'text/plain', - lastModified: 1681027542680, - })); - example.set('foo-bar', new File(['Foo Bar'], 'foo-bar.txt', { - type: 'text/plain', - lastModified: 1681027542680, - })); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(ASYNC_EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports FormData', async () => new Promise((done) => { - const example = new FormData(); - example.set('hello', 'world'); - example.set('foo', 'bar'); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(SYNC_EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -133,10 +99,7 @@ describe('FormData', () => { })); describe('scoped', () => { it('supports FormData', async () => new Promise((done) => { - const example = new FormData(); - example.set('hello', 'world'); - example.set('foo', 'bar'); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(SYNC_EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -148,4 +111,36 @@ describe('FormData', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports FormData', () => { + const result = toCrossJSON(SYNC_EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(FormData); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports FormData', async () => { + const result = await toCrossJSONAsync(ASYNC_EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(FormData); + }); + }); + describe('toCrossJSONStream', () => { + it('supports FormData', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(SYNC_EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); diff --git a/packages/seroval/test/web-api/headers.test.ts b/packages/seroval/test/web-api/headers.test.ts index c3ea0727..71812948 100644 --- a/packages/seroval/test/web-api/headers.test.ts +++ b/packages/seroval/test/web-api/headers.test.ts @@ -4,113 +4,86 @@ import { crossSerializeAsync, crossSerializeStream, deserialize, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../../src'; +const EXAMPLE = new Headers([ + ['Content-Type', 'text/plain'], + ['Content-Encoding', 'gzip'], +]); + describe('Headers', () => { describe('serialize', () => { it('supports Headers', () => { - const example = new Headers([ - ['Content-Type', 'text/plain'], - ['Content-Encoding', 'gzip'], - ]); - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back).toBeInstanceOf(Headers); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('serializeAsync', () => { it('supports Headers', async () => { - const example = new Headers([ - ['Content-Type', 'text/plain'], - ['Content-Encoding', 'gzip'], - ]); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = await deserialize>(result); expect(back).toBeInstanceOf(Headers); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('toJSON', () => { it('supports Headers', () => { - const example = new Headers([ - ['Content-Type', 'text/plain'], - ['Content-Encoding', 'gzip'], - ]); - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); const back = fromJSON(result); expect(back).toBeInstanceOf(Headers); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('toJSONAsync', () => { it('supports Headers', async () => { - const example = new Headers([ - ['Content-Type', 'text/plain'], - ['Content-Encoding', 'gzip'], - ]); - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = await fromJSON>(result); expect(back).toBeInstanceOf(Headers); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('crossSerialize', () => { it('supports Headers', () => { - const example = new Headers([ - ['Content-Type', 'text/plain'], - ['Content-Encoding', 'gzip'], - ]); - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Headers', () => { - const example = new Headers([ - ['Content-Type', 'text/plain'], - ['Content-Encoding', 'gzip'], - ]); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports Headers', async () => { - const example = new Headers([ - ['Content-Type', 'text/plain'], - ['Content-Encoding', 'gzip'], - ]); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Headers', async () => { - const example = new Headers([ - ['Content-Type', 'text/plain'], - ['Content-Encoding', 'gzip'], - ]); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports Headers', async () => new Promise((done) => { - const example = new Headers([ - ['Content-Type', 'text/plain'], - ['Content-Encoding', 'gzip'], - ]); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -121,11 +94,7 @@ describe('Headers', () => { })); describe('scoped', () => { it('supports Headers', async () => new Promise((done) => { - const example = new Headers([ - ['Content-Type', 'text/plain'], - ['Content-Encoding', 'gzip'], - ]); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -137,4 +106,37 @@ describe('Headers', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports Headers', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Headers); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports Headers', async () => { + const example = Promise.resolve(EXAMPLE); + const result = await toCrossJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Headers); + }); + }); + describe('toCrossJSONStream', () => { + it('supports Headers', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); diff --git a/packages/seroval/test/web-api/readable-stream.test.ts b/packages/seroval/test/web-api/readable-stream.test.ts index 69ac8ce7..2deb6cd7 100644 --- a/packages/seroval/test/web-api/readable-stream.test.ts +++ b/packages/seroval/test/web-api/readable-stream.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { - crossSerializeStream, + crossSerializeStream, toCrossJSONStream, } from '../../src'; describe('ReadableStream', () => { @@ -80,4 +80,41 @@ describe('ReadableStream', () => { })); }); }); + describe('toCrossJSONStream', () => { + it('supports ReadableStream', async () => new Promise((done) => { + const example = new ReadableStream({ + start(controller): void { + controller.enqueue('foo'); + controller.enqueue('bar'); + controller.enqueue('baz'); + controller.close(); + }, + }); + toCrossJSONStream(example, { + onParse(data) { + expect(data).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports ReadableStream errors', async () => new Promise((done) => { + const example = new ReadableStream({ + start(controller): void { + const error = new Error('Oops!'); + error.stack = ''; + controller.error(error); + }, + }); + toCrossJSONStream(example, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); diff --git a/packages/seroval/test/web-api/request.test.ts b/packages/seroval/test/web-api/request.test.ts index fe80e468..5b2f70bf 100644 --- a/packages/seroval/test/web-api/request.test.ts +++ b/packages/seroval/test/web-api/request.test.ts @@ -3,8 +3,11 @@ import { crossSerializeAsync, crossSerializeStream, deserialize, + fromCrossJSON, fromJSON, serializeAsync, + toCrossJSONAsync, + toCrossJSONStream, toJSONAsync, } from '../../src'; @@ -20,7 +23,7 @@ describe('Request', () => { }); const result = await serializeAsync(example); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = deserialize(result); expect(back).toBeInstanceOf(Request); expect(await back.text()).toBe(await example.text()); expect(back.url).toBe(example.url); @@ -35,7 +38,7 @@ describe('Request', () => { }); const result = await toJSONAsync(example); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(Request); expect(await back.text()).toBe(await example.text()); expect(back.url).toBe(example.url); @@ -62,7 +65,6 @@ describe('Request', () => { }); }); }); - describe('crossSerializeStream', () => { it('supports Request', async () => new Promise((done) => { const example = new Request(EXAMPLE_URL, { @@ -96,4 +98,37 @@ describe('Request', () => { })); }); }); + describe('toJSONAsync', () => { + it('supports Request', async () => { + const example = new Request(EXAMPLE_URL, { + method: 'POST', + body: EXAMPLE_BODY, + }); + const result = await toCrossJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Request); + expect(await back.text()).toBe(await example.text()); + expect(back.url).toBe(example.url); + expect(back.method).toBe(example.method); + }); + }); + describe('toCrossJSONStream', () => { + it('supports Request', async () => new Promise((done) => { + const example = new Request(EXAMPLE_URL, { + method: 'POST', + body: EXAMPLE_BODY, + }); + toCrossJSONStream(example, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); diff --git a/packages/seroval/test/web-api/response.test.ts b/packages/seroval/test/web-api/response.test.ts index 4e824db2..65e5c655 100644 --- a/packages/seroval/test/web-api/response.test.ts +++ b/packages/seroval/test/web-api/response.test.ts @@ -3,8 +3,11 @@ import { crossSerializeAsync, crossSerializeStream, deserialize, + fromCrossJSON, fromJSON, serializeAsync, + toCrossJSONAsync, + toCrossJSONStream, toJSONAsync, } from '../../src'; @@ -16,7 +19,7 @@ describe('Response', () => { const example = new Response(EXAMPLE_BODY); const result = await serializeAsync(example); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = deserialize(result); expect(back).toBeInstanceOf(Response); expect(await back.text()).toBe(await example.text()); }); @@ -26,7 +29,7 @@ describe('Response', () => { const example = new Response(EXAMPLE_BODY); const result = await toJSONAsync(example); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(Response); expect(await back.text()).toBe(await example.text()); }); @@ -73,4 +76,29 @@ describe('Response', () => { })); }); }); + describe('toJSONAsync', () => { + it('supports Response', async () => { + const example = new Response(EXAMPLE_BODY); + const result = await toCrossJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Response); + expect(await back.text()).toBe(await example.text()); + }); + }); + describe('toCrossJSONStream', () => { + it('supports Response', async () => new Promise((done) => { + const example = new Response(EXAMPLE_BODY); + toCrossJSONStream(example, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); diff --git a/packages/seroval/test/web-api/url-search-params.test.ts b/packages/seroval/test/web-api/url-search-params.test.ts index e721de50..190538df 100644 --- a/packages/seroval/test/web-api/url-search-params.test.ts +++ b/packages/seroval/test/web-api/url-search-params.test.ts @@ -4,86 +4,83 @@ import { crossSerializeAsync, crossSerializeStream, deserialize, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../../src'; +const EXAMPLE = new URLSearchParams('hello=world&foo=bar'); + describe('URLSearchParams', () => { describe('serialize', () => { it('supports URLSearchParams', () => { - const example = new URLSearchParams('hello=world&foo=bar'); - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back).toBeInstanceOf(URLSearchParams); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('serializeAsync', () => { it('supports URLSearchParams', async () => { - const example = new URLSearchParams('hello=world&foo=bar'); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = await deserialize>(result); expect(back).toBeInstanceOf(URLSearchParams); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('toJSON', () => { it('supports URLSearchParams', () => { - const example = new URLSearchParams('hello=world&foo=bar'); - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(URLSearchParams); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('toJSONAsync', () => { it('supports URLSearchParams', async () => { - const example = new URLSearchParams('hello=world&foo=bar'); - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = await fromJSON>(result); expect(back).toBeInstanceOf(URLSearchParams); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('crossSerialize', () => { it('supports URLSearchParams', () => { - const example = new URLSearchParams('hello=world&foo=bar'); - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports URLSearchParams', () => { - const example = new URLSearchParams('hello=world&foo=bar'); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports URLSearchParams', async () => { - const example = new URLSearchParams('hello=world&foo=bar'); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports URLSearchParams', async () => { - const example = new URLSearchParams('hello=world&foo=bar'); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports URLSearchParams', async () => new Promise((done) => { - const example = new URLSearchParams('hello=world&foo=bar'); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -94,8 +91,7 @@ describe('URLSearchParams', () => { })); describe('scoped', () => { it('supports URLSearchParams', async () => new Promise((done) => { - const example = new URLSearchParams('hello=world&foo=bar'); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -107,4 +103,38 @@ describe('URLSearchParams', () => { })); }); }); + describe('toJSON', () => { + it('supports URLSearchParams', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(URLSearchParams); + expect(String(back)).toBe(String(EXAMPLE)); + }); + }); + describe('toJSONAsync', () => { + it('supports URLSearchParams', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(URLSearchParams); + expect(String(back)).toBe(String(EXAMPLE)); + }); + }); + describe('toCrossJSONStream', () => { + it('supports URLSearchParams', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); diff --git a/packages/seroval/test/web-api/url.test.ts b/packages/seroval/test/web-api/url.test.ts index 1458b856..3ea8aa36 100644 --- a/packages/seroval/test/web-api/url.test.ts +++ b/packages/seroval/test/web-api/url.test.ts @@ -4,86 +4,83 @@ import { crossSerializeAsync, crossSerializeStream, deserialize, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../../src'; +const EXAMPLE = new URL('https://github.com/lxsmnsyc/seroval?hello=world'); + describe('URL', () => { describe('serialize', () => { it('supports URL', () => { - const example = new URL('https://github.com/lxsmnsyc/seroval?hello=world'); - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back).toBeInstanceOf(URL); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('serializeAsync', () => { it('supports URL', async () => { - const example = new URL('https://github.com/lxsmnsyc/seroval?hello=world'); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = await deserialize>(result); expect(back).toBeInstanceOf(URL); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('toJSON', () => { it('supports URL', () => { - const example = new URL('https://github.com/lxsmnsyc/seroval?hello=world'); - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(URL); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('toJSONAsync', () => { it('supports URL', async () => { - const example = new URL('https://github.com/lxsmnsyc/seroval?hello=world'); - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); const back = await fromJSON>(result); expect(back).toBeInstanceOf(URL); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('crossSerialize', () => { it('supports URL', () => { - const example = new URL('https://github.com/lxsmnsyc/seroval?hello=world'); - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports URL', () => { - const example = new URL('https://github.com/lxsmnsyc/seroval?hello=world'); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports URL', async () => { - const example = new URL('https://github.com/lxsmnsyc/seroval?hello=world'); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports URL', async () => { - const example = new URL('https://github.com/lxsmnsyc/seroval?hello=world'); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports URL', async () => new Promise((done) => { - const example = new URL('https://github.com/lxsmnsyc/seroval?hello=world'); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -94,8 +91,7 @@ describe('URL', () => { })); describe('scoped', () => { it('supports URL', async () => new Promise((done) => { - const example = new URL('https://github.com/lxsmnsyc/seroval?hello=world'); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -107,4 +103,38 @@ describe('URL', () => { })); }); }); + describe('toJSON', () => { + it('supports URL', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(URL); + expect(String(back)).toBe(String(EXAMPLE)); + }); + }); + describe('toJSONAsync', () => { + it('supports URL', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(URL); + expect(String(back)).toBe(String(EXAMPLE)); + }); + }); + describe('toCrossJSONStream', () => { + it('supports URL', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From 771ccceb10db376e1335f3c3f5718486e37820ed Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 01:08:40 +0800 Subject: [PATCH 38/82] Update array test --- .../test/__snapshots__/array.test.ts.snap | 18 ++ packages/seroval/test/array.test.ts | 193 +++++++++++------- 2 files changed, 136 insertions(+), 75 deletions(-) diff --git a/packages/seroval/test/__snapshots__/array.test.ts.snap b/packages/seroval/test/__snapshots__/array.test.ts.snap index d3b481b0..128ec4d6 100644 --- a/packages/seroval/test/__snapshots__/array.test.ts.snap +++ b/packages/seroval/test/__snapshots__/array.test.ts.snap @@ -44,6 +44,24 @@ exports[`arrays > serializeAsync > supports Arrays 1`] = `"Promise.resolve([1,2, exports[`arrays > serializeAsync > supports self recursion 1`] = `"(h=>(h=[Promise.resolve().then(()=>h),Promise.resolve().then(()=>h)]))()"`; +exports[`arrays > toCrossJSON > supports Arrays 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}"`; + +exports[`arrays > toCrossJSON > supports self recursion 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"o\\":0}"`; + +exports[`arrays > toCrossJSONAsync > supports Arrays 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; + +exports[`arrays > toCrossJSONAsync > supports self recursion 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"o\\":0}"`; + +exports[`arrays > toCrossJSONStream > supports Arrays 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`arrays > toCrossJSONStream > supports Arrays 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":9,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; + +exports[`arrays > toCrossJSONStream > supports self recursion 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":28,\\"i\\":1},{\\"t\\":28,\\"i\\":2}],\\"o\\":0}"`; + +exports[`arrays > toCrossJSONStream > supports self recursion 2`] = `"{\\"t\\":29,\\"i\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; + +exports[`arrays > toCrossJSONStream > supports self recursion 3`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; + exports[`arrays > toJSON > supports Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; exports[`arrays > toJSON > supports self recursion 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/array.test.ts b/packages/seroval/test/array.test.ts index a4842962..fff0c869 100644 --- a/packages/seroval/test/array.test.ts +++ b/packages/seroval/test/array.test.ts @@ -9,41 +9,50 @@ import { crossSerialize, crossSerializeAsync, crossSerializeStream, + toCrossJSONStream, + toCrossJSONAsync, + fromCrossJSON, + toCrossJSON, } from '../src'; +const EXAMPLE = [1, 2, 3]; + +const RECURSIVE_EXAMPLE: unknown[] = []; +RECURSIVE_EXAMPLE[0] = RECURSIVE_EXAMPLE; +RECURSIVE_EXAMPLE[1] = RECURSIVE_EXAMPLE; + +const ASYNC_RECURSIVE_EXAMPLE: Promise[] = []; +ASYNC_RECURSIVE_EXAMPLE[0] = Promise.resolve(ASYNC_RECURSIVE_EXAMPLE); +ASYNC_RECURSIVE_EXAMPLE[1] = Promise.resolve(ASYNC_RECURSIVE_EXAMPLE); + describe('arrays', () => { describe('serialize', () => { it('supports Arrays', () => { - const example = [1, 2, 3]; - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back).toBeInstanceOf(Array); - expect(back[0]).toBe(example[0]); - expect(back[1]).toBe(example[1]); - expect(back[2]).toBe(example[2]); + expect(back[0]).toBe(EXAMPLE[0]); + expect(back[1]).toBe(EXAMPLE[1]); + expect(back[2]).toBe(EXAMPLE[2]); }); it('supports self recursion', () => { - const example: unknown[] = []; - example[0] = example; - example[1] = example; - const result = serialize(example); + const result = serialize(RECURSIVE_EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back[0]).toBe(back); expect(back[1]).toBe(back); }); }); describe('serializeAsync', () => { it('supports Arrays', async () => { - const example = [1, 2, 3]; - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = await deserialize>(result); expect(back).toBeInstanceOf(Array); - expect(back[0]).toBe(example[0]); - expect(back[1]).toBe(example[1]); - expect(back[2]).toBe(example[2]); + expect(back[0]).toBe(EXAMPLE[0]); + expect(back[1]).toBe(EXAMPLE[1]); + expect(back[2]).toBe(EXAMPLE[2]); }); it('supports self recursion', async () => { const example: Promise[] = []; @@ -58,108 +67,83 @@ describe('arrays', () => { }); describe('toJSON', () => { it('supports Arrays', () => { - const example = [1, 2, 3]; - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(Array); - expect(back[0]).toBe(example[0]); - expect(back[1]).toBe(example[1]); - expect(back[2]).toBe(example[2]); + expect(back[0]).toBe(EXAMPLE[0]); + expect(back[1]).toBe(EXAMPLE[1]); + expect(back[2]).toBe(EXAMPLE[2]); }); it('supports self recursion', () => { - const example: unknown[] = []; - example[0] = example; - example[1] = example; - const result = toJSON(example); + const result = toJSON(RECURSIVE_EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(back[0]).toBe(back); expect(back[1]).toBe(back); }); }); describe('toJSONAsync', () => { it('supports Arrays', async () => { - const example = [1, 2, 3]; - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = await fromJSON>(result); expect(back).toBeInstanceOf(Array); - expect(back[0]).toBe(example[0]); - expect(back[1]).toBe(example[1]); - expect(back[2]).toBe(example[2]); + expect(back[0]).toBe(EXAMPLE[0]); + expect(back[1]).toBe(EXAMPLE[1]); + expect(back[2]).toBe(EXAMPLE[2]); }); it('supports self recursion', async () => { - const example: Promise[] = []; - example[0] = Promise.resolve(example); - example[1] = Promise.resolve(example); - const result = await toJSONAsync(example); + const result = await toJSONAsync(ASYNC_RECURSIVE_EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(await back[0]).toBe(back); expect(await back[1]).toBe(back); }); }); describe('crossSerialize', () => { it('supports Arrays', () => { - const example = [1, 2, 3]; - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); it('supports self recursion', () => { - const example: unknown[] = []; - example[0] = example; - example[1] = example; - const result = crossSerialize(example); + const result = crossSerialize(RECURSIVE_EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Arrays', () => { - const example = [1, 2, 3]; - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports self recursion', () => { - const example: unknown[] = []; - example[0] = example; - example[1] = example; - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(RECURSIVE_EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports Arrays', async () => { - const example = [1, 2, 3]; - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); it('supports self recursion', async () => { - const example: Promise[] = []; - example[0] = Promise.resolve(example); - example[1] = Promise.resolve(example); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(ASYNC_RECURSIVE_EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Arrays', async () => { - const example = [1, 2, 3]; - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports self recursion', async () => { - const example: Promise[] = []; - example[0] = Promise.resolve(example); - example[1] = Promise.resolve(example); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync(ASYNC_RECURSIVE_EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports Arrays', async () => new Promise((done) => { - const example = [1, 2, 3]; - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -169,10 +153,7 @@ describe('arrays', () => { }); })); it('supports self recursion', async () => new Promise((done) => { - const example: Promise[] = []; - example[0] = Promise.resolve(example); - example[1] = Promise.resolve(example); - crossSerializeStream(example, { + crossSerializeStream(ASYNC_RECURSIVE_EXAMPLE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -183,8 +164,7 @@ describe('arrays', () => { })); describe('scoped', () => { it('supports Arrays', async () => new Promise((done) => { - const example = [1, 2, 3]; - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -195,10 +175,7 @@ describe('arrays', () => { }); })); it('supports self recursion', async () => new Promise((done) => { - const example: Promise[] = []; - example[0] = Promise.resolve(example); - example[1] = Promise.resolve(example); - crossSerializeStream(example, { + crossSerializeStream(ASYNC_RECURSIVE_EXAMPLE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -210,4 +187,70 @@ describe('arrays', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports Arrays', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Array); + expect(back[0]).toBe(EXAMPLE[0]); + expect(back[1]).toBe(EXAMPLE[1]); + expect(back[2]).toBe(EXAMPLE[2]); + }); + it('supports self recursion', () => { + const result = toCrossJSON(RECURSIVE_EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back[0]).toBe(back); + expect(back[1]).toBe(back); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports Arrays', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Array); + expect(back[0]).toBe(EXAMPLE[0]); + expect(back[1]).toBe(EXAMPLE[1]); + expect(back[2]).toBe(EXAMPLE[2]); + }); + it('supports self recursion', async () => { + const result = await toCrossJSONAsync(ASYNC_RECURSIVE_EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(await back[0]).toBe(back); + expect(await back[1]).toBe(back); + }); + }); + describe('toCrossJSONStream', () => { + it('supports Arrays', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports self recursion', async () => new Promise((done) => { + toCrossJSONStream(ASYNC_RECURSIVE_EXAMPLE, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From 9caba20e4b7f92808aeafc61bfbc211813ff1c03 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 01:14:44 +0800 Subject: [PATCH 39/82] Update async-iterable test --- .../__snapshots__/async-iterable.test.ts.snap | 44 ++++--- packages/seroval/test/async-iterable.test.ts | 114 ++++++++---------- 2 files changed, 77 insertions(+), 81 deletions(-) diff --git a/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap b/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap index 9c4179eb..990dadda 100644 --- a/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap @@ -6,38 +6,48 @@ exports[`AsyncIterable > compat#toJSONAsync > should use function expression ins exports[`AsyncIterable > compat#toJSONAsync > should use function expression instead of arrow functions. 2`] = `"(function(h,j){return(j={[h=Symbol.asyncIterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:async function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; -exports[`AsyncIterable > crossSerializeAsync > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.asyncIterator]:($R[5]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[4]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeAsync > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeAsync > supports AsyncIterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.asyncIterator]:($R[5]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[4]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`AsyncIterable > crossSerializeAsync > supports AsyncIterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; -exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())})($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 2`] = `"($R=>_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[2]=_$.S())}))($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 2`] = `"($R=>_$.Se($R[1],$R[4]=[0,1]))($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 3`] = `"($R=>_$.Se($R[2],$R[5]=[0,1]))($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 3`] = `"($R=>_$.Se($R[1],$R[5]=[0,2]))($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 4`] = `"($R=>_$.Se($R[2],$R[6]=[0,2]))($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 4`] = `"($R=>_$.Se($R[1],$R[6]=[0,3]))($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 5`] = `"($R=>_$.Se($R[2],$R[7]=[0,3]))($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 5`] = `"($R=>_$.Se($R[1],$R[7]=[2,void 0]))($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 6`] = `"($R=>_$.Se($R[2],$R[8]=[2,void 0]))($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 6`] = `"($R=>_$.Sc($R[1]))($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 7`] = `"($R=>_$.Sc($R[2]))($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())}"`; -exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 1`] = `"$R[0]=_$.P()"`; +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 2`] = `"_$.Se($R[1],$R[4]=[0,1])"`; -exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[2]=_$.S())})"`; +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 3`] = `"_$.Se($R[1],$R[5]=[0,2])"`; -exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 3`] = `"_$.Se($R[2],$R[5]=[0,1])"`; +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 4`] = `"_$.Se($R[1],$R[6]=[0,3])"`; -exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 4`] = `"_$.Se($R[2],$R[6]=[0,2])"`; +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 5`] = `"_$.Se($R[1],$R[7]=[2,void 0])"`; -exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 5`] = `"_$.Se($R[2],$R[7]=[0,3])"`; +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 6`] = `"_$.Sc($R[1])"`; -exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 6`] = `"_$.Se($R[2],$R[8]=[2,void 0])"`; +exports[`AsyncIterable > serializeAsync > supports AsyncIterables 1`] = `"(h=>({title:\\"Hello World\\",[h=Symbol.asyncIterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:async ()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; -exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 7`] = `"_$.Sc($R[2])"`; +exports[`AsyncIterable > toCrossJSONAsync > supports AsyncIterables 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",1],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}}"`; -exports[`AsyncIterable > serializeAsync > supports AsyncIterables 1`] = `"(h=>({title:\\"Hello World\\",[h=Symbol.asyncIterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:async ()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; +exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",1],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":31,\\"i\\":1}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":2,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":3,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":2}}}}}"`; + +exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 2`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":1}],\\"o\\":0}}"`; + +exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 3`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":2}],\\"o\\":0}}"`; + +exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 4`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; + +exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 5`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":7,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":2,\\"s\\":1}],\\"o\\":0}}"`; + +exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 6`] = `"{\\"t\\":33,\\"i\\":1}"`; exports[`AsyncIterable > toJSONAsync > supports AsyncIterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",1],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; diff --git a/packages/seroval/test/async-iterable.test.ts b/packages/seroval/test/async-iterable.test.ts index 4c58b604..cc631ac4 100644 --- a/packages/seroval/test/async-iterable.test.ts +++ b/packages/seroval/test/async-iterable.test.ts @@ -5,27 +5,31 @@ import { crossSerializeStream, deserialize, Feature, + fromCrossJSON, fromJSON, serializeAsync, + toCrossJSONAsync, + toCrossJSONStream, toJSONAsync, } from '../src'; +const EXAMPLE = { + title: 'Hello World', + async* [Symbol.asyncIterator](): AsyncIterator { + await Promise.resolve(); + yield 1; + yield 2; + yield 3; + }, +}; + describe('AsyncIterable', () => { describe('serializeAsync', () => { it('supports AsyncIterables', async () => { - const example = { - title: 'Hello World', - async* [Symbol.asyncIterator](): AsyncIterator { - await Promise.resolve(); - yield 1; - yield 2; - yield 3; - }, - }; - const result = await serializeAsync(example); + const result = await serializeAsync(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); - expect(back.title).toBe(example.title); + const back = deserialize(result); + expect(back.title).toBe(EXAMPLE.title); expect(Symbol.asyncIterator in back).toBe(true); const iterator = back[Symbol.asyncIterator](); expect((await iterator.next()).value).toBe(1); @@ -35,19 +39,10 @@ describe('AsyncIterable', () => { }); describe('toJSONAsync', () => { it('supports AsyncIterables', async () => { - const example = { - title: 'Hello World', - async* [Symbol.asyncIterator](): AsyncIterator { - await Promise.resolve(); - yield 1; - yield 2; - yield 3; - }, - }; - const result = await toJSONAsync(example); + const result = await toJSONAsync(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); - expect(back.title).toBe(example.title); + const back = fromJSON(result); + expect(back.title).toBe(EXAMPLE.title); expect(Symbol.asyncIterator in back).toBe(true); const iterator = back[Symbol.asyncIterator](); expect((await iterator.next()).value).toBe(1); @@ -57,46 +52,19 @@ describe('AsyncIterable', () => { }); describe('crossSerializeAsync', () => { it('supports AsyncIterables', async () => { - const example = Promise.resolve({ - title: 'Hello World', - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - yield 2; - yield 3; - }, - }); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports AsyncIterables', async () => { - const example = Promise.resolve({ - title: 'Hello World', - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - yield 2; - yield 3; - }, - }); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports AsyncIterables', async () => new Promise((done) => { - const example = Promise.resolve({ - title: 'Hello World', - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - yield 2; - yield 3; - }, - }); - crossSerializeStream(example, { + crossSerializeStream(EXAMPLE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -107,16 +75,7 @@ describe('AsyncIterable', () => { })); describe('scoped', () => { it('supports AsyncIterables', async () => new Promise((done) => { - const example = Promise.resolve({ - title: 'Hello World', - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - yield 2; - yield 3; - }, - }); - crossSerializeStream(example, { + crossSerializeStream(EXAMPLE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -128,6 +87,33 @@ describe('AsyncIterable', () => { })); }); }); + describe('toCrossJSONAsync', () => { + it('supports AsyncIterables', async () => { + const result = await toCrossJSONAsync(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back.title).toBe(EXAMPLE.title); + expect(Symbol.asyncIterator in back).toBe(true); + const iterator = back[Symbol.asyncIterator](); + expect((await iterator.next()).value).toBe(1); + expect((await iterator.next()).value).toBe(2); + expect((await iterator.next()).value).toBe(3); + }); + }); + describe('toCrossJSONStream', () => { + it('supports AsyncIterables', async () => new Promise((done) => { + toCrossJSONStream(EXAMPLE, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); describe('compat', () => { it('should use function expressions instead of arrow functions.', async () => { const example = { From 55902d8f0308f16b52c2bb6d8dd9b72933577692 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 01:17:20 +0800 Subject: [PATCH 40/82] Update bigint test --- .../test/__snapshots__/bigint.test.ts.snap | 8 +++ packages/seroval/test/bigint.test.ts | 53 +++++++++++++++---- 2 files changed, 50 insertions(+), 11 deletions(-) diff --git a/packages/seroval/test/__snapshots__/bigint.test.ts.snap b/packages/seroval/test/__snapshots__/bigint.test.ts.snap index c803bef9..a0862f46 100644 --- a/packages/seroval/test/__snapshots__/bigint.test.ts.snap +++ b/packages/seroval/test/__snapshots__/bigint.test.ts.snap @@ -16,6 +16,14 @@ exports[`bigint > serialize > supports bigint 1`] = `"9007199254740991n"`; exports[`bigint > serializeAsync > supports bigint 1`] = `"Promise.resolve(9007199254740991n)"`; +exports[`bigint > toCrossJSON > supports bigint 1`] = `"{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}"`; + +exports[`bigint > toCrossJSONAsync > supports bigint 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}}"`; + +exports[`bigint > toCrossJSONStream > supports bigint 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`bigint > toCrossJSONStream > supports bigint 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}}"`; + exports[`bigint > toJSON > supports bigint 1`] = `"{\\"t\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"},\\"f\\":16383,\\"m\\":[]}"`; exports[`bigint > toJSONAsync > supports bigint 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/bigint.test.ts b/packages/seroval/test/bigint.test.ts index 1778bc90..a214c7b6 100644 --- a/packages/seroval/test/bigint.test.ts +++ b/packages/seroval/test/bigint.test.ts @@ -10,46 +10,52 @@ import { crossSerialize, crossSerializeAsync, crossSerializeStream, + toCrossJSONAsync, + toCrossJSON, + fromCrossJSON, + toCrossJSONStream, } from '../src'; +const EXAMPLE = 9007199254740991n; + describe('bigint', () => { describe('serialize', () => { it('supports bigint', () => { - expect(serialize(9007199254740991n)).toMatchSnapshot(); - expect(deserialize(serialize(9007199254740991n))).toBe(9007199254740991n); + expect(serialize(EXAMPLE)).toMatchSnapshot(); + expect(deserialize(serialize(EXAMPLE))).toBe(EXAMPLE); }); }); describe('serializeAsync', () => { it('supports bigint', async () => { - expect(await serializeAsync(Promise.resolve(9007199254740991n))).toMatchSnapshot(); + expect(await serializeAsync(Promise.resolve(EXAMPLE))).toMatchSnapshot(); }); }); describe('toJSON', () => { it('supports bigint', () => { - expect(JSON.stringify(toJSON(9007199254740991n))).toMatchSnapshot(); - expect(fromJSON(toJSON(9007199254740991n))).toBe(9007199254740991n); + expect(JSON.stringify(toJSON(EXAMPLE))).toMatchSnapshot(); + expect(fromJSON(toJSON(EXAMPLE))).toBe(EXAMPLE); }); }); describe('toJSONAsync', () => { it('supports bigint', async () => { expect( - JSON.stringify(await toJSONAsync(Promise.resolve(9007199254740991n))), + JSON.stringify(await toJSONAsync(Promise.resolve(EXAMPLE))), ).toMatchSnapshot(); }); }); describe('crossSerialize', () => { it('supports bigint', () => { - expect(crossSerialize(9007199254740991n)).toMatchSnapshot(); + expect(crossSerialize(EXAMPLE)).toMatchSnapshot(); }); }); describe('crossSerializeAsync', () => { it('supports bigint', async () => { - expect(await crossSerializeAsync(Promise.resolve(9007199254740991n))).toMatchSnapshot(); + expect(await crossSerializeAsync(Promise.resolve(EXAMPLE))).toMatchSnapshot(); }); }); describe('crossSerializeStream', () => { it('supports bigint', async () => new Promise((done) => { - crossSerializeStream(Promise.resolve(9007199254740991n), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -59,16 +65,41 @@ describe('bigint', () => { }); })); }); + describe('toCrossJSON', () => { + it('supports bigint', () => { + expect(JSON.stringify(toCrossJSON(EXAMPLE))).toMatchSnapshot(); + expect(fromCrossJSON(toCrossJSON(EXAMPLE), { refs: new Map() })).toBe(EXAMPLE); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports bigint', async () => { + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(EXAMPLE))), + ).toMatchSnapshot(); + }); + }); + describe('toCrossJSONStream', () => { + it('supports bigint', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); describe('compat', () => { it('should throw an error for unsupported target', () => { - expect(() => serialize(9007199254740991n, { + expect(() => serialize(EXAMPLE, { disabledFeatures: Feature.BigInt, })).toThrowErrorMatchingSnapshot(); }); }); describe('compat#toJSON', () => { it('should throw an error for unsupported target', () => { - expect(() => toJSON(9007199254740991n, { + expect(() => toJSON(EXAMPLE, { disabledFeatures: Feature.BigInt, })).toThrowErrorMatchingSnapshot(); }); From 747f9815928086503c916b3719ca6166ee6fbb6a Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 09:54:01 +0800 Subject: [PATCH 41/82] Fix boolean test --- .../test/__snapshots__/boolean.test.ts.snap | 28 +++++++++--- packages/seroval/test/boolean.test.ts | 45 ++++++++++++++++++- 2 files changed, 65 insertions(+), 8 deletions(-) diff --git a/packages/seroval/test/__snapshots__/boolean.test.ts.snap b/packages/seroval/test/__snapshots__/boolean.test.ts.snap index 220227f1..f360003e 100644 --- a/packages/seroval/test/__snapshots__/boolean.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boolean.test.ts.snap @@ -8,18 +8,34 @@ exports[`boolean > crossSerializeAsync > supports boolean 1`] = `"$R[0]=Promise. exports[`boolean > crossSerializeAsync > supports boolean 2`] = `"$R[0]=Promise.resolve(!1)"`; -exports[`boolean > crossSerializeAsync > supports false value 1`] = `"$R[0]=_$.P()"`; +exports[`boolean > crossSerializeStream > supports false value 1`] = `"$R[0]=_$.P()"`; -exports[`boolean > crossSerializeAsync > supports false value 2`] = `"_$.Ps($R[0],!1)"`; +exports[`boolean > crossSerializeStream > supports false value 2`] = `"_$.Ps($R[0],!1)"`; -exports[`boolean > crossSerializeAsync > supports true value 1`] = `"$R[0]=_$.P()"`; +exports[`boolean > crossSerializeStream > supports true value 1`] = `"$R[0]=_$.P()"`; -exports[`boolean > crossSerializeAsync > supports true value 2`] = `"_$.Ps($R[0],!0)"`; +exports[`boolean > crossSerializeStream > supports true value 2`] = `"_$.Ps($R[0],!0)"`; -exports[`boolean > serializeAsync > supports boolean 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boolean > toCrossJSON > supports boolean 1`] = `"{\\"t\\":2,\\"s\\":2}"`; -exports[`boolean > serializeAsync > supports boolean 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":3}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`boolean > toCrossJSON > supports boolean 2`] = `"{\\"t\\":2,\\"s\\":3}"`; + +exports[`boolean > toCrossJSONAsync > supports boolean 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":2}}"`; + +exports[`boolean > toCrossJSONAsync > supports boolean 2`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":3}}"`; + +exports[`boolean > toCrossJSONStream > supports false value 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`boolean > toCrossJSONStream > supports false value 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":3}}"`; + +exports[`boolean > toCrossJSONStream > supports true value 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`boolean > toCrossJSONStream > supports true value 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":2}}"`; exports[`boolean > toJSON > supports boolean 1`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":2},\\"f\\":16383,\\"m\\":[]}"`; exports[`boolean > toJSON > supports boolean 2`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":3},\\"f\\":16383,\\"m\\":[]}"`; + +exports[`boolean > toJSONAsync > supports boolean 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; + +exports[`boolean > toJSONAsync > supports boolean 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":3}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/boolean.test.ts b/packages/seroval/test/boolean.test.ts index 0ff4e774..dc937650 100644 --- a/packages/seroval/test/boolean.test.ts +++ b/packages/seroval/test/boolean.test.ts @@ -5,6 +5,9 @@ import { crossSerializeStream, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../src'; @@ -28,7 +31,7 @@ describe('boolean', () => { expect(JSON.stringify(toJSON(false))).toMatchSnapshot(); }); }); - describe('serializeAsync', () => { + describe('toJSONAsync', () => { it('supports boolean', async () => { expect( JSON.stringify(await toJSONAsync(Promise.resolve(true))), @@ -50,7 +53,7 @@ describe('boolean', () => { expect(await crossSerializeAsync(Promise.resolve(false))).toMatchSnapshot(); }); }); - describe('crossSerializeAsync', () => { + describe('crossSerializeStream', () => { it('supports true value', async () => new Promise((done) => { crossSerializeStream(Promise.resolve(true), { onSerialize(data) { @@ -72,4 +75,42 @@ describe('boolean', () => { }); })); }); + describe('toCrossJSON', () => { + it('supports boolean', () => { + expect(JSON.stringify(toCrossJSON(true))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(false))).toMatchSnapshot(); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports boolean', async () => { + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(true))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(false))), + ).toMatchSnapshot(); + }); + }); + describe('toCrossJSONStream', () => { + it('supports true value', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(true), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports false value', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(false), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From 5329f1a077599805ebef97e91df8e4e354980b28 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 09:58:00 +0800 Subject: [PATCH 42/82] Fix boxed-bigint test --- .../__snapshots__/boxed-bigint.test.ts.snap | 8 +++ packages/seroval/test/boxed-bigint.test.ts | 65 ++++++++++++++----- 2 files changed, 58 insertions(+), 15 deletions(-) diff --git a/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap b/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap index 9bc0d47b..827dcdd7 100644 --- a/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boxed-bigint.test.ts.snap @@ -24,6 +24,14 @@ exports[`boxed bigint > serialize > supports boxed bigint 1`] = `"Object(9007199 exports[`boxed bigint > serializeAsync > supports boxed bigint 1`] = `"Promise.resolve(Object(9007199254740991n))"`; +exports[`boxed bigint > toCrossJSON > supports boxed bigint 1`] = `"{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}}"`; + +exports[`boxed bigint > toCrossJSONAsync > supports boxed bigint 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}}}"`; + +exports[`boxed bigint > toCrossJSONStream > supports boxed bigint 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`boxed bigint > toCrossJSONStream > supports boxed bigint 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}}}"`; + exports[`boxed bigint > toJSON > supports boxed bigint 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}},\\"f\\":16383,\\"m\\":[]}"`; exports[`boxed bigint > toJSONAsync > supports boxed bigint 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":3,\\"s\\":\\"9007199254740991\\"}}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/boxed-bigint.test.ts b/packages/seroval/test/boxed-bigint.test.ts index 2892983f..28e8531f 100644 --- a/packages/seroval/test/boxed-bigint.test.ts +++ b/packages/seroval/test/boxed-bigint.test.ts @@ -10,61 +10,67 @@ import { crossSerialize, crossSerializeAsync, crossSerializeStream, + toCrossJSON, + fromCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, } from '../src'; +const EXAMPLE = 9007199254740991n; + describe('boxed bigint', () => { describe('serialize', () => { it('supports boxed bigint', () => { - expect(serialize(Object(9007199254740991n))).toMatchSnapshot(); - expect(deserialize(serialize(Object(9007199254740991n))).valueOf()) - .toBe(9007199254740991n); + expect(serialize(Object(EXAMPLE))).toMatchSnapshot(); + expect(deserialize(serialize(Object(EXAMPLE))).valueOf()) + .toBe(EXAMPLE); }); }); describe('serializeAsync', () => { it('supports boxed bigint', async () => { - expect(await serializeAsync(Promise.resolve(Object(9007199254740991n)))).toMatchSnapshot(); + expect(await serializeAsync(Promise.resolve(Object(EXAMPLE)))).toMatchSnapshot(); }); }); describe('toJSON', () => { it('supports boxed bigint', () => { - expect(JSON.stringify(toJSON(Object(9007199254740991n)))).toMatchSnapshot(); - expect(fromJSON(toJSON(Object(9007199254740991n))).valueOf()).toBe(9007199254740991n); + expect(JSON.stringify(toJSON(Object(EXAMPLE)))).toMatchSnapshot(); + expect(fromJSON(toJSON(Object(EXAMPLE))).valueOf()).toBe(EXAMPLE); }); }); describe('toJSONAsync', () => { it('supports boxed bigint', async () => { expect( - JSON.stringify(await toJSONAsync(Promise.resolve(Object(9007199254740991n)))), + JSON.stringify(await toJSONAsync(Promise.resolve(Object(EXAMPLE)))), ).toMatchSnapshot(); }); }); describe('crossSerialize', () => { it('supports boxed bigint', () => { - expect(crossSerialize(Object(9007199254740991n))).toMatchSnapshot(); + expect(crossSerialize(Object(EXAMPLE))).toMatchSnapshot(); }); describe('scoped', () => { it('supports boxed bigint', () => { - expect(crossSerialize(Object(9007199254740991n), { scopeId: 'example' })).toMatchSnapshot(); + expect(crossSerialize(Object(EXAMPLE), { scopeId: 'example' })).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports boxed bigint', async () => { expect( - await crossSerializeAsync(Promise.resolve(Object(9007199254740991n))), + await crossSerializeAsync(Promise.resolve(Object(EXAMPLE))), ).toMatchSnapshot(); }); describe('scoped', () => { it('supports boxed bigint', async () => { expect( - await crossSerializeAsync(Promise.resolve(Object(9007199254740991n)), { scopeId: 'example' }), + await crossSerializeAsync(Promise.resolve(Object(EXAMPLE)), { scopeId: 'example' }), ).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports boxed bigint', async () => new Promise((done) => { - crossSerializeStream(Promise.resolve(Object(9007199254740991n)), { + crossSerializeStream(Promise.resolve(Object(EXAMPLE)), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -75,7 +81,7 @@ describe('boxed bigint', () => { })); describe('scoped', () => { it('supports boxed bigint', async () => new Promise((done) => { - crossSerializeStream(Promise.resolve(Object(9007199254740991n)), { + crossSerializeStream(Promise.resolve(Object(EXAMPLE)), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -87,16 +93,45 @@ describe('boxed bigint', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports boxed bigint', () => { + expect(JSON.stringify(toCrossJSON(Object(EXAMPLE)))).toMatchSnapshot(); + expect( + fromCrossJSON(toCrossJSON(Object(EXAMPLE)), { + refs: new Map(), + }).valueOf(), + ).toBe(EXAMPLE); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports boxed bigint', async () => { + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Object(EXAMPLE)))), + ).toMatchSnapshot(); + }); + }); + describe('toCrossJSONStream', () => { + it('supports boxed bigint', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Object(EXAMPLE)), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); describe('compat', () => { it('should throw an error for unsupported target', () => { - expect(() => serialize(Object(9007199254740991n), { + expect(() => serialize(Object(EXAMPLE), { disabledFeatures: Feature.BigInt, })).toThrowErrorMatchingSnapshot(); }); }); describe('compat#toJSON', () => { it('should throw an error for unsupported target', () => { - expect(() => toJSON(Object(9007199254740991n), { + expect(() => toJSON(Object(EXAMPLE), { disabledFeatures: Feature.BigInt, })).toThrowErrorMatchingSnapshot(); }); From 5f63c2103a900c0b3267a645bf0071782084cbc9 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 10:02:31 +0800 Subject: [PATCH 43/82] Fix boxed-boolean test --- .../__snapshots__/boxed-boolean.test.ts.snap | 32 +++++++- packages/seroval/test/boxed-boolean.test.ts | 77 ++++++++++++++++--- 2 files changed, 96 insertions(+), 13 deletions(-) diff --git a/packages/seroval/test/__snapshots__/boxed-boolean.test.ts.snap b/packages/seroval/test/__snapshots__/boxed-boolean.test.ts.snap index bb333974..227bd127 100644 --- a/packages/seroval/test/__snapshots__/boxed-boolean.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boxed-boolean.test.ts.snap @@ -16,6 +16,14 @@ exports[`boxed boolean > crossSerializeAsync > supports boolean 1`] = `"$R[0]=Ob exports[`boxed boolean > crossSerializeAsync > supports boolean 2`] = `"$R[0]=Object(!1)"`; +exports[`boxed boolean > crossSerializeStream > scoped > supports boxed false 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; + +exports[`boxed boolean > crossSerializeStream > scoped > supports boxed false 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object(!1)))($R[\\"example\\"])"`; + +exports[`boxed boolean > crossSerializeStream > scoped > supports boxed true 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; + +exports[`boxed boolean > crossSerializeStream > scoped > supports boxed true 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object(!0)))($R[\\"example\\"])"`; + exports[`boxed boolean > crossSerializeStream > supports boxed false 1`] = `"$R[0]=_$.P()"`; exports[`boxed boolean > crossSerializeStream > supports boxed false 2`] = `"_$.Ps($R[0],$R[1]=Object(!1))"`; @@ -24,10 +32,26 @@ exports[`boxed boolean > crossSerializeStream > supports boxed true 1`] = `"$R[0 exports[`boxed boolean > crossSerializeStream > supports boxed true 2`] = `"_$.Ps($R[0],$R[1]=Object(!0))"`; -exports[`boxed boolean > scoped > supports boxed false 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; +exports[`boxed boolean > toCrossJSON > supports boolean 1`] = `"{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":2}}"`; + +exports[`boxed boolean > toCrossJSON > supports boolean 2`] = `"{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":3}}"`; + +exports[`boxed boolean > toCrossJSONAsync > supports boolean 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":2}}}"`; + +exports[`boxed boolean > toCrossJSONAsync > supports boolean 2`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":3}}}"`; + +exports[`boxed boolean > toCrossJSONStream > supports boxed false 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`boxed boolean > toCrossJSONStream > supports boxed false 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":3}}}"`; + +exports[`boxed boolean > toCrossJSONStream > supports boxed true 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`boxed boolean > toCrossJSONStream > supports boxed true 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":2}}}"`; + +exports[`boxed boolean > toJSON > supports boolean 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed boolean > scoped > supports boxed false 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object(!1)))($R[\\"example\\"])"`; +exports[`boxed boolean > toJSON > supports boolean 2`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":3}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed boolean > scoped > supports boxed true 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; +exports[`boxed boolean > toJSONAsync > supports boolean 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":2}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`boxed boolean > scoped > supports boxed true 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object(!0)))($R[\\"example\\"])"`; +exports[`boxed boolean > toJSONAsync > supports boolean 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":3}}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/boxed-boolean.test.ts b/packages/seroval/test/boxed-boolean.test.ts index 910f2ad0..6758679b 100644 --- a/packages/seroval/test/boxed-boolean.test.ts +++ b/packages/seroval/test/boxed-boolean.test.ts @@ -5,6 +5,11 @@ import { crossSerializeStream, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, + toJSON, + toJSONAsync, } from '../src'; describe('boxed boolean', () => { @@ -20,6 +25,22 @@ describe('boxed boolean', () => { expect(await serializeAsync(Object(false))).toBe('Object(!1)'); }); }); + describe('toJSON', () => { + it('supports boolean', () => { + expect(JSON.stringify(toJSON(Object(true)))).toMatchSnapshot(); + expect(JSON.stringify(toJSON(Object(false)))).toMatchSnapshot(); + }); + }); + describe('toJSONAsync', () => { + it('supports boolean', async () => { + expect( + JSON.stringify(await toJSONAsync(Promise.resolve(Object(true)))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toJSONAsync(Promise.resolve(Object(false)))), + ).toMatchSnapshot(); + }); + }); describe('crossSerialize', () => { it('supports boolean', () => { expect(crossSerialize(Object(true))).toMatchSnapshot(); @@ -65,13 +86,52 @@ describe('boxed boolean', () => { }, }); })); + describe('scoped', () => { + it('supports boxed true', async () => new Promise((done) => { + crossSerializeStream(Promise.resolve(Object(true)), { + scopeId: 'example', + onSerialize(data) { + expect(data).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports boxed false', async () => new Promise((done) => { + crossSerializeStream(Promise.resolve(Object(false)), { + scopeId: 'example', + onSerialize(data) { + expect(data).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); + }); + describe('toCrossJSON', () => { + it('supports boolean', () => { + expect(JSON.stringify(toCrossJSON(Object(true)))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Object(false)))).toMatchSnapshot(); + }); }); - describe('scoped', () => { + describe('toCrossJSONAsync', () => { + it('supports boolean', async () => { + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Object(true)))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Object(false)))), + ).toMatchSnapshot(); + }); + }); + describe('toCrossJSONStream', () => { it('supports boxed true', async () => new Promise((done) => { - crossSerializeStream(Promise.resolve(Object(true)), { - scopeId: 'example', - onSerialize(data) { - expect(data).toMatchSnapshot(); + toCrossJSONStream(Promise.resolve(Object(true)), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { done(); @@ -79,10 +139,9 @@ describe('boxed boolean', () => { }); })); it('supports boxed false', async () => new Promise((done) => { - crossSerializeStream(Promise.resolve(Object(false)), { - scopeId: 'example', - onSerialize(data) { - expect(data).toMatchSnapshot(); + toCrossJSONStream(Promise.resolve(Object(false)), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { done(); From 5d8b82736ecca162b0814d7e20c4d82a86903685 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 10:05:43 +0800 Subject: [PATCH 44/82] Fix boxed-number test --- .../__snapshots__/boxed-number.test.ts.snap | 40 +++++++++ packages/seroval/test/boxed-number.test.ts | 85 +++++++++++++++++++ 2 files changed, 125 insertions(+) diff --git a/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap b/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap index b4562b1f..52c539bb 100644 --- a/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boxed-number.test.ts.snap @@ -80,6 +80,46 @@ exports[`boxed number > crossSerializeStream > supports boxed numbers 1`] = `"$R exports[`boxed number > crossSerializeStream > supports boxed numbers 2`] = `"_$.Ps($R[0],$R[1]=Object(3735928559))"`; +exports[`boxed number > toCrossJSON > supports boxed numbers 1`] = `"{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}}"`; + +exports[`boxed number > toCrossJSON > supports boxed numbers 2`] = `"{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":7}}"`; + +exports[`boxed number > toCrossJSON > supports boxed numbers 3`] = `"{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":5}}"`; + +exports[`boxed number > toCrossJSON > supports boxed numbers 4`] = `"{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":6}}"`; + +exports[`boxed number > toCrossJSON > supports boxed numbers 5`] = `"{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":4}}"`; + +exports[`boxed number > toCrossJSONAsync > supports boxed numbers 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}}}"`; + +exports[`boxed number > toCrossJSONAsync > supports boxed numbers 2`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":7}}}"`; + +exports[`boxed number > toCrossJSONAsync > supports boxed numbers 3`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":5}}}"`; + +exports[`boxed number > toCrossJSONAsync > supports boxed numbers 4`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":6}}}"`; + +exports[`boxed number > toCrossJSONAsync > supports boxed numbers 5`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":4}}}"`; + +exports[`boxed number > toCrossJSONStream > supports boxed -0 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`boxed number > toCrossJSONStream > supports boxed -0 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":4}}}"`; + +exports[`boxed number > toCrossJSONStream > supports boxed -Infinity 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`boxed number > toCrossJSONStream > supports boxed -Infinity 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":6}}}"`; + +exports[`boxed number > toCrossJSONStream > supports boxed Infinity 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`boxed number > toCrossJSONStream > supports boxed Infinity 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":5}}}"`; + +exports[`boxed number > toCrossJSONStream > supports boxed NaN 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`boxed number > toCrossJSONStream > supports boxed NaN 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":2,\\"s\\":7}}}"`; + +exports[`boxed number > toCrossJSONStream > supports boxed numbers 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`boxed number > toCrossJSONStream > supports boxed numbers 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}}}"`; + exports[`boxed number > toJSON > supports boxed numbers 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}},\\"f\\":16383,\\"m\\":[]}"`; exports[`boxed number > toJSON > supports boxed numbers 2`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":7}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/boxed-number.test.ts b/packages/seroval/test/boxed-number.test.ts index 8a50b49f..61159430 100644 --- a/packages/seroval/test/boxed-number.test.ts +++ b/packages/seroval/test/boxed-number.test.ts @@ -5,6 +5,9 @@ import { crossSerializeStream, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../src'; @@ -210,4 +213,86 @@ describe('boxed number', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports boxed numbers', () => { + const value = 0xDEADBEEF; + expect(JSON.stringify(toCrossJSON(Object(value)))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Object(NaN)))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Object(Infinity)))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Object(-Infinity)))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Object(-0)))).toMatchSnapshot(); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports boxed numbers', async () => { + const value = 0xDEADBEEF; + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Object(value)))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Object(NaN)))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Object(Infinity)))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Object(-Infinity)))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Object(-0)))), + ).toMatchSnapshot(); + }); + }); + describe('toCrossJSONStream', () => { + it('supports boxed numbers', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Object(0xDEADBEEF)), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports boxed NaN', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Object(NaN)), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports boxed Infinity', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Object(Infinity)), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports boxed -Infinity', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Object(-Infinity)), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports boxed -0', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Object(-0)), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From 66762bd1db7768f08c80106c6953f1b8b7fa991f Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 10:09:56 +0800 Subject: [PATCH 45/82] Fix boxed-string test --- .../__snapshots__/boxed-string.test.ts.snap | 16 +++ packages/seroval/test/boxed-string.test.ts | 99 ++++++++++++++----- 2 files changed, 91 insertions(+), 24 deletions(-) diff --git a/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap b/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap index adeec73b..d09ed0e0 100644 --- a/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap +++ b/packages/seroval/test/__snapshots__/boxed-string.test.ts.snap @@ -40,6 +40,22 @@ exports[`boxed string > serializeAsync > supports boxed strings 1`] = `"Promise. exports[`boxed string > serializeAsync > supports boxed strings 2`] = `"Promise.resolve(Object(\\"\\\\x3Cscript>\\\\x3C/script>\\"))"`; +exports[`boxed string > toCrossJSON > supports boxed strings 1`] = `"{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}}"`; + +exports[`boxed string > toCrossJSON > supports boxed strings 2`] = `"{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}}"`; + +exports[`boxed string > toCrossJSONAsync > supports boxed strings 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}}}"`; + +exports[`boxed string > toCrossJSONAsync > supports boxed strings 2`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}}}"`; + +exports[`boxed string > toCrossJSONStream > supports boxed sanitized strings 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`boxed string > toCrossJSONStream > supports boxed sanitized strings 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}}}"`; + +exports[`boxed string > toCrossJSONStream > supports boxed strings 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`boxed string > toCrossJSONStream > supports boxed strings 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":27,\\"i\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}}}"`; + exports[`boxed string > toJSON > supports boxed strings 1`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}},\\"f\\":16383,\\"m\\":[]}"`; exports[`boxed string > toJSON > supports boxed strings 2`] = `"{\\"t\\":{\\"t\\":27,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/boxed-string.test.ts b/packages/seroval/test/boxed-string.test.ts index 1346820f..612264b0 100644 --- a/packages/seroval/test/boxed-string.test.ts +++ b/packages/seroval/test/boxed-string.test.ts @@ -4,73 +4,80 @@ import { crossSerializeAsync, crossSerializeStream, deserialize, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../src'; +const QUOTED = '"hello"'; +const HTML = ''; + describe('boxed string', () => { describe('serialize', () => { it('supports boxed strings', () => { - expect(serialize(Object('"hello"'))).toMatchSnapshot(); - expect(serialize(Object(''))).toMatchSnapshot(); - expect(deserialize(serialize(Object('"hello"'))).valueOf()).toBe('"hello"'); - expect(deserialize(serialize(Object(''))).valueOf()).toBe(''); + expect(serialize(Object(QUOTED))).toMatchSnapshot(); + expect(serialize(Object(HTML))).toMatchSnapshot(); + expect(deserialize(serialize(Object(QUOTED))).valueOf()).toBe(QUOTED); + expect(deserialize(serialize(Object(HTML))).valueOf()).toBe(HTML); }); }); describe('serializeAsync', () => { it('supports boxed strings', async () => { - expect(await serializeAsync(Promise.resolve(Object('"hello"')))).toMatchSnapshot(); - expect(await serializeAsync(Promise.resolve(Object('')))).toMatchSnapshot(); + expect(await serializeAsync(Promise.resolve(Object(QUOTED)))).toMatchSnapshot(); + expect(await serializeAsync(Promise.resolve(Object(HTML)))).toMatchSnapshot(); }); }); describe('toJSON', () => { it('supports boxed strings', () => { - expect(JSON.stringify(toJSON(Object('"hello"')))).toMatchSnapshot(); - expect(JSON.stringify(toJSON(Object('')))).toMatchSnapshot(); - expect(fromJSON(toJSON(Object('"hello"'))).valueOf()).toBe('"hello"'); - expect(fromJSON(toJSON(Object(''))).valueOf()).toBe(''); + expect(JSON.stringify(toJSON(Object(QUOTED)))).toMatchSnapshot(); + expect(JSON.stringify(toJSON(Object(HTML)))).toMatchSnapshot(); + expect(fromJSON(toJSON(Object(QUOTED))).valueOf()).toBe(QUOTED); + expect(fromJSON(toJSON(Object(HTML))).valueOf()).toBe(HTML); }); }); describe('toJSONAsync', () => { it('supports boxed strings', async () => { expect( - JSON.stringify(await toJSONAsync(Promise.resolve(Object('"hello"')))), + JSON.stringify(await toJSONAsync(Promise.resolve(Object(QUOTED)))), ).toMatchSnapshot(); expect( - JSON.stringify(await toJSONAsync(Promise.resolve(Object('')))), + JSON.stringify(await toJSONAsync(Promise.resolve(Object(HTML)))), ).toMatchSnapshot(); }); }); describe('crossSerialize', () => { it('supports boxed strings', () => { - expect(crossSerialize(Object('"hello"'))).toMatchSnapshot(); - expect(crossSerialize(Object(''))).toMatchSnapshot(); + expect(crossSerialize(Object(QUOTED))).toMatchSnapshot(); + expect(crossSerialize(Object(HTML))).toMatchSnapshot(); }); describe('scoped', () => { it('supports boxed strings', () => { - expect(crossSerialize(Object('"hello"'), { scopeId: 'example' })).toMatchSnapshot(); - expect(crossSerialize(Object(''), { scopeId: 'example' })).toMatchSnapshot(); + expect(crossSerialize(Object(QUOTED), { scopeId: 'example' })).toMatchSnapshot(); + expect(crossSerialize(Object(HTML), { scopeId: 'example' })).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports boxed strings', async () => { - expect(await crossSerializeAsync(Promise.resolve(Object('"hello"')))).toMatchSnapshot(); - expect(await crossSerializeAsync(Promise.resolve(Object('')))).toMatchSnapshot(); + expect(await crossSerializeAsync(Promise.resolve(Object(QUOTED)))).toMatchSnapshot(); + expect(await crossSerializeAsync(Promise.resolve(Object(HTML)))).toMatchSnapshot(); }); describe('scoped', () => { it('supports boxed strings', async () => { - expect(await crossSerializeAsync(Promise.resolve(Object('"hello"')), { scopeId: 'example' })).toMatchSnapshot(); - expect(await crossSerializeAsync(Promise.resolve(Object('')), { scopeId: 'example' })).toMatchSnapshot(); + expect(await crossSerializeAsync(Promise.resolve(Object(QUOTED)), { scopeId: 'example' })).toMatchSnapshot(); + expect(await crossSerializeAsync(Promise.resolve(Object(HTML)), { scopeId: 'example' })).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports boxed strings', async () => new Promise((done) => { - crossSerializeStream(Promise.resolve(Object('"hello"')), { + crossSerializeStream(Promise.resolve(Object(QUOTED)), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -80,7 +87,7 @@ describe('boxed string', () => { }); })); it('supports boxed sanitized strings', async () => new Promise((done) => { - crossSerializeStream(Promise.resolve(Object('')), { + crossSerializeStream(Promise.resolve(Object(HTML)), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -91,7 +98,7 @@ describe('boxed string', () => { })); describe('scoped', () => { it('supports boxed strings', async () => new Promise((done) => { - crossSerializeStream(Promise.resolve(Object('"hello"')), { + crossSerializeStream(Promise.resolve(Object(QUOTED)), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -102,7 +109,7 @@ describe('boxed string', () => { }); })); it('supports boxed sanitized strings', async () => new Promise((done) => { - crossSerializeStream(Promise.resolve(Object('')), { + crossSerializeStream(Promise.resolve(Object(HTML)), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -114,4 +121,48 @@ describe('boxed string', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports boxed strings', () => { + expect(JSON.stringify(toCrossJSON(Object(QUOTED)))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Object(HTML)))).toMatchSnapshot(); + expect( + fromCrossJSON(toCrossJSON(Object(QUOTED)), { refs: new Map() }).valueOf(), + ).toBe(QUOTED); + expect( + fromCrossJSON(toCrossJSON(Object(HTML)), { refs: new Map() }).valueOf(), + ).toBe(HTML); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports boxed strings', async () => { + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Object(QUOTED)))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Object(HTML)))), + ).toMatchSnapshot(); + }); + }); + describe('toCrossJSONStream', () => { + it('supports boxed strings', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Object(QUOTED)), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports boxed sanitized strings', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Object(HTML)), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From 8deea9fe85ae22ff4614dc0f26bc1f738c754d25 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 10:12:15 +0800 Subject: [PATCH 46/82] Fix string test --- .../test/__snapshots__/string.test.ts.snap | 16 ++++ packages/seroval/test/string.test.ts | 87 +++++++++++++++---- 2 files changed, 85 insertions(+), 18 deletions(-) diff --git a/packages/seroval/test/__snapshots__/string.test.ts.snap b/packages/seroval/test/__snapshots__/string.test.ts.snap index b9d81b0a..cacea9d1 100644 --- a/packages/seroval/test/__snapshots__/string.test.ts.snap +++ b/packages/seroval/test/__snapshots__/string.test.ts.snap @@ -24,6 +24,22 @@ exports[`string > serializeAsync > supports strings 1`] = `"Promise.resolve(\\"\ exports[`string > serializeAsync > supports strings 2`] = `"Promise.resolve(\\"\\\\x3Cscript>\\\\x3C/script>\\")"`; +exports[`string > toCrossJSON > supports strings 1`] = `"{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}"`; + +exports[`string > toCrossJSON > supports strings 2`] = `"{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}"`; + +exports[`string > toCrossJSONAsync > supports strings 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}}"`; + +exports[`string > toCrossJSONAsync > supports strings 2`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}}"`; + +exports[`string > toCrossJSONStream > supports sanitized strings 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`string > toCrossJSONStream > supports sanitized strings 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"}}"`; + +exports[`string > toCrossJSONStream > supports strings 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`string > toCrossJSONStream > supports strings 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"}}"`; + exports[`string > toJSON > supports strings 1`] = `"{\\"t\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\\\\\\\"hello\\\\\\\\\\\\\\"\\"},\\"f\\":16383,\\"m\\":[]}"`; exports[`string > toJSON > supports strings 2`] = `"{\\"t\\":{\\"t\\":1,\\"s\\":\\"\\\\\\\\x3Cscript>\\\\\\\\x3C/script>\\"},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/string.test.ts b/packages/seroval/test/string.test.ts index bb3b43c1..a4fadc68 100644 --- a/packages/seroval/test/string.test.ts +++ b/packages/seroval/test/string.test.ts @@ -4,61 +4,68 @@ import { crossSerializeAsync, crossSerializeStream, deserialize, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../src'; +const QUOTED = '"hello"'; +const HTML = ''; + describe('string', () => { describe('serialize', () => { it('supports strings', () => { - expect(serialize('"hello"')).toMatchSnapshot(); - expect(serialize('')).toMatchSnapshot(); - expect(deserialize(serialize('"hello"'))).toBe('"hello"'); - expect(deserialize(serialize(''))).toBe(''); + expect(serialize(QUOTED)).toMatchSnapshot(); + expect(serialize(HTML)).toMatchSnapshot(); + expect(deserialize(serialize(QUOTED))).toBe(QUOTED); + expect(deserialize(serialize(HTML))).toBe(HTML); }); }); describe('serializeAsync', () => { it('supports strings', async () => { - expect(await serializeAsync(Promise.resolve('"hello"'))).toMatchSnapshot(); - expect(await serializeAsync(Promise.resolve(''))).toMatchSnapshot(); + expect(await serializeAsync(Promise.resolve(QUOTED))).toMatchSnapshot(); + expect(await serializeAsync(Promise.resolve(HTML))).toMatchSnapshot(); }); }); describe('toJSON', () => { it('supports strings', () => { - expect(JSON.stringify(toJSON('"hello"'))).toMatchSnapshot(); - expect(JSON.stringify(toJSON(''))).toMatchSnapshot(); - expect(fromJSON(toJSON('"hello"'))).toBe('"hello"'); - expect(fromJSON(toJSON(''))).toBe(''); + expect(JSON.stringify(toJSON(QUOTED))).toMatchSnapshot(); + expect(JSON.stringify(toJSON(HTML))).toMatchSnapshot(); + expect(fromJSON(toJSON(QUOTED))).toBe(QUOTED); + expect(fromJSON(toJSON(HTML))).toBe(HTML); }); }); describe('toJSONAsync', () => { it('supports strings', async () => { expect( - JSON.stringify(await toJSONAsync(Promise.resolve('"hello"'))), + JSON.stringify(await toJSONAsync(Promise.resolve(QUOTED))), ).toMatchSnapshot(); expect( - JSON.stringify(await toJSONAsync(Promise.resolve(''))), + JSON.stringify(await toJSONAsync(Promise.resolve(HTML))), ).toMatchSnapshot(); }); }); describe('crossSerialize', () => { it('supports strings', () => { - expect(crossSerialize('"hello"')).toMatchSnapshot(); - expect(crossSerialize('')).toMatchSnapshot(); + expect(crossSerialize(QUOTED)).toMatchSnapshot(); + expect(crossSerialize(HTML)).toMatchSnapshot(); }); }); describe('crossSerializeAsync', () => { it('supports strings', async () => { - expect(await crossSerializeAsync(Promise.resolve('"hello"'))).toMatchSnapshot(); - expect(await crossSerializeAsync(Promise.resolve(''))).toMatchSnapshot(); + expect(await crossSerializeAsync(Promise.resolve(QUOTED))).toMatchSnapshot(); + expect(await crossSerializeAsync(Promise.resolve(HTML))).toMatchSnapshot(); }); }); describe('crossSerializeStream', () => { it('supports strings', async () => new Promise((done) => { - crossSerializeStream(Promise.resolve('"hello"'), { + crossSerializeStream(Promise.resolve(QUOTED), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -68,7 +75,7 @@ describe('string', () => { }); })); it('supports sanitized strings', async () => new Promise((done) => { - crossSerializeStream(Promise.resolve(''), { + crossSerializeStream(Promise.resolve(HTML), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -78,4 +85,48 @@ describe('string', () => { }); })); }); + describe('toCrossJSON', () => { + it('supports strings', () => { + expect(JSON.stringify(toCrossJSON(QUOTED))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(HTML))).toMatchSnapshot(); + expect( + fromCrossJSON(toCrossJSON(QUOTED), { refs: new Map() }), + ).toBe(QUOTED); + expect( + fromCrossJSON(toCrossJSON(HTML), { refs: new Map() }), + ).toBe(HTML); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports strings', async () => { + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(QUOTED))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(HTML))), + ).toMatchSnapshot(); + }); + }); + describe('toCrossJSONStream', () => { + it('supports strings', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(QUOTED), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports sanitized strings', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(HTML), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From 14820e54b6c556a3af37757accc4b4455e9cf89a Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 10:15:45 +0800 Subject: [PATCH 47/82] Fix number test --- .../test/__snapshots__/number.test.ts.snap | 40 +++++++++ packages/seroval/test/number.test.ts | 85 +++++++++++++++++++ 2 files changed, 125 insertions(+) diff --git a/packages/seroval/test/__snapshots__/number.test.ts.snap b/packages/seroval/test/__snapshots__/number.test.ts.snap index 6c57479c..2c80c176 100644 --- a/packages/seroval/test/__snapshots__/number.test.ts.snap +++ b/packages/seroval/test/__snapshots__/number.test.ts.snap @@ -40,6 +40,46 @@ exports[`number > crossSerializeStream > supports numbers 1`] = `"$R[0]=_$.P()"` exports[`number > crossSerializeStream > supports numbers 2`] = `"_$.Ps($R[0],3735928559)"`; +exports[`number > toCrossJSON > supports numbers 1`] = `"{\\"t\\":0,\\"s\\":3735928559}"`; + +exports[`number > toCrossJSON > supports numbers 2`] = `"{\\"t\\":2,\\"s\\":7}"`; + +exports[`number > toCrossJSON > supports numbers 3`] = `"{\\"t\\":2,\\"s\\":5}"`; + +exports[`number > toCrossJSON > supports numbers 4`] = `"{\\"t\\":2,\\"s\\":6}"`; + +exports[`number > toCrossJSON > supports numbers 5`] = `"{\\"t\\":2,\\"s\\":4}"`; + +exports[`number > toCrossJSONAsync > supports numbers 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}}"`; + +exports[`number > toCrossJSONAsync > supports numbers 2`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":7}}"`; + +exports[`number > toCrossJSONAsync > supports numbers 3`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":5}}"`; + +exports[`number > toCrossJSONAsync > supports numbers 4`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":6}}"`; + +exports[`number > toCrossJSONAsync > supports numbers 5`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":2,\\"s\\":4}}"`; + +exports[`number > toCrossJSONStream > supports -0 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`number > toCrossJSONStream > supports -0 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":4}}"`; + +exports[`number > toCrossJSONStream > supports -Infinity 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`number > toCrossJSONStream > supports -Infinity 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":6}}"`; + +exports[`number > toCrossJSONStream > supports Infinity 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`number > toCrossJSONStream > supports Infinity 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":5}}"`; + +exports[`number > toCrossJSONStream > supports NaN 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`number > toCrossJSONStream > supports NaN 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":2,\\"s\\":7}}"`; + +exports[`number > toCrossJSONStream > supports numbers 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`number > toCrossJSONStream > supports numbers 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":0,\\"s\\":3735928559}}"`; + exports[`number > toJSON > supports numbers 1`] = `"{\\"t\\":{\\"t\\":0,\\"s\\":3735928559},\\"f\\":16383,\\"m\\":[]}"`; exports[`number > toJSON > supports numbers 2`] = `"{\\"t\\":{\\"t\\":2,\\"s\\":7},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/number.test.ts b/packages/seroval/test/number.test.ts index 9a1710ba..c1782267 100644 --- a/packages/seroval/test/number.test.ts +++ b/packages/seroval/test/number.test.ts @@ -5,6 +5,9 @@ import { crossSerializeStream, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../src'; @@ -133,4 +136,86 @@ describe('number', () => { }); })); }); + describe('toCrossJSON', () => { + it('supports numbers', () => { + const value = 0xDEADBEEF; + expect(JSON.stringify(toCrossJSON(value))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(NaN))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Infinity))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(-Infinity))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(-0))).toMatchSnapshot(); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports numbers', async () => { + const value = 0xDEADBEEF; + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(value))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(NaN))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Infinity))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(-Infinity))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(-0))), + ).toMatchSnapshot(); + }); + }); + describe('toCrossJSONStream', () => { + it('supports numbers', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(0xDEADBEEF), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports NaN', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(NaN), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Infinity', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Infinity), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports -Infinity', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(-Infinity), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports -0', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(-0), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From ab88689771c263cf6165d03a5c726c511fd4d449 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 10:19:15 +0800 Subject: [PATCH 48/82] Fix data-view test --- .../test/__snapshots__/data-view.test.ts.snap | 8 ++ packages/seroval/test/data-view.test.ts | 108 ++++++++++-------- 2 files changed, 68 insertions(+), 48 deletions(-) diff --git a/packages/seroval/test/__snapshots__/data-view.test.ts.snap b/packages/seroval/test/__snapshots__/data-view.test.ts.snap index 2d8a4cfc..0840cc69 100644 --- a/packages/seroval/test/__snapshots__/data-view.test.ts.snap +++ b/packages/seroval/test/__snapshots__/data-view.test.ts.snap @@ -20,6 +20,14 @@ exports[`DataView > serialize > supports DataView 1`] = `"new DataView(new Uint8 exports[`DataView > serializeAsync > supports DataView 1`] = `"Promise.resolve(new DataView(new Uint8Array([0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]).buffer,0,16))"`; +exports[`DataView > toCrossJSON > supports DataView 1`] = `"{\\"t\\":22,\\"i\\":0,\\"l\\":16,\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]},\\"b\\":0}"`; + +exports[`DataView > toCrossJSONAsync > supports DataView 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":22,\\"i\\":1,\\"l\\":16,\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]},\\"b\\":0}}"`; + +exports[`DataView > toCrossJSONStream > supports DataView 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`DataView > toCrossJSONStream > supports DataView 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":22,\\"i\\":1,\\"l\\":16,\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]},\\"b\\":0}}"`; + exports[`DataView > toJSON > supports DataView 1`] = `"{\\"t\\":{\\"t\\":22,\\"i\\":0,\\"l\\":16,\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]},\\"b\\":0},\\"f\\":16383,\\"m\\":[]}"`; exports[`DataView > toJSONAsync > supports DataView 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":22,\\"i\\":1,\\"l\\":16,\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[0,0,42,0,0,0,0,0,0,0,0,0,0,0,0,0]},\\"b\\":0}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/data-view.test.ts b/packages/seroval/test/data-view.test.ts index cf238c09..6d53e120 100644 --- a/packages/seroval/test/data-view.test.ts +++ b/packages/seroval/test/data-view.test.ts @@ -9,99 +9,80 @@ import { crossSerialize, crossSerializeAsync, crossSerializeStream, + toCrossJSON, + toCrossJSONAsync, + fromCrossJSON, + toCrossJSONStream, } from '../src'; +const BUFFER = new ArrayBuffer(16); +const EXAMPLE = new DataView(BUFFER, 0); +EXAMPLE.setInt16(1, 42); + describe('DataView', () => { describe('serialize', () => { it('supports DataView', () => { - const buffer = new ArrayBuffer(16); - const example = new DataView(buffer, 0); - example.setInt16(1, 42); - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back).toBeInstanceOf(DataView); - expect(back.getInt16(1)).toBe(example.getInt16(1)); + expect(back.getInt16(1)).toBe(EXAMPLE.getInt16(1)); }); }); describe('serializeAsync', () => { it('supports DataView', async () => { - const buffer = new ArrayBuffer(16); - const example = new DataView(buffer, 0); - example.setInt16(1, 42); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = await deserialize>(result); expect(back).toBeInstanceOf(DataView); - expect(back.getInt16(1)).toBe(example.getInt16(1)); + expect(back.getInt16(1)).toBe(EXAMPLE.getInt16(1)); }); }); describe('toJSON', () => { it('supports DataView', () => { - const buffer = new ArrayBuffer(16); - const example = new DataView(buffer, 0); - example.setInt16(1, 42); - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(DataView); - expect(back.getInt16(1)).toBe(example.getInt16(1)); + expect(back.getInt16(1)).toBe(EXAMPLE.getInt16(1)); }); }); describe('toJSONAsync', () => { it('supports DataView', async () => { - const buffer = new ArrayBuffer(16); - const example = new DataView(buffer, 0); - example.setInt16(1, 42); - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = await fromJSON>(result); expect(back).toBeInstanceOf(DataView); - expect(back.getInt16(1)).toBe(example.getInt16(1)); + expect(back.getInt16(1)).toBe(EXAMPLE.getInt16(1)); }); }); describe('crossSerialize', () => { it('supports DataView', () => { - const buffer = new ArrayBuffer(16); - const example = new DataView(buffer, 0); - example.setInt16(1, 42); - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports DataView', () => { - const buffer = new ArrayBuffer(16); - const example = new DataView(buffer, 0); - example.setInt16(1, 42); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports DataView', async () => { - const buffer = new ArrayBuffer(16); - const example = new DataView(buffer, 0); - example.setInt16(1, 42); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports DataView', async () => { - const buffer = new ArrayBuffer(16); - const example = new DataView(buffer, 0); - example.setInt16(1, 42); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports DataView', async () => new Promise((done) => { - const buffer = new ArrayBuffer(16); - const example = new DataView(buffer, 0); - example.setInt16(1, 42); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -112,10 +93,7 @@ describe('DataView', () => { })); describe('scoped', () => { it('supports DataView', async () => new Promise((done) => { - const buffer = new ArrayBuffer(16); - const example = new DataView(buffer, 0); - example.setInt16(1, 42); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -127,4 +105,38 @@ describe('DataView', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports DataView', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(DataView); + expect(back.getInt16(1)).toBe(EXAMPLE.getInt16(1)); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports DataView', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(DataView); + expect(back.getInt16(1)).toBe(EXAMPLE.getInt16(1)); + }); + }); + describe('toCrossJSONStream', () => { + it('supports DataView', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From 100c096d2fa8de045c046de009e455ef7211fba0 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 10:24:10 +0800 Subject: [PATCH 49/82] Fix date test --- .../test/__snapshots__/date.test.ts.snap | 8 ++ packages/seroval/test/date.test.ts | 86 +++++++++++++------ 2 files changed, 66 insertions(+), 28 deletions(-) diff --git a/packages/seroval/test/__snapshots__/date.test.ts.snap b/packages/seroval/test/__snapshots__/date.test.ts.snap index cdd42704..94cbcc9f 100644 --- a/packages/seroval/test/__snapshots__/date.test.ts.snap +++ b/packages/seroval/test/__snapshots__/date.test.ts.snap @@ -20,6 +20,14 @@ exports[`Date > serialize > supports Date 1`] = `"new Date(\\"2023-03-14T11:16:2 exports[`Date > serializeAsync > supports Date 1`] = `"Promise.resolve(new Date(\\"2023-03-14T11:16:24.879Z\\"))"`; +exports[`Date > toCrossJSON > supports Date 1`] = `"{\\"t\\":5,\\"i\\":0,\\"s\\":\\"2023-03-14T11:16:24.879Z\\"}"`; + +exports[`Date > toCrossJSONAsync > supports Date 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":5,\\"i\\":1,\\"s\\":\\"2023-03-14T11:16:24.879Z\\"}}"`; + +exports[`Date > toCrossJSONStream > supports Date 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`Date > toCrossJSONStream > supports Date 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":5,\\"i\\":1,\\"s\\":\\"2023-03-14T11:16:24.879Z\\"}}"`; + exports[`Date > toJSON > supports Date 1`] = `"{\\"t\\":{\\"t\\":5,\\"i\\":0,\\"s\\":\\"2023-03-14T11:16:24.879Z\\"},\\"f\\":16383,\\"m\\":[]}"`; exports[`Date > toJSONAsync > supports Date 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":5,\\"i\\":1,\\"s\\":\\"2023-03-14T11:16:24.879Z\\"}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/date.test.ts b/packages/seroval/test/date.test.ts index d96bd87e..20ee010f 100644 --- a/packages/seroval/test/date.test.ts +++ b/packages/seroval/test/date.test.ts @@ -9,82 +9,79 @@ import { crossSerialize, crossSerializeAsync, crossSerializeStream, + toCrossJSON, + toCrossJSONAsync, + fromCrossJSON, + toCrossJSONStream, } from '../src'; +const EXAMPLE = new Date('2023-03-14T11:16:24.879Z'); + describe('Date', () => { describe('serialize', () => { it('supports Date', () => { - const example = new Date('2023-03-14T11:16:24.879Z'); - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back).toBeInstanceOf(Date); - expect(back.toISOString()).toBe(example.toISOString()); + expect(back.toISOString()).toBe(EXAMPLE.toISOString()); }); }); describe('serializeAsync', () => { it('supports Date', async () => { - const example = new Date('2023-03-14T11:16:24.879Z'); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = await deserialize>(result); expect(back).toBeInstanceOf(Date); - expect(back.toISOString()).toBe(example.toISOString()); + expect(back.toISOString()).toBe(EXAMPLE.toISOString()); }); }); describe('toJSON', () => { it('supports Date', () => { - const example = new Date('2023-03-14T11:16:24.879Z'); - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(Date); - expect(back.toISOString()).toBe(example.toISOString()); + expect(back.toISOString()).toBe(EXAMPLE.toISOString()); }); }); describe('toJSONAsync', () => { it('supports Date', async () => { - const example = new Date('2023-03-14T11:16:24.879Z'); - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = await fromJSON>(result); expect(back).toBeInstanceOf(Date); - expect(back.toISOString()).toBe(example.toISOString()); + expect(back.toISOString()).toBe(EXAMPLE.toISOString()); }); }); describe('crossSerialize', () => { it('supports Date', () => { - const example = new Date('2023-03-14T11:16:24.879Z'); - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Date', () => { - const example = new Date('2023-03-14T11:16:24.879Z'); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports Date', async () => { - const example = new Date('2023-03-14T11:16:24.879Z'); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Date', async () => { - const example = new Date('2023-03-14T11:16:24.879Z'); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports Date', async () => new Promise((done) => { - const example = new Date('2023-03-14T11:16:24.879Z'); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -95,8 +92,7 @@ describe('Date', () => { })); describe('scoped', () => { it('supports Date', async () => new Promise((done) => { - const example = new Date('2023-03-14T11:16:24.879Z'); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -108,4 +104,38 @@ describe('Date', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports Date', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Date); + expect(back.toISOString()).toBe(EXAMPLE.toISOString()); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports Date', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Date); + expect(back.toISOString()).toBe(EXAMPLE.toISOString()); + }); + }); + describe('toCrossJSONStream', () => { + it('supports Date', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From 8bd783fe0c82e4f32047a6640d6323a161f53581 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 10:33:56 +0800 Subject: [PATCH 50/82] Fix error test --- .../test/__snapshots__/error.test.ts.snap | 26 ++++++ packages/seroval/test/error.test.ts | 91 +++++++++++++++++++ 2 files changed, 117 insertions(+) diff --git a/packages/seroval/test/__snapshots__/error.test.ts.snap b/packages/seroval/test/__snapshots__/error.test.ts.snap index 6d230a89..9bcd70d2 100644 --- a/packages/seroval/test/__snapshots__/error.test.ts.snap +++ b/packages/seroval/test/__snapshots__/error.test.ts.snap @@ -64,6 +64,32 @@ exports[`Error > serializeAsync > supports Error.prototype.name 1`] = `"Promise. exports[`Error > serializeAsync > supports other Error classes 1`] = `"Promise.resolve(Object.assign(new ReferenceError(\\"A\\"),{stack:\\"\\"}))"`; +exports[`Error > toCrossJSON > supports Error.prototype.cause 1`] = `"{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"B\\",\\"p\\":{\\"k\\":[\\"stack\\",\\"cause\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":13,\\"i\\":1,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}],\\"s\\":2}}"`; + +exports[`Error > toCrossJSON > supports Error.prototype.name 1`] = `"{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"name\\",\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"ExampleError\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":2}}"`; + +exports[`Error > toCrossJSON > supports other Error classes 1`] = `"{\\"t\\":13,\\"i\\":0,\\"s\\":3,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}"`; + +exports[`Error > toCrossJSONAsync > supports Error.prototype.cause 1`] = `"{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"B\\",\\"p\\":{\\"k\\":[\\"stack\\",\\"cause\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":13,\\"i\\":2,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}}],\\"s\\":2}}"`; + +exports[`Error > toCrossJSONAsync > supports Error.prototype.name 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":13,\\"i\\":1,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"name\\",\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"ExampleError\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":2}}}"`; + +exports[`Error > toCrossJSONAsync > supports other Error classes 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":13,\\"i\\":1,\\"s\\":3,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}}"`; + +exports[`Error > toCrossJSONStream > supports Error.prototype.cause 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`Error > toCrossJSONStream > supports Error.prototype.cause 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":13,\\"i\\":1,\\"s\\":0,\\"m\\":\\"B\\",\\"p\\":{\\"k\\":[\\"stack\\",\\"cause\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":28,\\"i\\":2}],\\"s\\":2}}}"`; + +exports[`Error > toCrossJSONStream > supports Error.prototype.cause 3`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":13,\\"i\\":3,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}}"`; + +exports[`Error > toCrossJSONStream > supports Error.prototype.name 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`Error > toCrossJSONStream > supports Error.prototype.name 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":13,\\"i\\":1,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"name\\",\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"ExampleError\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":2}}}"`; + +exports[`Error > toCrossJSONStream > supports other Error classes 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`Error > toCrossJSONStream > supports other Error classes 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":13,\\"i\\":1,\\"s\\":3,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}}"`; + exports[`Error > toJSON > supports Error.prototype.cause 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"B\\",\\"p\\":{\\"k\\":[\\"stack\\",\\"cause\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":13,\\"i\\":1,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; exports[`Error > toJSON > supports Error.prototype.name 1`] = `"{\\"t\\":{\\"t\\":13,\\"i\\":0,\\"s\\":0,\\"m\\":\\"A\\",\\"p\\":{\\"k\\":[\\"name\\",\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"ExampleError\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":2}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/error.test.ts b/packages/seroval/test/error.test.ts index 96f39d88..609d5c09 100644 --- a/packages/seroval/test/error.test.ts +++ b/packages/seroval/test/error.test.ts @@ -5,6 +5,9 @@ import { crossSerializeStream, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../src'; @@ -263,4 +266,92 @@ describe('Error', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports Error.prototype.name', () => { + const a = new Error('A'); + a.name = 'ExampleError'; + a.stack = ''; + expect(JSON.stringify(toCrossJSON(a))).toMatchSnapshot(); + }); + it('supports Error.prototype.cause', () => { + const a = new Error('A'); + const b = new Error('B', { cause: a }); + a.stack = ''; + b.stack = ''; + expect(JSON.stringify(toCrossJSON(b))).toMatchSnapshot(); + }); + it('supports other Error classes', () => { + const a = new ReferenceError('A'); + a.stack = ''; + expect(JSON.stringify(toCrossJSON(a))).toMatchSnapshot(); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports Error.prototype.name', async () => { + const a = new Error('A'); + a.name = 'ExampleError'; + a.stack = ''; + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(a))), + ).toMatchSnapshot(); + }); + it('supports Error.prototype.cause', async () => { + const a = new Error('A'); + const b = new Error('B', { cause: Promise.resolve(a) }); + a.stack = ''; + b.stack = ''; + expect( + JSON.stringify(await toCrossJSONAsync(b)), + ).toMatchSnapshot(); + }); + it('supports other Error classes', async () => { + const a = new ReferenceError('A'); + a.stack = ''; + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(a))), + ).toMatchSnapshot(); + }); + }); + + describe('toCrossJSONStream', () => { + it('supports Error.prototype.name', async () => new Promise((done) => { + const a = new Error('A'); + a.name = 'ExampleError'; + a.stack = ''; + toCrossJSONStream(Promise.resolve(a), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Error.prototype.cause', async () => new Promise((done) => { + const a = new Error('A'); + const b = new Error('B', { cause: Promise.resolve(a) }); + a.stack = ''; + b.stack = ''; + toCrossJSONStream(Promise.resolve(b), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports other Error classes', async () => new Promise((done) => { + const a = new ReferenceError('A'); + a.stack = ''; + toCrossJSONStream(Promise.resolve(a), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From 59d8ae128aa05dc885e0df81cbaf6bfd782c34e8 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 12:24:20 +0800 Subject: [PATCH 51/82] Fix frozen-object test --- .../__snapshots__/frozen-object.test.ts.snap | 56 ++- packages/seroval/test/frozen-object.test.ts | 446 ++++++++---------- 2 files changed, 254 insertions(+), 248 deletions(-) diff --git a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap index f962a274..d12ab217 100644 --- a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap @@ -48,13 +48,11 @@ exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterato exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>_$.Ps($R[0],$R[1]={a:$R[2]=_$.P(),b:$R[3]=_$.P()}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>_$.Ps($R[1],$R[0]))($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>_$.Ps($R[2],$R[1]))($R[\\"example\\"])"`; - -exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 4`] = `"($R=>_$.Ps($R[3],$R[1]))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>_$.Ps($R[2],$R[0]))($R[\\"example\\"])"`; exports[`frozen object > crossSerializeStream > supports Objects 1`] = `"$R[0]=_$.P()"`; @@ -76,13 +74,11 @@ exports[`frozen object > crossSerializeStream > supports Symbol.iterator 1`] = ` exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; -exports[`frozen object > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; - -exports[`frozen object > crossSerializeStream > supports self-recursion 2`] = `"(_$.Ps($R[0],$R[1]={a:$R[2]=_$.P(),b:$R[3]=_$.P()}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeStream > supports self-recursion 1`] = `"($R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()},Object.freeze($R[0]),$R[0])"`; -exports[`frozen object > crossSerializeStream > supports self-recursion 3`] = `"_$.Ps($R[2],$R[1])"`; +exports[`frozen object > crossSerializeStream > supports self-recursion 2`] = `"_$.Ps($R[1],$R[0])"`; -exports[`frozen object > crossSerializeStream > supports self-recursion 4`] = `"_$.Ps($R[3],$R[1])"`; +exports[`frozen object > crossSerializeStream > supports self-recursion 3`] = `"_$.Ps($R[2],$R[0])"`; exports[`frozen object > serialize > supports Objects 1`] = `"(h=>(h={hello:\\"world\\"},Object.freeze(h),h))()"`; @@ -98,6 +94,46 @@ exports[`frozen object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j exports[`frozen object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.freeze(h),h))()"`; +exports[`frozen object > toCrossJSON > supports Objects 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3,\\"x\\":{}}"`; + +exports[`frozen object > toCrossJSON > supports Symbol.iterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}}"`; + +exports[`frozen object > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":3,\\"x\\":{}}"`; + +exports[`frozen object > toCrossJSONAsync > supports Objects 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3,\\"x\\":{}}}"`; + +exports[`frozen object > toCrossJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}}"`; + +exports[`frozen object > toCrossJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; + +exports[`frozen object > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":3,\\"x\\":{}}"`; + +exports[`frozen object > toCrossJSONStream > supports Objects 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`frozen object > toCrossJSONStream > supports Objects 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3,\\"x\\":{}}}"`; + +exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":31,\\"i\\":1}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":2,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":3,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":2}}}}}"`; + +exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 2`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":1}],\\"o\\":0}}"`; + +exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 3`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":2}],\\"o\\":0}}"`; + +exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 4`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; + +exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 5`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":7,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":2,\\"s\\":1}],\\"o\\":0}}"`; + +exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 6`] = `"{\\"t\\":33,\\"i\\":1}"`; + +exports[`frozen object > toCrossJSONStream > supports Symbol.iterator 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`frozen object > toCrossJSONStream > supports Symbol.iterator 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; + +exports[`frozen object > toCrossJSONStream > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":28,\\"i\\":1},{\\"t\\":28,\\"i\\":2}],\\"s\\":2},\\"o\\":3,\\"x\\":{}}"`; + +exports[`frozen object > toCrossJSONStream > supports self-recursion 2`] = `"{\\"t\\":29,\\"i\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; + +exports[`frozen object > toCrossJSONStream > supports self-recursion 3`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; + exports[`frozen object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; exports[`frozen object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; diff --git a/packages/seroval/test/frozen-object.test.ts b/packages/seroval/test/frozen-object.test.ts index b0ad1fdc..532df4c0 100644 --- a/packages/seroval/test/frozen-object.test.ts +++ b/packages/seroval/test/frozen-object.test.ts @@ -4,49 +4,68 @@ import { crossSerializeAsync, crossSerializeStream, deserialize, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../src'; +const EXAMPLE = Object.freeze({ hello: 'world' }); + +const RECURSIVE = {} as Record; +RECURSIVE.a = RECURSIVE; +RECURSIVE.b = RECURSIVE; +Object.freeze(RECURSIVE); + +const ITERABLE = Object.freeze({ + * [Symbol.iterator]() { + yield 1; + yield 2; + yield 3; + }, +}); + +const ASYNC_RECURSIVE = {} as Record>; +ASYNC_RECURSIVE.a = Promise.resolve(ASYNC_RECURSIVE); +ASYNC_RECURSIVE.b = Promise.resolve(ASYNC_RECURSIVE); +Object.freeze(ASYNC_RECURSIVE); + +const ASYNC_ITERABLE = Object.freeze({ + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + yield 2; + yield 3; + }, +}); + describe('frozen object', () => { describe('serialize', () => { it('supports Objects', () => { - const example = ({ hello: 'world' }) as { hello: string }; - Object.freeze(example); - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(Object.isFrozen(back)).toBe(true); expect(back.constructor).toBe(Object); - expect(back.hello).toBe(example.hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', () => { - const example = {} as Record; - example.a = example; - example.b = example; - Object.freeze(example); - const result = serialize(example); + const result = serialize(RECURSIVE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(Object.isFrozen(back)).toBe(true); expect(back.a).toBe(back); expect(back.b).toBe(back); }); it('supports Symbol.iterator', () => { - const example = ({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - Object.freeze(example); - const result = serialize(example); + const result = serialize(ITERABLE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(Object.isFrozen(back)).toBe(true); expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); @@ -54,55 +73,33 @@ describe('frozen object', () => { }); describe('serializeAsync', () => { it('supports Objects', async () => { - const example = Promise.resolve(Object.freeze({ hello: 'world' }) as { hello: string }); - const result = await serializeAsync(example); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>>(result); + const back = await deserialize>(result); expect(Object.isFrozen(back)).toBe(true); expect(back.constructor).toBe(Object); - expect(back.hello).toBe((await example).hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', async () => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - Object.freeze(example); - const result = await serializeAsync(example); + const result = await serializeAsync(ASYNC_RECURSIVE); expect(result).toMatchSnapshot(); - const back = deserialize>>(result); + const back = deserialize(result); expect(Object.isFrozen(back)).toBe(true); expect(await back.a).toBe(back); expect(await back.b).toBe(back); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve(Object.freeze({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - const result = await serializeAsync(example); + const result = await serializeAsync(Promise.resolve(ITERABLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>>(result); + const back = await deserialize>(result); expect(Object.isFrozen(back)).toBe(true); expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); }); it('supports Symbol.asyncIterator', async () => { - const example = Object.freeze({ - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable); - const result = await serializeAsync(example); + const result = await serializeAsync(ASYNC_ITERABLE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(Object.isFrozen(back)).toBe(true); expect(back.constructor).toBe(Object); expect(Symbol.asyncIterator in back).toBe(true); @@ -110,38 +107,25 @@ describe('frozen object', () => { }); describe('toJSON', () => { it('supports Objects', () => { - const example = Object.freeze({ hello: 'world' }) as { hello: string }; - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(Object.isFrozen(back)).toBe(true); expect(back.constructor).toBe(Object); - expect(back.hello).toBe(example.hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', () => { - const example = {} as Record; - example.a = example; - example.b = example; - Object.freeze(example); - const result = toJSON(example); + const result = toJSON(RECURSIVE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(Object.isFrozen(back)).toBe(true); expect(back.a).toBe(back); expect(back.b).toBe(back); }); it('supports Symbol.iterator', () => { - const example = ({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - Object.freeze(example); - const result = toJSON(example); + const result = toJSON(ITERABLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(Object.isFrozen(back)).toBe(true); expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); @@ -149,55 +133,33 @@ describe('frozen object', () => { }); describe('toJSONAsync', () => { it('supports Objects', async () => { - const example = Promise.resolve(Object.freeze({ hello: 'world' }) as { hello: string }); - const result = await toJSONAsync(example); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>>(result); + const back = await fromJSON>(result); expect(Object.isFrozen(back)).toBe(true); expect(back.constructor).toBe(Object); - expect(back.hello).toBe((await example).hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', async () => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - Object.freeze(example); - const result = await toJSONAsync(example); + const result = await toJSONAsync(ASYNC_RECURSIVE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>>(result); + const back = fromJSON(result); expect(Object.isFrozen(back)).toBe(true); expect(await back.a).toBe(back); expect(await back.b).toBe(back); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve(Object.freeze({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - const result = await toJSONAsync(example); + const result = await toJSONAsync(Promise.resolve(ITERABLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>>(result); + const back = await fromJSON>(result); expect(Object.isFrozen(back)).toBe(true); expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); }); it('supports Symbol.asyncIterator', async () => { - const example = Object.freeze({ - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable); - const result = await toJSONAsync(example); + const result = await toJSONAsync(ASYNC_ITERABLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(Object.isFrozen(back)).toBe(true); expect(back.constructor).toBe(Object); expect(Symbol.asyncIterator in back).toBe(true); @@ -211,138 +173,73 @@ describe('frozen object', () => { expect(result).toMatchSnapshot(); }); it('supports self-recursion', () => { - const example = {} as Record; - example.a = example; - example.b = example; - Object.freeze(example); - const result = crossSerialize(example); + const result = crossSerialize(RECURSIVE); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', () => { - const example = ({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - Object.freeze(example); - const result = crossSerialize(example); + const result = crossSerialize(ITERABLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Objects', () => { - const example = ({ hello: 'world' }) as { hello: string }; - Object.freeze(example); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports self-recursion', () => { - const example = {} as Record; - example.a = example; - example.b = example; - Object.freeze(example); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(RECURSIVE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', () => { - const example = ({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - Object.freeze(example); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(ITERABLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports Objects', async () => { - const example = Promise.resolve(Object.freeze({ hello: 'world' }) as { hello: string }); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); it('supports self-recursion', async () => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - Object.freeze(example); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(ASYNC_RECURSIVE); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve(Object.freeze({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(Promise.resolve(ITERABLE)); expect(result).toMatchSnapshot(); }); it('supports Symbol.asyncIterator', async () => { - const example = Object.freeze({ - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(ASYNC_ITERABLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Objects', async () => { - const example = Promise.resolve(Object.freeze({ hello: 'world' }) as { hello: string }); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync( + Promise.resolve(EXAMPLE), + { scopeId: 'example' }, + ); expect(result).toMatchSnapshot(); }); it('supports self-recursion', async () => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - Object.freeze(example); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync(ASYNC_RECURSIVE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve(Object.freeze({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync( + Promise.resolve(ITERABLE), + { scopeId: 'example' }, + ); expect(result).toMatchSnapshot(); }); it('supports Symbol.asyncIterator', async () => { - const example = Object.freeze({ - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync(ASYNC_ITERABLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports Objects', async () => new Promise((done) => { - const example = Promise.resolve(Object.freeze({ hello: 'world' }) as { hello: string }); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -352,11 +249,7 @@ describe('frozen object', () => { }); })); it('supports self-recursion', async () => new Promise((done) => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - Object.freeze(example); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(ASYNC_RECURSIVE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -366,14 +259,7 @@ describe('frozen object', () => { }); })); it('supports Symbol.iterator', async () => new Promise((done) => { - const example = Promise.resolve(Object.freeze({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(ITERABLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -383,17 +269,7 @@ describe('frozen object', () => { }); })); it('supports Symbol.asyncIterator', async () => new Promise((done) => { - const example = Object.freeze({ - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable); - crossSerializeStream(example, { + crossSerializeStream(ASYNC_ITERABLE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -404,8 +280,7 @@ describe('frozen object', () => { })); describe('scoped', () => { it('supports Objects', async () => new Promise((done) => { - const example = Promise.resolve(Object.freeze({ hello: 'world' }) as { hello: string }); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -416,11 +291,7 @@ describe('frozen object', () => { }); })); it('supports self-recursion', async () => new Promise((done) => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - Object.freeze(example); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(ASYNC_RECURSIVE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -431,14 +302,7 @@ describe('frozen object', () => { }); })); it('supports Symbol.iterator', async () => new Promise((done) => { - const example = Promise.resolve(Object.freeze({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(ITERABLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -449,17 +313,7 @@ describe('frozen object', () => { }); })); it('supports Symbol.asyncIterator', async () => new Promise((done) => { - const example = Object.freeze({ - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable); - crossSerializeStream(example, { + crossSerializeStream(ASYNC_ITERABLE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -471,4 +325,120 @@ describe('frozen object', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports Objects', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(Object.isFrozen(back)).toBe(true); + expect(back.constructor).toBe(Object); + expect(back.hello).toBe(EXAMPLE.hello); + }); + it('supports self-recursion', () => { + const result = toCrossJSON(RECURSIVE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(Object.isFrozen(back)).toBe(true); + expect(back.a).toBe(back); + expect(back.b).toBe(back); + }); + it('supports Symbol.iterator', () => { + const result = toCrossJSON(ITERABLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(Object.isFrozen(back)).toBe(true); + expect(back.constructor).toBe(Object); + expect([...back]).toMatchObject([1, 2, 3]); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports Objects', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(Object.isFrozen(back)).toBe(true); + expect(back.constructor).toBe(Object); + expect(back.hello).toBe(EXAMPLE.hello); + }); + it('supports self-recursion', async () => { + const result = await toCrossJSONAsync(ASYNC_RECURSIVE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(Object.isFrozen(back)).toBe(true); + expect(await back.a).toBe(back); + expect(await back.b).toBe(back); + }); + it('supports Symbol.iterator', async () => { + const result = await toCrossJSONAsync(Promise.resolve(ITERABLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(Object.isFrozen(back)).toBe(true); + expect(back.constructor).toBe(Object); + expect([...back]).toMatchObject([1, 2, 3]); + }); + it('supports Symbol.asyncIterator', async () => { + const result = await toCrossJSONAsync(ASYNC_ITERABLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(Object.isFrozen(back)).toBe(true); + expect(back.constructor).toBe(Object); + expect(Symbol.asyncIterator in back).toBe(true); + }); + }); + describe('toCrossJSONStream', () => { + it('supports Objects', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports self-recursion', async () => new Promise((done) => { + toCrossJSONStream(ASYNC_RECURSIVE, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.iterator', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(ITERABLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.asyncIterator', async () => new Promise((done) => { + toCrossJSONStream(ASYNC_ITERABLE, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From 1c0c47bc6ca30f6c8951cc30532e8be3f6563d47 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 12:25:25 +0800 Subject: [PATCH 52/82] Fix sealed-object test --- .../__snapshots__/sealed-object.test.ts.snap | 56 ++- packages/seroval/test/sealed-object.test.ts | 446 ++++++++---------- 2 files changed, 254 insertions(+), 248 deletions(-) diff --git a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap index fd26545e..8393d34a 100644 --- a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap @@ -48,13 +48,11 @@ exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterato exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>_$.Ps($R[0],$R[1]={a:$R[2]=_$.P(),b:$R[3]=_$.P()}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>_$.Ps($R[1],$R[0]))($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>_$.Ps($R[2],$R[1]))($R[\\"example\\"])"`; - -exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 4`] = `"($R=>_$.Ps($R[3],$R[1]))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>_$.Ps($R[2],$R[0]))($R[\\"example\\"])"`; exports[`sealed object > crossSerializeStream > supports Objects 1`] = `"$R[0]=_$.P()"`; @@ -76,13 +74,11 @@ exports[`sealed object > crossSerializeStream > supports Symbol.iterator 1`] = ` exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; -exports[`sealed object > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; - -exports[`sealed object > crossSerializeStream > supports self-recursion 2`] = `"(_$.Ps($R[0],$R[1]={a:$R[2]=_$.P(),b:$R[3]=_$.P()}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeStream > supports self-recursion 1`] = `"($R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()},Object.seal($R[0]),$R[0])"`; -exports[`sealed object > crossSerializeStream > supports self-recursion 3`] = `"_$.Ps($R[2],$R[1])"`; +exports[`sealed object > crossSerializeStream > supports self-recursion 2`] = `"_$.Ps($R[1],$R[0])"`; -exports[`sealed object > crossSerializeStream > supports self-recursion 4`] = `"_$.Ps($R[3],$R[1])"`; +exports[`sealed object > crossSerializeStream > supports self-recursion 3`] = `"_$.Ps($R[2],$R[0])"`; exports[`sealed object > serialize > supports Objects 1`] = `"(h=>(h={hello:\\"world\\"},Object.seal(h),h))()"`; @@ -98,6 +94,46 @@ exports[`sealed object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j exports[`sealed object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.seal(h),h))()"`; +exports[`sealed object > toCrossJSON > supports Objects 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2,\\"x\\":{}}"`; + +exports[`sealed object > toCrossJSON > supports Symbol.iterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}}"`; + +exports[`sealed object > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":2,\\"x\\":{}}"`; + +exports[`sealed object > toCrossJSONAsync > supports Objects 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2,\\"x\\":{}}}"`; + +exports[`sealed object > toCrossJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}}"`; + +exports[`sealed object > toCrossJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; + +exports[`sealed object > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":2,\\"x\\":{}}"`; + +exports[`sealed object > toCrossJSONStream > supports Objects 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`sealed object > toCrossJSONStream > supports Objects 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2,\\"x\\":{}}}"`; + +exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":31,\\"i\\":1}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":2,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":3,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":2}}}}}"`; + +exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 2`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":1}],\\"o\\":0}}"`; + +exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 3`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":2}],\\"o\\":0}}"`; + +exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 4`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; + +exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 5`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":7,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":2,\\"s\\":1}],\\"o\\":0}}"`; + +exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 6`] = `"{\\"t\\":33,\\"i\\":1}"`; + +exports[`sealed object > toCrossJSONStream > supports Symbol.iterator 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`sealed object > toCrossJSONStream > supports Symbol.iterator 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; + +exports[`sealed object > toCrossJSONStream > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":28,\\"i\\":1},{\\"t\\":28,\\"i\\":2}],\\"s\\":2},\\"o\\":2,\\"x\\":{}}"`; + +exports[`sealed object > toCrossJSONStream > supports self-recursion 2`] = `"{\\"t\\":29,\\"i\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; + +exports[`sealed object > toCrossJSONStream > supports self-recursion 3`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; + exports[`sealed object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; exports[`sealed object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; diff --git a/packages/seroval/test/sealed-object.test.ts b/packages/seroval/test/sealed-object.test.ts index 916e8300..d29d11ab 100644 --- a/packages/seroval/test/sealed-object.test.ts +++ b/packages/seroval/test/sealed-object.test.ts @@ -4,49 +4,68 @@ import { crossSerializeAsync, crossSerializeStream, deserialize, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../src'; +const EXAMPLE = Object.seal({ hello: 'world' }); + +const RECURSIVE = {} as Record; +RECURSIVE.a = RECURSIVE; +RECURSIVE.b = RECURSIVE; +Object.seal(RECURSIVE); + +const ITERABLE = Object.seal({ + * [Symbol.iterator]() { + yield 1; + yield 2; + yield 3; + }, +}); + +const ASYNC_RECURSIVE = {} as Record>; +ASYNC_RECURSIVE.a = Promise.resolve(ASYNC_RECURSIVE); +ASYNC_RECURSIVE.b = Promise.resolve(ASYNC_RECURSIVE); +Object.seal(ASYNC_RECURSIVE); + +const ASYNC_ITERABLE = Object.seal({ + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + yield 2; + yield 3; + }, +}); + describe('sealed object', () => { describe('serialize', () => { it('supports Objects', () => { - const example = ({ hello: 'world' }) as { hello: string }; - Object.seal(example); - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(Object.isSealed(back)).toBe(true); expect(back.constructor).toBe(Object); - expect(back.hello).toBe(example.hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', () => { - const example = {} as Record; - example.a = example; - example.b = example; - Object.seal(example); - const result = serialize(example); + const result = serialize(RECURSIVE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(Object.isSealed(back)).toBe(true); expect(back.a).toBe(back); expect(back.b).toBe(back); }); it('supports Symbol.iterator', () => { - const example = ({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - Object.seal(example); - const result = serialize(example); + const result = serialize(ITERABLE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(Object.isSealed(back)).toBe(true); expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); @@ -54,55 +73,33 @@ describe('sealed object', () => { }); describe('serializeAsync', () => { it('supports Objects', async () => { - const example = Promise.resolve(Object.seal({ hello: 'world' }) as { hello: string }); - const result = await serializeAsync(example); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>>(result); + const back = await deserialize>(result); expect(Object.isSealed(back)).toBe(true); expect(back.constructor).toBe(Object); - expect(back.hello).toBe((await example).hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', async () => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - Object.seal(example); - const result = await serializeAsync(example); + const result = await serializeAsync(ASYNC_RECURSIVE); expect(result).toMatchSnapshot(); - const back = deserialize>>(result); + const back = deserialize(result); expect(Object.isSealed(back)).toBe(true); expect(await back.a).toBe(back); expect(await back.b).toBe(back); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve(Object.seal({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - const result = await serializeAsync(example); + const result = await serializeAsync(Promise.resolve(ITERABLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>>(result); + const back = await deserialize>(result); expect(Object.isSealed(back)).toBe(true); expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); }); it('supports Symbol.asyncIterator', async () => { - const example = Object.seal({ - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable); - const result = await serializeAsync(example); + const result = await serializeAsync(ASYNC_ITERABLE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(Object.isSealed(back)).toBe(true); expect(back.constructor).toBe(Object); expect(Symbol.asyncIterator in back).toBe(true); @@ -110,38 +107,25 @@ describe('sealed object', () => { }); describe('toJSON', () => { it('supports Objects', () => { - const example = Object.seal({ hello: 'world' }) as { hello: string }; - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(Object.isSealed(back)).toBe(true); expect(back.constructor).toBe(Object); - expect(back.hello).toBe(example.hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', () => { - const example = {} as Record; - example.a = example; - example.b = example; - Object.seal(example); - const result = toJSON(example); + const result = toJSON(RECURSIVE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(Object.isSealed(back)).toBe(true); expect(back.a).toBe(back); expect(back.b).toBe(back); }); it('supports Symbol.iterator', () => { - const example = ({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - Object.seal(example); - const result = toJSON(example); + const result = toJSON(ITERABLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(Object.isSealed(back)).toBe(true); expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); @@ -149,55 +133,33 @@ describe('sealed object', () => { }); describe('toJSONAsync', () => { it('supports Objects', async () => { - const example = Promise.resolve(Object.seal({ hello: 'world' }) as { hello: string }); - const result = await toJSONAsync(example); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>>(result); + const back = await fromJSON>(result); expect(Object.isSealed(back)).toBe(true); expect(back.constructor).toBe(Object); - expect(back.hello).toBe((await example).hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', async () => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - Object.seal(example); - const result = await toJSONAsync(example); + const result = await toJSONAsync(ASYNC_RECURSIVE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>>(result); + const back = fromJSON(result); expect(Object.isSealed(back)).toBe(true); expect(await back.a).toBe(back); expect(await back.b).toBe(back); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve(Object.seal({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - const result = await toJSONAsync(example); + const result = await toJSONAsync(Promise.resolve(ITERABLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>>(result); + const back = await fromJSON>(result); expect(Object.isSealed(back)).toBe(true); expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); }); it('supports Symbol.asyncIterator', async () => { - const example = Object.seal({ - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable); - const result = await toJSONAsync(example); + const result = await toJSONAsync(ASYNC_ITERABLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(Object.isSealed(back)).toBe(true); expect(back.constructor).toBe(Object); expect(Symbol.asyncIterator in back).toBe(true); @@ -211,138 +173,73 @@ describe('sealed object', () => { expect(result).toMatchSnapshot(); }); it('supports self-recursion', () => { - const example = {} as Record; - example.a = example; - example.b = example; - Object.seal(example); - const result = crossSerialize(example); + const result = crossSerialize(RECURSIVE); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', () => { - const example = ({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - Object.seal(example); - const result = crossSerialize(example); + const result = crossSerialize(ITERABLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Objects', () => { - const example = ({ hello: 'world' }) as { hello: string }; - Object.seal(example); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports self-recursion', () => { - const example = {} as Record; - example.a = example; - example.b = example; - Object.seal(example); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(RECURSIVE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', () => { - const example = ({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - Object.seal(example); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(ITERABLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports Objects', async () => { - const example = Promise.resolve(Object.seal({ hello: 'world' }) as { hello: string }); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); it('supports self-recursion', async () => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - Object.seal(example); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(ASYNC_RECURSIVE); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve(Object.seal({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(Promise.resolve(ITERABLE)); expect(result).toMatchSnapshot(); }); it('supports Symbol.asyncIterator', async () => { - const example = Object.seal({ - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(ASYNC_ITERABLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Objects', async () => { - const example = Promise.resolve(Object.seal({ hello: 'world' }) as { hello: string }); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync( + Promise.resolve(EXAMPLE), + { scopeId: 'example' }, + ); expect(result).toMatchSnapshot(); }); it('supports self-recursion', async () => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - Object.seal(example); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync(ASYNC_RECURSIVE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve(Object.seal({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync( + Promise.resolve(ITERABLE), + { scopeId: 'example' }, + ); expect(result).toMatchSnapshot(); }); it('supports Symbol.asyncIterator', async () => { - const example = Object.seal({ - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync(ASYNC_ITERABLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports Objects', async () => new Promise((done) => { - const example = Promise.resolve(Object.seal({ hello: 'world' }) as { hello: string }); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -352,11 +249,7 @@ describe('sealed object', () => { }); })); it('supports self-recursion', async () => new Promise((done) => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - Object.seal(example); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(ASYNC_RECURSIVE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -366,14 +259,7 @@ describe('sealed object', () => { }); })); it('supports Symbol.iterator', async () => new Promise((done) => { - const example = Promise.resolve(Object.seal({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(ITERABLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -383,17 +269,7 @@ describe('sealed object', () => { }); })); it('supports Symbol.asyncIterator', async () => new Promise((done) => { - const example = Object.seal({ - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable); - crossSerializeStream(example, { + crossSerializeStream(ASYNC_ITERABLE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -404,8 +280,7 @@ describe('sealed object', () => { })); describe('scoped', () => { it('supports Objects', async () => new Promise((done) => { - const example = Promise.resolve(Object.seal({ hello: 'world' }) as { hello: string }); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -416,11 +291,7 @@ describe('sealed object', () => { }); })); it('supports self-recursion', async () => new Promise((done) => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - Object.seal(example); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(ASYNC_RECURSIVE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -431,14 +302,7 @@ describe('sealed object', () => { }); })); it('supports Symbol.iterator', async () => new Promise((done) => { - const example = Promise.resolve(Object.seal({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(ITERABLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -449,17 +313,7 @@ describe('sealed object', () => { }); })); it('supports Symbol.asyncIterator', async () => new Promise((done) => { - const example = Object.seal({ - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable); - crossSerializeStream(example, { + crossSerializeStream(ASYNC_ITERABLE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -471,4 +325,120 @@ describe('sealed object', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports Objects', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(Object.isSealed(back)).toBe(true); + expect(back.constructor).toBe(Object); + expect(back.hello).toBe(EXAMPLE.hello); + }); + it('supports self-recursion', () => { + const result = toCrossJSON(RECURSIVE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(Object.isSealed(back)).toBe(true); + expect(back.a).toBe(back); + expect(back.b).toBe(back); + }); + it('supports Symbol.iterator', () => { + const result = toCrossJSON(ITERABLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(Object.isSealed(back)).toBe(true); + expect(back.constructor).toBe(Object); + expect([...back]).toMatchObject([1, 2, 3]); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports Objects', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(Object.isSealed(back)).toBe(true); + expect(back.constructor).toBe(Object); + expect(back.hello).toBe(EXAMPLE.hello); + }); + it('supports self-recursion', async () => { + const result = await toCrossJSONAsync(ASYNC_RECURSIVE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(Object.isSealed(back)).toBe(true); + expect(await back.a).toBe(back); + expect(await back.b).toBe(back); + }); + it('supports Symbol.iterator', async () => { + const result = await toCrossJSONAsync(Promise.resolve(ITERABLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(Object.isSealed(back)).toBe(true); + expect(back.constructor).toBe(Object); + expect([...back]).toMatchObject([1, 2, 3]); + }); + it('supports Symbol.asyncIterator', async () => { + const result = await toCrossJSONAsync(ASYNC_ITERABLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(Object.isSealed(back)).toBe(true); + expect(back.constructor).toBe(Object); + expect(Symbol.asyncIterator in back).toBe(true); + }); + }); + describe('toCrossJSONStream', () => { + it('supports Objects', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports self-recursion', async () => new Promise((done) => { + toCrossJSONStream(ASYNC_RECURSIVE, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.iterator', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(ITERABLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.asyncIterator', async () => new Promise((done) => { + toCrossJSONStream(ASYNC_ITERABLE, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From f87636a76491da0fe2e88346f1b37126511eb8ec Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 12:31:08 +0800 Subject: [PATCH 53/82] Fix object test --- .../test/__snapshots__/object.test.ts.snap | 60 ++- packages/seroval/test/object.test.ts | 443 +++++++++--------- 2 files changed, 260 insertions(+), 243 deletions(-) diff --git a/packages/seroval/test/__snapshots__/object.test.ts.snap b/packages/seroval/test/__snapshots__/object.test.ts.snap index 1b397d9c..4948ad1e 100644 --- a/packages/seroval/test/__snapshots__/object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/object.test.ts.snap @@ -12,7 +12,7 @@ exports[`objects > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($ exports[`objects > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; -exports[`objects > crossSerialize > supports Objects 1`] = `"$R[0]={hello:\\"world\\"}"`; +exports[`objects > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])"`; exports[`objects > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; @@ -54,13 +54,11 @@ exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 1`] exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()})($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>_$.Ps($R[0],$R[1]={a:$R[2]=_$.P(),b:$R[3]=_$.P()}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>_$.Ps($R[1],$R[0]))($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>_$.Ps($R[2],$R[1]))($R[\\"example\\"])"`; - -exports[`objects > crossSerializeStream > scoped > supports self-recursion 4`] = `"($R=>_$.Ps($R[3],$R[1]))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>_$.Ps($R[2],$R[0]))($R[\\"example\\"])"`; exports[`objects > crossSerializeStream > supports Objects 1`] = `"$R[0]=_$.P()"`; @@ -82,13 +80,11 @@ exports[`objects > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0] exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; -exports[`objects > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; - -exports[`objects > crossSerializeStream > supports self-recursion 2`] = `"_$.Ps($R[0],$R[1]={a:$R[2]=_$.P(),b:$R[3]=_$.P()})"`; +exports[`objects > crossSerializeStream > supports self-recursion 1`] = `"$R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()}"`; -exports[`objects > crossSerializeStream > supports self-recursion 3`] = `"_$.Ps($R[2],$R[1])"`; +exports[`objects > crossSerializeStream > supports self-recursion 2`] = `"_$.Ps($R[1],$R[0])"`; -exports[`objects > crossSerializeStream > supports self-recursion 4`] = `"_$.Ps($R[3],$R[1])"`; +exports[`objects > crossSerializeStream > supports self-recursion 3`] = `"_$.Ps($R[2],$R[0])"`; exports[`objects > serialize > supports Objects 1`] = `"({hello:\\"world\\"})"`; @@ -104,13 +100,53 @@ exports[`objects > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promis exports[`objects > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)}))()"`; +exports[`objects > toCrossJSON > supports Objects 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}"`; + +exports[`objects > toCrossJSON > supports Symbol.iterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}}"`; + +exports[`objects > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0,\\"x\\":{}}"`; + +exports[`objects > toCrossJSONAsync > supports Objects 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}"`; + +exports[`objects > toCrossJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}}"`; + +exports[`objects > toCrossJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; + +exports[`objects > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0,\\"x\\":{}}"`; + +exports[`objects > toCrossJSONStream > supports Objects 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`objects > toCrossJSONStream > supports Objects 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}"`; + +exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":31,\\"i\\":1}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":2,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":3,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":2}}}}}"`; + +exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 2`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":1}],\\"o\\":0}}"`; + +exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 3`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":2}],\\"o\\":0}}"`; + +exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 4`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; + +exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 5`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":7,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":2,\\"s\\":1}],\\"o\\":0}}"`; + +exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 6`] = `"{\\"t\\":33,\\"i\\":1}"`; + +exports[`objects > toCrossJSONStream > supports Symbol.iterator 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`objects > toCrossJSONStream > supports Symbol.iterator 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; + +exports[`objects > toCrossJSONStream > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":28,\\"i\\":1},{\\"t\\":28,\\"i\\":2}],\\"s\\":2},\\"o\\":0,\\"x\\":{}}"`; + +exports[`objects > toCrossJSONStream > supports self-recursion 2`] = `"{\\"t\\":29,\\"i\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; + +exports[`objects > toCrossJSONStream > supports self-recursion 3`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; + exports[`objects > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; exports[`objects > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; exports[`objects > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; -exports[`objects > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`objects > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; exports[`objects > toJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; diff --git a/packages/seroval/test/object.test.ts b/packages/seroval/test/object.test.ts index e57c95c0..5e87a021 100644 --- a/packages/seroval/test/object.test.ts +++ b/packages/seroval/test/object.test.ts @@ -1,185 +1,152 @@ import { describe, it, expect } from 'vitest'; import { + Feature, compileJSON, crossSerialize, crossSerializeAsync, crossSerializeStream, deserialize, - Feature, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../src'; +const EXAMPLE = { hello: 'world' }; + +const RECURSIVE = {} as Record; +RECURSIVE.a = RECURSIVE; +RECURSIVE.b = RECURSIVE; + +const ITERABLE = { + * [Symbol.iterator](): Generator { + yield 1; + yield 2; + yield 3; + }, +}; + +const ASYNC_RECURSIVE = {} as Record>; +ASYNC_RECURSIVE.a = Promise.resolve(ASYNC_RECURSIVE); +ASYNC_RECURSIVE.b = Promise.resolve(ASYNC_RECURSIVE); + +const ASYNC_ITERABLE = { + async* [Symbol.asyncIterator](): AsyncGenerator { + await Promise.resolve(); + yield 1; + yield 2; + yield 3; + }, +}; + describe('objects', () => { describe('serialize', () => { it('supports Objects', () => { - const example = ({ hello: 'world' }) as { hello: string }; - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(back.constructor).toBe(Object); - expect(back.hello).toBe(example.hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', () => { - const example = {} as Record; - example.a = example; - example.b = example; - const result = serialize(example); + const result = serialize(RECURSIVE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(back.a).toBe(back); expect(back.b).toBe(back); }); it('supports Symbol.iterator', () => { - const example = ({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - const result = serialize(example); + const result = serialize(ITERABLE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); }); }); describe('serializeAsync', () => { it('supports Objects', async () => { - const example = Promise.resolve(({ hello: 'world' }) as { hello: string }); - const result = await serializeAsync(example); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>>(result); + const back = await deserialize>(result); expect(back.constructor).toBe(Object); - expect(back.hello).toBe((await example).hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', async () => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - const result = await serializeAsync(example); + const result = await serializeAsync(ASYNC_RECURSIVE); expect(result).toMatchSnapshot(); - const back = deserialize>>(result); + const back = deserialize(result); expect(await back.a).toBe(back); expect(await back.b).toBe(back); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve(({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - const result = await serializeAsync(example); + const result = await serializeAsync(Promise.resolve(ITERABLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>>(result); + const back = await deserialize>(result); expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); }); it('supports Symbol.asyncIterator', async () => { - const example = { - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable; - const result = await serializeAsync(example); + const result = await serializeAsync(ASYNC_ITERABLE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(back.constructor).toBe(Object); expect(Symbol.asyncIterator in back).toBe(true); }); }); describe('toJSON', () => { it('supports Objects', () => { - const example = ({ hello: 'world' }) as { hello: string }; - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(back.constructor).toBe(Object); - expect(back.hello).toBe(example.hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', () => { - const example = {} as Record; - example.a = example; - example.b = example; - const result = toJSON(example); + const result = toJSON(RECURSIVE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(back.a).toBe(back); expect(back.b).toBe(back); }); it('supports Symbol.iterator', () => { - const example = ({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - const result = toJSON(example); + const result = toJSON(ITERABLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); }); }); describe('toJSONAsync', () => { it('supports Objects', async () => { - const example = ({ hello: 'world' }) as { hello: string }; - const result = await toJSONAsync(example); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>>(result); + const back = await fromJSON>(result); expect(back.constructor).toBe(Object); - expect(back.hello).toBe(example.hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', async () => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - const result = await toJSONAsync(example); + const result = await toJSONAsync(ASYNC_RECURSIVE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>>(result); + const back = fromJSON(result); expect(await back.a).toBe(back); expect(await back.b).toBe(back); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve(({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - const result = await toJSONAsync(example); + const result = await toJSONAsync(Promise.resolve(ITERABLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>>(result); + const back = await fromJSON>(result); expect(back.constructor).toBe(Object); expect([...back]).toMatchObject([1, 2, 3]); }); it('supports Symbol.asyncIterator', async () => { - const example = { - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable; - const result = await toJSONAsync(example); + const result = await toJSONAsync(ASYNC_ITERABLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(back.constructor).toBe(Object); expect(Symbol.asyncIterator in back).toBe(true); }); @@ -187,135 +154,78 @@ describe('objects', () => { describe('crossSerialize', () => { it('supports Objects', () => { const example = ({ hello: 'world' }) as { hello: string }; + Object.freeze(example); const result = crossSerialize(example); expect(result).toMatchSnapshot(); }); it('supports self-recursion', () => { - const example = {} as Record; - example.a = example; - example.b = example; - const result = crossSerialize(example); + const result = crossSerialize(RECURSIVE); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', () => { - const example = ({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - const result = crossSerialize(example); + const result = crossSerialize(ITERABLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Objects', () => { - const example = ({ hello: 'world' }) as { hello: string }; - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports self-recursion', () => { - const example = {} as Record; - example.a = example; - example.b = example; - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(RECURSIVE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', () => { - const example = ({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(ITERABLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports Objects', async () => { - const example = Promise.resolve({ hello: 'world' } as { hello: string }); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); it('supports self-recursion', async () => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(ASYNC_RECURSIVE); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - } as Iterable); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(Promise.resolve(ITERABLE)); expect(result).toMatchSnapshot(); }); it('supports Symbol.asyncIterator', async () => { - const example = { - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable; - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(ASYNC_ITERABLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Objects', async () => { - const example = Promise.resolve({ hello: 'world' } as { hello: string }); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync( + Promise.resolve(EXAMPLE), + { scopeId: 'example' }, + ); expect(result).toMatchSnapshot(); }); it('supports self-recursion', async () => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync(ASYNC_RECURSIVE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - } as Iterable); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync( + Promise.resolve(ITERABLE), + { scopeId: 'example' }, + ); expect(result).toMatchSnapshot(); }); it('supports Symbol.asyncIterator', async () => { - const example = { - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable; - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync(ASYNC_ITERABLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports Objects', async () => new Promise((done) => { - const example = Promise.resolve({ hello: 'world' } as { hello: string }); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -325,10 +235,7 @@ describe('objects', () => { }); })); it('supports self-recursion', async () => new Promise((done) => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(ASYNC_RECURSIVE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -338,14 +245,7 @@ describe('objects', () => { }); })); it('supports Symbol.iterator', async () => new Promise((done) => { - const example = Promise.resolve({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - } as Iterable); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(ITERABLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -355,17 +255,7 @@ describe('objects', () => { }); })); it('supports Symbol.asyncIterator', async () => new Promise((done) => { - const example = { - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable; - crossSerializeStream(example, { + crossSerializeStream(ASYNC_ITERABLE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -376,8 +266,7 @@ describe('objects', () => { })); describe('scoped', () => { it('supports Objects', async () => new Promise((done) => { - const example = Promise.resolve({ hello: 'world' } as { hello: string }); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -388,10 +277,7 @@ describe('objects', () => { }); })); it('supports self-recursion', async () => new Promise((done) => { - const example = {} as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(ASYNC_RECURSIVE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -402,14 +288,7 @@ describe('objects', () => { }); })); it('supports Symbol.iterator', async () => new Promise((done) => { - const example = Promise.resolve({ - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - } as Iterable); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(ITERABLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -420,17 +299,7 @@ describe('objects', () => { }); })); it('supports Symbol.asyncIterator', async () => new Promise((done) => { - const example = { - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - } as AsyncIterable; - crossSerializeStream(example, { + crossSerializeStream(ASYNC_ITERABLE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -442,29 +311,141 @@ describe('objects', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports Objects', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + + expect(back.constructor).toBe(Object); + expect(back.hello).toBe(EXAMPLE.hello); + }); + it('supports self-recursion', () => { + const result = toCrossJSON(RECURSIVE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + + expect(back.a).toBe(back); + expect(back.b).toBe(back); + }); + it('supports Symbol.iterator', () => { + const result = toCrossJSON(ITERABLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + + expect(back.constructor).toBe(Object); + expect([...back]).toMatchObject([1, 2, 3]); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports Objects', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + + expect(back.constructor).toBe(Object); + expect(back.hello).toBe(EXAMPLE.hello); + }); + it('supports self-recursion', async () => { + const result = await toCrossJSONAsync(ASYNC_RECURSIVE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + + expect(await back.a).toBe(back); + expect(await back.b).toBe(back); + }); + it('supports Symbol.iterator', async () => { + const result = await toCrossJSONAsync(Promise.resolve(ITERABLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(back.constructor).toBe(Object); + expect([...back]).toMatchObject([1, 2, 3]); + }); + it('supports Symbol.asyncIterator', async () => { + const result = await toCrossJSONAsync(ASYNC_ITERABLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back.constructor).toBe(Object); + expect(Symbol.asyncIterator in back).toBe(true); + }); + }); + describe('toCrossJSONStream', () => { + it('supports Objects', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports self-recursion', async () => new Promise((done) => { + toCrossJSONStream(ASYNC_RECURSIVE, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.iterator', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(ITERABLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.asyncIterator', async () => new Promise((done) => { + toCrossJSONStream(ASYNC_ITERABLE, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); describe('compat', () => { it('should use manual assignment instead of Object.assign', () => { - const example = ({ hello: 'world' }) as { hello: string }; - const result = serialize(example, { + const result = serialize(EXAMPLE, { disabledFeatures: Feature.ObjectAssign, }); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(back.constructor).toBe(Object); - expect(back.hello).toBe(example.hello); + expect(back.hello).toBe(EXAMPLE.hello); }); }); describe('compat#toJSON', () => { it('should use manual assignment instead of Object.assign', () => { - const example = ({ hello: 'world' }) as { hello: string }; - const result = toJSON(example, { + const result = toJSON(EXAMPLE, { disabledFeatures: Feature.ObjectAssign, }); expect(JSON.stringify(result)).toMatchSnapshot(); expect(compileJSON(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(back.constructor).toBe(Object); - expect(back.hello).toBe(example.hello); + expect(back.hello).toBe(EXAMPLE.hello); }); }); }); From 956388c113c35a6fd749f1fc9d1fdc5fbcf9c081 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 12:34:45 +0800 Subject: [PATCH 54/82] Fix null-constructor test --- .../null-constructor.test.ts.snap | 74 ++- .../seroval/test/null-constructor.test.ts | 457 +++++++++--------- 2 files changed, 274 insertions(+), 257 deletions(-) diff --git a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap index ced42dae..341160d0 100644 --- a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap +++ b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap @@ -6,19 +6,19 @@ exports[`null-constructor > compat#toJSON > should use manual assignment instead exports[`null-constructor > compat#toJSON > should use manual assignment instead of Object.assign 2`] = `"(h=>((h=Object.create(null),h.hello=\\"world\\",h)))()"`; -exports[`null-constructor > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{hello:\\"world\\"}))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerialize > scoped > supports Object.create(null) 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{hello:\\"world\\"}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; -exports[`null-constructor > crossSerialize > supports Objects 1`] = `"$R[0]=Object.assign(Object.create(null),{hello:\\"world\\"})"`; +exports[`null-constructor > crossSerialize > supports Object.create(null) 1`] = `"($R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])"`; exports[`null-constructor > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`null-constructor > crossSerialize > supports self-recursion 1`] = `"($R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])"`; -exports[`null-constructor > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeAsync > scoped > supports Object.create(null) 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; @@ -26,7 +26,7 @@ exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.itera exports[`null-constructor > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; +exports[`null-constructor > crossSerializeAsync > supports Object.create(null) 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; exports[`null-constructor > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; @@ -34,9 +34,9 @@ exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = exports[`null-constructor > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Objects 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Object.create(null) 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Object.create(null) 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())}))($R[\\"example\\"])"`; @@ -54,17 +54,15 @@ exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iter exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{a:$R[1]=_$.P(),b:$R[2]=_$.P()}))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{a:$R[2]=_$.P(),b:$R[3]=_$.P()})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 2`] = `"($R=>_$.Ps($R[1],$R[0]))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>_$.Ps($R[2],$R[1]))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 3`] = `"($R=>_$.Ps($R[2],$R[0]))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 4`] = `"($R=>_$.Ps($R[3],$R[1]))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > supports Object.create(null) 1`] = `"$R[0]=_$.P()"`; -exports[`null-constructor > crossSerializeStream > supports Objects 1`] = `"$R[0]=_$.P()"`; - -exports[`null-constructor > crossSerializeStream > supports Objects 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; +exports[`null-constructor > crossSerializeStream > supports Object.create(null) 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())})"`; @@ -82,13 +80,11 @@ exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 1`] exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; -exports[`null-constructor > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=_$.P()"`; - -exports[`null-constructor > crossSerializeStream > supports self-recursion 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{a:$R[2]=_$.P(),b:$R[3]=_$.P()}))"`; +exports[`null-constructor > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=Object.assign(Object.create(null),{a:$R[1]=_$.P(),b:$R[2]=_$.P()})"`; -exports[`null-constructor > crossSerializeStream > supports self-recursion 3`] = `"_$.Ps($R[2],$R[1])"`; +exports[`null-constructor > crossSerializeStream > supports self-recursion 2`] = `"_$.Ps($R[1],$R[0])"`; -exports[`null-constructor > crossSerializeStream > supports self-recursion 4`] = `"_$.Ps($R[3],$R[1])"`; +exports[`null-constructor > crossSerializeStream > supports self-recursion 3`] = `"_$.Ps($R[2],$R[0])"`; exports[`null-constructor > serialize > supports Object.create(null) 1`] = `"Object.assign(Object.create(null),{hello:\\"world\\"})"`; @@ -104,13 +100,53 @@ exports[`null-constructor > serializeAsync > supports Symbol.iterator 1`] = `"(h exports[`null-constructor > serializeAsync > supports self-recursion 1`] = `"(h=>(h=Object.assign(Object.create(null),{a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)})))()"`; +exports[`null-constructor > toCrossJSON > supports Object.create(null) 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}"`; + +exports[`null-constructor > toCrossJSON > supports Symbol.iterator 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}}"`; + +exports[`null-constructor > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0,\\"x\\":{}}"`; + +exports[`null-constructor > toCrossJSONAsync > supports Object.create(null) 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}"`; + +exports[`null-constructor > toCrossJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}}"`; + +exports[`null-constructor > toCrossJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; + +exports[`null-constructor > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0,\\"x\\":{}}"`; + +exports[`null-constructor > toCrossJSONStream > supports Object.create(null) 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`null-constructor > toCrossJSONStream > supports Object.create(null) 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}"`; + +exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":31,\\"i\\":1}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":2,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":3,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":2}}}}}"`; + +exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 2`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":1}],\\"o\\":0}}"`; + +exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 3`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":2}],\\"o\\":0}}"`; + +exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 4`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; + +exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 5`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":7,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":2,\\"s\\":1}],\\"o\\":0}}"`; + +exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 6`] = `"{\\"t\\":33,\\"i\\":1}"`; + +exports[`null-constructor > toCrossJSONStream > supports Symbol.iterator 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`null-constructor > toCrossJSONStream > supports Symbol.iterator 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; + +exports[`null-constructor > toCrossJSONStream > supports self-recursion 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":28,\\"i\\":1},{\\"t\\":28,\\"i\\":2}],\\"s\\":2},\\"o\\":0,\\"x\\":{}}"`; + +exports[`null-constructor > toCrossJSONStream > supports self-recursion 2`] = `"{\\"t\\":29,\\"i\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; + +exports[`null-constructor > toCrossJSONStream > supports self-recursion 3`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; + exports[`null-constructor > toJSON > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; exports[`null-constructor > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; exports[`null-constructor > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; -exports[`null-constructor > toJSONAsync > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`null-constructor > toJSONAsync > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; exports[`null-constructor > toJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; diff --git a/packages/seroval/test/null-constructor.test.ts b/packages/seroval/test/null-constructor.test.ts index 6618b94a..013627cb 100644 --- a/packages/seroval/test/null-constructor.test.ts +++ b/packages/seroval/test/null-constructor.test.ts @@ -1,321 +1,231 @@ import { describe, it, expect } from 'vitest'; import { + Feature, compileJSON, crossSerialize, crossSerializeAsync, crossSerializeStream, deserialize, - Feature, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../src'; +const EXAMPLE = Object.assign(Object.create(null), { hello: 'world' }) as { hello: string }; + +const RECURSIVE = Object.create(null) as Record; +RECURSIVE.a = RECURSIVE; +RECURSIVE.b = RECURSIVE; + +const ITERABLE = Object.assign(Object.create(null), { + * [Symbol.iterator]() { + yield 1; + yield 2; + yield 3; + }, +}) as Iterable; + +const ASYNC_RECURSIVE = Object.create(null) as Record>; +ASYNC_RECURSIVE.a = Promise.resolve(ASYNC_RECURSIVE); +ASYNC_RECURSIVE.b = Promise.resolve(ASYNC_RECURSIVE); + +const ASYNC_ITERABLE = Object.assign(Object.create(null), { + async* [Symbol.asyncIterator]() { + await Promise.resolve(); + yield 1; + yield 2; + yield 3; + }, +}) as AsyncIterable; + describe('null-constructor', () => { describe('serialize', () => { it('supports Object.create(null)', () => { - const example = Object.assign(Object.create(null), { hello: 'world' }) as { hello: string }; - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(back.constructor).toBeUndefined(); - expect(back.hello).toBe(example.hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', () => { - const example = Object.create(null) as Record; - example.a = example; - example.b = example; - const result = serialize(example); + const result = serialize(RECURSIVE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(back.a).toBe(back); expect(back.b).toBe(back); }); it('supports Symbol.iterator', () => { - const example = Object.assign(Object.create(null), { - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - const result = serialize(example); + const result = serialize(ITERABLE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(back.constructor).toBeUndefined(); expect([...back]).toMatchObject([1, 2, 3]); }); }); describe('serializeAsync', () => { it('supports Object.create(null)', async () => { - const example = Promise.resolve(Object.assign(Object.create(null), { hello: 'world' }) as { hello: string }); - const result = await serializeAsync(example); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>>(result); + const back = await deserialize>(result); expect(back.constructor).toBeUndefined(); - expect(back.hello).toBe((await example).hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', async () => { - const example = Object.create(null) as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - const result = await serializeAsync(example); + const result = await serializeAsync(ASYNC_RECURSIVE); expect(result).toMatchSnapshot(); - const back = deserialize>>(result); + const back = deserialize(result); expect(await back.a).toBe(back); expect(await back.b).toBe(back); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve(Object.assign(Object.create(null), { - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - const result = await serializeAsync(example); + const result = await serializeAsync(Promise.resolve(ITERABLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>>(result); + const back = await deserialize>(result); expect(back.constructor).toBeUndefined(); expect([...back]).toMatchObject([1, 2, 3]); }); it('supports Symbol.asyncIterator', async () => { - const example = Object.assign(Object.create(null), { - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - }) as AsyncIterable; - const result = await serializeAsync(example); + const result = await serializeAsync(ASYNC_ITERABLE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(back.constructor).toBeUndefined(); expect(Symbol.asyncIterator in back).toBe(true); }); }); describe('toJSON', () => { it('supports Object.create(null)', () => { - const example = Object.assign(Object.create(null), { hello: 'world' }) as { hello: string }; - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(back.constructor).toBeUndefined(); - expect(back.hello).toBe(example.hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', () => { - const example = Object.create(null) as Record; - example.a = example; - example.b = example; - const result = toJSON(example); + const result = toJSON(RECURSIVE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(back.a).toBe(back); expect(back.b).toBe(back); }); it('supports Symbol.iterator', () => { - const example = Object.assign(Object.create(null), { - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - const result = toJSON(example); + const result = toJSON(ITERABLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(back.constructor).toBeUndefined(); expect([...back]).toMatchObject([1, 2, 3]); }); }); describe('toJSONAsync', () => { it('supports Object.create(null)', async () => { - const example = Object.assign(Object.create(null), { hello: 'world' }) as { hello: string }; - const result = await toJSONAsync(example); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>>(result); + const back = await fromJSON>(result); expect(back.constructor).toBeUndefined(); - expect(back.hello).toBe(example.hello); + expect(back.hello).toBe(EXAMPLE.hello); }); it('supports self-recursion', async () => { - const example = Object.create(null) as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - const result = await toJSONAsync(example); + const result = await toJSONAsync(ASYNC_RECURSIVE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>>(result); + const back = fromJSON(result); expect(await back.a).toBe(back); expect(await back.b).toBe(back); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve(Object.assign(Object.create(null), { - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - const result = await toJSONAsync(example); + const result = await toJSONAsync(Promise.resolve(ITERABLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>>(result); + const back = await fromJSON>(result); expect(back.constructor).toBeUndefined(); expect([...back]).toMatchObject([1, 2, 3]); }); it('supports Symbol.asyncIterator', async () => { - const example = Object.assign(Object.create(null), { - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - }) as AsyncIterable; - const result = await toJSONAsync(example); + const result = await toJSONAsync(ASYNC_ITERABLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(back.constructor).toBeUndefined(); expect(Symbol.asyncIterator in back).toBe(true); }); }); describe('crossSerialize', () => { - it('supports Objects', () => { - const example = Object.assign(Object.create(null), { hello: 'world' }) as { hello: string }; + it('supports Object.create(null)', () => { + const example = ({ hello: 'world' }) as { hello: string }; + Object.freeze(example); const result = crossSerialize(example); expect(result).toMatchSnapshot(); }); it('supports self-recursion', () => { - const example = Object.create(null) as Record; - example.a = example; - example.b = example; - const result = crossSerialize(example); + const result = crossSerialize(RECURSIVE); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', () => { - const example = Object.assign(Object.create(null), { - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - const result = crossSerialize(example); + const result = crossSerialize(ITERABLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { - it('supports Objects', () => { - const example = Object.assign(Object.create(null), { hello: 'world' }) as { hello: string }; - const result = crossSerialize(example, { scopeId: 'example' }); + it('supports Object.create(null)', () => { + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports self-recursion', () => { - const example = Object.create(null) as Record; - example.a = example; - example.b = example; - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(RECURSIVE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', () => { - const example = Object.assign(Object.create(null), { - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable; - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(ITERABLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { - it('supports Objects', async () => { - const example = Promise.resolve(Object.assign(Object.create(null), { hello: 'world' }) as { hello: string }); - const result = await crossSerializeAsync(example); + it('supports Object.create(null)', async () => { + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); it('supports self-recursion', async () => { - const example = Object.create(null) as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(ASYNC_RECURSIVE); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve(Object.assign(Object.create(null), { - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(Promise.resolve(ITERABLE)); expect(result).toMatchSnapshot(); }); it('supports Symbol.asyncIterator', async () => { - const example = Object.assign(Object.create(null), { - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - }) as AsyncIterable; - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(ASYNC_ITERABLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { - it('supports Objects', async () => { - const example = Promise.resolve(Object.assign(Object.create(null), { hello: 'world' }) as { hello: string }); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + it('supports Object.create(null)', async () => { + const result = await crossSerializeAsync( + Promise.resolve(EXAMPLE), + { scopeId: 'example' }, + ); expect(result).toMatchSnapshot(); }); it('supports self-recursion', async () => { - const example = Object.create(null) as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync(ASYNC_RECURSIVE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports Symbol.iterator', async () => { - const example = Promise.resolve(Object.assign(Object.create(null), { - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync( + Promise.resolve(ITERABLE), + { scopeId: 'example' }, + ); expect(result).toMatchSnapshot(); }); it('supports Symbol.asyncIterator', async () => { - const example = Object.assign(Object.create(null), { - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - }) as AsyncIterable; - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync(ASYNC_ITERABLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { - it('supports Objects', async () => new Promise((done) => { - const example = Promise.resolve(Object.assign(Object.create(null), { hello: 'world' }) as { hello: string }); - crossSerializeStream(example, { + it('supports Object.create(null)', async () => new Promise((done) => { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -325,10 +235,7 @@ describe('null-constructor', () => { }); })); it('supports self-recursion', async () => new Promise((done) => { - const example = Object.create(null) as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(ASYNC_RECURSIVE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -338,14 +245,7 @@ describe('null-constructor', () => { }); })); it('supports Symbol.iterator', async () => new Promise((done) => { - const example = Promise.resolve(Object.assign(Object.create(null), { - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(ITERABLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -355,17 +255,7 @@ describe('null-constructor', () => { }); })); it('supports Symbol.asyncIterator', async () => new Promise((done) => { - const example = Object.assign(Object.create(null), { - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - }) as AsyncIterable; - crossSerializeStream(example, { + crossSerializeStream(ASYNC_ITERABLE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -375,9 +265,8 @@ describe('null-constructor', () => { }); })); describe('scoped', () => { - it('supports Objects', async () => new Promise((done) => { - const example = Promise.resolve(Object.assign(Object.create(null), { hello: 'world' }) as { hello: string }); - crossSerializeStream(example, { + it('supports Object.create(null)', async () => new Promise((done) => { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -388,10 +277,7 @@ describe('null-constructor', () => { }); })); it('supports self-recursion', async () => new Promise((done) => { - const example = Object.create(null) as Record>; - example.a = Promise.resolve(example); - example.b = Promise.resolve(example); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(ASYNC_RECURSIVE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -402,14 +288,7 @@ describe('null-constructor', () => { }); })); it('supports Symbol.iterator', async () => new Promise((done) => { - const example = Promise.resolve(Object.assign(Object.create(null), { - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }) as Iterable); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(ITERABLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -420,17 +299,7 @@ describe('null-constructor', () => { }); })); it('supports Symbol.asyncIterator', async () => new Promise((done) => { - const example = Object.assign(Object.create(null), { - async* [Symbol.asyncIterator]() { - await Promise.resolve(); - yield 1; - await Promise.resolve(); - yield 2; - await Promise.resolve(); - yield 3; - }, - }) as AsyncIterable; - crossSerializeStream(example, { + crossSerializeStream(ASYNC_ITERABLE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -442,29 +311,141 @@ describe('null-constructor', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports Object.create(null)', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + + expect(back.constructor).toBeUndefined(); + expect(back.hello).toBe(EXAMPLE.hello); + }); + it('supports self-recursion', () => { + const result = toCrossJSON(RECURSIVE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + + expect(back.a).toBe(back); + expect(back.b).toBe(back); + }); + it('supports Symbol.iterator', () => { + const result = toCrossJSON(ITERABLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + + expect(back.constructor).toBeUndefined(); + expect([...back]).toMatchObject([1, 2, 3]); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports Object.create(null)', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + + expect(back.constructor).toBeUndefined(); + expect(back.hello).toBe(EXAMPLE.hello); + }); + it('supports self-recursion', async () => { + const result = await toCrossJSONAsync(ASYNC_RECURSIVE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + + expect(await back.a).toBe(back); + expect(await back.b).toBe(back); + }); + it('supports Symbol.iterator', async () => { + const result = await toCrossJSONAsync(Promise.resolve(ITERABLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(back.constructor).toBeUndefined(); + expect([...back]).toMatchObject([1, 2, 3]); + }); + it('supports Symbol.asyncIterator', async () => { + const result = await toCrossJSONAsync(ASYNC_ITERABLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back.constructor).toBeUndefined(); + expect(Symbol.asyncIterator in back).toBe(true); + }); + }); + describe('toCrossJSONStream', () => { + it('supports Object.create(null)', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports self-recursion', async () => new Promise((done) => { + toCrossJSONStream(ASYNC_RECURSIVE, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.iterator', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(ITERABLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.asyncIterator', async () => new Promise((done) => { + toCrossJSONStream(ASYNC_ITERABLE, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); describe('compat', () => { it('should use manual assignment instead of Object.assign', () => { - const example = Object.assign(Object.create(null), { hello: 'world' }) as { hello: string }; - const result = serialize(example, { + const result = serialize(EXAMPLE, { disabledFeatures: Feature.ObjectAssign, }); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(back.constructor).toBeUndefined(); - expect(back.hello).toBe(example.hello); + expect(back.hello).toBe(EXAMPLE.hello); }); }); describe('compat#toJSON', () => { it('should use manual assignment instead of Object.assign', () => { - const example = Object.assign(Object.create(null), { hello: 'world' }) as { hello: string }; - const result = toJSON(example, { + const result = toJSON(EXAMPLE, { disabledFeatures: Feature.ObjectAssign, }); expect(JSON.stringify(result)).toMatchSnapshot(); expect(compileJSON(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(back.constructor).toBeUndefined(); - expect(back.hello).toBe(example.hello); + expect(back.hello).toBe(EXAMPLE.hello); }); }); }); From 7a2aef171f55af095529145b34e58a5c4b3fbfcf Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 12:41:34 +0800 Subject: [PATCH 55/82] Fix iterable test --- .../test/__snapshots__/iterable.test.ts.snap | 14 +- packages/seroval/test/iterable.test.ts | 188 ++++++++---------- 2 files changed, 89 insertions(+), 113 deletions(-) diff --git a/packages/seroval/test/__snapshots__/iterable.test.ts.snap b/packages/seroval/test/__snapshots__/iterable.test.ts.snap index 978ccb25..32e64da2 100644 --- a/packages/seroval/test/__snapshots__/iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/iterable.test.ts.snap @@ -1,10 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Iterable > compat > should use function expression instead of arrow functions. 1`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; +exports[`Iterable > compat > should use function expression instead of arrow functions. 1`] = `"(function(h){return({title:\\"Hello World\\",[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; -exports[`Iterable > compat#toJSON > should use function expression instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[0,3]}"`; +exports[`Iterable > compat#toJSON > should use function expression instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[3]}"`; -exports[`Iterable > compat#toJSON > should use function expression instead of arrow functions. 2`] = `"(function(h,j){return(j={[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; +exports[`Iterable > compat#toJSON > should use function expression instead of arrow functions. 2`] = `"(function(h){return({title:\\"Hello World\\",[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; @@ -26,6 +26,14 @@ exports[`Iterable > serialize > supports Iterables 1`] = `"(h=>({title:\\"Hello exports[`Iterable > serializeAsync > supports Iterables 1`] = `"(h=>(Promise.resolve({title:\\"Hello World\\",[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; +exports[`Iterable > toCrossJSON > supports Iterables 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}}"`; + +exports[`Iterable > toCrossJSONAsync > supports Iterables 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; + +exports[`Iterable > toCrossJSONStream > supports Iterables 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`Iterable > toCrossJSONStream > supports Iterables 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; + exports[`Iterable > toJSON > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; exports[`Iterable > toJSONAsync > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}},\\"f\\":16383,\\"m\\":[4]}"`; diff --git a/packages/seroval/test/iterable.test.ts b/packages/seroval/test/iterable.test.ts index c284d9ad..b3def32e 100644 --- a/packages/seroval/test/iterable.test.ts +++ b/packages/seroval/test/iterable.test.ts @@ -6,28 +6,33 @@ import { crossSerializeStream, deserialize, Feature, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../src'; +const EXAMPLE = { + title: 'Hello World', + * [Symbol.iterator](): Generator { + yield 1; + yield 2; + yield 3; + }, +}; + describe('Iterable', () => { describe('serialize', () => { it('supports Iterables', () => { - const example = { - title: 'Hello World', - * [Symbol.iterator](): unknown { - yield 1; - yield 2; - yield 3; - }, - }; - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize & { title: string }>(result); - expect(back.title).toBe(example.title); + const back = deserialize(result); + expect(back.title).toBe(EXAMPLE.title); expect(Symbol.iterator in back).toBe(true); const iterator = back[Symbol.iterator](); expect(iterator.next().value).toBe(1); @@ -37,18 +42,10 @@ describe('Iterable', () => { }); describe('serializeAsync', () => { it('supports Iterables', async () => { - const example = Promise.resolve({ - title: 'Hello World', - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }); - const result = await serializeAsync(example); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize(result); - expect(back.title).toBe((await example).title); + const back = await deserialize>(result); + expect(back.title).toBe(EXAMPLE.title); expect(Symbol.iterator in back).toBe(true); const iterator = back[Symbol.iterator](); expect(iterator.next().value).toBe(1); @@ -58,18 +55,10 @@ describe('Iterable', () => { }); describe('toJSON', () => { it('supports Iterables', () => { - const example = { - title: 'Hello World', - * [Symbol.iterator](): unknown { - yield 1; - yield 2; - yield 3; - }, - }; - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON & { title: string }>(result); - expect(back.title).toBe(example.title); + const back = fromJSON(result); + expect(back.title).toBe(EXAMPLE.title); expect(Symbol.iterator in back).toBe(true); const iterator = back[Symbol.iterator](); expect(iterator.next().value).toBe(1); @@ -79,18 +68,10 @@ describe('Iterable', () => { }); describe('toJSONAsync', () => { it('supports Iterables', async () => { - const example = Promise.resolve({ - title: 'Hello World', - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }); - const result = await toJSONAsync(example); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON(result); - expect(back.title).toBe((await example).title); + const back = await fromJSON>(result); + expect(back.title).toBe(EXAMPLE.title); expect(Symbol.iterator in back).toBe(true); const iterator = back[Symbol.iterator](); expect(iterator.next().value).toBe(1); @@ -100,71 +81,34 @@ describe('Iterable', () => { }); describe('crossSerialize', () => { it('supports Iterables', () => { - const example = { - title: 'Hello World', - * [Symbol.iterator](): unknown { - yield 1; - yield 2; - yield 3; - }, - }; - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Iterables', () => { - const example = { - title: 'Hello World', - * [Symbol.iterator](): unknown { - yield 1; - yield 2; - yield 3; - }, - }; - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports Iterables', async () => { - const example = Promise.resolve({ - title: 'Hello World', - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Iterables', async () => { - const example = Promise.resolve({ - title: 'Hello World', - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync( + Promise.resolve(EXAMPLE), + { scopeId: 'example' }, + ); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports Iterables', async () => new Promise((done) => { - const example = Promise.resolve({ - title: 'Hello World', - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -175,15 +119,7 @@ describe('Iterable', () => { })); describe('scoped', () => { it('supports Iterables', async () => new Promise((done) => { - const example = Promise.resolve({ - title: 'Hello World', - * [Symbol.iterator]() { - yield 1; - yield 2; - yield 3; - }, - }); - crossSerializeStream(example, { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -197,28 +133,60 @@ describe('Iterable', () => { }); describe('compat', () => { it('should use function expression instead of arrow functions.', () => { - const example = { - * [Symbol.iterator](): unknown { - yield example; - }, - }; - expect(serialize(example, { + expect(serialize(EXAMPLE, { disabledFeatures: Feature.ArrowFunction, })).toMatchSnapshot(); }); }); describe('compat#toJSON', () => { it('should use function expression instead of arrow functions.', () => { - const example = { - * [Symbol.iterator](): unknown { - yield example; - }, - }; - const result = toJSON(example, { + const result = toJSON(EXAMPLE, { disabledFeatures: Feature.ArrowFunction, }); expect(JSON.stringify(result)).toMatchSnapshot(); expect(compileJSON(result)).toMatchSnapshot(); }); }); + describe('toCrossJSON', () => { + it('supports Iterables', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back.title).toBe(EXAMPLE.title); + expect(Symbol.iterator in back).toBe(true); + const iterator = back[Symbol.iterator](); + expect(iterator.next().value).toBe(1); + expect(iterator.next().value).toBe(2); + expect(iterator.next().value).toBe(3); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports Iterables', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(back.title).toBe(EXAMPLE.title); + expect(Symbol.iterator in back).toBe(true); + const iterator = back[Symbol.iterator](); + expect(iterator.next().value).toBe(1); + expect(iterator.next().value).toBe(2); + expect(iterator.next().value).toBe(3); + }); + }); + describe('toCrossJSONStream', () => { + it('supports Iterables', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From ebc3039f2e76cdafe020155210c15d4115ab0e22 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 12:51:29 +0800 Subject: [PATCH 56/82] Fix map test --- .../test/__snapshots__/map.test.ts.snap | 22 +- packages/seroval/test/map.test.ts | 190 +++++++++++------- 2 files changed, 140 insertions(+), 72 deletions(-) diff --git a/packages/seroval/test/__snapshots__/map.test.ts.snap b/packages/seroval/test/__snapshots__/map.test.ts.snap index d6171d24..df6c2fbf 100644 --- a/packages/seroval/test/__snapshots__/map.test.ts.snap +++ b/packages/seroval/test/__snapshots__/map.test.ts.snap @@ -1,10 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[void 0],t:-1,d:0})})))()"`; +exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[[1,2],[3,4],void 0],t:-1,d:2})})))()"`; exports[`Map > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; -exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":0}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16351,\\"m\\":[3]}"`; +exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":3,\\"a\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2}],\\"o\\":0},{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":3},{\\"t\\":0,\\"s\\":4}],\\"o\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":2}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":5,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":6,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":5}}}}},\\"f\\":16351,\\"m\\":[5]}"`; exports[`Map > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; @@ -38,12 +38,22 @@ exports[`Map > crossSerializeStream > supports Map 1`] = `"$R[0]=_$.P()"`; exports[`Map > crossSerializeStream > supports Map 2`] = `"_$.Ps($R[0],$R[1]=($R[2]=[],new Map([[1,2],[3,4]])))"`; +exports[`Map > crossSerializeStream > supports Map 3`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`Map > crossSerializeStream > supports Map 4`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":2}}}}"`; + exports[`Map > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=($R[3]=[],new Map([[$R[1]=_$.P(),$R[2]=_$.P()]]))"`; exports[`Map > crossSerializeStream > supports self-recursion 2`] = `"_$.Ps($R[1],$R[0])"`; exports[`Map > crossSerializeStream > supports self-recursion 3`] = `"_$.Ps($R[2],$R[0])"`; +exports[`Map > crossSerializeStream > supports self-recursion 4`] = `"{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":28,\\"i\\":1}],\\"v\\":[{\\"t\\":28,\\"i\\":2}],\\"s\\":1},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":3}}}"`; + +exports[`Map > crossSerializeStream > supports self-recursion 5`] = `"{\\"t\\":29,\\"i\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; + +exports[`Map > crossSerializeStream > supports self-recursion 6`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; + exports[`Map > serialize > supports Map 1`] = `"(h=>((h=[],new Map([[1,2],[3,4]]))))()"`; exports[`Map > serialize > supports self-recursion 1`] = `"((h,j)=>(j=(h=[],new Map),j.set(j,j),j))()"`; @@ -52,6 +62,14 @@ exports[`Map > serializeAsync > supports Map 1`] = `"(h=>(Promise.resolve((h=[], exports[`Map > serializeAsync > supports self-recursion 1`] = `"((h,j)=>(j=(h=[],new Map([[Promise.resolve().then(()=>j),Promise.resolve().then(()=>j)]]))))()"`; +exports[`Map > toCrossJSON > supports Map 1`] = `"{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":1}}}"`; + +exports[`Map > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":4,\\"i\\":0}],\\"v\\":[{\\"t\\":4,\\"i\\":0}],\\"s\\":1},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":1}}}"`; + +exports[`Map > toCrossJSONAsync > supports Map 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":2}}}}"`; + +exports[`Map > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":1},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":3}}}"`; + exports[`Map > toJSON > supports Map 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":1}}},\\"f\\":16383,\\"m\\":[]}"`; exports[`Map > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":4,\\"i\\":0}],\\"v\\":[{\\"t\\":4,\\"i\\":0}],\\"s\\":1},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":1}}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/map.test.ts b/packages/seroval/test/map.test.ts index e5c67c4c..e4c6c1cb 100644 --- a/packages/seroval/test/map.test.ts +++ b/packages/seroval/test/map.test.ts @@ -6,50 +6,55 @@ import { crossSerializeStream, deserialize, Feature, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../src'; +const EXAMPLE = new Map([[1, 2], [3, 4]]); +const RECURSIVE = new Map(); +RECURSIVE.set(RECURSIVE, RECURSIVE); + +const ASYNC_RECURSIVE = new Map, Promise>(); +ASYNC_RECURSIVE.set(Promise.resolve(ASYNC_RECURSIVE), Promise.resolve(ASYNC_RECURSIVE)); + describe('Map', () => { describe('serialize', () => { it('supports Map', () => { - const example = new Map([[1, 2], [3, 4]]); - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(back).toBeInstanceOf(Map); - expect(back.get(1)).toBe(example.get(1)); - expect(back.get(3)).toBe(example.get(3)); + expect(back.get(1)).toBe(EXAMPLE.get(1)); + expect(back.get(3)).toBe(EXAMPLE.get(3)); }); it('supports self-recursion', () => { - const example: Map = new Map(); - example.set(example, example); - const result = serialize(example); + const result = serialize(RECURSIVE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(back.has(back)).toBe(true); expect(back.get(back)).toBe(back); }); }); describe('serializeAsync', () => { it('supports Map', async () => { - const example = new Map([[1, 2], [3, 4]]); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>>(result); + const back = await deserialize>(result); expect(back).toBeInstanceOf(Map); - expect(back.get(1)).toBe(example.get(1)); - expect(back.get(3)).toBe(example.get(3)); + expect(back.get(1)).toBe(EXAMPLE.get(1)); + expect(back.get(3)).toBe(EXAMPLE.get(3)); }); it('supports self-recursion', async () => { - const example: Map, Promise> = new Map(); - example.set(Promise.resolve(example), Promise.resolve(example)); - const result = await serializeAsync(example); + const result = await serializeAsync(ASYNC_RECURSIVE); expect(result).toMatchSnapshot(); - const back = deserialize, Promise>>(result); + const back = deserialize(result); for (const [key, value] of back) { expect(await key).toBe(back); expect(await value).toBe(back); @@ -58,40 +63,34 @@ describe('Map', () => { }); describe('toJSON', () => { it('supports Map', () => { - const example = new Map([[1, 2], [3, 4]]); - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(Map); - expect(back.get(1)).toBe(example.get(1)); - expect(back.get(3)).toBe(example.get(3)); + expect(back.get(1)).toBe(EXAMPLE.get(1)); + expect(back.get(3)).toBe(EXAMPLE.get(3)); }); it('supports self-recursion', () => { - const example: Map = new Map(); - example.set(example, example); - const result = toJSON(example); + const result = toJSON(RECURSIVE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(back.has(back)).toBe(true); expect(back.get(back)).toBe(back); }); }); describe('toJSONAsync', () => { it('supports Map', async () => { - const example = new Map([[1, 2], [3, 4]]); - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>>(result); + const back = await fromJSON>(result); expect(back).toBeInstanceOf(Map); - expect(back.get(1)).toBe(example.get(1)); - expect(back.get(3)).toBe(example.get(3)); + expect(back.get(1)).toBe(EXAMPLE.get(1)); + expect(back.get(3)).toBe(EXAMPLE.get(3)); }); it('supports self-recursion', async () => { - const example: Map, Promise> = new Map(); - example.set(Promise.resolve(example), Promise.resolve(example)); - const result = await toJSONAsync(example); + const result = await toJSONAsync(ASYNC_RECURSIVE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON, Promise>>(result); + const back = fromJSON(result); for (const [key, value] of back) { expect(await key).toBe(back); expect(await value).toBe(back); @@ -100,60 +99,50 @@ describe('Map', () => { }); describe('crossSerialize', () => { it('supports Map', () => { - const example = new Map([[1, 2], [3, 4]]); - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); it('supports self-recursion', () => { - const example: Map = new Map(); - example.set(example, example); - const result = crossSerialize(example); + const result = crossSerialize(RECURSIVE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Map', () => { - const example = new Map([[1, 2], [3, 4]]); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports self-recursion', () => { - const example: Map = new Map(); - example.set(example, example); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(RECURSIVE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports Map', async () => { - const example = new Map([[1, 2], [3, 4]]); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); it('supports self-recursion', async () => { - const example: Map, Promise> = new Map(); - example.set(Promise.resolve(example), Promise.resolve(example)); - const result = await crossSerializeAsync(example); + const result = await crossSerializeAsync(ASYNC_RECURSIVE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Map', async () => { - const example = new Map([[1, 2], [3, 4]]); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync( + Promise.resolve(EXAMPLE), + { scopeId: 'example' }, + ); expect(result).toMatchSnapshot(); }); it('supports self-recursion', async () => { - const example: Map, Promise> = new Map(); - example.set(Promise.resolve(example), Promise.resolve(example)); - const result = await crossSerializeAsync(example, { scopeId: 'example' }); + const result = await crossSerializeAsync(ASYNC_RECURSIVE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports Map', async () => new Promise((done) => { - const example = new Map([[1, 2], [3, 4]]); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -163,9 +152,7 @@ describe('Map', () => { }); })); it('supports self-recursion', async () => new Promise((done) => { - const example: Map, Promise> = new Map(); - example.set(Promise.resolve(example), Promise.resolve(example)); - crossSerializeStream(example, { + crossSerializeStream(ASYNC_RECURSIVE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -176,8 +163,7 @@ describe('Map', () => { })); describe('scoped', () => { it('supports Map', async () => new Promise((done) => { - const example = new Map([[1, 2], [3, 4]]); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -188,9 +174,7 @@ describe('Map', () => { }); })); it('supports self-recursion', async () => new Promise((done) => { - const example: Map, Promise> = new Map(); - example.set(Promise.resolve(example), Promise.resolve(example)); - crossSerializeStream(example, { + crossSerializeStream(ASYNC_RECURSIVE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -202,26 +186,92 @@ describe('Map', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports Map', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Map); + expect(back.get(1)).toBe(EXAMPLE.get(1)); + expect(back.get(3)).toBe(EXAMPLE.get(3)); + }); + it('supports self-recursion', () => { + const result = toCrossJSON(RECURSIVE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back.has(back)).toBe(true); + expect(back.get(back)).toBe(back); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports Map', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Map); + expect(back.get(1)).toBe(EXAMPLE.get(1)); + expect(back.get(3)).toBe(EXAMPLE.get(3)); + }); + it('supports self-recursion', async () => { + const result = await toCrossJSONAsync(ASYNC_RECURSIVE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + for (const [key, value] of back) { + expect(await key).toBe(back); + expect(await value).toBe(back); + } + }); + }); + describe('crossSerializeStream', () => { + it('supports Map', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports self-recursion', async () => new Promise((done) => { + toCrossJSONStream(ASYNC_RECURSIVE, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); describe('compat', () => { it('should fallback to Symbol.iterator', () => { - expect(serialize(new Map(), { + expect(serialize(EXAMPLE, { disabledFeatures: Feature.Map, })).toMatchSnapshot(); }); it('should throw an error for unsupported target', () => { - expect(() => serialize(new Map(), { + expect(() => serialize(EXAMPLE, { disabledFeatures: Feature.Map | Feature.Symbol, })).toThrowErrorMatchingSnapshot(); }); }); describe('compat#toJSON', () => { it('should fallback to Symbol.iterator', () => { - expect(JSON.stringify(toJSON(new Map(), { + expect(JSON.stringify(toJSON(EXAMPLE, { disabledFeatures: Feature.Map, }))).toMatchSnapshot(); }); it('should throw an error for unsupported target', () => { - expect(() => toJSON(new Map(), { + expect(() => toJSON(EXAMPLE, { disabledFeatures: Feature.Map | Feature.Symbol, })).toThrowErrorMatchingSnapshot(); }); From 9aded45398c24b607a0be5f24ff36e4bfe92aaf4 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 12:55:16 +0800 Subject: [PATCH 57/82] Fix mutual-cycle test --- .../__snapshots__/mutual-cycle.test.ts.snap | 30 +++ packages/seroval/test/mutual-cycle.test.ts | 223 ++++++++++++++---- 2 files changed, 211 insertions(+), 42 deletions(-) diff --git a/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap b/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap index fb2189d3..ff5e6ab3 100644 --- a/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap +++ b/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap @@ -72,6 +72,36 @@ exports[`mutual cyclic references > serializeAsync > supports Arrays and Objects exports[`mutual cyclic references > serializeAsync > supports Objects and Objects 1`] = `"((h,j)=>([h={0:Promise.resolve(j={0:Promise.resolve().then(()=>h)})},j]))()"`; +exports[`mutual cyclic references > toCrossJSON > supports Arrays and Arrays 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":1}],\\"o\\":0}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0}"`; + +exports[`mutual cyclic references > toCrossJSON > supports Arrays and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0}"`; + +exports[`mutual cyclic references > toCrossJSON > supports Objects and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":4,\\"i\\":2}],\\"o\\":0}"`; + +exports[`mutual cyclic references > toCrossJSONAsync > supports Arrays and Arrays 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":3,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"o\\":0}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0}"`; + +exports[`mutual cyclic references > toCrossJSONAsync > supports Arrays and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0}"`; + +exports[`mutual cyclic references > toCrossJSONAsync > supports Objects and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":4,\\"i\\":3}],\\"o\\":0}"`; + +exports[`mutual cyclic references > toCrossJSONStream > supports Arrays and Arrays 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":28,\\"i\\":2}],\\"o\\":0},{\\"t\\":9,\\"i\\":3,\\"l\\":1,\\"a\\":[{\\"t\\":28,\\"i\\":4}],\\"o\\":0}],\\"o\\":0}"`; + +exports[`mutual cyclic references > toCrossJSONStream > supports Arrays and Arrays 2`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":3}}"`; + +exports[`mutual cyclic references > toCrossJSONStream > supports Arrays and Arrays 3`] = `"{\\"t\\":29,\\"i\\":4,\\"f\\":{\\"t\\":4,\\"i\\":1}}"`; + +exports[`mutual cyclic references > toCrossJSONStream > supports Arrays and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":28,\\"i\\":2}],\\"o\\":0},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":28,\\"i\\":4}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}],\\"o\\":0}"`; + +exports[`mutual cyclic references > toCrossJSONStream > supports Arrays and Objects 2`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":3}}"`; + +exports[`mutual cyclic references > toCrossJSONStream > supports Arrays and Objects 3`] = `"{\\"t\\":29,\\"i\\":4,\\"f\\":{\\"t\\":4,\\"i\\":1}}"`; + +exports[`mutual cyclic references > toCrossJSONStream > supports Objects and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":28,\\"i\\":2}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":28,\\"i\\":4}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}],\\"o\\":0}"`; + +exports[`mutual cyclic references > toCrossJSONStream > supports Objects and Objects 2`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":3}}"`; + +exports[`mutual cyclic references > toCrossJSONStream > supports Objects and Objects 3`] = `"{\\"t\\":29,\\"i\\":4,\\"f\\":{\\"t\\":4,\\"i\\":1}}"`; + exports[`mutual cyclic references > toJSON > supports Arrays and Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":1}],\\"o\\":0}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2]}"`; exports[`mutual cyclic references > toJSON > supports Arrays and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2]}"`; diff --git a/packages/seroval/test/mutual-cycle.test.ts b/packages/seroval/test/mutual-cycle.test.ts index 77e4460a..9f1049b6 100644 --- a/packages/seroval/test/mutual-cycle.test.ts +++ b/packages/seroval/test/mutual-cycle.test.ts @@ -9,6 +9,10 @@ import { crossSerialize, crossSerializeAsync, crossSerializeStream, + toCrossJSON, + toCrossJSONAsync, + fromCrossJSON, + toCrossJSONStream, } from '../src'; describe('mutual cyclic references', () => { @@ -18,10 +22,10 @@ describe('mutual cyclic references', () => { const b: unknown[] = []; a[0] = b; b[0] = a; - const example = [a, b]; + const example = [a, b] as const; const result = serialize(example); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back[0]).toBe(back[1][0]); expect(back[1]).toBe(back[0][0]); }); @@ -30,10 +34,10 @@ describe('mutual cyclic references', () => { const b: Record = {}; a[0] = b; b[0] = a; - const example = [a, b]; + const example = [a, b] as const; const result = serialize(example); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back[0]).toBe(back[1][0]); expect(back[1]).toBe(back[0][0]); }); @@ -42,10 +46,10 @@ describe('mutual cyclic references', () => { const b: Record = {}; a[0] = b; b[0] = a; - const example = [a, b]; + const example = [a, b] as const; const result = serialize(example); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back[0]).toBe(back[1][0]); expect(back[1]).toBe(back[0][0]); }); @@ -56,10 +60,10 @@ describe('mutual cyclic references', () => { const b: Promise[] = []; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; const result = await serializeAsync(example); expect(result).toMatchSnapshot(); - const back = deserialize[][]>(result); + const back = deserialize(result); expect(back[0]).toStrictEqual(await back[1][0]); expect(back[1]).toStrictEqual(await back[0][0]); }); @@ -68,10 +72,10 @@ describe('mutual cyclic references', () => { const b: Record> = {}; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; const result = await serializeAsync(example); expect(result).toMatchSnapshot(); - const back = deserialize[][]>(result); + const back = deserialize(result); expect(back[0]).toStrictEqual(await back[1][0]); expect(back[1]).toStrictEqual(await back[0][0]); }); @@ -80,10 +84,10 @@ describe('mutual cyclic references', () => { const b: Record> = {}; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; const result = await serializeAsync(example); expect(result).toMatchSnapshot(); - const back = deserialize[][]>(result); + const back = deserialize(result); expect(back[0]).toStrictEqual(await back[1][0]); expect(back[1]).toStrictEqual(await back[0][0]); }); @@ -94,10 +98,10 @@ describe('mutual cyclic references', () => { const b: unknown[] = []; a[0] = b; b[0] = a; - const example = [a, b]; + const example = [a, b] as const; const result = toJSON(example); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(back[0]).toBe(back[1][0]); expect(back[1]).toBe(back[0][0]); }); @@ -106,10 +110,10 @@ describe('mutual cyclic references', () => { const b: Record = {}; a[0] = b; b[0] = a; - const example = [a, b]; + const example = [a, b] as const; const result = toJSON(example); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(back[0]).toBe(back[1][0]); expect(back[1]).toBe(back[0][0]); }); @@ -118,10 +122,10 @@ describe('mutual cyclic references', () => { const b: Record = {}; a[0] = b; b[0] = a; - const example = [a, b]; + const example = [a, b] as const; const result = toJSON(example); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(back[0]).toBe(back[1][0]); expect(back[1]).toBe(back[0][0]); }); @@ -132,10 +136,10 @@ describe('mutual cyclic references', () => { const b: Promise[] = []; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; const result = await toJSONAsync(example); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON[][]>(result); + const back = fromJSON(result); expect(back[0]).toStrictEqual(await back[1][0]); expect(back[1]).toStrictEqual(await back[0][0]); }); @@ -144,10 +148,10 @@ describe('mutual cyclic references', () => { const b: Record> = {}; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; const result = await toJSONAsync(example); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON[][]>(result); + const back = fromJSON(result); expect(back[0]).toStrictEqual(await back[1][0]); expect(back[1]).toStrictEqual(await back[0][0]); }); @@ -156,10 +160,10 @@ describe('mutual cyclic references', () => { const b: Record> = {}; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; const result = await toJSONAsync(example); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON[][]>(result); + const back = fromJSON(result); expect(back[0]).toStrictEqual(await back[1][0]); expect(back[1]).toStrictEqual(await back[0][0]); }); @@ -170,7 +174,7 @@ describe('mutual cyclic references', () => { const b: unknown[] = []; a[0] = b; b[0] = a; - const example = [a, b]; + const example = [a, b] as const; const result = crossSerialize(example); expect(result).toMatchSnapshot(); }); @@ -179,7 +183,7 @@ describe('mutual cyclic references', () => { const b: Record = {}; a[0] = b; b[0] = a; - const example = [a, b]; + const example = [a, b] as const; const result = crossSerialize(example); expect(result).toMatchSnapshot(); }); @@ -188,7 +192,7 @@ describe('mutual cyclic references', () => { const b: Record = {}; a[0] = b; b[0] = a; - const example = [a, b]; + const example = [a, b] as const; const result = crossSerialize(example); expect(result).toMatchSnapshot(); }); @@ -198,7 +202,7 @@ describe('mutual cyclic references', () => { const b: unknown[] = []; a[0] = b; b[0] = a; - const example = [a, b]; + const example = [a, b] as const; const result = crossSerialize(example, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); @@ -207,7 +211,7 @@ describe('mutual cyclic references', () => { const b: Record = {}; a[0] = b; b[0] = a; - const example = [a, b]; + const example = [a, b] as const; const result = crossSerialize(example, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); @@ -216,7 +220,7 @@ describe('mutual cyclic references', () => { const b: Record = {}; a[0] = b; b[0] = a; - const example = [a, b]; + const example = [a, b] as const; const result = crossSerialize(example, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); @@ -228,7 +232,7 @@ describe('mutual cyclic references', () => { const b: Promise[] = []; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; const result = await crossSerializeAsync(example); expect(result).toMatchSnapshot(); }); @@ -237,7 +241,7 @@ describe('mutual cyclic references', () => { const b: Record> = {}; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; const result = await crossSerializeAsync(example); expect(result).toMatchSnapshot(); }); @@ -246,7 +250,7 @@ describe('mutual cyclic references', () => { const b: Record> = {}; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; const result = await crossSerializeAsync(example); expect(result).toMatchSnapshot(); }); @@ -256,7 +260,7 @@ describe('mutual cyclic references', () => { const b: Promise[] = []; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; const result = await crossSerializeAsync(example, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); @@ -265,7 +269,7 @@ describe('mutual cyclic references', () => { const b: Record> = {}; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; const result = await crossSerializeAsync(example, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); @@ -274,7 +278,7 @@ describe('mutual cyclic references', () => { const b: Record> = {}; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; const result = await crossSerializeAsync(example, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); @@ -286,7 +290,7 @@ describe('mutual cyclic references', () => { const b: Promise[] = []; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; crossSerializeStream(example, { onSerialize(data) { expect(data).toMatchSnapshot(); @@ -301,7 +305,7 @@ describe('mutual cyclic references', () => { const b: Record> = {}; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; crossSerializeStream(example, { onSerialize(data) { expect(data).toMatchSnapshot(); @@ -316,7 +320,7 @@ describe('mutual cyclic references', () => { const b: Record> = {}; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; crossSerializeStream(example, { onSerialize(data) { expect(data).toMatchSnapshot(); @@ -332,7 +336,7 @@ describe('mutual cyclic references', () => { const b: Promise[] = []; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; crossSerializeStream(example, { scopeId: 'example', onSerialize(data) { @@ -348,7 +352,7 @@ describe('mutual cyclic references', () => { const b: Record> = {}; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; crossSerializeStream(example, { scopeId: 'example', onSerialize(data) { @@ -364,7 +368,7 @@ describe('mutual cyclic references', () => { const b: Record> = {}; a[0] = Promise.resolve(b); b[0] = Promise.resolve(a); - const example = [a, b]; + const example = [a, b] as const; crossSerializeStream(example, { scopeId: 'example', onSerialize(data) { @@ -377,4 +381,139 @@ describe('mutual cyclic references', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports Arrays and Arrays', () => { + const a: unknown[] = []; + const b: unknown[] = []; + a[0] = b; + b[0] = a; + const example = [a, b] as const; + const result = toCrossJSON(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back[0]).toBe(back[1][0]); + expect(back[1]).toBe(back[0][0]); + }); + it('supports Arrays and Objects', () => { + const a: unknown[] = []; + const b: Record = {}; + a[0] = b; + b[0] = a; + const example = [a, b] as const; + const result = toCrossJSON(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back[0]).toBe(back[1][0]); + expect(back[1]).toBe(back[0][0]); + }); + it('supports Objects and Objects', () => { + const a: Record = {}; + const b: Record = {}; + a[0] = b; + b[0] = a; + const example = [a, b] as const; + const result = toCrossJSON(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back[0]).toBe(back[1][0]); + expect(back[1]).toBe(back[0][0]); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports Arrays and Arrays', async () => { + const a: Promise[] = []; + const b: Promise[] = []; + a[0] = Promise.resolve(b); + b[0] = Promise.resolve(a); + const example = [a, b] as const; + const result = await toCrossJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back[0]).toStrictEqual(await back[1][0]); + expect(back[1]).toStrictEqual(await back[0][0]); + }); + it('supports Arrays and Objects', async () => { + const a: Promise[] = []; + const b: Record> = {}; + a[0] = Promise.resolve(b); + b[0] = Promise.resolve(a); + const example = [a, b] as const; + const result = await toCrossJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back[0]).toStrictEqual(await back[1][0]); + expect(back[1]).toStrictEqual(await back[0][0]); + }); + it('supports Objects and Objects', async () => { + const a: Record> = {}; + const b: Record> = {}; + a[0] = Promise.resolve(b); + b[0] = Promise.resolve(a); + const example = [a, b] as const; + const result = await toCrossJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back[0]).toStrictEqual(await back[1][0]); + expect(back[1]).toStrictEqual(await back[0][0]); + }); + }); + describe('toCrossJSONStream', () => { + it('supports Arrays and Arrays', async () => new Promise((done) => { + const a: Promise[] = []; + const b: Promise[] = []; + a[0] = Promise.resolve(b); + b[0] = Promise.resolve(a); + const example = [a, b] as const; + toCrossJSONStream(example, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Arrays and Objects', async () => new Promise((done) => { + const a: Promise[] = []; + const b: Record> = {}; + a[0] = Promise.resolve(b); + b[0] = Promise.resolve(a); + const example = [a, b] as const; + toCrossJSONStream(example, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Objects and Objects', async () => new Promise((done) => { + const a: Record> = {}; + const b: Record> = {}; + a[0] = Promise.resolve(b); + b[0] = Promise.resolve(a); + const example = [a, b] as const; + toCrossJSONStream(example, { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From 5e76dcfebb65d9742ea018f87869de8132b4a475 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 13:10:18 +0800 Subject: [PATCH 58/82] Fix iterator deserialization --- .../seroval/src/core/context/deserializer.ts | 18 ++- .../src/core/utils/iterator-to-sequence.ts | 137 ++++++++++++------ 2 files changed, 103 insertions(+), 52 deletions(-) diff --git a/packages/seroval/src/core/context/deserializer.ts b/packages/seroval/src/core/context/deserializer.ts index 52429821..0afac931 100644 --- a/packages/seroval/src/core/context/deserializer.ts +++ b/packages/seroval/src/core/context/deserializer.ts @@ -53,8 +53,8 @@ import { SerovalObjectFlags, } from '../constants'; import type { Plugin, PluginAccessOptions, SerovalMode } from '../plugin'; -import type { Sequence } from '../utils/iterator-to-sequence'; -import { sequenceToAsyncIterator, sequenceToIterator } from '../utils/iterator-to-sequence'; +import type { Sequence, SerializedAsyncIteratorResult } from '../utils/iterator-to-sequence'; +import { readableStreamToAsyncIterator, sequenceToAsyncIterator, sequenceToIterator } from '../utils/iterator-to-sequence'; import { getTypedArrayConstructor } from '../utils/typed-array'; import type { Deferred, DeferredStream } from '../utils/deferred'; import { createDeferred, createDeferredStream } from '../utils/deferred'; @@ -142,14 +142,18 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt switch (key) { case SerovalObjectRecordSpecialKey.SymbolIterator: { const current = value as Sequence; - result[Symbol.iterator] = (): Iterator => sequenceToIterator(current); + result[Symbol.iterator] = sequenceToIterator(current); } break; case SerovalObjectRecordSpecialKey.SymbolAsyncIterator: { - const current = value as Sequence; - result[Symbol.asyncIterator] = ( - (): AsyncIterator => sequenceToAsyncIterator(current) - ); + const current = value; + if (this.mode === 'cross') { + result[Symbol.asyncIterator] = readableStreamToAsyncIterator( + current as ReadableStream>, + ); + } else { + result[Symbol.asyncIterator] = sequenceToAsyncIterator(current as Sequence); + } } break; default: diff --git a/packages/seroval/src/core/utils/iterator-to-sequence.ts b/packages/seroval/src/core/utils/iterator-to-sequence.ts index dd949615..38d7c157 100644 --- a/packages/seroval/src/core/utils/iterator-to-sequence.ts +++ b/packages/seroval/src/core/utils/iterator-to-sequence.ts @@ -32,30 +32,34 @@ export function iteratorToSequence(source: Iterable): Sequence { }; } -export function sequenceToIterator(sequence: Sequence): IterableIterator { - let index = 0; +export function sequenceToIterator( + sequence: Sequence, +): () => IterableIterator { + return (): IterableIterator => { + let index = 0; - return { - next(): IteratorResult { - if (index > sequence.d) { + return { + [Symbol.iterator](): IterableIterator { + return this; + }, + next(): IteratorResult { + if (index > sequence.d) { + return { + done: true, + value: undefined, + }; + } + const currentIndex = index++; + const currentItem = sequence.v[currentIndex]; + if (currentIndex === sequence.t) { + throw currentItem; + } return { - done: true, - value: undefined, + done: currentIndex === sequence.d, + value: currentItem as T, }; - } - const currentIndex = index++; - const currentItem = sequence.v[currentIndex]; - if (currentIndex === sequence.t) { - throw currentItem; - } - return { - done: currentIndex === sequence.d, - value: currentItem as T, - }; - }, - [Symbol.iterator](): IterableIterator { - return this; - }, + }, + }; }; } @@ -90,30 +94,33 @@ export async function asyncIteratorToSequence(source: AsyncIterable): Prom }; } -export function sequenceToAsyncIterator(sequence: Sequence): AsyncIterableIterator { - let index = 0; - - return { - async next(): Promise> { - if (index > sequence.d) { - return { - done: true, - value: undefined, - }; - } - const currentIndex = index++; - const currentItem = sequence.v[currentIndex]; - if (currentIndex === sequence.t) { - throw currentItem; - } - return Promise.resolve({ - done: currentIndex === sequence.d, - value: currentItem as T, - }); - }, - [Symbol.asyncIterator](): AsyncIterableIterator { - return this; - }, +export function sequenceToAsyncIterator( + sequence: Sequence, +): () => AsyncIterableIterator { + return (): AsyncIterableIterator => { + let index = 0; + return { + [Symbol.asyncIterator](): AsyncIterableIterator { + return this; + }, + async next(): Promise> { + if (index > sequence.d) { + return { + done: true, + value: undefined, + }; + } + const currentIndex = index++; + const currentItem = sequence.v[currentIndex]; + if (currentIndex === sequence.t) { + throw currentItem; + } + return Promise.resolve({ + done: currentIndex === sequence.d, + value: currentItem as T, + }); + }, + }; }; } @@ -140,3 +147,43 @@ export function asyncIteratorToReadableStream( }, }); } + +type RSNext = [0, T]; +type RSThrow = [1, any]; +type RSReturn = [2, T]; + +export type SerializedAsyncIteratorResult = RSNext | RSThrow | RSReturn; + +export function readableStreamToAsyncIterator( + source: ReadableStream>, +): () => AsyncIterableIterator { + let current = source; + return (): AsyncIterableIterator => { + const [left, right] = current.tee(); + const clone = left; + current = right; + const reader = clone.getReader(); + return { + [Symbol.asyncIterator](): AsyncIterableIterator { + return this; + }, + async next(): Promise> { + const result = await reader.read(); + if (result.done) { + return { + done: true, + value: undefined, + }; + } + const [status, value] = result.value; + if (status === 1) { + throw value; + } + return { + done: status === 2, + value, + }; + }, + }; + }; +} From 8ad6de0d94aa0771bcf24b3157c8d279c843a7d5 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 13:22:56 +0800 Subject: [PATCH 59/82] Fix plugins parsing and reference assignment --- packages/seroval/src/core/context/deserializer.ts | 9 ++++++--- packages/seroval/src/core/context/serializer.ts | 9 ++++++--- packages/seroval/src/core/cross/index.ts | 2 ++ 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/packages/seroval/src/core/context/deserializer.ts b/packages/seroval/src/core/context/deserializer.ts index 0afac931..6e023ba7 100644 --- a/packages/seroval/src/core/context/deserializer.ts +++ b/packages/seroval/src/core/context/deserializer.ts @@ -440,9 +440,12 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt for (let i = 0, len = currentPlugins.length; i < len; i++) { const plugin = currentPlugins[i]; if (plugin.tag === node.c) { - return plugin.deserialize(node.s, this, { - id: node.i, - }); + return this.assignIndexedValue( + node.i, + plugin.deserialize(node.s, this, { + id: node.i, + }), + ); } } } diff --git a/packages/seroval/src/core/context/serializer.ts b/packages/seroval/src/core/context/serializer.ts index a87d44bb..c7df1ad0 100644 --- a/packages/seroval/src/core/context/serializer.ts +++ b/packages/seroval/src/core/context/serializer.ts @@ -1027,9 +1027,12 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio for (let i = 0, len = currentPlugins.length; i < len; i++) { const plugin = currentPlugins[i]; if (plugin.tag === node.c) { - return plugin.serialize(node.s, this, { - id: node.i, - }); + return this.assignIndexedValue( + node.i, + plugin.serialize(node.s, this, { + id: node.i, + }), + ); } } } diff --git a/packages/seroval/src/core/cross/index.ts b/packages/seroval/src/core/cross/index.ts index 292718bb..9f0e40e0 100644 --- a/packages/seroval/src/core/cross/index.ts +++ b/packages/seroval/src/core/cross/index.ts @@ -94,6 +94,7 @@ export function crossSerializeStream( options: CrossSerializeStreamOptions, ): () => void { const ctx = new StreamCrossParserContext({ + plugins: options.plugins, refs: options.refs, disabledFeatures: options.disabledFeatures, onParse(node, initial): void { @@ -138,6 +139,7 @@ export function toCrossJSONStream( options: ToCrossJSONStreamOptions, ): () => void { const ctx = new StreamCrossParserContext({ + plugins: options.plugins, refs: options.refs, disabledFeatures: options.disabledFeatures, onParse: options.onParse, From 608aecc5c076c63b6a18c07f393ffa70473fb867 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 13:23:01 +0800 Subject: [PATCH 60/82] Fix plugin test --- .../test/__snapshots__/plugin.test.ts.snap | 20 ++++-- packages/seroval/test/plugin.test.ts | 64 +++++++++++++++---- 2 files changed, 64 insertions(+), 20 deletions(-) diff --git a/packages/seroval/test/__snapshots__/plugin.test.ts.snap b/packages/seroval/test/__snapshots__/plugin.test.ts.snap index fecfb7eb..d49576c0 100644 --- a/packages/seroval/test/__snapshots__/plugin.test.ts.snap +++ b/packages/seroval/test/__snapshots__/plugin.test.ts.snap @@ -1,21 +1,27 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Plugin > crossSerialize > scoped > supports Plugin 1`] = `"($R=>Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\"))($R[\\"example\\"])"`; +exports[`Plugin > crossSerialize > scoped > supports Plugin 1`] = `"($R=>$R[0]=Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\"))($R[\\"example\\"])"`; -exports[`Plugin > crossSerialize > supports Plugin 1`] = `"Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\")"`; +exports[`Plugin > crossSerialize > supports Plugin 1`] = `"$R[0]=Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\")"`; -exports[`Plugin > crossSerializeAsync > scoped > supports Plugin 1`] = `"($R=>$R[0]=Promise.resolve(Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\")))($R[\\"example\\"])"`; +exports[`Plugin > crossSerializeAsync > scoped > supports Plugin 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\")))($R[\\"example\\"])"`; -exports[`Plugin > crossSerializeAsync > supports Plugin 1`] = `"$R[0]=Promise.resolve(Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\"))"`; +exports[`Plugin > crossSerializeAsync > supports Plugin 1`] = `"$R[0]=Promise.resolve($R[1]=Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\"))"`; -exports[`Plugin > crossSerializeStream > scoped > supports Plugin 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})}))($R[\\"example\\"])"`; +exports[`Plugin > crossSerializeStream > scoped > supports Plugin 1`] = `"($R=>$R[0]=Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\"))($R[\\"example\\"])"`; -exports[`Plugin > crossSerializeStream > supports Plugin 1`] = `"$R[0]=Object.assign(Object.create(null),{0:72,1:101,2:108,3:108,4:111,5:44,6:32,7:87,8:111,9:114,10:108,11:100,12:33,[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[72,101,108,108,111,44,32,87,111,114,108,100,33,void 0],t:-1,d:13})})"`; +exports[`Plugin > crossSerializeStream > supports Plugin 1`] = `"$R[0]=Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\")"`; exports[`Plugin > serialize > supports Plugin 1`] = `"Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\")"`; exports[`Plugin > serializeAsync > supports Plugin 1`] = `"Promise.resolve(Buffer.from(\\"SGVsbG8sIFdvcmxkIQ==\\", \\"base64\\"))"`; -exports[`Plugin > serializeAsync > supports Plugin 2`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":40,\\"i\\":1,\\"s\\":{\\"t\\":1,\\"s\\":\\"SGVsbG8sIFdvcmxkIQ==\\"},\\"c\\":\\"Buffer\\"}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Plugin > toCrossJSON > supports Plugin 1`] = `"{\\"t\\":40,\\"i\\":0,\\"s\\":{\\"t\\":1,\\"s\\":\\"SGVsbG8sIFdvcmxkIQ==\\"},\\"c\\":\\"Buffer\\"}"`; + +exports[`Plugin > toCrossJSONAsync > supports Plugin 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":40,\\"i\\":1,\\"s\\":{\\"t\\":1,\\"s\\":\\"SGVsbG8sIFdvcmxkIQ==\\"},\\"c\\":\\"Buffer\\"}}"`; + +exports[`Plugin > toCrossJSONStream > supports Plugin 1`] = `"{\\"t\\":40,\\"i\\":0,\\"s\\":{\\"t\\":1,\\"s\\":\\"SGVsbG8sIFdvcmxkIQ==\\"},\\"c\\":\\"Buffer\\"}"`; exports[`Plugin > toJSON > supports Plugin 1`] = `"{\\"t\\":{\\"t\\":40,\\"i\\":0,\\"s\\":{\\"t\\":1,\\"s\\":\\"SGVsbG8sIFdvcmxkIQ==\\"},\\"c\\":\\"Buffer\\"},\\"f\\":16383,\\"m\\":[]}"`; + +exports[`Plugin > toJSONAsync > supports Plugin 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":40,\\"i\\":1,\\"s\\":{\\"t\\":1,\\"s\\":\\"SGVsbG8sIFdvcmxkIQ==\\"},\\"c\\":\\"Buffer\\"}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/plugin.test.ts b/packages/seroval/test/plugin.test.ts index 2924c460..32110072 100644 --- a/packages/seroval/test/plugin.test.ts +++ b/packages/seroval/test/plugin.test.ts @@ -11,6 +11,10 @@ import { serializeAsync, crossSerializeAsync, crossSerializeStream, + toCrossJSON, + fromCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, } from '../src'; const BufferPlugin = createPlugin({ @@ -45,9 +49,8 @@ describe('Plugin', () => { const result = serialize(EXAMPLE, { plugins: [BufferPlugin], }); - expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back).toBeInstanceOf(Buffer); expect(back.toString('utf-8')).toBe(EXAMPLE.toString('utf-8')); }); @@ -57,9 +60,8 @@ describe('Plugin', () => { const result = await serializeAsync(Promise.resolve(EXAMPLE), { plugins: [BufferPlugin], }); - expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = await deserialize>(result); expect(back).toBeInstanceOf(Buffer); expect(back.toString('utf-8')).toBe(EXAMPLE.toString('utf-8')); }); @@ -71,21 +73,20 @@ describe('Plugin', () => { }); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result, { + const back = fromJSON(result, { plugins: [BufferPlugin], }); expect(back).toBeInstanceOf(Buffer); expect(back.toString('utf-8')).toBe(EXAMPLE.toString('utf-8')); }); }); - describe('serializeAsync', () => { + describe('toJSONAsync', () => { it('supports Plugin', async () => { const result = await toJSONAsync(Promise.resolve(EXAMPLE), { plugins: [BufferPlugin], }); - expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result, { + const back = await fromJSON>(result, { plugins: [BufferPlugin], }); expect(back).toBeInstanceOf(Buffer); @@ -97,7 +98,6 @@ describe('Plugin', () => { const result = crossSerialize(EXAMPLE, { plugins: [BufferPlugin], }); - expect(result).toMatchSnapshot(); }); describe('scoped', () => { @@ -106,7 +106,6 @@ describe('Plugin', () => { scopeId: 'example', plugins: [BufferPlugin], }); - expect(result).toMatchSnapshot(); }); }); @@ -116,7 +115,6 @@ describe('Plugin', () => { const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { plugins: [BufferPlugin], }); - expect(result).toMatchSnapshot(); }); describe('scoped', () => { @@ -125,12 +123,10 @@ describe('Plugin', () => { scopeId: 'example', plugins: [BufferPlugin], }); - expect(result).toMatchSnapshot(); }); }); }); - describe('crossSerializeStream', () => { it('supports Plugin', async () => new Promise((done) => { crossSerializeStream(EXAMPLE, { @@ -159,4 +155,46 @@ describe('Plugin', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports Plugin', () => { + const result = toCrossJSON(EXAMPLE, { + plugins: [BufferPlugin], + }); + + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + plugins: [BufferPlugin], + refs: new Map(), + }); + expect(back).toBeInstanceOf(Buffer); + expect(back.toString('utf-8')).toBe(EXAMPLE.toString('utf-8')); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports Plugin', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE), { + plugins: [BufferPlugin], + }); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + plugins: [BufferPlugin], + refs: new Map(), + }); + expect(back).toBeInstanceOf(Buffer); + expect(back.toString('utf-8')).toBe(EXAMPLE.toString('utf-8')); + }); + }); + describe('toCrossJSONStream', () => { + it('supports Plugin', async () => new Promise((done) => { + toCrossJSONStream(EXAMPLE, { + plugins: [BufferPlugin], + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From afabe2ef060ebb451a66660e259e3ab02eb278ca Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 13:26:18 +0800 Subject: [PATCH 61/82] Fix reference test --- .../test/__snapshots__/reference.test.ts.snap | 8 ++ packages/seroval/test/reference.test.ts | 84 ++++++++++++------- 2 files changed, 64 insertions(+), 28 deletions(-) diff --git a/packages/seroval/test/__snapshots__/reference.test.ts.snap b/packages/seroval/test/__snapshots__/reference.test.ts.snap index 4f67b7cc..3ea70d29 100644 --- a/packages/seroval/test/__snapshots__/reference.test.ts.snap +++ b/packages/seroval/test/__snapshots__/reference.test.ts.snap @@ -20,6 +20,14 @@ exports[`Reference > serialize > supports Reference 1`] = `"__SEROVAL_REFS__.get exports[`Reference > serializeAsync > supports Reference 1`] = `"Promise.resolve(__SEROVAL_REFS__.get(\\"example\\"))"`; +exports[`Reference > toCrossJSON > supports Reference 1`] = `"{\\"t\\":20,\\"i\\":0,\\"s\\":\\"example\\"}"`; + +exports[`Reference > toCrossJSONAsync > supports Reference 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":20,\\"i\\":1,\\"s\\":\\"example\\"}}"`; + +exports[`Reference > toCrossJSONStream > supports Reference 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`Reference > toCrossJSONStream > supports Reference 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":20,\\"i\\":1,\\"s\\":\\"example\\"}}"`; + exports[`Reference > toJSON > supports Reference 1`] = `"{\\"t\\":{\\"t\\":20,\\"i\\":0,\\"s\\":\\"example\\"},\\"f\\":16383,\\"m\\":[]}"`; exports[`Reference > toJSONAsync > supports Reference 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":20,\\"i\\":1,\\"s\\":\\"example\\"}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/reference.test.ts b/packages/seroval/test/reference.test.ts index ea527b9e..30a1dc8a 100644 --- a/packages/seroval/test/reference.test.ts +++ b/packages/seroval/test/reference.test.ts @@ -5,82 +5,79 @@ import { crossSerializeAsync, crossSerializeStream, deserialize, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../src'; +const EXAMPLE = createReference('example', () => 'Hello World'); + describe('Reference', () => { describe('serialize', () => { it('supports Reference', () => { - const example = createReference('example', () => 'Hello World'); - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); - expect(back).toBe(example); + const back = deserialize(result); + expect(back).toBe(EXAMPLE); }); }); describe('serializeAsync', () => { it('supports Reference', async () => { - const example = createReference('example', () => 'Hello World'); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); - expect(back).toBe(example); + const back = await deserialize>(result); + expect(back).toBe(EXAMPLE); }); }); describe('toJSON', () => { it('supports Reference', () => { - const example = createReference('example', () => 'Hello World'); - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); - expect(back).toBe(example); + const back = fromJSON(result); + expect(back).toBe(EXAMPLE); }); }); describe('toJSONAsync', () => { it('supports Reference', async () => { - const example = createReference('example', () => 'Hello World'); - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); - expect(back).toBe(example); + const back = await fromJSON>(result); + expect(back).toBe(EXAMPLE); }); }); describe('crossSerialize', () => { it('supports Reference', () => { - const example = createReference('example', () => 'Hello World'); - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('crossSerialize', () => { it('supports Reference', () => { - const example = createReference('example', () => 'Hello World'); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports Reference', async () => { - const example = createReference('example', () => 'Hello World'); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Reference', async () => { - const example = createReference('example', () => 'Hello World'); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports Reference', async () => new Promise((done) => { - const example = createReference('example', () => 'Hello World'); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -91,8 +88,7 @@ describe('Reference', () => { })); describe('scoped', () => { it('supports Reference', async () => new Promise((done) => { - const example = createReference('example', () => 'Hello World'); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -104,4 +100,36 @@ describe('Reference', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports Reference', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBe(EXAMPLE); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports Reference', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(back).toBe(EXAMPLE); + }); + }); + describe('toCrossJSONStream', () => { + it('supports Reference', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From 42ed6d0ebd08b524c174c99115f6241bb97200ce Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 13:28:36 +0800 Subject: [PATCH 62/82] Fix regexp test --- .../test/__snapshots__/regexp.test.ts.snap | 8 ++ packages/seroval/test/regexp.test.ts | 86 +++++++++++++------ 2 files changed, 66 insertions(+), 28 deletions(-) diff --git a/packages/seroval/test/__snapshots__/regexp.test.ts.snap b/packages/seroval/test/__snapshots__/regexp.test.ts.snap index 7b483994..78ed5573 100644 --- a/packages/seroval/test/__snapshots__/regexp.test.ts.snap +++ b/packages/seroval/test/__snapshots__/regexp.test.ts.snap @@ -20,6 +20,14 @@ exports[`RegExp > serialize > supports RegExp 1`] = `"/[a-z0-9]+/i"`; exports[`RegExp > serializeAsync > supports RegExp 1`] = `"Promise.resolve(/[a-z0-9]+/i)"`; +exports[`RegExp > toCrossJSON > supports RegExp 1`] = `"{\\"t\\":6,\\"i\\":0,\\"c\\":\\"[a-z0-9]+\\",\\"m\\":\\"i\\"}"`; + +exports[`RegExp > toCrossJSONAsync > supports RegExp 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":6,\\"i\\":1,\\"c\\":\\"[a-z0-9]+\\",\\"m\\":\\"i\\"}}"`; + +exports[`RegExp > toCrossJSONStream > supports RegExp 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`RegExp > toCrossJSONStream > supports RegExp 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":6,\\"i\\":1,\\"c\\":\\"[a-z0-9]+\\",\\"m\\":\\"i\\"}}"`; + exports[`RegExp > toJSON > supports RegExp 1`] = `"{\\"t\\":{\\"t\\":6,\\"i\\":0,\\"c\\":\\"[a-z0-9]+\\",\\"m\\":\\"i\\"},\\"f\\":16383,\\"m\\":[]}"`; exports[`RegExp > toJSONAsync > supports RegExp 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":6,\\"i\\":1,\\"c\\":\\"[a-z0-9]+\\",\\"m\\":\\"i\\"}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/regexp.test.ts b/packages/seroval/test/regexp.test.ts index 277e5c53..d63cac6e 100644 --- a/packages/seroval/test/regexp.test.ts +++ b/packages/seroval/test/regexp.test.ts @@ -4,86 +4,83 @@ import { crossSerializeAsync, crossSerializeStream, deserialize, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../src'; +const EXAMPLE = /[a-z0-9]+/i; + describe('RegExp', () => { describe('serialize', () => { it('supports RegExp', () => { - const example = /[a-z0-9]+/i; - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back).toBeInstanceOf(RegExp); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('serializeAsync', () => { it('supports RegExp', async () => { - const example = /[a-z0-9]+/i; - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = await deserialize>(result); expect(back).toBeInstanceOf(RegExp); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('toJSON', () => { it('supports RegExp', () => { - const example = /[a-z0-9]+/i; - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(RegExp); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('toJSONAsync', () => { it('supports RegExp', async () => { - const example = /[a-z0-9]+/i; - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = await fromJSON>(result); expect(back).toBeInstanceOf(RegExp); - expect(String(back)).toBe(String(example)); + expect(String(back)).toBe(String(EXAMPLE)); }); }); describe('crossSerialize', () => { it('supports RegExp', () => { - const example = /[a-z0-9]+/i; - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports RegExp', () => { - const example = /[a-z0-9]+/i; - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports RegExp', async () => { - const example = /[a-z0-9]+/i; - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports RegExp', async () => { - const example = /[a-z0-9]+/i; - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports RegExp', async () => new Promise((done) => { - const example = /[a-z0-9]+/i; - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -94,8 +91,7 @@ describe('RegExp', () => { })); describe('scoped', () => { it('supports RegExp', async () => new Promise((done) => { - const example = /[a-z0-9]+/i; - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -107,4 +103,38 @@ describe('RegExp', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports RegExp', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(RegExp); + expect(String(back)).toBe(String(EXAMPLE)); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports RegExp', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(RegExp); + expect(String(back)).toBe(String(EXAMPLE)); + }); + }); + describe('toCrossJSONStream', () => { + it('supports RegExp', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From 6ea5ae0a6f595a3af9c9f97ee8a75e004120ada8 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 13:32:30 +0800 Subject: [PATCH 63/82] Fix set test --- .../test/__snapshots__/set.test.ts.snap | 8 + packages/seroval/test/set.test.ts | 144 +++++++++++------- 2 files changed, 98 insertions(+), 54 deletions(-) diff --git a/packages/seroval/test/__snapshots__/set.test.ts.snap b/packages/seroval/test/__snapshots__/set.test.ts.snap index 11ec6488..5df71d4a 100644 --- a/packages/seroval/test/__snapshots__/set.test.ts.snap +++ b/packages/seroval/test/__snapshots__/set.test.ts.snap @@ -48,6 +48,14 @@ exports[`Set > serializeAsync > supports Set 1`] = `"Promise.resolve(new Set([1, exports[`Set > serializeAsync > supports self-recursion 1`] = `"(h=>(h=new Set([Promise.resolve().then(()=>h)])))()"`; +exports[`Set > toCrossJSON > supports Set 1`] = `"{\\"t\\":7,\\"i\\":0,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}]}"`; + +exports[`Set > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":7,\\"i\\":0,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":0}]}"`; + +exports[`Set > toCrossJSONAsync > supports Set 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":7,\\"i\\":1,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}]}}"`; + +exports[`Set > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":7,\\"i\\":0,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}]}"`; + exports[`Set > toJSON > supports Set 1`] = `"{\\"t\\":{\\"t\\":7,\\"i\\":0,\\"l\\":3,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3}]},\\"f\\":16383,\\"m\\":[]}"`; exports[`Set > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":7,\\"i\\":0,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":0}]},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/set.test.ts b/packages/seroval/test/set.test.ts index 7fb9b1fe..97cdd863 100644 --- a/packages/seroval/test/set.test.ts +++ b/packages/seroval/test/set.test.ts @@ -6,44 +6,48 @@ import { crossSerializeStream, deserialize, Feature, + fromCrossJSON, fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, toJSON, toJSONAsync, } from '../src'; +const EXAMPLE = new Set([1, 2, 3]); + +const RECURSIVE = new Set(); +RECURSIVE.add(RECURSIVE); + describe('Set', () => { describe('serialize', () => { it('supports Set', () => { - const example = new Set([1, 2, 3]); - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(back).toBeInstanceOf(Set); - expect(back.has(1)).toBe(example.has(1)); - expect(back.has(2)).toBe(example.has(2)); - expect(back.has(3)).toBe(example.has(3)); + expect(back.has(1)).toBe(EXAMPLE.has(1)); + expect(back.has(2)).toBe(EXAMPLE.has(2)); + expect(back.has(3)).toBe(EXAMPLE.has(3)); }); it('supports self-recursion', () => { - const example: Set = new Set(); - example.add(example); - const result = serialize(example); + const result = serialize(RECURSIVE); expect(result).toMatchSnapshot(); - const back = deserialize>(result); + const back = deserialize(result); expect(back.has(back)).toBe(true); }); }); describe('serializeAsync', () => { it('supports Set', async () => { - const example = new Set([1, 2, 3]); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>>(result); + const back = await deserialize>(result); expect(back).toBeInstanceOf(Set); - expect(back.has(1)).toBe(example.has(1)); - expect(back.has(2)).toBe(example.has(2)); - expect(back.has(3)).toBe(example.has(3)); + expect(back.has(1)).toBe(EXAMPLE.has(1)); + expect(back.has(2)).toBe(EXAMPLE.has(2)); + expect(back.has(3)).toBe(EXAMPLE.has(3)); }); it('supports self-recursion', async () => { const example: Set> = new Set(); @@ -58,34 +62,30 @@ describe('Set', () => { }); describe('toJSON', () => { it('supports Set', () => { - const example = new Set([1, 2, 3]); - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(Set); - expect(back.has(1)).toBe(example.has(1)); - expect(back.has(2)).toBe(example.has(2)); - expect(back.has(3)).toBe(example.has(3)); + expect(back.has(1)).toBe(EXAMPLE.has(1)); + expect(back.has(2)).toBe(EXAMPLE.has(2)); + expect(back.has(3)).toBe(EXAMPLE.has(3)); }); it('supports self-recursion', () => { - const example: Set = new Set(); - example.add(example); - const result = toJSON(example); + const result = toJSON(RECURSIVE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON>(result); + const back = fromJSON(result); expect(back.has(back)).toBe(true); }); }); describe('toJSONAsync', () => { it('supports Set', async () => { - const example = new Set([1, 2, 3]); - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>>(result); + const back = await fromJSON>(result); expect(back).toBeInstanceOf(Set); - expect(back.has(1)).toBe(example.has(1)); - expect(back.has(2)).toBe(example.has(2)); - expect(back.has(3)).toBe(example.has(3)); + expect(back.has(1)).toBe(EXAMPLE.has(1)); + expect(back.has(2)).toBe(EXAMPLE.has(2)); + expect(back.has(3)).toBe(EXAMPLE.has(3)); }); it('supports self-recursion', async () => { const example: Set> = new Set(); @@ -100,34 +100,27 @@ describe('Set', () => { }); describe('crossSerialize', () => { it('supports Set', () => { - const example = new Set([1, 2, 3]); - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); it('supports self-recursion', () => { - const example: Set = new Set(); - example.add(example); - const result = crossSerialize(example); + const result = crossSerialize(RECURSIVE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports Set', () => { - const example = new Set([1, 2, 3]); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports self-recursion', () => { - const example: Set = new Set(); - example.add(example); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(RECURSIVE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports Set', async () => { - const example = new Set([1, 2, 3]); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); it('supports self-recursion', async () => { @@ -138,8 +131,7 @@ describe('Set', () => { }); describe('scoped', () => { it('supports Set', async () => { - const example = new Set([1, 2, 3]); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); it('supports self-recursion', async () => { @@ -152,8 +144,7 @@ describe('Set', () => { }); describe('crossSerializeStream', () => { it('supports Set', async () => new Promise((done) => { - const example = new Set([1, 2, 3]); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -176,8 +167,7 @@ describe('Set', () => { })); describe('scoped', () => { it('supports Set', async () => new Promise((done) => { - const example = new Set([1, 2, 3]); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -202,26 +192,72 @@ describe('Set', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports Set', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Set); + expect(back.has(1)).toBe(EXAMPLE.has(1)); + expect(back.has(2)).toBe(EXAMPLE.has(2)); + expect(back.has(3)).toBe(EXAMPLE.has(3)); + }); + it('supports self-recursion', () => { + const result = toCrossJSON(RECURSIVE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back.has(back)).toBe(true); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports Set', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Set); + expect(back.has(1)).toBe(EXAMPLE.has(1)); + expect(back.has(2)).toBe(EXAMPLE.has(2)); + expect(back.has(3)).toBe(EXAMPLE.has(3)); + }); + it('supports self-recursion', async () => { + const example: Set> = new Set(); + example.add(Promise.resolve(example)); + const result = await toCrossJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON>>(result, { + refs: new Map(), + }); + for (const key of back) { + expect(await key).toBe(back); + } + }); + }); describe('compat', () => { it('should fallback to Symbol.iterator', () => { - expect(serialize(new Set([1, 2, 3]), { + expect(serialize(EXAMPLE, { disabledFeatures: Feature.Set, })).toMatchSnapshot(); }); it('should throw an error for unsupported target', () => { - expect(() => serialize(new Set([1, 2, 3]), { + expect(() => serialize(EXAMPLE, { disabledFeatures: Feature.Set | Feature.Symbol, })).toThrowErrorMatchingSnapshot(); }); }); describe('compat#toJSON', () => { it('should fallback to Symbol.iterator', () => { - expect(JSON.stringify(toJSON(new Set([1, 2, 3]), { + expect(JSON.stringify(toJSON(EXAMPLE, { disabledFeatures: Feature.Set, }))).toMatchSnapshot(); }); it('should throw an error for unsupported target', () => { - expect(() => toJSON(new Set([1, 2, 3]), { + expect(() => toJSON(EXAMPLE, { disabledFeatures: Feature.Set | Feature.Symbol, })).toThrowErrorMatchingSnapshot(); }); From e56b5cd24b388390a38d3b99bdefc2d0959f7a14 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 13:50:46 +0800 Subject: [PATCH 64/82] Fix sparse-array test --- .../__snapshots__/sparse-array.test.ts.snap | 8 ++ packages/seroval/test/sparse-array.test.ts | 88 +++++++++++++------ 2 files changed, 68 insertions(+), 28 deletions(-) diff --git a/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap b/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap index e121d37c..f8981059 100644 --- a/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap +++ b/packages/seroval/test/__snapshots__/sparse-array.test.ts.snap @@ -20,6 +20,14 @@ exports[`sparse arrays > serialize > supports sparse arrays 1`] = `"[,,,,,,,,,,] exports[`sparse arrays > serializeAsync > supports sparse arrays 1`] = `"Promise.resolve([,,,,,,,,,,])"`; +exports[`sparse arrays > toCrossJSON > supports sparse arrays 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":10,\\"a\\":[],\\"o\\":0}"`; + +exports[`sparse arrays > toCrossJSONAsync > supports sparse arrays 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":1,\\"l\\":10,\\"a\\":[],\\"o\\":0}}"`; + +exports[`sparse arrays > toCrossJSONStream > supports sparse arrays 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`sparse arrays > toCrossJSONStream > supports sparse arrays 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":9,\\"i\\":1,\\"l\\":10,\\"a\\":[],\\"o\\":0}}"`; + exports[`sparse arrays > toJSON > supports sparse arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":10,\\"a\\":[],\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; exports[`sparse arrays > toJSONAsync > supports sparse arrays 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":1,\\"l\\":10,\\"a\\":[],\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/sparse-array.test.ts b/packages/seroval/test/sparse-array.test.ts index 107acbaa..a6be01b7 100644 --- a/packages/seroval/test/sparse-array.test.ts +++ b/packages/seroval/test/sparse-array.test.ts @@ -9,85 +9,82 @@ import { crossSerialize, crossSerializeAsync, crossSerializeStream, + toCrossJSON, + fromCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, } from '../src'; +const EXAMPLE = new Array(10); + describe('sparse arrays', () => { describe('serialize', () => { it('supports sparse arrays', () => { - const example = new Array(10); - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(0 in back).toBeFalsy(); expect(back[0]).toBe(undefined); - expect(back.length).toBe(example.length); + expect(back.length).toBe(EXAMPLE.length); }); }); describe('serializeAsync', () => { it('supports sparse arrays', async () => { - const example = new Array(10); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = await deserialize>(result); expect(0 in back).toBeFalsy(); expect(back[0]).toBe(undefined); - expect(back.length).toBe(example.length); + expect(back.length).toBe(EXAMPLE.length); }); }); describe('toJSON', () => { it('supports sparse arrays', () => { - const example = new Array(10); - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(0 in back).toBeFalsy(); expect(back[0]).toBe(undefined); - expect(back.length).toBe(example.length); + expect(back.length).toBe(EXAMPLE.length); }); }); describe('toJSONAsync', () => { it('supports sparse arrays', async () => { - const example = new Array(10); - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = await fromJSON>(result); expect(0 in back).toBeFalsy(); expect(back[0]).toBe(undefined); - expect(back.length).toBe(example.length); + expect(back.length).toBe(EXAMPLE.length); }); }); describe('crossSerialize', () => { it('supports sparse arrays', () => { - const example = new Array(10); - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports sparse arrays', () => { - const example = new Array(10); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports sparse arrays', async () => { - const example = new Array(10); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports sparse arrays', async () => { - const example = new Array(10); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports sparse arrays', async () => new Promise((done) => { - const example = new Array(10); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -98,8 +95,7 @@ describe('sparse arrays', () => { })); describe('scoped', () => { it('supports sparse arrays', async () => new Promise((done) => { - const example = new Array(10); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -111,4 +107,40 @@ describe('sparse arrays', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports sparse arrays', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(0 in back).toBeFalsy(); + expect(back[0]).toBe(undefined); + expect(back.length).toBe(EXAMPLE.length); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports sparse arrays', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(0 in back).toBeFalsy(); + expect(back[0]).toBe(undefined); + expect(back.length).toBe(EXAMPLE.length); + }); + }); + describe('toCrossJSONStream', () => { + it('supports sparse arrays', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From eab64517f8a6b2723add3bc767d9606729ed0b5c Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 13:55:11 +0800 Subject: [PATCH 65/82] Fix typed-array test --- .../__snapshots__/typed-array.test.ts.snap | 8 + packages/seroval/test/typed-array.test.ts | 171 +++++++++--------- 2 files changed, 89 insertions(+), 90 deletions(-) diff --git a/packages/seroval/test/__snapshots__/typed-array.test.ts.snap b/packages/seroval/test/__snapshots__/typed-array.test.ts.snap index 766504ba..a2121cf9 100644 --- a/packages/seroval/test/__snapshots__/typed-array.test.ts.snap +++ b/packages/seroval/test/__snapshots__/typed-array.test.ts.snap @@ -20,6 +20,14 @@ exports[`typed arrays > serialize > supports typed arrays 1`] = `"new Uint32Arra exports[`typed arrays > serializeAsync > supports typed arrays 1`] = `"Promise.resolve(new Uint32Array(new Uint8Array([255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]).buffer,0,4))"`; +exports[`typed arrays > toCrossJSON > supports typed arrays 1`] = `"{\\"t\\":15,\\"i\\":0,\\"l\\":4,\\"c\\":\\"Uint32Array\\",\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]},\\"b\\":0}"`; + +exports[`typed arrays > toCrossJSONAsync > supports typed arrays 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":15,\\"i\\":1,\\"l\\":4,\\"c\\":\\"Uint32Array\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]},\\"b\\":0}}"`; + +exports[`typed arrays > toCrossJSONStream > supports typed arrays 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`typed arrays > toCrossJSONStream > supports typed arrays 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":15,\\"i\\":1,\\"l\\":4,\\"c\\":\\"Uint32Array\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]},\\"b\\":0}}"`; + exports[`typed arrays > toJSON > supports typed arrays 1`] = `"{\\"t\\":{\\"t\\":15,\\"i\\":0,\\"l\\":4,\\"c\\":\\"Uint32Array\\",\\"f\\":{\\"t\\":21,\\"i\\":1,\\"s\\":[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]},\\"b\\":0},\\"f\\":16383,\\"m\\":[]}"`; exports[`typed arrays > toJSONAsync > supports typed arrays 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":15,\\"i\\":1,\\"l\\":4,\\"c\\":\\"Uint32Array\\",\\"f\\":{\\"t\\":21,\\"i\\":2,\\"s\\":[255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255]},\\"b\\":0}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/typed-array.test.ts b/packages/seroval/test/typed-array.test.ts index 17ae6fb3..4020e2bd 100644 --- a/packages/seroval/test/typed-array.test.ts +++ b/packages/seroval/test/typed-array.test.ts @@ -9,138 +9,95 @@ import { crossSerialize, crossSerializeAsync, crossSerializeStream, + toCrossJSON, + fromCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, } from '../src'; +const EXAMPLE = new Uint32Array([ + 0xFFFFFFFF, + 0xFFFFFFFF, + 0xFFFFFFFF, + 0xFFFFFFFF, +]); + describe('typed arrays', () => { describe('serialize', () => { it('supports typed arrays', () => { - const example = new Uint32Array([ - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - ]); - const result = serialize(example); + const result = serialize(EXAMPLE); expect(result).toMatchSnapshot(); - const back = deserialize(result); + const back = deserialize(result); expect(back).toBeInstanceOf(Uint32Array); - expect(back[0]).toBe(example[0]); - expect(back[1]).toBe(example[1]); - expect(back[2]).toBe(example[2]); - expect(back[3]).toBe(example[3]); + expect(back[0]).toBe(EXAMPLE[0]); + expect(back[1]).toBe(EXAMPLE[1]); + expect(back[2]).toBe(EXAMPLE[2]); + expect(back[3]).toBe(EXAMPLE[3]); }); }); describe('serializeAsync', () => { it('supports typed arrays', async () => { - const example = new Uint32Array([ - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - ]); - const result = await serializeAsync(Promise.resolve(example)); + const result = await serializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); - const back = await deserialize>(result); + const back = await deserialize>(result); expect(back).toBeInstanceOf(Uint32Array); - expect(back[0]).toBe(example[0]); - expect(back[1]).toBe(example[1]); - expect(back[2]).toBe(example[2]); - expect(back[3]).toBe(example[3]); + expect(back[0]).toBe(EXAMPLE[0]); + expect(back[1]).toBe(EXAMPLE[1]); + expect(back[2]).toBe(EXAMPLE[2]); + expect(back[3]).toBe(EXAMPLE[3]); }); }); describe('toJSON', () => { it('supports typed arrays', () => { - const example = new Uint32Array([ - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - ]); - const result = toJSON(example); + const result = toJSON(EXAMPLE); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = fromJSON(result); + const back = fromJSON(result); expect(back).toBeInstanceOf(Uint32Array); - expect(back[0]).toBe(example[0]); - expect(back[1]).toBe(example[1]); - expect(back[2]).toBe(example[2]); - expect(back[3]).toBe(example[3]); + expect(back[0]).toBe(EXAMPLE[0]); + expect(back[1]).toBe(EXAMPLE[1]); + expect(back[2]).toBe(EXAMPLE[2]); + expect(back[3]).toBe(EXAMPLE[3]); }); }); describe('toJSONAsync', () => { it('supports typed arrays', async () => { - const example = new Uint32Array([ - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - ]); - const result = await toJSONAsync(Promise.resolve(example)); + const result = await toJSONAsync(Promise.resolve(EXAMPLE)); expect(JSON.stringify(result)).toMatchSnapshot(); - const back = await fromJSON>(result); + const back = await fromJSON>(result); expect(back).toBeInstanceOf(Uint32Array); - expect(back[0]).toBe(example[0]); - expect(back[1]).toBe(example[1]); - expect(back[2]).toBe(example[2]); - expect(back[3]).toBe(example[3]); + expect(back[0]).toBe(EXAMPLE[0]); + expect(back[1]).toBe(EXAMPLE[1]); + expect(back[2]).toBe(EXAMPLE[2]); + expect(back[3]).toBe(EXAMPLE[3]); }); }); describe('crossSerialize', () => { it('supports typed arrays', () => { - const example = new Uint32Array([ - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - ]); - const result = crossSerialize(example); + const result = crossSerialize(EXAMPLE); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports typed arrays', () => { - const example = new Uint32Array([ - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - ]); - const result = crossSerialize(example, { scopeId: 'example' }); + const result = crossSerialize(EXAMPLE, { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeAsync', () => { it('supports typed arrays', async () => { - const example = new Uint32Array([ - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - ]); - const result = await crossSerializeAsync(Promise.resolve(example)); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE)); expect(result).toMatchSnapshot(); }); describe('scoped', () => { it('supports typed arrays', async () => { - const example = new Uint32Array([ - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - ]); - const result = await crossSerializeAsync(Promise.resolve(example), { scopeId: 'example' }); + const result = await crossSerializeAsync(Promise.resolve(EXAMPLE), { scopeId: 'example' }); expect(result).toMatchSnapshot(); }); }); }); describe('crossSerializeStream', () => { it('supports typed arrays', async () => new Promise((done) => { - const example = new Uint32Array([ - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - ]); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, @@ -151,13 +108,7 @@ describe('typed arrays', () => { })); describe('scoped', () => { it('supports typed arrays', async () => new Promise((done) => { - const example = new Uint32Array([ - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - 0xFFFFFFFF, - ]); - crossSerializeStream(Promise.resolve(example), { + crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); @@ -169,4 +120,44 @@ describe('typed arrays', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports typed arrays', () => { + const result = toCrossJSON(EXAMPLE); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Uint32Array); + expect(back[0]).toBe(EXAMPLE[0]); + expect(back[1]).toBe(EXAMPLE[1]); + expect(back[2]).toBe(EXAMPLE[2]); + expect(back[3]).toBe(EXAMPLE[3]); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports typed arrays', async () => { + const result = await toCrossJSONAsync(Promise.resolve(EXAMPLE)); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = await fromCrossJSON>(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(Uint32Array); + expect(back[0]).toBe(EXAMPLE[0]); + expect(back[1]).toBe(EXAMPLE[1]); + expect(back[2]).toBe(EXAMPLE[2]); + expect(back[3]).toBe(EXAMPLE[3]); + }); + }); + describe('toCrossJSONStream', () => { + it('supports typed arrays', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(EXAMPLE), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From 0e0bad683c011713cf3b967bc774edbe14da132c Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 13:57:30 +0800 Subject: [PATCH 66/82] Fix wk-symbols test --- .../__snapshots__/wk-symbols.test.ts.snap | 104 ++++++++++ packages/seroval/test/wk-symbols.test.ts | 195 ++++++++++++++++++ 2 files changed, 299 insertions(+) diff --git a/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap b/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap index 19a147d1..62ac7ec8 100644 --- a/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap +++ b/packages/seroval/test/__snapshots__/wk-symbols.test.ts.snap @@ -260,6 +260,110 @@ exports[`well-known symbols > serializeAsync > supports well-known symbols 12`] exports[`well-known symbols > serializeAsync > supports well-known symbols 13`] = `"Promise.resolve(Symbol.unscopables)"`; +exports[`well-known symbols > toCrossJSON > supports well-known symbols 1`] = `"{\\"t\\":17,\\"i\\":0,\\"s\\":0}"`; + +exports[`well-known symbols > toCrossJSON > supports well-known symbols 2`] = `"{\\"t\\":17,\\"i\\":0,\\"s\\":1}"`; + +exports[`well-known symbols > toCrossJSON > supports well-known symbols 3`] = `"{\\"t\\":17,\\"i\\":0,\\"s\\":2}"`; + +exports[`well-known symbols > toCrossJSON > supports well-known symbols 4`] = `"{\\"t\\":17,\\"i\\":0,\\"s\\":3}"`; + +exports[`well-known symbols > toCrossJSON > supports well-known symbols 5`] = `"{\\"t\\":17,\\"i\\":0,\\"s\\":4}"`; + +exports[`well-known symbols > toCrossJSON > supports well-known symbols 6`] = `"{\\"t\\":17,\\"i\\":0,\\"s\\":5}"`; + +exports[`well-known symbols > toCrossJSON > supports well-known symbols 7`] = `"{\\"t\\":17,\\"i\\":0,\\"s\\":6}"`; + +exports[`well-known symbols > toCrossJSON > supports well-known symbols 8`] = `"{\\"t\\":17,\\"i\\":0,\\"s\\":7}"`; + +exports[`well-known symbols > toCrossJSON > supports well-known symbols 9`] = `"{\\"t\\":17,\\"i\\":0,\\"s\\":8}"`; + +exports[`well-known symbols > toCrossJSON > supports well-known symbols 10`] = `"{\\"t\\":17,\\"i\\":0,\\"s\\":9}"`; + +exports[`well-known symbols > toCrossJSON > supports well-known symbols 11`] = `"{\\"t\\":17,\\"i\\":0,\\"s\\":10}"`; + +exports[`well-known symbols > toCrossJSON > supports well-known symbols 12`] = `"{\\"t\\":17,\\"i\\":0,\\"s\\":11}"`; + +exports[`well-known symbols > toCrossJSON > supports well-known symbols 13`] = `"{\\"t\\":17,\\"i\\":0,\\"s\\":12}"`; + +exports[`well-known symbols > toCrossJSONAsync > supports well-known symbols 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":0}}"`; + +exports[`well-known symbols > toCrossJSONAsync > supports well-known symbols 2`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":1}}"`; + +exports[`well-known symbols > toCrossJSONAsync > supports well-known symbols 3`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":2}}"`; + +exports[`well-known symbols > toCrossJSONAsync > supports well-known symbols 4`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":3}}"`; + +exports[`well-known symbols > toCrossJSONAsync > supports well-known symbols 5`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":4}}"`; + +exports[`well-known symbols > toCrossJSONAsync > supports well-known symbols 6`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":5}}"`; + +exports[`well-known symbols > toCrossJSONAsync > supports well-known symbols 7`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":6}}"`; + +exports[`well-known symbols > toCrossJSONAsync > supports well-known symbols 8`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":7}}"`; + +exports[`well-known symbols > toCrossJSONAsync > supports well-known symbols 9`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":8}}"`; + +exports[`well-known symbols > toCrossJSONAsync > supports well-known symbols 10`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":9}}"`; + +exports[`well-known symbols > toCrossJSONAsync > supports well-known symbols 11`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":10}}"`; + +exports[`well-known symbols > toCrossJSONAsync > supports well-known symbols 12`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":11}}"`; + +exports[`well-known symbols > toCrossJSONAsync > supports well-known symbols 13`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":12}}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.asyncIterator 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.asyncIterator 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":0}}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.hasInstance 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.hasInstance 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":1}}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.isConcatSpreadable 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.isConcatSpreadable 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":2}}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.iterator 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.iterator 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":3}}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.match 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.match 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":4}}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.matchAll 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.matchAll 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":5}}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.replace 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.replace 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":6}}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.search 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.search 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":7}}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.species 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.species 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":8}}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.split 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.split 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":9}}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.toPrimitive 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.toPrimitive 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":10}}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.toStringTag 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.toStringTag 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":11}}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.unscopables 1`] = `"{\\"t\\":28,\\"i\\":0}"`; + +exports[`well-known symbols > toCrossJSONStream > supports Symbol.unscopables 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":17,\\"i\\":1,\\"s\\":12}}"`; + exports[`well-known symbols > toJSON > supports well-known symbols 1`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":0},\\"f\\":16383,\\"m\\":[]}"`; exports[`well-known symbols > toJSON > supports well-known symbols 2`] = `"{\\"t\\":{\\"t\\":17,\\"i\\":0,\\"s\\":1},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/wk-symbols.test.ts b/packages/seroval/test/wk-symbols.test.ts index e6791a55..097ea2a1 100644 --- a/packages/seroval/test/wk-symbols.test.ts +++ b/packages/seroval/test/wk-symbols.test.ts @@ -7,6 +7,9 @@ import { // fromJSON, serialize, serializeAsync, + toCrossJSON, + toCrossJSONAsync, + toCrossJSONStream, toJSON, toJSONAsync, } from '../src'; @@ -453,4 +456,196 @@ describe('well-known symbols', () => { })); }); }); + describe('toCrossJSON', () => { + it('supports well-known symbols', () => { + expect(JSON.stringify(toCrossJSON(Symbol.asyncIterator))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Symbol.hasInstance))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Symbol.isConcatSpreadable))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Symbol.iterator))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Symbol.match))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Symbol.matchAll))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Symbol.replace))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Symbol.search))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Symbol.species))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Symbol.split))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Symbol.toPrimitive))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Symbol.toStringTag))).toMatchSnapshot(); + expect(JSON.stringify(toCrossJSON(Symbol.unscopables))).toMatchSnapshot(); + }); + }); + describe('toCrossJSONAsync', () => { + it('supports well-known symbols', async () => { + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Symbol.asyncIterator))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Symbol.hasInstance))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Symbol.isConcatSpreadable))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Symbol.iterator))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Symbol.match))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Symbol.matchAll))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Symbol.replace))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Symbol.search))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Symbol.species))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Symbol.split))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Symbol.toPrimitive))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Symbol.toStringTag))), + ).toMatchSnapshot(); + expect( + JSON.stringify(await toCrossJSONAsync(Promise.resolve(Symbol.unscopables))), + ).toMatchSnapshot(); + }); + }); + describe('toCrossJSONStream', () => { + it('supports Symbol.asyncIterator', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Symbol.asyncIterator), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.hasInstance', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Symbol.hasInstance), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.isConcatSpreadable', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Symbol.isConcatSpreadable), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.iterator', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Symbol.iterator), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.match', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Symbol.match), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.matchAll', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Symbol.matchAll), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.replace', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Symbol.replace), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.search', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Symbol.search), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.species', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Symbol.species), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.split', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Symbol.split), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.toPrimitive', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Symbol.toPrimitive), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.toStringTag', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Symbol.toStringTag), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + it('supports Symbol.unscopables', async () => new Promise((done) => { + toCrossJSONStream(Promise.resolve(Symbol.unscopables), { + onParse(data) { + expect(JSON.stringify(data)).toMatchSnapshot(); + }, + onDone() { + done(); + }, + }); + })); + }); }); From cb8fa0b52db53a7fe8035430c2fd0ed5ea82834b Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 14:01:43 +0800 Subject: [PATCH 67/82] Fix async-iterable deserializer on cross mode --- packages/seroval/src/core/context/deserializer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/seroval/src/core/context/deserializer.ts b/packages/seroval/src/core/context/deserializer.ts index 6e023ba7..782a0392 100644 --- a/packages/seroval/src/core/context/deserializer.ts +++ b/packages/seroval/src/core/context/deserializer.ts @@ -147,7 +147,7 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt break; case SerovalObjectRecordSpecialKey.SymbolAsyncIterator: { const current = value; - if (this.mode === 'cross') { + if ((current as object).constructor === ReadableStream) { result[Symbol.asyncIterator] = readableStreamToAsyncIterator( current as ReadableStream>, ); From 6eadab7e41c95f7192d6ef647ef52dd67f62b209 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 14:03:12 +0800 Subject: [PATCH 68/82] Fix async-iterable test --- .../__snapshots__/async-iterable.test.ts.snap | 6 +++--- packages/seroval/test/async-iterable.test.ts | 16 ++-------------- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap b/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap index 990dadda..bec944e2 100644 --- a/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap @@ -1,10 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`AsyncIterable > compat > should use function expressions instead of arrow functions. 1`] = `"(function(h,j){return(j={[h=Symbol.asyncIterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:async function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; +exports[`AsyncIterable > compat > should use function expressions instead of arrow functions. 1`] = `"(function(h){return({title:\\"Hello World\\",[h=Symbol.asyncIterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:async function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; -exports[`AsyncIterable > compat#toJSONAsync > should use function expression instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":2,\\"a\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":1}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[0,3]}"`; +exports[`AsyncIterable > compat#toJSONAsync > should use function expression instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",1],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[3]}"`; -exports[`AsyncIterable > compat#toJSONAsync > should use function expression instead of arrow functions. 2`] = `"(function(h,j){return(j={[h=Symbol.asyncIterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:async function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[j,void 0],t:-1,d:1})})})()"`; +exports[`AsyncIterable > compat#toJSONAsync > should use function expression instead of arrow functions. 2`] = `"(function(h){return({title:\\"Hello World\\",[h=Symbol.asyncIterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:async function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; exports[`AsyncIterable > crossSerializeAsync > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; diff --git a/packages/seroval/test/async-iterable.test.ts b/packages/seroval/test/async-iterable.test.ts index cc631ac4..745516aa 100644 --- a/packages/seroval/test/async-iterable.test.ts +++ b/packages/seroval/test/async-iterable.test.ts @@ -116,26 +116,14 @@ describe('AsyncIterable', () => { }); describe('compat', () => { it('should use function expressions instead of arrow functions.', async () => { - const example = { - async* [Symbol.asyncIterator](): unknown { - await Promise.resolve(); - yield example; - }, - }; - expect(await serializeAsync(example, { + expect(await serializeAsync(EXAMPLE, { disabledFeatures: Feature.ArrowFunction, })).toMatchSnapshot(); }); }); describe('compat#toJSONAsync', () => { it('should use function expression instead of arrow functions.', async () => { - const example = { - async* [Symbol.asyncIterator](): unknown { - await Promise.resolve(); - yield example; - }, - }; - const result = await toJSONAsync(example, { + const result = await toJSONAsync(EXAMPLE, { disabledFeatures: Feature.ArrowFunction, }); expect(JSON.stringify(result)).toMatchSnapshot(); From 7654b7fa588907b9b20df38f9fb2f647b9b83ddf Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 14:48:05 +0800 Subject: [PATCH 69/82] Fix function output --- .../seroval/src/core/context/serializer.ts | 20 +++++++++++++------ packages/seroval/src/core/cross/serializer.ts | 4 ++-- .../seroval/src/core/utils/function-string.ts | 2 +- 3 files changed, 17 insertions(+), 9 deletions(-) diff --git a/packages/seroval/src/core/context/serializer.ts b/packages/seroval/src/core/context/serializer.ts index c7df1ad0..655f499a 100644 --- a/packages/seroval/src/core/context/serializer.ts +++ b/packages/seroval/src/core/context/serializer.ts @@ -1080,12 +1080,12 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio createFunction( this.features, ['s'], - '(' + createFunction( + createFunction( this.features, ['i', 'c', 'd', 't'], '(i=0,t={[' + this.serialize(node.x[SpecialReference.SymbolIterator]) + ']:' + createFunction(this.features, [], 't') + ',' + 'next:' + createEffectfulFunction(this.features, [], 'if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}') + '})', - ) + ')', + ), ), ); } @@ -1096,12 +1096,20 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio createFunction( this.features, ['s'], - '(' + createFunction( + createFunction( this.features, - ['i', 'c', 'd', 't'], + ['i', 't'], '(i=0,t={[' + this.serialize(node.x[SpecialReference.SymbolAsyncIterator]) + ']:' + createFunction(this.features, [], 't') + ',' - + 'next:async ' + createEffectfulFunction(this.features, [], 'if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}') + '})', - ) + ')', + + 'next:' + createFunction( + this.features, + [], + 'Promise.resolve().then(' + createEffectfulFunction( + this.features, + ['c', 'd'], + 'if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}', + ) + ')', + ) + '})', + ), ), ); } diff --git a/packages/seroval/src/core/cross/serializer.ts b/packages/seroval/src/core/cross/serializer.ts index 09b98e20..b9e80e9f 100644 --- a/packages/seroval/src/core/cross/serializer.ts +++ b/packages/seroval/src/core/cross/serializer.ts @@ -104,7 +104,7 @@ export default class CrossSerializerContext extends BaseSerializerContext { createFunction( this.features, ['s'], - '(' + createFunction( + createFunction( this.features, ['b'], '(b=s.tee(),s=b[0],b=b[1].getReader(),{[' + this.serialize(node.x[SpecialReference.SymbolAsyncIterator]) + ']:' + createFunction(this.features, [], 'this') + ',' @@ -117,7 +117,7 @@ export default class CrossSerializerContext extends BaseSerializerContext { 'if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}', ) + ')', ) + '})', - ) + ')', + ), ), ); } diff --git a/packages/seroval/src/core/utils/function-string.ts b/packages/seroval/src/core/utils/function-string.ts index 885a65a1..ef8366ac 100644 --- a/packages/seroval/src/core/utils/function-string.ts +++ b/packages/seroval/src/core/utils/function-string.ts @@ -11,7 +11,7 @@ export function createFunction( : '(' + parameters.join(',') + ')'; return joined + '=>' + body; } - return 'function(' + parameters.join(',') + '){return' + body + '}'; + return 'function(' + parameters.join(',') + '){return ' + body + '}'; } export function createEffectfulFunction( From 6c7b56f8055b4eb7decfa8abe4687d310ba9fd7a Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 14:48:16 +0800 Subject: [PATCH 70/82] Fix tests --- .../__snapshots__/async-iterable.test.ts.snap | 14 +- .../__snapshots__/frozen-object.test.ts.snap | 26 +- .../test/__snapshots__/iterable.test.ts.snap | 20 +- .../test/__snapshots__/map.test.ts.snap | 2 +- .../null-constructor.test.ts.snap | 26 +- .../test/__snapshots__/object.test.ts.snap | 26 +- .../test/__snapshots__/promise.test.ts.snap | 4 +- .../__snapshots__/sealed-object.test.ts.snap | 26 +- .../test/__snapshots__/set.test.ts.snap | 2 +- packages/seroval/test/array.test.ts | 42 ++- packages/seroval/test/async-iterable.test.ts | 21 +- packages/seroval/test/bigint.test.ts | 14 +- packages/seroval/test/boolean.test.ts | 28 +- packages/seroval/test/boxed-bigint.test.ts | 21 +- packages/seroval/test/boxed-boolean.test.ts | 42 ++- packages/seroval/test/boxed-number.test.ts | 105 +++++-- packages/seroval/test/boxed-string.test.ts | 42 ++- packages/seroval/test/data-view.test.ts | 21 +- packages/seroval/test/date.test.ts | 21 +- packages/seroval/test/error.test.ts | 63 ++-- packages/seroval/test/frozen-object.test.ts | 84 ++++-- packages/seroval/test/iterable.test.ts | 21 +- packages/seroval/test/map.test.ts | 42 ++- packages/seroval/test/mutual-cycle.test.ts | 63 ++-- .../seroval/test/null-constructor.test.ts | 84 ++++-- packages/seroval/test/number.test.ts | 70 +++-- packages/seroval/test/object.test.ts | 84 ++++-- packages/seroval/test/plugin.test.ts | 21 +- packages/seroval/test/reference.test.ts | 21 +- packages/seroval/test/regexp.test.ts | 21 +- packages/seroval/test/sealed-object.test.ts | 84 ++++-- packages/seroval/test/set.test.ts | 28 +- packages/seroval/test/sparse-array.test.ts | 21 +- packages/seroval/test/string.test.ts | 28 +- packages/seroval/test/typed-array.test.ts | 21 +- .../seroval/test/web-api/custom-event.test.ts | 21 +- .../test/web-api/dom-exception.test.ts | 21 +- packages/seroval/test/web-api/event.test.ts | 21 +- .../seroval/test/web-api/form-data.test.ts | 21 +- packages/seroval/test/web-api/headers.test.ts | 21 +- .../test/web-api/readable-stream.test.ts | 42 ++- packages/seroval/test/web-api/request.test.ts | 21 +- .../seroval/test/web-api/response.test.ts | 21 +- .../test/web-api/url-search-params.test.ts | 21 +- packages/seroval/test/web-api/url.test.ts | 21 +- packages/seroval/test/wk-symbols.test.ts | 273 +++++++++++++----- 46 files changed, 1228 insertions(+), 535 deletions(-) diff --git a/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap b/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap index bec944e2..b1d8fc15 100644 --- a/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap @@ -1,16 +1,16 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`AsyncIterable > compat > should use function expressions instead of arrow functions. 1`] = `"(function(h){return({title:\\"Hello World\\",[h=Symbol.asyncIterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:async function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; +exports[`AsyncIterable > compat > should use function expressions instead of arrow functions. 1`] = `"(function(h){return ({title:\\"Hello World\\",[h=Symbol.asyncIterator]:(function(s){return function(i,t){return (i=0,t={[h]:function(){return t},next:function(){return Promise.resolve().then(function(c,d){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}})}})}})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; exports[`AsyncIterable > compat#toJSONAsync > should use function expression instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",1],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[3]}"`; -exports[`AsyncIterable > compat#toJSONAsync > should use function expression instead of arrow functions. 2`] = `"(function(h){return({title:\\"Hello World\\",[h=Symbol.asyncIterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:async function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; +exports[`AsyncIterable > compat#toJSONAsync > should use function expression instead of arrow functions. 2`] = `"(function(h){return ({title:\\"Hello World\\",[h=Symbol.asyncIterator]:(function(s){return function(i,t){return (i=0,t={[h]:function(){return t},next:function(){return Promise.resolve().then(function(c,d){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}})}})}})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; -exports[`AsyncIterable > crossSerializeAsync > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeAsync > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeAsync > supports AsyncIterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`AsyncIterable > crossSerializeAsync > supports AsyncIterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; -exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())})($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())})($R[\\"example\\"])"`; exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 2`] = `"($R=>_$.Se($R[1],$R[4]=[0,1]))($R[\\"example\\"])"`; @@ -22,7 +22,7 @@ exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 6`] = `"($R=>_$.Sc($R[1]))($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())}"`; +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())}"`; exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 2`] = `"_$.Se($R[1],$R[4]=[0,1])"`; @@ -34,7 +34,7 @@ exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 5`] = `" exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 6`] = `"_$.Sc($R[1])"`; -exports[`AsyncIterable > serializeAsync > supports AsyncIterables 1`] = `"(h=>({title:\\"Hello World\\",[h=Symbol.asyncIterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:async ()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; +exports[`AsyncIterable > serializeAsync > supports AsyncIterables 1`] = `"(h=>({title:\\"Hello World\\",[h=Symbol.asyncIterator]:(s=>(i,t)=>(i=0,t={[h]:()=>t,next:()=>Promise.resolve().then((c,d)=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}})}))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; exports[`AsyncIterable > toCrossJSONAsync > supports AsyncIterables 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",1],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}}"`; diff --git a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap index d12ab217..20a2bc82 100644 --- a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap @@ -2,29 +2,29 @@ exports[`frozen object > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])"`; -exports[`frozen object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; +exports[`frozen object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])"`; -exports[`frozen object > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; +exports[`frozen object > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; -exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; exports[`frozen object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])"`; @@ -32,7 +32,7 @@ exports[`frozen object > crossSerializeStream > scoped > supports Objects 1`] = exports[`frozen object > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[1],$R[4]=[0,1]))($R[\\"example\\"])"`; @@ -46,7 +46,7 @@ exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIt exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; @@ -58,7 +58,7 @@ exports[`frozen object > crossSerializeStream > supports Objects 1`] = `"$R[0]=_ exports[`frozen object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])"`; -exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())},Object.freeze($R[0]),$R[0])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())},Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[1],$R[4]=[0,1])"`; @@ -72,7 +72,7 @@ exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 6` exports[`frozen object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; exports[`frozen object > crossSerializeStream > supports self-recursion 1`] = `"($R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()},Object.freeze($R[0]),$R[0])"`; @@ -82,15 +82,15 @@ exports[`frozen object > crossSerializeStream > supports self-recursion 3`] = `" exports[`frozen object > serialize > supports Objects 1`] = `"(h=>(h={hello:\\"world\\"},Object.freeze(h),h))()"`; -exports[`frozen object > serialize > supports Symbol.iterator 1`] = `"((h,j)=>(h={[j=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[j]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.freeze(h),h))()"`; +exports[`frozen object > serialize > supports Symbol.iterator 1`] = `"((h,j)=>(h={[j=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[j]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[1,2,3,void 0],t:-1,d:3})},Object.freeze(h),h))()"`; exports[`frozen object > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a=h,Object.freeze(h),h))()"`; exports[`frozen object > serializeAsync > supports Objects 1`] = `"((h,j)=>(j=Promise.resolve(h={hello:\\"world\\"}),Object.freeze(h),j))()"`; -exports[`frozen object > serializeAsync > supports Symbol.asyncIterator 1`] = `"((h,j)=>(h={[j=Symbol.asyncIterator]:(s=>((i,c,d,t)=>(i=0,t={[j]:()=>t,next:async ()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.freeze(h),h))()"`; +exports[`frozen object > serializeAsync > supports Symbol.asyncIterator 1`] = `"((h,j)=>(h={[j=Symbol.asyncIterator]:(s=>(i,t)=>(i=0,t={[j]:()=>t,next:()=>Promise.resolve().then((c,d)=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}})}))({v:[1,2,3,void 0],t:-1,d:3})},Object.freeze(h),h))()"`; -exports[`frozen object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[j=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[j]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}),Object.freeze(h),k))()"`; +exports[`frozen object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[j=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[j]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[1,2,3,void 0],t:-1,d:3})}),Object.freeze(h),k))()"`; exports[`frozen object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.freeze(h),h))()"`; diff --git a/packages/seroval/test/__snapshots__/iterable.test.ts.snap b/packages/seroval/test/__snapshots__/iterable.test.ts.snap index 32e64da2..5c22985f 100644 --- a/packages/seroval/test/__snapshots__/iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/iterable.test.ts.snap @@ -1,30 +1,30 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Iterable > compat > should use function expression instead of arrow functions. 1`] = `"(function(h){return({title:\\"Hello World\\",[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; +exports[`Iterable > compat > should use function expression instead of arrow functions. 1`] = `"(function(h){return ({title:\\"Hello World\\",[h=Symbol.iterator]:(function(s){return function(i,c,d,t){return (i=0,t={[h]:function(){return t},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})}})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; exports[`Iterable > compat#toJSON > should use function expression instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[3]}"`; -exports[`Iterable > compat#toJSON > should use function expression instead of arrow functions. 2`] = `"(function(h){return({title:\\"Hello World\\",[h=Symbol.iterator]:(function(s){return(function(i,c,d,t){return(i=0,t={[h]:function(){returnt},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})})})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; +exports[`Iterable > compat#toJSON > should use function expression instead of arrow functions. 2`] = `"(function(h){return ({title:\\"Hello World\\",[h=Symbol.iterator]:(function(s){return function(i,c,d,t){return (i=0,t={[h]:function(){return t},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})}})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; -exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; -exports[`Iterable > crossSerialize > supports Iterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`Iterable > crossSerialize > supports Iterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; -exports[`Iterable > crossSerializeAsync > scoped > supports Iterables 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`Iterable > crossSerializeAsync > scoped > supports Iterables 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; -exports[`Iterable > crossSerializeAsync > supports Iterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`Iterable > crossSerializeAsync > supports Iterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`Iterable > crossSerializeStream > scoped > supports Iterables 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Iterable > crossSerializeStream > scoped > supports Iterables 2`] = `"($R=>_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`Iterable > crossSerializeStream > scoped > supports Iterables 2`] = `"($R=>_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`Iterable > crossSerializeStream > supports Iterables 1`] = `"$R[0]=_$.P()"`; -exports[`Iterable > crossSerializeStream > supports Iterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`Iterable > crossSerializeStream > supports Iterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; -exports[`Iterable > serialize > supports Iterables 1`] = `"(h=>({title:\\"Hello World\\",[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; +exports[`Iterable > serialize > supports Iterables 1`] = `"(h=>({title:\\"Hello World\\",[h=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; -exports[`Iterable > serializeAsync > supports Iterables 1`] = `"(h=>(Promise.resolve({title:\\"Hello World\\",[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; +exports[`Iterable > serializeAsync > supports Iterables 1`] = `"(h=>(Promise.resolve({title:\\"Hello World\\",[h=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; exports[`Iterable > toCrossJSON > supports Iterables 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}}"`; diff --git a/packages/seroval/test/__snapshots__/map.test.ts.snap b/packages/seroval/test/__snapshots__/map.test.ts.snap index df6c2fbf..d06eda25 100644 --- a/packages/seroval/test/__snapshots__/map.test.ts.snap +++ b/packages/seroval/test/__snapshots__/map.test.ts.snap @@ -1,6 +1,6 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[[1,2],[3,4],void 0],t:-1,d:2})})))()"`; +exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[[1,2],[3,4],void 0],t:-1,d:2})})))()"`; exports[`Map > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; diff --git a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap index 341160d0..f4556ae3 100644 --- a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap +++ b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap @@ -8,29 +8,29 @@ exports[`null-constructor > compat#toJSON > should use manual assignment instead exports[`null-constructor > crossSerialize > scoped > supports Object.create(null) 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; exports[`null-constructor > crossSerialize > supports Object.create(null) 1`] = `"($R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])"`; -exports[`null-constructor > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`null-constructor > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`null-constructor > crossSerialize > supports self-recursion 1`] = `"($R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])"`; exports[`null-constructor > crossSerializeAsync > scoped > supports Object.create(null) 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > supports Object.create(null) 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`null-constructor > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; -exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; +exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; exports[`null-constructor > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})"`; @@ -38,7 +38,7 @@ exports[`null-constructor > crossSerializeStream > scoped > supports Object.crea exports[`null-constructor > crossSerializeStream > scoped > supports Object.create(null) 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())}))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[1],$R[4]=[0,1]))($R[\\"example\\"])"`; @@ -52,7 +52,7 @@ exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyn exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{a:$R[1]=_$.P(),b:$R[2]=_$.P()}))($R[\\"example\\"])"`; @@ -64,7 +64,7 @@ exports[`null-constructor > crossSerializeStream > supports Object.create(null) exports[`null-constructor > crossSerializeStream > supports Object.create(null) 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())})"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())})"`; exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[1],$R[4]=[0,1])"`; @@ -78,7 +78,7 @@ exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; exports[`null-constructor > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=Object.assign(Object.create(null),{a:$R[1]=_$.P(),b:$R[2]=_$.P()})"`; @@ -88,15 +88,15 @@ exports[`null-constructor > crossSerializeStream > supports self-recursion 3`] = exports[`null-constructor > serialize > supports Object.create(null) 1`] = `"Object.assign(Object.create(null),{hello:\\"world\\"})"`; -exports[`null-constructor > serialize > supports Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; +exports[`null-constructor > serialize > supports Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; exports[`null-constructor > serialize > supports self-recursion 1`] = `"(h=>(h=Object.create(null),h.b=h.a=h,h))()"`; exports[`null-constructor > serializeAsync > supports Object.create(null) 1`] = `"Promise.resolve(Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > serializeAsync > supports Symbol.asyncIterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.asyncIterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:async ()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; +exports[`null-constructor > serializeAsync > supports Symbol.asyncIterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.asyncIterator]:(s=>(i,t)=>(i=0,t={[h]:()=>t,next:()=>Promise.resolve().then((c,d)=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}})}))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; -exports[`null-constructor > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))))()"`; +exports[`null-constructor > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[1,2,3,void 0],t:-1,d:3})}))))()"`; exports[`null-constructor > serializeAsync > supports self-recursion 1`] = `"(h=>(h=Object.assign(Object.create(null),{a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)})))()"`; diff --git a/packages/seroval/test/__snapshots__/object.test.ts.snap b/packages/seroval/test/__snapshots__/object.test.ts.snap index 4948ad1e..002a870d 100644 --- a/packages/seroval/test/__snapshots__/object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/object.test.ts.snap @@ -8,29 +8,29 @@ exports[`objects > compat#toJSON > should use manual assignment instead of Objec exports[`objects > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"})($R[\\"example\\"])"`; -exports[`objects > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`objects > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; exports[`objects > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; exports[`objects > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])"`; -exports[`objects > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`objects > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; exports[`objects > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],$R[0])"`; exports[`objects > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`objects > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; -exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]={hello:\\"world\\"})"`; -exports[`objects > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`objects > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; -exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`objects > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}"`; @@ -38,7 +38,7 @@ exports[`objects > crossSerializeStream > scoped > supports Objects 1`] = `"($R= exports[`objects > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]={hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())})($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())})($R[\\"example\\"])"`; exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[1],$R[4]=[0,1]))($R[\\"example\\"])"`; @@ -52,7 +52,7 @@ exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`objects > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()})($R[\\"example\\"])"`; @@ -64,7 +64,7 @@ exports[`objects > crossSerializeStream > supports Objects 1`] = `"$R[0]=_$.P()" exports[`objects > crossSerializeStream > supports Objects 2`] = `"_$.Ps($R[0],$R[1]={hello:\\"world\\"})"`; -exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())}"`; +exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())}"`; exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[1],$R[4]=[0,1])"`; @@ -78,7 +78,7 @@ exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 6`] = `" exports[`objects > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`objects > crossSerializeStream > supports self-recursion 1`] = `"$R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()}"`; @@ -88,15 +88,15 @@ exports[`objects > crossSerializeStream > supports self-recursion 3`] = `"_$.Ps( exports[`objects > serialize > supports Objects 1`] = `"({hello:\\"world\\"})"`; -exports[`objects > serialize > supports Symbol.iterator 1`] = `"(h=>({[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; +exports[`objects > serialize > supports Symbol.iterator 1`] = `"(h=>({[h=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; exports[`objects > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a=h,h))()"`; exports[`objects > serializeAsync > supports Objects 1`] = `"Promise.resolve({hello:\\"world\\"})"`; -exports[`objects > serializeAsync > supports Symbol.asyncIterator 1`] = `"(h=>({[h=Symbol.asyncIterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:async ()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; +exports[`objects > serializeAsync > supports Symbol.asyncIterator 1`] = `"(h=>({[h=Symbol.asyncIterator]:(s=>(i,t)=>(i=0,t={[h]:()=>t,next:()=>Promise.resolve().then((c,d)=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}})}))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; -exports[`objects > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve({[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; +exports[`objects > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promise.resolve({[h=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; exports[`objects > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)}))()"`; diff --git a/packages/seroval/test/__snapshots__/promise.test.ts.snap b/packages/seroval/test/__snapshots__/promise.test.ts.snap index 9d6a60dd..3bbf8e42 100644 --- a/packages/seroval/test/__snapshots__/promise.test.ts.snap +++ b/packages/seroval/test/__snapshots__/promise.test.ts.snap @@ -2,8 +2,8 @@ exports[`Promise > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Promise]\\""`; -exports[`Promise > compat > should use function expression instead of arrow functions 1`] = `"(function(h){return(h={self:Promise.resolve().then(function(){returnh})})})()"`; +exports[`Promise > compat > should use function expression instead of arrow functions 1`] = `"(function(h){return (h={self:Promise.resolve().then(function(){return h})})})()"`; -exports[`Promise > compat > should use function expression instead of arrow functions 2`] = `"(function(h){return(h={self:Promise.reject().catch(function(){throw h})})})()"`; +exports[`Promise > compat > should use function expression instead of arrow functions 2`] = `"(function(h){return (h={self:Promise.reject().catch(function(){throw h})})})()"`; exports[`Promise > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Promise]\\""`; diff --git a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap index 8393d34a..dde09f75 100644 --- a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap @@ -2,29 +2,29 @@ exports[`sealed object > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.seal($R[0]),$R[0])"`; -exports[`sealed object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>((i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; +exports[`sealed object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])"`; -exports[`sealed object > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; +exports[`sealed object > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; -exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; exports[`sealed object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])"`; @@ -32,7 +32,7 @@ exports[`sealed object > crossSerializeStream > scoped > supports Objects 1`] = exports[`sealed object > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[1],$R[4]=[0,1]))($R[\\"example\\"])"`; @@ -46,7 +46,7 @@ exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIt exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; @@ -58,7 +58,7 @@ exports[`sealed object > crossSerializeStream > supports Objects 1`] = `"$R[0]=_ exports[`sealed object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])"`; -exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>(b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})})))($R[1]=_$.S())},Object.seal($R[0]),$R[0])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())},Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[1],$R[4]=[0,1])"`; @@ -72,7 +72,7 @@ exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 6` exports[`sealed object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>((i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; exports[`sealed object > crossSerializeStream > supports self-recursion 1`] = `"($R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()},Object.seal($R[0]),$R[0])"`; @@ -82,15 +82,15 @@ exports[`sealed object > crossSerializeStream > supports self-recursion 3`] = `" exports[`sealed object > serialize > supports Objects 1`] = `"(h=>(h={hello:\\"world\\"},Object.seal(h),h))()"`; -exports[`sealed object > serialize > supports Symbol.iterator 1`] = `"((h,j)=>(h={[j=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[j]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.seal(h),h))()"`; +exports[`sealed object > serialize > supports Symbol.iterator 1`] = `"((h,j)=>(h={[j=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[j]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[1,2,3,void 0],t:-1,d:3})},Object.seal(h),h))()"`; exports[`sealed object > serialize > supports self-recursion 1`] = `"(h=>(h={},h.b=h.a=h,Object.seal(h),h))()"`; exports[`sealed object > serializeAsync > supports Objects 1`] = `"((h,j)=>(j=Promise.resolve(h={hello:\\"world\\"}),Object.seal(h),j))()"`; -exports[`sealed object > serializeAsync > supports Symbol.asyncIterator 1`] = `"((h,j)=>(h={[j=Symbol.asyncIterator]:(s=>((i,c,d,t)=>(i=0,t={[j]:()=>t,next:async ()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})},Object.seal(h),h))()"`; +exports[`sealed object > serializeAsync > supports Symbol.asyncIterator 1`] = `"((h,j)=>(h={[j=Symbol.asyncIterator]:(s=>(i,t)=>(i=0,t={[j]:()=>t,next:()=>Promise.resolve().then((c,d)=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}})}))({v:[1,2,3,void 0],t:-1,d:3})},Object.seal(h),h))()"`; -exports[`sealed object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[j=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[j]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})}),Object.seal(h),k))()"`; +exports[`sealed object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j,k)=>(k=Promise.resolve(h={[j=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[j]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[1,2,3,void 0],t:-1,d:3})}),Object.seal(h),k))()"`; exports[`sealed object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.seal(h),h))()"`; diff --git a/packages/seroval/test/__snapshots__/set.test.ts.snap b/packages/seroval/test/__snapshots__/set.test.ts.snap index 5df71d4a..2294ffa6 100644 --- a/packages/seroval/test/__snapshots__/set.test.ts.snap +++ b/packages/seroval/test/__snapshots__/set.test.ts.snap @@ -1,6 +1,6 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Set > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>((i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; +exports[`Set > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; exports[`Set > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; diff --git a/packages/seroval/test/array.test.ts b/packages/seroval/test/array.test.ts index fff0c869..f4174660 100644 --- a/packages/seroval/test/array.test.ts +++ b/packages/seroval/test/array.test.ts @@ -142,46 +142,58 @@ describe('arrays', () => { }); }); describe('crossSerializeStream', () => { - it('supports Arrays', async () => new Promise((done) => { + it('supports Arrays', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self recursion', async () => new Promise((done) => { + it('supports self recursion', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_RECURSIVE_EXAMPLE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Arrays', async () => new Promise((done) => { + it('supports Arrays', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self recursion', async () => new Promise((done) => { + it('supports self recursion', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_RECURSIVE_EXAMPLE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -232,23 +244,29 @@ describe('arrays', () => { }); }); describe('toCrossJSONStream', () => { - it('supports Arrays', async () => new Promise((done) => { + it('supports Arrays', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self recursion', async () => new Promise((done) => { + it('supports self recursion', async () => new Promise((resolve, reject) => { toCrossJSONStream(ASYNC_RECURSIVE_EXAMPLE, { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/async-iterable.test.ts b/packages/seroval/test/async-iterable.test.ts index 745516aa..c3fb4234 100644 --- a/packages/seroval/test/async-iterable.test.ts +++ b/packages/seroval/test/async-iterable.test.ts @@ -63,25 +63,31 @@ describe('AsyncIterable', () => { }); }); describe('crossSerializeStream', () => { - it('supports AsyncIterables', async () => new Promise((done) => { + it('supports AsyncIterables', async () => new Promise((resolve, reject) => { crossSerializeStream(EXAMPLE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports AsyncIterables', async () => new Promise((done) => { + it('supports AsyncIterables', async () => new Promise((resolve, reject) => { crossSerializeStream(EXAMPLE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -103,13 +109,16 @@ describe('AsyncIterable', () => { }); }); describe('toCrossJSONStream', () => { - it('supports AsyncIterables', async () => new Promise((done) => { + it('supports AsyncIterables', async () => new Promise((resolve, reject) => { toCrossJSONStream(EXAMPLE, { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/bigint.test.ts b/packages/seroval/test/bigint.test.ts index a214c7b6..eac3edb4 100644 --- a/packages/seroval/test/bigint.test.ts +++ b/packages/seroval/test/bigint.test.ts @@ -54,13 +54,16 @@ describe('bigint', () => { }); }); describe('crossSerializeStream', () => { - it('supports bigint', async () => new Promise((done) => { + it('supports bigint', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -79,13 +82,16 @@ describe('bigint', () => { }); }); describe('toCrossJSONStream', () => { - it('supports bigint', async () => new Promise((done) => { + it('supports bigint', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/boolean.test.ts b/packages/seroval/test/boolean.test.ts index dc937650..4ce2cbef 100644 --- a/packages/seroval/test/boolean.test.ts +++ b/packages/seroval/test/boolean.test.ts @@ -54,23 +54,29 @@ describe('boolean', () => { }); }); describe('crossSerializeStream', () => { - it('supports true value', async () => new Promise((done) => { + it('supports true value', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(true), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports false value', async () => new Promise((done) => { + it('supports false value', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(false), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -92,23 +98,29 @@ describe('boolean', () => { }); }); describe('toCrossJSONStream', () => { - it('supports true value', async () => new Promise((done) => { + it('supports true value', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(true), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports false value', async () => new Promise((done) => { + it('supports false value', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(false), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/boxed-bigint.test.ts b/packages/seroval/test/boxed-bigint.test.ts index 28e8531f..342999d7 100644 --- a/packages/seroval/test/boxed-bigint.test.ts +++ b/packages/seroval/test/boxed-bigint.test.ts @@ -69,25 +69,31 @@ describe('boxed bigint', () => { }); }); describe('crossSerializeStream', () => { - it('supports boxed bigint', async () => new Promise((done) => { + it('supports boxed bigint', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(EXAMPLE)), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports boxed bigint', async () => new Promise((done) => { + it('supports boxed bigint', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(EXAMPLE)), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -111,13 +117,16 @@ describe('boxed bigint', () => { }); }); describe('toCrossJSONStream', () => { - it('supports boxed bigint', async () => new Promise((done) => { + it('supports boxed bigint', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Object(EXAMPLE)), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/boxed-boolean.test.ts b/packages/seroval/test/boxed-boolean.test.ts index 6758679b..2faec212 100644 --- a/packages/seroval/test/boxed-boolean.test.ts +++ b/packages/seroval/test/boxed-boolean.test.ts @@ -66,46 +66,58 @@ describe('boxed boolean', () => { }); }); describe('crossSerializeStream', () => { - it('supports boxed true', async () => new Promise((done) => { + it('supports boxed true', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(true)), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed false', async () => new Promise((done) => { + it('supports boxed false', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(false)), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports boxed true', async () => new Promise((done) => { + it('supports boxed true', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(true)), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed false', async () => new Promise((done) => { + it('supports boxed false', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(false)), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -128,23 +140,29 @@ describe('boxed boolean', () => { }); }); describe('toCrossJSONStream', () => { - it('supports boxed true', async () => new Promise((done) => { + it('supports boxed true', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Object(true)), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed false', async () => new Promise((done) => { + it('supports boxed false', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Object(false)), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/boxed-number.test.ts b/packages/seroval/test/boxed-number.test.ts index 61159430..23b5af27 100644 --- a/packages/seroval/test/boxed-number.test.ts +++ b/packages/seroval/test/boxed-number.test.ts @@ -105,109 +105,139 @@ describe('boxed number', () => { }); describe('crossSerializeStream', () => { - it('supports boxed numbers', async () => new Promise((done) => { + it('supports boxed numbers', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(0xDEADBEEF)), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed NaN', async () => new Promise((done) => { + it('supports boxed NaN', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(NaN)), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed Infinity', async () => new Promise((done) => { + it('supports boxed Infinity', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(Infinity)), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed -Infinity', async () => new Promise((done) => { + it('supports boxed -Infinity', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(-Infinity)), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed -0', async () => new Promise((done) => { + it('supports boxed -0', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(-0)), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports boxed numbers', async () => new Promise((done) => { + it('supports boxed numbers', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(0xDEADBEEF)), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed NaN', async () => new Promise((done) => { + it('supports boxed NaN', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(NaN)), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed Infinity', async () => new Promise((done) => { + it('supports boxed Infinity', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(Infinity)), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed -Infinity', async () => new Promise((done) => { + it('supports boxed -Infinity', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(-Infinity)), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed -0', async () => new Promise((done) => { + it('supports boxed -0', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(-0)), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -244,53 +274,68 @@ describe('boxed number', () => { }); }); describe('toCrossJSONStream', () => { - it('supports boxed numbers', async () => new Promise((done) => { + it('supports boxed numbers', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Object(0xDEADBEEF)), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed NaN', async () => new Promise((done) => { + it('supports boxed NaN', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Object(NaN)), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed Infinity', async () => new Promise((done) => { + it('supports boxed Infinity', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Object(Infinity)), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed -Infinity', async () => new Promise((done) => { + it('supports boxed -Infinity', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Object(-Infinity)), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed -0', async () => new Promise((done) => { + it('supports boxed -0', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Object(-0)), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/boxed-string.test.ts b/packages/seroval/test/boxed-string.test.ts index 612264b0..b9c08406 100644 --- a/packages/seroval/test/boxed-string.test.ts +++ b/packages/seroval/test/boxed-string.test.ts @@ -76,46 +76,58 @@ describe('boxed string', () => { }); }); describe('crossSerializeStream', () => { - it('supports boxed strings', async () => new Promise((done) => { + it('supports boxed strings', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(QUOTED)), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed sanitized strings', async () => new Promise((done) => { + it('supports boxed sanitized strings', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(HTML)), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports boxed strings', async () => new Promise((done) => { + it('supports boxed strings', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(QUOTED)), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed sanitized strings', async () => new Promise((done) => { + it('supports boxed sanitized strings', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Object(HTML)), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -144,23 +156,29 @@ describe('boxed string', () => { }); }); describe('toCrossJSONStream', () => { - it('supports boxed strings', async () => new Promise((done) => { + it('supports boxed strings', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Object(QUOTED)), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports boxed sanitized strings', async () => new Promise((done) => { + it('supports boxed sanitized strings', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Object(HTML)), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/data-view.test.ts b/packages/seroval/test/data-view.test.ts index 6d53e120..9c06a9c3 100644 --- a/packages/seroval/test/data-view.test.ts +++ b/packages/seroval/test/data-view.test.ts @@ -81,25 +81,31 @@ describe('DataView', () => { }); }); describe('crossSerializeStream', () => { - it('supports DataView', async () => new Promise((done) => { + it('supports DataView', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports DataView', async () => new Promise((done) => { + it('supports DataView', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -128,13 +134,16 @@ describe('DataView', () => { }); }); describe('toCrossJSONStream', () => { - it('supports DataView', async () => new Promise((done) => { + it('supports DataView', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/date.test.ts b/packages/seroval/test/date.test.ts index 20ee010f..cefbb1bf 100644 --- a/packages/seroval/test/date.test.ts +++ b/packages/seroval/test/date.test.ts @@ -80,25 +80,31 @@ describe('Date', () => { }); }); describe('crossSerializeStream', () => { - it('supports Date', async () => new Promise((done) => { + it('supports Date', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Date', async () => new Promise((done) => { + it('supports Date', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -127,13 +133,16 @@ describe('Date', () => { }); }); describe('toCrossJSONStream', () => { - it('supports Date', async () => new Promise((done) => { + it('supports Date', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/error.test.ts b/packages/seroval/test/error.test.ts index 609d5c09..c46a4779 100644 --- a/packages/seroval/test/error.test.ts +++ b/packages/seroval/test/error.test.ts @@ -181,7 +181,7 @@ describe('Error', () => { }); describe('crossSerializeStream', () => { - it('supports Error.prototype.name', async () => new Promise((done) => { + it('supports Error.prototype.name', async () => new Promise((resolve, reject) => { const a = new Error('A'); a.name = 'ExampleError'; a.stack = ''; @@ -190,11 +190,14 @@ describe('Error', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Error.prototype.cause', async () => new Promise((done) => { + it('supports Error.prototype.cause', async () => new Promise((resolve, reject) => { const a = new Error('A'); const b = new Error('B', { cause: Promise.resolve(a) }); a.stack = ''; @@ -204,11 +207,14 @@ describe('Error', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports other Error classes', async () => new Promise((done) => { + it('supports other Error classes', async () => new Promise((resolve, reject) => { const a = new ReferenceError('A'); a.stack = ''; crossSerializeStream(Promise.resolve(a), { @@ -216,13 +222,16 @@ describe('Error', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Error.prototype.name', async () => new Promise((done) => { + it('supports Error.prototype.name', async () => new Promise((resolve, reject) => { const a = new Error('A'); a.name = 'ExampleError'; a.stack = ''; @@ -232,11 +241,14 @@ describe('Error', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Error.prototype.cause', async () => new Promise((done) => { + it('supports Error.prototype.cause', async () => new Promise((resolve, reject) => { const a = new Error('A'); const b = new Error('B', { cause: Promise.resolve(a) }); a.stack = ''; @@ -247,11 +259,14 @@ describe('Error', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports other Error classes', async () => new Promise((done) => { + it('supports other Error classes', async () => new Promise((resolve, reject) => { const a = new ReferenceError('A'); a.stack = ''; crossSerializeStream(Promise.resolve(a), { @@ -260,7 +275,10 @@ describe('Error', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -314,7 +332,7 @@ describe('Error', () => { }); describe('toCrossJSONStream', () => { - it('supports Error.prototype.name', async () => new Promise((done) => { + it('supports Error.prototype.name', async () => new Promise((resolve, reject) => { const a = new Error('A'); a.name = 'ExampleError'; a.stack = ''; @@ -323,11 +341,14 @@ describe('Error', () => { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Error.prototype.cause', async () => new Promise((done) => { + it('supports Error.prototype.cause', async () => new Promise((resolve, reject) => { const a = new Error('A'); const b = new Error('B', { cause: Promise.resolve(a) }); a.stack = ''; @@ -337,11 +358,14 @@ describe('Error', () => { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports other Error classes', async () => new Promise((done) => { + it('supports other Error classes', async () => new Promise((resolve, reject) => { const a = new ReferenceError('A'); a.stack = ''; toCrossJSONStream(Promise.resolve(a), { @@ -349,7 +373,10 @@ describe('Error', () => { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/frozen-object.test.ts b/packages/seroval/test/frozen-object.test.ts index 532df4c0..1b5be57d 100644 --- a/packages/seroval/test/frozen-object.test.ts +++ b/packages/seroval/test/frozen-object.test.ts @@ -238,88 +238,112 @@ describe('frozen object', () => { }); }); describe('crossSerializeStream', () => { - it('supports Objects', async () => new Promise((done) => { + it('supports Objects', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_RECURSIVE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.iterator', async () => new Promise((done) => { + it('supports Symbol.iterator', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(ITERABLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.asyncIterator', async () => new Promise((done) => { + it('supports Symbol.asyncIterator', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_ITERABLE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Objects', async () => new Promise((done) => { + it('supports Objects', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_RECURSIVE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.iterator', async () => new Promise((done) => { + it('supports Symbol.iterator', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(ITERABLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.asyncIterator', async () => new Promise((done) => { + it('supports Symbol.asyncIterator', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_ITERABLE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -400,43 +424,55 @@ describe('frozen object', () => { }); }); describe('toCrossJSONStream', () => { - it('supports Objects', async () => new Promise((done) => { + it('supports Objects', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { toCrossJSONStream(ASYNC_RECURSIVE, { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.iterator', async () => new Promise((done) => { + it('supports Symbol.iterator', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(ITERABLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.asyncIterator', async () => new Promise((done) => { + it('supports Symbol.asyncIterator', async () => new Promise((resolve, reject) => { toCrossJSONStream(ASYNC_ITERABLE, { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/iterable.test.ts b/packages/seroval/test/iterable.test.ts index b3def32e..b02b1475 100644 --- a/packages/seroval/test/iterable.test.ts +++ b/packages/seroval/test/iterable.test.ts @@ -107,25 +107,31 @@ describe('Iterable', () => { }); }); describe('crossSerializeStream', () => { - it('supports Iterables', async () => new Promise((done) => { + it('supports Iterables', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Iterables', async () => new Promise((done) => { + it('supports Iterables', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -178,13 +184,16 @@ describe('Iterable', () => { }); }); describe('toCrossJSONStream', () => { - it('supports Iterables', async () => new Promise((done) => { + it('supports Iterables', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/map.test.ts b/packages/seroval/test/map.test.ts index e4c6c1cb..d27609d4 100644 --- a/packages/seroval/test/map.test.ts +++ b/packages/seroval/test/map.test.ts @@ -141,46 +141,58 @@ describe('Map', () => { }); }); describe('crossSerializeStream', () => { - it('supports Map', async () => new Promise((done) => { + it('supports Map', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_RECURSIVE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Map', async () => new Promise((done) => { + it('supports Map', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_RECURSIVE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -231,23 +243,29 @@ describe('Map', () => { }); }); describe('crossSerializeStream', () => { - it('supports Map', async () => new Promise((done) => { + it('supports Map', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { toCrossJSONStream(ASYNC_RECURSIVE, { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/mutual-cycle.test.ts b/packages/seroval/test/mutual-cycle.test.ts index 9f1049b6..36c299db 100644 --- a/packages/seroval/test/mutual-cycle.test.ts +++ b/packages/seroval/test/mutual-cycle.test.ts @@ -285,7 +285,7 @@ describe('mutual cyclic references', () => { }); }); describe('crossSerializeStream', () => { - it('supports Arrays and Arrays', async () => new Promise((done) => { + it('supports Arrays and Arrays', async () => new Promise((resolve, reject) => { const a: Promise[] = []; const b: Promise[] = []; a[0] = Promise.resolve(b); @@ -296,11 +296,14 @@ describe('mutual cyclic references', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Arrays and Objects', async () => new Promise((done) => { + it('supports Arrays and Objects', async () => new Promise((resolve, reject) => { const a: Promise[] = []; const b: Record> = {}; a[0] = Promise.resolve(b); @@ -311,11 +314,14 @@ describe('mutual cyclic references', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Objects and Objects', async () => new Promise((done) => { + it('supports Objects and Objects', async () => new Promise((resolve, reject) => { const a: Record> = {}; const b: Record> = {}; a[0] = Promise.resolve(b); @@ -326,12 +332,15 @@ describe('mutual cyclic references', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Arrays and Arrays', async () => new Promise((done) => { + it('supports Arrays and Arrays', async () => new Promise((resolve, reject) => { const a: Promise[] = []; const b: Promise[] = []; a[0] = Promise.resolve(b); @@ -343,11 +352,14 @@ describe('mutual cyclic references', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Arrays and Objects', async () => new Promise((done) => { + it('supports Arrays and Objects', async () => new Promise((resolve, reject) => { const a: Promise[] = []; const b: Record> = {}; a[0] = Promise.resolve(b); @@ -359,11 +371,14 @@ describe('mutual cyclic references', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Objects and Objects', async () => new Promise((done) => { + it('supports Objects and Objects', async () => new Promise((resolve, reject) => { const a: Record> = {}; const b: Record> = {}; a[0] = Promise.resolve(b); @@ -375,7 +390,10 @@ describe('mutual cyclic references', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -470,7 +488,7 @@ describe('mutual cyclic references', () => { }); }); describe('toCrossJSONStream', () => { - it('supports Arrays and Arrays', async () => new Promise((done) => { + it('supports Arrays and Arrays', async () => new Promise((resolve, reject) => { const a: Promise[] = []; const b: Promise[] = []; a[0] = Promise.resolve(b); @@ -481,11 +499,14 @@ describe('mutual cyclic references', () => { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Arrays and Objects', async () => new Promise((done) => { + it('supports Arrays and Objects', async () => new Promise((resolve, reject) => { const a: Promise[] = []; const b: Record> = {}; a[0] = Promise.resolve(b); @@ -496,11 +517,14 @@ describe('mutual cyclic references', () => { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Objects and Objects', async () => new Promise((done) => { + it('supports Objects and Objects', async () => new Promise((resolve, reject) => { const a: Record> = {}; const b: Record> = {}; a[0] = Promise.resolve(b); @@ -511,7 +535,10 @@ describe('mutual cyclic references', () => { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/null-constructor.test.ts b/packages/seroval/test/null-constructor.test.ts index 013627cb..7026484f 100644 --- a/packages/seroval/test/null-constructor.test.ts +++ b/packages/seroval/test/null-constructor.test.ts @@ -224,88 +224,112 @@ describe('null-constructor', () => { }); }); describe('crossSerializeStream', () => { - it('supports Object.create(null)', async () => new Promise((done) => { + it('supports Object.create(null)', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_RECURSIVE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.iterator', async () => new Promise((done) => { + it('supports Symbol.iterator', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(ITERABLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.asyncIterator', async () => new Promise((done) => { + it('supports Symbol.asyncIterator', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_ITERABLE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Object.create(null)', async () => new Promise((done) => { + it('supports Object.create(null)', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_RECURSIVE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.iterator', async () => new Promise((done) => { + it('supports Symbol.iterator', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(ITERABLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.asyncIterator', async () => new Promise((done) => { + it('supports Symbol.asyncIterator', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_ITERABLE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -384,43 +408,55 @@ describe('null-constructor', () => { }); }); describe('toCrossJSONStream', () => { - it('supports Object.create(null)', async () => new Promise((done) => { + it('supports Object.create(null)', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { toCrossJSONStream(ASYNC_RECURSIVE, { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.iterator', async () => new Promise((done) => { + it('supports Symbol.iterator', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(ITERABLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.asyncIterator', async () => new Promise((done) => { + it('supports Symbol.asyncIterator', async () => new Promise((resolve, reject) => { toCrossJSONStream(ASYNC_ITERABLE, { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/number.test.ts b/packages/seroval/test/number.test.ts index c1782267..e5795eb0 100644 --- a/packages/seroval/test/number.test.ts +++ b/packages/seroval/test/number.test.ts @@ -85,53 +85,68 @@ describe('number', () => { }); describe('crossSerializeStream', () => { - it('supports numbers', async () => new Promise((done) => { + it('supports numbers', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(0xDEADBEEF), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports NaN', async () => new Promise((done) => { + it('supports NaN', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(NaN), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Infinity', async () => new Promise((done) => { + it('supports Infinity', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Infinity), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports -Infinity', async () => new Promise((done) => { + it('supports -Infinity', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(-Infinity), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports -0', async () => new Promise((done) => { + it('supports -0', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(-0), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -167,53 +182,68 @@ describe('number', () => { }); }); describe('toCrossJSONStream', () => { - it('supports numbers', async () => new Promise((done) => { + it('supports numbers', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(0xDEADBEEF), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports NaN', async () => new Promise((done) => { + it('supports NaN', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(NaN), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Infinity', async () => new Promise((done) => { + it('supports Infinity', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Infinity), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports -Infinity', async () => new Promise((done) => { + it('supports -Infinity', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(-Infinity), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports -0', async () => new Promise((done) => { + it('supports -0', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(-0), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/object.test.ts b/packages/seroval/test/object.test.ts index 5e87a021..aadd9214 100644 --- a/packages/seroval/test/object.test.ts +++ b/packages/seroval/test/object.test.ts @@ -224,88 +224,112 @@ describe('objects', () => { }); }); describe('crossSerializeStream', () => { - it('supports Objects', async () => new Promise((done) => { + it('supports Objects', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_RECURSIVE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.iterator', async () => new Promise((done) => { + it('supports Symbol.iterator', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(ITERABLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.asyncIterator', async () => new Promise((done) => { + it('supports Symbol.asyncIterator', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_ITERABLE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Objects', async () => new Promise((done) => { + it('supports Objects', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_RECURSIVE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.iterator', async () => new Promise((done) => { + it('supports Symbol.iterator', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(ITERABLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.asyncIterator', async () => new Promise((done) => { + it('supports Symbol.asyncIterator', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_ITERABLE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -384,43 +408,55 @@ describe('objects', () => { }); }); describe('toCrossJSONStream', () => { - it('supports Objects', async () => new Promise((done) => { + it('supports Objects', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { toCrossJSONStream(ASYNC_RECURSIVE, { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.iterator', async () => new Promise((done) => { + it('supports Symbol.iterator', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(ITERABLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.asyncIterator', async () => new Promise((done) => { + it('supports Symbol.asyncIterator', async () => new Promise((resolve, reject) => { toCrossJSONStream(ASYNC_ITERABLE, { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/plugin.test.ts b/packages/seroval/test/plugin.test.ts index 32110072..84166880 100644 --- a/packages/seroval/test/plugin.test.ts +++ b/packages/seroval/test/plugin.test.ts @@ -128,20 +128,23 @@ describe('Plugin', () => { }); }); describe('crossSerializeStream', () => { - it('supports Plugin', async () => new Promise((done) => { + it('supports Plugin', async () => new Promise((resolve, reject) => { crossSerializeStream(EXAMPLE, { plugins: [BufferPlugin], onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Plugin', async () => new Promise((done) => { + it('supports Plugin', async () => new Promise((resolve, reject) => { crossSerializeStream(EXAMPLE, { scopeId: 'example', plugins: [BufferPlugin], @@ -149,7 +152,10 @@ describe('Plugin', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -185,14 +191,17 @@ describe('Plugin', () => { }); }); describe('toCrossJSONStream', () => { - it('supports Plugin', async () => new Promise((done) => { + it('supports Plugin', async () => new Promise((resolve, reject) => { toCrossJSONStream(EXAMPLE, { plugins: [BufferPlugin], onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/reference.test.ts b/packages/seroval/test/reference.test.ts index 30a1dc8a..186d6179 100644 --- a/packages/seroval/test/reference.test.ts +++ b/packages/seroval/test/reference.test.ts @@ -76,25 +76,31 @@ describe('Reference', () => { }); }); describe('crossSerializeStream', () => { - it('supports Reference', async () => new Promise((done) => { + it('supports Reference', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Reference', async () => new Promise((done) => { + it('supports Reference', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -121,13 +127,16 @@ describe('Reference', () => { }); }); describe('toCrossJSONStream', () => { - it('supports Reference', async () => new Promise((done) => { + it('supports Reference', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/regexp.test.ts b/packages/seroval/test/regexp.test.ts index d63cac6e..d343bd51 100644 --- a/packages/seroval/test/regexp.test.ts +++ b/packages/seroval/test/regexp.test.ts @@ -79,25 +79,31 @@ describe('RegExp', () => { }); }); describe('crossSerializeStream', () => { - it('supports RegExp', async () => new Promise((done) => { + it('supports RegExp', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports RegExp', async () => new Promise((done) => { + it('supports RegExp', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -126,13 +132,16 @@ describe('RegExp', () => { }); }); describe('toCrossJSONStream', () => { - it('supports RegExp', async () => new Promise((done) => { + it('supports RegExp', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/sealed-object.test.ts b/packages/seroval/test/sealed-object.test.ts index d29d11ab..659be7c4 100644 --- a/packages/seroval/test/sealed-object.test.ts +++ b/packages/seroval/test/sealed-object.test.ts @@ -238,88 +238,112 @@ describe('sealed object', () => { }); }); describe('crossSerializeStream', () => { - it('supports Objects', async () => new Promise((done) => { + it('supports Objects', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_RECURSIVE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.iterator', async () => new Promise((done) => { + it('supports Symbol.iterator', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(ITERABLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.asyncIterator', async () => new Promise((done) => { + it('supports Symbol.asyncIterator', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_ITERABLE, { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Objects', async () => new Promise((done) => { + it('supports Objects', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_RECURSIVE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.iterator', async () => new Promise((done) => { + it('supports Symbol.iterator', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(ITERABLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.asyncIterator', async () => new Promise((done) => { + it('supports Symbol.asyncIterator', async () => new Promise((resolve, reject) => { crossSerializeStream(ASYNC_ITERABLE, { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -400,43 +424,55 @@ describe('sealed object', () => { }); }); describe('toCrossJSONStream', () => { - it('supports Objects', async () => new Promise((done) => { + it('supports Objects', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { toCrossJSONStream(ASYNC_RECURSIVE, { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.iterator', async () => new Promise((done) => { + it('supports Symbol.iterator', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(ITERABLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.asyncIterator', async () => new Promise((done) => { + it('supports Symbol.asyncIterator', async () => new Promise((resolve, reject) => { toCrossJSONStream(ASYNC_ITERABLE, { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/set.test.ts b/packages/seroval/test/set.test.ts index 97cdd863..9cc7dd1b 100644 --- a/packages/seroval/test/set.test.ts +++ b/packages/seroval/test/set.test.ts @@ -143,17 +143,20 @@ describe('Set', () => { }); }); describe('crossSerializeStream', () => { - it('supports Set', async () => new Promise((done) => { + it('supports Set', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { const example: Set> = new Set(); example.add(Promise.resolve(example)); crossSerializeStream(example, { @@ -161,23 +164,29 @@ describe('Set', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Set', async () => new Promise((done) => { + it('supports Set', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports self-recursion', async () => new Promise((done) => { + it('supports self-recursion', async () => new Promise((resolve, reject) => { const example: Set> = new Set(); example.add(Promise.resolve(example)); crossSerializeStream(example, { @@ -186,7 +195,10 @@ describe('Set', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/sparse-array.test.ts b/packages/seroval/test/sparse-array.test.ts index a6be01b7..02d9b889 100644 --- a/packages/seroval/test/sparse-array.test.ts +++ b/packages/seroval/test/sparse-array.test.ts @@ -83,25 +83,31 @@ describe('sparse arrays', () => { }); }); describe('crossSerializeStream', () => { - it('supports sparse arrays', async () => new Promise((done) => { + it('supports sparse arrays', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports sparse arrays', async () => new Promise((done) => { + it('supports sparse arrays', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -132,13 +138,16 @@ describe('sparse arrays', () => { }); }); describe('toCrossJSONStream', () => { - it('supports sparse arrays', async () => new Promise((done) => { + it('supports sparse arrays', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/string.test.ts b/packages/seroval/test/string.test.ts index a4fadc68..d581928d 100644 --- a/packages/seroval/test/string.test.ts +++ b/packages/seroval/test/string.test.ts @@ -64,23 +64,29 @@ describe('string', () => { }); }); describe('crossSerializeStream', () => { - it('supports strings', async () => new Promise((done) => { + it('supports strings', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(QUOTED), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports sanitized strings', async () => new Promise((done) => { + it('supports sanitized strings', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(HTML), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -108,23 +114,29 @@ describe('string', () => { }); }); describe('toCrossJSONStream', () => { - it('supports strings', async () => new Promise((done) => { + it('supports strings', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(QUOTED), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports sanitized strings', async () => new Promise((done) => { + it('supports sanitized strings', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(HTML), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/typed-array.test.ts b/packages/seroval/test/typed-array.test.ts index 4020e2bd..5d3cd302 100644 --- a/packages/seroval/test/typed-array.test.ts +++ b/packages/seroval/test/typed-array.test.ts @@ -96,25 +96,31 @@ describe('typed arrays', () => { }); }); describe('crossSerializeStream', () => { - it('supports typed arrays', async () => new Promise((done) => { + it('supports typed arrays', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports typed arrays', async () => new Promise((done) => { + it('supports typed arrays', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -149,13 +155,16 @@ describe('typed arrays', () => { }); }); describe('toCrossJSONStream', () => { - it('supports typed arrays', async () => new Promise((done) => { + it('supports typed arrays', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/web-api/custom-event.test.ts b/packages/seroval/test/web-api/custom-event.test.ts index fbd47160..d7a8f3af 100644 --- a/packages/seroval/test/web-api/custom-event.test.ts +++ b/packages/seroval/test/web-api/custom-event.test.ts @@ -80,25 +80,31 @@ describe('CustomEvent', () => { }); }); describe('crossSerializeStream', () => { - it('supports CustomEvent', async () => new Promise((done) => { + it('supports CustomEvent', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports CustomEvent', async () => new Promise((done) => { + it('supports CustomEvent', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -126,13 +132,16 @@ describe('CustomEvent', () => { }); }); describe('toCrossJSONStream', () => { - it('supports CustomEvent', async () => new Promise((done) => { + it('supports CustomEvent', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/web-api/dom-exception.test.ts b/packages/seroval/test/web-api/dom-exception.test.ts index bc3ee8db..d19ac921 100644 --- a/packages/seroval/test/web-api/dom-exception.test.ts +++ b/packages/seroval/test/web-api/dom-exception.test.ts @@ -85,25 +85,31 @@ describe('DOMException', () => { }); }); describe('crossSerializeStream', () => { - it('supports DOMException', async () => new Promise((done) => { + it('supports DOMException', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports DOMException', async () => new Promise((done) => { + it('supports DOMException', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -131,13 +137,16 @@ describe('DOMException', () => { }); }); describe('toCrossJSONStream', () => { - it('supports DOMException', async () => new Promise((done) => { + it('supports DOMException', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/web-api/event.test.ts b/packages/seroval/test/web-api/event.test.ts index 66c7eb27..e2144a57 100644 --- a/packages/seroval/test/web-api/event.test.ts +++ b/packages/seroval/test/web-api/event.test.ts @@ -76,25 +76,31 @@ describe('Event', () => { }); }); describe('crossSerializeStream', () => { - it('supports Event', async () => new Promise((done) => { + it('supports Event', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Event', async () => new Promise((done) => { + it('supports Event', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -122,13 +128,16 @@ describe('Event', () => { }); }); describe('toCrossJSONStream', () => { - it('supports Event', async () => new Promise((done) => { + it('supports Event', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/web-api/form-data.test.ts b/packages/seroval/test/web-api/form-data.test.ts index 6408736a..0db31c1f 100644 --- a/packages/seroval/test/web-api/form-data.test.ts +++ b/packages/seroval/test/web-api/form-data.test.ts @@ -87,25 +87,31 @@ describe('FormData', () => { }); }); describe('crossSerializeStream', () => { - it('supports FormData', async () => new Promise((done) => { + it('supports FormData', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(SYNC_EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports FormData', async () => new Promise((done) => { + it('supports FormData', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(SYNC_EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -132,13 +138,16 @@ describe('FormData', () => { }); }); describe('toCrossJSONStream', () => { - it('supports FormData', async () => new Promise((done) => { + it('supports FormData', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(SYNC_EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/web-api/headers.test.ts b/packages/seroval/test/web-api/headers.test.ts index 71812948..3c4939f5 100644 --- a/packages/seroval/test/web-api/headers.test.ts +++ b/packages/seroval/test/web-api/headers.test.ts @@ -82,25 +82,31 @@ describe('Headers', () => { }); }); describe('crossSerializeStream', () => { - it('supports Headers', async () => new Promise((done) => { + it('supports Headers', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Headers', async () => new Promise((done) => { + it('supports Headers', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -128,13 +134,16 @@ describe('Headers', () => { }); }); describe('toCrossJSONStream', () => { - it('supports Headers', async () => new Promise((done) => { + it('supports Headers', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/web-api/readable-stream.test.ts b/packages/seroval/test/web-api/readable-stream.test.ts index 2deb6cd7..e0d6eac8 100644 --- a/packages/seroval/test/web-api/readable-stream.test.ts +++ b/packages/seroval/test/web-api/readable-stream.test.ts @@ -5,7 +5,7 @@ import { describe('ReadableStream', () => { describe('crossSerializeStream', () => { - it('supports ReadableStream', async () => new Promise((done) => { + it('supports ReadableStream', async () => new Promise((resolve, reject) => { const example = new ReadableStream({ start(controller): void { controller.enqueue('foo'); @@ -19,11 +19,14 @@ describe('ReadableStream', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports ReadableStream errors', async () => new Promise((done) => { + it('supports ReadableStream errors', async () => new Promise((resolve, reject) => { const example = new ReadableStream({ start(controller): void { const error = new Error('Oops!'); @@ -36,12 +39,15 @@ describe('ReadableStream', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports ReadableStream', async () => new Promise((done) => { + it('supports ReadableStream', async () => new Promise((resolve, reject) => { const example = new ReadableStream({ start(controller): void { controller.enqueue('foo'); @@ -56,11 +62,14 @@ describe('ReadableStream', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports ReadableStream errors', async () => new Promise((done) => { + it('supports ReadableStream errors', async () => new Promise((resolve, reject) => { const example = new ReadableStream({ start(controller): void { const error = new Error('Oops!'); @@ -74,14 +83,17 @@ describe('ReadableStream', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); }); }); describe('toCrossJSONStream', () => { - it('supports ReadableStream', async () => new Promise((done) => { + it('supports ReadableStream', async () => new Promise((resolve, reject) => { const example = new ReadableStream({ start(controller): void { controller.enqueue('foo'); @@ -95,11 +107,14 @@ describe('ReadableStream', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports ReadableStream errors', async () => new Promise((done) => { + it('supports ReadableStream errors', async () => new Promise((resolve, reject) => { const example = new ReadableStream({ start(controller): void { const error = new Error('Oops!'); @@ -112,7 +127,10 @@ describe('ReadableStream', () => { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/web-api/request.test.ts b/packages/seroval/test/web-api/request.test.ts index 5b2f70bf..9e4ce824 100644 --- a/packages/seroval/test/web-api/request.test.ts +++ b/packages/seroval/test/web-api/request.test.ts @@ -66,7 +66,7 @@ describe('Request', () => { }); }); describe('crossSerializeStream', () => { - it('supports Request', async () => new Promise((done) => { + it('supports Request', async () => new Promise((resolve, reject) => { const example = new Request(EXAMPLE_URL, { method: 'POST', body: EXAMPLE_BODY, @@ -76,12 +76,15 @@ describe('Request', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Request', async () => new Promise((done) => { + it('supports Request', async () => new Promise((resolve, reject) => { const example = new Request(EXAMPLE_URL, { method: 'POST', body: EXAMPLE_BODY, @@ -92,7 +95,10 @@ describe('Request', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -116,7 +122,7 @@ describe('Request', () => { }); }); describe('toCrossJSONStream', () => { - it('supports Request', async () => new Promise((done) => { + it('supports Request', async () => new Promise((resolve, reject) => { const example = new Request(EXAMPLE_URL, { method: 'POST', body: EXAMPLE_BODY, @@ -126,7 +132,10 @@ describe('Request', () => { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/web-api/response.test.ts b/packages/seroval/test/web-api/response.test.ts index 65e5c655..0cdcc7f4 100644 --- a/packages/seroval/test/web-api/response.test.ts +++ b/packages/seroval/test/web-api/response.test.ts @@ -50,19 +50,22 @@ describe('Response', () => { }); describe('crossSerializeStream', () => { - it('supports Response', async () => new Promise((done) => { + it('supports Response', async () => new Promise((resolve, reject) => { const example = new Response(EXAMPLE_BODY); crossSerializeStream(example, { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Response', async () => new Promise((done) => { + it('supports Response', async () => new Promise((resolve, reject) => { const example = new Response(EXAMPLE_BODY); crossSerializeStream(example, { scopeId: 'example', @@ -70,7 +73,10 @@ describe('Response', () => { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -89,14 +95,17 @@ describe('Response', () => { }); }); describe('toCrossJSONStream', () => { - it('supports Response', async () => new Promise((done) => { + it('supports Response', async () => new Promise((resolve, reject) => { const example = new Response(EXAMPLE_BODY); toCrossJSONStream(example, { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/web-api/url-search-params.test.ts b/packages/seroval/test/web-api/url-search-params.test.ts index 190538df..c08de257 100644 --- a/packages/seroval/test/web-api/url-search-params.test.ts +++ b/packages/seroval/test/web-api/url-search-params.test.ts @@ -79,25 +79,31 @@ describe('URLSearchParams', () => { }); }); describe('crossSerializeStream', () => { - it('supports URLSearchParams', async () => new Promise((done) => { + it('supports URLSearchParams', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports URLSearchParams', async () => new Promise((done) => { + it('supports URLSearchParams', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -126,13 +132,16 @@ describe('URLSearchParams', () => { }); }); describe('toCrossJSONStream', () => { - it('supports URLSearchParams', async () => new Promise((done) => { + it('supports URLSearchParams', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/web-api/url.test.ts b/packages/seroval/test/web-api/url.test.ts index 3ea8aa36..bcf70c16 100644 --- a/packages/seroval/test/web-api/url.test.ts +++ b/packages/seroval/test/web-api/url.test.ts @@ -79,25 +79,31 @@ describe('URL', () => { }); }); describe('crossSerializeStream', () => { - it('supports URL', async () => new Promise((done) => { + it('supports URL', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports URL', async () => new Promise((done) => { + it('supports URL', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(EXAMPLE), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -126,13 +132,16 @@ describe('URL', () => { }); }); describe('toCrossJSONStream', () => { - it('supports URL', async () => new Promise((done) => { + it('supports URL', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(EXAMPLE), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); diff --git a/packages/seroval/test/wk-symbols.test.ts b/packages/seroval/test/wk-symbols.test.ts index 097ea2a1..238f662f 100644 --- a/packages/seroval/test/wk-symbols.test.ts +++ b/packages/seroval/test/wk-symbols.test.ts @@ -180,277 +180,355 @@ describe('well-known symbols', () => { }); }); describe('crossSerializeStream', () => { - it('supports Symbol.asyncIterator', async () => new Promise((done) => { + it('supports Symbol.asyncIterator', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.asyncIterator), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.hasInstance', async () => new Promise((done) => { + it('supports Symbol.hasInstance', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.hasInstance), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.isConcatSpreadable', async () => new Promise((done) => { + it('supports Symbol.isConcatSpreadable', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.isConcatSpreadable), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.iterator', async () => new Promise((done) => { + it('supports Symbol.iterator', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.iterator), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.match', async () => new Promise((done) => { + it('supports Symbol.match', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.match), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.matchAll', async () => new Promise((done) => { + it('supports Symbol.matchAll', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.matchAll), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.replace', async () => new Promise((done) => { + it('supports Symbol.replace', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.replace), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.search', async () => new Promise((done) => { + it('supports Symbol.search', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.search), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.species', async () => new Promise((done) => { + it('supports Symbol.species', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.species), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.split', async () => new Promise((done) => { + it('supports Symbol.split', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.split), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.toPrimitive', async () => new Promise((done) => { + it('supports Symbol.toPrimitive', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.toPrimitive), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.toStringTag', async () => new Promise((done) => { + it('supports Symbol.toStringTag', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.toStringTag), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.unscopables', async () => new Promise((done) => { + it('supports Symbol.unscopables', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.unscopables), { onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); describe('scoped', () => { - it('supports Symbol.asyncIterator', async () => new Promise((done) => { + it('supports Symbol.asyncIterator', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.asyncIterator), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.hasInstance', async () => new Promise((done) => { + it('supports Symbol.hasInstance', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.hasInstance), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.isConcatSpreadable', async () => new Promise((done) => { + it('supports Symbol.isConcatSpreadable', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.isConcatSpreadable), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.iterator', async () => new Promise((done) => { + it('supports Symbol.iterator', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.iterator), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.match', async () => new Promise((done) => { + it('supports Symbol.match', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.match), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.matchAll', async () => new Promise((done) => { + it('supports Symbol.matchAll', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.matchAll), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.replace', async () => new Promise((done) => { + it('supports Symbol.replace', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.replace), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.search', async () => new Promise((done) => { + it('supports Symbol.search', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.search), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.species', async () => new Promise((done) => { + it('supports Symbol.species', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.species), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.split', async () => new Promise((done) => { + it('supports Symbol.split', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.split), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.toPrimitive', async () => new Promise((done) => { + it('supports Symbol.toPrimitive', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.toPrimitive), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.toStringTag', async () => new Promise((done) => { + it('supports Symbol.toStringTag', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.toStringTag), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.unscopables', async () => new Promise((done) => { + it('supports Symbol.unscopables', async () => new Promise((resolve, reject) => { crossSerializeStream(Promise.resolve(Symbol.unscopables), { scopeId: 'example', onSerialize(data) { expect(data).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); @@ -517,133 +595,172 @@ describe('well-known symbols', () => { }); }); describe('toCrossJSONStream', () => { - it('supports Symbol.asyncIterator', async () => new Promise((done) => { + it('supports Symbol.asyncIterator', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Symbol.asyncIterator), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.hasInstance', async () => new Promise((done) => { + it('supports Symbol.hasInstance', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Symbol.hasInstance), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.isConcatSpreadable', async () => new Promise((done) => { + it('supports Symbol.isConcatSpreadable', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Symbol.isConcatSpreadable), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.iterator', async () => new Promise((done) => { + it('supports Symbol.iterator', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Symbol.iterator), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.match', async () => new Promise((done) => { + it('supports Symbol.match', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Symbol.match), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.matchAll', async () => new Promise((done) => { + it('supports Symbol.matchAll', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Symbol.matchAll), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.replace', async () => new Promise((done) => { + it('supports Symbol.replace', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Symbol.replace), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.search', async () => new Promise((done) => { + it('supports Symbol.search', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Symbol.search), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.species', async () => new Promise((done) => { + it('supports Symbol.species', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Symbol.species), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.split', async () => new Promise((done) => { + it('supports Symbol.split', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Symbol.split), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.toPrimitive', async () => new Promise((done) => { + it('supports Symbol.toPrimitive', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Symbol.toPrimitive), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.toStringTag', async () => new Promise((done) => { + it('supports Symbol.toStringTag', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Symbol.toStringTag), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); - it('supports Symbol.unscopables', async () => new Promise((done) => { + it('supports Symbol.unscopables', async () => new Promise((resolve, reject) => { toCrossJSONStream(Promise.resolve(Symbol.unscopables), { onParse(data) { expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { - done(); + resolve(); + }, + onError(error) { + reject(error); }, }); })); From 0828d65c14f02d21e9e3e29ca94f1b2b48fd3675 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Fri, 17 Nov 2023 15:22:54 +0800 Subject: [PATCH 71/82] Rename special references --- packages/seroval/iterator.js | 15 ++++ packages/seroval/src/core/constants.ts | 4 +- .../seroval/src/core/context/deserializer.ts | 4 +- packages/seroval/src/core/context/parser.ts | 28 ++++--- .../seroval/src/core/context/serializer.ts | 82 ++++++++----------- .../seroval/src/core/special-reference.ts | 4 +- packages/seroval/src/core/types.ts | 12 +-- 7 files changed, 76 insertions(+), 73 deletions(-) create mode 100644 packages/seroval/iterator.js diff --git a/packages/seroval/iterator.js b/packages/seroval/iterator.js new file mode 100644 index 00000000..8c4b8ff2 --- /dev/null +++ b/packages/seroval/iterator.js @@ -0,0 +1,15 @@ +function* test() { + +} + +function inheritance(value) { + const p = Object.getPrototypeOf(value); + if (p) { + console.log(p); + console.log(Object.getOwnPropertyDescriptors(p)); + inheritance(p); + } +} + +inheritance(test()); +inheritance(new ReadableStream()); \ No newline at end of file diff --git a/packages/seroval/src/core/constants.ts b/packages/seroval/src/core/constants.ts index d0700c0a..927f8278 100644 --- a/packages/seroval/src/core/constants.ts +++ b/packages/seroval/src/core/constants.ts @@ -52,8 +52,8 @@ export const enum SerovalNodeType { DOMException = 39, Plugin = 40, MapSentinel = 41, - Iterator = 42, - AsyncIterator = 43, + IteratorFactory = 42, + AsyncIteratorFactory = 43, } export const enum SerovalObjectFlags { diff --git a/packages/seroval/src/core/context/deserializer.ts b/packages/seroval/src/core/context/deserializer.ts index 782a0392..c433c9e5 100644 --- a/packages/seroval/src/core/context/deserializer.ts +++ b/packages/seroval/src/core/context/deserializer.ts @@ -594,8 +594,8 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt case SerovalNodeType.ReadableStreamClose: return this.deserializeReadableStreamClose(node); case SerovalNodeType.MapSentinel: - case SerovalNodeType.Iterator: - case SerovalNodeType.AsyncIterator: + case SerovalNodeType.IteratorFactory: + case SerovalNodeType.AsyncIteratorFactory: default: throw new Error('invariant'); } diff --git a/packages/seroval/src/core/context/parser.ts b/packages/seroval/src/core/context/parser.ts index fcbe1a68..908ec1da 100644 --- a/packages/seroval/src/core/context/parser.ts +++ b/packages/seroval/src/core/context/parser.ts @@ -139,7 +139,7 @@ export abstract class BaseParserContext implements PluginAccessOptions { }; } - protected parseIterator(): SerovalIndexedValueNode | SerovalIteratorNode { + protected parseIteratorFactory(): SerovalIndexedValueNode | SerovalIteratorNode { const registeredID = this.refs.get(ITERATOR); if (registeredID != null) { this.markRef(registeredID); @@ -148,7 +148,7 @@ export abstract class BaseParserContext implements PluginAccessOptions { const id = this.refs.size; this.refs.set(ITERATOR, id); return { - t: SerovalNodeType.Iterator, + t: SerovalNodeType.IteratorFactory, i: id, s: undefined, l: undefined, @@ -163,12 +163,14 @@ export abstract class BaseParserContext implements PluginAccessOptions { x: { [SpecialReference.Sentinel]: undefined, [SpecialReference.SymbolIterator]: this.parseWKSymbol(Symbol.iterator), - [SpecialReference.Iterator]: undefined, + [SpecialReference.IteratorFactory]: undefined, + [SpecialReference.SymbolAsyncIterator]: undefined, + [SpecialReference.AsyncIteratorFactory]: undefined, }, }; } - protected parseAsyncIterator(): SerovalIndexedValueNode | SerovalAsyncIteratorNode { + protected parseAsyncIteratorFactory(): SerovalIndexedValueNode | SerovalAsyncIteratorNode { const registeredID = this.refs.get(ASYNC_ITERATOR); if (registeredID != null) { this.markRef(registeredID); @@ -177,7 +179,7 @@ export abstract class BaseParserContext implements PluginAccessOptions { const id = this.refs.size; this.refs.set(ASYNC_ITERATOR, id); return { - t: SerovalNodeType.AsyncIterator, + t: SerovalNodeType.AsyncIteratorFactory, i: id, s: undefined, l: undefined, @@ -192,9 +194,9 @@ export abstract class BaseParserContext implements PluginAccessOptions { x: { [SpecialReference.Sentinel]: undefined, [SpecialReference.SymbolIterator]: undefined, - [SpecialReference.Iterator]: undefined, + [SpecialReference.IteratorFactory]: undefined, [SpecialReference.SymbolAsyncIterator]: this.parseWKSymbol(Symbol.asyncIterator), - [SpecialReference.AsyncIterator]: undefined, + [SpecialReference.AsyncIteratorFactory]: undefined, }, }; } @@ -225,9 +227,9 @@ export abstract class BaseParserContext implements PluginAccessOptions { ? this.parseWKSymbol(Symbol.iterator) : undefined ), - [SpecialReference.Iterator]: ( + [SpecialReference.IteratorFactory]: ( this.features & Feature.Symbol && Symbol.iterator in current - ? this.parseIterator() + ? this.parseIteratorFactory() : undefined ), [SpecialReference.SymbolAsyncIterator]: ( @@ -235,9 +237,9 @@ export abstract class BaseParserContext implements PluginAccessOptions { ? this.parseWKSymbol(Symbol.asyncIterator) : undefined ), - [SpecialReference.AsyncIterator]: ( + [SpecialReference.AsyncIteratorFactory]: ( this.features & Feature.Symbol && Symbol.asyncIterator in current - ? this.parseAsyncIterator() + ? this.parseAsyncIteratorFactory() : undefined ), }, @@ -266,9 +268,9 @@ export abstract class BaseParserContext implements PluginAccessOptions { x: { [SpecialReference.Sentinel]: this.parseMapSentinel(), [SpecialReference.SymbolIterator]: undefined, - [SpecialReference.Iterator]: undefined, + [SpecialReference.IteratorFactory]: undefined, [SpecialReference.SymbolAsyncIterator]: undefined, - [SpecialReference.AsyncIterator]: undefined, + [SpecialReference.AsyncIteratorFactory]: undefined, }, }; } diff --git a/packages/seroval/src/core/context/serializer.ts b/packages/seroval/src/core/context/serializer.ts index 655f499a..853634a5 100644 --- a/packages/seroval/src/core/context/serializer.ts +++ b/packages/seroval/src/core/context/serializer.ts @@ -393,46 +393,6 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio return this.assignIndexedValue(node.i, REFERENCES_KEY + '.get("' + node.s + '")'); } - protected serializeIterable( - source: SerovalNodeWithProperties, - node: SerovalNode, - ): string { - if ( - source.x - && source.x[SpecialReference.SymbolIterator] - && source.x[SpecialReference.Iterator] - ) { - const key = '[' + this.serialize(source.x[SpecialReference.SymbolIterator]) + ']:'; - const parent = this.stack; - this.stack = []; - const serialized = this.serialize(node); - this.stack = parent; - const constructor = this.serialize(source.x[SpecialReference.Iterator]); - return key + '(' + constructor + ')(' + serialized + ')'; - } - return ''; - } - - protected serializeAsyncIterable( - source: SerovalNodeWithProperties, - node: SerovalNode, - ): string { - if ( - source.x - && source.x[SpecialReference.SymbolAsyncIterator] - && source.x[SpecialReference.AsyncIterator] - ) { - const key = '[' + this.serialize(source.x[SpecialReference.SymbolAsyncIterator]) + ']:'; - const parent = this.stack; - this.stack = []; - const serialized = this.serialize(node); - this.stack = parent; - const constructor = this.serialize(source.x[SpecialReference.AsyncIterator]); - return key + '(' + constructor + ')(' + serialized + ')'; - } - return ''; - } - protected serializeArrayItem( id: number, item: SerovalNode | undefined, @@ -486,9 +446,35 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio // E.g. Symbol.asyncIterator switch (key) { case SerovalObjectRecordSpecialKey.SymbolIterator: - return this.serializeIterable(source, val); + if ( + source.x + && source.x[SpecialReference.SymbolIterator] + && source.x[SpecialReference.IteratorFactory] + ) { + const serialKey = '[' + this.serialize(source.x[SpecialReference.SymbolIterator]) + ']:'; + const parent = this.stack; + this.stack = []; + const serialized = this.serialize(val); + this.stack = parent; + const constructor = this.serialize(source.x[SpecialReference.IteratorFactory]); + return serialKey + '(' + constructor + ')(' + serialized + ')'; + } + return ''; case SerovalObjectRecordSpecialKey.SymbolAsyncIterator: - return this.serializeAsyncIterable(source, val); + if ( + source.x + && source.x[SpecialReference.SymbolAsyncIterator] + && source.x[SpecialReference.AsyncIteratorFactory] + ) { + const serialKey = '[' + this.serialize(source.x[SpecialReference.SymbolAsyncIterator]) + ']:'; + const parent = this.stack; + this.stack = []; + const serialized = this.serialize(val); + this.stack = parent; + const constructor = this.serialize(source.x[SpecialReference.AsyncIteratorFactory]); + return serialKey + '(' + constructor + ')(' + serialized + ')'; + } + return ''; default: { const check = Number(key); // Test if key is a valid number or JS identifier @@ -559,7 +545,7 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio case SerovalObjectRecordSpecialKey.SymbolIterator: if ( source.x - && source.x[SpecialReference.Iterator] + && source.x[SpecialReference.IteratorFactory] && source.x[SpecialReference.SymbolIterator] ) { const parent = this.stack; @@ -571,7 +557,7 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio this.createArrayAssign( source.i, this.serialize(source.x[SpecialReference.SymbolIterator]), - '(' + this.serialize(source.x[SpecialReference.Iterator]) + ')(' + serialized + ')', + '(' + this.serialize(source.x[SpecialReference.IteratorFactory]) + ')(' + serialized + ')', ); this.assignments = parentAssignment; } @@ -579,7 +565,7 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio case SerovalObjectRecordSpecialKey.SymbolAsyncIterator: if ( source.x - && source.x[SpecialReference.AsyncIterator] + && source.x[SpecialReference.AsyncIteratorFactory] && source.x[SpecialReference.SymbolAsyncIterator] ) { const parent = this.stack; @@ -591,7 +577,7 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio this.createArrayAssign( source.i, this.serialize(source.x[SpecialReference.SymbolAsyncIterator]), - '(' + this.serialize(source.x[SpecialReference.AsyncIterator]) + ')(' + serialized + ')', + '(' + this.serialize(source.x[SpecialReference.AsyncIteratorFactory]) + ')(' + serialized + ')', ); this.assignments = parentAssignment; } @@ -1199,9 +1185,9 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio return this.serializePlugin(node); case SerovalNodeType.MapSentinel: return this.serializeMapSentinel(node); - case SerovalNodeType.Iterator: + case SerovalNodeType.IteratorFactory: return this.serializeIterator(node); - case SerovalNodeType.AsyncIterator: + case SerovalNodeType.AsyncIteratorFactory: return this.serializeAsyncIterator(node); default: throw new Error('invariant'); diff --git a/packages/seroval/src/core/special-reference.ts b/packages/seroval/src/core/special-reference.ts index 6df8616e..b70ae2ba 100644 --- a/packages/seroval/src/core/special-reference.ts +++ b/packages/seroval/src/core/special-reference.ts @@ -7,7 +7,7 @@ export const ASYNC_ITERATOR = {}; export const enum SpecialReference { Sentinel = 0, SymbolIterator = 1, - Iterator = 2, + IteratorFactory = 2, SymbolAsyncIterator = 3, - AsyncIterator = 4, + AsyncIteratorFactory = 4, } diff --git a/packages/seroval/src/core/types.ts b/packages/seroval/src/core/types.ts index 0fe089c7..31a7ced2 100644 --- a/packages/seroval/src/core/types.ts +++ b/packages/seroval/src/core/types.ts @@ -193,9 +193,9 @@ export interface SerovalArrayNode extends SerovalBaseNode { export interface SerovalObjectX extends SerovalX { [SpecialReference.SymbolIterator]: SerovalNodeWithID | undefined; - [SpecialReference.Iterator]: SerovalNodeWithID | undefined; + [SpecialReference.IteratorFactory]: SerovalNodeWithID | undefined; [SpecialReference.SymbolAsyncIterator]: SerovalNodeWithID | undefined; - [SpecialReference.Iterator]: SerovalNodeWithID | undefined; + [SpecialReference.AsyncIteratorFactory]: SerovalNodeWithID | undefined; } export interface SerovalObjectNode extends SerovalBaseNode { @@ -209,9 +209,9 @@ export interface SerovalObjectNode extends SerovalBaseNode { export interface SerovalNullConstructorX extends SerovalX { [SpecialReference.SymbolIterator]: SerovalNodeWithID | undefined; - [SpecialReference.Iterator]: SerovalNodeWithID | undefined; + [SpecialReference.IteratorFactory]: SerovalNodeWithID | undefined; [SpecialReference.SymbolAsyncIterator]: SerovalNodeWithID | undefined; - [SpecialReference.Iterator]: SerovalNodeWithID | undefined; + [SpecialReference.IteratorFactory]: SerovalNodeWithID | undefined; } export interface SerovalNullConstructorNode extends SerovalBaseNode { @@ -431,7 +431,7 @@ export interface SerovalIteratorX extends SerovalX { } export interface SerovalIteratorNode extends SerovalBaseNode { - t: SerovalNodeType.Iterator; + t: SerovalNodeType.IteratorFactory; i: number; x: SerovalIteratorX; } @@ -441,7 +441,7 @@ export interface SerovalAsyncIteratorX extends SerovalX { } export interface SerovalAsyncIteratorNode extends SerovalBaseNode { - t: SerovalNodeType.AsyncIterator; + t: SerovalNodeType.AsyncIteratorFactory; i: number; x: SerovalAsyncIteratorX; } From 0ae7e6fed1ecab0d0654550b645ff2ff44e99342 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Sat, 18 Nov 2023 02:03:20 +0800 Subject: [PATCH 72/82] Rework special references again --- packages/seroval/src/core/base-primitives.ts | 66 ++++-- packages/seroval/src/core/constants.ts | 6 +- .../seroval/src/core/context/deserializer.ts | 57 ++--- packages/seroval/src/core/context/parser.ts | 109 +++++----- .../seroval/src/core/context/parser/async.ts | 49 +++-- .../seroval/src/core/context/parser/stream.ts | 52 +++-- .../seroval/src/core/context/parser/sync.ts | 17 +- .../seroval/src/core/context/serializer.ts | 200 +++++++----------- packages/seroval/src/core/cross/serializer.ts | 7 +- packages/seroval/src/core/literals.ts | 1 - .../seroval/src/core/special-reference.ts | 3 + packages/seroval/src/core/types.ts | 86 ++++---- .../src/core/utils/iterator-to-sequence.ts | 33 +++ packages/seroval/src/core/web-api.ts | 5 - .../__snapshots__/async-iterable.test.ts.snap | 46 ++-- .../__snapshots__/frozen-object.test.ts.snap | 86 ++++---- .../test/__snapshots__/iterable.test.ts.snap | 24 +-- .../test/__snapshots__/map.test.ts.snap | 22 +- .../__snapshots__/mutual-cycle.test.ts.snap | 20 +- .../null-constructor.test.ts.snap | 88 ++++---- .../test/__snapshots__/object.test.ts.snap | 88 ++++---- .../__snapshots__/sealed-object.test.ts.snap | 86 ++++---- .../test/__snapshots__/set.test.ts.snap | 2 +- .../__snapshots__/custom-event.test.ts.snap | 10 +- .../web-api/__snapshots__/event.test.ts.snap | 10 +- .../readable-stream.test.ts.snap | 140 +----------- .../__snapshots__/request.test.ts.snap | 6 +- .../__snapshots__/response.test.ts.snap | 6 +- .../test/web-api/readable-stream.test.ts | 2 +- 29 files changed, 627 insertions(+), 700 deletions(-) diff --git a/packages/seroval/src/core/base-primitives.ts b/packages/seroval/src/core/base-primitives.ts index 61f5dfdd..8e63c2a7 100644 --- a/packages/seroval/src/core/base-primitives.ts +++ b/packages/seroval/src/core/base-primitives.ts @@ -15,6 +15,7 @@ import type { SerovalAggregateErrorNode, SerovalArrayBufferNode, SerovalArrayNode, + SerovalAsyncIteratorFactoryInstanceNode, SerovalBigIntNode, SerovalBigIntTypedArrayNode, SerovalBoxedNode, @@ -23,6 +24,7 @@ import type { SerovalDateNode, SerovalErrorNode, SerovalIndexedValueNode, + SerovalIteratorFactoryInstanceNode, SerovalNode, SerovalNumberNode, SerovalObjectRecordNode, @@ -63,7 +65,6 @@ export function createNumberNode(value: number): SerovalConstantNode | SerovalNu f: undefined, b: undefined, o: undefined, - x: undefined, }; } } @@ -82,7 +83,6 @@ export function createStringNode(value: string): SerovalStringNode { f: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -102,7 +102,6 @@ export function createBigIntNode( f: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -120,7 +119,6 @@ export function createIndexedValueNode(id: number): SerovalIndexedValueNode { f: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -138,7 +136,6 @@ export function createDateNode(id: number, current: Date): SerovalDateNode { a: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -156,7 +153,6 @@ export function createRegExpNode(id: number, current: RegExp): SerovalRegExpNode f: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -183,7 +179,6 @@ export function createArrayBufferNode( f: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -205,7 +200,6 @@ export function createWKSymbolNode( f: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -226,7 +220,6 @@ export function createReferenceNode( f: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -248,7 +241,6 @@ export function createPluginNode( f: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -270,7 +262,6 @@ export function createArrayNode( f: undefined, b: undefined, o: getObjectFlag(current), - x: undefined, }; } @@ -291,7 +282,6 @@ export function createBoxedNode( f: boxed, b: undefined, o: undefined, - x: undefined, }; } @@ -313,7 +303,6 @@ export function createTypedArrayNode( f: buffer, b: current.byteOffset, o: undefined, - x: undefined, }; } @@ -335,7 +324,6 @@ export function createBigIntTypedArrayNode( f: buffer, b: current.byteOffset, o: undefined, - x: undefined, }; } @@ -357,7 +345,6 @@ export function createDataViewNode( f: buffer, b: current.byteOffset, o: undefined, - x: undefined, }; } @@ -379,7 +366,6 @@ export function createErrorNode( f: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -401,7 +387,6 @@ export function createAggregateErrorNode( f: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -423,6 +408,51 @@ export function createSetNode( f: undefined, b: undefined, o: undefined, - x: undefined, + }; +} + +export function createIteratorFactoryInstanceNode( + factory: SerovalNode, + items: SerovalNode, +): SerovalIteratorFactoryInstanceNode { + return { + t: SerovalNodeType.IteratorFactoryInstance, + i: undefined, + s: undefined, + l: undefined, + c: undefined, + m: undefined, + p: undefined, + e: undefined, + a: [ + factory, + items, + ], + f: undefined, + b: undefined, + o: undefined, + }; +} + +export function createAsyncIteratorFactoryInstanceNode( + factory: SerovalNode, + items: SerovalNode, +): SerovalAsyncIteratorFactoryInstanceNode { + return { + t: SerovalNodeType.AsyncIteratorFactoryInstance, + i: undefined, + s: undefined, + l: undefined, + c: undefined, + m: undefined, + p: undefined, + e: undefined, + a: [ + factory, + items, + ], + f: undefined, + b: undefined, + o: undefined, }; } diff --git a/packages/seroval/src/core/constants.ts b/packages/seroval/src/core/constants.ts index 927f8278..616717f9 100644 --- a/packages/seroval/src/core/constants.ts +++ b/packages/seroval/src/core/constants.ts @@ -53,7 +53,11 @@ export const enum SerovalNodeType { Plugin = 40, MapSentinel = 41, IteratorFactory = 42, - AsyncIteratorFactory = 43, + IteratorFactoryInstance = 43, + AsyncIteratorFactory = 44, + AsyncIteratorFactoryInstance = 45, + ReadableStream = 46, + ReadableStreamFactory = 47, } export const enum SerovalObjectFlags { diff --git a/packages/seroval/src/core/context/deserializer.ts b/packages/seroval/src/core/context/deserializer.ts index c433c9e5..91e2dd52 100644 --- a/packages/seroval/src/core/context/deserializer.ts +++ b/packages/seroval/src/core/context/deserializer.ts @@ -6,6 +6,7 @@ import type { SerovalAggregateErrorNode, SerovalArrayBufferNode, SerovalArrayNode, + SerovalAsyncIteratorFactoryInstanceNode, SerovalBigIntTypedArrayNode, SerovalBlobNode, SerovalBoxedNode, @@ -18,6 +19,7 @@ import type { SerovalFileNode, SerovalFormDataNode, SerovalHeadersNode, + SerovalIteratorFactoryInstanceNode, SerovalMapNode, SerovalNode, SerovalNullConstructorNode, @@ -42,9 +44,6 @@ import type { SerovalURLNode, SerovalURLSearchParamsNode, } from '../types'; -import { - SerovalObjectRecordSpecialKey, -} from '../types'; import { CONSTANT_VAL, ERROR_CONSTRUCTOR, @@ -132,33 +131,14 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt ): Record { const len = node.s; if (len) { - let key: SerovalObjectRecordKey; - let value: unknown; const keys = node.k; const vals = node.v; - for (let i = 0; i < len; i++) { + for (let i = 0, key: SerovalObjectRecordKey; i < len; i++) { key = keys[i]; - value = this.deserialize(vals[i]); - switch (key) { - case SerovalObjectRecordSpecialKey.SymbolIterator: { - const current = value as Sequence; - result[Symbol.iterator] = sequenceToIterator(current); - } - break; - case SerovalObjectRecordSpecialKey.SymbolAsyncIterator: { - const current = value; - if ((current as object).constructor === ReadableStream) { - result[Symbol.asyncIterator] = readableStreamToAsyncIterator( - current as ReadableStream>, - ); - } else { - result[Symbol.asyncIterator] = sequenceToAsyncIterator(current as Sequence); - } - } - break; - default: - result[deserializeString(key)] = value; - break; + if (typeof key === 'string') { + result[deserializeString(key)] = this.deserialize(vals[i]); + } else { + result[this.deserialize(key) as symbol] = this.deserialize(vals[i]); } } } @@ -511,6 +491,25 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt return undefined; } + private deserializeIteratorFactoryInstance( + node: SerovalIteratorFactoryInstanceNode, + ): unknown { + const source = this.deserialize(node.a[1]); + return sequenceToIterator(source as Sequence); + } + + private deserializeAsyncIteratorFactoryInstance( + node: SerovalAsyncIteratorFactoryInstanceNode, + ): unknown { + const source = this.deserialize(node.a[1]); + if ((source as object).constructor === ReadableStream) { + return readableStreamToAsyncIterator( + source as ReadableStream>, + ); + } + return sequenceToAsyncIterator(source as Sequence); + } + deserialize(node: SerovalNode): unknown { switch (node.t) { case SerovalNodeType.Constant: @@ -593,6 +592,10 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt return this.deserializeReadableStreamError(node); case SerovalNodeType.ReadableStreamClose: return this.deserializeReadableStreamClose(node); + case SerovalNodeType.IteratorFactoryInstance: + return this.deserializeIteratorFactoryInstance(node); + case SerovalNodeType.AsyncIteratorFactoryInstance: + return this.deserializeAsyncIteratorFactoryInstance(node); case SerovalNodeType.MapSentinel: case SerovalNodeType.IteratorFactory: case SerovalNodeType.AsyncIteratorFactory: diff --git a/packages/seroval/src/core/context/parser.ts b/packages/seroval/src/core/context/parser.ts index 908ec1da..53dd3848 100644 --- a/packages/seroval/src/core/context/parser.ts +++ b/packages/seroval/src/core/context/parser.ts @@ -17,18 +17,20 @@ import { ASYNC_ITERATOR, ITERATOR, MAP_SENTINEL, - SpecialReference, + READABLE_STREAM, } from '../special-reference'; import type { - SerovalAsyncIteratorNode, + SerovalAsyncIteratorFactoryNode, SerovalIndexedValueNode, - SerovalIteratorNode, + SerovalIteratorFactoryNode, SerovalMapNode, SerovalMapSentinelNode, SerovalNode, SerovalNullConstructorNode, SerovalObjectNode, SerovalObjectRecordNode, + SerovalReadableStreamFactoryNode, + SerovalReadableStreamNode, SerovalReferenceNode, SerovalWKSymbolNode, } from '../types'; @@ -135,11 +137,10 @@ export abstract class BaseParserContext implements PluginAccessOptions { f: undefined, b: undefined, o: undefined, - x: undefined, }; } - protected parseIteratorFactory(): SerovalIndexedValueNode | SerovalIteratorNode { + protected parseIteratorFactory(): SerovalIndexedValueNode | SerovalIteratorFactoryNode { const registeredID = this.refs.get(ITERATOR); if (registeredID != null) { this.markRef(registeredID); @@ -157,20 +158,13 @@ export abstract class BaseParserContext implements PluginAccessOptions { p: undefined, e: undefined, a: undefined, - f: undefined, + f: this.parseWKSymbol(Symbol.iterator), b: undefined, o: undefined, - x: { - [SpecialReference.Sentinel]: undefined, - [SpecialReference.SymbolIterator]: this.parseWKSymbol(Symbol.iterator), - [SpecialReference.IteratorFactory]: undefined, - [SpecialReference.SymbolAsyncIterator]: undefined, - [SpecialReference.AsyncIteratorFactory]: undefined, - }, }; } - protected parseAsyncIteratorFactory(): SerovalIndexedValueNode | SerovalAsyncIteratorNode { + protected parseAsyncIteratorFactory(): SerovalIndexedValueNode | SerovalAsyncIteratorFactoryNode { const registeredID = this.refs.get(ASYNC_ITERATOR); if (registeredID != null) { this.markRef(registeredID); @@ -188,16 +182,9 @@ export abstract class BaseParserContext implements PluginAccessOptions { p: undefined, e: undefined, a: undefined, - f: undefined, + f: this.parseWKSymbol(Symbol.asyncIterator), b: undefined, o: undefined, - x: { - [SpecialReference.Sentinel]: undefined, - [SpecialReference.SymbolIterator]: undefined, - [SpecialReference.IteratorFactory]: undefined, - [SpecialReference.SymbolAsyncIterator]: this.parseWKSymbol(Symbol.asyncIterator), - [SpecialReference.AsyncIteratorFactory]: undefined, - }, }; } @@ -220,29 +207,6 @@ export abstract class BaseParserContext implements PluginAccessOptions { f: undefined, b: undefined, o: getObjectFlag(current), - x: { - [SpecialReference.Sentinel]: undefined, - [SpecialReference.SymbolIterator]: ( - this.features & Feature.Symbol && Symbol.iterator in current - ? this.parseWKSymbol(Symbol.iterator) - : undefined - ), - [SpecialReference.IteratorFactory]: ( - this.features & Feature.Symbol && Symbol.iterator in current - ? this.parseIteratorFactory() - : undefined - ), - [SpecialReference.SymbolAsyncIterator]: ( - this.features & Feature.Symbol && Symbol.asyncIterator in current - ? this.parseWKSymbol(Symbol.asyncIterator) - : undefined - ), - [SpecialReference.AsyncIteratorFactory]: ( - this.features & Feature.Symbol && Symbol.asyncIterator in current - ? this.parseAsyncIteratorFactory() - : undefined - ), - }, }; } @@ -262,16 +226,55 @@ export abstract class BaseParserContext implements PluginAccessOptions { p: undefined, e: { k, v, s }, a: undefined, - f: undefined, + f: this.parseMapSentinel(), + b: undefined, + o: undefined, + }; + } + + protected parseReadableStreamFactory( + items: SerovalNode, + ): SerovalIndexedValueNode | SerovalReadableStreamFactoryNode { + const registeredID = this.refs.get(READABLE_STREAM); + if (registeredID != null) { + this.markRef(registeredID); + return createIndexedValueNode(registeredID); + } + const id = this.refs.size; + this.refs.set(READABLE_STREAM, id); + return { + t: SerovalNodeType.ReadableStreamFactory, + i: id, + s: undefined, + l: undefined, + c: undefined, + m: undefined, + p: undefined, + e: undefined, + a: undefined, + f: items, + b: undefined, + o: undefined, + }; + } + + protected createReadableStreamNode( + id: number, + items: SerovalNode, + ): SerovalReadableStreamNode { + return { + t: SerovalNodeType.ReadableStream, + i: id, + s: undefined, + l: undefined, + c: undefined, + m: undefined, + p: undefined, + e: undefined, + a: undefined, + f: this.parseReadableStreamFactory(items), b: undefined, o: undefined, - x: { - [SpecialReference.Sentinel]: this.parseMapSentinel(), - [SpecialReference.SymbolIterator]: undefined, - [SpecialReference.IteratorFactory]: undefined, - [SpecialReference.SymbolAsyncIterator]: undefined, - [SpecialReference.AsyncIteratorFactory]: undefined, - }, }; } } diff --git a/packages/seroval/src/core/context/parser/async.ts b/packages/seroval/src/core/context/parser/async.ts index 84bfd5fb..06b7012e 100644 --- a/packages/seroval/src/core/context/parser/async.ts +++ b/packages/seroval/src/core/context/parser/async.ts @@ -19,6 +19,8 @@ import { createErrorNode, createSetNode, createAggregateErrorNode, + createIteratorFactoryInstanceNode, + createAsyncIteratorFactoryInstanceNode, } from '../../base-primitives'; import { BIGINT_FLAG, Feature } from '../../compat'; import { @@ -37,12 +39,11 @@ import { FALSE_NODE, UNDEFINED_NODE, } from '../../literals'; -import { asyncIteratorToSequence, iteratorToSequence } from '../../utils/iterator-to-sequence'; +import { asyncIteratorToSequence, iteratorToSequence, readableStreamToSequence } from '../../utils/iterator-to-sequence'; import { BaseParserContext } from '../parser'; import promiseToResult from '../../utils/promise-to-result'; import { getErrorOptions } from '../../utils/error'; import { serializeString } from '../../string'; -import { SerovalObjectRecordSpecialKey } from '../../types'; import type { SerovalErrorNode, SerovalArrayNode, @@ -69,6 +70,7 @@ import type { SerovalResponseNode, SerovalSetNode, SerovalDataViewNode, + SerovalReadableStreamNode, } from '../../types'; import { createURLNode, @@ -124,15 +126,29 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { // Check special properties if (this.features & Feature.Symbol) { if (Symbol.iterator in properties) { - keyNodes.push(SerovalObjectRecordSpecialKey.SymbolIterator); + keyNodes.push( + this.parseWKSymbol(Symbol.iterator), + ); valueNodes.push( - await this.parse(iteratorToSequence(properties as Iterable)), + createIteratorFactoryInstanceNode( + this.parseIteratorFactory(), + await this.parse( + iteratorToSequence(properties as Iterable), + ), + ), ); } if (Symbol.asyncIterator in properties) { - keyNodes.push(SerovalObjectRecordSpecialKey.SymbolAsyncIterator); + keyNodes.push( + this.parseWKSymbol(Symbol.asyncIterator), + ); valueNodes.push( - await this.parse(await asyncIteratorToSequence(properties as AsyncIterable)), + createAsyncIteratorFactoryInstanceNode( + this.parseAsyncIteratorFactory(), + await this.parse( + await asyncIteratorToSequence(properties as AsyncIterable), + ), + ), ); } } @@ -258,7 +274,6 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { a: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -279,7 +294,6 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { a: undefined, b: current.lastModified, o: undefined, - x: undefined, }; } @@ -321,7 +335,6 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -346,7 +359,6 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -369,7 +381,6 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { a: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -395,7 +406,6 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { ], b: undefined, o: undefined, - x: undefined, }; } @@ -435,7 +445,6 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { f: await this.parse(result), b: undefined, o: undefined, - x: undefined, }; } @@ -461,6 +470,18 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { return undefined; } + private async parseReadableStream( + id: number, + current: ReadableStream, + ): Promise { + return this.createReadableStreamNode( + id, + await this.parse( + await readableStreamToSequence(current), + ), + ); + } + private async parseObject( id: number, current: object, @@ -579,6 +600,8 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { return this.parseCustomEvent(id, current as unknown as CustomEvent); case (typeof DOMException !== 'undefined' ? DOMException : UNIVERSAL_SENTINEL): return createDOMExceptionNode(id, current as unknown as DOMException); + case (typeof ReadableStream !== 'undefined' ? ReadableStream : UNIVERSAL_SENTINEL): + return this.parseReadableStream(id, current as unknown as ReadableStream); default: break; } diff --git a/packages/seroval/src/core/context/parser/stream.ts b/packages/seroval/src/core/context/parser/stream.ts index 94548a21..a7093c60 100644 --- a/packages/seroval/src/core/context/parser/stream.ts +++ b/packages/seroval/src/core/context/parser/stream.ts @@ -2,7 +2,9 @@ import type { BigIntTypedArrayValue, TypedArrayValue } from '../../../types'; import UnsupportedTypeError from '../../UnsupportedTypeError'; import { createArrayBufferNode, + createAsyncIteratorFactoryInstanceNode, createDateNode, + createIteratorFactoryInstanceNode, createPluginNode, createRegExpNode, } from '../../base-primitives'; @@ -13,16 +15,15 @@ import { SerovalNodeType, UNIVERSAL_SENTINEL } from '../../constants'; import { createRequestOptions, createResponseOptions } from '../../utils/constructors'; import { NULL_NODE } from '../../literals'; import { serializeString } from '../../string'; -import { - SerovalObjectRecordSpecialKey, - type SerovalNode, - type SerovalObjectRecordKey, - type SerovalObjectRecordNode, - type SerovalPluginNode, - type SerovalPromiseConstructorNode, - type SerovalReadableStreamConstructorNode, - type SerovalRequestNode, - type SerovalResponseNode, +import type { + SerovalNode, + SerovalObjectRecordKey, + SerovalObjectRecordNode, + SerovalPluginNode, + SerovalPromiseConstructorNode, + SerovalReadableStreamConstructorNode, + SerovalRequestNode, + SerovalResponseNode, } from '../../types'; import { createDOMExceptionNode, createURLNode, createURLSearchParamsNode } from '../../web-api'; import { asyncIteratorToReadableStream, iteratorToSequence } from '../../utils/iterator-to-sequence'; @@ -105,15 +106,29 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont // Check special properties, symbols in this case if (this.features & Feature.Symbol) { if (Symbol.iterator in properties) { - keyNodes.push(SerovalObjectRecordSpecialKey.SymbolIterator); + keyNodes.push( + this.parseWKSymbol(Symbol.iterator), + ); valueNodes.push( - this.parse(iteratorToSequence(properties as Iterable)), + createIteratorFactoryInstanceNode( + this.parseIteratorFactory(), + this.parse( + iteratorToSequence(properties as Iterable), + ), + ), ); } if (Symbol.asyncIterator in properties) { - keyNodes.push(SerovalObjectRecordSpecialKey.SymbolAsyncIterator); + keyNodes.push( + this.parseWKSymbol(Symbol.asyncIterator), + ); valueNodes.push( - this.parse(asyncIteratorToReadableStream(properties as AsyncIterable)), + createAsyncIteratorFactoryInstanceNode( + this.parseAsyncIteratorFactory(), + this.parse( + asyncIteratorToReadableStream(properties as AsyncIterable), + ), + ), ); } } @@ -145,7 +160,6 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont f: undefined, b: undefined, o: undefined, - x: undefined, }, false); this.popPendingState(); } else { @@ -164,7 +178,6 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont f: parsed, b: undefined, o: undefined, - x: undefined, }, false); this.pushReadableStreamReader(id, reader); } @@ -188,7 +201,6 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont f: parsed, b: undefined, o: undefined, - x: undefined, }, false); this.popPendingState(); } @@ -218,7 +230,6 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont f: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -241,7 +252,6 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont a: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -267,7 +277,6 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont ], b: undefined, o: undefined, - x: undefined, }; } @@ -292,7 +301,6 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont f: parsed, b: undefined, o: undefined, - x: undefined, }, false); this.popPendingState(); } @@ -314,7 +322,6 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont f: parsed, b: undefined, o: undefined, - x: undefined, }, false); this.popPendingState(); } @@ -335,7 +342,6 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont f: undefined, b: undefined, o: undefined, - x: undefined, }; } diff --git a/packages/seroval/src/core/context/parser/sync.ts b/packages/seroval/src/core/context/parser/sync.ts index 476160a8..b4b4c267 100644 --- a/packages/seroval/src/core/context/parser/sync.ts +++ b/packages/seroval/src/core/context/parser/sync.ts @@ -12,6 +12,7 @@ import { createDataViewNode, createDateNode, createErrorNode, + createIteratorFactoryInstanceNode, createNumberNode, createPluginNode, createRegExpNode, @@ -39,7 +40,6 @@ import { BaseParserContext } from '../parser'; import { hasReferenceID } from '../../reference'; import { getErrorOptions } from '../../utils/error'; import { serializeString } from '../../string'; -import { SerovalObjectRecordSpecialKey } from '../../types'; import type { SerovalBoxedNode, SerovalArrayNode, @@ -117,8 +117,17 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { // Check special properties, symbols in this case if (this.features & Feature.Symbol) { if (Symbol.iterator in properties) { - keyNodes.push(SerovalObjectRecordSpecialKey.SymbolIterator); - valueNodes.push(this.parse(iteratorToSequence(properties as Iterable))); + keyNodes.push( + this.parseWKSymbol(Symbol.iterator), + ); + valueNodes.push( + createIteratorFactoryInstanceNode( + this.parseIteratorFactory(), + this.parse( + iteratorToSequence(properties as Iterable), + ), + ), + ); } } return { @@ -264,7 +273,6 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -289,7 +297,6 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { f: undefined, b: undefined, o: undefined, - x: undefined, }; } diff --git a/packages/seroval/src/core/context/serializer.ts b/packages/seroval/src/core/context/serializer.ts index 853634a5..b164187c 100644 --- a/packages/seroval/src/core/context/serializer.ts +++ b/packages/seroval/src/core/context/serializer.ts @@ -9,7 +9,6 @@ import { import { createEffectfulFunction, createFunction } from '../utils/function-string'; import { REFERENCES_KEY } from '../keys'; import type { Plugin, PluginAccessOptions, SerovalMode } from '../plugin'; -import { SpecialReference } from '../special-reference'; import type { SerovalArrayNode, SerovalIndexedValueNode, @@ -52,11 +51,10 @@ import type { SerovalReadableStreamErrorNode, SerovalReadableStreamCloseNode, SerovalMapSentinelNode, - SerovalIteratorNode, - SerovalAsyncIteratorNode, -} from '../types'; -import { - SerovalObjectRecordSpecialKey, + SerovalIteratorFactoryInstanceNode, + SerovalIteratorFactoryNode, + SerovalAsyncIteratorFactoryInstanceNode, + SerovalAsyncIteratorFactoryNode, } from '../types'; import { isValidIdentifier } from '../utils/is-valid-identifier'; @@ -440,60 +438,25 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio key: SerovalObjectRecordKey, val: SerovalNode, ): string { - // Only reason this is a switch is so that - // in the future, maybe other Symbols are going - // to be introduced and/or has merit to be added - // E.g. Symbol.asyncIterator - switch (key) { - case SerovalObjectRecordSpecialKey.SymbolIterator: - if ( - source.x - && source.x[SpecialReference.SymbolIterator] - && source.x[SpecialReference.IteratorFactory] - ) { - const serialKey = '[' + this.serialize(source.x[SpecialReference.SymbolIterator]) + ']:'; - const parent = this.stack; - this.stack = []; - const serialized = this.serialize(val); - this.stack = parent; - const constructor = this.serialize(source.x[SpecialReference.IteratorFactory]); - return serialKey + '(' + constructor + ')(' + serialized + ')'; - } - return ''; - case SerovalObjectRecordSpecialKey.SymbolAsyncIterator: - if ( - source.x - && source.x[SpecialReference.SymbolAsyncIterator] - && source.x[SpecialReference.AsyncIteratorFactory] - ) { - const serialKey = '[' + this.serialize(source.x[SpecialReference.SymbolAsyncIterator]) + ']:'; - const parent = this.stack; - this.stack = []; - const serialized = this.serialize(val); - this.stack = parent; - const constructor = this.serialize(source.x[SpecialReference.AsyncIteratorFactory]); - return serialKey + '(' + constructor + ')(' + serialized + ')'; + if (typeof key === 'string') { + const check = Number(key); + // Test if key is a valid number or JS identifier + // so that we don't have to serialize the key and wrap with brackets + const isIdentifier = check >= 0 || isValidIdentifier(key); + if (this.isIndexedValueInStack(val)) { + const refParam = this.getRefParam((val as SerovalIndexedValueNode).i); + this.markRef(source.i); + // eslint-disable-next-line no-self-compare + if (isIdentifier && check !== check) { + this.createObjectAssign(source.i, key, refParam); + } else { + this.createArrayAssign(source.i, isIdentifier ? key : ('"' + key + '"'), refParam); } return ''; - default: { - const check = Number(key); - // Test if key is a valid number or JS identifier - // so that we don't have to serialize the key and wrap with brackets - const isIdentifier = check >= 0 || isValidIdentifier(key); - if (this.isIndexedValueInStack(val)) { - const refParam = this.getRefParam((val as SerovalIndexedValueNode).i); - this.markRef(source.i); - // eslint-disable-next-line no-self-compare - if (isIdentifier && check !== check) { - this.createObjectAssign(source.i, key, refParam); - } else { - this.createArrayAssign(source.i, isIdentifier ? key : ('"' + key + '"'), refParam); - } - return ''; - } - return (isIdentifier ? key : ('"' + key + '"')) + ':' + this.serialize(val); } + return (isIdentifier ? key : ('"' + key + '"')) + ':' + this.serialize(val); } + return '[' + this.serialize(key) + ']:' + this.serialize(val); } protected serializeProperties( @@ -541,71 +504,42 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio key: SerovalObjectRecordKey, value: SerovalNode, ): void { - switch (key) { - case SerovalObjectRecordSpecialKey.SymbolIterator: - if ( - source.x - && source.x[SpecialReference.IteratorFactory] - && source.x[SpecialReference.SymbolIterator] - ) { - const parent = this.stack; - this.stack = []; - const serialized = this.serialize(value); - this.stack = parent; - const parentAssignment = this.assignments; - this.assignments = mainAssignments; - this.createArrayAssign( - source.i, - this.serialize(source.x[SpecialReference.SymbolIterator]), - '(' + this.serialize(source.x[SpecialReference.IteratorFactory]) + ')(' + serialized + ')', - ); - this.assignments = parentAssignment; - } - break; - case SerovalObjectRecordSpecialKey.SymbolAsyncIterator: - if ( - source.x - && source.x[SpecialReference.AsyncIteratorFactory] - && source.x[SpecialReference.SymbolAsyncIterator] - ) { - const parent = this.stack; - this.stack = []; - const serialized = this.serialize(value); - this.stack = parent; - const parentAssignment = this.assignments; - this.assignments = mainAssignments; - this.createArrayAssign( - source.i, - this.serialize(source.x[SpecialReference.SymbolAsyncIterator]), - '(' + this.serialize(source.x[SpecialReference.AsyncIteratorFactory]) + ')(' + serialized + ')', - ); - this.assignments = parentAssignment; + if (typeof key === 'string') { + const serialized = this.serialize(value); + const check = Number(key); + // Test if key is a valid number or JS identifier + // so that we don't have to serialize the key and wrap with brackets + const isIdentifier = check >= 0 || isValidIdentifier(key); + if (this.isIndexedValueInStack(value)) { + // eslint-disable-next-line no-self-compare + if (isIdentifier && check !== check) { + this.createObjectAssign(source.i, key, serialized); + } else { + this.createArrayAssign(source.i, isIdentifier ? key : ('"' + key + '"'), serialized); } - break; - default: { - const serialized = this.serialize(value); - const check = Number(key); - // Test if key is a valid number or JS identifier - // so that we don't have to serialize the key and wrap with brackets - const isIdentifier = check >= 0 || isValidIdentifier(key); - if (this.isIndexedValueInStack(value)) { - // eslint-disable-next-line no-self-compare - if (isIdentifier && check !== check) { - this.createObjectAssign(source.i, key, serialized); - } else { - this.createArrayAssign(source.i, isIdentifier ? key : ('"' + key + '"'), serialized); - } + } else { + const parentAssignment = this.assignments; + this.assignments = mainAssignments; + if (isIdentifier) { + this.createObjectAssign(source.i, key, serialized); } else { - const parentAssignment = this.assignments; - this.assignments = mainAssignments; - if (isIdentifier) { - this.createObjectAssign(source.i, key, serialized); - } else { - this.createArrayAssign(source.i, isIdentifier ? key : ('"' + key + '"'), serialized); - } - this.assignments = parentAssignment; + this.createArrayAssign(source.i, isIdentifier ? key : ('"' + key + '"'), serialized); } + this.assignments = parentAssignment; } + } else { + const parent = this.stack; + this.stack = []; + const serialized = this.serialize(value); + this.stack = parent; + const parentAssignment = this.assignments; + this.assignments = mainAssignments; + this.createArrayAssign( + source.i, + this.serialize(key), + serialized, + ); + this.assignments = parentAssignment; } } @@ -766,7 +700,7 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio let serialized = MAP_CONSTRUCTOR; const size = node.e.s; const id = node.i; - const sentinel = node.x[SpecialReference.Sentinel]; + const sentinel = node.f; const sentinelID = this.getRefParam(sentinel.i); if (size) { const keys = node.e.k; @@ -1060,7 +994,7 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio ); } - protected serializeIterator(node: SerovalIteratorNode): string { + protected serializeIteratorFactory(node: SerovalIteratorFactoryNode): string { return this.assignIndexedValue( node.i, createFunction( @@ -1069,14 +1003,20 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio createFunction( this.features, ['i', 'c', 'd', 't'], - '(i=0,t={[' + this.serialize(node.x[SpecialReference.SymbolIterator]) + ']:' + createFunction(this.features, [], 't') + ',' + '(i=0,t={[' + this.serialize(node.f) + ']:' + createFunction(this.features, [], 't') + ',' + 'next:' + createEffectfulFunction(this.features, [], 'if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}') + '})', ), ), ); } - protected serializeAsyncIterator(node: SerovalAsyncIteratorNode): string { + protected serializeIteratorFactoryInstance( + node: SerovalIteratorFactoryInstanceNode, + ): string { + return '(' + this.serialize(node.a[0]) + ')(' + this.serialize(node.a[1]) + ')'; + } + + protected serializeAsyncIteratorFactory(node: SerovalAsyncIteratorFactoryNode): string { return this.assignIndexedValue( node.i, createFunction( @@ -1085,7 +1025,7 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio createFunction( this.features, ['i', 't'], - '(i=0,t={[' + this.serialize(node.x[SpecialReference.SymbolAsyncIterator]) + ']:' + createFunction(this.features, [], 't') + ',' + '(i=0,t={[' + this.serialize(node.f) + ']:' + createFunction(this.features, [], 't') + ',' + 'next:' + createFunction( this.features, [], @@ -1100,6 +1040,12 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio ); } + protected serializeAsyncIteratorFactoryInstance( + node: SerovalAsyncIteratorFactoryInstanceNode, + ): string { + return '(' + this.serialize(node.a[0]) + ')(' + this.serialize(node.a[1]) + ')'; + } + serialize(node: SerovalNode): string { switch (node.t) { case SerovalNodeType.Constant: @@ -1186,9 +1132,15 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio case SerovalNodeType.MapSentinel: return this.serializeMapSentinel(node); case SerovalNodeType.IteratorFactory: - return this.serializeIterator(node); + return this.serializeIteratorFactory(node); + case SerovalNodeType.IteratorFactoryInstance: + return this.serializeIteratorFactoryInstance(node); case SerovalNodeType.AsyncIteratorFactory: - return this.serializeAsyncIterator(node); + return this.serializeAsyncIteratorFactory(node); + case SerovalNodeType.AsyncIteratorFactoryInstance: + return this.serializeAsyncIteratorFactoryInstance(node); + case SerovalNodeType.ReadableStream: + case SerovalNodeType.ReadableStreamFactory: default: throw new Error('invariant'); } diff --git a/packages/seroval/src/core/cross/serializer.ts b/packages/seroval/src/core/cross/serializer.ts index b9e80e9f..d206db86 100644 --- a/packages/seroval/src/core/cross/serializer.ts +++ b/packages/seroval/src/core/cross/serializer.ts @@ -7,7 +7,7 @@ import type { SerovalReadableStreamErrorNode, SerovalReadableStreamConstructorNode, SerovalNode, - SerovalAsyncIteratorNode, + SerovalAsyncIteratorFactoryNode, } from '../types'; import { GLOBAL_CONTEXT_PROMISE_REJECT, @@ -26,7 +26,6 @@ import type { SerovalMode } from '../plugin'; import { serializeString } from '../string'; import type { CrossContextOptions } from './parser'; import { createEffectfulFunction, createFunction } from '../utils/function-string'; -import { SpecialReference } from '../special-reference'; export interface CrossSerializerContextOptions extends BaseSerializerContextOptions, CrossContextOptions { @@ -98,7 +97,7 @@ export default class CrossSerializerContext extends BaseSerializerContext { return GLOBAL_CONTEXT_API + '.' + GLOBAL_CONTEXT_STREAM_CLOSE + '(' + this.getRefParam(node.i) + ')'; } - protected serializeAsyncIterator(node: SerovalAsyncIteratorNode): string { + protected serializeAsyncIteratorFactory(node: SerovalAsyncIteratorFactoryNode): string { return this.assignIndexedValue( node.i, createFunction( @@ -107,7 +106,7 @@ export default class CrossSerializerContext extends BaseSerializerContext { createFunction( this.features, ['b'], - '(b=s.tee(),s=b[0],b=b[1].getReader(),{[' + this.serialize(node.x[SpecialReference.SymbolAsyncIterator]) + ']:' + createFunction(this.features, [], 'this') + ',' + '(b=s.tee(),s=b[0],b=b[1].getReader(),{[' + this.serialize(node.f) + ']:' + createFunction(this.features, [], 'this') + ',' + 'next:' + createFunction( this.features, [], diff --git a/packages/seroval/src/core/literals.ts b/packages/seroval/src/core/literals.ts index 3cc14314..8963c81c 100644 --- a/packages/seroval/src/core/literals.ts +++ b/packages/seroval/src/core/literals.ts @@ -15,7 +15,6 @@ function createConstantNode(value: SerovalConstant): SerovalConstantNode { f: undefined, b: undefined, o: undefined, - x: undefined, }; } diff --git a/packages/seroval/src/core/special-reference.ts b/packages/seroval/src/core/special-reference.ts index b70ae2ba..ed12b8f9 100644 --- a/packages/seroval/src/core/special-reference.ts +++ b/packages/seroval/src/core/special-reference.ts @@ -4,10 +4,13 @@ export const ITERATOR = {}; export const ASYNC_ITERATOR = {}; +export const READABLE_STREAM = {}; + export const enum SpecialReference { Sentinel = 0, SymbolIterator = 1, IteratorFactory = 2, SymbolAsyncIterator = 3, AsyncIteratorFactory = 4, + ReadableStreamFactory = 5, } diff --git a/packages/seroval/src/core/types.ts b/packages/seroval/src/core/types.ts index 31a7ced2..bad0eef8 100644 --- a/packages/seroval/src/core/types.ts +++ b/packages/seroval/src/core/types.ts @@ -5,7 +5,6 @@ import type { Symbols, ErrorConstructorTag, } from './constants'; -import type { SpecialReference } from './special-reference'; export interface SerovalBaseNode { // Type of the node @@ -32,22 +31,11 @@ export interface SerovalBaseNode { b: number | undefined; // object flag o: SerovalObjectFlags | undefined; - // x - x: SerovalX | undefined; -} - -export type SerovalX = { - [key in SpecialReference]?: SerovalNode | undefined; -}; - -export const enum SerovalObjectRecordSpecialKey { - SymbolIterator = 0, - SymbolAsyncIterator = 1, } export type SerovalObjectRecordKey = | string - | SerovalObjectRecordSpecialKey; + | SerovalNode; export interface SerovalPlainRecordNode { k: string[]; @@ -169,16 +157,12 @@ export interface SerovalSetNode extends SerovalBaseNode { a: SerovalNode[]; } -export interface SerovalMapX extends SerovalX { - [SpecialReference.Sentinel]: SerovalMapSentinelNode | SerovalIndexedValueNode; -} - export interface SerovalMapNode extends SerovalBaseNode { t: SerovalNodeType.Map; i: number; // key/value pairs e: SerovalMapRecordNode; - x: SerovalMapX; + f: SerovalMapSentinelNode | SerovalIndexedValueNode; } export interface SerovalArrayNode extends SerovalBaseNode { @@ -191,27 +175,12 @@ export interface SerovalArrayNode extends SerovalBaseNode { o: SerovalObjectFlags; } -export interface SerovalObjectX extends SerovalX { - [SpecialReference.SymbolIterator]: SerovalNodeWithID | undefined; - [SpecialReference.IteratorFactory]: SerovalNodeWithID | undefined; - [SpecialReference.SymbolAsyncIterator]: SerovalNodeWithID | undefined; - [SpecialReference.AsyncIteratorFactory]: SerovalNodeWithID | undefined; -} - export interface SerovalObjectNode extends SerovalBaseNode { t: SerovalNodeType.Object; // key/value pairs p: SerovalObjectRecordNode; i: number; o: SerovalObjectFlags; - x: SerovalObjectX; -} - -export interface SerovalNullConstructorX extends SerovalX { - [SpecialReference.SymbolIterator]: SerovalNodeWithID | undefined; - [SpecialReference.IteratorFactory]: SerovalNodeWithID | undefined; - [SpecialReference.SymbolAsyncIterator]: SerovalNodeWithID | undefined; - [SpecialReference.IteratorFactory]: SerovalNodeWithID | undefined; } export interface SerovalNullConstructorNode extends SerovalBaseNode { @@ -220,7 +189,6 @@ export interface SerovalNullConstructorNode extends SerovalBaseNode { p: SerovalObjectRecordNode; i: number; o: SerovalObjectFlags; - x: SerovalNullConstructorX; } export interface SerovalPromiseNode extends SerovalBaseNode { @@ -426,24 +394,44 @@ export interface SerovalMapSentinelNode extends SerovalBaseNode { i: number; } -export interface SerovalIteratorX extends SerovalX { - [SpecialReference.SymbolIterator]: SerovalNodeWithID; -} - -export interface SerovalIteratorNode extends SerovalBaseNode { +export interface SerovalIteratorFactoryNode extends SerovalBaseNode { t: SerovalNodeType.IteratorFactory; i: number; - x: SerovalIteratorX; + f: SerovalNode; } -export interface SerovalAsyncIteratorX extends SerovalX { - [SpecialReference.SymbolAsyncIterator]: SerovalNodeWithID; +export interface SerovalIteratorFactoryInstanceNode extends SerovalBaseNode { + t: SerovalNodeType.IteratorFactoryInstance; + a: [ + instance: SerovalNode, + sequence: SerovalNode, + ]; } -export interface SerovalAsyncIteratorNode extends SerovalBaseNode { +export interface SerovalAsyncIteratorFactoryNode extends SerovalBaseNode { t: SerovalNodeType.AsyncIteratorFactory; i: number; - x: SerovalAsyncIteratorX; + f: SerovalNode; +} + +export interface SerovalAsyncIteratorFactoryInstanceNode extends SerovalBaseNode { + t: SerovalNodeType.AsyncIteratorFactoryInstance; + a: [ + instance: SerovalNode, + sequence: SerovalNode, + ]; +} + +export interface SerovalReadableStreamNode extends SerovalBaseNode { + t: SerovalNodeType.ReadableStream; + i: number; + f: SerovalReadableStreamFactoryNode | SerovalIndexedValueNode; +} + +export interface SerovalReadableStreamFactoryNode extends SerovalBaseNode { + t: SerovalNodeType.ReadableStreamFactory; + i: number; + f: SerovalNode; } export type SerovalSyncNode = @@ -474,8 +462,10 @@ export type SerovalSyncNode = | SerovalDOMExceptionNode | SerovalPluginNode | SerovalMapSentinelNode - | SerovalIteratorNode - | SerovalAsyncIteratorNode; + | SerovalIteratorFactoryNode + | SerovalIteratorFactoryInstanceNode + | SerovalAsyncIteratorFactoryNode + | SerovalAsyncIteratorFactoryInstanceNode; export type SerovalAsyncNode = | SerovalPromiseNode @@ -489,7 +479,9 @@ export type SerovalAsyncNode = | SerovalReadableStreamCloseNode | SerovalReadableStreamErrorNode | SerovalRequestNode - | SerovalResponseNode; + | SerovalResponseNode + | SerovalReadableStreamNode + | SerovalReadableStreamFactoryNode; export type SerovalNode = | SerovalSyncNode diff --git a/packages/seroval/src/core/utils/iterator-to-sequence.ts b/packages/seroval/src/core/utils/iterator-to-sequence.ts index 38d7c157..92d4a348 100644 --- a/packages/seroval/src/core/utils/iterator-to-sequence.ts +++ b/packages/seroval/src/core/utils/iterator-to-sequence.ts @@ -187,3 +187,36 @@ export function readableStreamToAsyncIterator( }; }; } + +export async function readableStreamToSequence( + stream: ReadableStream, +): Promise { + const values: unknown[] = []; + let throwsAt = -1; + let doneAt = -1; + + const iterator = stream.getReader(); + + async function push(): Promise { + try { + const value = await iterator.read(); + values.push(value.value); + if (value.done) { + doneAt = values.length - 1; + } else { + await push(); + } + } catch (error) { + throwsAt = values.length; + values.push(error); + } + } + + await push(); + + return { + v: values, + t: throwsAt, + d: doneAt, + }; +} diff --git a/packages/seroval/src/core/web-api.ts b/packages/seroval/src/core/web-api.ts index df044198..e0cad5c1 100644 --- a/packages/seroval/src/core/web-api.ts +++ b/packages/seroval/src/core/web-api.ts @@ -26,7 +26,6 @@ export function createURLNode( a: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -47,7 +46,6 @@ export function createURLSearchParamsNode( a: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -68,7 +66,6 @@ export function createDOMExceptionNode( f: undefined, b: undefined, o: undefined, - x: undefined, }; } @@ -90,7 +87,6 @@ export function createEventNode( f: options, b: undefined, o: undefined, - x: undefined, }; } @@ -112,6 +108,5 @@ export function createCustomEVentNode( f: options, b: undefined, o: undefined, - x: undefined, }; } diff --git a/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap b/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap index b1d8fc15..00173f71 100644 --- a/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap @@ -2,52 +2,52 @@ exports[`AsyncIterable > compat > should use function expressions instead of arrow functions. 1`] = `"(function(h){return ({title:\\"Hello World\\",[h=Symbol.asyncIterator]:(function(s){return function(i,t){return (i=0,t={[h]:function(){return t},next:function(){return Promise.resolve().then(function(c,d){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}})}})}})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; -exports[`AsyncIterable > compat#toJSONAsync > should use function expression instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",1],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[3]}"`; +exports[`AsyncIterable > compat#toJSONAsync > should use function expression instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":2},\\"o\\":0},\\"f\\":16379,\\"m\\":[1]}"`; exports[`AsyncIterable > compat#toJSONAsync > should use function expression instead of arrow functions. 2`] = `"(function(h){return ({title:\\"Hello World\\",[h=Symbol.asyncIterator]:(function(s){return function(i,t){return (i=0,t={[h]:function(){return t},next:function(){return Promise.resolve().then(function(c,d){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}})}})}})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; -exports[`AsyncIterable > crossSerializeAsync > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeAsync > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeAsync > supports AsyncIterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`AsyncIterable > crossSerializeAsync > supports AsyncIterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})}"`; -exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())})($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())})($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 2`] = `"($R=>_$.Se($R[1],$R[4]=[0,1]))($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 2`] = `"($R=>_$.Se($R[3],$R[4]=[0,1]))($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 3`] = `"($R=>_$.Se($R[1],$R[5]=[0,2]))($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 3`] = `"($R=>_$.Se($R[3],$R[5]=[0,2]))($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 4`] = `"($R=>_$.Se($R[1],$R[6]=[0,3]))($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 4`] = `"($R=>_$.Se($R[3],$R[6]=[0,3]))($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 5`] = `"($R=>_$.Se($R[1],$R[7]=[2,void 0]))($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 5`] = `"($R=>_$.Se($R[3],$R[7]=[2,void 0]))($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 6`] = `"($R=>_$.Sc($R[1]))($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 6`] = `"($R=>_$.Sc($R[3]))($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())}"`; +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())}"`; -exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 2`] = `"_$.Se($R[1],$R[4]=[0,1])"`; +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 2`] = `"_$.Se($R[3],$R[4]=[0,1])"`; -exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 3`] = `"_$.Se($R[1],$R[5]=[0,2])"`; +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 3`] = `"_$.Se($R[3],$R[5]=[0,2])"`; -exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 4`] = `"_$.Se($R[1],$R[6]=[0,3])"`; +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 4`] = `"_$.Se($R[3],$R[6]=[0,3])"`; -exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 5`] = `"_$.Se($R[1],$R[7]=[2,void 0])"`; +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 5`] = `"_$.Se($R[3],$R[7]=[2,void 0])"`; -exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 6`] = `"_$.Sc($R[1])"`; +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 6`] = `"_$.Sc($R[3])"`; exports[`AsyncIterable > serializeAsync > supports AsyncIterables 1`] = `"(h=>({title:\\"Hello World\\",[h=Symbol.asyncIterator]:(s=>(i,t)=>(i=0,t={[h]:()=>t,next:()=>Promise.resolve().then((c,d)=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}})}))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; -exports[`AsyncIterable > toCrossJSONAsync > supports AsyncIterables 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",1],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}}"`; +exports[`AsyncIterable > toCrossJSONAsync > supports AsyncIterables 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":2},\\"o\\":0}"`; -exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",1],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":31,\\"i\\":1}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":2,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":3,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":2}}}}}"`; +exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":31,\\"i\\":3}]}],\\"s\\":2},\\"o\\":0}"`; -exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 2`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":1}],\\"o\\":0}}"`; +exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 2`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":1}],\\"o\\":0}}"`; -exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 3`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":2}],\\"o\\":0}}"`; +exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 3`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":2}],\\"o\\":0}}"`; -exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 4`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; +exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 4`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; -exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 5`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":7,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":2,\\"s\\":1}],\\"o\\":0}}"`; +exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 5`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":7,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":2,\\"s\\":1}],\\"o\\":0}}"`; -exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 6`] = `"{\\"t\\":33,\\"i\\":1}"`; +exports[`AsyncIterable > toCrossJSONStream > supports AsyncIterables 6`] = `"{\\"t\\":33,\\"i\\":3}"`; -exports[`AsyncIterable > toJSONAsync > supports AsyncIterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",1],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; +exports[`AsyncIterable > toJSONAsync > supports AsyncIterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[1]}"`; diff --git a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap index 20a2bc82..f1f4e52a 100644 --- a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap @@ -2,29 +2,29 @@ exports[`frozen object > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.iterator]:($R[2]=s=>(i,c,d,t)=>(i=0,t={[$R[1]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])"`; -exports[`frozen object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; +exports[`frozen object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[1]=Symbol.iterator]:($R[2]=s=>(i,c,d,t)=>(i=0,t={[$R[1]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])"`; -exports[`frozen object > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; +exports[`frozen object > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; -exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; exports[`frozen object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.freeze($R[0]),$R[0])"`; @@ -32,21 +32,21 @@ exports[`frozen object > crossSerializeStream > scoped > supports Objects 1`] = exports[`frozen object > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[1],$R[4]=[0,1]))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[3],$R[4]=[0,1]))($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 3`] = `"($R=>_$.Se($R[1],$R[5]=[0,2]))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 3`] = `"($R=>_$.Se($R[3],$R[5]=[0,2]))($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 4`] = `"($R=>_$.Se($R[1],$R[6]=[0,3]))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 4`] = `"($R=>_$.Se($R[3],$R[6]=[0,3]))($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 5`] = `"($R=>_$.Se($R[1],$R[7]=[2,void 0]))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 5`] = `"($R=>_$.Se($R[3],$R[7]=[2,void 0]))($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 6`] = `"($R=>_$.Sc($R[1]))($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 6`] = `"($R=>_$.Sc($R[3]))($R[\\"example\\"])"`; exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; @@ -58,21 +58,21 @@ exports[`frozen object > crossSerializeStream > supports Objects 1`] = `"$R[0]=_ exports[`frozen object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])"`; -exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())},Object.freeze($R[0]),$R[0])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())},Object.freeze($R[0]),$R[0])"`; -exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[1],$R[4]=[0,1])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[3],$R[4]=[0,1])"`; -exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 3`] = `"_$.Se($R[1],$R[5]=[0,2])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 3`] = `"_$.Se($R[3],$R[5]=[0,2])"`; -exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 4`] = `"_$.Se($R[1],$R[6]=[0,3])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 4`] = `"_$.Se($R[3],$R[6]=[0,3])"`; -exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 5`] = `"_$.Se($R[1],$R[7]=[2,void 0])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 5`] = `"_$.Se($R[3],$R[7]=[2,void 0])"`; -exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 6`] = `"_$.Sc($R[1])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 6`] = `"_$.Sc($R[3])"`; exports[`frozen object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; exports[`frozen object > crossSerializeStream > supports self-recursion 1`] = `"($R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()},Object.freeze($R[0]),$R[0])"`; @@ -94,56 +94,56 @@ exports[`frozen object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j exports[`frozen object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.freeze(h),h))()"`; -exports[`frozen object > toCrossJSON > supports Objects 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3,\\"x\\":{}}"`; +exports[`frozen object > toCrossJSON > supports Objects 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3}"`; -exports[`frozen object > toCrossJSON > supports Symbol.iterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}}"`; +exports[`frozen object > toCrossJSON > supports Symbol.iterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":3}"`; -exports[`frozen object > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":3,\\"x\\":{}}"`; +exports[`frozen object > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":3}"`; -exports[`frozen object > toCrossJSONAsync > supports Objects 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3,\\"x\\":{}}}"`; +exports[`frozen object > toCrossJSONAsync > supports Objects 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3}}"`; -exports[`frozen object > toCrossJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}}"`; +exports[`frozen object > toCrossJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":3}"`; -exports[`frozen object > toCrossJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; +exports[`frozen object > toCrossJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":2,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":3,\\"f\\":{\\"t\\":4,\\"i\\":2}},{\\"t\\":10,\\"i\\":4,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":3}}"`; -exports[`frozen object > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":3,\\"x\\":{}}"`; +exports[`frozen object > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":3}"`; exports[`frozen object > toCrossJSONStream > supports Objects 1`] = `"{\\"t\\":28,\\"i\\":0}"`; -exports[`frozen object > toCrossJSONStream > supports Objects 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3,\\"x\\":{}}}"`; +exports[`frozen object > toCrossJSONStream > supports Objects 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3}}"`; -exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":31,\\"i\\":1}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":2,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":3,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":2}}}}}"`; +exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":31,\\"i\\":3}]}],\\"s\\":1},\\"o\\":3}"`; -exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 2`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":1}],\\"o\\":0}}"`; +exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 2`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":1}],\\"o\\":0}}"`; -exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 3`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":2}],\\"o\\":0}}"`; +exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 3`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":2}],\\"o\\":0}}"`; -exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 4`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; +exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 4`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; -exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 5`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":7,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":2,\\"s\\":1}],\\"o\\":0}}"`; +exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 5`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":7,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":2,\\"s\\":1}],\\"o\\":0}}"`; -exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 6`] = `"{\\"t\\":33,\\"i\\":1}"`; +exports[`frozen object > toCrossJSONStream > supports Symbol.asyncIterator 6`] = `"{\\"t\\":33,\\"i\\":3}"`; exports[`frozen object > toCrossJSONStream > supports Symbol.iterator 1`] = `"{\\"t\\":28,\\"i\\":0}"`; -exports[`frozen object > toCrossJSONStream > supports Symbol.iterator 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; +exports[`frozen object > toCrossJSONStream > supports Symbol.iterator 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":2,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":3,\\"f\\":{\\"t\\":4,\\"i\\":2}},{\\"t\\":10,\\"i\\":4,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":3}}"`; -exports[`frozen object > toCrossJSONStream > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":28,\\"i\\":1},{\\"t\\":28,\\"i\\":2}],\\"s\\":2},\\"o\\":3,\\"x\\":{}}"`; +exports[`frozen object > toCrossJSONStream > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":28,\\"i\\":1},{\\"t\\":28,\\"i\\":2}],\\"s\\":2},\\"o\\":3}"`; exports[`frozen object > toCrossJSONStream > supports self-recursion 2`] = `"{\\"t\\":29,\\"i\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; exports[`frozen object > toCrossJSONStream > supports self-recursion 3`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; -exports[`frozen object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`frozen object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3},\\"f\\":16383,\\"m\\":[]}"`; -exports[`frozen object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; +exports[`frozen object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":3},\\"f\\":16383,\\"m\\":[1]}"`; -exports[`frozen object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":3,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`frozen object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":3},\\"f\\":16383,\\"m\\":[0]}"`; -exports[`frozen object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`frozen object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":3}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`frozen object > toJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; +exports[`frozen object > toJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":3},\\"f\\":16383,\\"m\\":[1]}"`; -exports[`frozen object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":3,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}},\\"f\\":16383,\\"m\\":[4]}"`; +exports[`frozen object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":2,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":3,\\"f\\":{\\"t\\":4,\\"i\\":2}},{\\"t\\":10,\\"i\\":4,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":3}},\\"f\\":16383,\\"m\\":[2]}"`; -exports[`frozen object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":3,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`frozen object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":3},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/iterable.test.ts.snap b/packages/seroval/test/__snapshots__/iterable.test.ts.snap index 5c22985f..31a3cdb0 100644 --- a/packages/seroval/test/__snapshots__/iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/iterable.test.ts.snap @@ -2,38 +2,38 @@ exports[`Iterable > compat > should use function expression instead of arrow functions. 1`] = `"(function(h){return ({title:\\"Hello World\\",[h=Symbol.iterator]:(function(s){return function(i,c,d,t){return (i=0,t={[h]:function(){return t},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})}})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; -exports[`Iterable > compat#toJSON > should use function expression instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16379,\\"m\\":[3]}"`; +exports[`Iterable > compat#toJSON > should use function expression instead of arrow functions. 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",{\\"t\\":17,\\"i\\":1,\\"s\\":3}],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":2},\\"o\\":0},\\"f\\":16379,\\"m\\":[1]}"`; exports[`Iterable > compat#toJSON > should use function expression instead of arrow functions. 2`] = `"(function(h){return ({title:\\"Hello World\\",[h=Symbol.iterator]:(function(s){return function(i,c,d,t){return (i=0,t={[h]:function(){return t},next:function(){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}})}})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; -exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`Iterable > crossSerialize > scoped > supports Iterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[1]=Symbol.iterator]:($R[2]=s=>(i,c,d,t)=>(i=0,t={[$R[1]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; -exports[`Iterable > crossSerialize > supports Iterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`Iterable > crossSerialize > supports Iterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[1]=Symbol.iterator]:($R[2]=s=>(i,c,d,t)=>(i=0,t={[$R[1]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})}"`; -exports[`Iterable > crossSerializeAsync > scoped > supports Iterables 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`Iterable > crossSerializeAsync > scoped > supports Iterables 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; -exports[`Iterable > crossSerializeAsync > supports Iterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`Iterable > crossSerializeAsync > supports Iterables 1`] = `"$R[0]=Promise.resolve($R[1]={title:\\"Hello World\\",[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`Iterable > crossSerializeStream > scoped > supports Iterables 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`Iterable > crossSerializeStream > scoped > supports Iterables 2`] = `"($R=>_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`Iterable > crossSerializeStream > scoped > supports Iterables 2`] = `"($R=>_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`Iterable > crossSerializeStream > supports Iterables 1`] = `"$R[0]=_$.P()"`; -exports[`Iterable > crossSerializeStream > supports Iterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`Iterable > crossSerializeStream > supports Iterables 2`] = `"_$.Ps($R[0],$R[1]={title:\\"Hello World\\",[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`Iterable > serialize > supports Iterables 1`] = `"(h=>({title:\\"Hello World\\",[h=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[1,2,3,void 0],t:-1,d:3})}))()"`; exports[`Iterable > serializeAsync > supports Iterables 1`] = `"(h=>(Promise.resolve({title:\\"Hello World\\",[h=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; -exports[`Iterable > toCrossJSON > supports Iterables 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}}"`; +exports[`Iterable > toCrossJSON > supports Iterables 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",{\\"t\\":17,\\"i\\":1,\\"s\\":3}],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":2},\\"o\\":0}"`; -exports[`Iterable > toCrossJSONAsync > supports Iterables 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; +exports[`Iterable > toCrossJSONAsync > supports Iterables 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",{\\"t\\":17,\\"i\\":2,\\"s\\":3}],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":3,\\"f\\":{\\"t\\":4,\\"i\\":2}},{\\"t\\":10,\\"i\\":4,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":2},\\"o\\":0}}"`; exports[`Iterable > toCrossJSONStream > supports Iterables 1`] = `"{\\"t\\":28,\\"i\\":0}"`; -exports[`Iterable > toCrossJSONStream > supports Iterables 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; +exports[`Iterable > toCrossJSONStream > supports Iterables 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",{\\"t\\":17,\\"i\\":2,\\"s\\":3}],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":3,\\"f\\":{\\"t\\":4,\\"i\\":2}},{\\"t\\":10,\\"i\\":4,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":2},\\"o\\":0}}"`; -exports[`Iterable > toJSON > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; +exports[`Iterable > toJSON > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"title\\",{\\"t\\":17,\\"i\\":1,\\"s\\":3}],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[1]}"`; -exports[`Iterable > toJSONAsync > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",0],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":2},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}},\\"f\\":16383,\\"m\\":[4]}"`; +exports[`Iterable > toJSONAsync > supports Iterables 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"title\\",{\\"t\\":17,\\"i\\":2,\\"s\\":3}],\\"v\\":[{\\"t\\":1,\\"s\\":\\"Hello World\\"},{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":3,\\"f\\":{\\"t\\":4,\\"i\\":2}},{\\"t\\":10,\\"i\\":4,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":2},\\"o\\":0}},\\"f\\":16383,\\"m\\":[2]}"`; diff --git a/packages/seroval/test/__snapshots__/map.test.ts.snap b/packages/seroval/test/__snapshots__/map.test.ts.snap index d06eda25..07eaff11 100644 --- a/packages/seroval/test/__snapshots__/map.test.ts.snap +++ b/packages/seroval/test/__snapshots__/map.test.ts.snap @@ -4,7 +4,7 @@ exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.a exports[`Map > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; -exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":3,\\"a\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2}],\\"o\\":0},{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":3},{\\"t\\":0,\\"s\\":4}],\\"o\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":2}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":5,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":6,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":5}}}}},\\"f\\":16351,\\"m\\":[5]}"`; +exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":3,\\"a\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2}],\\"o\\":0},{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":3},{\\"t\\":0,\\"s\\":4}],\\"o\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":2}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0},\\"f\\":16351,\\"m\\":[1]}"`; exports[`Map > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; @@ -40,7 +40,7 @@ exports[`Map > crossSerializeStream > supports Map 2`] = `"_$.Ps($R[0],$R[1]=($R exports[`Map > crossSerializeStream > supports Map 3`] = `"{\\"t\\":28,\\"i\\":0}"`; -exports[`Map > crossSerializeStream > supports Map 4`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":2}}}}"`; +exports[`Map > crossSerializeStream > supports Map 4`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"f\\":{\\"t\\":41,\\"i\\":2}}}"`; exports[`Map > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=($R[3]=[],new Map([[$R[1]=_$.P(),$R[2]=_$.P()]]))"`; @@ -48,7 +48,7 @@ exports[`Map > crossSerializeStream > supports self-recursion 2`] = `"_$.Ps($R[1 exports[`Map > crossSerializeStream > supports self-recursion 3`] = `"_$.Ps($R[2],$R[0])"`; -exports[`Map > crossSerializeStream > supports self-recursion 4`] = `"{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":28,\\"i\\":1}],\\"v\\":[{\\"t\\":28,\\"i\\":2}],\\"s\\":1},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":3}}}"`; +exports[`Map > crossSerializeStream > supports self-recursion 4`] = `"{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":28,\\"i\\":1}],\\"v\\":[{\\"t\\":28,\\"i\\":2}],\\"s\\":1},\\"f\\":{\\"t\\":41,\\"i\\":3}}"`; exports[`Map > crossSerializeStream > supports self-recursion 5`] = `"{\\"t\\":29,\\"i\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; @@ -62,18 +62,18 @@ exports[`Map > serializeAsync > supports Map 1`] = `"(h=>(Promise.resolve((h=[], exports[`Map > serializeAsync > supports self-recursion 1`] = `"((h,j)=>(j=(h=[],new Map([[Promise.resolve().then(()=>j),Promise.resolve().then(()=>j)]]))))()"`; -exports[`Map > toCrossJSON > supports Map 1`] = `"{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":1}}}"`; +exports[`Map > toCrossJSON > supports Map 1`] = `"{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"f\\":{\\"t\\":41,\\"i\\":1}}"`; -exports[`Map > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":4,\\"i\\":0}],\\"v\\":[{\\"t\\":4,\\"i\\":0}],\\"s\\":1},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":1}}}"`; +exports[`Map > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":4,\\"i\\":0}],\\"v\\":[{\\"t\\":4,\\"i\\":0}],\\"s\\":1},\\"f\\":{\\"t\\":41,\\"i\\":1}}"`; -exports[`Map > toCrossJSONAsync > supports Map 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":2}}}}"`; +exports[`Map > toCrossJSONAsync > supports Map 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"f\\":{\\"t\\":41,\\"i\\":2}}}"`; -exports[`Map > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":1},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":3}}}"`; +exports[`Map > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":1},\\"f\\":{\\"t\\":41,\\"i\\":3}}"`; -exports[`Map > toJSON > supports Map 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":1}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Map > toJSON > supports Map 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"f\\":{\\"t\\":41,\\"i\\":1}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Map > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":4,\\"i\\":0}],\\"v\\":[{\\"t\\":4,\\"i\\":0}],\\"s\\":1},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":1}}},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`Map > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":4,\\"i\\":0}],\\"v\\":[{\\"t\\":4,\\"i\\":0}],\\"s\\":1},\\"f\\":{\\"t\\":41,\\"i\\":1}},\\"f\\":16383,\\"m\\":[0]}"`; -exports[`Map > toJSONAsync > supports Map 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":2}}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Map > toJSONAsync > supports Map 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":8,\\"i\\":1,\\"e\\":{\\"k\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":3}],\\"v\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":4}],\\"s\\":2},\\"f\\":{\\"t\\":41,\\"i\\":2}}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Map > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":1},\\"x\\":{\\"0\\":{\\"t\\":41,\\"i\\":3}}},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`Map > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":8,\\"i\\":0,\\"e\\":{\\"k\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":1},\\"f\\":{\\"t\\":41,\\"i\\":3}},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap b/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap index ff5e6ab3..f646e150 100644 --- a/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap +++ b/packages/seroval/test/__snapshots__/mutual-cycle.test.ts.snap @@ -74,15 +74,15 @@ exports[`mutual cyclic references > serializeAsync > supports Objects and Object exports[`mutual cyclic references > toCrossJSON > supports Arrays and Arrays 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":1}],\\"o\\":0}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0}"`; -exports[`mutual cyclic references > toCrossJSON > supports Arrays and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0}"`; +exports[`mutual cyclic references > toCrossJSON > supports Arrays and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0}"`; -exports[`mutual cyclic references > toCrossJSON > supports Objects and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":4,\\"i\\":2}],\\"o\\":0}"`; +exports[`mutual cyclic references > toCrossJSON > supports Objects and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0}],\\"s\\":1},\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0}"`; exports[`mutual cyclic references > toCrossJSONAsync > supports Arrays and Arrays 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":3,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"o\\":0}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0}"`; -exports[`mutual cyclic references > toCrossJSONAsync > supports Arrays and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0}"`; +exports[`mutual cyclic references > toCrossJSONAsync > supports Arrays and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0}"`; -exports[`mutual cyclic references > toCrossJSONAsync > supports Objects and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":4,\\"i\\":3}],\\"o\\":0}"`; +exports[`mutual cyclic references > toCrossJSONAsync > supports Objects and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0}}],\\"s\\":1},\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0}"`; exports[`mutual cyclic references > toCrossJSONStream > supports Arrays and Arrays 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":28,\\"i\\":2}],\\"o\\":0},{\\"t\\":9,\\"i\\":3,\\"l\\":1,\\"a\\":[{\\"t\\":28,\\"i\\":4}],\\"o\\":0}],\\"o\\":0}"`; @@ -90,13 +90,13 @@ exports[`mutual cyclic references > toCrossJSONStream > supports Arrays and Arra exports[`mutual cyclic references > toCrossJSONStream > supports Arrays and Arrays 3`] = `"{\\"t\\":29,\\"i\\":4,\\"f\\":{\\"t\\":4,\\"i\\":1}}"`; -exports[`mutual cyclic references > toCrossJSONStream > supports Arrays and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":28,\\"i\\":2}],\\"o\\":0},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":28,\\"i\\":4}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}],\\"o\\":0}"`; +exports[`mutual cyclic references > toCrossJSONStream > supports Arrays and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":28,\\"i\\":2}],\\"o\\":0},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":28,\\"i\\":4}],\\"s\\":1},\\"o\\":0}],\\"o\\":0}"`; exports[`mutual cyclic references > toCrossJSONStream > supports Arrays and Objects 2`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":3}}"`; exports[`mutual cyclic references > toCrossJSONStream > supports Arrays and Objects 3`] = `"{\\"t\\":29,\\"i\\":4,\\"f\\":{\\"t\\":4,\\"i\\":1}}"`; -exports[`mutual cyclic references > toCrossJSONStream > supports Objects and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":28,\\"i\\":2}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":28,\\"i\\":4}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}],\\"o\\":0}"`; +exports[`mutual cyclic references > toCrossJSONStream > supports Objects and Objects 1`] = `"{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":28,\\"i\\":2}],\\"s\\":1},\\"o\\":0},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":28,\\"i\\":4}],\\"s\\":1},\\"o\\":0}],\\"o\\":0}"`; exports[`mutual cyclic references > toCrossJSONStream > supports Objects and Objects 2`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":3}}"`; @@ -104,12 +104,12 @@ exports[`mutual cyclic references > toCrossJSONStream > supports Objects and Obj exports[`mutual cyclic references > toJSON > supports Arrays and Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":1,\\"a\\":[{\\"t\\":4,\\"i\\":1}],\\"o\\":0}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2]}"`; -exports[`mutual cyclic references > toJSON > supports Arrays and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2]}"`; +exports[`mutual cyclic references > toJSON > supports Arrays and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0}],\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2]}"`; -exports[`mutual cyclic references > toJSON > supports Objects and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2]}"`; +exports[`mutual cyclic references > toJSON > supports Objects and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":4,\\"i\\":1}],\\"s\\":1},\\"o\\":0}],\\"s\\":1},\\"o\\":0},{\\"t\\":4,\\"i\\":2}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,2]}"`; exports[`mutual cyclic references > toJSONAsync > supports Arrays and Arrays 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":9,\\"i\\":3,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"o\\":0}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3]}"`; -exports[`mutual cyclic references > toJSONAsync > supports Arrays and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3]}"`; +exports[`mutual cyclic references > toJSONAsync > supports Arrays and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":9,\\"i\\":1,\\"l\\":1,\\"a\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0}}],\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3]}"`; -exports[`mutual cyclic references > toJSONAsync > supports Objects and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3]}"`; +exports[`mutual cyclic references > toJSONAsync > supports Objects and Objects 1`] = `"{\\"t\\":{\\"t\\":9,\\"i\\":0,\\"l\\":2,\\"a\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"0\\"],\\"v\\":[{\\"t\\":12,\\"i\\":4,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":1}}],\\"s\\":1},\\"o\\":0}}],\\"s\\":1},\\"o\\":0},{\\"t\\":4,\\"i\\":3}],\\"o\\":0},\\"f\\":16383,\\"m\\":[1,3]}"`; diff --git a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap index f4556ae3..0012c8b1 100644 --- a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap +++ b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap @@ -2,35 +2,35 @@ exports[`null-constructor > compat > should use manual assignment instead of Object.assign 1`] = `"(h=>((h=Object.create(null),h.hello=\\"world\\",h)))()"`; -exports[`null-constructor > compat#toJSON > should use manual assignment instead of Object.assign 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16255,\\"m\\":[]}"`; +exports[`null-constructor > compat#toJSON > should use manual assignment instead of Object.assign 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16255,\\"m\\":[]}"`; exports[`null-constructor > compat#toJSON > should use manual assignment instead of Object.assign 2`] = `"(h=>((h=Object.create(null),h.hello=\\"world\\",h)))()"`; exports[`null-constructor > crossSerialize > scoped > supports Object.create(null) 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[1]=Symbol.iterator]:($R[2]=s=>(i,c,d,t)=>(i=0,t={[$R[1]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; exports[`null-constructor > crossSerialize > supports Object.create(null) 1`] = `"($R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])"`; -exports[`null-constructor > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`null-constructor > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[1]=Symbol.iterator]:($R[2]=s=>(i,c,d,t)=>(i=0,t={[$R[1]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`null-constructor > crossSerialize > supports self-recursion 1`] = `"($R[0]=Object.create(null),$R[0].b=$R[0].a=$R[0],$R[0])"`; exports[`null-constructor > crossSerializeAsync > scoped > supports Object.create(null) 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > supports Object.create(null) 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`null-constructor > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})})"`; -exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; +exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}))"`; exports[`null-constructor > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]=Object.assign(Object.create(null),{a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})"`; @@ -38,21 +38,21 @@ exports[`null-constructor > crossSerializeStream > scoped > supports Object.crea exports[`null-constructor > crossSerializeStream > scoped > supports Object.create(null) 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())}))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())}))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[1],$R[4]=[0,1]))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[3],$R[4]=[0,1]))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 3`] = `"($R=>_$.Se($R[1],$R[5]=[0,2]))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 3`] = `"($R=>_$.Se($R[3],$R[5]=[0,2]))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 4`] = `"($R=>_$.Se($R[1],$R[6]=[0,3]))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 4`] = `"($R=>_$.Se($R[3],$R[6]=[0,3]))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 5`] = `"($R=>_$.Se($R[1],$R[7]=[2,void 0]))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 5`] = `"($R=>_$.Se($R[3],$R[7]=[2,void 0]))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 6`] = `"($R=>_$.Sc($R[1]))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 6`] = `"($R=>_$.Sc($R[3]))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{a:$R[1]=_$.P(),b:$R[2]=_$.P()}))($R[\\"example\\"])"`; @@ -64,21 +64,21 @@ exports[`null-constructor > crossSerializeStream > supports Object.create(null) exports[`null-constructor > crossSerializeStream > supports Object.create(null) 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())})"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())})"`; -exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[1],$R[4]=[0,1])"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[3],$R[4]=[0,1])"`; -exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 3`] = `"_$.Se($R[1],$R[5]=[0,2])"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 3`] = `"_$.Se($R[3],$R[5]=[0,2])"`; -exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 4`] = `"_$.Se($R[1],$R[6]=[0,3])"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 4`] = `"_$.Se($R[3],$R[6]=[0,3])"`; -exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 5`] = `"_$.Se($R[1],$R[7]=[2,void 0])"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 5`] = `"_$.Se($R[3],$R[7]=[2,void 0])"`; -exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 6`] = `"_$.Sc($R[1])"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 6`] = `"_$.Sc($R[3])"`; exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}))"`; exports[`null-constructor > crossSerializeStream > supports self-recursion 1`] = `"$R[0]=Object.assign(Object.create(null),{a:$R[1]=_$.P(),b:$R[2]=_$.P()})"`; @@ -100,56 +100,56 @@ exports[`null-constructor > serializeAsync > supports Symbol.iterator 1`] = `"(h exports[`null-constructor > serializeAsync > supports self-recursion 1`] = `"(h=>(h=Object.assign(Object.create(null),{a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)})))()"`; -exports[`null-constructor > toCrossJSON > supports Object.create(null) 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}"`; +exports[`null-constructor > toCrossJSON > supports Object.create(null) 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0}"`; -exports[`null-constructor > toCrossJSON > supports Symbol.iterator 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}}"`; +exports[`null-constructor > toCrossJSON > supports Symbol.iterator 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0}"`; -exports[`null-constructor > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0,\\"x\\":{}}"`; +exports[`null-constructor > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0}"`; -exports[`null-constructor > toCrossJSONAsync > supports Object.create(null) 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}"`; +exports[`null-constructor > toCrossJSONAsync > supports Object.create(null) 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0}}"`; -exports[`null-constructor > toCrossJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}}"`; +exports[`null-constructor > toCrossJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0}"`; -exports[`null-constructor > toCrossJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; +exports[`null-constructor > toCrossJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":2,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":3,\\"f\\":{\\"t\\":4,\\"i\\":2}},{\\"t\\":10,\\"i\\":4,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0}}"`; -exports[`null-constructor > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0,\\"x\\":{}}"`; +exports[`null-constructor > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0}"`; exports[`null-constructor > toCrossJSONStream > supports Object.create(null) 1`] = `"{\\"t\\":28,\\"i\\":0}"`; -exports[`null-constructor > toCrossJSONStream > supports Object.create(null) 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}"`; +exports[`null-constructor > toCrossJSONStream > supports Object.create(null) 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0}}"`; -exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":31,\\"i\\":1}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":2,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":3,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":2}}}}}"`; +exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":31,\\"i\\":3}]}],\\"s\\":1},\\"o\\":0}"`; -exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 2`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":1}],\\"o\\":0}}"`; +exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 2`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":1}],\\"o\\":0}}"`; -exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 3`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":2}],\\"o\\":0}}"`; +exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 3`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":2}],\\"o\\":0}}"`; -exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 4`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; +exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 4`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; -exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 5`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":7,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":2,\\"s\\":1}],\\"o\\":0}}"`; +exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 5`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":7,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":2,\\"s\\":1}],\\"o\\":0}}"`; -exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 6`] = `"{\\"t\\":33,\\"i\\":1}"`; +exports[`null-constructor > toCrossJSONStream > supports Symbol.asyncIterator 6`] = `"{\\"t\\":33,\\"i\\":3}"`; exports[`null-constructor > toCrossJSONStream > supports Symbol.iterator 1`] = `"{\\"t\\":28,\\"i\\":0}"`; -exports[`null-constructor > toCrossJSONStream > supports Symbol.iterator 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; +exports[`null-constructor > toCrossJSONStream > supports Symbol.iterator 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":2,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":3,\\"f\\":{\\"t\\":4,\\"i\\":2}},{\\"t\\":10,\\"i\\":4,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0}}"`; -exports[`null-constructor > toCrossJSONStream > supports self-recursion 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":28,\\"i\\":1},{\\"t\\":28,\\"i\\":2}],\\"s\\":2},\\"o\\":0,\\"x\\":{}}"`; +exports[`null-constructor > toCrossJSONStream > supports self-recursion 1`] = `"{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":28,\\"i\\":1},{\\"t\\":28,\\"i\\":2}],\\"s\\":2},\\"o\\":0}"`; exports[`null-constructor > toCrossJSONStream > supports self-recursion 2`] = `"{\\"t\\":29,\\"i\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; exports[`null-constructor > toCrossJSONStream > supports self-recursion 3`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; -exports[`null-constructor > toJSON > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`null-constructor > toJSON > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`null-constructor > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; +exports[`null-constructor > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[1]}"`; -exports[`null-constructor > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`null-constructor > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; -exports[`null-constructor > toJSONAsync > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`null-constructor > toJSONAsync > supports Object.create(null) 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`null-constructor > toJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; +exports[`null-constructor > toJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[1]}"`; -exports[`null-constructor > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}},\\"f\\":16383,\\"m\\":[4]}"`; +exports[`null-constructor > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":11,\\"i\\":1,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":2,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":3,\\"f\\":{\\"t\\":4,\\"i\\":2}},{\\"t\\":10,\\"i\\":4,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[2]}"`; -exports[`null-constructor > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`null-constructor > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/object.test.ts.snap b/packages/seroval/test/__snapshots__/object.test.ts.snap index 002a870d..2d408d07 100644 --- a/packages/seroval/test/__snapshots__/object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/object.test.ts.snap @@ -2,35 +2,35 @@ exports[`objects > compat > should use manual assignment instead of Object.assign 1`] = `"({hello:\\"world\\"})"`; -exports[`objects > compat#toJSON > should use manual assignment instead of Object.assign 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16255,\\"m\\":[]}"`; +exports[`objects > compat#toJSON > should use manual assignment instead of Object.assign 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16255,\\"m\\":[]}"`; exports[`objects > compat#toJSON > should use manual assignment instead of Object.assign 2`] = `"({hello:\\"world\\"})"`; exports[`objects > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"})($R[\\"example\\"])"`; -exports[`objects > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`objects > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.iterator]:($R[2]=s=>(i,c,d,t)=>(i=0,t={[$R[1]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; exports[`objects > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],$R[0])($R[\\"example\\"])"`; exports[`objects > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.freeze($R[0]),$R[0])"`; -exports[`objects > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`objects > crossSerialize > supports Symbol.iterator 1`] = `"$R[0]={[$R[1]=Symbol.iterator]:($R[2]=s=>(i,c,d,t)=>(i=0,t={[$R[1]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})}"`; exports[`objects > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],$R[0])"`; exports[`objects > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`objects > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; -exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])})($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]={hello:\\"world\\"})"`; -exports[`objects > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`objects > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})}"`; -exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`objects > crossSerializeAsync > supports self-recursion 1`] = `"$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])}"`; @@ -38,21 +38,21 @@ exports[`objects > crossSerializeStream > scoped > supports Objects 1`] = `"($R= exports[`objects > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]={hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())})($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())})($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[1],$R[4]=[0,1]))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[3],$R[4]=[0,1]))($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 3`] = `"($R=>_$.Se($R[1],$R[5]=[0,2]))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 3`] = `"($R=>_$.Se($R[3],$R[5]=[0,2]))($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 4`] = `"($R=>_$.Se($R[1],$R[6]=[0,3]))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 4`] = `"($R=>_$.Se($R[3],$R[6]=[0,3]))($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 5`] = `"($R=>_$.Se($R[1],$R[7]=[2,void 0]))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 5`] = `"($R=>_$.Se($R[3],$R[7]=[2,void 0]))($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 6`] = `"($R=>_$.Sc($R[1]))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 6`] = `"($R=>_$.Sc($R[3]))($R[\\"example\\"])"`; exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`objects > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()})($R[\\"example\\"])"`; @@ -64,21 +64,21 @@ exports[`objects > crossSerializeStream > supports Objects 1`] = `"$R[0]=_$.P()" exports[`objects > crossSerializeStream > supports Objects 2`] = `"_$.Ps($R[0],$R[1]={hello:\\"world\\"})"`; -exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())}"`; +exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())}"`; -exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[1],$R[4]=[0,1])"`; +exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[3],$R[4]=[0,1])"`; -exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 3`] = `"_$.Se($R[1],$R[5]=[0,2])"`; +exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 3`] = `"_$.Se($R[3],$R[5]=[0,2])"`; -exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 4`] = `"_$.Se($R[1],$R[6]=[0,3])"`; +exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 4`] = `"_$.Se($R[3],$R[6]=[0,3])"`; -exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 5`] = `"_$.Se($R[1],$R[7]=[2,void 0])"`; +exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 5`] = `"_$.Se($R[3],$R[7]=[2,void 0])"`; -exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 6`] = `"_$.Sc($R[1])"`; +exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 6`] = `"_$.Sc($R[3])"`; exports[`objects > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`objects > crossSerializeStream > supports Symbol.iterator 2`] = `"_$.Ps($R[0],$R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`objects > crossSerializeStream > supports self-recursion 1`] = `"$R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()}"`; @@ -100,56 +100,56 @@ exports[`objects > serializeAsync > supports Symbol.iterator 1`] = `"(h=>(Promis exports[`objects > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)}))()"`; -exports[`objects > toCrossJSON > supports Objects 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}"`; +exports[`objects > toCrossJSON > supports Objects 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0}"`; -exports[`objects > toCrossJSON > supports Symbol.iterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}}"`; +exports[`objects > toCrossJSON > supports Symbol.iterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0}"`; -exports[`objects > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0,\\"x\\":{}}"`; +exports[`objects > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0}"`; -exports[`objects > toCrossJSONAsync > supports Objects 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}"`; +exports[`objects > toCrossJSONAsync > supports Objects 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0}}"`; -exports[`objects > toCrossJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}}"`; +exports[`objects > toCrossJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0}"`; -exports[`objects > toCrossJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; +exports[`objects > toCrossJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":2,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":3,\\"f\\":{\\"t\\":4,\\"i\\":2}},{\\"t\\":10,\\"i\\":4,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0}}"`; -exports[`objects > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0,\\"x\\":{}}"`; +exports[`objects > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0}"`; exports[`objects > toCrossJSONStream > supports Objects 1`] = `"{\\"t\\":28,\\"i\\":0}"`; -exports[`objects > toCrossJSONStream > supports Objects 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}}"`; +exports[`objects > toCrossJSONStream > supports Objects 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0}}"`; -exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":31,\\"i\\":1}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":2,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":3,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":2}}}}}"`; +exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":31,\\"i\\":3}]}],\\"s\\":1},\\"o\\":0}"`; -exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 2`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":1}],\\"o\\":0}}"`; +exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 2`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":1}],\\"o\\":0}}"`; -exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 3`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":2}],\\"o\\":0}}"`; +exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 3`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":2}],\\"o\\":0}}"`; -exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 4`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; +exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 4`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; -exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 5`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":7,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":2,\\"s\\":1}],\\"o\\":0}}"`; +exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 5`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":7,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":2,\\"s\\":1}],\\"o\\":0}}"`; -exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 6`] = `"{\\"t\\":33,\\"i\\":1}"`; +exports[`objects > toCrossJSONStream > supports Symbol.asyncIterator 6`] = `"{\\"t\\":33,\\"i\\":3}"`; exports[`objects > toCrossJSONStream > supports Symbol.iterator 1`] = `"{\\"t\\":28,\\"i\\":0}"`; -exports[`objects > toCrossJSONStream > supports Symbol.iterator 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; +exports[`objects > toCrossJSONStream > supports Symbol.iterator 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":2,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":3,\\"f\\":{\\"t\\":4,\\"i\\":2}},{\\"t\\":10,\\"i\\":4,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0}}"`; -exports[`objects > toCrossJSONStream > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":28,\\"i\\":1},{\\"t\\":28,\\"i\\":2}],\\"s\\":2},\\"o\\":0,\\"x\\":{}}"`; +exports[`objects > toCrossJSONStream > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":28,\\"i\\":1},{\\"t\\":28,\\"i\\":2}],\\"s\\":2},\\"o\\":0}"`; exports[`objects > toCrossJSONStream > supports self-recursion 2`] = `"{\\"t\\":29,\\"i\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; exports[`objects > toCrossJSONStream > supports self-recursion 3`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; -exports[`objects > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`objects > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[]}"`; -exports[`objects > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; +exports[`objects > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[1]}"`; -exports[`objects > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`objects > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; -exports[`objects > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`objects > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`objects > toJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; +exports[`objects > toJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0},\\"f\\":16383,\\"m\\":[1]}"`; -exports[`objects > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}},\\"f\\":16383,\\"m\\":[4]}"`; +exports[`objects > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":2,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":3,\\"f\\":{\\"t\\":4,\\"i\\":2}},{\\"t\\":10,\\"i\\":4,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0}},\\"f\\":16383,\\"m\\":[2]}"`; -exports[`objects > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`objects > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":0},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap index dde09f75..a1f20173 100644 --- a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap @@ -2,29 +2,29 @@ exports[`sealed object > crossSerialize > scoped > supports Objects 1`] = `"($R=>$R[0]={hello:\\"world\\"},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerialize > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.iterator]:($R[2]=s=>(i,c,d,t)=>(i=0,t={[$R[1]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerialize > scoped > supports self-recursion 1`] = `"($R=>$R[0]={},$R[0].b=$R[0].a=$R[0],Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerialize > supports Objects 1`] = `"($R[0]={hello:\\"world\\"},Object.seal($R[0]),$R[0])"`; -exports[`sealed object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[3]=Symbol.iterator]:($R[4]=s=>(i,c,d,t)=>(i=0,t={[$R[3]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; +exports[`sealed object > crossSerialize > supports Symbol.iterator 1`] = `"($R[0]={[$R[1]=Symbol.iterator]:($R[2]=s=>(i,c,d,t)=>(i=0,t={[$R[1]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R[0].b=$R[0].a=$R[0],Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])"`; -exports[`sealed object > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[3]=Symbol.asyncIterator]:($R[4]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[3]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]={v:$R[2]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; +exports[`sealed object > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; -exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; exports[`sealed object > crossSerializeAsync > supports self-recursion 1`] = `"($R[0]={a:$R[1]=Promise.resolve().then(()=>$R[0]),b:$R[2]=Promise.resolve().then(()=>$R[0])},Object.seal($R[0]),$R[0])"`; @@ -32,21 +32,21 @@ exports[`sealed object > crossSerializeStream > scoped > supports Objects 1`] = exports[`sealed object > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[1],$R[4]=[0,1]))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[3],$R[4]=[0,1]))($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 3`] = `"($R=>_$.Se($R[1],$R[5]=[0,2]))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 3`] = `"($R=>_$.Se($R[3],$R[5]=[0,2]))($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 4`] = `"($R=>_$.Se($R[1],$R[6]=[0,3]))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 4`] = `"($R=>_$.Se($R[3],$R[6]=[0,3]))($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 5`] = `"($R=>_$.Se($R[1],$R[7]=[2,void 0]))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 5`] = `"($R=>_$.Se($R[3],$R[7]=[2,void 0]))($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 6`] = `"($R=>_$.Sc($R[1]))($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 6`] = `"($R=>_$.Sc($R[3]))($R[\\"example\\"])"`; exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=_$.P())($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.iterator 2`] = `"($R=>_$.Ps($R[0],$R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeStream > scoped > supports self-recursion 1`] = `"($R=>$R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; @@ -58,21 +58,21 @@ exports[`sealed object > crossSerializeStream > supports Objects 1`] = `"$R[0]=_ exports[`sealed object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])"`; -exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[2]=Symbol.asyncIterator]:($R[3]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[2]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[1]=_$.S())},Object.seal($R[0]),$R[0])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())},Object.seal($R[0]),$R[0])"`; -exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[1],$R[4]=[0,1])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[3],$R[4]=[0,1])"`; -exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 3`] = `"_$.Se($R[1],$R[5]=[0,2])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 3`] = `"_$.Se($R[3],$R[5]=[0,2])"`; -exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 4`] = `"_$.Se($R[1],$R[6]=[0,3])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 4`] = `"_$.Se($R[3],$R[6]=[0,3])"`; -exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 5`] = `"_$.Se($R[1],$R[7]=[2,void 0])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 5`] = `"_$.Se($R[3],$R[7]=[2,void 0])"`; -exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 6`] = `"_$.Sc($R[1])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 6`] = `"_$.Sc($R[3])"`; exports[`sealed object > crossSerializeStream > supports Symbol.iterator 1`] = `"$R[0]=_$.P()"`; -exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[4]=Symbol.iterator]:($R[5]=s=>(i,c,d,t)=>(i=0,t={[$R[4]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[2]={v:$R[3]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.iterator 2`] = `"(_$.Ps($R[0],$R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; exports[`sealed object > crossSerializeStream > supports self-recursion 1`] = `"($R[0]={a:$R[1]=_$.P(),b:$R[2]=_$.P()},Object.seal($R[0]),$R[0])"`; @@ -94,56 +94,56 @@ exports[`sealed object > serializeAsync > supports Symbol.iterator 1`] = `"((h,j exports[`sealed object > serializeAsync > supports self-recursion 1`] = `"(h=>(h={a:Promise.resolve().then(()=>h),b:Promise.resolve().then(()=>h)},Object.seal(h),h))()"`; -exports[`sealed object > toCrossJSON > supports Objects 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2,\\"x\\":{}}"`; +exports[`sealed object > toCrossJSON > supports Objects 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2}"`; -exports[`sealed object > toCrossJSON > supports Symbol.iterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}}"`; +exports[`sealed object > toCrossJSON > supports Symbol.iterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":2}"`; -exports[`sealed object > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":2,\\"x\\":{}}"`; +exports[`sealed object > toCrossJSON > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":2}"`; -exports[`sealed object > toCrossJSONAsync > supports Objects 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2,\\"x\\":{}}}"`; +exports[`sealed object > toCrossJSONAsync > supports Objects 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2}}"`; -exports[`sealed object > toCrossJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}}"`; +exports[`sealed object > toCrossJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":2}"`; -exports[`sealed object > toCrossJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; +exports[`sealed object > toCrossJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":2,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":3,\\"f\\":{\\"t\\":4,\\"i\\":2}},{\\"t\\":10,\\"i\\":4,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":2}}"`; -exports[`sealed object > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":2,\\"x\\":{}}"`; +exports[`sealed object > toCrossJSONAsync > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":2}"`; exports[`sealed object > toCrossJSONStream > supports Objects 1`] = `"{\\"t\\":28,\\"i\\":0}"`; -exports[`sealed object > toCrossJSONStream > supports Objects 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2,\\"x\\":{}}}"`; +exports[`sealed object > toCrossJSONStream > supports Objects 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2}}"`; -exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":31,\\"i\\":1}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":2,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":3,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":2}}}}}"`; +exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":31,\\"i\\":3}]}],\\"s\\":1},\\"o\\":2}"`; -exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 2`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":1}],\\"o\\":0}}"`; +exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 2`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":4,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":1}],\\"o\\":0}}"`; -exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 3`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":2}],\\"o\\":0}}"`; +exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 3`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":2}],\\"o\\":0}}"`; -exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 4`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; +exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 4`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":3}],\\"o\\":0}}"`; -exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 5`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":9,\\"i\\":7,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":2,\\"s\\":1}],\\"o\\":0}}"`; +exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 5`] = `"{\\"t\\":32,\\"i\\":3,\\"f\\":{\\"t\\":9,\\"i\\":7,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":2},{\\"t\\":2,\\"s\\":1}],\\"o\\":0}}"`; -exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 6`] = `"{\\"t\\":33,\\"i\\":1}"`; +exports[`sealed object > toCrossJSONStream > supports Symbol.asyncIterator 6`] = `"{\\"t\\":33,\\"i\\":3}"`; exports[`sealed object > toCrossJSONStream > supports Symbol.iterator 1`] = `"{\\"t\\":28,\\"i\\":0}"`; -exports[`sealed object > toCrossJSONStream > supports Symbol.iterator 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}}"`; +exports[`sealed object > toCrossJSONStream > supports Symbol.iterator 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":2,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":3,\\"f\\":{\\"t\\":4,\\"i\\":2}},{\\"t\\":10,\\"i\\":4,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":2}}"`; -exports[`sealed object > toCrossJSONStream > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":28,\\"i\\":1},{\\"t\\":28,\\"i\\":2}],\\"s\\":2},\\"o\\":2,\\"x\\":{}}"`; +exports[`sealed object > toCrossJSONStream > supports self-recursion 1`] = `"{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":28,\\"i\\":1},{\\"t\\":28,\\"i\\":2}],\\"s\\":2},\\"o\\":2}"`; exports[`sealed object > toCrossJSONStream > supports self-recursion 2`] = `"{\\"t\\":29,\\"i\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; exports[`sealed object > toCrossJSONStream > supports self-recursion 3`] = `"{\\"t\\":29,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":0}}"`; -exports[`sealed object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2,\\"x\\":{}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`sealed object > toJSON > supports Objects 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2},\\"f\\":16383,\\"m\\":[]}"`; -exports[`sealed object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; +exports[`sealed object > toJSON > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":2},\\"f\\":16383,\\"m\\":[1]}"`; -exports[`sealed object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":2,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`sealed object > toJSON > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":4,\\"i\\":0},{\\"t\\":4,\\"i\\":0}],\\"s\\":2},\\"o\\":2},\\"f\\":16383,\\"m\\":[0]}"`; -exports[`sealed object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`sealed object > toJSONAsync > supports Objects 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"hello\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"world\\"}],\\"s\\":1},\\"o\\":2}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`sealed object > toJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[1],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"3\\":{\\"t\\":17,\\"i\\":3,\\"s\\":0},\\"4\\":{\\"t\\":43,\\"i\\":4,\\"x\\":{\\"3\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":16383,\\"m\\":[3]}"`; +exports[`sealed object > toJSONAsync > supports Symbol.asyncIterator 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":0}],\\"v\\":[{\\"t\\":45,\\"a\\":[{\\"t\\":44,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":2},\\"f\\":16383,\\"m\\":[1]}"`; -exports[`sealed object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":2,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":4,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":5,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":4}}}}}},\\"f\\":16383,\\"m\\":[4]}"`; +exports[`sealed object > toJSONAsync > supports Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":2,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":3,\\"f\\":{\\"t\\":4,\\"i\\":2}},{\\"t\\":10,\\"i\\":4,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":2}},\\"f\\":16383,\\"m\\":[2]}"`; -exports[`sealed object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":2,\\"x\\":{}},\\"f\\":16383,\\"m\\":[0]}"`; +exports[`sealed object > toJSONAsync > supports self-recursion 1`] = `"{\\"t\\":{\\"t\\":10,\\"i\\":0,\\"p\\":{\\"k\\":[\\"a\\",\\"b\\"],\\"v\\":[{\\"t\\":12,\\"i\\":1,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}},{\\"t\\":12,\\"i\\":2,\\"s\\":1,\\"f\\":{\\"t\\":4,\\"i\\":0}}],\\"s\\":2},\\"o\\":2},\\"f\\":16383,\\"m\\":[0]}"`; diff --git a/packages/seroval/test/__snapshots__/set.test.ts.snap b/packages/seroval/test/__snapshots__/set.test.ts.snap index 2294ffa6..3332979a 100644 --- a/packages/seroval/test/__snapshots__/set.test.ts.snap +++ b/packages/seroval/test/__snapshots__/set.test.ts.snap @@ -4,7 +4,7 @@ exports[`Set > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.a exports[`Set > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; -exports[`Set > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[0],\\"v\\":[{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":2,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}],\\"s\\":1},\\"o\\":0,\\"x\\":{\\"1\\":{\\"t\\":17,\\"i\\":3,\\"s\\":3},\\"2\\":{\\"t\\":42,\\"i\\":4,\\"x\\":{\\"1\\":{\\"t\\":4,\\"i\\":3}}}}},\\"f\\":15871,\\"m\\":[3]}"`; +exports[`Set > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0},\\"f\\":15871,\\"m\\":[1]}"`; exports[`Set > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; diff --git a/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap index 61ddb7b7..fe6c5447 100644 --- a/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/custom-event.test.ts.snap @@ -20,14 +20,14 @@ exports[`CustomEvent > serialize > supports CustomEvent 1`] = `"((h,j)=>(j=new C exports[`CustomEvent > serializeAsync > supports CustomEvent 1`] = `"((h,j)=>(j=Promise.resolve(new CustomEvent(\\"example\\",{detail:h={},bubbles:!1,cancelable:!1,composed:!1})),h.self=h,j))()"`; -exports[`CustomEvent > toCrossJSON > supports CustomEvent 1`] = `"{\\"t\\":38,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":2}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0,\\"x\\":{}}}"`; +exports[`CustomEvent > toCrossJSON > supports CustomEvent 1`] = `"{\\"t\\":38,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":2}],\\"s\\":1},\\"o\\":0},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0}}"`; -exports[`CustomEvent > toCrossJSONAsync > supports CustomEvent 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":38,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":3}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0,\\"x\\":{}}}}"`; +exports[`CustomEvent > toCrossJSONAsync > supports CustomEvent 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":38,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":3}],\\"s\\":1},\\"o\\":0},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0}}}"`; exports[`CustomEvent > toCrossJSONStream > supports CustomEvent 1`] = `"{\\"t\\":28,\\"i\\":0}"`; -exports[`CustomEvent > toCrossJSONStream > supports CustomEvent 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":38,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":3}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0,\\"x\\":{}}}}"`; +exports[`CustomEvent > toCrossJSONStream > supports CustomEvent 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":38,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":3}],\\"s\\":1},\\"o\\":0},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0}}}"`; -exports[`CustomEvent > toJSON > supports CustomEvent 1`] = `"{\\"t\\":{\\"t\\":38,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":2}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[2]}"`; +exports[`CustomEvent > toJSON > supports CustomEvent 1`] = `"{\\"t\\":{\\"t\\":38,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":2}],\\"s\\":1},\\"o\\":0},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0}},\\"f\\":16383,\\"m\\":[2]}"`; -exports[`CustomEvent > toJSONAsync > supports CustomEvent 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":38,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":3}],\\"s\\":1},\\"o\\":0,\\"x\\":{}},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0,\\"x\\":{}}}},\\"f\\":16383,\\"m\\":[3]}"`; +exports[`CustomEvent > toJSONAsync > supports CustomEvent 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":38,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"detail\\",\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"self\\"],\\"v\\":[{\\"t\\":4,\\"i\\":3}],\\"s\\":1},\\"o\\":0},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":4},\\"o\\":0}}},\\"f\\":16383,\\"m\\":[3]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap index 1989aed2..40c4f8bc 100644 --- a/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/event.test.ts.snap @@ -20,14 +20,14 @@ exports[`Event > serialize > supports Event 1`] = `"new Event(\\"example\\",{bub exports[`Event > serializeAsync > supports Event 1`] = `"Promise.resolve(new Event(\\"example\\",{bubbles:!1,cancelable:!1,composed:!1}))"`; -exports[`Event > toCrossJSON > supports Event 1`] = `"{\\"t\\":37,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}}"`; +exports[`Event > toCrossJSON > supports Event 1`] = `"{\\"t\\":37,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0}}"`; -exports[`Event > toCrossJSONAsync > supports Event 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":37,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}}}"`; +exports[`Event > toCrossJSONAsync > supports Event 1`] = `"{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":37,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0}}}"`; exports[`Event > toCrossJSONStream > supports Event 1`] = `"{\\"t\\":28,\\"i\\":0}"`; -exports[`Event > toCrossJSONStream > supports Event 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":37,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}}}"`; +exports[`Event > toCrossJSONStream > supports Event 2`] = `"{\\"t\\":29,\\"i\\":0,\\"f\\":{\\"t\\":37,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0}}}"`; -exports[`Event > toJSON > supports Event 1`] = `"{\\"t\\":{\\"t\\":37,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Event > toJSON > supports Event 1`] = `"{\\"t\\":{\\"t\\":37,\\"i\\":0,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Event > toJSONAsync > supports Event 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":37,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Event > toJSONAsync > supports Event 1`] = `"{\\"t\\":{\\"t\\":12,\\"i\\":0,\\"s\\":1,\\"f\\":{\\"t\\":37,\\"i\\":1,\\"s\\":\\"example\\",\\"f\\":{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"bubbles\\",\\"cancelable\\",\\"composed\\"],\\"v\\":[{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3},{\\"t\\":2,\\"s\\":3}],\\"s\\":3},\\"o\\":0}}},\\"f\\":16383,\\"m\\":[]}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap index 9ca78866..2f7fd718 100644 --- a/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap @@ -28,137 +28,15 @@ exports[`ReadableStream > crossSerializeStream > supports ReadableStream errors exports[`ReadableStream > crossSerializeStream > supports ReadableStream errors 2`] = `"_$.St($R[0],$R[1]=Object.assign(new Error(\\"Oops!\\"),{stack:\\"\\"}))"`; -exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 1`] = ` -{ - "a": undefined, - "b": undefined, - "c": undefined, - "e": undefined, - "f": undefined, - "i": 0, - "l": undefined, - "m": undefined, - "o": undefined, - "p": undefined, - "s": undefined, - "t": 31, - "x": undefined, -} -`; - -exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 2`] = ` -{ - "a": undefined, - "b": undefined, - "c": undefined, - "e": undefined, - "f": { - "a": undefined, - "b": undefined, - "c": undefined, - "e": undefined, - "f": undefined, - "i": undefined, - "l": undefined, - "m": undefined, - "o": undefined, - "p": undefined, - "s": "foo", - "t": 1, - "x": undefined, - }, - "i": 0, - "l": undefined, - "m": undefined, - "o": undefined, - "p": undefined, - "s": undefined, - "t": 32, - "x": undefined, -} -`; - -exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 3`] = ` -{ - "a": undefined, - "b": undefined, - "c": undefined, - "e": undefined, - "f": { - "a": undefined, - "b": undefined, - "c": undefined, - "e": undefined, - "f": undefined, - "i": undefined, - "l": undefined, - "m": undefined, - "o": undefined, - "p": undefined, - "s": "bar", - "t": 1, - "x": undefined, - }, - "i": 0, - "l": undefined, - "m": undefined, - "o": undefined, - "p": undefined, - "s": undefined, - "t": 32, - "x": undefined, -} -`; - -exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 4`] = ` -{ - "a": undefined, - "b": undefined, - "c": undefined, - "e": undefined, - "f": { - "a": undefined, - "b": undefined, - "c": undefined, - "e": undefined, - "f": undefined, - "i": undefined, - "l": undefined, - "m": undefined, - "o": undefined, - "p": undefined, - "s": "baz", - "t": 1, - "x": undefined, - }, - "i": 0, - "l": undefined, - "m": undefined, - "o": undefined, - "p": undefined, - "s": undefined, - "t": 32, - "x": undefined, -} -`; - -exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 5`] = ` -{ - "a": undefined, - "b": undefined, - "c": undefined, - "e": undefined, - "f": undefined, - "i": 0, - "l": undefined, - "m": undefined, - "o": undefined, - "p": undefined, - "s": undefined, - "t": 33, - "x": undefined, -} -`; +exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 1`] = `"{\\"t\\":31,\\"i\\":0}"`; + +exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 2`] = `"{\\"t\\":32,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"foo\\"}}"`; + +exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 3`] = `"{\\"t\\":32,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"bar\\"}}"`; + +exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 4`] = `"{\\"t\\":32,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"baz\\"}}"`; + +exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 5`] = `"{\\"t\\":33,\\"i\\":0}"`; exports[`ReadableStream > toCrossJSONStream > supports ReadableStream errors 1`] = `"{\\"t\\":31,\\"i\\":0}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap index 3d9d2f77..6a1366cf 100644 --- a/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/request.test.ts.snap @@ -18,12 +18,12 @@ exports[`Request > crossSerializeStream > supports Request 3`] = `"_$.Sc($R[2])" exports[`Request > serializeAsync > supports Request 1`] = `"new Request(\\"http://localhost:3000/\\",{body:new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,cache:\\"default\\",credentials:\\"same-origin\\",headers:new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),integrity:\\"\\",keepalive:!1,method:\\"POST\\",mode:\\"cors\\",redirect:\\"follow\\",referrer:\\"about:client\\",referrerPolicy:\\"\\"})"`; -exports[`Request > toCrossJSONStream > supports Request 1`] = `"{\\"t\\":35,\\"i\\":0,\\"s\\":\\"http://localhost:3000/\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"body\\",\\"cache\\",\\"credentials\\",\\"headers\\",\\"integrity\\",\\"keepalive\\",\\"method\\",\\"mode\\",\\"redirect\\",\\"referrer\\",\\"referrerPolicy\\"],\\"v\\":[{\\"t\\":31,\\"i\\":2},{\\"t\\":1,\\"s\\":\\"default\\"},{\\"t\\":1,\\"s\\":\\"same-origin\\"},{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":2,\\"s\\":3},{\\"t\\":1,\\"s\\":\\"POST\\"},{\\"t\\":1,\\"s\\":\\"cors\\"},{\\"t\\":1,\\"s\\":\\"follow\\"},{\\"t\\":1,\\"s\\":\\"about:client\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":11},\\"o\\":0,\\"x\\":{}}}"`; +exports[`Request > toCrossJSONStream > supports Request 1`] = `"{\\"t\\":35,\\"i\\":0,\\"s\\":\\"http://localhost:3000/\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"body\\",\\"cache\\",\\"credentials\\",\\"headers\\",\\"integrity\\",\\"keepalive\\",\\"method\\",\\"mode\\",\\"redirect\\",\\"referrer\\",\\"referrerPolicy\\"],\\"v\\":[{\\"t\\":31,\\"i\\":2},{\\"t\\":1,\\"s\\":\\"default\\"},{\\"t\\":1,\\"s\\":\\"same-origin\\"},{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":2,\\"s\\":3},{\\"t\\":1,\\"s\\":\\"POST\\"},{\\"t\\":1,\\"s\\":\\"cors\\"},{\\"t\\":1,\\"s\\":\\"follow\\"},{\\"t\\":1,\\"s\\":\\"about:client\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":11},\\"o\\":0}}"`; exports[`Request > toCrossJSONStream > supports Request 2`] = `"{\\"t\\":32,\\"i\\":2,\\"f\\":{\\"t\\":15,\\"i\\":4,\\"l\\":12,\\"c\\":\\"Uint8Array\\",\\"f\\":{\\"t\\":21,\\"i\\":5,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},\\"b\\":0}}"`; exports[`Request > toCrossJSONStream > supports Request 3`] = `"{\\"t\\":33,\\"i\\":2}"`; -exports[`Request > toJSONAsync > supports Request 1`] = `"{\\"t\\":{\\"t\\":35,\\"i\\":0,\\"s\\":\\"http://localhost:3000/\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"body\\",\\"cache\\",\\"credentials\\",\\"headers\\",\\"integrity\\",\\"keepalive\\",\\"method\\",\\"mode\\",\\"redirect\\",\\"referrer\\",\\"referrerPolicy\\"],\\"v\\":[{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":1,\\"s\\":\\"default\\"},{\\"t\\":1,\\"s\\":\\"same-origin\\"},{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":2,\\"s\\":3},{\\"t\\":1,\\"s\\":\\"POST\\"},{\\"t\\":1,\\"s\\":\\"cors\\"},{\\"t\\":1,\\"s\\":\\"follow\\"},{\\"t\\":1,\\"s\\":\\"about:client\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":11},\\"o\\":0,\\"x\\":{}}},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Request > toJSONAsync > supports Request 1`] = `"{\\"t\\":{\\"t\\":35,\\"i\\":0,\\"s\\":\\"http://localhost:3000/\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"body\\",\\"cache\\",\\"credentials\\",\\"headers\\",\\"integrity\\",\\"keepalive\\",\\"method\\",\\"mode\\",\\"redirect\\",\\"referrer\\",\\"referrerPolicy\\"],\\"v\\":[{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":1,\\"s\\":\\"default\\"},{\\"t\\":1,\\"s\\":\\"same-origin\\"},{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":2,\\"s\\":3},{\\"t\\":1,\\"s\\":\\"POST\\"},{\\"t\\":1,\\"s\\":\\"cors\\"},{\\"t\\":1,\\"s\\":\\"follow\\"},{\\"t\\":1,\\"s\\":\\"about:client\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":11},\\"o\\":0}},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Request > toJSONAsync > supports Request 2`] = `"{\\"t\\":35,\\"i\\":0,\\"s\\":\\"http://localhost:3000/\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"body\\",\\"cache\\",\\"credentials\\",\\"headers\\",\\"integrity\\",\\"keepalive\\",\\"method\\",\\"mode\\",\\"redirect\\",\\"referrer\\",\\"referrerPolicy\\"],\\"v\\":[{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":1,\\"s\\":\\"default\\"},{\\"t\\":1,\\"s\\":\\"same-origin\\"},{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":2,\\"s\\":3},{\\"t\\":1,\\"s\\":\\"POST\\"},{\\"t\\":1,\\"s\\":\\"cors\\"},{\\"t\\":1,\\"s\\":\\"follow\\"},{\\"t\\":1,\\"s\\":\\"about:client\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":11},\\"o\\":0,\\"x\\":{}}}"`; +exports[`Request > toJSONAsync > supports Request 2`] = `"{\\"t\\":35,\\"i\\":0,\\"s\\":\\"http://localhost:3000/\\",\\"f\\":{\\"t\\":10,\\"i\\":1,\\"p\\":{\\"k\\":[\\"body\\",\\"cache\\",\\"credentials\\",\\"headers\\",\\"integrity\\",\\"keepalive\\",\\"method\\",\\"mode\\",\\"redirect\\",\\"referrer\\",\\"referrerPolicy\\"],\\"v\\":[{\\"t\\":21,\\"i\\":2,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":1,\\"s\\":\\"default\\"},{\\"t\\":1,\\"s\\":\\"same-origin\\"},{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":1,\\"s\\":\\"\\"},{\\"t\\":2,\\"s\\":3},{\\"t\\":1,\\"s\\":\\"POST\\"},{\\"t\\":1,\\"s\\":\\"cors\\"},{\\"t\\":1,\\"s\\":\\"follow\\"},{\\"t\\":1,\\"s\\":\\"about:client\\"},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":11},\\"o\\":0}}"`; diff --git a/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap index c722ccd6..bf081b31 100644 --- a/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/response.test.ts.snap @@ -18,12 +18,12 @@ exports[`Response > crossSerializeStream > supports Response 3`] = `"_$.Sc($R[1] exports[`Response > serializeAsync > supports Response 1`] = `"new Response(new Uint8Array([72,101,108,108,111,32,87,111,114,108,100,33]).buffer,{headers:new Headers({\\"content-type\\":\\"text/plain;charset=UTF-8\\"}),status:200,statusText:\\"\\"})"`; -exports[`Response > toCrossJSONStream > supports Response 1`] = `"{\\"t\\":36,\\"i\\":0,\\"a\\":[{\\"t\\":31,\\"i\\":1},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"headers\\",\\"status\\",\\"statusText\\"],\\"v\\":[{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":0,\\"s\\":200},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}]}"`; +exports[`Response > toCrossJSONStream > supports Response 1`] = `"{\\"t\\":36,\\"i\\":0,\\"a\\":[{\\"t\\":31,\\"i\\":1},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"headers\\",\\"status\\",\\"statusText\\"],\\"v\\":[{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":0,\\"s\\":200},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":3},\\"o\\":0}]}"`; exports[`Response > toCrossJSONStream > supports Response 2`] = `"{\\"t\\":32,\\"i\\":1,\\"f\\":{\\"t\\":15,\\"i\\":4,\\"l\\":12,\\"c\\":\\"Uint8Array\\",\\"f\\":{\\"t\\":21,\\"i\\":5,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},\\"b\\":0}}"`; exports[`Response > toCrossJSONStream > supports Response 3`] = `"{\\"t\\":33,\\"i\\":1}"`; -exports[`Response > toJSONAsync > supports Response 1`] = `"{\\"t\\":{\\"t\\":36,\\"i\\":0,\\"a\\":[{\\"t\\":21,\\"i\\":1,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"headers\\",\\"status\\",\\"statusText\\"],\\"v\\":[{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":0,\\"s\\":200},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}]},\\"f\\":16383,\\"m\\":[]}"`; +exports[`Response > toJSONAsync > supports Response 1`] = `"{\\"t\\":{\\"t\\":36,\\"i\\":0,\\"a\\":[{\\"t\\":21,\\"i\\":1,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"headers\\",\\"status\\",\\"statusText\\"],\\"v\\":[{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":0,\\"s\\":200},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":3},\\"o\\":0}]},\\"f\\":16383,\\"m\\":[]}"`; -exports[`Response > toJSONAsync > supports Response 2`] = `"{\\"t\\":36,\\"i\\":0,\\"a\\":[{\\"t\\":21,\\"i\\":1,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"headers\\",\\"status\\",\\"statusText\\"],\\"v\\":[{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":0,\\"s\\":200},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":3},\\"o\\":0,\\"x\\":{}}]}"`; +exports[`Response > toJSONAsync > supports Response 2`] = `"{\\"t\\":36,\\"i\\":0,\\"a\\":[{\\"t\\":21,\\"i\\":1,\\"s\\":[72,101,108,108,111,32,87,111,114,108,100,33]},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"headers\\",\\"status\\",\\"statusText\\"],\\"v\\":[{\\"t\\":25,\\"i\\":3,\\"e\\":{\\"k\\":[\\"content-type\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"text/plain;charset=UTF-8\\"}],\\"s\\":1}},{\\"t\\":0,\\"s\\":200},{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":3},\\"o\\":0}]}"`; diff --git a/packages/seroval/test/web-api/readable-stream.test.ts b/packages/seroval/test/web-api/readable-stream.test.ts index e0d6eac8..35cbf48b 100644 --- a/packages/seroval/test/web-api/readable-stream.test.ts +++ b/packages/seroval/test/web-api/readable-stream.test.ts @@ -104,7 +104,7 @@ describe('ReadableStream', () => { }); toCrossJSONStream(example, { onParse(data) { - expect(data).toMatchSnapshot(); + expect(JSON.stringify(data)).toMatchSnapshot(); }, onDone() { resolve(); From dab428ac739433aaf04c7f055fc805fb0539c730 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Sat, 18 Nov 2023 15:53:54 +0800 Subject: [PATCH 73/82] Add support for ReadableStream in async mode --- packages/seroval/src/core/context/parser.ts | 29 +------ .../seroval/src/core/context/parser/async.ts | 8 +- .../seroval/src/core/context/parser/sync.ts | 4 +- .../seroval/src/core/context/serializer.ts | 83 +++++++++++++++---- packages/seroval/src/core/cross/serializer.ts | 19 ++--- packages/seroval/src/core/tree/serializer.ts | 3 +- packages/seroval/src/core/types.ts | 6 +- .../seroval/src/core/utils/function-string.ts | 29 ------- .../src/core/utils/iterator-to-sequence.ts | 18 ++++ packages/seroval/src/core/web-api.ts | 27 +++++- .../__snapshots__/async-iterable.test.ts.snap | 8 +- .../__snapshots__/frozen-object.test.ts.snap | 8 +- .../null-constructor.test.ts.snap | 8 +- .../test/__snapshots__/object.test.ts.snap | 8 +- .../__snapshots__/sealed-object.test.ts.snap | 8 +- 15 files changed, 152 insertions(+), 114 deletions(-) delete mode 100644 packages/seroval/src/core/utils/function-string.ts diff --git a/packages/seroval/src/core/context/parser.ts b/packages/seroval/src/core/context/parser.ts index 53dd3848..41a48457 100644 --- a/packages/seroval/src/core/context/parser.ts +++ b/packages/seroval/src/core/context/parser.ts @@ -30,7 +30,6 @@ import type { SerovalObjectNode, SerovalObjectRecordNode, SerovalReadableStreamFactoryNode, - SerovalReadableStreamNode, SerovalReferenceNode, SerovalWKSymbolNode, } from '../types'; @@ -232,9 +231,9 @@ export abstract class BaseParserContext implements PluginAccessOptions { }; } - protected parseReadableStreamFactory( - items: SerovalNode, - ): SerovalIndexedValueNode | SerovalReadableStreamFactoryNode { + protected parseReadableStreamFactory(): ( + SerovalIndexedValueNode | SerovalReadableStreamFactoryNode + ) { const registeredID = this.refs.get(READABLE_STREAM); if (registeredID != null) { this.markRef(registeredID); @@ -252,27 +251,7 @@ export abstract class BaseParserContext implements PluginAccessOptions { p: undefined, e: undefined, a: undefined, - f: items, - b: undefined, - o: undefined, - }; - } - - protected createReadableStreamNode( - id: number, - items: SerovalNode, - ): SerovalReadableStreamNode { - return { - t: SerovalNodeType.ReadableStream, - i: id, - s: undefined, - l: undefined, - c: undefined, - m: undefined, - p: undefined, - e: undefined, - a: undefined, - f: this.parseReadableStreamFactory(items), + f: undefined, b: undefined, o: undefined, }; diff --git a/packages/seroval/src/core/context/parser/async.ts b/packages/seroval/src/core/context/parser/async.ts index 06b7012e..36a9216b 100644 --- a/packages/seroval/src/core/context/parser/async.ts +++ b/packages/seroval/src/core/context/parser/async.ts @@ -77,7 +77,8 @@ import { createURLSearchParamsNode, createDOMExceptionNode, createEventNode, - createCustomEVentNode, + createCustomEventNode, + createReadableStreamNode, } from '../../web-api'; type ObjectLikeNode = @@ -420,7 +421,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { id: number, current: CustomEvent, ): Promise { - return createCustomEVentNode( + return createCustomEventNode( id, current.type, await this.parse(createCustomEventOptions(current)), @@ -474,8 +475,9 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { id: number, current: ReadableStream, ): Promise { - return this.createReadableStreamNode( + return createReadableStreamNode( id, + this.parseReadableStreamFactory(), await this.parse( await readableStreamToSequence(current), ), diff --git a/packages/seroval/src/core/context/parser/sync.ts b/packages/seroval/src/core/context/parser/sync.ts index b4b4c267..f90929a4 100644 --- a/packages/seroval/src/core/context/parser/sync.ts +++ b/packages/seroval/src/core/context/parser/sync.ts @@ -63,7 +63,7 @@ import type { SerovalDataViewNode, } from '../../types'; import { - createCustomEVentNode, + createCustomEventNode, createDOMExceptionNode, createEventNode, createURLNode, @@ -311,7 +311,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { id: number, current: CustomEvent, ): SerovalCustomEventNode { - return createCustomEVentNode(id, current.type, this.parse(createCustomEventOptions(current))); + return createCustomEventNode(id, current.type, this.parse(createCustomEventOptions(current))); } protected parsePlugin( diff --git a/packages/seroval/src/core/context/serializer.ts b/packages/seroval/src/core/context/serializer.ts index b164187c..fb6ad9e4 100644 --- a/packages/seroval/src/core/context/serializer.ts +++ b/packages/seroval/src/core/context/serializer.ts @@ -6,7 +6,6 @@ import { SerovalNodeType, SerovalObjectFlags, } from '../constants'; -import { createEffectfulFunction, createFunction } from '../utils/function-string'; import { REFERENCES_KEY } from '../keys'; import type { Plugin, PluginAccessOptions, SerovalMode } from '../plugin'; import type { @@ -55,6 +54,8 @@ import type { SerovalIteratorFactoryNode, SerovalAsyncIteratorFactoryInstanceNode, SerovalAsyncIteratorFactoryNode, + SerovalReadableStreamNode, + SerovalReadableStreamFactoryNode, } from '../types'; import { isValidIdentifier } from '../utils/is-valid-identifier'; @@ -242,6 +243,32 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio abstract readonly mode: SerovalMode; + protected createFunction( + parameters: string[], + body: string, + ): string { + if (this.features & Feature.ArrowFunction) { + const joined = parameters.length === 1 + ? parameters[0] + : '(' + parameters.join(',') + ')'; + return joined + '=>' + body; + } + return 'function(' + parameters.join(',') + '){return ' + body + '}'; + } + + protected createEffectfulFunction( + parameters: string[], + body: string, + ): string { + if (this.features & Feature.ArrowFunction) { + const joined = parameters.length === 1 + ? parameters[0] + : '(' + parameters.join(',') + ')'; + return joined + '=>{' + body + '}'; + } + return 'function(' + parameters.join(',') + '){' + body + '}'; + } + /** * A tiny function that tells if a reference * is to be accessed. This is a requirement for @@ -796,8 +823,8 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio const ref = this.getRefParam((fulfilled as SerovalIndexedValueNode).i); serialized = constructor + ( node.s - ? '().then(' + createFunction(this.features, [], ref) + ')' - : '().catch(' + createEffectfulFunction(this.features, [], 'throw ' + ref) + ')' + ? '().then(' + this.createFunction([], ref) + ')' + : '().catch(' + this.createEffectfulFunction([], 'throw ' + ref) + ')' ); } else { this.stack.push(id); @@ -997,14 +1024,12 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio protected serializeIteratorFactory(node: SerovalIteratorFactoryNode): string { return this.assignIndexedValue( node.i, - createFunction( - this.features, + this.createFunction( ['s'], - createFunction( - this.features, + this.createFunction( ['i', 'c', 'd', 't'], - '(i=0,t={[' + this.serialize(node.f) + ']:' + createFunction(this.features, [], 't') + ',' - + 'next:' + createEffectfulFunction(this.features, [], 'if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}') + '})', + '(i=0,t={[' + this.serialize(node.f) + ']:' + this.createFunction([], 't') + ',' + + 'next:' + this.createEffectfulFunction([], 'if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}') + '})', ), ), ); @@ -1019,18 +1044,14 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio protected serializeAsyncIteratorFactory(node: SerovalAsyncIteratorFactoryNode): string { return this.assignIndexedValue( node.i, - createFunction( - this.features, + this.createFunction( ['s'], - createFunction( - this.features, + this.createFunction( ['i', 't'], - '(i=0,t={[' + this.serialize(node.f) + ']:' + createFunction(this.features, [], 't') + ',' - + 'next:' + createFunction( - this.features, + '(i=0,t={[' + this.serialize(node.f) + ']:' + this.createFunction([], 't') + ',' + + 'next:' + this.createFunction( [], - 'Promise.resolve().then(' + createEffectfulFunction( - this.features, + 'Promise.resolve().then(' + this.createEffectfulFunction( ['c', 'd'], 'if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}', ) + ')', @@ -1046,6 +1067,30 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio return '(' + this.serialize(node.a[0]) + ')(' + this.serialize(node.a[1]) + ')'; } + protected serializeReadableStream( + node: SerovalReadableStreamNode, + ): string { + return this.assignIndexedValue( + node.i, + '(' + this.serialize(node.a[0]) + ')(' + this.serialize(node.a[1]) + ')', + ); + } + + protected serializeReadableStreamFactory( + node: SerovalReadableStreamFactoryNode, + ): string { + return this.assignIndexedValue( + node.i, + this.createFunction( + ['s'], + 'new ReadableStream({start:' + this.createEffectfulFunction( + ['c', 'i', 'v'], + 'for(i=0;i' + body; - } - return 'function(' + parameters.join(',') + '){return ' + body + '}'; -} - -export function createEffectfulFunction( - features: number, - parameters: string[], - body: string, -): string { - if (features & Feature.ArrowFunction) { - const joined = parameters.length === 1 - ? parameters[0] - : '(' + parameters.join(',') + ')'; - return joined + '=>{' + body + '}'; - } - return 'function(' + parameters.join(',') + '){' + body + '}'; -} diff --git a/packages/seroval/src/core/utils/iterator-to-sequence.ts b/packages/seroval/src/core/utils/iterator-to-sequence.ts index 92d4a348..7f8a0848 100644 --- a/packages/seroval/src/core/utils/iterator-to-sequence.ts +++ b/packages/seroval/src/core/utils/iterator-to-sequence.ts @@ -220,3 +220,21 @@ export async function readableStreamToSequence( d: doneAt, }; } + +export function sequenceToReadableStream( + sequence: Sequence, +): ReadableStream { + return new ReadableStream({ + start(controller): void { + for (let i = 0; i <= sequence.d; i++) { + const value = sequence.v[i]; + if (i === sequence.t) { + controller.error(value); + } else { + controller.enqueue(value as T); + } + } + controller.close(); + }, + }); +} diff --git a/packages/seroval/src/core/web-api.ts b/packages/seroval/src/core/web-api.ts index e0cad5c1..ff093a03 100644 --- a/packages/seroval/src/core/web-api.ts +++ b/packages/seroval/src/core/web-api.ts @@ -5,6 +5,7 @@ import type { SerovalDOMExceptionNode, SerovalEventNode, SerovalNode, + SerovalReadableStreamNode, SerovalURLNode, SerovalURLSearchParamsNode, } from './types'; @@ -90,7 +91,7 @@ export function createEventNode( }; } -export function createCustomEVentNode( +export function createCustomEventNode( id: number, type: string, options: SerovalNode, @@ -110,3 +111,27 @@ export function createCustomEVentNode( o: undefined, }; } + +export function createReadableStreamNode( + id: number, + factory: SerovalNode, + items: SerovalNode, +): SerovalReadableStreamNode { + return { + t: SerovalNodeType.ReadableStream, + i: id, + s: undefined, + l: undefined, + c: undefined, + m: undefined, + p: undefined, + e: undefined, + a: [ + factory, + items, + ], + f: undefined, + b: undefined, + o: undefined, + }; +} diff --git a/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap b/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap index 00173f71..690dcd96 100644 --- a/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap +++ b/packages/seroval/test/__snapshots__/async-iterable.test.ts.snap @@ -6,11 +6,11 @@ exports[`AsyncIterable > compat#toJSONAsync > should use function expression ins exports[`AsyncIterable > compat#toJSONAsync > should use function expression instead of arrow functions. 2`] = `"(function(h){return ({title:\\"Hello World\\",[h=Symbol.asyncIterator]:(function(s){return function(i,t){return (i=0,t={[h]:function(){return t},next:function(){return Promise.resolve().then(function(c,d){if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}})}})}})({v:[1,2,3,void 0],t:-1,d:3})})})()"`; -exports[`AsyncIterable > crossSerializeAsync > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeAsync > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeAsync > supports AsyncIterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`AsyncIterable > crossSerializeAsync > supports AsyncIterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})}"`; -exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())})($R[\\"example\\"])"`; +exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 1`] = `"($R=>$R[0]={title:\\"Hello World\\",[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())})($R[\\"example\\"])"`; exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 2`] = `"($R=>_$.Se($R[3],$R[4]=[0,1]))($R[\\"example\\"])"`; @@ -22,7 +22,7 @@ exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables exports[`AsyncIterable > crossSerializeStream > scoped > supports AsyncIterables 6`] = `"($R=>_$.Sc($R[3]))($R[\\"example\\"])"`; -exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())}"`; +exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 1`] = `"$R[0]={title:\\"Hello World\\",[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())}"`; exports[`AsyncIterable > crossSerializeStream > supports AsyncIterables 2`] = `"_$.Se($R[3],$R[4]=[0,1])"`; diff --git a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap index f1f4e52a..ddc246fc 100644 --- a/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/frozen-object.test.ts.snap @@ -14,7 +14,7 @@ exports[`frozen object > crossSerialize > supports self-recursion 1`] = `"($R[0] exports[`frozen object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; @@ -22,7 +22,7 @@ exports[`frozen object > crossSerializeAsync > scoped > supports self-recursion exports[`frozen object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])"`; -exports[`frozen object > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; +exports[`frozen object > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}),Object.freeze($R[1]),$R[0])"`; @@ -32,7 +32,7 @@ exports[`frozen object > crossSerializeStream > scoped > supports Objects 1`] = exports[`frozen object > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())},Object.freeze($R[0]),$R[0])($R[\\"example\\"])"`; exports[`frozen object > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[3],$R[4]=[0,1]))($R[\\"example\\"])"`; @@ -58,7 +58,7 @@ exports[`frozen object > crossSerializeStream > supports Objects 1`] = `"$R[0]=_ exports[`frozen object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.freeze($R[1]),$R[0])"`; -exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())},Object.freeze($R[0]),$R[0])"`; +exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())},Object.freeze($R[0]),$R[0])"`; exports[`frozen object > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[3],$R[4]=[0,1])"`; diff --git a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap index 0012c8b1..f99bd98d 100644 --- a/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap +++ b/packages/seroval/test/__snapshots__/null-constructor.test.ts.snap @@ -20,7 +20,7 @@ exports[`null-constructor > crossSerialize > supports self-recursion 1`] = `"($R exports[`null-constructor > crossSerializeAsync > scoped > supports Object.create(null) 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})})))($R[\\"example\\"])"`; @@ -28,7 +28,7 @@ exports[`null-constructor > crossSerializeAsync > scoped > supports self-recursi exports[`null-constructor > crossSerializeAsync > supports Object.create(null) 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})})"`; +exports[`null-constructor > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})})"`; exports[`null-constructor > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]=Object.assign(Object.create(null),{[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}))"`; @@ -38,7 +38,7 @@ exports[`null-constructor > crossSerializeStream > scoped > supports Object.crea exports[`null-constructor > crossSerializeStream > scoped > supports Object.create(null) 2`] = `"($R=>_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{hello:\\"world\\"})))($R[\\"example\\"])"`; -exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())}))($R[\\"example\\"])"`; +exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]=Object.assign(Object.create(null),{[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())}))($R[\\"example\\"])"`; exports[`null-constructor > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[3],$R[4]=[0,1]))($R[\\"example\\"])"`; @@ -64,7 +64,7 @@ exports[`null-constructor > crossSerializeStream > supports Object.create(null) exports[`null-constructor > crossSerializeStream > supports Object.create(null) 2`] = `"_$.Ps($R[0],$R[1]=Object.assign(Object.create(null),{hello:\\"world\\"}))"`; -exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())})"`; +exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]=Object.assign(Object.create(null),{[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())})"`; exports[`null-constructor > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[3],$R[4]=[0,1])"`; diff --git a/packages/seroval/test/__snapshots__/object.test.ts.snap b/packages/seroval/test/__snapshots__/object.test.ts.snap index 2d408d07..7e7c357f 100644 --- a/packages/seroval/test/__snapshots__/object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/object.test.ts.snap @@ -20,7 +20,7 @@ exports[`objects > crossSerialize > supports self-recursion 1`] = `"($R[0]={},$R exports[`objects > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; +exports[`objects > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})})($R[\\"example\\"])"`; exports[`objects > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}))($R[\\"example\\"])"`; @@ -28,7 +28,7 @@ exports[`objects > crossSerializeAsync > scoped > supports self-recursion 1`] = exports[`objects > crossSerializeAsync > supports Objects 1`] = `"$R[0]=Promise.resolve($R[1]={hello:\\"world\\"})"`; -exports[`objects > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})}"`; +exports[`objects > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})}"`; exports[`objects > crossSerializeAsync > supports Symbol.iterator 1`] = `"$R[0]=Promise.resolve($R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})})"`; @@ -38,7 +38,7 @@ exports[`objects > crossSerializeStream > scoped > supports Objects 1`] = `"($R= exports[`objects > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]={hello:\\"world\\"}))($R[\\"example\\"])"`; -exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())})($R[\\"example\\"])"`; +exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())})($R[\\"example\\"])"`; exports[`objects > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[3],$R[4]=[0,1]))($R[\\"example\\"])"`; @@ -64,7 +64,7 @@ exports[`objects > crossSerializeStream > supports Objects 1`] = `"$R[0]=_$.P()" exports[`objects > crossSerializeStream > supports Objects 2`] = `"_$.Ps($R[0],$R[1]={hello:\\"world\\"})"`; -exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())}"`; +exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())}"`; exports[`objects > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[3],$R[4]=[0,1])"`; diff --git a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap index a1f20173..0dda1782 100644 --- a/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap +++ b/packages/seroval/test/__snapshots__/sealed-object.test.ts.snap @@ -14,7 +14,7 @@ exports[`sealed object > crossSerialize > supports self-recursion 1`] = `"($R[0] exports[`sealed object > crossSerializeAsync > scoped > supports Objects 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeAsync > scoped > supports Symbol.iterator 1`] = `"($R=>$R[0]=Promise.resolve($R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; @@ -22,7 +22,7 @@ exports[`sealed object > crossSerializeAsync > scoped > supports self-recursion exports[`sealed object > crossSerializeAsync > supports Objects 1`] = `"($R[0]=Promise.resolve($R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])"`; -exports[`sealed object > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; +exports[`sealed object > crossSerializeAsync > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]={v:$R[4]=[1,2,3,void 0],t:-1,d:3})},Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerializeAsync > supports Symbol.iterator 1`] = `"($R[0]=Promise.resolve($R[1]={[$R[2]=Symbol.iterator]:($R[3]=s=>(i,c,d,t)=>(i=0,t={[$R[2]]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))($R[4]={v:$R[5]=[1,2,3,void 0],t:-1,d:3})}),Object.seal($R[1]),$R[0])"`; @@ -32,7 +32,7 @@ exports[`sealed object > crossSerializeStream > scoped > supports Objects 1`] = exports[`sealed object > crossSerializeStream > scoped > supports Objects 2`] = `"($R=>_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])($R[\\"example\\"])"`; -exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; +exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 1`] = `"($R=>$R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())},Object.seal($R[0]),$R[0])($R[\\"example\\"])"`; exports[`sealed object > crossSerializeStream > scoped > supports Symbol.asyncIterator 2`] = `"($R=>_$.Se($R[3],$R[4]=[0,1]))($R[\\"example\\"])"`; @@ -58,7 +58,7 @@ exports[`sealed object > crossSerializeStream > supports Objects 1`] = `"$R[0]=_ exports[`sealed object > crossSerializeStream > supports Objects 2`] = `"(_$.Ps($R[0],$R[1]={hello:\\"world\\"}),Object.seal($R[1]),$R[0])"`; -exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>b=>(b=s.tee(),s=b[0],b=b[1].getReader(),{[$R[1]]:()=>this,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())},Object.seal($R[0]),$R[0])"`; +exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 1`] = `"($R[0]={[$R[1]=Symbol.asyncIterator]:($R[2]=s=>(b,t)=>(b=s.tee(),s=b[0],b=b[1].getReader(),t={[$R[1]]:()=>t,next:()=>b.read().then(d=>{if(d.done)return{done:!0,value:void 0};d=d.value;if(d[0]===1)throw d[1];return{done:d[0]===2,value:d[1]}})}))($R[3]=_$.S())},Object.seal($R[0]),$R[0])"`; exports[`sealed object > crossSerializeStream > supports Symbol.asyncIterator 2`] = `"_$.Se($R[3],$R[4]=[0,1])"`; From 1d3fc004016b0ee0107af39a049501f4817bcd8f Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Sat, 18 Nov 2023 16:40:57 +0800 Subject: [PATCH 74/82] Fix ReadableStream in async mode --- packages/seroval/iterator.js | 40 +++- .../seroval/src/core/context/deserializer.ts | 22 +- .../seroval/src/core/context/serializer.ts | 14 +- .../src/core/utils/iterator-to-sequence.ts | 38 ++-- .../readable-stream.test.ts.snap | 26 +++ .../test/web-api/readable-stream.test.ts | 208 +++++++++++++++++- 6 files changed, 310 insertions(+), 38 deletions(-) diff --git a/packages/seroval/iterator.js b/packages/seroval/iterator.js index 8c4b8ff2..ca9c01d7 100644 --- a/packages/seroval/iterator.js +++ b/packages/seroval/iterator.js @@ -1,15 +1,35 @@ -function* test() { +async function readableStreamToSequence(stream) { + const values = []; + let throwsAt = -1; + let doneAt = -1; -} + const iterator = stream.getReader(); -function inheritance(value) { - const p = Object.getPrototypeOf(value); - if (p) { - console.log(p); - console.log(Object.getOwnPropertyDescriptors(p)); - inheritance(p); + while (true) { + try { + const value = await iterator.read(); + 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, + }; } -inheritance(test()); -inheritance(new ReadableStream()); \ No newline at end of file +console.log(await readableStreamToSequence( + new ReadableStream({ + start(controller) { + controller.error('foo'); + } + }) +)) \ No newline at end of file diff --git a/packages/seroval/src/core/context/deserializer.ts b/packages/seroval/src/core/context/deserializer.ts index 91e2dd52..2b8c44b7 100644 --- a/packages/seroval/src/core/context/deserializer.ts +++ b/packages/seroval/src/core/context/deserializer.ts @@ -35,6 +35,7 @@ import type { SerovalReadableStreamConstructorNode, SerovalReadableStreamEnqueueNode, SerovalReadableStreamErrorNode, + SerovalReadableStreamNode, SerovalReferenceNode, SerovalRegExpNode, SerovalRequestNode, @@ -53,7 +54,12 @@ import { } from '../constants'; import type { Plugin, PluginAccessOptions, SerovalMode } from '../plugin'; import type { Sequence, SerializedAsyncIteratorResult } from '../utils/iterator-to-sequence'; -import { readableStreamToAsyncIterator, sequenceToAsyncIterator, sequenceToIterator } from '../utils/iterator-to-sequence'; +import { + readableStreamToAsyncIterator, + sequenceToAsyncIterator, + sequenceToIterator, + sequenceToReadableStream, +} from '../utils/iterator-to-sequence'; import { getTypedArrayConstructor } from '../utils/typed-array'; import type { Deferred, DeferredStream } from '../utils/deferred'; import { createDeferred, createDeferredStream } from '../utils/deferred'; @@ -510,6 +516,17 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt return sequenceToAsyncIterator(source as Sequence); } + private deserializeReadableStream( + node: SerovalReadableStreamNode, + ): unknown { + return this.assignIndexedValue( + node.i, + sequenceToReadableStream( + this.deserialize(node.a[1]) as Sequence, + ), + ); + } + deserialize(node: SerovalNode): unknown { switch (node.t) { case SerovalNodeType.Constant: @@ -596,6 +613,9 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt return this.deserializeIteratorFactoryInstance(node); case SerovalNodeType.AsyncIteratorFactoryInstance: return this.deserializeAsyncIteratorFactoryInstance(node); + case SerovalNodeType.ReadableStream: + return this.deserializeReadableStream(node); + case SerovalNodeType.ReadableStreamFactory: case SerovalNodeType.MapSentinel: case SerovalNodeType.IteratorFactory: case SerovalNodeType.AsyncIteratorFactory: diff --git a/packages/seroval/src/core/context/serializer.ts b/packages/seroval/src/core/context/serializer.ts index fb6ad9e4..0c14f0c5 100644 --- a/packages/seroval/src/core/context/serializer.ts +++ b/packages/seroval/src/core/context/serializer.ts @@ -1070,9 +1070,12 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio protected serializeReadableStream( node: SerovalReadableStreamNode, ): string { + this.stack.push(node.i); + const result = '(' + this.serialize(node.a[0]) + ')(' + this.serialize(node.a[1]) + ')'; + this.stack.pop(); return this.assignIndexedValue( node.i, - '(' + this.serialize(node.a[0]) + ')(' + this.serialize(node.a[1]) + ')', + result, ); } @@ -1083,9 +1086,12 @@ export default abstract class BaseSerializerContext implements PluginAccessOptio node.i, this.createFunction( ['s'], - 'new ReadableStream({start:' + this.createEffectfulFunction( - ['c', 'i', 'v'], - 'for(i=0;i(source: AsyncIterable): Prom const iterator = source[Symbol.asyncIterator](); - async function push(): Promise { + while (true) { try { const value = await iterator.next(); values.push(value.value); if (value.done) { doneAt = values.length - 1; - } else { - await push(); + break; } } catch (error) { throwsAt = values.length; @@ -85,8 +85,6 @@ export async function asyncIteratorToSequence(source: AsyncIterable): Prom } } - await push(); - return { v: values, t: throwsAt, @@ -130,20 +128,18 @@ export function asyncIteratorToReadableStream( return new ReadableStream({ async start(controller): Promise { const iterator = source[Symbol.asyncIterator](); - async function push(): Promise { + while (true) { try { const result = await iterator.next(); controller.enqueue([result.done ? 2 : 0, result.value]); if (result.done) { controller.close(); - } else { - await push(); + return; } } catch (error) { controller.enqueue([1, error]); } } - await push(); }, }); } @@ -197,23 +193,22 @@ export async function readableStreamToSequence( const iterator = stream.getReader(); - async function push(): Promise { + while (true) { try { const value = await iterator.read(); values.push(value.value); if (value.done) { doneAt = values.length - 1; - } else { - await push(); + break; } } catch (error) { throwsAt = values.length; + doneAt = throwsAt; values.push(error); + break; } } - await push(); - return { v: values, t: throwsAt, @@ -226,15 +221,14 @@ export function sequenceToReadableStream( ): ReadableStream { return new ReadableStream({ start(controller): void { - for (let i = 0; i <= sequence.d; i++) { - const value = sequence.v[i]; - if (i === sequence.t) { - controller.error(value); - } else { - controller.enqueue(value as T); - } + for (let i = 0; i < sequence.d; i++) { + controller.enqueue(sequence.v[i] as T); + } + if (sequence.t === -1) { + controller.close(); + } else { + controller.error(sequence.v[sequence.t] as T); } - controller.close(); }, }); } diff --git a/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap b/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap index 2f7fd718..1f74f37b 100644 --- a/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap +++ b/packages/seroval/test/web-api/__snapshots__/readable-stream.test.ts.snap @@ -1,5 +1,13 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html +exports[`ReadableStream > crossSerializeAsync > scoped > supports ReadableStream 1`] = `"($R=>$R[0]=($R[1]=s=>new ReadableStream({start:c=>Promise.resolve().then((i,v)=>{for(i=0;i crossSerializeAsync > scoped > supports ReadableStream errors 1`] = `"($R=>$R[0]=($R[1]=s=>new ReadableStream({start:c=>Promise.resolve().then((i,v)=>{for(i=0;i crossSerializeAsync > supports ReadableStream 1`] = `"$R[0]=($R[1]=s=>new ReadableStream({start:c=>Promise.resolve().then((i,v)=>{for(i=0;i crossSerializeAsync > supports ReadableStream errors 1`] = `"$R[0]=($R[1]=s=>new ReadableStream({start:c=>Promise.resolve().then((i,v)=>{for(i=0;i crossSerializeStream > scoped > supports ReadableStream 1`] = `"($R=>$R[0]=_$.S())($R[\\"example\\"])"`; exports[`ReadableStream > crossSerializeStream > scoped > supports ReadableStream 2`] = `"($R=>_$.Se($R[0],\\"foo\\"))($R[\\"example\\"])"`; @@ -28,6 +36,18 @@ exports[`ReadableStream > crossSerializeStream > supports ReadableStream errors exports[`ReadableStream > crossSerializeStream > supports ReadableStream errors 2`] = `"_$.St($R[0],$R[1]=Object.assign(new Error(\\"Oops!\\"),{stack:\\"\\"}))"`; +exports[`ReadableStream > serializeAsync > supports ReadableStream 1`] = `"(s=>new ReadableStream({start:c=>Promise.resolve().then((i,v)=>{for(i=0;i serializeAsync > supports ReadableStream errors 1`] = `"(s=>new ReadableStream({start:c=>Promise.resolve().then((i,v)=>{for(i=0;i serializeAsync > supports ReadableStream errors 2`] = `"Oops!"`; + +exports[`ReadableStream > toCrossJSONAsync > supports ReadableStream 1`] = `"{\\"t\\":46,\\"i\\":0,\\"a\\":[{\\"t\\":47,\\"i\\":1},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":1,\\"s\\":\\"foo\\"},{\\"t\\":1,\\"s\\":\\"bar\\"},{\\"t\\":1,\\"s\\":\\"baz\\"},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}"`; + +exports[`ReadableStream > toCrossJSONAsync > supports ReadableStream errors 1`] = `"{\\"t\\":46,\\"i\\":0,\\"a\\":[{\\"t\\":47,\\"i\\":1},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":1,\\"a\\":[{\\"t\\":13,\\"i\\":4,\\"s\\":0,\\"m\\":\\"Oops!\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}],\\"o\\":0},{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":0}],\\"s\\":3},\\"o\\":0}]}"`; + +exports[`ReadableStream > toCrossJSONAsync > supports ReadableStream errors 2`] = `"Oops!"`; + exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 1`] = `"{\\"t\\":31,\\"i\\":0}"`; exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 2`] = `"{\\"t\\":32,\\"i\\":0,\\"f\\":{\\"t\\":1,\\"s\\":\\"foo\\"}}"`; @@ -41,3 +61,9 @@ exports[`ReadableStream > toCrossJSONStream > supports ReadableStream 5`] = `"{\ exports[`ReadableStream > toCrossJSONStream > supports ReadableStream errors 1`] = `"{\\"t\\":31,\\"i\\":0}"`; exports[`ReadableStream > toCrossJSONStream > supports ReadableStream errors 2`] = `"{\\"t\\":34,\\"i\\":0,\\"f\\":{\\"t\\":13,\\"i\\":1,\\"s\\":0,\\"m\\":\\"Oops!\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}}"`; + +exports[`ReadableStream > toJSONAsync > supports ReadableStream 1`] = `"{\\"t\\":{\\"t\\":46,\\"i\\":0,\\"a\\":[{\\"t\\":47,\\"i\\":1},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":4,\\"a\\":[{\\"t\\":1,\\"s\\":\\"foo\\"},{\\"t\\":1,\\"s\\":\\"bar\\"},{\\"t\\":1,\\"s\\":\\"baz\\"},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]},\\"f\\":16383,\\"m\\":[]}"`; + +exports[`ReadableStream > toJSONAsync > supports ReadableStream errors 1`] = `"{\\"t\\":{\\"t\\":46,\\"i\\":0,\\"a\\":[{\\"t\\":47,\\"i\\":1},{\\"t\\":10,\\"i\\":2,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":3,\\"l\\":1,\\"a\\":[{\\"t\\":13,\\"i\\":4,\\"s\\":0,\\"m\\":\\"Oops!\\",\\"p\\":{\\"k\\":[\\"stack\\"],\\"v\\":[{\\"t\\":1,\\"s\\":\\"\\"}],\\"s\\":1}}],\\"o\\":0},{\\"t\\":0,\\"s\\":0},{\\"t\\":0,\\"s\\":0}],\\"s\\":3},\\"o\\":0}]},\\"f\\":16383,\\"m\\":[]}"`; + +exports[`ReadableStream > toJSONAsync > supports ReadableStream errors 2`] = `"Oops!"`; diff --git a/packages/seroval/test/web-api/readable-stream.test.ts b/packages/seroval/test/web-api/readable-stream.test.ts index 35cbf48b..6e754a4e 100644 --- a/packages/seroval/test/web-api/readable-stream.test.ts +++ b/packages/seroval/test/web-api/readable-stream.test.ts @@ -1,9 +1,163 @@ import { describe, it, expect } from 'vitest'; import { - crossSerializeStream, toCrossJSONStream, + crossSerializeAsync, + crossSerializeStream, + deserialize, + fromCrossJSON, + fromJSON, + serializeAsync, + toCrossJSONAsync, + toCrossJSONStream, + toJSONAsync, } from '../../src'; describe('ReadableStream', () => { + describe('serializeAsync', () => { + it('supports ReadableStream', async () => { + const example = new ReadableStream({ + start(controller): void { + controller.enqueue('foo'); + controller.enqueue('bar'); + controller.enqueue('baz'); + controller.close(); + }, + }); + const result = await serializeAsync(example); + expect(result).toMatchSnapshot(); + const back = deserialize(result); + expect(back).toBeInstanceOf(ReadableStream); + const reader = back.getReader(); + expect(await reader.read()).toMatchObject({ + done: false, + value: 'foo', + }); + expect(await reader.read()).toMatchObject({ + done: false, + value: 'bar', + }); + expect(await reader.read()).toMatchObject({ + done: false, + value: 'baz', + }); + expect(await reader.read()).toMatchObject({ + done: true, + value: undefined, + }); + }); + it('supports ReadableStream errors', async () => { + const example = new ReadableStream({ + start(controller): void { + const error = new Error('Oops!'); + error.stack = ''; + controller.error(error); + }, + }); + const result = await serializeAsync(example); + expect(result).toMatchSnapshot(); + const back = deserialize(result); + expect(back).toBeInstanceOf(ReadableStream); + const reader = back.getReader(); + await expect(async () => reader.read()).rejects.toThrowErrorMatchingSnapshot(); + }); + }); + describe('toJSONAsync', () => { + it('supports ReadableStream', async () => { + const example = new ReadableStream({ + start(controller): void { + controller.enqueue('foo'); + controller.enqueue('bar'); + controller.enqueue('baz'); + controller.close(); + }, + }); + const result = await toJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromJSON(result); + expect(back).toBeInstanceOf(ReadableStream); + const reader = back.getReader(); + expect(await reader.read()).toMatchObject({ + done: false, + value: 'foo', + }); + expect(await reader.read()).toMatchObject({ + done: false, + value: 'bar', + }); + expect(await reader.read()).toMatchObject({ + done: false, + value: 'baz', + }); + expect(await reader.read()).toMatchObject({ + done: true, + value: undefined, + }); + }); + it('supports ReadableStream errors', async () => { + const example = new ReadableStream({ + start(controller): void { + const error = new Error('Oops!'); + error.stack = ''; + controller.error(error); + }, + }); + const result = await toJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromJSON(result); + expect(back).toBeInstanceOf(ReadableStream); + const reader = back.getReader(); + await expect(async () => reader.read()).rejects.toThrowErrorMatchingSnapshot(); + }); + }); + describe('crossSerializeAsync', () => { + it('supports ReadableStream', async () => { + const example = new ReadableStream({ + start(controller): void { + controller.enqueue('foo'); + controller.enqueue('bar'); + controller.enqueue('baz'); + controller.close(); + }, + }); + const result = await crossSerializeAsync(example); + expect(result).toMatchSnapshot(); + }); + it('supports ReadableStream errors', async () => { + const example = new ReadableStream({ + start(controller): void { + const error = new Error('Oops!'); + error.stack = ''; + controller.error(error); + }, + }); + const result = await crossSerializeAsync(example); + expect(result).toMatchSnapshot(); + }); + describe('scoped', () => { + it('supports ReadableStream', async () => { + const example = new ReadableStream({ + start(controller): void { + controller.enqueue('foo'); + controller.enqueue('bar'); + controller.enqueue('baz'); + controller.close(); + }, + }); + const result = await crossSerializeAsync(example, { scopeId: 'example' }); + expect(result).toMatchSnapshot(); + }); + it('supports ReadableStream errors', async () => { + const example = new ReadableStream({ + start(controller): void { + const error = new Error('Oops!'); + error.stack = ''; + controller.error(error); + }, + }); + const result = await crossSerializeAsync(example, { scopeId: 'example' }); + expect(result).toMatchSnapshot(); + }); + }); + }); describe('crossSerializeStream', () => { it('supports ReadableStream', async () => new Promise((resolve, reject) => { const example = new ReadableStream({ @@ -92,6 +246,58 @@ describe('ReadableStream', () => { })); }); }); + describe('toCrossJSONAsync', () => { + it('supports ReadableStream', async () => { + const example = new ReadableStream({ + start(controller): void { + controller.enqueue('foo'); + controller.enqueue('bar'); + controller.enqueue('baz'); + controller.close(); + }, + }); + const result = await toCrossJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(ReadableStream); + const reader = back.getReader(); + expect(await reader.read()).toMatchObject({ + done: false, + value: 'foo', + }); + expect(await reader.read()).toMatchObject({ + done: false, + value: 'bar', + }); + expect(await reader.read()).toMatchObject({ + done: false, + value: 'baz', + }); + expect(await reader.read()).toMatchObject({ + done: true, + value: undefined, + }); + }); + it('supports ReadableStream errors', async () => { + const example = new ReadableStream({ + start(controller): void { + const error = new Error('Oops!'); + error.stack = ''; + controller.error(error); + }, + }); + const result = await toCrossJSONAsync(example); + expect(JSON.stringify(result)).toMatchSnapshot(); + const back = fromCrossJSON(result, { + refs: new Map(), + }); + expect(back).toBeInstanceOf(ReadableStream); + const reader = back.getReader(); + await expect(async () => reader.read()).rejects.toThrowErrorMatchingSnapshot(); + }); + }); describe('toCrossJSONStream', () => { it('supports ReadableStream', async () => new Promise((resolve, reject) => { const example = new ReadableStream({ From 66f5440e73bf583427d30f3de90ff764cf65bbcd Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Sat, 18 Nov 2023 16:41:13 +0800 Subject: [PATCH 75/82] Delete iterator.js --- packages/seroval/iterator.js | 35 ----------------------------------- 1 file changed, 35 deletions(-) delete mode 100644 packages/seroval/iterator.js diff --git a/packages/seroval/iterator.js b/packages/seroval/iterator.js deleted file mode 100644 index ca9c01d7..00000000 --- a/packages/seroval/iterator.js +++ /dev/null @@ -1,35 +0,0 @@ -async function readableStreamToSequence(stream) { - const values = []; - let throwsAt = -1; - let doneAt = -1; - - const iterator = stream.getReader(); - - while (true) { - try { - const value = await iterator.read(); - 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, - }; -} - -console.log(await readableStreamToSequence( - new ReadableStream({ - start(controller) { - controller.error('foo'); - } - }) -)) \ No newline at end of file From 7b03f61564b4cd21841806b06717f1c72e1bd06a Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Sat, 18 Nov 2023 16:41:17 +0800 Subject: [PATCH 76/82] Create theory.js --- packages/seroval/theory.js | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 packages/seroval/theory.js diff --git a/packages/seroval/theory.js b/packages/seroval/theory.js new file mode 100644 index 00000000..241cecee --- /dev/null +++ b/packages/seroval/theory.js @@ -0,0 +1,20 @@ +import { Serializer } from "./dist/esm/development/index.mjs"; + +const sleep = (value, ms) => ( + new Promise((res) => setTimeout(res, ms, value)) +); + +async function * example() { + yield sleep('foo', 1000); + yield sleep('bar', 1000); + yield sleep('baz', 1000); +} + +const serializer = new Serializer({ + globalIdentifier: 'X', + onData(value) { + console.log(value); + }, +}); + +serializer.write('example', example()); \ No newline at end of file From 37dae53af2d988b19d0aecadcde6996c28dac374 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Sat, 18 Nov 2023 16:58:59 +0800 Subject: [PATCH 77/82] Update docs --- docs/compatibility.md | 6 +++--- docs/serialization.md | 3 +++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/docs/compatibility.md b/docs/compatibility.md index 6f9083d4..8df80187 100644 --- a/docs/compatibility.md +++ b/docs/compatibility.md @@ -87,9 +87,9 @@ By default, all feature flags are enabled. The following are the feature flags a ## Supported Types -- sync = `serialize`, `toJSON`, `crossSerialize` -- async = `serializeAsync`, `toJSONAsync`, `crossSerializeAsync` -- streaming = `crossSerializeStream`, `Serializer` +- sync = `serialize`, `toJSON`, `crossSerialize`, `toCrossJSON` +- async = `serializeAsync`, `toJSONAsync`, `crossSerializeAsync`, `toCrossJSONAsync` +- streaming = `crossSerializeStream`, `toCrossJSONStream`, `Serializer` | Type | sync | async | streaming | | --- | --- | --- | --- | diff --git a/docs/serialization.md b/docs/serialization.md index aa7156a6..93a2b085 100644 --- a/docs/serialization.md +++ b/docs/serialization.md @@ -9,6 +9,9 @@ - `crossSerialize` - `crossSerializeAsync` - `crossSerializeStream` +- `toCrossJSON` +- `toCrossJSONAsync` +- `toCrossJSONStream` ## Basic serialization From 0d68d71f37263d3090772de33e67a4055bdde33f Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Sat, 18 Nov 2023 18:03:03 +0800 Subject: [PATCH 78/82] Add `Symbol.toStringTag` and `Symbol.isConcatSpreadable` support --- packages/seroval/src/core/context/parser/async.ts | 14 +++++++++++--- packages/seroval/src/core/context/parser/stream.ts | 14 +++++++++++--- packages/seroval/src/core/context/parser/sync.ts | 12 ++++++++++-- .../seroval/test/__snapshots__/map.test.ts.snap | 4 ++-- .../seroval/test/__snapshots__/set.test.ts.snap | 4 ++-- 5 files changed, 36 insertions(+), 12 deletions(-) diff --git a/packages/seroval/src/core/context/parser/async.ts b/packages/seroval/src/core/context/parser/async.ts index 36a9216b..1f38e23b 100644 --- a/packages/seroval/src/core/context/parser/async.ts +++ b/packages/seroval/src/core/context/parser/async.ts @@ -111,7 +111,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { } private async parseProperties( - properties: Record, + properties: Record, ): Promise { const entries = Object.entries(properties); const keyNodes: SerovalObjectRecordKey[] = []; @@ -134,7 +134,7 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { createIteratorFactoryInstanceNode( this.parseIteratorFactory(), await this.parse( - iteratorToSequence(properties as Iterable), + iteratorToSequence(properties as unknown as Iterable), ), ), ); @@ -147,11 +147,19 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { createAsyncIteratorFactoryInstanceNode( this.parseAsyncIteratorFactory(), await this.parse( - await asyncIteratorToSequence(properties as AsyncIterable), + await asyncIteratorToSequence(properties as unknown as AsyncIterable), ), ), ); } + if (Symbol.toStringTag in properties) { + keyNodes.push(this.parseWKSymbol(Symbol.toStringTag)); + valueNodes.push(await this.parse(properties[Symbol.toStringTag])); + } + if (Symbol.isConcatSpreadable in properties) { + keyNodes.push(this.parseWKSymbol(Symbol.isConcatSpreadable)); + valueNodes.push(await this.parse(properties[Symbol.isConcatSpreadable])); + } } return { k: keyNodes, diff --git a/packages/seroval/src/core/context/parser/stream.ts b/packages/seroval/src/core/context/parser/stream.ts index a7093c60..a342873a 100644 --- a/packages/seroval/src/core/context/parser/stream.ts +++ b/packages/seroval/src/core/context/parser/stream.ts @@ -90,7 +90,7 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont } protected parseProperties( - properties: Record, + properties: Record, ): SerovalObjectRecordNode { const entries = Object.entries(properties); const keyNodes: SerovalObjectRecordKey[] = []; @@ -113,7 +113,7 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont createIteratorFactoryInstanceNode( this.parseIteratorFactory(), this.parse( - iteratorToSequence(properties as Iterable), + iteratorToSequence(properties as unknown as Iterable), ), ), ); @@ -126,11 +126,19 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont createAsyncIteratorFactoryInstanceNode( this.parseAsyncIteratorFactory(), this.parse( - asyncIteratorToReadableStream(properties as AsyncIterable), + asyncIteratorToReadableStream(properties as unknown as AsyncIterable), ), ), ); } + if (Symbol.toStringTag in properties) { + keyNodes.push(this.parseWKSymbol(Symbol.toStringTag)); + valueNodes.push(this.parse(properties[Symbol.toStringTag])); + } + if (Symbol.isConcatSpreadable in properties) { + keyNodes.push(this.parseWKSymbol(Symbol.isConcatSpreadable)); + valueNodes.push(this.parse(properties[Symbol.isConcatSpreadable])); + } } return { k: keyNodes, diff --git a/packages/seroval/src/core/context/parser/sync.ts b/packages/seroval/src/core/context/parser/sync.ts index f90929a4..eb8c00e2 100644 --- a/packages/seroval/src/core/context/parser/sync.ts +++ b/packages/seroval/src/core/context/parser/sync.ts @@ -101,7 +101,7 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { } protected parseProperties( - properties: Record, + properties: Record, ): SerovalObjectRecordNode { const entries = Object.entries(properties); const keyNodes: SerovalObjectRecordKey[] = []; @@ -124,11 +124,19 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { createIteratorFactoryInstanceNode( this.parseIteratorFactory(), this.parse( - iteratorToSequence(properties as Iterable), + iteratorToSequence(properties as unknown as Iterable), ), ), ); } + if (Symbol.toStringTag in properties) { + keyNodes.push(this.parseWKSymbol(Symbol.toStringTag)); + valueNodes.push(this.parse(properties[Symbol.toStringTag])); + } + if (Symbol.isConcatSpreadable in properties) { + keyNodes.push(this.parseWKSymbol(Symbol.isConcatSpreadable)); + valueNodes.push(this.parse(properties[Symbol.isConcatSpreadable])); + } } return { k: keyNodes, diff --git a/packages/seroval/test/__snapshots__/map.test.ts.snap b/packages/seroval/test/__snapshots__/map.test.ts.snap index 07eaff11..a86eab8a 100644 --- a/packages/seroval/test/__snapshots__/map.test.ts.snap +++ b/packages/seroval/test/__snapshots__/map.test.ts.snap @@ -1,10 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[[1,2],[3,4],void 0],t:-1,d:2})})))()"`; +exports[`Map > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[[1,2],[3,4],void 0],t:-1,d:2}),[Symbol.toStringTag]:\\"Map\\"})))()"`; exports[`Map > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; -exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":3,\\"a\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2}],\\"o\\":0},{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":3},{\\"t\\":0,\\"s\\":4}],\\"o\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":2}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0},\\"f\\":16351,\\"m\\":[1]}"`; +exports[`Map > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":3},{\\"t\\":17,\\"i\\":7,\\"s\\":11}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":3,\\"a\\":[{\\"t\\":9,\\"i\\":5,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2}],\\"o\\":0},{\\"t\\":9,\\"i\\":6,\\"l\\":2,\\"a\\":[{\\"t\\":0,\\"s\\":3},{\\"t\\":0,\\"s\\":4}],\\"o\\":0},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":2}],\\"s\\":3},\\"o\\":0}]},{\\"t\\":1,\\"s\\":\\"Map\\"}],\\"s\\":2},\\"o\\":0},\\"f\\":16351,\\"m\\":[1]}"`; exports[`Map > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Map]\\""`; diff --git a/packages/seroval/test/__snapshots__/set.test.ts.snap b/packages/seroval/test/__snapshots__/set.test.ts.snap index 3332979a..c2b7a976 100644 --- a/packages/seroval/test/__snapshots__/set.test.ts.snap +++ b/packages/seroval/test/__snapshots__/set.test.ts.snap @@ -1,10 +1,10 @@ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html -exports[`Set > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[1,2,3,void 0],t:-1,d:3})})))()"`; +exports[`Set > compat > should fallback to Symbol.iterator 1`] = `"(h=>(Object.assign(Object.create(null),{[h=Symbol.iterator]:(s=>(i,c,d,t)=>(i=0,t={[h]:()=>t,next:()=>{if(i>s.d)return{done:!0,value:void 0};c=i++,d=s.v[c];if(c===s.t)throw d;return{done:c===s.d,value:d}}}))({v:[1,2,3,void 0],t:-1,d:3}),[Symbol.toStringTag]:\\"Set\\"})))()"`; exports[`Set > compat > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; -exports[`Set > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":3}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]}],\\"s\\":1},\\"o\\":0},\\"f\\":15871,\\"m\\":[1]}"`; +exports[`Set > compat#toJSON > should fallback to Symbol.iterator 1`] = `"{\\"t\\":{\\"t\\":11,\\"i\\":0,\\"p\\":{\\"k\\":[{\\"t\\":17,\\"i\\":1,\\"s\\":3},{\\"t\\":17,\\"i\\":5,\\"s\\":11}],\\"v\\":[{\\"t\\":43,\\"a\\":[{\\"t\\":42,\\"i\\":2,\\"f\\":{\\"t\\":4,\\"i\\":1}},{\\"t\\":10,\\"i\\":3,\\"p\\":{\\"k\\":[\\"v\\",\\"t\\",\\"d\\"],\\"v\\":[{\\"t\\":9,\\"i\\":4,\\"l\\":4,\\"a\\":[{\\"t\\":0,\\"s\\":1},{\\"t\\":0,\\"s\\":2},{\\"t\\":0,\\"s\\":3},{\\"t\\":2,\\"s\\":1}],\\"o\\":0},{\\"t\\":0,\\"s\\":-1},{\\"t\\":0,\\"s\\":3}],\\"s\\":3},\\"o\\":0}]},{\\"t\\":1,\\"s\\":\\"Set\\"}],\\"s\\":2},\\"o\\":0},\\"f\\":15871,\\"m\\":[1]}"`; exports[`Set > compat#toJSON > should throw an error for unsupported target 1`] = `"Unsupported type \\"[object Set]\\""`; From 3c2bf67f98f427ca68b43b7a85380353dde44b34 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Sat, 18 Nov 2023 18:20:47 +0800 Subject: [PATCH 79/82] Fix symbol property parsing --- .../seroval/src/core/context/parser/async.ts | 24 ++++++++++------- .../seroval/src/core/context/parser/stream.ts | 27 +++++++++++-------- .../seroval/src/core/context/parser/sync.ts | 19 +++++++------ 3 files changed, 41 insertions(+), 29 deletions(-) diff --git a/packages/seroval/src/core/context/parser/async.ts b/packages/seroval/src/core/context/parser/async.ts index 1f38e23b..fc70ed88 100644 --- a/packages/seroval/src/core/context/parser/async.ts +++ b/packages/seroval/src/core/context/parser/async.ts @@ -126,9 +126,10 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { } // Check special properties if (this.features & Feature.Symbol) { - if (Symbol.iterator in properties) { + let symbol = Symbol.iterator; + if (symbol in properties) { keyNodes.push( - this.parseWKSymbol(Symbol.iterator), + this.parseWKSymbol(symbol), ); valueNodes.push( createIteratorFactoryInstanceNode( @@ -139,9 +140,10 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { ), ); } - if (Symbol.asyncIterator in properties) { + symbol = Symbol.asyncIterator; + if (symbol in properties) { keyNodes.push( - this.parseWKSymbol(Symbol.asyncIterator), + this.parseWKSymbol(symbol), ); valueNodes.push( createAsyncIteratorFactoryInstanceNode( @@ -152,13 +154,15 @@ export default abstract class BaseAsyncParserContext extends BaseParserContext { ), ); } - if (Symbol.toStringTag in properties) { - keyNodes.push(this.parseWKSymbol(Symbol.toStringTag)); - valueNodes.push(await this.parse(properties[Symbol.toStringTag])); + symbol = Symbol.toStringTag; + if (symbol in properties) { + keyNodes.push(this.parseWKSymbol(symbol)); + valueNodes.push(createStringNode(properties[symbol] as string)); } - if (Symbol.isConcatSpreadable in properties) { - keyNodes.push(this.parseWKSymbol(Symbol.isConcatSpreadable)); - valueNodes.push(await this.parse(properties[Symbol.isConcatSpreadable])); + symbol = Symbol.isConcatSpreadable; + if (symbol in properties) { + keyNodes.push(this.parseWKSymbol(symbol)); + valueNodes.push(properties[symbol] ? TRUE_NODE : FALSE_NODE); } } return { diff --git a/packages/seroval/src/core/context/parser/stream.ts b/packages/seroval/src/core/context/parser/stream.ts index a342873a..5bfecc77 100644 --- a/packages/seroval/src/core/context/parser/stream.ts +++ b/packages/seroval/src/core/context/parser/stream.ts @@ -7,13 +7,14 @@ import { createIteratorFactoryInstanceNode, createPluginNode, createRegExpNode, + createStringNode, } from '../../base-primitives'; import type { BaseSyncParserContextOptions } from './sync'; import BaseSyncParserContext from './sync'; import { BIGINT_FLAG, Feature } from '../../compat'; import { SerovalNodeType, UNIVERSAL_SENTINEL } from '../../constants'; import { createRequestOptions, createResponseOptions } from '../../utils/constructors'; -import { NULL_NODE } from '../../literals'; +import { FALSE_NODE, NULL_NODE, TRUE_NODE } from '../../literals'; import { serializeString } from '../../string'; import type { SerovalNode, @@ -105,9 +106,10 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont } // Check special properties, symbols in this case if (this.features & Feature.Symbol) { - if (Symbol.iterator in properties) { + let symbol = Symbol.iterator; + if (symbol in properties) { keyNodes.push( - this.parseWKSymbol(Symbol.iterator), + this.parseWKSymbol(symbol), ); valueNodes.push( createIteratorFactoryInstanceNode( @@ -118,9 +120,10 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont ), ); } - if (Symbol.asyncIterator in properties) { + symbol = Symbol.asyncIterator; + if (symbol in properties) { keyNodes.push( - this.parseWKSymbol(Symbol.asyncIterator), + this.parseWKSymbol(symbol), ); valueNodes.push( createAsyncIteratorFactoryInstanceNode( @@ -131,13 +134,15 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont ), ); } - if (Symbol.toStringTag in properties) { - keyNodes.push(this.parseWKSymbol(Symbol.toStringTag)); - valueNodes.push(this.parse(properties[Symbol.toStringTag])); + symbol = Symbol.toStringTag; + if (symbol in properties) { + keyNodes.push(this.parseWKSymbol(symbol)); + valueNodes.push(createStringNode(properties[symbol] as string)); } - if (Symbol.isConcatSpreadable in properties) { - keyNodes.push(this.parseWKSymbol(Symbol.isConcatSpreadable)); - valueNodes.push(this.parse(properties[Symbol.isConcatSpreadable])); + symbol = Symbol.isConcatSpreadable; + if (symbol in properties) { + keyNodes.push(this.parseWKSymbol(symbol)); + valueNodes.push(properties[symbol] ? TRUE_NODE : FALSE_NODE); } } return { diff --git a/packages/seroval/src/core/context/parser/sync.ts b/packages/seroval/src/core/context/parser/sync.ts index eb8c00e2..ebf543a4 100644 --- a/packages/seroval/src/core/context/parser/sync.ts +++ b/packages/seroval/src/core/context/parser/sync.ts @@ -116,9 +116,10 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { } // Check special properties, symbols in this case if (this.features & Feature.Symbol) { - if (Symbol.iterator in properties) { + let symbol = Symbol.iterator; + if (symbol in properties) { keyNodes.push( - this.parseWKSymbol(Symbol.iterator), + this.parseWKSymbol(symbol), ); valueNodes.push( createIteratorFactoryInstanceNode( @@ -129,13 +130,15 @@ export default abstract class BaseSyncParserContext extends BaseParserContext { ), ); } - if (Symbol.toStringTag in properties) { - keyNodes.push(this.parseWKSymbol(Symbol.toStringTag)); - valueNodes.push(this.parse(properties[Symbol.toStringTag])); + symbol = Symbol.toStringTag; + if (symbol in properties) { + keyNodes.push(this.parseWKSymbol(symbol)); + valueNodes.push(createStringNode(properties[symbol] as string)); } - if (Symbol.isConcatSpreadable in properties) { - keyNodes.push(this.parseWKSymbol(Symbol.isConcatSpreadable)); - valueNodes.push(this.parse(properties[Symbol.isConcatSpreadable])); + symbol = Symbol.isConcatSpreadable; + if (symbol in properties) { + keyNodes.push(this.parseWKSymbol(symbol)); + valueNodes.push(properties[symbol] ? TRUE_NODE : FALSE_NODE); } } return { From 1ba379eb96e10addaf56b6043833b40cad19452e Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Sat, 18 Nov 2023 20:10:00 +0800 Subject: [PATCH 80/82] minor fix --- packages/seroval/src/core/constants.ts | 2 -- packages/seroval/src/core/context/parser/async.ts | 2 +- packages/seroval/src/core/context/parser/stream.ts | 3 ++- packages/seroval/src/core/context/parser/sync.ts | 2 +- packages/seroval/src/core/special-reference.ts | 9 +-------- 5 files changed, 5 insertions(+), 13 deletions(-) diff --git a/packages/seroval/src/core/constants.ts b/packages/seroval/src/core/constants.ts index 616717f9..17c2e10d 100644 --- a/packages/seroval/src/core/constants.ts +++ b/packages/seroval/src/core/constants.ts @@ -193,5 +193,3 @@ export const ERROR_CONSTRUCTOR: Record = [ErrorConstructorTag.TypeError]: TypeError, [ErrorConstructorTag.URIError]: URIError, }; - -export const UNIVERSAL_SENTINEL = {}; diff --git a/packages/seroval/src/core/context/parser/async.ts b/packages/seroval/src/core/context/parser/async.ts index fc70ed88..a642d9a5 100644 --- a/packages/seroval/src/core/context/parser/async.ts +++ b/packages/seroval/src/core/context/parser/async.ts @@ -25,7 +25,6 @@ import { import { BIGINT_FLAG, Feature } from '../../compat'; import { SerovalNodeType, - UNIVERSAL_SENTINEL, } from '../../constants'; import { createRequestOptions, @@ -80,6 +79,7 @@ import { createCustomEventNode, createReadableStreamNode, } from '../../web-api'; +import { UNIVERSAL_SENTINEL } from '../../special-reference'; type ObjectLikeNode = | SerovalObjectNode diff --git a/packages/seroval/src/core/context/parser/stream.ts b/packages/seroval/src/core/context/parser/stream.ts index 5bfecc77..862911b3 100644 --- a/packages/seroval/src/core/context/parser/stream.ts +++ b/packages/seroval/src/core/context/parser/stream.ts @@ -12,7 +12,7 @@ import { import type { BaseSyncParserContextOptions } from './sync'; import BaseSyncParserContext from './sync'; import { BIGINT_FLAG, Feature } from '../../compat'; -import { SerovalNodeType, UNIVERSAL_SENTINEL } from '../../constants'; +import { SerovalNodeType } from '../../constants'; import { createRequestOptions, createResponseOptions } from '../../utils/constructors'; import { FALSE_NODE, NULL_NODE, TRUE_NODE } from '../../literals'; import { serializeString } from '../../string'; @@ -28,6 +28,7 @@ import type { } from '../../types'; import { createDOMExceptionNode, createURLNode, createURLSearchParamsNode } from '../../web-api'; import { asyncIteratorToReadableStream, iteratorToSequence } from '../../utils/iterator-to-sequence'; +import { UNIVERSAL_SENTINEL } from '../../special-reference'; export interface BaseStreamParserContextOptions extends BaseSyncParserContextOptions { onParse: (node: SerovalNode, initial: boolean) => void; diff --git a/packages/seroval/src/core/context/parser/sync.ts b/packages/seroval/src/core/context/parser/sync.ts index ebf543a4..10ed1fab 100644 --- a/packages/seroval/src/core/context/parser/sync.ts +++ b/packages/seroval/src/core/context/parser/sync.ts @@ -25,7 +25,6 @@ import { BIGINT_FLAG, Feature } from '../../compat'; import type { WellKnownSymbols } from '../../constants'; import { SerovalNodeType, - UNIVERSAL_SENTINEL, } from '../../constants'; import { createCustomEventOptions, createEventOptions } from '../../utils/constructors'; import { @@ -69,6 +68,7 @@ import { createURLNode, createURLSearchParamsNode, } from '../../web-api'; +import { UNIVERSAL_SENTINEL } from '../../special-reference'; type ObjectLikeNode = | SerovalObjectNode diff --git a/packages/seroval/src/core/special-reference.ts b/packages/seroval/src/core/special-reference.ts index ed12b8f9..af3aff35 100644 --- a/packages/seroval/src/core/special-reference.ts +++ b/packages/seroval/src/core/special-reference.ts @@ -6,11 +6,4 @@ export const ASYNC_ITERATOR = {}; export const READABLE_STREAM = {}; -export const enum SpecialReference { - Sentinel = 0, - SymbolIterator = 1, - IteratorFactory = 2, - SymbolAsyncIterator = 3, - AsyncIteratorFactory = 4, - ReadableStreamFactory = 5, -} +export const UNIVERSAL_SENTINEL = {}; From 6e99a5b616f2b30894dd26daaa13fceef5313340 Mon Sep 17 00:00:00 2001 From: Alexis Munsayac Date: Sat, 18 Nov 2023 20:33:10 +0800 Subject: [PATCH 81/82] Fix loop guard on streaming --- packages/seroval/src/core/context/parser/stream.ts | 5 ++++- packages/seroval/src/core/utils/iterator-to-sequence.ts | 6 +++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/packages/seroval/src/core/context/parser/stream.ts b/packages/seroval/src/core/context/parser/stream.ts index 862911b3..0866a0ce 100644 --- a/packages/seroval/src/core/context/parser/stream.ts +++ b/packages/seroval/src/core/context/parser/stream.ts @@ -130,7 +130,10 @@ export default abstract class BaseStreamParserContext extends BaseSyncParserCont createAsyncIteratorFactoryInstanceNode( this.parseAsyncIteratorFactory(), this.parse( - asyncIteratorToReadableStream(properties as unknown as AsyncIterable), + asyncIteratorToReadableStream( + properties as unknown as AsyncIterable, + this, + ), ), ), ); diff --git a/packages/seroval/src/core/utils/iterator-to-sequence.ts b/packages/seroval/src/core/utils/iterator-to-sequence.ts index 26f7ce94..b22e6472 100644 --- a/packages/seroval/src/core/utils/iterator-to-sequence.ts +++ b/packages/seroval/src/core/utils/iterator-to-sequence.ts @@ -1,3 +1,5 @@ +import type BaseStreamParserContext from '../context/parser/stream'; + /* eslint-disable no-await-in-loop */ export interface Sequence { v: unknown[]; @@ -124,11 +126,12 @@ export function sequenceToAsyncIterator( export function asyncIteratorToReadableStream( source: AsyncIterable, + parser: BaseStreamParserContext, ): ReadableStream { return new ReadableStream({ async start(controller): Promise { const iterator = source[Symbol.asyncIterator](); - while (true) { + while (parser.isAlive()) { try { const result = await iterator.next(); controller.enqueue([result.done ? 2 : 0, result.value]); @@ -140,6 +143,7 @@ export function asyncIteratorToReadableStream( controller.enqueue([1, error]); } } + controller.close(); }, }); } From c3e253efdb79bd274fb0234cebdc83962f9a94d7 Mon Sep 17 00:00:00 2001 From: "Alexis H. Munsayac" Date: Sat, 18 Nov 2023 22:53:20 +0800 Subject: [PATCH 82/82] Update deserializer.ts --- packages/seroval/src/core/context/deserializer.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/seroval/src/core/context/deserializer.ts b/packages/seroval/src/core/context/deserializer.ts index 2b8c44b7..9ee6d506 100644 --- a/packages/seroval/src/core/context/deserializer.ts +++ b/packages/seroval/src/core/context/deserializer.ts @@ -615,10 +615,10 @@ export default abstract class BaseDeserializerContext implements PluginAccessOpt return this.deserializeAsyncIteratorFactoryInstance(node); case SerovalNodeType.ReadableStream: return this.deserializeReadableStream(node); - case SerovalNodeType.ReadableStreamFactory: case SerovalNodeType.MapSentinel: case SerovalNodeType.IteratorFactory: case SerovalNodeType.AsyncIteratorFactory: + case SerovalNodeType.ReadableStreamFactory: default: throw new Error('invariant'); }