import { entityKind } from "./entity.cjs";
import { PartialWithUndefined } from "./utils.cjs";
import { SQLChunk } from "./sql/sql.cjs";
import { Column } from "./column.cjs";

//#region src/codecs.d.ts
type NormalizeCodec = (value: any) => any;
type NormalizeArrayCodec = (value: any, arrayDimensions: number) => any;
type CastCodec = (name: SQLChunk) => SQLChunk;
type CastArrayCodec = (name: SQLChunk, arrayDimensions: number) => SQLChunk;
type CastParamCodec = (name: string, column: Column) => string;
type CastArrayParamCodec = (name: string, column: Column, arrayDimensions: number) => string;
interface Codec {
  cast?: CastCodec | undefined;
  castArray?: CastArrayCodec | undefined;
  castInJson?: CastCodec | undefined;
  castArrayInJson?: CastArrayCodec | undefined;
  castParam?: CastParamCodec | undefined;
  castArrayParam?: CastArrayParamCodec | undefined;
  normalize?: NormalizeCodec | undefined;
  normalizeArray?: NormalizeArrayCodec | undefined;
  normalizeInJson?: NormalizeCodec | undefined;
  normalizeArrayInJson?: NormalizeArrayCodec | undefined;
  normalizeParam?: NormalizeCodec | undefined;
  normalizeParamArray?: NormalizeArrayCodec | undefined;
}
type Codecs<TTypeSet extends string = string> = PartialWithUndefined<Record<TTypeSet, Codec>>;
declare const noopCodecs: Codecs;
declare const arrayToItemTypeCodecNameMap: {
  readonly cast: "cast";
  readonly castArray: "cast";
  readonly castInJson: "castInJson";
  readonly castArrayInJson: "castInJson";
  readonly castParam: "castParam";
  readonly castArrayParam: "castParam";
  readonly normalize: "normalize";
  readonly normalizeArray: "normalize";
  readonly normalizeInJson: "normalizeInJson";
  readonly normalizeArrayInJson: "normalizeInJson";
  readonly normalizeParam: "normalizeParam";
  readonly normalizeParamArray: "normalizeParam";
};
declare const itemToArrayTypeCodecNameMap: {
  readonly cast: "castArray";
  readonly castArray: "castArray";
  readonly castInJson: "castArrayInJson";
  readonly castArrayInJson: "castArrayInJson";
  readonly castParam: "castArrayParam";
  readonly castArrayParam: "castArrayParam";
  readonly normalize: "normalizeArray";
  readonly normalizeArray: "normalizeArray";
  readonly normalizeInJson: "normalizeArrayInJson";
  readonly normalizeArrayInJson: "normalizeArrayInJson";
  readonly normalizeParam: "normalizeParamArray";
  readonly normalizeParamArray: "normalizeParamArray";
};
declare class CodecsCollection<TTypeSet extends string = string> {
  protected resolveTypes: (type: string) => string;
  readonly codecs: Codecs<TTypeSet>;
  static readonly [entityKind]: string;
  constructor(resolveTypes: (type: string) => string, codecs?: Codecs<TTypeSet>);
  get<TCodecType extends keyof Codec>(column: Column, type: TCodecType, override?: TTypeSet): Codec[typeof arrayToItemTypeCodecNameMap[TCodecType]] | Codec[typeof itemToArrayTypeCodecNameMap[TCodecType]];
  apply<TCodecType extends keyof Codec>(column: Column, type: TCodecType, value: Codec[TCodecType] extends ((v: infer TValue, ...rest: any[]) => any) ? TValue : unknown, override?: TTypeSet): ReturnType<Exclude<Codec[TCodecType], undefined>>;
}
declare function refineCodecs<TTypeSet extends string>(source: Codecs<TTypeSet>, extension?: Codecs<TTypeSet>): Codecs<TTypeSet>;
//#endregion
export { CastArrayCodec, CastArrayParamCodec, CastCodec, CastParamCodec, Codec, Codecs, CodecsCollection, NormalizeArrayCodec, NormalizeCodec, noopCodecs, refineCodecs };
//# sourceMappingURL=codecs.d.cts.map