@spfn/cms 0.1.0-alpha.6 → 0.1.0-alpha.60
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/dist/actions.d.ts +140 -6
- package/dist/actions.js +97 -10
- package/dist/actions.js.map +1 -1
- package/dist/client.d.ts +43 -9
- package/dist/client.js +406 -56
- package/dist/client.js.map +1 -1
- package/dist/contracts/labels.d.ts +149 -0
- package/dist/contracts/labels.js +166 -0
- package/dist/contracts/labels.js.map +1 -0
- package/dist/contracts/published-cache.d.ts +25 -0
- package/dist/contracts/published-cache.js +32 -0
- package/dist/contracts/published-cache.js.map +1 -0
- package/dist/contracts/values.d.ts +69 -0
- package/dist/contracts/values.js +100 -0
- package/dist/contracts/values.js.map +1 -0
- package/dist/entities/cms-audit-logs.d.ts +15 -70
- package/dist/entities/cms-audit-logs.js +75 -100
- package/dist/entities/cms-audit-logs.js.map +1 -1
- package/dist/entities/cms-draft-cache.d.ts +13 -73
- package/dist/entities/cms-draft-cache.js +35 -109
- package/dist/entities/cms-draft-cache.js.map +1 -1
- package/dist/entities/cms-label-values.d.ts +14 -65
- package/dist/entities/cms-label-values.js +78 -102
- package/dist/entities/cms-label-values.js.map +1 -1
- package/dist/entities/cms-label-versions.d.ts +16 -49
- package/dist/entities/cms-label-versions.js +73 -77
- package/dist/entities/cms-label-versions.js.map +1 -1
- package/dist/entities/cms-labels.d.ts +17 -14
- package/dist/entities/cms-labels.js +39 -45
- package/dist/entities/cms-labels.js.map +1 -1
- package/dist/entities/cms-published-cache.d.ts +14 -69
- package/dist/entities/cms-published-cache.js +33 -100
- package/dist/entities/cms-published-cache.js.map +1 -1
- package/dist/entities/index.d.ts +7 -10
- package/dist/entities/index.js +217 -9
- package/dist/entities/index.js.map +1 -1
- package/dist/generators/index.d.ts +8 -7
- package/dist/generators/index.js +657 -17
- package/dist/generators/index.js.map +1 -1
- package/dist/index.d.ts +134 -20
- package/dist/index.js +1115 -23
- package/dist/index.js.map +1 -1
- package/dist/{generators/label-sync-generator.d.ts → label-sync-generator-lQrcVfja.d.ts} +9 -6
- package/dist/labels/index.d.ts +31 -4
- package/dist/labels/index.js +31 -6
- package/dist/labels/index.js.map +1 -1
- package/dist/repositories/index.d.ts +205 -6
- package/dist/repositories/index.js +435 -8
- package/dist/repositories/index.js.map +1 -1
- package/dist/routes/labels/[id]/index.js +499 -89
- package/dist/routes/labels/[id]/index.js.map +1 -1
- package/dist/routes/labels/{[id] → _id_}/index.d.ts +5 -3
- package/dist/routes/labels/by-key/[key]/index.js +453 -29
- package/dist/routes/labels/by-key/[key]/index.js.map +1 -1
- package/dist/routes/labels/by-key/_key_/index.d.ts +10 -0
- package/dist/routes/labels/index.d.ts +5 -3
- package/dist/routes/labels/index.js +488 -68
- package/dist/routes/labels/index.js.map +1 -1
- package/dist/routes/published-cache/index.d.ts +5 -3
- package/dist/routes/published-cache/index.js +325 -30
- package/dist/routes/published-cache/index.js.map +1 -1
- package/dist/routes/values/[labelId]/[version]/index.js +467 -41
- package/dist/routes/values/[labelId]/[version]/index.js.map +1 -1
- package/dist/routes/values/[labelId]/index.js +463 -39
- package/dist/routes/values/[labelId]/index.js.map +1 -1
- package/dist/routes/values/_labelId_/_version_/index.d.ts +10 -0
- package/dist/routes/values/_labelId_/index.d.ts +10 -0
- package/dist/server.d.ts +17 -7
- package/dist/server.js +263 -252
- package/dist/server.js.map +1 -1
- package/dist/store.d.ts +8 -14
- package/dist/store.js +396 -198
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +14 -7
- package/dist/types.js +0 -6
- package/dist/types.js.map +1 -1
- package/migrations/0000_condemned_centennial.sql +89 -0
- package/migrations/meta/0000_snapshot.json +687 -0
- package/migrations/meta/_journal.json +13 -0
- package/package.json +33 -16
- package/dist/actions.d.ts.map +0 -1
- package/dist/client.d.ts.map +0 -1
- package/dist/cms.config.d.ts +0 -77
- package/dist/cms.config.d.ts.map +0 -1
- package/dist/cms.config.js +0 -111
- package/dist/cms.config.js.map +0 -1
- package/dist/entities/cms-audit-logs.d.ts.map +0 -1
- package/dist/entities/cms-draft-cache.d.ts.map +0 -1
- package/dist/entities/cms-label-values.d.ts.map +0 -1
- package/dist/entities/cms-label-versions.d.ts.map +0 -1
- package/dist/entities/cms-labels.d.ts.map +0 -1
- package/dist/entities/cms-published-cache.d.ts.map +0 -1
- package/dist/entities/index.d.ts.map +0 -1
- package/dist/generators/index.d.ts.map +0 -1
- package/dist/generators/label-sync-generator.d.ts.map +0 -1
- package/dist/generators/label-sync-generator.js +0 -87
- package/dist/generators/label-sync-generator.js.map +0 -1
- package/dist/helpers/locale.actions.d.ts +0 -132
- package/dist/helpers/locale.actions.d.ts.map +0 -1
- package/dist/helpers/locale.actions.js +0 -210
- package/dist/helpers/locale.actions.js.map +0 -1
- package/dist/helpers/locale.constants.d.ts +0 -10
- package/dist/helpers/locale.constants.d.ts.map +0 -1
- package/dist/helpers/locale.constants.js +0 -10
- package/dist/helpers/locale.constants.js.map +0 -1
- package/dist/helpers/locale.d.ts +0 -17
- package/dist/helpers/locale.d.ts.map +0 -1
- package/dist/helpers/locale.js +0 -20
- package/dist/helpers/locale.js.map +0 -1
- package/dist/helpers/sync.d.ts +0 -41
- package/dist/helpers/sync.d.ts.map +0 -1
- package/dist/helpers/sync.js +0 -309
- package/dist/helpers/sync.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/init.d.ts +0 -31
- package/dist/init.d.ts.map +0 -1
- package/dist/init.js +0 -36
- package/dist/init.js.map +0 -1
- package/dist/labels/helpers.d.ts +0 -31
- package/dist/labels/helpers.d.ts.map +0 -1
- package/dist/labels/helpers.js +0 -60
- package/dist/labels/helpers.js.map +0 -1
- package/dist/labels/index.d.ts.map +0 -1
- package/dist/repositories/cms-draft-cache.repository.d.ts +0 -62
- package/dist/repositories/cms-draft-cache.repository.d.ts.map +0 -1
- package/dist/repositories/cms-draft-cache.repository.js +0 -56
- package/dist/repositories/cms-draft-cache.repository.js.map +0 -1
- package/dist/repositories/cms-label-values.repository.d.ts +0 -32
- package/dist/repositories/cms-label-values.repository.d.ts.map +0 -1
- package/dist/repositories/cms-label-values.repository.js +0 -72
- package/dist/repositories/cms-label-values.repository.js.map +0 -1
- package/dist/repositories/cms-labels.repository.d.ts +0 -53
- package/dist/repositories/cms-labels.repository.d.ts.map +0 -1
- package/dist/repositories/cms-labels.repository.js +0 -77
- package/dist/repositories/cms-labels.repository.js.map +0 -1
- package/dist/repositories/cms-published-cache.repository.d.ts +0 -53
- package/dist/repositories/cms-published-cache.repository.d.ts.map +0 -1
- package/dist/repositories/cms-published-cache.repository.js +0 -54
- package/dist/repositories/cms-published-cache.repository.js.map +0 -1
- package/dist/repositories/index.d.ts.map +0 -1
- package/dist/routes/labels/[id]/contract.d.ts +0 -68
- package/dist/routes/labels/[id]/contract.d.ts.map +0 -1
- package/dist/routes/labels/[id]/contract.js +0 -84
- package/dist/routes/labels/[id]/contract.js.map +0 -1
- package/dist/routes/labels/[id]/index.d.ts.map +0 -1
- package/dist/routes/labels/by-key/[key]/contract.d.ts +0 -24
- package/dist/routes/labels/by-key/[key]/contract.d.ts.map +0 -1
- package/dist/routes/labels/by-key/[key]/contract.js +0 -28
- package/dist/routes/labels/by-key/[key]/contract.js.map +0 -1
- package/dist/routes/labels/by-key/[key]/index.d.ts +0 -8
- package/dist/routes/labels/by-key/[key]/index.d.ts.map +0 -1
- package/dist/routes/labels/contract.d.ts +0 -59
- package/dist/routes/labels/contract.d.ts.map +0 -1
- package/dist/routes/labels/contract.js +0 -75
- package/dist/routes/labels/contract.js.map +0 -1
- package/dist/routes/labels/index.d.ts.map +0 -1
- package/dist/routes/published-cache/contract.d.ts +0 -25
- package/dist/routes/published-cache/contract.d.ts.map +0 -1
- package/dist/routes/published-cache/contract.js +0 -35
- package/dist/routes/published-cache/contract.js.map +0 -1
- package/dist/routes/published-cache/index.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/[version]/contract.d.ts +0 -29
- package/dist/routes/values/[labelId]/[version]/contract.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/[version]/contract.js +0 -33
- package/dist/routes/values/[labelId]/[version]/contract.js.map +0 -1
- package/dist/routes/values/[labelId]/[version]/index.d.ts +0 -8
- package/dist/routes/values/[labelId]/[version]/index.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/contract.d.ts +0 -38
- package/dist/routes/values/[labelId]/contract.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/contract.js +0 -59
- package/dist/routes/values/[labelId]/contract.js.map +0 -1
- package/dist/routes/values/[labelId]/index.d.ts +0 -8
- package/dist/routes/values/[labelId]/index.d.ts.map +0 -1
- package/dist/server.d.ts.map +0 -1
- package/dist/store.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/server.ts","../src/contracts/published-cache.ts","../src/helpers/locale.actions.ts","../src/cms.config.ts","../src/helpers/locale.constants.ts"],"sourcesContent":["/**\n * CMS Server Module\n *\n * Next.js 서버 컴포넌트용 CMS 유틸리티\n * - React cache를 사용한 데이터 중복 제거\n * - SPFN API를 통한 contract-based 호출\n * - 변수 치환 지원\n * - 쿠키 기반 locale 자동 관리\n *\n * @note This module should only be imported in server-side code\n */\n\nimport { cache } from 'react';\nimport { client } from '@spfn/core/client';\nimport { getPublishedCacheContract } from './contracts/published-cache';\nimport { getLocale } from './helpers/locale.actions';\n\n/**\n * Section Data Type\n */\nexport type SectionData = {\n section: string;\n locale: string;\n content: Record<string, any>;\n version: number;\n publishedAt: string | null;\n};\n\n/**\n * Translation Function Type (runtime version)\n */\ntype ServerTranslationFunction = (\n key: string,\n defaultValue?: any,\n replace?: Record<string, string | number>\n) => any;\n\n/**\n * Section API Return Type\n */\nexport type SectionAPI = {\n /**\n * 라벨 값 가져오기 (변수 치환 지원)\n *\n * @param key - 라벨 키 (섹션 제외, 예: 'hero.title')\n * @param defaultValue - 기본값\n * @param replace - 변수 치환 맵 (예: { name: 'John' })\n * @returns 라벨 값 (문자열인 경우 변수 치환됨)\n */\n t: ServerTranslationFunction;\n\n /**\n * 섹션 데이터\n */\n data: SectionData;\n};\n\n/**\n * 변수 치환 헬퍼\n *\n * @param text - 치환할 텍스트 (예: 'Hello {name}!')\n * @param replace - 치환 맵 (예: { name: 'World' })\n * @returns 치환된 텍스트 (예: 'Hello World!')\n */\nfunction replaceVariables(text: string, replace: Record<string, string | number>): string\n{\n return text.replace(/\\{(\\w+)}/g, (match, key) =>\n {\n const value = replace[key];\n return value !== undefined ? String(value) : match;\n });\n}\n\n/**\n * 섹션 데이터 로드 (React cache 적용)\n *\n * 동일한 요청 내에서 같은 섹션을 여러 번 요청해도 한 번만 API 호출\n *\n * @param section - 섹션 이름 (예: 'home', 'why-futureplay')\n * @param locale - 언어 코드 (선택, 미지정시 쿠키에서 자동 조회)\n * @returns Section API ({ t, data })\n *\n * @example\n * ```tsx\n * // Server Component\n * import { getSection } from '@spfn/cms/server';\n *\n * export default async function HomePage()\n * {\n * // locale을 지정하지 않으면 쿠키에서 자동으로 가져옴\n * const { t } = await getSection('home');\n *\n * // 또는 명시적으로 locale 지정\n * const { t: tEn } = await getSection('home', 'en');\n *\n * return (\n * <div>\n * <h1>{t('hero.title')}</h1>\n * <p>{t('hero.subtitle', 'Default Subtitle')}</p>\n * <p>{t('hero.greeting', 'Hello {name}!', { name: 'World' })}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport const getSection = cache(async (\n section: string,\n locale?: string\n): Promise<SectionAPI> =>\n{\n // locale이 지정되지 않으면 쿠키에서 가져옴\n const actualLocale: string = locale ?? await getLocale();\n\n try\n {\n // Call SPFN API via contract (uses singleton client)\n const response = await client.call(\n getPublishedCacheContract,\n {\n query: { sections: section, locale: actualLocale },\n }\n );\n\n // Check if response has error\n if ('error' in response)\n {\n console.warn(`[CMS] ${response.error}`);\n // Return empty section data\n const sectionData: SectionData = {\n section,\n locale: actualLocale,\n content: {} as Record<string, any>,\n version: 0,\n publishedAt: null,\n };\n\n const t: ServerTranslationFunction = (_key, defaultValue) => defaultValue ?? '';\n return { t, data: sectionData };\n }\n\n // Response is an array, get first element\n const found = response[0];\n\n if (!found)\n {\n // Section not found, return empty\n const sectionData: SectionData = {\n section,\n locale: actualLocale,\n content: {} as Record<string, any>,\n version: 0,\n publishedAt: null,\n };\n\n const t: ServerTranslationFunction = (_key, defaultValue) => defaultValue ?? '';\n return { t, data: sectionData };\n }\n\n // Success response\n const sectionData: SectionData = {\n section: found.section,\n locale: found.locale,\n content: found.content || {},\n version: found.version,\n publishedAt: found.publishedAt,\n };\n\n // Translation function\n const t: ServerTranslationFunction = (key, defaultValue, replace) =>\n {\n const fullKey = `${section}.${key}`;\n let value = sectionData.content[fullKey];\n\n if (value === undefined || value === null)\n {\n value = defaultValue ?? '';\n }\n\n // 문자열이 아니면 빈 문자열 반환\n if (typeof value !== 'string')\n {\n return '';\n }\n\n // 문자열이고 치환 맵이 있으면 변수 치환\n if (replace)\n {\n value = replaceVariables(value, replace);\n }\n\n return value;\n };\n\n return {\n t,\n data: sectionData,\n };\n }\n catch (error)\n {\n console.error(`[CMS] Failed to fetch section \"${section}\":`, error);\n\n // Return empty section data on error\n const sectionData: SectionData = {\n section,\n locale: actualLocale,\n content: {} as Record<string, any>,\n version: 0,\n publishedAt: null,\n };\n\n const t: ServerTranslationFunction = (_key, defaultValue) => defaultValue ?? '';\n return { t, data: sectionData };\n }\n});\n\n/**\n * 여러 섹션 한번에 로드 (React cache 적용)\n * 단일 API 호출로 여러 섹션을 효율적으로 가져옵니다\n *\n * @param sections - 섹션 이름 배열\n * @param locale - 언어 코드 (선택, 미지정시 쿠키에서 자동 조회)\n * @returns Section API 맵 ({ home: { t, data }, ... })\n *\n * @example\n * ```tsx\n * // Server Component\n * import { getSections } from '@spfn/cms/server';\n *\n * export default async function Page()\n * {\n * // locale을 지정하지 않으면 쿠키에서 자동으로 가져옴\n * const sections = await getSections(['home', 'why-futureplay']);\n *\n * // 또는 명시적으로 locale 지정\n * const sectionsEn = await getSections(['home', 'why-futureplay'], 'en');\n *\n * return (\n * <div>\n * <h1>{sections.home.t('hero.title')}</h1>\n * <p>{sections['why-futureplay'].t('intro.text')}</p>\n * </div>\n * );\n * }\n * ```\n */\nexport const getSections = cache(async (\n sections: string[],\n locale?: string\n): Promise<Record<string, SectionAPI>> =>\n{\n // locale이 지정되지 않으면 쿠키에서 가져옴\n const actualLocale: string = locale ?? await getLocale();\n\n try\n {\n // Call SPFN API with array of sections (single HTTP request)\n const response = await client.call(\n getPublishedCacheContract,\n {\n query: { sections, locale: actualLocale },\n }\n );\n\n // Check if response has error\n if ('error' in response)\n {\n console.warn(`[CMS] ${response.error}`);\n // Return empty sections\n const sectionsMap: Record<string, SectionAPI> = {};\n sections.forEach(section =>\n {\n sectionsMap[section] = {\n t: (_key, defaultValue) => defaultValue ?? '',\n data: {\n section,\n locale: actualLocale,\n content: {},\n version: 0,\n publishedAt: null,\n }\n };\n });\n return sectionsMap;\n }\n\n // Build sections map from response\n const sectionsMap: Record<string, SectionAPI> = {};\n\n // First, create empty entries for all requested sections\n sections.forEach(section =>\n {\n sectionsMap[section] = {\n t: (_key, defaultValue) => defaultValue ?? '',\n data: {\n section,\n locale: actualLocale,\n content: {},\n version: 0,\n publishedAt: null,\n }\n };\n });\n\n // Then, fill in data for found sections\n response.forEach(sectionData =>\n {\n const createTranslationFn = (section: string, content: Record<string, any>): ServerTranslationFunction =>\n {\n return (key, defaultValue, replace) =>\n {\n const fullKey = `${section}.${key}`;\n let value = content[fullKey];\n\n if (value === undefined || value === null)\n {\n value = defaultValue ?? '';\n }\n\n // 문자열이 아니면 빈 문자열 반환\n if (typeof value !== 'string')\n {\n return '';\n }\n\n // 문자열이고 치환 맵이 있으면 변수 치환\n if (replace)\n {\n value = replaceVariables(value, replace);\n }\n\n return value;\n };\n };\n\n sectionsMap[sectionData.section] = {\n t: createTranslationFn(sectionData.section, sectionData.content),\n data: {\n section: sectionData.section,\n locale: sectionData.locale,\n content: sectionData.content,\n version: sectionData.version,\n publishedAt: sectionData.publishedAt,\n }\n };\n });\n\n return sectionsMap;\n }\n catch (error)\n {\n console.error(`[CMS] Failed to fetch sections:`, error);\n\n // Return empty sections on error\n const sectionsMap: Record<string, SectionAPI> = {};\n sections.forEach(section =>\n {\n sectionsMap[section] = {\n t: (_key, defaultValue) => defaultValue ?? '',\n data: {\n section,\n locale: actualLocale,\n content: {},\n version: 0,\n publishedAt: null,\n }\n };\n });\n return sectionsMap;\n }\n});","import { Type } from '@sinclair/typebox';\nimport type { RouteContract } from '@spfn/core/route';\n\nconst SectionData = Type.Object({\n section: Type.String(),\n locale: Type.String(),\n content: Type.Record(Type.String(), Type.Any()),\n version: Type.Number(),\n publishedAt: Type.Union([Type.String(), Type.Null()]),\n});\n\n/**\n * GET /cms/published-cache\n * 발행된 콘텐츠 캐시 조회 (단일 또는 여러 섹션)\n */\nexport const getPublishedCacheContract = {\n method: 'GET' as const,\n path: '/cms/published-cache',\n query: Type.Object({\n sections: Type.Union([\n Type.String({ description: '단일 섹션 이름 (예: home)' }),\n Type.Array(Type.String(), { description: '여러 섹션 이름 (예: [\"home\", \"footer\"])' })\n ]),\n locale: Type.Optional(Type.String({ default: 'ko', description: '언어 코드' })),\n }),\n response: Type.Union([\n // 성공: 항상 배열로 반환\n Type.Array(SectionData),\n // 에러\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;","\"use server\";\n\n/**\n * Locale Management Server Actions\n *\n * Server Actions으로 구현된 locale 관리 함수\n * - 서버 컴포넌트: 일반 함수 호출로 동작\n * - 클라이언트 컴포넌트: Server Action으로 자동 처리\n */\n\nimport { cookies, headers } from 'next/headers.js';\nimport { getCmsConfig } from '../cms.config.js';\nimport { LOCALE_COOKIE_KEY } from './locale.constants.js';\n\n/**\n * 브라우저 언어 감지\n *\n * Accept-Language 헤더에서 지원하는 언어를 찾습니다.\n *\n * @returns 감지된 언어 코드 또는 null\n */\nasync function detectBrowserLanguage(): Promise<string | null>\n{\n try\n {\n const headersList = await headers();\n const acceptLanguage = headersList.get('accept-language');\n\n if (!acceptLanguage)\n {\n return null;\n }\n\n // \"ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7\" 형식 파싱\n const languages = acceptLanguage\n .split(',')\n .map(lang =>\n {\n const [code] = lang.split(';');\n return code.split('-')[0].trim();\n });\n\n const config = getCmsConfig();\n\n // 지원하는 언어 중 첫 번째 매칭되는 언어 반환\n for (const lang of languages)\n {\n if (config.supportedLocales.includes(lang))\n {\n return lang;\n }\n }\n\n return null;\n }\n catch (error)\n {\n // 헤더 접근 실패 시\n return null;\n }\n}\n\n/**\n * 현재 locale 가져오기 (Server Action)\n *\n * 서버/클라이언트 컴포넌트 모두에서 사용 가능\n *\n * 우선순위:\n * 1. 쿠키 (사용자가 명시적으로 선택한 언어)\n * 2. 브라우저 언어 감지 (설정에서 활성화된 경우)\n * 3. 시스템 기본 언어 (CMS 설정)\n *\n * @returns 현재 locale (예: 'ko', 'en')\n *\n * @example\n * ```tsx\n * // Server Component\n * import { getLocale } from '@spfn/cms';\n *\n * export default async function Page()\n * {\n * const locale = await getLocale();\n * return <div>Current locale: {locale}</div>;\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Client Component\n * 'use client';\n * import { getLocale } from '@spfn/cms/client';\n *\n * export default function LanguageSwitcher()\n * {\n * const [locale, setLocale] = useState('');\n *\n * useEffect(() => {\n * getLocale().then(setLocale);\n * }, []);\n *\n * return <div>Current locale: {locale}</div>;\n * }\n * ```\n */\nexport async function getLocale(): Promise<string>\n{\n const config = getCmsConfig();\n\n // 1순위: 쿠키 (사용자가 명시적으로 선택한 언어)\n const cookieStore = await cookies();\n const cookieLocale = cookieStore.get(LOCALE_COOKIE_KEY)?.value;\n\n if (cookieLocale && config.supportedLocales.includes(cookieLocale))\n {\n return cookieLocale;\n }\n\n // 2순위: 브라우저 언어 감지 (설정에서 활성화된 경우)\n if (config.detectBrowserLanguage)\n {\n const browserLang = await detectBrowserLanguage();\n if (browserLang)\n {\n return browserLang;\n }\n }\n\n // 3순위: 시스템 기본 언어\n return config.defaultLocale;\n}\n\n/**\n * Locale 설정하기 (Server Action)\n *\n * 서버/클라이언트 컴포넌트 모두에서 사용 가능\n * 쿠키에 locale을 저장합니다.\n *\n * @param locale - 설정할 locale (예: 'ko', 'en')\n * @throws {Error} 지원하지 않는 locale인 경우\n *\n * @example\n * ```tsx\n * // Server Component (Server Action)\n * import { setLocale } from '@spfn/cms';\n *\n * export default async function Page()\n * {\n * await setLocale('en');\n * return <div>Locale changed</div>;\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Client Component (Server Action)\n * 'use client';\n * import { setLocale } from '@spfn/cms/client';\n *\n * export default function LanguageSwitcher()\n * {\n * const handleChange = async (newLocale: string) =>\n * {\n * await setLocale(newLocale);\n * window.location.reload(); // 페이지 새로고침\n * };\n *\n * return (\n * <button onClick={() => handleChange('en')}>\n * Switch to English\n * </button>\n * );\n * }\n * ```\n */\nexport async function setLocale(locale: string): Promise<void>\n{\n const config = getCmsConfig();\n\n // 유효성 검사\n if (!config.supportedLocales.includes(locale))\n {\n throw new Error(\n `Unsupported locale: ${locale}. Supported locales: ${config.supportedLocales.join(', ')}`\n );\n }\n\n const cookieStore = await cookies();\n\n cookieStore.set(LOCALE_COOKIE_KEY, locale, {\n path: '/',\n maxAge: 60 * 60 * 24 * 365, // 1년\n sameSite: 'lax',\n });\n}\n\n/**\n * 지원하는 locale 목록 가져오기 (Server Action)\n *\n * 서버/클라이언트 컴포넌트 모두에서 사용 가능\n *\n * @returns 지원하는 locale 배열 (예: ['ko', 'en', 'ja'])\n *\n * @example\n * ```tsx\n * // Server Component\n * import { getLocales } from '@spfn/cms';\n *\n * export default async function Page()\n * {\n * const locales = await getLocales();\n * return <div>Supported: {locales.join(', ')}</div>;\n * }\n * ```\n *\n * @example\n * ```tsx\n * // Client Component\n * 'use client';\n * import { getLocales } from '@spfn/cms/client';\n *\n * export default function LanguageSwitcher()\n * {\n * const [locales, setLocales] = useState<string[]>([]);\n *\n * useEffect(() => {\n * getLocales().then(setLocales);\n * }, []);\n *\n * return (\n * <div>\n * {locales.map(locale => (\n * <button key={locale}>{locale}</button>\n * ))}\n * </div>\n * );\n * }\n * ```\n */\nexport async function getLocales(): Promise<string[]>\n{\n const config = getCmsConfig();\n return config.supportedLocales;\n}","/**\n * CMS Configuration Module\n *\n * 환경변수 기반 CMS 설정 관리\n * - SPFN_CMS_DEFAULT_LOCALE: 기본 언어 (기본값: 'ko')\n * - SPFN_CMS_SUPPORTED_LOCALES: 지원 언어 목록, 쉼표로 구분 (기본값: 'ko,en')\n * - SPFN_CMS_DETECT_BROWSER_LANGUAGE: 브라우저 언어 자동 감지 (기본값: 'false')\n */\n\n/**\n * CMS 설정 타입\n */\nexport interface CmsConfig\n{\n /**\n * 기본 언어 코드\n * @example 'ko', 'en', 'ja'\n */\n defaultLocale: string;\n\n /**\n * 지원하는 언어 목록\n * @example ['ko', 'en', 'ja']\n */\n supportedLocales: string[];\n\n /**\n * 브라우저 언어 자동 감지 여부\n * @default false\n */\n detectBrowserLanguage: boolean;\n}\n\n/**\n * 환경변수 읽기 헬퍼\n */\nfunction getEnvVar(key: string, defaultValue: string): string\n{\n return process.env[key] || defaultValue;\n}\n\n/**\n * 환경변수에서 boolean 읽기\n */\nfunction getEnvBoolean(key: string, defaultValue: boolean): boolean\n{\n const value = process.env[key];\n if (value === undefined) return defaultValue;\n return value === 'true' || value === '1';\n}\n\n/**\n * 환경변수에서 설정 로드\n */\nfunction loadConfigFromEnv(): CmsConfig\n{\n const defaultLocale = getEnvVar('SPFN_CMS_DEFAULT_LOCALE', 'en');\n const supportedLocalesStr = getEnvVar('SPFN_CMS_SUPPORTED_LOCALES', 'en,ko');\n const detectBrowserLanguage = getEnvBoolean('SPFN_CMS_DETECT_BROWSER_LANGUAGE', true);\n\n const supportedLocales = supportedLocalesStr\n .split(',')\n .map(locale => locale.trim())\n .filter(locale => locale.length > 0);\n\n // 기본 언어가 지원 목록에 없으면 추가\n if (!supportedLocales.includes(defaultLocale))\n {\n supportedLocales.unshift(defaultLocale);\n }\n\n return {\n defaultLocale,\n supportedLocales,\n detectBrowserLanguage,\n };\n}\n\n/**\n * 현재 설정 (환경변수에서 초기화)\n */\nlet currentConfig: CmsConfig = loadConfigFromEnv();\n\n/**\n * CMS 설정 조회\n *\n * @returns 현재 CMS 설정\n *\n * @example\n * ```tsx\n * import { getCmsConfig } from '@spfn/cms';\n *\n * const config = getCmsConfig();\n * console.log(config.defaultLocale); // 'ko'\n * console.log(config.supportedLocales); // ['ko', 'en']\n * ```\n */\nexport function getCmsConfig(): Readonly<CmsConfig>\n{\n return currentConfig;\n}\n\n/**\n * CMS 설정 변경 (런타임 오버라이드)\n *\n * 환경변수 설정을 런타임에 오버라이드합니다.\n * 주로 테스트나 특수한 경우에 사용됩니다.\n *\n * @param config - 변경할 설정 (부분 업데이트 가능)\n *\n * @example\n * ```tsx\n * import { configureCms } from '@spfn/cms';\n *\n * // 앱 초기화 시 (선택적)\n * configureCms({\n * defaultLocale: 'en',\n * supportedLocales: ['en', 'ko', 'ja'],\n * detectBrowserLanguage: true,\n * });\n * ```\n */\nexport function configureCms(config: Partial<CmsConfig>): void\n{\n currentConfig = {\n ...currentConfig,\n ...config,\n };\n\n // 기본 언어가 지원 목록에 있는지 확인\n if (config.defaultLocale && !currentConfig.supportedLocales.includes(config.defaultLocale))\n {\n console.warn(\n `[CMS Config] Default locale '${config.defaultLocale}' not in supported locales, adding automatically.`,\n `Supported locales: [${currentConfig.supportedLocales.join(', ')}]`\n );\n\n currentConfig.supportedLocales.unshift(config.defaultLocale);\n }\n}\n\n/**\n * 설정 초기화 (환경변수에서 재로드)\n *\n * @example\n * ```tsx\n * import { resetCmsConfig } from '@spfn/cms';\n *\n * // 환경변수 설정으로 되돌리기\n * resetCmsConfig();\n * ```\n */\nexport function resetCmsConfig(): void\n{\n currentConfig = loadConfigFromEnv();\n}","/**\n * Locale Constants\n *\n * Server/Client 양쪽에서 사용 가능한 locale 관련 상수\n */\n\n/**\n * Locale 쿠키 키\n */\nexport const LOCALE_COOKIE_KEY = 'spfn-locale';"],"mappings":"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","names":["detectBrowserLanguage","sectionData","t","sectionsMap"]}
|
package/dist/store.d.ts
CHANGED
|
@@ -1,12 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
* 클라이언트 컴포넌트에서 CMS 사용을 위한 상태 관리
|
|
5
|
-
* - 서버에서 초기화된 데이터를 클라이언트로 전달
|
|
6
|
-
* - 클라이언트에서 비동기로 로드 가능
|
|
7
|
-
* - 서버 API와 동일한 패턴 ({ t } 사용)
|
|
8
|
-
*/
|
|
9
|
-
import type { SectionData } from './server';
|
|
1
|
+
import * as zustand from 'zustand';
|
|
2
|
+
import { SectionData } from './server.js';
|
|
3
|
+
|
|
10
4
|
interface CmsState {
|
|
11
5
|
/**
|
|
12
6
|
* 섹션별 데이터
|
|
@@ -38,7 +32,7 @@ interface CmsState {
|
|
|
38
32
|
*/
|
|
39
33
|
reset: () => void;
|
|
40
34
|
}
|
|
41
|
-
|
|
35
|
+
declare const useCmsStore: zustand.UseBoundStore<zustand.StoreApi<CmsState>>;
|
|
42
36
|
/**
|
|
43
37
|
* 섹션 Hook (서버 API와 동일한 패턴)
|
|
44
38
|
*
|
|
@@ -58,7 +52,7 @@ export declare const useCmsStore: import("zustand").UseBoundStore<import("zustan
|
|
|
58
52
|
* }
|
|
59
53
|
* ```
|
|
60
54
|
*/
|
|
61
|
-
|
|
55
|
+
declare function useSection(section: string, options?: {
|
|
62
56
|
autoLoad?: boolean;
|
|
63
57
|
locale?: string;
|
|
64
58
|
}): {
|
|
@@ -78,10 +72,10 @@ export declare function useSection(section: string, options?: {
|
|
|
78
72
|
* sections.home.t('hero.title');
|
|
79
73
|
* ```
|
|
80
74
|
*/
|
|
81
|
-
|
|
75
|
+
declare function useSections(sectionNames: string[]): Record<string, {
|
|
82
76
|
t: (key: string, defaultValue?: any, replace?: Record<string, string | number>) => any;
|
|
83
77
|
data: SectionData;
|
|
84
78
|
loading: boolean;
|
|
85
79
|
}>;
|
|
86
|
-
|
|
87
|
-
|
|
80
|
+
|
|
81
|
+
export { useCmsStore, useSection, useSections };
|