UNPKG

nitro-public-module

Version:

nitro module for better public compatibility | 对于 nitro 更好的静态资源兼容模块

70 lines (67 loc) 2.5 kB
import { defu } from 'defu'; import { fileURLToPath } from 'url'; import { readFile } from 'fs/promises'; import { dirname, resolve } from 'pathe'; const _dirname = typeof __dirname !== "undefined" ? __dirname : dirname(fileURLToPath(import.meta.url)); const runtime = resolve(_dirname, "../runtime"); const defaultOptions = { preset: "fallback" }; function nitroPublic(options = defaultOptions) { return { name: "nitro-public", setup(nitro) { options = defu(options, defaultOptions); useVirtual(); if (!isPresetEnabled()) { return; } useMiddleware(options.preset); function isPresetEnabled() { const { preset, forcePresetEnabled } = options; const { preset: nitroPreset, dev } = nitro.options; if (forcePresetEnabled !== void 0) { return forcePresetEnabled; } if (dev || preset === false) { return false; } const enabled = ["node", "deno", "bun"].some((runtime2) => { return nitroPreset.includes(runtime2); }); if (!enabled) { const logger = nitro.logger.withTag("public"); logger.warn( `The preset "${preset}" is not supported by the ${nitroPreset} runtime. Of course, you can also enable the forcePresetEnabled option to force it on` ); } return enabled; } function useMiddleware(preset = "fallback") { var _a; if (preset === false) { return; } (_a = nitro.options).handlers ?? (_a.handlers = []); nitro.options.handlers.push({ method: "GET", middleware: true, handler: resolve(runtime, `middleware/${preset}.ts`) }); } function useVirtual() { var _a, _b, _c, _d; (_a = nitro.options).virtual ?? (_a.virtual = {}); (_b = nitro.options.typescript).tsConfig ?? (_b.tsConfig = {}); (_c = nitro.options.typescript.tsConfig).compilerOptions ?? (_c.compilerOptions = {}); (_d = nitro.options.typescript.tsConfig.compilerOptions).paths ?? (_d.paths = {}); nitro.options.typescript.tsConfig.compilerOptions.paths["#nitro-public"] = [resolve(runtime, "virtual/nitro-public.d.ts")]; nitro.options.virtual["#nitro-public"] = () => { const nitroPublic2 = resolve(runtime, "virtual/nitro-public.js"); return readFile(nitroPublic2, "utf8"); }; } } }; } export { nitroPublic as default };