- 템플릿: Planner.astro, lib/plan.ts·tour.ts, styles/plan.css, planStrings, pages plan·en/plan·404. Base 내비 회복 일정 → /plan, 언어 짝 /plan↔/en/plan, 옛 주소 리다이렉트(vercel.json), 사이트맵 - 워커 planner 단계(recovery 다음): scripts/build_planner_data.mjs 가 업종별 기본 규칙표(scripts/template/planner/procedures.plastic|derm.json)에 병원 시술 페이지 원문(recoveryNotes)을 matchKeywords 로 붙이고, 장소는 briefs/<clinic>/planner.places.json(큐레이션) 또는 범용 기본표(관광공사 기준 좌표)로 만든다 - 브리프: viewclinic·oracle 큐레이션 장소. 빈 템플릿(관광 데이터 없음)도 빌드·검증 통과(plan.test 14건) - 이전 세션의 미커밋 작업(피부과 수집·OCR·게이트·언어 스위치, stay 페이지 제거)도 이 커밋에 함께 들어감. docs/prd 변경은 제외 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
26 lines
1.4 KiB
TypeScript
26 lines
1.4 KiB
TypeScript
import type { APIRoute } from 'astro';
|
|
import { isPublishable } from '../lib';
|
|
import { getCollection } from 'astro:content';
|
|
import authors from '../data/authors.json';
|
|
export const GET: APIRoute = async ({ site }) => {
|
|
const base = site!.toString().replace(/\/$/, '');
|
|
const posts = (await getCollection('posts')).filter(isPublishable);
|
|
const today = new Date().toISOString().slice(0, 10);
|
|
const urls = [
|
|
{ loc: `${base}/`, lastmod: today },
|
|
{ loc: `${base}/posts`, lastmod: today },
|
|
{ loc: `${base}/clinic`, lastmod: today },
|
|
{ loc: `${base}/visit`, lastmod: today },
|
|
{ loc: `${base}/plan`, lastmod: today },
|
|
{ loc: `${base}/en/plan`, lastmod: today },
|
|
{ loc: `${base}/newsroom`, lastmod: today },
|
|
{ loc: `${base}/videos`, lastmod: today },
|
|
{ loc: `${base}/about`, lastmod: today },
|
|
{ loc: `${base}/corrections`, lastmod: today },
|
|
...Object.keys(authors.supporters).map((id) => ({ loc: `${base}/authors/${id}`, lastmod: today })),
|
|
...posts.map((p) => ({ loc: `${base}/posts/${p.id}`, lastmod: p.data.dateModified })),
|
|
];
|
|
const xml = `<?xml version="1.0" encoding="UTF-8"?>\n<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">\n${urls.map((u) => ` <url><loc>${u.loc}</loc><lastmod>${u.lastmod}</lastmod></url>`).join('\n')}\n</urlset>\n`;
|
|
return new Response(xml, { headers: { 'Content-Type': 'application/xml; charset=utf-8' } });
|
|
};
|