import type { Schema, Serializable, EntityInterface, NormalizedIndex, } from './interface.js'; export * from './schemaArgs.js'; // TypeScript <4.2 InstanceType<> does not work on abstract classes export type AbstractInstanceType = T extends new (...args: any) => infer U ? U : T extends { prototype: infer U } ? U : never; export type NormalizedEntity = T extends ( { prototype: infer U; schema: infer S; } ) ? { [K in Exclude]: U[K] } & { [K in keyof S]: string } : never; export type DenormalizeObject> = { [K in keyof S]: S[K] extends Schema ? Denormalize : S[K]; }; export type DenormalizeNullableObject> = { [K in keyof S]: S[K] extends Schema ? DenormalizeNullable : S[K]; }; export type NormalizeObject> = { [K in keyof S]: S[K] extends Schema ? Normalize : S[K]; }; export type NormalizedNullableObject> = { [K in keyof S]: S[K] extends Schema ? NormalizeNullable : S[K]; }; interface NestedSchemaClass { schema: Record; prototype: T; } export interface RecordClass extends NestedSchemaClass { fromJS: (...args: any) => AbstractInstanceType; } export type DenormalizeNullableNestedSchema = keyof S['schema'] extends never ? S['prototype'] // this is the case of a non-set schema, which means it actually has no members : string extends keyof S['schema'] ? S['prototype'] : S['prototype'] /*& { [K in keyof S['schema']]: DenormalizeNullable; }*/; export type NormalizeReturnType = T extends (...args: any) => infer R ? R : never; export type Denormalize = S extends { createIfValid: any; pk: any; key: string; prototype: infer U } ? U : S extends RecordClass ? AbstractInstanceType : S extends { denormalize: (...args: any) => any } ? ReturnType : S extends Serializable ? T : S extends Array ? Denormalize[] : S extends { [K: string]: any } ? DenormalizeObject : S; export type DenormalizeNullable = S extends ( { createIfValid: any; pk: any; key: string; prototype: any; schema: any } ) ? DenormalizeNullableNestedSchema | undefined : S extends RecordClass ? DenormalizeNullableNestedSchema : S extends { _denormalizeNullable: (...args: any) => any } ? ReturnType : S extends Serializable ? T : S extends Array ? Denormalize[] | undefined : S extends { [K: string]: any } ? DenormalizeNullableObject : S; export type Normalize = S extends { createIfValid: any; pk: any; key: string; prototype: {} } ? string : S extends RecordClass ? NormalizeObject : S extends { normalize: (...args: any) => any } ? NormalizeReturnType : S extends Serializable ? T : S extends Array ? Normalize[] : S extends { [K: string]: any } ? NormalizeObject : S; export type NormalizeNullable = S extends { createIfValid: any; pk: any; key: string; prototype: {} } ? string | undefined : S extends RecordClass ? NormalizedNullableObject : S extends { _normalizeNullable: (...args: any) => any } ? NormalizeReturnType : S extends Serializable ? T : S extends Array ? Normalize[] | undefined : S extends { [K: string]: any } ? NormalizedNullableObject : S; export type NormalizedSchema< E extends Record | undefined>, R, > = { entities: E; result: R; indexes: NormalizedIndex; entitiesMeta: EntitiesToMeta; }; export interface StoreData< E extends Record | undefined>, > { entities: Readonly; indexes: Readonly; entitiesMeta: EntitiesToMeta; } export type EntitiesToMeta< E extends Record | undefined>, > = { readonly [entityKey in keyof E]: { readonly [pk in keyof E[entityKey]]: NormalizeMeta; }; }; export interface NormalizeMeta { expiresAt: number; date: number; fetchedAt: number; } export type EntityMap = Record>;