import { getSiteSettings } from '../repositories/content-repository' /** * 공통 코드 삽입을 건너뛸 서버 경로인지 확인한다. * @param {import('h3').H3Event} event - 요청 이벤트 * @returns {boolean} 삽입 제외 여부 */ const shouldSkipCustomCode = (event) => { const path = String(event?.path || event?.node?.req?.url || '/') return path.startsWith('/admin') || path.startsWith('/api') || path.startsWith('/uploads') || path.startsWith('/_nuxt') || path.startsWith('/ads.txt') } /** * HTML 조각을 응답 배열에 안전하게 추가한다. * @param {Array} target - Nitro HTML 조각 배열 * @param {string} code - 삽입할 HTML 코드 * @returns {void} */ const pushHtmlCode = (target, code) => { const trimmed = String(code || '').trim() if (!trimmed || !Array.isArray(target)) { return } target.push(trimmed) } /** * 공개 HTML 응답에 관리자 설정의 헤더·푸터 코드를 삽입한다. */ export default defineNitroPlugin((nitroApp) => { nitroApp.hooks.hook('render:html', async (html, { event }) => { if (shouldSkipCustomCode(event)) { return } const settings = await getSiteSettings() pushHtmlCode(html.head, settings.customHeadCode) pushHtmlCode(html.bodyAppend, settings.customFooterCode) }) })