UNPKG

@roots/bud-server

Version:

Development server for @roots/bud

49 lines (48 loc) 1.95 kB
import { responseInterceptor } from '@roots/bud-support/http-proxy-middleware'; const factory = (bud, url) => { return responseInterceptor(async (buffer, proxy, request, response) => { response.setHeader(`x-proxy-by`, `@roots/bud`); response.removeHeader(`content-security-policy`); response.removeHeader(`x-http-method-override`); setResponseCookies(request, response); return transformResponseBuffer(bud, url, proxy, buffer); }); }; const setResponseCookies = (request, response) => { if (request.cookies) { Object.entries(request.cookies).map(([k, v]) => { response.cookie(k, v, { domain: undefined }); }); } const headers = response.getHeaders(); if (!headers[`set-cookie`]) return; const cookies = Array.isArray(headers[`set-cookie`]) ? headers[`set-cookie`] : [headers[`set-cookie`]]; response.setHeader(`set-cookie`, cookies.map(String).map(value => value.replace(`; secure`, ``).trim())); }; const transformResponseBuffer = (bud, url, proxy, // eslint-disable-next-line @typescript-eslint/ban-types buffer) => { if (!isTransformable(proxy)) return buffer; if (!url.dev?.origin || !url.publicProxy.origin) return buffer; return bud.hooks .filter(`dev.middleware.proxy.replacements`, [ [url.publicProxy.origin, url.dev.origin], ]) .reduce(transformBody, buffer.toString()); }; const isTransformable = (message) => { if (typeof message?.headers?.[`content-type`] !== `string`) return false; const type = message.headers[`content-type`]; return (type.startsWith(`text/css`) || type.startsWith(`text/html`) || type.startsWith(`application/javascript`) || type.startsWith(`application/json`)); }; const transformBody = (value, [search, replace]) => value.replaceAll(new RegExp(search, `g`), replace); export { factory };