52 lines
1.1 KiB
TypeScript
52 lines
1.1 KiB
TypeScript
type TParameters = {
|
|
[key: string]: string;
|
|
rel?: string;
|
|
};
|
|
|
|
type TReference = {
|
|
uri: string;
|
|
parameters: TParameters;
|
|
};
|
|
|
|
type TRel = 'next' | 'prev' | 'first' | 'last';
|
|
|
|
type TParsedLinkHeader = {
|
|
next?: TReference;
|
|
prev?: TReference;
|
|
first?: TReference;
|
|
last?: TReference;
|
|
};
|
|
|
|
export default function parseLinkHeader(link: string): TParsedLinkHeader {
|
|
const parsed: TParsedLinkHeader = {};
|
|
|
|
if (!link) return parsed;
|
|
|
|
const items = link.split(',');
|
|
|
|
for (const item of items) {
|
|
const [rawUriReference, ...rawLinkParameters] = item.split(';') as [
|
|
string,
|
|
...string[]
|
|
];
|
|
const trimmedUriReference = rawUriReference.trim();
|
|
|
|
const reference = trimmedUriReference.slice(1, -1);
|
|
const parameters: TParameters = {};
|
|
|
|
for (const rawParameter of rawLinkParameters) {
|
|
const trimmedRawParameter = rawParameter.trim();
|
|
const [key, value] = trimmedRawParameter.split('=');
|
|
|
|
parameters[key.trim()] = value.slice(1, -1);
|
|
}
|
|
|
|
parsed[parameters.rel as TRel] = {
|
|
uri: reference,
|
|
parameters,
|
|
};
|
|
}
|
|
|
|
return parsed;
|
|
}
|