UNPKG

nuxt-security

Version:

🛡️ Security Module for Nuxt based on HTTP Headers and Middleware

42 lines (41 loc) 1.72 kB
import { defineNitroPlugin, getResponseHeaders, setResponseHeaders, useStorage } from "#imports"; import { resolveSecurityRules } from "../context/index.js"; export default defineNitroPlugin(async (nitroApp) => { if (import.meta.prerender) { const prerenderedHeaders = {}; nitroApp.hooks.hook("render:html", (_, { event }) => { const rules = resolveSecurityRules(event); if (rules.enabled && rules.ssg && rules.ssg.nitroHeaders) { const headers = getResponseHeaders(event); const path = event.path.split("?")[0]; prerenderedHeaders[path] = headers; } }); nitroApp.hooks.hook("close", async () => { const headers = Object.fromEntries( Object.entries(prerenderedHeaders).map(([path, headers2]) => { const headersEntries = Object.entries(headers2).filter(([header]) => header !== "x-nitro-prerender").map(([header, value]) => { if (Array.isArray(value)) { return [header, value.join(";")]; } else { return [header, value]; } }); return [path, Object.fromEntries(headersEntries)]; }) ); await useStorage("build:nuxt-security").setItem("headers.json", headers); }); } else { const prerenderedHeaders = await useStorage("assets:nuxt-security").getItem("headers.json") || {}; nitroApp.hooks.hook("beforeResponse", (event) => { const rules = resolveSecurityRules(event); if (rules.enabled && rules.ssg && rules.ssg.nitroHeaders) { const path = event.path.split("?")[0]; if (prerenderedHeaders[path]) { setResponseHeaders(event, prerenderedHeaders[path]); } } }); } });