nuxt-proxy-request
Version:
A http proxy module for nuxt(3) powered by h3-proxy.
72 lines (66 loc) • 2.3 kB
JavaScript
import { fileURLToPath } from 'node:url';
import { defu } from 'defu';
import { defineNuxtModule, createResolver, addServerHandler } from '@nuxt/kit';
const virtualModulePrefix = "#nuxt-proxy-request";
const stringifyOptions = (value) => {
const res = JSON.stringify(value, (key, value2) => {
if (typeof value2 === "function") {
return `<Function>${value2}</Function>`;
}
return value2;
});
const saftyRes = res.replace(/"<Function>/g, "").replace(/<\/Function>"/g, "").replace(/\\n/g, "");
return saftyRes;
};
const module = defineNuxtModule({
meta: {
name: "nuxt-proxy-request",
configKey: "proxy",
compatibility: {
nuxt: "^3.1.0"
}
},
defaults: {
options: []
},
setup(inlineOptions, nuxt) {
const { resolve } = createResolver(import.meta.url);
const runtimeDir = fileURLToPath(new URL("./runtime", import.meta.url));
nuxt.options.build.transpile.push(
runtimeDir,
new RegExp(`${virtualModulePrefix}`)
);
const finalConfig = defu(nuxt.options.runtimeConfig.proxy, inlineOptions);
nuxt.options.runtimeConfig.proxy = finalConfig;
function createProxyServerHandlerVirtualModule(opts, index) {
return `
import { createProxyMiddleware } from ${JSON.stringify(
resolve(runtimeDir, "./middleware.js")
)}
import { defu } from 'defu'
import { useRuntimeConfig } from '#imports'
const buildtimeOptions = ${stringifyOptions(opts)}
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 || {};
const finalConfigOptions = Array.isArray(finalConfig.options) ? finalConfig.options : [finalConfig.options];
finalConfigOptions.forEach((opts, index) => {
const handler = `${virtualModulePrefix}/${index}.mjs`;
nitroConfig.virtual[handler] = createProxyServerHandlerVirtualModule(
opts,
index
);
addServerHandler({
handler,
middleware: true
});
});
});
}
});
export { module as default };