property renaming

This commit is contained in:
Rowan 2025-05-17 00:14:27 -05:00
parent 1e3d8588ac
commit 548c206afb
5 changed files with 19 additions and 11 deletions

View file

@ -1,3 +1,4 @@
import { Serde } from '../decorator'
import { Constructor, staticImplements } from '../utils' import { Constructor, staticImplements } from '../utils'
import { GenericVisitor } from './generic' import { GenericVisitor } from './generic'
import { Deserialize, Deserializer } from './interface' import { Deserialize, Deserializer } from './interface'
@ -10,6 +11,7 @@ export function deserialize<T, C extends Constructor>(constructor: C) {
return deserializer.deserializeAny(visitor) return deserializer.deserializeAny(visitor)
} }
} }
Deserializable[Serde] = (constructor as any)[Serde]
return Deserializable return Deserializable
} }

View file

@ -2,7 +2,6 @@ import { ContainerOptions, PropertyOptions, SerdeOptions } from "./options"
export const Serde = Symbol('Serde') export const Serde = Symbol('Serde')
function decorateContainer(options: ContainerOptions, constructor: any) { function decorateContainer(options: ContainerOptions, constructor: any) {
if (constructor[Serde] == null) { if (constructor[Serde] == null) {
constructor[Serde] = new SerdeOptions(constructor, options) constructor[Serde] = new SerdeOptions(constructor, options)
@ -14,11 +13,11 @@ function decorateContainer(options: ContainerOptions, constructor: any) {
} }
function decorateProperty(options: PropertyOptions, target: any, property: PropertyKey) { function decorateProperty(options: PropertyOptions, target: any, property: PropertyKey) {
let constructor let constructor: any
if (typeof target === 'function') { if (typeof target === 'function') {
constructor = target.constructor
} else {
constructor = target constructor = target
} else {
constructor = target.constructor
} }
if (constructor[Serde] == null) { if (constructor[Serde] == null) {
@ -26,6 +25,7 @@ function decorateProperty(options: PropertyOptions, target: any, property: Prope
} }
constructor[Serde].properties.set(property, options) constructor[Serde].properties.set(property, options)
return target
} }

View file

@ -1,15 +1,16 @@
import { Serde } from '../decorator' import { Serde } from '../decorator'
import { SerdeOptions } from '../options' import { SerdeOptions, Stage } from '../options'
import { ifNull, isFunction, isIterable, Nullable, orElse } from '../utils' import { ifNull, isFunction, isIterable, Nullable, orElse } from '../utils'
import { IterableSerializer, ObjectSerializer, Serializable, Serializer } from './interface' import { IterableSerializer, ObjectSerializer, Serializable, Serializer } from './interface'
const unhandledType = (serializer: any, value: any) => new TypeError(`'${serializer.constructor.name}' has no method for value type '${typeof value}'`) const unhandledType = (serializer: any, value: any) => new TypeError(`'${serializer.constructor.name}' has no method for value type '${typeof value}'`)
function serializeEntries<T, K extends Serializable, V extends Serializable, E extends Iterable<[K, V]>>(serializer: ObjectSerializer<T>, value: E) { function serializeEntries<T, K extends Serializable, V extends Serializable, E extends Iterable<[K, V]>>(serializer: ObjectSerializer<T>, value: E, options?: SerdeOptions) {
let state let state
for (const [key, val] of value) { for (const [key, val] of value) {
state = serializer.serializeKey(key) const name = options?.getPropertyName(key as string, Stage.Serialize) ?? key
state = serializer.serializeKey(name)
state = serializer.serializeValue(val) state = serializer.serializeValue(val)
} }
@ -17,7 +18,7 @@ function serializeEntries<T, K extends Serializable, V extends Serializable, E e
} }
function serializeObject<T, K extends PropertyKey, V extends Serializable, R extends Record<K, V>>(serializer: ObjectSerializer<T>, value: R, options?: SerdeOptions) { function serializeObject<T, K extends PropertyKey, V extends Serializable, R extends Record<K, V>>(serializer: ObjectSerializer<T>, value: R, options?: SerdeOptions) {
return serializeEntries(serializer, Object.entries(value) as Iterable<[K, V]>) return serializeEntries(serializer, Object.entries(value) as Iterable<[K, V]>, options)
} }
function serializeIter<T, V extends Iterable<any>>(serializer: IterableSerializer<T>, value: V) { function serializeIter<T, V extends Iterable<any>>(serializer: IterableSerializer<T>, value: V) {

View file

@ -1,9 +1,10 @@
import { Serde } from '../decorator'
import { Constructor } from '../utils' import { Constructor } from '../utils'
import { serializeWith } from './impl' import { serializeWith } from './impl'
import { isGenericSerializer, Serializer } from './interface' import { isGenericSerializer, Serializer } from './interface'
export function serialize<T extends Constructor>(constructor: T) { export function serialize<T extends Constructor>(constructor: T) {
return class Serializable extends constructor implements Serializable { class Serializable extends constructor implements Serializable {
static name = constructor.name static name = constructor.name
serialize<U>(serializer: Serializer<U>): U { serialize<U>(serializer: Serializer<U>): U {
// shortcut for serializers with only the serializeAny method // shortcut for serializers with only the serializeAny method
@ -14,4 +15,8 @@ export function serialize<T extends Constructor>(constructor: T) {
} }
} }
} }
Serializable[Serde] = (constructor as any)[Serde]
return Serializable
} }

View file

@ -15,8 +15,8 @@
"lib": ["es2020", "dom"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ "lib": ["es2020", "dom"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */
// "jsx": "preserve", /* Specify what JSX code is generated. */ // "jsx": "preserve", /* Specify what JSX code is generated. */
// "libReplacement": true, /* Enable lib replacement. */ // "libReplacement": true, /* Enable lib replacement. */
// "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */
// "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ //"emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */
// "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */
// "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */
// "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */