UNPKG

@yaser2us/json-api-nestjs-shared

Version:

Shared Helper for JsonApi Plugin for NestJs

54 lines (53 loc) 2.89 kB
import { PropertyKeys, RelationKeys, IsIterator, CastIteratorType } from './entity-type'; import { ValueOf } from './entity-type'; export type DebugMetaProps = Partial<{ time: number; }>; export type PageProps = { totalItems: number; pageNumber: number; pageSize: number; }; export type MainData<T = string> = { type: T; id: string; }; export type BaseMainData<Entity, IdKey extends string, Rel extends RelationKeys<Entity, IdKey>> = { data: IsIterator<Entity[Rel]> extends 1 ? MainData[] : [Extract<Entity[Rel], null>] extends [never] ? MainData : MainData | null; }; export type MetaProps<T, R = null> = R extends null ? T : T & R; export type MetaPropsForArrayResourceObject = MetaProps<PageProps, DebugMetaProps>; export type Links = { self: string; }; export type BaseLinks = { links: Links; }; export type Attributes<Entity extends object, IdKey extends string = 'id'> = { [P in Exclude<PropertyKeys<Entity>, IdKey>]?: Entity[P]; }; export type BaseAttribute<Entity extends object, IdKey extends string = 'id'> = { attributes?: Attributes<Entity, IdKey>; }; export type Relationships<Entity extends object, IdKey extends string = 'id'> = { [P in RelationKeys<Entity, IdKey>]?: BaseLinks | (BaseLinks & BaseMainData<Entity, IdKey, P>); }; export type BaseRelationships<Entity extends object, IdKey extends string = 'id'> = { relationships?: Relationships<Entity, IdKey>; }; export type Meta<Type extends 'object' | 'array', ExtendBase> = Type extends 'array' ? MetaProps<MetaPropsForArrayResourceObject, ExtendBase> : MetaProps<DebugMetaProps, ExtendBase>; export type BaseMeta<Type extends 'object' | 'array' = 'object', ExtendBase = null> = { meta: Meta<Type, ExtendBase>; }; export type BaseResourceData<Entity extends object, Type extends 'object' | 'array' = 'object', IdKey extends string = 'id'> = { data: Type extends 'array' ? ResourceData<Entity, IdKey>[] : ResourceData<Entity, IdKey>; }; export type Include<Entity, IdKey extends string = 'id'> = ValueOf<{ [Rel in RelationKeys<Entity, IdKey>]: CastIteratorType<Entity[Rel]> extends object ? ResourceData<CastIteratorType<Entity[Rel]>> : never; }>; export type BaseIncluded<Entity extends object, IdKey extends string = 'id'> = { included?: Include<Entity, IdKey>[]; }; export type ResourceData<Entity extends object, IdKey extends string = 'id'> = MainData & BaseAttribute<Entity, IdKey> & BaseRelationships<Entity, IdKey> & BaseLinks; export type ResourceObject<Entity extends object, Type extends 'object' | 'array' = 'object', ExtendBase = null, IdKey extends string = 'id'> = BaseMeta<Type, ExtendBase> & BaseResourceData<Entity, Type, IdKey> & BaseIncluded<Entity, IdKey>; export type ResourceObjectRelationships<Entity extends object, IdKey extends string, Rel extends RelationKeys<Entity, IdKey>> = BaseMeta & BaseMainData<Entity, IdKey, Rel>;