@roots/bud-server
Version:
Development server for @roots/bud
49 lines (48 loc) • 1.95 kB
JavaScript
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 };