nitro-public-module
Version:
nitro module for better public compatibility | 对于 nitro 更好的静态资源兼容模块
73 lines (69 loc) • 2.81 kB
JavaScript
;
const defu = require('defu');
const url = require('url');
const promises = require('fs/promises');
const pathe = require('pathe');
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
const _dirname = typeof __dirname !== "undefined" ? __dirname : pathe.dirname(url.fileURLToPath((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href))));
const runtime = pathe.resolve(_dirname, "../runtime");
const defaultOptions = {
preset: "fallback"
};
function nitroPublic(options = defaultOptions) {
return {
name: "nitro-public",
setup(nitro) {
options = defu.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: pathe.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"] = [pathe.resolve(runtime, "virtual/nitro-public.d.ts")];
nitro.options.virtual["#nitro-public"] = () => {
const nitroPublic2 = pathe.resolve(runtime, "virtual/nitro-public.js");
return promises.readFile(nitroPublic2, "utf8");
};
}
}
};
}
module.exports = nitroPublic;