Files
sori.studio/server/plugins/site-custom-code.js

48 lines
1.3 KiB
JavaScript

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<string>} 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)
})
})