New Case Study:See how Anthropic automated 95% of dependency reviews with Socket.Learn More
Socket
Sign inDemoInstall
Socket

seroval

Package Overview
Dependencies
Maintainers
1
Versions
66
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

seroval - npm Package Compare versions

Comparing version 0.4.1 to 0.5.0

dist/types/tree/deserialize.d.ts

2

dist/types/compat.d.ts

@@ -17,3 +17,3 @@ /**

Set = 512,
SymbolIterator = 1024,
Symbol = 1024,
TypedArray = 2048,

@@ -20,0 +20,0 @@ BigIntTypedArray = 4096

@@ -0,1 +1,2 @@

import { AsyncServerValue } from './types';
interface IndexAssignment {

@@ -33,2 +34,3 @@ t: 'index';

features: number;
valueMap: Map<number, AsyncServerValue>;
}

@@ -35,0 +37,0 @@ export interface Options {

export default function quote(str: string): string;
export declare function invQuote(str: string): string;
import { ParserContext } from '../context';
import { BigIntTypedArrayValue, TypedArrayValue } from '../types';
import { SerovalBigIntNode, SerovalBigIntTypedArrayNode, SerovalDateNode, SerovalPrimitiveNode, SerovalReferenceNode, SerovalRegExpNode, SerovalTypedArrayNode } from './types';
export declare function createPrimitiveNode(value: string | number | null): SerovalPrimitiveNode;
export declare const TRUE_NODE: SerovalPrimitiveNode;
export declare const FALSE_NODE: SerovalPrimitiveNode;
export declare const UNDEFINED_NODE: SerovalPrimitiveNode;
export declare const NULL_NODE: SerovalPrimitiveNode;
export declare const NEG_ZERO_NODE: SerovalPrimitiveNode;
export declare const INFINITY_NODE: SerovalPrimitiveNode;
export declare const NEG_INFINITY_NODE: SerovalPrimitiveNode;
import { WellKnownSymbols } from './symbols';
import { SerovalBigIntNode, SerovalBigIntTypedArrayNode, SerovalBooleanNode, SerovalDateNode, SerovalInfinityNode, SerovalNaNNode, SerovalNegativeInfinityNode, SerovalNegativeZeroNode, SerovalNullNode, SerovalNumberNode, SerovalReferenceNode, SerovalRegExpNode, SerovalStringNode, SerovalTypedArrayNode, SerovalUndefinedNode, SerovalWKSymbolNode } from './types';
export declare const TRUE_NODE: SerovalBooleanNode;
export declare const FALSE_NODE: SerovalBooleanNode;
export declare const UNDEFINED_NODE: SerovalUndefinedNode;
export declare const NULL_NODE: SerovalNullNode;
export declare const NEG_ZERO_NODE: SerovalNegativeZeroNode;
export declare const INFINITY_NODE: SerovalInfinityNode;
export declare const NEG_INFINITY_NODE: SerovalNegativeInfinityNode;
export declare const NAN_NODE: SerovalNaNNode;
export declare function createNumberNode(value: number): SerovalNumberNode;
export declare function createStringNode(value: string): SerovalStringNode;
export declare function createBigIntNode(ctx: ParserContext, current: bigint): SerovalBigIntNode;

@@ -18,1 +21,2 @@ export declare function createReferenceNode(id: number): SerovalReferenceNode;

export declare function createBigIntTypedArrayNode(ctx: ParserContext, id: number, current: BigIntTypedArrayValue): SerovalBigIntTypedArrayNode;
export declare function createWKSymbolNode(current: WellKnownSymbols): SerovalWKSymbolNode;
import { ParserContext } from '../context';
import { AsyncServerValue, ErrorValue } from '../types';
export declare function getErrorConstructor(error: ErrorValue): "EvalError" | "RangeError" | "ReferenceError" | "SyntaxError" | "TypeError" | "URIError" | "Error";
export declare function getErrorConstructorName(error: ErrorValue): "EvalError" | "RangeError" | "ReferenceError" | "SyntaxError" | "TypeError" | "URIError" | "Error";
export declare function getErrorConstructor(errorName: string): ErrorConstructor;
export declare function getErrorOptions(ctx: ParserContext, error: Error): Record<string, any> | undefined;
export declare function getIterableOptions(obj: Iterable<any>): Record<string, unknown> | undefined;
export declare function isIterable(value: unknown): value is Iterable<AsyncServerValue>;
export declare function getTypedArrayConstructor(name: string): Int8ArrayConstructor | Uint8ArrayConstructor | Uint8ClampedArrayConstructor | Int16ArrayConstructor | Uint16ArrayConstructor | Int32ArrayConstructor | Uint32ArrayConstructor | Float32ArrayConstructor | Float64ArrayConstructor | BigInt64ArrayConstructor | BigUint64ArrayConstructor;
export declare function isValidIdentifier(name: string): boolean;

@@ -1,30 +0,39 @@

import { PrimitiveValue } from '../types';
import { Symbols } from './symbols';
export declare const enum SerovalNodeType {
Primitive = 0,
BigInt = 1,
Reference = 2,
Date = 3,
RegExp = 4,
Set = 5,
Map = 6,
Array = 7,
Object = 8,
NullConstructor = 9,
Promise = 10,
Error = 11,
AggregateError = 12,
Iterable = 13,
TypedArray = 14,
BigIntTypedArray = 15
Number = 0,
String = 1,
Boolean = 2,
Null = 3,
Undefined = 4,
NegativeZero = 5,
Infinity = 6,
NegativeInfinity = 7,
NaN = 8,
BigInt = 9,
Reference = 10,
Date = 11,
RegExp = 12,
Set = 13,
Map = 14,
Array = 15,
Object = 16,
NullConstructor = 17,
Promise = 18,
Error = 19,
AggregateError = 20,
Iterable = 21,
TypedArray = 22,
BigIntTypedArray = 23,
WKSymbol = 24
}
export interface SerovalBaseNode {
t: SerovalNodeType;
s: PrimitiveValue | undefined;
i: number | undefined;
s: any;
l: number | undefined;
c: string | undefined;
m: string | undefined;
d: SerovalDictionaryNode | undefined;
m: string | undefined;
a: SerovalNode[] | undefined;
n: SerovalNode | undefined;
a: SerovalNode[] | undefined;
}

@@ -42,5 +51,33 @@ export interface SerovalObjectRecordNode {

export type SerovalDictionaryNode = SerovalObjectRecordNode | SerovalMapRecordNode;
export interface SerovalPrimitiveNode extends SerovalBaseNode {
t: SerovalNodeType.Primitive;
export interface SerovalNumberNode extends SerovalBaseNode {
t: SerovalNodeType.Number;
s: number;
}
export interface SerovalStringNode extends SerovalBaseNode {
t: SerovalNodeType.String;
s: string;
}
export interface SerovalBooleanNode extends SerovalBaseNode {
t: SerovalNodeType.Boolean;
s: boolean;
}
export interface SerovalNullNode extends SerovalBaseNode {
t: SerovalNodeType.Null;
}
export interface SerovalUndefinedNode extends SerovalBaseNode {
t: SerovalNodeType.Undefined;
}
export interface SerovalNegativeZeroNode extends SerovalBaseNode {
t: SerovalNodeType.NegativeZero;
}
export interface SerovalInfinityNode extends SerovalBaseNode {
t: SerovalNodeType.Infinity;
}
export interface SerovalNegativeInfinityNode extends SerovalBaseNode {
t: SerovalNodeType.NegativeInfinity;
}
export interface SerovalNaNNode extends SerovalBaseNode {
t: SerovalNodeType.NaN;
}
export type SerovalPrimitiveNode = SerovalNumberNode | SerovalStringNode | SerovalBooleanNode | SerovalNullNode | SerovalUndefinedNode | SerovalNegativeZeroNode | SerovalNegativeInfinityNode | SerovalInfinityNode | SerovalNaNNode;
export interface SerovalReferenceNode extends SerovalBaseNode {

@@ -62,3 +99,4 @@ t: SerovalNodeType.Reference;

i: number;
s: string;
c: string;
m: string;
}

@@ -68,3 +106,3 @@ export interface SerovalTypedArrayNode extends SerovalBaseNode {

i: number;
s: string;
s: string[];
l: number;

@@ -76,3 +114,3 @@ c: string;

i: number;
s: string;
s: string[];
l: number;

@@ -84,2 +122,3 @@ c: string;

t: SerovalNodeType.Set;
l: number;
a: SerovalNode[];

@@ -95,2 +134,3 @@ i: number;

t: SerovalNodeType.Array;
l: number;
a: SerovalNode[];

@@ -125,3 +165,4 @@ i: number;

d: SerovalObjectRecordNode | undefined;
n: SerovalNode;
l: number;
a: SerovalNode[];
i: number;

@@ -132,5 +173,10 @@ }

d: SerovalObjectRecordNode | undefined;
l: number;
a: SerovalNode[];
i: number;
}
export type SerovalNode = SerovalPrimitiveNode | SerovalReferenceNode | SerovalSemiPrimitiveNode | SerovalSetNode | SerovalMapNode | SerovalArrayNode | SerovalObjectNode | SerovalNullConstructorNode | SerovalPromiseNode | SerovalErrorNode | SerovalAggregateErrorNode | SerovalIterableNode;
export interface SerovalWKSymbolNode extends SerovalBaseNode {
t: SerovalNodeType.WKSymbol;
s: Symbols;
}
export type SerovalNode = SerovalPrimitiveNode | SerovalReferenceNode | SerovalSemiPrimitiveNode | SerovalSetNode | SerovalMapNode | SerovalArrayNode | SerovalObjectNode | SerovalNullConstructorNode | SerovalPromiseNode | SerovalErrorNode | SerovalAggregateErrorNode | SerovalIterableNode | SerovalWKSymbolNode;

@@ -1,2 +0,3 @@

export type PrimitiveValue = boolean | string | number | undefined | null;
import { WellKnownSymbols } from './tree/symbols';
export type PrimitiveValue = boolean | string | number | undefined | null | WellKnownSymbols;
export type ErrorValue = Error | AggregateError | EvalError | RangeError | ReferenceError | TypeError | SyntaxError | URIError;

@@ -3,0 +4,0 @@ export type TypedArrayValue = Int8Array | Int16Array | Int32Array | Uint8Array | Uint16Array | Uint32Array | Uint8ClampedArray | Float32Array | Float64Array;

{
"name": "seroval",
"type": "module",
"version": "0.4.1",
"version": "0.5.0",
"files": [

@@ -17,6 +17,6 @@ "dist",

"devDependencies": {
"@types/node": "^18.11.18",
"@types/node": "^18.15.3",
"eslint": "^8.32.0",
"eslint-config-lxsmnsyc": "^0.4.8",
"pridepack": "2.4.0",
"pridepack": "2.4.1",
"tslib": "^2.4.1",

@@ -68,3 +68,3 @@ "typescript": "^4.9.4",

},
"gitHead": "a3cfb8eae6e1f9a2d2939b03c5ae88fa24c738f8"
"gitHead": "7c2e32b409df6bc01b5d5b38fdd3f9980a8b4984"
}

@@ -19,3 +19,3 @@ /* eslint-disable guard-for-in */

Set = 0x200,
SymbolIterator = 0x400,
Symbol = 0x400,
TypedArray = 0x800,

@@ -22,0 +22,0 @@ BigIntTypedArray = 0x1000,

import { ALL_ENABLED } from './compat';
import getIdentifier from './get-identifier';
import { AsyncServerValue } from './types';

@@ -50,2 +51,4 @@ interface IndexAssignment {

features: number;
valueMap: Map<number, AsyncServerValue>;
}

@@ -85,2 +88,3 @@

markedRefs: new Set(options.markedRefs),
valueMap: new Map(),
};

@@ -87,0 +91,0 @@ }

@@ -11,2 +11,3 @@ /* eslint-disable no-await-in-loop */

import parseAsync from './tree/async';
import deserializeTree from './tree/deserialize';
import serializeTree, { resolvePatches } from './tree/serialize';

@@ -145,5 +146,9 @@ import parseSync from './tree/sync';

export function fromJSON<T extends AsyncServerValue>(source: SerovalJSON): T {
return deserialize<T>(compileJSON(source));
const serial = createSerializationContext({
features: source.f,
markedRefs: source.m,
});
return deserializeTree(serial, source.t) as T;
}
export default serialize;

@@ -44,3 +44,14 @@ // Written by https://github.com/DylanPiercey and is distributed under the MIT license.

}
return '"' + result + '"';
return result;
}
export function invQuote(str: string): string {
return str
.replace(/\\"/g, '"')
.replace(/\\\\/g, '\\')
.replace(/\\x3C/g, '<')
.replace(/\\n/g, '\n')
.replace(/\\r/g, '\r')
.replace(/\\u2028/g, '\u2028')
.replace(/\\u2029/g, '\u2029');
}

@@ -6,3 +6,2 @@ /* eslint-disable no-await-in-loop */

import { createRef, ParserContext } from '../context';
import quote from '../quote';
import {

@@ -17,7 +16,12 @@ AsyncServerValue,

createDateNode,
createPrimitiveNode,
createNumberNode,
createReferenceNode,
createRegExpNode,
createStringNode,
createTypedArrayNode,
createWKSymbolNode,
FALSE_NODE,
INFINITY_NODE,
NAN_NODE,
NEG_INFINITY_NODE,
NEG_ZERO_NODE,

@@ -29,3 +33,3 @@ NULL_NODE,

import {
getErrorConstructor,
getErrorConstructorName,
getErrorOptions,

@@ -35,2 +39,3 @@ getIterableOptions,

} from './shared';
import { INV_SYMBOL_REF } from './symbols';
import {

@@ -97,3 +102,3 @@ SerovalAggregateErrorNode,

s: undefined,
l: undefined,
l: current.length,
c: undefined,

@@ -176,3 +181,3 @@ m: undefined,

s: undefined,
l: undefined,
l: len,
c: undefined,

@@ -227,4 +232,5 @@ m: undefined,

): Promise<SerovalIterableNode> {
assert(ctx.features & Feature.SymbolIterator, 'Unsupported type "Iterable"');
assert(ctx.features & Feature.Symbol, 'Unsupported type "Iterable"');
const options = getIterableOptions(current);
const array = Array.from(current);
return {

@@ -234,3 +240,3 @@ t: SerovalNodeType.Iterable,

s: undefined,
l: undefined,
l: array.length,
c: undefined,

@@ -242,3 +248,3 @@ m: undefined,

: undefined,
a: await generateNodeList(ctx, Array.from(current)),
a: await generateNodeList(ctx, array),
n: undefined,

@@ -306,8 +312,8 @@ };

s: undefined,
l: undefined,
l: current.errors.length,
c: undefined,
m: current.message,
d: optionsNode,
a: undefined,
n: await parse(ctx, current.errors),
a: await generateNodeList(ctx, current.errors as AsyncServerValue[]),
n: undefined,
};

@@ -330,3 +336,3 @@ }

l: undefined,
c: getErrorConstructor(current),
c: getErrorConstructorName(current),
m: current.message,

@@ -349,4 +355,8 @@ d: optionsNode,

case 'string':
return createPrimitiveNode(quote(current));
return createStringNode(current);
case 'number':
// eslint-disable-next-line no-self-compare
if (current !== current) {
return NAN_NODE;
}
if (Object.is(current, -0)) {

@@ -356,8 +366,8 @@ return NEG_ZERO_NODE;

if (Object.is(current, Infinity)) {
return createPrimitiveNode('1/0');
return INFINITY_NODE;
}
if (Object.is(current, -Infinity)) {
return createPrimitiveNode('-1/0');
return NEG_INFINITY_NODE;
}
return createPrimitiveNode(current);
return createNumberNode(current);
case 'bigint':

@@ -459,2 +469,6 @@ return createBigIntNode(ctx, current);

}
case 'symbol':
assert(ctx.features & Feature.Symbol, 'Unsupported type "symbol"');
assert(current in INV_SYMBOL_REF, 'seroval only supports well-known symbols');
return createWKSymbolNode(current);
default:

@@ -461,0 +475,0 @@ throw new Error('Unsupported type');

import assert from '../assert';
import { Feature } from '../compat';
import { ParserContext } from '../context';
import quote from '../quote';
import { BigIntTypedArrayValue, TypedArrayValue } from '../types';
import { INV_SYMBOL_REF, WellKnownSymbols } from './symbols';
import {
SerovalBigIntNode,
SerovalBigIntTypedArrayNode,
SerovalBooleanNode,
SerovalDateNode,
SerovalInfinityNode,
SerovalNaNNode,
SerovalNegativeInfinityNode,
SerovalNegativeZeroNode,
SerovalNodeType,
SerovalPrimitiveNode,
SerovalNullNode,
SerovalNumberNode,
SerovalReferenceNode,
SerovalRegExpNode,
SerovalStringNode,
SerovalTypedArrayNode,
SerovalUndefinedNode,
SerovalWKSymbolNode,
} from './types';
export function createPrimitiveNode(
value: string | number | null,
): SerovalPrimitiveNode {
export const TRUE_NODE: SerovalBooleanNode = {
t: SerovalNodeType.Boolean,
i: undefined,
s: true,
l: undefined,
c: undefined,
m: undefined,
d: undefined,
a: undefined,
n: undefined,
};
export const FALSE_NODE: SerovalBooleanNode = {
t: SerovalNodeType.Boolean,
i: undefined,
s: false,
l: undefined,
c: undefined,
m: undefined,
d: undefined,
a: undefined,
n: undefined,
};
export const UNDEFINED_NODE: SerovalUndefinedNode = {
t: SerovalNodeType.Undefined,
i: undefined,
s: undefined,
l: undefined,
c: undefined,
m: undefined,
d: undefined,
a: undefined,
n: undefined,
};
export const NULL_NODE: SerovalNullNode = {
t: SerovalNodeType.Null,
i: undefined,
s: undefined,
l: undefined,
c: undefined,
m: undefined,
d: undefined,
a: undefined,
n: undefined,
};
export const NEG_ZERO_NODE: SerovalNegativeZeroNode = {
t: SerovalNodeType.NegativeZero,
i: undefined,
s: undefined,
l: undefined,
c: undefined,
m: undefined,
d: undefined,
a: undefined,
n: undefined,
};
export const INFINITY_NODE: SerovalInfinityNode = {
t: SerovalNodeType.Infinity,
i: undefined,
s: undefined,
l: undefined,
c: undefined,
m: undefined,
d: undefined,
a: undefined,
n: undefined,
};
export const NEG_INFINITY_NODE: SerovalNegativeInfinityNode = {
t: SerovalNodeType.NegativeInfinity,
i: undefined,
s: undefined,
l: undefined,
c: undefined,
m: undefined,
d: undefined,
a: undefined,
n: undefined,
};
export const NAN_NODE: SerovalNaNNode = {
t: SerovalNodeType.NaN,
i: undefined,
s: undefined,
l: undefined,
c: undefined,
m: undefined,
d: undefined,
a: undefined,
n: undefined,
};
export function createNumberNode(value: number): SerovalNumberNode {
return {
t: SerovalNodeType.Primitive,
t: SerovalNodeType.Number,
i: undefined,

@@ -32,9 +130,15 @@ s: value,

export const TRUE_NODE = createPrimitiveNode('!0');
export const FALSE_NODE = createPrimitiveNode('!1');
export const UNDEFINED_NODE = createPrimitiveNode('void 0');
export const NULL_NODE = createPrimitiveNode(null);
export const NEG_ZERO_NODE = createPrimitiveNode('-0');
export const INFINITY_NODE = createPrimitiveNode('1/0');
export const NEG_INFINITY_NODE = createPrimitiveNode('-1/0');
export function createStringNode(value: string): SerovalStringNode {
return {
t: SerovalNodeType.String,
i: undefined,
s: quote(value),
l: undefined,
c: undefined,
m: undefined,
d: undefined,
a: undefined,
n: undefined,
};
}

@@ -49,3 +153,3 @@ export function createBigIntNode(

i: undefined,
s: current.toString() + 'n',
s: current.toString(),
l: undefined,

@@ -92,6 +196,6 @@ c: undefined,

i: id,
s: String(current),
s: undefined,
l: undefined,
c: undefined,
m: undefined,
c: current.source,
m: current.flags,
d: undefined,

@@ -110,6 +214,11 @@ a: undefined,

assert(ctx.features & Feature.TypedArray, `Unsupported value type "${constructor}"`);
const len = current.length;
const values = new Array<string>(len);
for (let i = 0; i < len; i++) {
values[i] = current[i].toString();
}
return {
t: SerovalNodeType.TypedArray,
i: id,
s: current.toString(),
s: values,
l: current.byteOffset,

@@ -136,8 +245,6 @@ c: constructor,

);
let result = '';
for (let i = 0, len = current.length; i < len; i++) {
if (i !== 0) {
result += ',';
}
result += current[i].toString() + 'n';
const len = current.length;
const values = new Array<string>(len);
for (let i = 0; i < len; i++) {
values[i] = current[i].toString();
}

@@ -147,3 +254,3 @@ return {

i: id,
s: result,
s: values,
l: (current as BigInt64Array).byteOffset,

@@ -157,1 +264,17 @@ c: constructor,

}
export function createWKSymbolNode(
current: WellKnownSymbols,
): SerovalWKSymbolNode {
return {
t: SerovalNodeType.WKSymbol,
i: undefined,
s: INV_SYMBOL_REF[current],
l: undefined,
c: undefined,
m: undefined,
d: undefined,
a: undefined,
n: undefined,
};
}

@@ -10,2 +10,4 @@ /* eslint-disable @typescript-eslint/no-use-before-define */

import quote from '../quote';
import { isValidIdentifier } from './shared';
import { SYMBOL_STRING } from './symbols';
import {

@@ -21,2 +23,3 @@ SerovalAggregateErrorNode,

SerovalNullConstructorNode,
SerovalObjectNode,
SerovalObjectRecordNode,

@@ -194,7 +197,5 @@ SerovalPromiseNode,

const IDENTIFIER_CHECK = /^([$A-Z_][0-9A-Z_$]*)$/i;
function serializeNodeList(
ctx: SerializationContext,
node: SerovalArrayNode | SerovalIterableNode,
node: SerovalArrayNode | SerovalIterableNode | SerovalAggregateErrorNode,
) {

@@ -204,3 +205,3 @@ // This is different than Map and Set

// the holes of the Array
const size = node.a.length;
const size = node.l;
let values = '';

@@ -245,3 +246,3 @@ let item: SerovalNode;

function serializeObject(
function serializeProperties(
ctx: SerializationContext,

@@ -268,3 +269,3 @@ sourceID: number,

// so that we don't have to serialize the key and wrap with brackets
isIdentifier = check >= 0 || IDENTIFIER_CHECK.test(key);
isIdentifier = check >= 0 || isValidIdentifier(key);
if (isReferenceInStack(ctx, val)) {

@@ -275,3 +276,3 @@ refParam = getRefParam(ctx, val.i);

} else {
createArrayAssign(ctx, sourceID, isIdentifier ? key : quote(key), refParam);
createArrayAssign(ctx, sourceID, isIdentifier ? key : ('"' + quote(key) + '"'), refParam);
}

@@ -282,3 +283,3 @@ } else {

}
result += isIdentifier ? key : quote(key);
result += isIdentifier ? key : ('"' + quote(key) + '"');
result += ':' + serializeTree(ctx, val);

@@ -298,3 +299,3 @@ hasPrev = true;

) {
const fields = serializeObject(ctx, id, value);
const fields = serializeProperties(ctx, id, value);
if (fields !== '{}') {

@@ -330,7 +331,7 @@ return 'Object.assign(' + serialized + ',' + fields + ')';

// so that we don't have to serialize the key and wrap with brackets
isIdentifier = check >= 0 || IDENTIFIER_CHECK.test(key);
isIdentifier = check >= 0 || isValidIdentifier(key);
if (isIdentifier && Number.isNaN(check)) {
createObjectAssign(ctx, sourceID, key, refParam);
} else {
createArrayAssign(ctx, sourceID, isIdentifier ? key : quote(key), refParam);
createArrayAssign(ctx, sourceID, isIdentifier ? key : ('"' + quote(key) + '"'), refParam);
}

@@ -371,2 +372,9 @@ ctx.assignments = parentAssignment;

function serializeObject(
ctx: SerializationContext,
node: SerovalObjectNode,
) {
return assignRef(ctx, node.i, serializeProperties(ctx, node.i, node.d));
}
function serializeSet(

@@ -377,3 +385,3 @@ ctx: SerializationContext,

let serialized = 'new Set';
const size = node.a.length;
const size = node.l;
if (size) {

@@ -477,3 +485,3 @@ let result = '';

ctx.stack.push(node.i);
const serialized = 'new AggregateError(' + serializeTree(ctx, node.n) + ',' + quote(node.m) + ')';
const serialized = 'new AggregateError(' + serializeNodeList(ctx, node) + ',"' + quote(node.m) + '")';
ctx.stack.pop();

@@ -490,3 +498,3 @@ // `AggregateError` might've been extended

) {
const serialized = 'new ' + node.c + '(' + quote(node.m) + ')';
const serialized = 'new ' + node.c + '("' + quote(node.m) + '")';
return serializeDictionary(ctx, node.i, node.d, serialized);

@@ -526,3 +534,13 @@ }

) {
let args = '[' + node.s + ']';
let result = '';
for (let i = 0, len = node.s.length; i < len; i++) {
if (i !== 0) {
result += ',';
}
result += node.s[i];
if (node.t === SerovalNodeType.BigIntTypedArray) {
result += 'n';
}
}
let args = '[' + result + ']';
if (node.l !== 0) {

@@ -563,6 +581,22 @@ args += ',' + node.l.toString();

switch (node.t) {
case SerovalNodeType.Primitive:
case SerovalNodeType.Number:
return String(node.s);
case SerovalNodeType.String:
return '"' + node.s + '"';
case SerovalNodeType.Boolean:
return node.s ? '!0' : '!1';
case SerovalNodeType.Undefined:
return 'undefined';
case SerovalNodeType.Null:
return 'null';
case SerovalNodeType.NegativeZero:
return '-0';
case SerovalNodeType.Infinity:
return '1/0';
case SerovalNodeType.NegativeInfinity:
return '-1/0';
case SerovalNodeType.NaN:
return 'NaN';
case SerovalNodeType.BigInt:
return node.s;
return node.s + 'n';
case SerovalNodeType.Reference:

@@ -573,3 +607,3 @@ return getRefParam(ctx, node.i);

case SerovalNodeType.Object:
return assignRef(ctx, node.i, serializeObject(ctx, node.i, node.d));
return serializeObject(ctx, node);
case SerovalNodeType.NullConstructor:

@@ -580,3 +614,3 @@ return serializeNullConstructor(ctx, node);

case SerovalNodeType.RegExp:
return assignRef(ctx, node.i, node.s);
return assignRef(ctx, node.i, '/' + node.c + '/' + node.m);
case SerovalNodeType.Set:

@@ -597,2 +631,4 @@ return serializeSet(ctx, node);

return serializePromise(ctx, node);
case SerovalNodeType.WKSymbol:
return SYMBOL_STRING[node.s];
default:

@@ -599,0 +635,0 @@ throw new Error('Unsupported type');

@@ -8,3 +8,3 @@ import { Feature } from '../compat';

export function getErrorConstructor(error: ErrorValue) {
export function getErrorConstructorName(error: ErrorValue) {
if (error instanceof EvalError) {

@@ -31,2 +31,16 @@ return 'EvalError';

export function getErrorConstructor(errorName: string) {
switch (errorName) {
case 'Error': return Error;
case 'EvalError': return EvalError;
case 'RangeError': return RangeError;
case 'ReferenceError': return ReferenceError;
case 'SyntaxError': return SyntaxError;
case 'TypeError': return TypeError;
case 'URIError': return URIError;
default:
throw new Error(`Unknown Error constructor "${errorName}"`);
}
}
export function getErrorOptions(

@@ -37,3 +51,3 @@ ctx: ParserContext,

let options: Record<string, any> | undefined;
const constructor = getErrorConstructor(error);
const constructor = getErrorConstructorName(error);
// Name has been modified

@@ -105,1 +119,31 @@ if (error.name !== constructor) {

}
export function getTypedArrayConstructor(name: string) {
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) {
const char = name[0];
return (
char === '$'
|| char === '_'
|| (char >= 'A' && char <= 'Z')
|| (char >= 'a' && char <= 'z')
) && IDENTIFIER_CHECK.test(name);
}

@@ -5,3 +5,2 @@ /* eslint-disable @typescript-eslint/no-use-before-define */

import { createRef, ParserContext } from '../context';
import quote from '../quote';
import { BigIntTypedArrayValue, ServerValue, TypedArrayValue } from '../types';

@@ -12,7 +11,12 @@ import {

createDateNode,
createPrimitiveNode,
createNumberNode,
createReferenceNode,
createRegExpNode,
createStringNode,
createTypedArrayNode,
createWKSymbolNode,
FALSE_NODE,
INFINITY_NODE,
NAN_NODE,
NEG_INFINITY_NODE,
NEG_ZERO_NODE,

@@ -24,3 +28,3 @@ NULL_NODE,

import {
getErrorConstructor,
getErrorConstructorName,
getErrorOptions,

@@ -30,2 +34,3 @@ getIterableOptions,

} from './shared';
import { INV_SYMBOL_REF } from './symbols';
import {

@@ -79,3 +84,3 @@ SerovalAggregateErrorNode,

s: undefined,
l: undefined,
l: current.length,
c: undefined,

@@ -158,3 +163,3 @@ m: undefined,

s: undefined,
l: undefined,
l: len,
c: undefined,

@@ -209,4 +214,5 @@ m: undefined,

): SerovalIterableNode {
assert(ctx.features & Feature.SymbolIterator, 'Unsupported type "Iterable"');
assert(ctx.features & Feature.Symbol, 'Unsupported type "Iterable"');
const options = getIterableOptions(current);
const array = Array.from(current);
return {

@@ -216,3 +222,3 @@ t: SerovalNodeType.Iterable,

s: undefined,
l: undefined,
l: array.length,
c: undefined,

@@ -224,3 +230,3 @@ m: undefined,

: undefined,
a: generateNodeList(ctx, Array.from(current)),
a: generateNodeList(ctx, array),
n: undefined,

@@ -265,8 +271,8 @@ };

s: undefined,
l: undefined,
l: current.errors.length,
c: undefined,
m: current.message,
d: optionsNode,
a: undefined,
n: parse(ctx, current.errors),
a: generateNodeList(ctx, current.errors as ServerValue[]),
n: undefined,
};

@@ -289,3 +295,3 @@ }

l: undefined,
c: getErrorConstructor(current),
c: getErrorConstructorName(current),
m: current.message,

@@ -308,4 +314,8 @@ d: optionsNode,

case 'string':
return createPrimitiveNode(quote(current));
return createStringNode(current);
case 'number':
// eslint-disable-next-line no-self-compare
if (current !== current) {
return NAN_NODE;
}
if (Object.is(current, -0)) {

@@ -315,8 +325,8 @@ return NEG_ZERO_NODE;

if (Object.is(current, Infinity)) {
return createPrimitiveNode('1/0');
return INFINITY_NODE;
}
if (Object.is(current, -Infinity)) {
return createPrimitiveNode('-1/0');
return NEG_INFINITY_NODE;
}
return createPrimitiveNode(current);
return createNumberNode(current);
case 'bigint':

@@ -391,2 +401,6 @@ return createBigIntNode(ctx, current);

}
case 'symbol':
assert(ctx.features & Feature.Symbol, 'Unsupported type "symbol"');
assert(current in INV_SYMBOL_REF, 'seroval only supports well-known symbols');
return createWKSymbolNode(current);
default:

@@ -393,0 +407,0 @@ throw new Error('Unsupported type');

@@ -1,5 +0,13 @@

import { PrimitiveValue } from '../types';
import { Symbols } from './symbols';
export const enum SerovalNodeType {
Primitive,
Number,
String,
Boolean,
Null,
Undefined,
NegativeZero,
Infinity,
NegativeInfinity,
NaN,
BigInt,

@@ -20,2 +28,3 @@ Reference,

BigIntTypedArray,
WKSymbol,
}

@@ -26,18 +35,18 @@

t: SerovalNodeType;
// Serialized value
s: PrimitiveValue | undefined;
// Reference ID
i: number | undefined;
// Serialized value
s: any;
// Size/Byte offset
l: number | undefined;
// Constructor name
// Constructor name / RegExp source
c: string | undefined;
// message /flags
m: string | undefined;
// dictionary
d: SerovalDictionaryNode | undefined;
// message
m: string | undefined;
// array of nodes
a: SerovalNode[] | undefined;
// next node
n: SerovalNode | undefined;
// array of nodes
a: SerovalNode[] | undefined;
}

@@ -61,6 +70,52 @@

export interface SerovalPrimitiveNode extends SerovalBaseNode {
t: SerovalNodeType.Primitive;
export interface SerovalNumberNode extends SerovalBaseNode {
t: SerovalNodeType.Number;
s: number;
}
export interface SerovalStringNode extends SerovalBaseNode {
t: SerovalNodeType.String;
s: string;
}
export interface SerovalBooleanNode extends SerovalBaseNode {
t: SerovalNodeType.Boolean;
s: boolean;
}
export interface SerovalNullNode extends SerovalBaseNode {
t: SerovalNodeType.Null;
}
export interface SerovalUndefinedNode extends SerovalBaseNode {
t: SerovalNodeType.Undefined;
}
export interface SerovalNegativeZeroNode extends SerovalBaseNode {
t: SerovalNodeType.NegativeZero;
}
export interface SerovalInfinityNode extends SerovalBaseNode {
t: SerovalNodeType.Infinity;
}
export interface SerovalNegativeInfinityNode extends SerovalBaseNode {
t: SerovalNodeType.NegativeInfinity;
}
export interface SerovalNaNNode extends SerovalBaseNode {
t: SerovalNodeType.NaN;
}
export type SerovalPrimitiveNode =
| SerovalNumberNode
| SerovalStringNode
| SerovalBooleanNode
| SerovalNullNode
| SerovalUndefinedNode
| SerovalNegativeZeroNode
| SerovalNegativeInfinityNode
| SerovalInfinityNode
| SerovalNaNNode;
export interface SerovalReferenceNode extends SerovalBaseNode {

@@ -85,3 +140,6 @@ t: SerovalNodeType.Reference;

i: number;
s: string;
// source
c: string;
// flags
m: string;
}

@@ -92,3 +150,3 @@

i: number;
s: string;
s: string[];
l: number;

@@ -101,3 +159,3 @@ c: string;

i: number;
s: string;
s: string[];
l: number;

@@ -116,2 +174,3 @@ c: string;

t: SerovalNodeType.Set;
l: number;
a: SerovalNode[];

@@ -129,2 +188,3 @@ i: number;

t: SerovalNodeType.Array;
l: number;
a: SerovalNode[];

@@ -164,3 +224,4 @@ i: number;

d: SerovalObjectRecordNode | undefined;
n: SerovalNode;
l: number;
a: SerovalNode[];
i: number;

@@ -172,2 +233,3 @@ }

d: SerovalObjectRecordNode | undefined;
l: number;
a: SerovalNode[];

@@ -177,2 +239,7 @@ i: number;

export interface SerovalWKSymbolNode extends SerovalBaseNode {
t: SerovalNodeType.WKSymbol;
s: Symbols;
}
export type SerovalNode =

@@ -190,2 +257,3 @@ | SerovalPrimitiveNode

| SerovalAggregateErrorNode
| SerovalIterableNode;
| SerovalIterableNode
| SerovalWKSymbolNode;

@@ -0,1 +1,3 @@

import { WellKnownSymbols } from './tree/symbols';
// Values that are non-recursive

@@ -7,3 +9,4 @@ export type PrimitiveValue =

| undefined
| null;
| null
| WellKnownSymbols;

@@ -10,0 +13,0 @@ export type ErrorValue =

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

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc