og-image/api/_lib/parser.ts

54 lines
1.8 KiB
TypeScript

import { IncomingMessage } from 'http';
import { parse } from 'url';
import { ParsedRequest, Theme } from './types';
export function parseRequest(req: IncomingMessage) {
console.log('HTTP ' + req.url);
const { pathname = '/', query = {} } = parse(req.url || '', true);
const { fontSize, images, widths, heights, theme, md } = query;
if (Array.isArray(fontSize)) {
throw new Error('Expected a single fontSize');
}
if (Array.isArray(theme)) {
throw new Error('Expected a single theme');
}
const arr = pathname.slice(1).split('.');
let extension = '';
let text = '';
if (arr.length === 0) {
text = '';
} else if (arr.length === 1) {
text = arr[0];
} else {
extension = arr.pop() as string;
text = arr.join('.');
}
const parsedRequest: ParsedRequest = {
fileType: extension === 'jpeg' ? extension : 'png',
text: decodeURIComponent(text),
theme: theme === 'dark' ? 'dark' : 'light',
md: md === '1' || md === 'true',
fontSize: fontSize || '96px',
images: getArray(images),
widths: getArray(widths),
heights: getArray(heights),
};
parsedRequest.images = getDefaultImages(parsedRequest.images, parsedRequest.theme);
return parsedRequest;
}
function getArray(stringOrArray: string[] | string): string[] {
return Array.isArray(stringOrArray) ? stringOrArray : [stringOrArray];
}
function getDefaultImages(images: string[], theme: Theme): string[] {
if (images.length > 0 && images[0] && images[0].startsWith('https://assets.zeit.co/image/upload/front/assets/design/')) {
return images;
}
return theme === 'light'
? ['https://assets.zeit.co/image/upload/front/assets/design/now-black.svg']
: ['https://assets.zeit.co/image/upload/front/assets/design/now-white.svg'];
}