@roottale/cms-mcp 0.72.1 → 0.74.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +38 -0
- package/dist/index.js +1 -1
- package/docs/api-reference.md +47 -0
- package/docs/blog.md +7 -0
- package/docs/content-models-and-exposures.md +13 -0
- package/docs/inquiries.md +12 -2
- package/docs/revalidation-webhooks.md +1 -0
- package/docs/seo.md +86 -2
- package/docs/theme-and-settings.md +92 -10
- package/docs/visual-content-editing.md +45 -0
- package/examples/nextjs/app/.well-known/roottale.json/route.ts +16 -1
- package/examples/nextjs/app/api/revalidate/route.ts +2 -2
- package/examples/nextjs/app/error.tsx +21 -0
- package/examples/nextjs/app/layout.tsx +18 -0
- package/examples/nextjs/app/page.tsx +11 -1
- package/examples/nextjs/components/shared-field-output.tsx +9 -0
- package/examples/nextjs/components/site-inquiry-form.tsx +21 -1
- package/examples/nextjs/external-source-sync.md +53 -0
- package/examples/nextjs/hospital-fees/README.md +72 -0
- package/examples/nextjs/hospital-fees/content-area.json +43 -0
- package/examples/nextjs/hospital-fees/files/app/guide/non-covered/page.tsx +16 -0
- package/examples/nextjs/hospital-fees/files/app/preview/post/[id]/page.tsx +34 -0
- package/examples/nextjs/hospital-fees/files/cms/non-covered-fees-page.json +12 -0
- package/examples/nextjs/hospital-fees/files/components/site/SiteAnalytics.tsx +16 -0
- package/examples/nextjs/hospital-fees/files/features/site/non-covered/NonCoveredFees.tsx +32 -0
- package/examples/nextjs/hospital-fees/files/features/site/non-covered/nonCoveredFees.module.css +11 -0
- package/examples/nextjs/hospital-fees/files/lib/root-admin/content-table.ts +51 -0
- package/examples/nextjs/hospital-fees/files/lib/root-admin/miridoc-client.ts +10 -0
- package/examples/nextjs/hospital-fees/files/lib/root-admin/miridoc-fees.ts +89 -0
- package/examples/nextjs/hospital-fees/files/lib/root-admin/non-covered-fees.ts +37 -0
- package/examples/nextjs/hospital-fees/files/tests/non-covered.test.tsx +69 -0
- package/examples/nextjs/hospital-fees/files.json +13 -0
- package/examples/nextjs/lib/page-metadata.ts +4 -0
- package/examples/nextjs/lib/route-metadata.ts +14 -5
- package/examples/nextjs/lib/sync-external-inquiries.ts +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
[
|
|
2
|
+
"app/guide/non-covered/page.tsx",
|
|
3
|
+
"app/preview/post/[id]/page.tsx",
|
|
4
|
+
"components/site/SiteAnalytics.tsx",
|
|
5
|
+
"tests/non-covered.test.tsx",
|
|
6
|
+
"features/site/non-covered/NonCoveredFees.tsx",
|
|
7
|
+
"features/site/non-covered/nonCoveredFees.module.css",
|
|
8
|
+
"lib/root-admin/non-covered-fees.ts",
|
|
9
|
+
"lib/root-admin/content-table.ts",
|
|
10
|
+
"cms/non-covered-fees-page.json",
|
|
11
|
+
"lib/root-admin/miridoc-fees.ts",
|
|
12
|
+
"lib/root-admin/miridoc-client.ts"
|
|
13
|
+
]
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { Metadata } from "next";
|
|
2
|
+
import type { MetadataRobotsPolicy } from "@roottale/cms-core";
|
|
2
3
|
import { readMetadataValues, type CmsPostContent } from "@roottale/cms-client/server";
|
|
3
4
|
import { buildPageMetadata } from "@roottale/cms-renderer-next/routes";
|
|
4
5
|
|
|
@@ -6,8 +7,11 @@ import { buildPageMetadata } from "@roottale/cms-renderer-next/routes";
|
|
|
6
7
|
export function pageMetadata(
|
|
7
8
|
page: CmsPostContent | null,
|
|
8
9
|
defaults: { title: string; description: string; canonical: string; imageUrl: string },
|
|
10
|
+
// 배포 계약과 같은 정책. forceIndex를 선언해도 미리보기의 forceNoindex가 우선한다.
|
|
11
|
+
robots?: MetadataRobotsPolicy,
|
|
9
12
|
): Metadata {
|
|
10
13
|
return buildPageMetadata({
|
|
14
|
+
robots,
|
|
11
15
|
overrides: readMetadataValues(page?.metaJson.seo),
|
|
12
16
|
defaults: {
|
|
13
17
|
title: page?.title || defaults.title,
|
|
@@ -1,7 +1,14 @@
|
|
|
1
1
|
import type { Metadata } from "next";
|
|
2
|
-
import {
|
|
2
|
+
import { cache } from "react";
|
|
3
|
+
import { fetchSiteRouteMetadata, type MetadataValues, type PublicRouteMetadata } from "@roottale/cms-client/server";
|
|
3
4
|
import { buildPageMetadata } from "@roottale/cms-renderer-next/routes";
|
|
4
5
|
|
|
6
|
+
/** Pages and sitemap can reuse this locale snapshot; Next fetch caching survives render boundaries. */
|
|
7
|
+
export const loadSiteRouteMetadata = cache((locale = "ko") => fetchSiteRouteMetadata({
|
|
8
|
+
apiKey: process.env.ROOTTALE_API_KEY!, baseUrl: process.env.ROOTTALE_API_BASE,
|
|
9
|
+
locale, revalidate: 300,
|
|
10
|
+
}));
|
|
11
|
+
|
|
5
12
|
/** fallback은 계약 manifest와 같은 사이트 정의에서 가져온다. API key는 서버 전용이다. */
|
|
6
13
|
export async function routeMetadata(
|
|
7
14
|
routeKey: string,
|
|
@@ -9,10 +16,12 @@ export async function routeMetadata(
|
|
|
9
16
|
): Promise<Metadata> {
|
|
10
17
|
let route: PublicRouteMetadata | null = null;
|
|
11
18
|
try {
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
19
|
+
const snapshot = await loadSiteRouteMetadata();
|
|
20
|
+
route = snapshot.routes.find((entry) => entry.routeKey === routeKey) ?? null;
|
|
21
|
+
if (route && route.path !== new URL(options.canonical).pathname) {
|
|
22
|
+
console.error("메타데이터 공개 경로 불일치", { routeKey });
|
|
23
|
+
route = null;
|
|
24
|
+
}
|
|
16
25
|
} catch (error) {
|
|
17
26
|
// 오류를 "설정 없음"으로 저장하는 별도 캐시를 만들지 않는다.
|
|
18
27
|
console.error("메타데이터 조회 실패", { routeKey, error: error instanceof Error ? error.name : "unknown" });
|
|
@@ -7,7 +7,7 @@ export async function syncExternalInquiries(snapshot: {
|
|
|
7
7
|
items: Array<{
|
|
8
8
|
external_id: string; received_at: string; name: string; phone: string;
|
|
9
9
|
email: string; message: string;
|
|
10
|
-
status: "new" | "contacting" | "contacted" | "follow_up" | "converted" | "closed";
|
|
10
|
+
status: "new" | "contacting" | "contacted" | "follow_up" | "converted" | "closed" | "excluded" | "booked" | "visited" | "no_show" | "canceled";
|
|
11
11
|
extras?: Record<string, string>;
|
|
12
12
|
}>;
|
|
13
13
|
}) {
|
package/package.json
CHANGED