@roots/bud-server
Version:
Development server for @roots/bud
148 lines (141 loc) • 4.48 kB
text/typescript
import type {Bud} from '@roots/bud-framework'
import type {Options} from '@roots/bud-support/http-proxy-middleware'
import filterUndefined from '@roots/bud-support/filter-undefined'
import {createProxyMiddleware} from '@roots/bud-support/http-proxy-middleware'
import type {MiddlewareFactory} from '../index.js'
import * as responseInterceptor from './responseInterceptor.js'
/**
* Proxy middleware factory
*/
export const factory: MiddlewareFactory = (app: Bud) =>
createProxyMiddleware(makeOptions(app))
export const makeOptions = (app: Bud): Options => {
const url = {
dev: app.server.publicUrl,
proxy: app.server.proxyUrl,
publicProxy: app.server.publicProxyUrl,
}
return filterUndefined(
app.hooks.filter(`dev.middleware.proxy.options`, {
agent: app.hooks.filter(
`dev.middleware.proxy.options.agent`,
undefined,
),
autoRewrite: app.hooks.filter(
`dev.middleware.proxy.options.autoRewrite`,
true,
),
buffer: app.hooks.filter(
`dev.middleware.proxy.options.buffer`,
undefined,
),
changeOrigin: app.hooks.filter(
`dev.middleware.proxy.options.changeOrigin`,
true,
),
cookieDomainRewrite: app.hooks.filter(
`dev.middleware.proxy.options.cookieDomainRewrite`,
url.dev?.host,
),
cookiePathRewrite: app.hooks.filter(
`dev.middleware.proxy.options.cookiePathRewrite`,
undefined,
),
ejectPlugins: app.hooks.filter(
`dev.middleware.proxy.options.ejectPlugins`,
undefined,
),
followRedirects: app.hooks.filter(
`dev.middleware.proxy.options.followRedirects`,
false,
),
headers: app.hooks.filter(
`dev.middleware.proxy.options.headers`,
undefined,
),
hostRewrite: app.hooks.filter(
`dev.middleware.proxy.options.hostRewrite`,
url.dev?.host,
),
ignorePath: app.hooks.filter(
`dev.middleware.proxy.options.ignorePath`,
undefined,
),
localAddress: app.hooks.filter(
`dev.middleware.proxy.options.localAddress`,
undefined,
),
logger: app.hooks.filter(
`dev.middleware.proxy.options.logger`,
app.server.logger?.scope(app.label, `proxy`) ?? console,
),
on: filterUndefined(
app.hooks.filter(`dev.middleware.proxy.options.on`, {
proxyReq: app.hooks.filter(
`dev.middleware.proxy.options.onProxyReq`,
undefined,
),
proxyRes: app.hooks.filter(
`dev.middleware.proxy.options.onProxyRes`,
responseInterceptor.factory(app, url),
),
}),
),
pathFilter: app.hooks.filter(
`dev.middleware.proxy.options.pathFilter`,
[`!/bud/hot/**`],
),
pathRewrite: app.hooks.filter(
`dev.middleware.proxy.options.pathRewrite`,
undefined,
),
plugins: app.hooks.filter(
`dev.middleware.proxy.options.plugins`,
undefined,
),
prependPath: app.hooks.filter(
`dev.middleware.proxy.options.prependPath`,
undefined,
),
preserveHeaderKeyCase: app.hooks.filter(
`dev.middleware.proxy.options.preserveHeaderKeyCase`,
undefined,
),
protocolRewrite: app.hooks.filter(
`dev.middleware.proxy.options.protocolRewrite`,
url.publicProxy.protocol.startsWith(`https`) ? `https` : undefined,
),
proxyTimeout: app.hooks.filter(
`dev.middleware.proxy.options.proxyTimeout`,
undefined,
),
router: app.hooks.filter(
`dev.middleware.proxy.options.router`,
undefined,
),
secure: app.hooks.filter(
`dev.middleware.proxy.options.secure`,
false,
),
selfHandleResponse: app.hooks.filter(
`dev.middleware.proxy.options.selfHandleResponse`,
true,
),
ssl: app.hooks.filter(`dev.middleware.proxy.options.ssl`, undefined),
target: url.proxy,
timeout: app.hooks.filter(
`dev.middleware.proxy.options.timeout`,
undefined,
),
toProxy: app.hooks.filter(
`dev.middleware.proxy.options.toProxy`,
undefined,
),
ws: app.hooks.filter(`dev.middleware.proxy.options.ws`, undefined),
xfwd: app.hooks.filter(
`dev.middleware.proxy.options.xfwd`,
undefined,
),
}),
)
}