UNPKG

nuxt-proxy-request

Version:

A http proxy module for nuxt(3) powered by h3-proxy.

72 lines (66 loc) 2.3 kB
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 };