jsona
Version:
Provide data formatters (data model builder & json builder) to work with JSON API specification v1.0 in your JavaScript / TypeScript code
151 lines (150 loc) • 5.8 kB
TypeScript
type AtLeastOneProperty<T, U = {
[K in keyof T]: Pick<T, K>;
}> = Partial<T> & U[keyof U];
export interface IModelPropertiesMapper {
getId(model: TJsonaModel): string | number;
getType(model: TJsonaModel): string;
getAttributes(model: TJsonaModel): TAnyKeyValueObject;
getRelationships(model: TJsonaModel): TJsonaRelationships;
}
export interface IJsonPropertiesMapper {
createModel(type: string): TJsonaModel;
setId(model: TJsonaModel, id: string | number): void;
setAttributes(model: TJsonaModel, attributes: TAnyKeyValueObject): void;
setMeta(model: TJsonaModel, meta: TAnyKeyValueObject): void;
setLinks(model: TJsonaModel, links: TAnyKeyValueObject): void;
setResourceIdObjMeta(model: TJsonaModel, meta: unknown): void;
setRelationships(model: TJsonaModel, relationships: TJsonaRelationships): void;
setRelationshipLinks(parentModel: TJsonaModel, relationName: string, links: TJsonApiLinks): void;
setRelationshipMeta(parentModel: TJsonaModel, relationName: string, meta: TAnyKeyValueObject): void;
}
export interface IJsonaModelBuilder {
build(): TJsonaModel | Array<TJsonaModel>;
}
export interface IDeserializeCache {
getCachedModel(data: TJsonApiData, resourceIdObject: TResourceIdObj): TJsonaModel | null;
handleModel(model: TJsonaModel, data: TJsonApiData, resourceIdObject: TResourceIdObj): void;
createCacheKey(data: TJsonApiData, resourceIdObject: TResourceIdObj): string;
}
export interface IDeserializeCacheConstructor {
new (): IDeserializeCache;
}
export interface IJsonaDeserializer extends IJsonaModelBuilder {
setDeserializeCache(dc: IDeserializeCache): void;
setPropertiesMapper(pm: IJsonPropertiesMapper): void;
setJsonParsedObject(body: TJsonApiBody): void;
buildModelByData(data: TJsonApiData): TJsonaModel;
buildRelationsByData(data: TJsonApiData, model: TJsonaModel): TJsonaRelationships | null;
buildDataFromIncludedOrData(id: string | number, type: string): TJsonApiData;
buildDataInObject(): {
[key: string]: TJsonApiData;
};
buildIncludedInObject(): {
[key: string]: TJsonApiData;
};
}
export interface IJsonDeserializerConstructor {
new (propertiesMapper: IJsonPropertiesMapper, deserializeCache: IDeserializeCache, options?: TDeserializeOptions): IJsonaDeserializer;
}
export interface IModelsSerializer {
setPropertiesMapper(propertiesMapper: IModelPropertiesMapper): void;
setStuff(stuff: TJsonaModel | TJsonaModel[]): void;
setIncludeNames(includeNames: TJsonaDenormalizedIncludeNames | TJsonaNormalizedIncludeNamesTree): void;
build(): TJsonApiBody;
buildDataByModel(model: TJsonaModel | null): TJsonApiData;
buildRelationshipsByModel(model: TJsonaModel): TJsonApiRelationships;
buildIncludedByModel(model: TJsonaModel, includeTree: TJsonaNormalizedIncludeNamesTree, builtIncluded: TJsonaUniqueIncluded): void;
buildIncludedItem(relationModel: TJsonaModel, subIncludeTree: TJsonaNormalizedIncludeNamesTree, builtIncluded: TJsonaUniqueIncluded): void;
}
export interface IModelsSerializerConstructor {
new (propertiesMapper?: IModelPropertiesMapper): IModelsSerializer;
}
export type TDeserializeOptions = {
preferNestedDataFromData?: boolean;
};
export type TAnyKeyValueObject = {
[key: string]: any;
};
export type TJsonApiBody = {
data?: TJsonApiData | TJsonApiData[];
included?: Array<TJsonApiData>;
};
export type TJsonApiData = {
type: string;
id?: string | number;
attributes?: TAnyKeyValueObject;
meta?: TAnyKeyValueObject;
links?: TJsonApiLinks;
relationships?: TJsonApiRelationships;
};
export type TJsonApiRelationshipData = {
type: string;
id: string | number;
meta?: TAnyKeyValueObject;
[propertyName: string]: any;
};
type FullTJsonApiRelation = {
data: TJsonApiRelationshipData | Array<TJsonApiRelationshipData> | null;
links: TJsonApiLinks;
meta: TAnyKeyValueObject;
};
export type TJsonApiRelation = AtLeastOneProperty<FullTJsonApiRelation>;
type LinkKey = "self" | "related" | "first" | "prev" | "next" | "last";
type LinkObjectMember = string | {
href?: string;
meta?: TAnyKeyValueObject;
} | null;
export type TJsonApiLinks = {
[key in LinkKey]?: LinkObjectMember;
};
export type TJsonApiRelationships = {
[relationName: string]: TJsonApiRelation;
};
export type TJsonaUniqueIncluded = {
[entityTypeId: string]: TJsonApiData;
};
export type TJsonaIncludeNamesChain = string;
export type TJsonaDenormalizedIncludeNames = Array<TJsonaIncludeNamesChain>;
export type TJsonaNormalizedIncludeNamesTree = {
[relationName: string]: null | TJsonaNormalizedIncludeNamesTree;
};
export type TJsonaModel = {
[propertyName: string]: any;
};
export type TResourceIdObj = TJsonApiRelationshipData & {
type: string;
};
export type TJsonaRelationshipBuild = () => (TJsonaModel | Array<TJsonaModel>);
export type TJsonaRelationships = {
[relationName: string]: TJsonaRelationshipBuild | TJsonaModel | Array<TJsonaModel>;
};
export type TReduxObject = {
[entityType: string]: {
[entityId: string]: TReduxObjectModel;
};
};
export type TReduxObjectModel = {
id: number | string;
attributes?: TAnyKeyValueObject;
relationships?: TJsonApiRelationships;
};
export type TReduxObjectRelation = {
data: {
id: string | Array<string>;
type: string;
};
};
export type SwitchCaseModelMapperOptionsType = {
switchAttributes?: boolean;
switchRelationships?: boolean;
switchType?: boolean;
switchChar?: string;
};
export type SwitchCaseJsonMapperOptionsType = {
camelizeAttributes?: boolean;
camelizeRelationships?: boolean;
camelizeType?: boolean;
camelizeMeta?: boolean;
switchChar?: string;
};
export {};