2022-05-07 20:52:58 +00:00
|
|
|
import { MarkRequired } from 'ts-essentials';
|
2022-05-30 00:34:48 +00:00
|
|
|
import { FractalResponseData, FractalResponseList } from '../http';
|
2022-05-07 20:52:58 +00:00
|
|
|
|
|
|
|
export type UUID = string;
|
|
|
|
|
|
|
|
// eslint-disable-next-line @typescript-eslint/no-empty-interface
|
|
|
|
export interface Model {}
|
|
|
|
|
|
|
|
interface ModelWithRelationships extends Model {
|
2022-05-30 00:34:48 +00:00
|
|
|
relationships: Record<string, FractalResponseData | FractalResponseList | undefined>;
|
2022-05-07 20:52:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Allows a model to have optional relationships that are marked as being
|
|
|
|
* present in a given pathway. This allows different API calls to specify the
|
|
|
|
* "completeness" of a response object without having to make every API return
|
|
|
|
* the same information, or every piece of logic do explicit null checking.
|
|
|
|
*
|
|
|
|
* Example:
|
|
|
|
* >> const user: WithLoaded<User, 'servers'> = {};
|
|
|
|
* >> // "user.servers" is no longer potentially undefined.
|
|
|
|
*/
|
|
|
|
type WithLoaded<M extends ModelWithRelationships, R extends keyof M['relationships']> = M & {
|
|
|
|
relationships: MarkRequired<M['relationships'], R>;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Helper type that allows you to infer the type of an object by giving
|
|
|
|
* it the specific API request function with a return type. For example:
|
|
|
|
*
|
|
|
|
* type Egg = InferModel<typeof getEgg>;
|
|
|
|
*/
|
|
|
|
export type InferModel<T extends (...args: any) => any> = ReturnType<T> extends Promise<infer U> ? U : T;
|