From db57f24b5471ef05935c26f7ebc4090cd5b58181 Mon Sep 17 00:00:00 2001 From: rowan Date: Sat, 24 May 2025 04:10:17 -0500 Subject: [PATCH] fix ts errors; restructure proxy map access; wip serde skip --- dist/ser/impl.d.ts | 4 ++-- dist/ser/impl.js | 7 +++++-- dist/ser/interface.d.ts | 2 +- src/de/generic.ts | 30 ++++++++++++++++-------------- src/ser/impl.ts | 15 +++++++++------ src/ser/interface.ts | 2 +- 6 files changed, 34 insertions(+), 26 deletions(-) diff --git a/dist/ser/impl.d.ts b/dist/ser/impl.d.ts index d214d60..0ad864e 100644 --- a/dist/ser/impl.d.ts +++ b/dist/ser/impl.d.ts @@ -1,4 +1,4 @@ -import { Serializer } from './interface'; +import { ISerializer } from './interface'; import { Nullable } from '../utils'; import { SerdeOptions } from '../option'; -export declare function serialize>(serializer: S, value: V, optionsGetter?: (value: V) => Nullable): T; +export declare function serialize>(serializer: S, value: V, optionsGetter?: (value: V) => Nullable): T; diff --git a/dist/ser/impl.js b/dist/ser/impl.js index c44dfca..a633e7e 100644 --- a/dist/ser/impl.js +++ b/dist/ser/impl.js @@ -9,8 +9,11 @@ class UnhandledTypeError extends TypeError { } function serializeObject(serializer, obj, options) { for (const key in obj) { - const name = (options === null || options === void 0 ? void 0 : options.getSerializationPropertyName(key)) || key; - serializer.serializeEntry(name, obj[key]); + const value = obj[key]; + if (options === null || options === void 0 ? void 0 : options.shouldSerialize(key, value)) { + const name = (options === null || options === void 0 ? void 0 : options.getSerializationPropertyName(key)) || key; + serializer.serializeEntry(name, value); + } } return serializer.end(); } diff --git a/dist/ser/interface.d.ts b/dist/ser/interface.d.ts index 96ab9e5..03c74c6 100644 --- a/dist/ser/interface.d.ts +++ b/dist/ser/interface.d.ts @@ -19,7 +19,7 @@ export declare abstract class SerializeIterable implements ISerializeIterable abstract end(): T; } export interface ISerializer { - serializeAny(value: any): T; + serializeAny?(value: any): T; serializeBoolean(value: boolean): T; serializeNumber(value: number): T; serializeBigInt(value: bigint): T; diff --git a/src/de/generic.ts b/src/de/generic.ts index baff64e..a0a933d 100644 --- a/src/de/generic.ts +++ b/src/de/generic.ts @@ -32,20 +32,22 @@ class ProxyMapAccess implements IMapAccess { } private wrapResponse = IteratorResult>(result: I): I { - if (result.done) { - return result - } else if (isString(result.value)) { - const key = this.options?.getDeserializationPropertyName(result.value) ?? result.value - return IterResult.Next(key) as I - } else if (Array.isArray(result.value)) { - const [alias, value] = result.value - const key = this.options?.getDeserializationPropertyName(alias) ?? alias - return IterResult.Next([ - key, - value - ]) as I - } else { - return result + switch (true) { + default: + case result.done: return result + + case isString(result.value): { + const key = this.options?.getDeserializationPropertyName(result.value) ?? result.value + return IterResult.Next(key) as I + } + case Array.isArray(result.value): { + const [alias, value] = result.value + const key = this.options?.getDeserializationPropertyName(alias) ?? alias + return IterResult.Next([ + key, + value + ]) as I + } } } diff --git a/src/ser/impl.ts b/src/ser/impl.ts index 0541d9c..923029b 100644 --- a/src/ser/impl.ts +++ b/src/ser/impl.ts @@ -1,23 +1,26 @@ -import { ISerializeObject, Serializer } from './interface' +import { ISerializeObject, ISerializer } from './interface' import { isPlainObject, Nullable } from '../utils' import { SerdeOptions } from '../option' class UnhandledTypeError extends TypeError { - constructor(serializer: Serializer, value: any) { + constructor(serializer: ISerializer, value: any) { super(`unhandled type: '${typeof value}' for serializer ${serializer.constructor.name}`) } } function serializeObject>(serializer: S, obj: V, options?: SerdeOptions): T { for (const key in obj) { - const name = options?.getSerializationPropertyName(key) || key - serializer.serializeEntry(name, obj[key]) + const value = obj[key] + if (options?.shouldSerialize(key, value)) { + const name = options?.getSerializationPropertyName(key) || key + serializer.serializeEntry(name, value) + } } return serializer.end() } -function serializeClass>(serializer: S, value: V, options?: SerdeOptions): T { +function serializeClass>(serializer: S, value: V, options?: SerdeOptions): T { const name = value.constructor.name const ser = serializer.serializeClass(name) return serializeObject(ser, value, options) @@ -27,7 +30,7 @@ const defaultGetter = (value: any): Nullable => { return value.constructor[Symbol.metadata]?.serde } -export function serialize>(serializer: S, value: V, optionsGetter: (value: V) => Nullable = defaultGetter): T { +export function serialize>(serializer: S, value: V, optionsGetter: (value: V) => Nullable = defaultGetter): T { switch (typeof value) { case 'string': return serializer.serializeString(value) case 'number': return serializer.serializeNumber(value) diff --git a/src/ser/interface.ts b/src/ser/interface.ts index da53b4c..a7b37b9 100644 --- a/src/ser/interface.ts +++ b/src/ser/interface.ts @@ -27,7 +27,7 @@ export abstract class SerializeIterable implements ISerializeIterable { } export interface ISerializer { - serializeAny(value: any): T + serializeAny?(value: any): T serializeBoolean(value: boolean): T serializeNumber(value: number): T serializeBigInt(value: bigint): T