@daiso-tech/core
Version:
The library offers flexible, framework-agnostic solutions for modern web applications, built on adaptable components that integrate seamlessly with popular frameworks like Next Js.
273 lines • 10.5 kB
JavaScript
/**
* @module Serde
*/
import { getConstructorName, resolveOneOrMoreStr, } from "../../../utilities/_module-exports.js";
import { ArrayBufferSerdeTransformer, BufferSerdeTransformer, Uint8ArraySerdeTransformer, Int8ArraySerdeTransformer, Uint16ArraySerdeTransformer, Int16ArraySerdeTransformer, Uint32ArraySerdeTransformer, Int32ArraySerdeTransformer, BigUint64ArraySerdeTransformer, BigInt64ArraySerdeTransformer, Float32ArraySerdeTransformer, Float64ArraySerdeTransformer, MapSerdeTransformer, SetSerdeTransformer, BigIntSerdeTransformer, NaNSerdeTransformer, InfinitySerdeTransformer, UndefinedSerdeTransformer, RegExpSerdeTransformer, DateSerdeTransformer, URLSerdeTransformer, URLSearchParamsSerdeTransformer, } from "../../../serde/implementations/derivables/serde-transformers.js";
/**
* `Serde` class can be derived from any {@link IFlexibleSerdeAdapter | `IFlexibleSerdeAdapter`}.
*
* IMPORT_PATH: `"@daiso-tech/core/serde/deriavables"`
* @group Derivables
*/
export class Serde {
serdeAdapter;
/**
* @example
* ```ts
* import type { IFlexibleSerde } from "@daiso-tech/core/serde/contracts";
* import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/adapters";
* import { Serde } from "@daiso-tech/core/serde";
*
* const serde: IFlexibleSerde = new Serde(new SuperJsonSerdeAdapter());
* ```
*/
constructor(serdeAdapter, settings = {}) {
this.serdeAdapter = serdeAdapter;
const { shouldHandleArrayBuffer = true, shouldHandleBuffer = true, shouldHandleUint8Array = true, shouldHandleInt8Array = true, shouldHandleUint16Array = true, shouldHandleInt16Array = true, shouldHandleUint32Array = true, shouldHandleInt32Array = true, shouldHandleBigUint64Array = true, shouldHandleBigInt64Array = true, shouldHandleFloat32Array = true, shouldHandleFloat64Array = true, shouldHandleMap = true, shouldHandleSet = true, shouldHandleBigInt = true, shouldHandleNaN = true, shouldHandleInfinity = true, shouldHandleRegExp = true, shouldHandleDate = true, shouldHandleUndefined = true, shouldHandleURL = true, shouldHandleURLSearchParams = true, } = settings;
if (shouldHandleArrayBuffer) {
this.registerCustom(new ArrayBufferSerdeTransformer());
}
if (shouldHandleBuffer) {
this.registerCustom(new BufferSerdeTransformer());
}
if (shouldHandleUint8Array) {
this.registerCustom(new Uint8ArraySerdeTransformer());
}
if (shouldHandleInt8Array) {
this.registerCustom(new Int8ArraySerdeTransformer());
}
if (shouldHandleUint16Array) {
this.registerCustom(new Uint16ArraySerdeTransformer());
}
if (shouldHandleInt16Array) {
this.registerCustom(new Int16ArraySerdeTransformer());
}
if (shouldHandleUint32Array) {
this.registerCustom(new Uint32ArraySerdeTransformer());
}
if (shouldHandleInt32Array) {
this.registerCustom(new Int32ArraySerdeTransformer());
}
if (shouldHandleBigUint64Array) {
this.registerCustom(new BigUint64ArraySerdeTransformer());
}
if (shouldHandleBigInt64Array) {
this.registerCustom(new BigInt64ArraySerdeTransformer());
}
if (shouldHandleFloat32Array) {
this.registerCustom(new Float32ArraySerdeTransformer());
}
if (shouldHandleFloat64Array) {
this.registerCustom(new Float64ArraySerdeTransformer());
}
if (shouldHandleMap) {
this.registerCustom(new MapSerdeTransformer());
}
if (shouldHandleSet) {
this.registerCustom(new SetSerdeTransformer());
}
if (shouldHandleBigInt) {
this.registerCustom(new BigIntSerdeTransformer());
}
if (shouldHandleNaN) {
this.registerCustom(new NaNSerdeTransformer());
}
if (shouldHandleInfinity) {
this.registerCustom(new InfinitySerdeTransformer());
}
if (shouldHandleUndefined) {
this.registerCustom(new UndefinedSerdeTransformer());
}
if (shouldHandleRegExp) {
this.registerCustom(new RegExpSerdeTransformer());
}
if (shouldHandleDate) {
this.registerCustom(new DateSerdeTransformer());
}
if (shouldHandleURL) {
this.registerCustom(new URLSerdeTransformer());
}
if (shouldHandleURLSearchParams) {
this.registerCustom(new URLSearchParamsSerdeTransformer());
}
}
/**
* @example
* ```ts
* import type { IFlexibleSerde } from "@daiso-tech/core/serde/contracts";
* import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/adapters";
* import { Serde } from "@daiso-tech/core/serde";
*
* const serde: IFlexibleSerde = new Serde(new SuperJsonSerdeAdapter());
*
* const value = { a: 1, b: 2 };
* const serializedValue = serde.serialize(value);
*
* // Will print out { a: 1, b: 2} as json string, this because of the SuperJsonSerdeAdapter
* console.log(serializedValue);
* ```
*/
serialize(value) {
return this.serdeAdapter.serialize(value);
}
/**
* @example
* ```ts
* import type { IFlexibleSerde } from "@daiso-tech/core/serde/contracts";
* import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/adapters";
* import { Serde } from "@daiso-tech/core/serde";
*
* const serde: IFlexibleSerde = new Serde(new SuperJsonSerdeAdapter());
*
* const value = { a: 1, b: 2 };
* const deserializedValue = serde.deserialize(serde.serialize(value));
*
* // Will print out { a: 1, b: 2}
* console.log(deserializedValue);
*
* // Will print false
* console.log(value === deserializedValue);
* ```
*/
deserialize(serializedValue) {
return this.serdeAdapter.deserialize(serializedValue);
}
/**
* @example
* ```ts
* import type { IFlexibleSerde } from "@daiso-tech/core/serde/contracts";
* import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/adapters";
* import { Serde } from "@daiso-tech/core/serde";
* import { ISerializable } from "@daiso-tech/core/serde/contracts";
*
* const serde: IFlexibleSerde = new Serde(new SuperJsonSerdeAdapter());
*
* type ISerializedUser = {
* name: string;
* age: number
* };
*
* class User implements ISerializable<ISerializedUser> {
* static deserialize(serializedUser: ISerializedUser): User {
* return new User(serializedUser.name, serializedUser.age);
* }
*
* constructor(public readonly name: string, public readonly age: number) {}
*
* serialize(): ISerializedUser {
* return {
* name: this.name,
* age: this.age,
* };
* }
* }
*
* serde.registerClass(AddEvent);
*
* const user = new User("Carl", 30);
* const deserializedUser = serde.deserialize<User>(serde.serialize(user));
*
* // Will print "Carl"
* console.log(deserializedUser.name);
*
* // Will print 30
* console.log(deserializedUser.age);
*
* // Will print true
* console.log(deserializedUser instanceof User);
*
* // Will print false
* console.log(user === deserializedUser);
* ```
*/
registerClass(class_, prefix) {
return this.registerCustom({
isApplicable(value) {
return (value instanceof class_ &&
getConstructorName(value) === class_.name);
},
deserialize(serializedValue) {
return class_.deserialize(serializedValue);
},
serialize(deserializedValue) {
return deserializedValue.serialize();
},
name: class_.name,
}, prefix);
}
/**
* @example
* ```ts
* import type { IFlexibleSerde, ISerializable } from "@daiso-tech/core/serde/contracts";
* import { SuperJsonSerdeAdapter } from "@daiso-tech/core/serde/adapters";
* import { Serde } from "@daiso-tech/core/serde";
*
* const serde: IFlexibleSerde = new Serde(new SuperJsonSerdeAdapter());
*
* type ISerializedUser = {
* name: string;
* age: number
* };
*
* class User implements ISerializable<ISerializedUser> {
* static deserialize(serializedUser: ISerializedUser): User {
* return new User(serializedUser.name, serializedUser.age);
* }
*
* constructor(public readonly name: string, public readonly age: number) {}
*
* serialize(): ISerializedUser {
* return {
* name: this.name,
* age: this.age,
* };
* }
* }
*
* serde.registerCustom<User, ISerializedUser>({
* name: User.name,
* isApplicable: (value): value is User => {
* return value instanceof User;
* },
* serialize: (value: User): ISerializedUser => {
* return {
* name: value.name,
* age: value.age
* };
* },
* deserialize: (value: ISerializedUser): User => {
* return new User(value.name, value.age);
* }
* });
*
* const user = new User("Carl", 30);
* const deserializedUser = serde.deserialize<User>(serde.serialize(user));
*
* // Will print "Carl"
* console.log(deserializedUser.name);
*
* // Will print 30
* console.log(deserializedUser.age);
*
* // Will print true
* console.log(deserializedUser instanceof User);
*
* // Will print false
* console.log(user === deserializedUser);
* ```
*/
registerCustom(transformer, prefix) {
let name = resolveOneOrMoreStr(transformer.name);
if (prefix !== undefined) {
name = resolveOneOrMoreStr([resolveOneOrMoreStr(prefix), name]);
}
this.serdeAdapter.registerCustom({
name,
isApplicable: (value) => transformer.isApplicable(value),
serialize: (value) => transformer.serialize(value),
deserialize: (value) => transformer.deserialize(value),
});
return this;
}
}
//# sourceMappingURL=serde.js.map