nuxt-proxy
Version:
Http-proxy middleware for Nuxt 3.
58 lines (53 loc) • 2.05 kB
JavaScript
import { fileURLToPath } from 'node:url';
import { defu } from 'defu';
import { defineNuxtModule, createResolver, addServerHandler } from '@nuxt/kit';
import { hash, objectHash } from 'ohash';
const module = defineNuxtModule({
meta: {
name: "nuxt-proxy",
configKey: "proxy",
version: "^3.1.0"
},
defaults: {
options: []
},
setup(options, nuxt) {
const { resolve } = createResolver(import.meta.url);
const runtimeDir = fileURLToPath(new URL("./runtime", import.meta.url));
nuxt.options.build.transpile.push(runtimeDir, /#http-proxy/);
const finalConfig = nuxt.options.runtimeConfig.proxy = defu(nuxt.options.runtimeConfig.proxy, {
options: options.options
});
function createProxyMiddleware(options2, index) {
return `
import { createProxyMiddleware } from ${JSON.stringify(resolve(runtimeDir, "./middleware.mjs"))}
import { defu } from 'defu'
import { useRuntimeConfig } from '#imports'
const buildtimeOptions = ${JSON.stringify(options2)}
const runtimeOptions = [].concat(useRuntimeConfig().proxy?.options)[${JSON.stringify(index)} ?? 0]
export default createProxyMiddleware(defu(runtimeOptions, buildtimeOptions))
`;
}
nuxt.hook("nitro:config", (nitroConfig) => {
nitroConfig.virtual = nitroConfig.virtual || {};
if (Array.isArray(finalConfig.options)) {
finalConfig.options.forEach((options2, index) => {
const handler = `#http-proxy/${hash(objectHash(options2))}.mjs`;
nitroConfig.virtual[handler] = createProxyMiddleware(options2, index);
addServerHandler({
handler,
middleware: true
});
});
} else {
const handler = `#http-proxy/${hash(objectHash(finalConfig.options))}.mjs`;
nitroConfig.virtual[handler] = createProxyMiddleware(finalConfig.options);
addServerHandler({
handler,
middleware: true
});
}
});
}
});
export { module as default };