import type { FetcherConfig, FetcherRequestBody, FetcherRequestConfig, FetcherRequestQueryValue, FetcherResponse, } from '@distributedlab/fetcher' export enum JsonApiLinkFields { first = 'first', last = 'last', next = 'next', prev = 'prev', self = 'self', } export type URL = string export type Endpoint = string // e.g. `/users` export type JsonApiClientConfig = FetcherConfig export type JsonApiClientRequestConfig = FetcherRequestConfig export type JsonApiClientRequestConfigHeaders = HeadersInit export type JsonApiClientRequestBody = FetcherRequestBody export type JsonApiErrorMetaType = Record | unknown[] | unknown export type JsonApiResponseRawData = Record export type JsonApiResponseRaw = FetcherResponse export type JsonApiClientRequestQueryValue = FetcherRequestQueryValue export type JsonApiClientRequestQueryValueUnion = | JsonApiClientRequestQueryValue | JsonApiClientRequestQueryValue[] | JsonApiClientRequestQueryValue[][] export type JsonApiClientRequestQuery = Record< string, | JsonApiClientRequestQueryValueUnion | Record > export type JsonApiRelationship = Record< string, JsonApiRecordBase > & JsonApiLinks export type JsonApiRelationships = Record< string, JsonApiRelationship > // Can be used in client code to extend and cast own entity types export type JsonApiRecordBase = { id: string type: T } export type JsonApiResponseLinks = { first?: Endpoint last?: Endpoint next?: Endpoint prev?: Endpoint self?: Endpoint } export type JsonApiClientRequestOpts = Omit< JsonApiClientRequestConfig, 'query' > & { query?: JsonApiClientRequestQuery isNeedRaw?: boolean } export type JsonApiResponseError = { id?: string | number code?: string title?: string detail?: string status?: string source?: { pointer?: string parameter?: string header?: string } meta?: JsonApiErrorMetaType links?: JsonApiResponseLinks } export type JsonApiResponseNestedErrors = JsonApiResponseError[] export type JsonApiResponseErrors = { errors?: JsonApiResponseNestedErrors } export type JsonApiDefaultMeta = Record export type JsonApiRecord = { data: JsonApiRecordData included?: JsonApiRecord[] } & JsonApiLinks export type JsonApiRecordData = Omit< JsonApiRecordBase, 'id' > & Partial, 'id'>> & JsonApiLinks & { attributes?: JsonApiAttributes relationships?: JsonApiRelationships } export type JsonApiLinks = { links?: { [key in JsonApiLinkFields]?: Endpoint } } export type JsonApiAttributes = Record