export interface JsonHalLinkList { self: string [link: string]: string } export interface JsonHalPagination { first: boolean last: boolean size: number totalElements: number totalPages: number number: number } export interface JsonHalObject { ID: string links: JsonHalLinkList } export interface JsonHalCollection { links: JsonHalLinkList page: JsonHalPagination } const emptyPagination = (size: number = 0): JsonHalPagination => ({ first: true, last: true, number: 0, size, totalElements: size, totalPages: 0, }) const convertLinks = (links: any): JsonHalLinkList => !links ? { self: '' } : Object.keys(links).reduce((list: JsonHalLinkList, link: string) => { list[link] = links[link].href return list }, {}) as JsonHalLinkList const extractId = (link: string) => { const idMatch = link.match(/([^\/\{]+)(\{[^\}]+\})?$/) return idMatch && idMatch[1] } const extractPagination = (size: number, page: JsonHalPagination = emptyPagination(size)) => ({ ...page, first: page.number <= 0, last: page.number >= page.totalPages - 1, }) /** * Expects a valid jsonHal json and returns the meta data for an object response */ export const object = (response: any): JsonHalObject => { const links = convertLinks(response._links) return { ID: (links.self && extractId(links.self)) || null, links, } } /** * Expects a valid jsonHal json and returns the meta data for a collection response * @type {[type]} */ export const collection = (response: any, size: number = 0): JsonHalCollection => ({ links: convertLinks(response._links), page: extractPagination(size, response.page), })