Comparing version 0.11.1 to 0.11.2
@@ -8,3 +8,3 @@ import type { ErrorValue } from '../types'; | ||
export declare function getErrorOptions(ctx: BaseParserContext, error: Error): Record<string, unknown> | undefined; | ||
export declare function isIterable(value: unknown): value is Iterable<unknown>; | ||
export declare function isIterable(ctx: BaseParserContext, value: unknown): value is Iterable<unknown>; | ||
type TypedArrayConstructor = Int8ArrayConstructor | Int16ArrayConstructor | Int32ArrayConstructor | Uint8ArrayConstructor | Uint16ArrayConstructor | Uint32ArrayConstructor | Uint8ClampedArrayConstructor | Float32ArrayConstructor | Float64ArrayConstructor | BigInt64ArrayConstructor | BigUint64ArrayConstructor; | ||
@@ -11,0 +11,0 @@ export declare function getTypedArrayConstructor(name: string): TypedArrayConstructor; |
{ | ||
"name": "seroval", | ||
"type": "module", | ||
"version": "0.11.1", | ||
"version": "0.11.2", | ||
"files": [ | ||
@@ -69,3 +69,3 @@ "dist", | ||
}, | ||
"gitHead": "745467fa453ee90169f50bf543f5a8649699982e" | ||
"gitHead": "173cf11aa7ed25209055e127bc3831b9fef52e95" | ||
} |
@@ -99,3 +99,3 @@ /* eslint-disable no-await-in-loop */ | ||
item = current[i]; | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferred[i] = item; | ||
@@ -150,3 +150,3 @@ } else { | ||
// Either key or value might be an iterable | ||
if (isIterable(key) || isIterable(value)) { | ||
if (isIterable(ctx, key) || isIterable(ctx, value)) { | ||
deferredKey[deferredSize] = key; | ||
@@ -193,3 +193,3 @@ deferredValue[deferredSize] = value; | ||
// Iterables are lazy, so the evaluation must be deferred | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferred[deferredSize++] = item; | ||
@@ -237,3 +237,3 @@ } else { | ||
escaped = serializeString(key); | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferredKeys[deferredSize] = escaped; | ||
@@ -288,3 +288,3 @@ deferredValues[deferredSize] = item; | ||
escaped = serializeString(key); | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferredKeys[deferredSize] = escaped; | ||
@@ -291,0 +291,0 @@ deferredValues[deferredSize] = item; |
import assert from '../assert'; | ||
import { Feature } from '../compat'; | ||
import type { CrossParserContext } from './context'; | ||
import type { BigIntTypedArrayValue, TypedArrayValue } from '../../types'; | ||
import UnsupportedTypeError from '../UnsupportedTypeError'; | ||
import { hasReferenceID } from '../reference'; | ||
@@ -59,4 +57,2 @@ import type { | ||
const BIGINT_FLAG = Feature.BigIntTypedArray | Feature.BigInt; | ||
export function createBigIntTypedArrayNode( | ||
@@ -67,6 +63,2 @@ ctx: CrossParserContext, | ||
): SerovalBigIntTypedArrayNode { | ||
assert( | ||
(ctx.features & BIGINT_FLAG) === BIGINT_FLAG, | ||
new UnsupportedTypeError(current), | ||
); | ||
return { | ||
@@ -73,0 +65,0 @@ t: SerovalNodeType.BigIntTypedArray, |
@@ -99,3 +99,3 @@ /* eslint-disable no-await-in-loop */ | ||
item = current[i]; | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferred[i] = item; | ||
@@ -150,3 +150,3 @@ } else { | ||
// Either key or value might be an iterable | ||
if (isIterable(key) || isIterable(value)) { | ||
if (isIterable(ctx, key) || isIterable(ctx, value)) { | ||
deferredKey[deferredSize] = key; | ||
@@ -193,3 +193,3 @@ deferredValue[deferredSize] = value; | ||
// Iterables are lazy, so the evaluation must be deferred | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferred[deferredSize++] = item; | ||
@@ -237,3 +237,3 @@ } else { | ||
escaped = serializeString(key); | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferredKeys[deferredSize] = escaped; | ||
@@ -288,3 +288,3 @@ deferredValues[deferredSize] = item; | ||
escaped = serializeString(key); | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferredKeys[deferredSize] = escaped; | ||
@@ -515,53 +515,13 @@ deferredValues[deferredSize] = item; | ||
function generateReadableStreamNode( | ||
function pushReadableStreamState( | ||
ctx: StreamingCrossParserContext, | ||
id: number, | ||
current: ReadableStream<unknown>, | ||
): SerovalReadableStreamConstructorNode { | ||
const reader = current.getReader(); | ||
pushPendingState(ctx); | ||
function push(): void { | ||
reader.read().then( | ||
(data) => { | ||
if (ctx.alive) { | ||
if (data.done) { | ||
ctx.onParse({ | ||
t: SerovalNodeType.ReadableStreamClose, | ||
i: id, | ||
s: undefined, | ||
l: undefined, | ||
c: undefined, | ||
m: undefined, | ||
p: undefined, | ||
e: undefined, | ||
a: undefined, | ||
f: undefined, | ||
b: undefined, | ||
o: undefined, | ||
}, false); | ||
popPendingState(ctx); | ||
} else { | ||
ctx.onParse({ | ||
t: SerovalNodeType.ReadableStreamEnqueue, | ||
i: id, | ||
s: undefined, | ||
l: undefined, | ||
c: undefined, | ||
m: undefined, | ||
p: undefined, | ||
e: undefined, | ||
a: undefined, | ||
f: crossParseStream(ctx, data.value), | ||
b: undefined, | ||
o: undefined, | ||
}, false); | ||
push(); | ||
} | ||
} | ||
}, | ||
(value) => { | ||
if (ctx.alive) { | ||
reader: ReadableStreamDefaultReader, | ||
): void { | ||
reader.read().then( | ||
(data) => { | ||
if (ctx.alive) { | ||
if (data.done) { | ||
ctx.onParse({ | ||
t: SerovalNodeType.ReadableStreamError, | ||
t: SerovalNodeType.ReadableStreamClose, | ||
i: id, | ||
@@ -575,3 +535,3 @@ s: undefined, | ||
a: undefined, | ||
f: crossParseStream(ctx, value), | ||
f: undefined, | ||
b: undefined, | ||
@@ -581,8 +541,50 @@ o: undefined, | ||
popPendingState(ctx); | ||
} else { | ||
ctx.onParse({ | ||
t: SerovalNodeType.ReadableStreamEnqueue, | ||
i: id, | ||
s: undefined, | ||
l: undefined, | ||
c: undefined, | ||
m: undefined, | ||
p: undefined, | ||
e: undefined, | ||
a: undefined, | ||
f: crossParseStream(ctx, data.value), | ||
b: undefined, | ||
o: undefined, | ||
}, false); | ||
pushReadableStreamState(ctx, id, reader); | ||
} | ||
}, | ||
); | ||
} | ||
} | ||
}, | ||
(value) => { | ||
if (ctx.alive) { | ||
ctx.onParse({ | ||
t: SerovalNodeType.ReadableStreamError, | ||
i: id, | ||
s: undefined, | ||
l: undefined, | ||
c: undefined, | ||
m: undefined, | ||
p: undefined, | ||
e: undefined, | ||
a: undefined, | ||
f: crossParseStream(ctx, value), | ||
b: undefined, | ||
o: undefined, | ||
}, false); | ||
popPendingState(ctx); | ||
} | ||
}, | ||
); | ||
} | ||
push(); | ||
function generateReadableStreamNode( | ||
ctx: StreamingCrossParserContext, | ||
id: number, | ||
current: ReadableStream<unknown>, | ||
): SerovalReadableStreamConstructorNode { | ||
pushPendingState(ctx); | ||
pushReadableStreamState(ctx, id, current.getReader()); | ||
@@ -589,0 +591,0 @@ return { |
@@ -74,3 +74,3 @@ /* eslint-disable @typescript-eslint/no-use-before-define */ | ||
item = current[i]; | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferred[i] = item; | ||
@@ -125,3 +125,3 @@ } else { | ||
// Either key or value might be an iterable | ||
if (isIterable(key) || isIterable(value)) { | ||
if (isIterable(ctx, key) || isIterable(ctx, value)) { | ||
deferredKey[deferredSize] = key; | ||
@@ -168,3 +168,3 @@ deferredValue[deferredSize] = value; | ||
// Iterables are lazy, so the evaluation must be deferred | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferred[deferredSize++] = item; | ||
@@ -212,3 +212,3 @@ } else { | ||
escaped = serializeString(key); | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferredKeys[deferredSize] = escaped; | ||
@@ -259,3 +259,3 @@ deferredValues[deferredSize] = item; | ||
escaped = serializeString(key); | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferredKeys[deferredSize] = escaped; | ||
@@ -262,0 +262,0 @@ deferredValues[deferredSize] = item; |
@@ -1,2 +0,2 @@ | ||
import { Feature } from './compat'; | ||
import { BIGINT_FLAG, Feature } from './compat'; | ||
import type { | ||
@@ -85,2 +85,3 @@ ErrorValue, | ||
export function isIterable( | ||
ctx: BaseParserContext, | ||
value: unknown, | ||
@@ -94,20 +95,45 @@ ): value is Iterable<unknown> { | ||
} | ||
switch (value.constructor) { | ||
case Map: | ||
case Set: | ||
case Int8Array: | ||
case Int16Array: | ||
case Int32Array: | ||
case Uint8Array: | ||
case Uint16Array: | ||
case Uint32Array: | ||
case Uint8ClampedArray: | ||
case Float32Array: | ||
case Float64Array: | ||
case BigInt64Array: | ||
case BigUint64Array: | ||
return false; | ||
default: | ||
break; | ||
const currentClass = value.constructor; | ||
if (ctx.features & 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 ((ctx.features & BIGINT_FLAG) === BIGINT_FLAG) { | ||
switch (currentClass) { | ||
case BigInt64Array: | ||
case BigUint64Array: | ||
return false; | ||
default: | ||
break; | ||
} | ||
} | ||
// ES Collection | ||
if (ctx.features & Feature.Map && currentClass === Map) { | ||
return false; | ||
} | ||
if (ctx.features & Feature.Set && currentClass === Set) { | ||
return false; | ||
} | ||
if (ctx.features & Feature.WebAPI) { | ||
switch (currentClass) { | ||
case Headers: | ||
case File: | ||
return false; | ||
default: | ||
break; | ||
} | ||
} | ||
return Symbol.iterator in value; | ||
@@ -114,0 +140,0 @@ } |
@@ -99,3 +99,3 @@ /* eslint-disable no-await-in-loop */ | ||
item = current[i]; | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferred[i] = item; | ||
@@ -150,3 +150,3 @@ } else { | ||
// Either key or value might be an iterable | ||
if (isIterable(key) || isIterable(value)) { | ||
if (isIterable(ctx, key) || isIterable(ctx, value)) { | ||
deferredKey[deferredSize] = key; | ||
@@ -193,3 +193,3 @@ deferredValue[deferredSize] = value; | ||
// Iterables are lazy, so the evaluation must be deferred | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferred[deferredSize++] = item; | ||
@@ -237,3 +237,3 @@ } else { | ||
escaped = serializeString(key); | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferredKeys[deferredSize] = escaped; | ||
@@ -288,3 +288,3 @@ deferredValues[deferredSize] = item; | ||
escaped = serializeString(key); | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferredKeys[deferredSize] = escaped; | ||
@@ -291,0 +291,0 @@ deferredValues[deferredSize] = item; |
@@ -75,3 +75,3 @@ /* eslint-disable @typescript-eslint/no-use-before-define */ | ||
item = current[i]; | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferred[i] = item; | ||
@@ -126,3 +126,3 @@ } else { | ||
// Either key or value might be an iterable | ||
if (isIterable(key) || isIterable(value)) { | ||
if (isIterable(ctx, key) || isIterable(ctx, value)) { | ||
deferredKey[deferredSize] = key; | ||
@@ -169,3 +169,3 @@ deferredValue[deferredSize] = value; | ||
// Iterables are lazy, so the evaluation must be deferred | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferred[deferredSize++] = item; | ||
@@ -213,3 +213,3 @@ } else { | ||
escaped = serializeString(key); | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferredKeys[deferredSize] = escaped; | ||
@@ -261,3 +261,3 @@ deferredValues[deferredSize] = item; | ||
escaped = serializeString(key); | ||
if (isIterable(item)) { | ||
if (isIterable(ctx, item)) { | ||
deferredKeys[deferredSize] = escaped; | ||
@@ -264,0 +264,0 @@ deferredValues[deferredSize] = item; |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
1378904
20530