nitro-public-module
Version:
nitro module for better public compatibility | 对于 nitro 更好的静态资源兼容模块
70 lines (67 loc) • 2.5 kB
JavaScript
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 };