/**
 * @module Serde
 */
import type { OneOrMore } from "../../../utilities/_module-exports.js";
import type { IFlexibleSerde, IFlexibleSerdeAdapter, ISerdeTransformer, SerializableClass } from "../../../serde/contracts/_module-exports.js";
/**
 *
 * IMPORT_PATH: `"@daiso-tech/core/serde/deriavables"`
 * @group Derivables
 */
export type SerdeSettings = {
    /**
     * @default {true}
     */
    shouldHandleArrayBuffer?: boolean;
    /**
     * @default {true}
     */
    shouldHandleBuffer?: boolean;
    /**
     * @default {true}
     */
    shouldHandleUint8Array?: boolean;
    /**
     * @default {true}
     */
    shouldHandleInt8Array?: boolean;
    /**
     * @default {true}
     */
    shouldHandleUint16Array?: boolean;
    /**
     * @default {true}
     */
    shouldHandleInt16Array?: boolean;
    /**
     * @default {true}
     */
    shouldHandleUint32Array?: boolean;
    /**
     * @default {true}
     */
    shouldHandleInt32Array?: boolean;
    /**
     * @default {true}
     */
    shouldHandleBigUint64Array?: boolean;
    /**
     * @default {true}
     */
    shouldHandleBigInt64Array?: boolean;
    /**
     * @default {true}
     */
    shouldHandleFloat32Array?: boolean;
    /**
     * @default {true}
     */
    shouldHandleFloat64Array?: boolean;
    /**
     * @default {true}
     */
    shouldHandleMap?: boolean;
    /**
     * @default {true}
     */
    shouldHandleSet?: boolean;
    /**
     * @default {true}
     */
    shouldHandleBigInt?: boolean;
    /**
     * @default {true}
     */
    shouldHandleNaN?: boolean;
    /**
     * @default {true}
     */
    shouldHandleInfinity?: boolean;
    /**
     * @default {true}
     */
    shouldHandleUndefined?: boolean;
    /**
     * @default {true}
     */
    shouldHandleRegExp?: boolean;
    /**
     * @default {true}
     */
    shouldHandleDate?: boolean;
    /**
     * @default {true}
     */
    shouldHandleURL?: boolean;
    /**
     * @default {true}
     */
    shouldHandleURLSearchParams?: boolean;
};
/**
 * `Serde` class can be derived from any {@link IFlexibleSerdeAdapter | `IFlexibleSerdeAdapter`}.
 *
 * IMPORT_PATH: `"@daiso-tech/core/serde/deriavables"`
 * @group Derivables
 */
export declare class Serde<TSerializedValue> implements IFlexibleSerde<TSerializedValue> {
    private readonly 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: IFlexibleSerdeAdapter<TSerializedValue>, settings?: SerdeSettings);
    /**
     * @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<TValue>(value: TValue): TSerializedValue;
    /**
     * @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<TValue>(serializedValue: TSerializedValue): TValue;
    /**
     * @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<TSerializedClassInstance>(class_: SerializableClass<TSerializedClassInstance>, prefix?: OneOrMore<string>): this;
    /**
     * @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<TCustomSerialized, TCustomDeserialized>(transformer: ISerdeTransformer<TCustomSerialized, TCustomDeserialized>, prefix?: OneOrMore<string>): this;
}
