48 lines
1.3 KiB
JavaScript
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)
|
|
})
|
|
})
|