fix ts errors; restructure proxy map access; wip serde skip

This commit is contained in:
Rowan 2025-05-24 04:10:17 -05:00
parent b4c7a9ba2b
commit db57f24b54
6 changed files with 34 additions and 26 deletions

4
dist/ser/impl.d.ts vendored
View file

@ -1,4 +1,4 @@
import { Serializer } from './interface';
import { ISerializer } from './interface';
import { Nullable } from '../utils';
import { SerdeOptions } from '../option';
export declare function serialize<T, V, S extends Serializer<T>>(serializer: S, value: V, optionsGetter?: (value: V) => Nullable<SerdeOptions>): T;
export declare function serialize<T, V, S extends ISerializer<T>>(serializer: S, value: V, optionsGetter?: (value: V) => Nullable<SerdeOptions>): T;

7
dist/ser/impl.js vendored
View file

@ -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();
}

View file

@ -19,7 +19,7 @@ export declare abstract class SerializeIterable<T> implements ISerializeIterable
abstract end(): T;
}
export interface ISerializer<T> {
serializeAny(value: any): T;
serializeAny?(value: any): T;
serializeBoolean(value: boolean): T;
serializeNumber(value: number): T;
serializeBigInt(value: bigint): T;

View file

@ -32,20 +32,22 @@ class ProxyMapAccess implements IMapAccess {
}
private wrapResponse<T, I extends IteratorResult<T> = IteratorResult<T>>(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
}
}
}

View file

@ -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<unknown>, value: any) {
constructor(serializer: ISerializer<unknown>, value: any) {
super(`unhandled type: '${typeof value}' for serializer ${serializer.constructor.name}`)
}
}
function serializeObject<T, V extends object, S extends ISerializeObject<T>>(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<T, V extends object, S extends Serializer<T>>(serializer: S, value: V, options?: SerdeOptions): T {
function serializeClass<T, V extends object, S extends ISerializer<T>>(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<SerdeOptions> => {
return value.constructor[Symbol.metadata]?.serde
}
export function serialize<T, V, S extends Serializer<T>>(serializer: S, value: V, optionsGetter: (value: V) => Nullable<SerdeOptions> = defaultGetter): T {
export function serialize<T, V, S extends ISerializer<T>>(serializer: S, value: V, optionsGetter: (value: V) => Nullable<SerdeOptions> = defaultGetter): T {
switch (typeof value) {
case 'string': return serializer.serializeString(value)
case 'number': return serializer.serializeNumber(value)

View file

@ -27,7 +27,7 @@ export abstract class SerializeIterable<T> implements ISerializeIterable<T> {
}
export interface ISerializer<T> {
serializeAny(value: any): T
serializeAny?(value: any): T
serializeBoolean(value: boolean): T
serializeNumber(value: number): T
serializeBigInt(value: bigint): T