@spfn/cms 0.1.0-alpha.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.
Files changed (175) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +490 -0
  3. package/dist/actions.d.ts +9 -0
  4. package/dist/actions.d.ts.map +1 -0
  5. package/dist/actions.js +11 -0
  6. package/dist/actions.js.map +1 -0
  7. package/dist/client.d.ts +138 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +62 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/cms.config.d.ts +77 -0
  12. package/dist/cms.config.d.ts.map +1 -0
  13. package/dist/cms.config.js +111 -0
  14. package/dist/cms.config.js.map +1 -0
  15. package/dist/entities/cms-audit-logs.d.ts +213 -0
  16. package/dist/entities/cms-audit-logs.d.ts.map +1 -0
  17. package/dist/entities/cms-audit-logs.js +103 -0
  18. package/dist/entities/cms-audit-logs.js.map +1 -0
  19. package/dist/entities/cms-draft-cache.d.ts +188 -0
  20. package/dist/entities/cms-draft-cache.d.ts.map +1 -0
  21. package/dist/entities/cms-draft-cache.js +112 -0
  22. package/dist/entities/cms-draft-cache.js.map +1 -0
  23. package/dist/entities/cms-label-values.d.ts +192 -0
  24. package/dist/entities/cms-label-values.d.ts.map +1 -0
  25. package/dist/entities/cms-label-values.js +105 -0
  26. package/dist/entities/cms-label-values.js.map +1 -0
  27. package/dist/entities/cms-label-versions.d.ts +207 -0
  28. package/dist/entities/cms-label-versions.d.ts.map +1 -0
  29. package/dist/entities/cms-label-versions.js +80 -0
  30. package/dist/entities/cms-label-versions.js.map +1 -0
  31. package/dist/entities/cms-labels.d.ts +189 -0
  32. package/dist/entities/cms-labels.d.ts.map +1 -0
  33. package/dist/entities/cms-labels.js +48 -0
  34. package/dist/entities/cms-labels.js.map +1 -0
  35. package/dist/entities/cms-published-cache.d.ts +199 -0
  36. package/dist/entities/cms-published-cache.d.ts.map +1 -0
  37. package/dist/entities/cms-published-cache.js +103 -0
  38. package/dist/entities/cms-published-cache.js.map +1 -0
  39. package/dist/entities/index.d.ts +10 -0
  40. package/dist/entities/index.d.ts.map +1 -0
  41. package/dist/entities/index.js +10 -0
  42. package/dist/entities/index.js.map +1 -0
  43. package/dist/generators/index.d.ts +19 -0
  44. package/dist/generators/index.d.ts.map +1 -0
  45. package/dist/generators/index.js +19 -0
  46. package/dist/generators/index.js.map +1 -0
  47. package/dist/generators/label-sync-generator.d.ts +33 -0
  48. package/dist/generators/label-sync-generator.d.ts.map +1 -0
  49. package/dist/generators/label-sync-generator.js +86 -0
  50. package/dist/generators/label-sync-generator.js.map +1 -0
  51. package/dist/helpers/locale.actions.d.ts +132 -0
  52. package/dist/helpers/locale.actions.d.ts.map +1 -0
  53. package/dist/helpers/locale.actions.js +210 -0
  54. package/dist/helpers/locale.actions.js.map +1 -0
  55. package/dist/helpers/locale.constants.d.ts +10 -0
  56. package/dist/helpers/locale.constants.d.ts.map +1 -0
  57. package/dist/helpers/locale.constants.js +10 -0
  58. package/dist/helpers/locale.constants.js.map +1 -0
  59. package/dist/helpers/locale.d.ts +17 -0
  60. package/dist/helpers/locale.d.ts.map +1 -0
  61. package/dist/helpers/locale.js +20 -0
  62. package/dist/helpers/locale.js.map +1 -0
  63. package/dist/helpers/sync.d.ts +41 -0
  64. package/dist/helpers/sync.d.ts.map +1 -0
  65. package/dist/helpers/sync.js +309 -0
  66. package/dist/helpers/sync.js.map +1 -0
  67. package/dist/index.d.ts +20 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +24 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/init.d.ts +31 -0
  72. package/dist/init.d.ts.map +1 -0
  73. package/dist/init.js +36 -0
  74. package/dist/init.js.map +1 -0
  75. package/dist/labels/helpers.d.ts +31 -0
  76. package/dist/labels/helpers.d.ts.map +1 -0
  77. package/dist/labels/helpers.js +60 -0
  78. package/dist/labels/helpers.js.map +1 -0
  79. package/dist/labels/index.d.ts +7 -0
  80. package/dist/labels/index.d.ts.map +1 -0
  81. package/dist/labels/index.js +7 -0
  82. package/dist/labels/index.js.map +1 -0
  83. package/dist/repositories/cms-draft-cache.repository.d.ts +62 -0
  84. package/dist/repositories/cms-draft-cache.repository.d.ts.map +1 -0
  85. package/dist/repositories/cms-draft-cache.repository.js +56 -0
  86. package/dist/repositories/cms-draft-cache.repository.js.map +1 -0
  87. package/dist/repositories/cms-label-values.repository.d.ts +32 -0
  88. package/dist/repositories/cms-label-values.repository.d.ts.map +1 -0
  89. package/dist/repositories/cms-label-values.repository.js +72 -0
  90. package/dist/repositories/cms-label-values.repository.js.map +1 -0
  91. package/dist/repositories/cms-labels.repository.d.ts +53 -0
  92. package/dist/repositories/cms-labels.repository.d.ts.map +1 -0
  93. package/dist/repositories/cms-labels.repository.js +77 -0
  94. package/dist/repositories/cms-labels.repository.js.map +1 -0
  95. package/dist/repositories/cms-published-cache.repository.d.ts +53 -0
  96. package/dist/repositories/cms-published-cache.repository.d.ts.map +1 -0
  97. package/dist/repositories/cms-published-cache.repository.js +54 -0
  98. package/dist/repositories/cms-published-cache.repository.js.map +1 -0
  99. package/dist/repositories/index.d.ts +8 -0
  100. package/dist/repositories/index.d.ts.map +1 -0
  101. package/dist/repositories/index.js +9 -0
  102. package/dist/repositories/index.js.map +1 -0
  103. package/dist/routes/labels/[id]/contract.d.ts +68 -0
  104. package/dist/routes/labels/[id]/contract.d.ts.map +1 -0
  105. package/dist/routes/labels/[id]/contract.js +84 -0
  106. package/dist/routes/labels/[id]/contract.js.map +1 -0
  107. package/dist/routes/labels/[id]/index.d.ts +10 -0
  108. package/dist/routes/labels/[id]/index.d.ts.map +1 -0
  109. package/dist/routes/labels/[id]/index.js +96 -0
  110. package/dist/routes/labels/[id]/index.js.map +1 -0
  111. package/dist/routes/labels/by-key/[key]/contract.d.ts +24 -0
  112. package/dist/routes/labels/by-key/[key]/contract.d.ts.map +1 -0
  113. package/dist/routes/labels/by-key/[key]/contract.js +28 -0
  114. package/dist/routes/labels/by-key/[key]/contract.js.map +1 -0
  115. package/dist/routes/labels/by-key/[key]/index.d.ts +8 -0
  116. package/dist/routes/labels/by-key/[key]/index.d.ts.map +1 -0
  117. package/dist/routes/labels/by-key/[key]/index.js +32 -0
  118. package/dist/routes/labels/by-key/[key]/index.js.map +1 -0
  119. package/dist/routes/labels/contract.d.ts +59 -0
  120. package/dist/routes/labels/contract.d.ts.map +1 -0
  121. package/dist/routes/labels/contract.js +75 -0
  122. package/dist/routes/labels/contract.js.map +1 -0
  123. package/dist/routes/labels/index.d.ts +10 -0
  124. package/dist/routes/labels/index.d.ts.map +1 -0
  125. package/dist/routes/labels/index.js +73 -0
  126. package/dist/routes/labels/index.js.map +1 -0
  127. package/dist/routes/published-cache/contract.d.ts +25 -0
  128. package/dist/routes/published-cache/contract.d.ts.map +1 -0
  129. package/dist/routes/published-cache/contract.js +35 -0
  130. package/dist/routes/published-cache/contract.js.map +1 -0
  131. package/dist/routes/published-cache/index.d.ts +8 -0
  132. package/dist/routes/published-cache/index.d.ts.map +1 -0
  133. package/dist/routes/published-cache/index.js +33 -0
  134. package/dist/routes/published-cache/index.js.map +1 -0
  135. package/dist/routes/sync/contract.d.ts +33 -0
  136. package/dist/routes/sync/contract.d.ts.map +1 -0
  137. package/dist/routes/sync/contract.js +34 -0
  138. package/dist/routes/sync/contract.js.map +1 -0
  139. package/dist/routes/sync/index.d.ts +13 -0
  140. package/dist/routes/sync/index.d.ts.map +1 -0
  141. package/dist/routes/sync/index.js +241 -0
  142. package/dist/routes/sync/index.js.map +1 -0
  143. package/dist/routes/values/[labelId]/[version]/contract.d.ts +29 -0
  144. package/dist/routes/values/[labelId]/[version]/contract.d.ts.map +1 -0
  145. package/dist/routes/values/[labelId]/[version]/contract.js +33 -0
  146. package/dist/routes/values/[labelId]/[version]/contract.js.map +1 -0
  147. package/dist/routes/values/[labelId]/[version]/index.d.ts +8 -0
  148. package/dist/routes/values/[labelId]/[version]/index.d.ts.map +1 -0
  149. package/dist/routes/values/[labelId]/[version]/index.js +45 -0
  150. package/dist/routes/values/[labelId]/[version]/index.js.map +1 -0
  151. package/dist/routes/values/[labelId]/contract.d.ts +38 -0
  152. package/dist/routes/values/[labelId]/contract.d.ts.map +1 -0
  153. package/dist/routes/values/[labelId]/contract.js +59 -0
  154. package/dist/routes/values/[labelId]/contract.js.map +1 -0
  155. package/dist/routes/values/[labelId]/index.d.ts +8 -0
  156. package/dist/routes/values/[labelId]/index.d.ts.map +1 -0
  157. package/dist/routes/values/[labelId]/index.js +42 -0
  158. package/dist/routes/values/[labelId]/index.js.map +1 -0
  159. package/dist/server.d.ts +99 -0
  160. package/dist/server.d.ts.map +1 -0
  161. package/dist/server.js +256 -0
  162. package/dist/server.js.map +1 -0
  163. package/dist/store.d.ts +87 -0
  164. package/dist/store.d.ts.map +1 -0
  165. package/dist/store.js +205 -0
  166. package/dist/store.js.map +1 -0
  167. package/dist/sync.d.ts +11 -0
  168. package/dist/sync.d.ts.map +1 -0
  169. package/dist/sync.js +179 -0
  170. package/dist/sync.js.map +1 -0
  171. package/dist/types.d.ts +74 -0
  172. package/dist/types.d.ts.map +1 -0
  173. package/dist/types.js +7 -0
  174. package/dist/types.js.map +1 -0
  175. package/package.json +95 -0
package/dist/server.js ADDED
@@ -0,0 +1,256 @@
1
+ import "server-only";
2
+ /**
3
+ * CMS Server Module
4
+ *
5
+ * Next.js 서버 컴포넌트용 CMS 유틸리티
6
+ * - React cache를 사용한 데이터 중복 제거
7
+ * - SPFN API를 통한 contract-based 호출
8
+ * - 변수 치환 지원
9
+ * - 쿠키 기반 locale 자동 관리
10
+ */
11
+ import { cache } from 'react';
12
+ import { client } from '@spfn/core/client';
13
+ import { getPublishedCacheContract } from './routes/published-cache/contract.js';
14
+ import { getLocale } from './helpers/locale.actions.js';
15
+ /**
16
+ * 변수 치환 헬퍼
17
+ *
18
+ * @param text - 치환할 텍스트 (예: 'Hello {name}!')
19
+ * @param replace - 치환 맵 (예: { name: 'World' })
20
+ * @returns 치환된 텍스트 (예: 'Hello World!')
21
+ */
22
+ function replaceVariables(text, replace) {
23
+ return text.replace(/\{(\w+)}/g, (match, key) => {
24
+ const value = replace[key];
25
+ return value !== undefined ? String(value) : match;
26
+ });
27
+ }
28
+ /**
29
+ * 섹션 데이터 로드 (React cache 적용)
30
+ *
31
+ * 동일한 요청 내에서 같은 섹션을 여러 번 요청해도 한 번만 API 호출
32
+ *
33
+ * @param section - 섹션 이름 (예: 'home', 'why-futureplay')
34
+ * @param locale - 언어 코드 (선택, 미지정시 쿠키에서 자동 조회)
35
+ * @returns Section API ({ t, data })
36
+ *
37
+ * @example
38
+ * ```tsx
39
+ * // Server Component
40
+ * import { getSection } from '@spfn/cms/server';
41
+ *
42
+ * export default async function HomePage()
43
+ * {
44
+ * // locale을 지정하지 않으면 쿠키에서 자동으로 가져옴
45
+ * const { t } = await getSection('home');
46
+ *
47
+ * // 또는 명시적으로 locale 지정
48
+ * const { t: tEn } = await getSection('home', 'en');
49
+ *
50
+ * return (
51
+ * <div>
52
+ * <h1>{t('hero.title')}</h1>
53
+ * <p>{t('hero.subtitle', 'Default Subtitle')}</p>
54
+ * <p>{t('hero.greeting', 'Hello {name}!', { name: 'World' })}</p>
55
+ * </div>
56
+ * );
57
+ * }
58
+ * ```
59
+ */
60
+ export const getSection = cache(async (section, locale) => {
61
+ // locale이 지정되지 않으면 쿠키에서 가져옴
62
+ const actualLocale = locale ?? await getLocale();
63
+ try {
64
+ // Call SPFN API via contract (uses singleton client)
65
+ const response = await client.call('/cms/published-cache', getPublishedCacheContract, {
66
+ query: { sections: section, locale: actualLocale },
67
+ });
68
+ // Check if response has error
69
+ if ('error' in response) {
70
+ console.warn(`[CMS] ${response.error}`);
71
+ // Return empty section data
72
+ const sectionData = {
73
+ section,
74
+ locale: actualLocale,
75
+ content: {},
76
+ version: 0,
77
+ publishedAt: null,
78
+ };
79
+ const t = (_key, defaultValue) => defaultValue;
80
+ return { t, data: sectionData };
81
+ }
82
+ // Response is an array, get first element
83
+ const found = response[0];
84
+ if (!found) {
85
+ // Section not found, return empty
86
+ const sectionData = {
87
+ section,
88
+ locale: actualLocale,
89
+ content: {},
90
+ version: 0,
91
+ publishedAt: null,
92
+ };
93
+ const t = (_key, defaultValue) => defaultValue;
94
+ return { t, data: sectionData };
95
+ }
96
+ // Success response
97
+ const sectionData = {
98
+ section: found.section,
99
+ locale: found.locale,
100
+ content: found.content || {},
101
+ version: found.version,
102
+ publishedAt: found.publishedAt,
103
+ };
104
+ // Translation function
105
+ const t = (key, defaultValue, replace) => {
106
+ const fullKey = `${section}.${key}`;
107
+ let value = sectionData.content[fullKey];
108
+ if (value === undefined) {
109
+ value = defaultValue;
110
+ }
111
+ // 문자열이고 치환 맵이 있으면 변수 치환
112
+ if (typeof value === 'string' && replace) {
113
+ value = replaceVariables(value, replace);
114
+ }
115
+ return value;
116
+ };
117
+ return {
118
+ t,
119
+ data: sectionData,
120
+ };
121
+ }
122
+ catch (error) {
123
+ console.error(`[CMS] Failed to fetch section "${section}":`, error);
124
+ // Return empty section data on error
125
+ const sectionData = {
126
+ section,
127
+ locale: actualLocale,
128
+ content: {},
129
+ version: 0,
130
+ publishedAt: null,
131
+ };
132
+ const t = (key, defaultValue) => defaultValue;
133
+ return { t, data: sectionData };
134
+ }
135
+ });
136
+ /**
137
+ * 여러 섹션 한번에 로드 (React cache 적용)
138
+ * 단일 API 호출로 여러 섹션을 효율적으로 가져옵니다
139
+ *
140
+ * @param sections - 섹션 이름 배열
141
+ * @param locale - 언어 코드 (선택, 미지정시 쿠키에서 자동 조회)
142
+ * @returns Section API 맵 ({ home: { t, data }, ... })
143
+ *
144
+ * @example
145
+ * ```tsx
146
+ * // Server Component
147
+ * import { getSections } from '@spfn/cms/server';
148
+ *
149
+ * export default async function Page()
150
+ * {
151
+ * // locale을 지정하지 않으면 쿠키에서 자동으로 가져옴
152
+ * const sections = await getSections(['home', 'why-futureplay']);
153
+ *
154
+ * // 또는 명시적으로 locale 지정
155
+ * const sectionsEn = await getSections(['home', 'why-futureplay'], 'en');
156
+ *
157
+ * return (
158
+ * <div>
159
+ * <h1>{sections.home.t('hero.title')}</h1>
160
+ * <p>{sections['why-futureplay'].t('intro.text')}</p>
161
+ * </div>
162
+ * );
163
+ * }
164
+ * ```
165
+ */
166
+ export const getSections = cache(async (sections, locale) => {
167
+ // locale이 지정되지 않으면 쿠키에서 가져옴
168
+ const actualLocale = locale ?? await getLocale();
169
+ try {
170
+ // Call SPFN API with array of sections (single HTTP request)
171
+ const response = await client.call('/cms/published-cache', getPublishedCacheContract, {
172
+ query: { sections, locale: actualLocale },
173
+ });
174
+ // Check if response has error
175
+ if ('error' in response) {
176
+ console.warn(`[CMS] ${response.error}`);
177
+ // Return empty sections
178
+ const sectionsMap = {};
179
+ sections.forEach(section => {
180
+ sectionsMap[section] = {
181
+ t: (_key, defaultValue) => defaultValue,
182
+ data: {
183
+ section,
184
+ locale: actualLocale,
185
+ content: {},
186
+ version: 0,
187
+ publishedAt: null,
188
+ }
189
+ };
190
+ });
191
+ return sectionsMap;
192
+ }
193
+ // Build sections map from response
194
+ const sectionsMap = {};
195
+ // First, create empty entries for all requested sections
196
+ sections.forEach(section => {
197
+ sectionsMap[section] = {
198
+ t: (_key, defaultValue) => defaultValue,
199
+ data: {
200
+ section,
201
+ locale: actualLocale,
202
+ content: {},
203
+ version: 0,
204
+ publishedAt: null,
205
+ }
206
+ };
207
+ });
208
+ // Then, fill in data for found sections
209
+ response.forEach(sectionData => {
210
+ const createTranslationFn = (section, content) => {
211
+ return (key, defaultValue, replace) => {
212
+ const fullKey = `${section}.${key}`;
213
+ let value = content[fullKey];
214
+ if (value === undefined) {
215
+ value = defaultValue;
216
+ }
217
+ // 문자열이고 치환 맵이 있으면 변수 치환
218
+ if (typeof value === 'string' && replace) {
219
+ value = replaceVariables(value, replace);
220
+ }
221
+ return value;
222
+ };
223
+ };
224
+ sectionsMap[sectionData.section] = {
225
+ t: createTranslationFn(sectionData.section, sectionData.content),
226
+ data: {
227
+ section: sectionData.section,
228
+ locale: sectionData.locale,
229
+ content: sectionData.content,
230
+ version: sectionData.version,
231
+ publishedAt: sectionData.publishedAt,
232
+ }
233
+ };
234
+ });
235
+ return sectionsMap;
236
+ }
237
+ catch (error) {
238
+ console.error(`[CMS] Failed to fetch sections:`, error);
239
+ // Return empty sections on error
240
+ const sectionsMap = {};
241
+ sections.forEach(section => {
242
+ sectionsMap[section] = {
243
+ t: (_key, defaultValue) => defaultValue,
244
+ data: {
245
+ section,
246
+ locale: actualLocale,
247
+ content: {},
248
+ version: 0,
249
+ publishedAt: null,
250
+ }
251
+ };
252
+ });
253
+ return sectionsMap;
254
+ }
255
+ });
256
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * CMS Zustand Store
3
+ *
4
+ * 클라이언트 컴포넌트에서 CMS 사용을 위한 상태 관리
5
+ * - 서버에서 초기화된 데이터를 클라이언트로 전달
6
+ * - 클라이언트에서 비동기로 로드 가능
7
+ * - 서버 API와 동일한 패턴 ({ t } 사용)
8
+ */
9
+ import type { SectionData } from './server';
10
+ interface CmsState {
11
+ /**
12
+ * 섹션별 데이터
13
+ * { 'home': { section: 'home', content: {...}, version: 1, ... }, ... }
14
+ */
15
+ sections: Record<string, SectionData>;
16
+ /**
17
+ * 로딩 상태
18
+ */
19
+ loading: Record<string, boolean>;
20
+ /**
21
+ * 섹션 데이터 설정 (서버에서 초기화용)
22
+ */
23
+ setSection: (section: string, data: SectionData) => void;
24
+ /**
25
+ * 여러 섹션 한번에 설정
26
+ */
27
+ setSections: (sections: Record<string, SectionData>) => void;
28
+ /**
29
+ * 섹션 비동기 로드
30
+ */
31
+ loadSection: (section: string, locale?: string) => Promise<void>;
32
+ /**
33
+ * 라벨 업데이트 (Draft Mode용)
34
+ */
35
+ updateLabel: (section: string, key: string, value: any) => void;
36
+ /**
37
+ * 초기화
38
+ */
39
+ reset: () => void;
40
+ }
41
+ export declare const useCmsStore: import("zustand").UseBoundStore<import("zustand").StoreApi<CmsState>>;
42
+ /**
43
+ * 섹션 Hook (서버 API와 동일한 패턴)
44
+ *
45
+ * @param section - 섹션 이름
46
+ * @param options - 옵션 (autoLoad: 자동 로드 여부)
47
+ * @returns { t, data, loading }
48
+ *
49
+ * @example
50
+ * ```tsx
51
+ * 'use client';
52
+ * import { useSection } from '@/lib/cms';
53
+ *
54
+ * export function ClientComponent()
55
+ * {
56
+ * const { t } = useSection('home');
57
+ * return <h1>{t('hero.title')}</h1>;
58
+ * }
59
+ * ```
60
+ */
61
+ export declare function useSection(section: string, options?: {
62
+ autoLoad?: boolean;
63
+ locale?: string;
64
+ }): {
65
+ t: (key: string, defaultValue?: any, replace?: Record<string, string | number>) => any;
66
+ data: SectionData;
67
+ loading: boolean;
68
+ };
69
+ /**
70
+ * 여러 섹션 Hook
71
+ *
72
+ * @param sectionNames - 섹션 이름 배열
73
+ * @returns { [section]: { t, data, loading }, ... }
74
+ *
75
+ * @example
76
+ * ```tsx
77
+ * const sections = useSections(['home', 'why-futureplay']);
78
+ * sections.home.t('hero.title');
79
+ * ```
80
+ */
81
+ export declare function useSections(sectionNames: string[]): Record<string, {
82
+ t: (key: string, defaultValue?: any, replace?: Record<string, string | number>) => any;
83
+ data: SectionData;
84
+ loading: boolean;
85
+ }>;
86
+ export {};
87
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAc5C,UAAU,QAAQ;IAEd;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEtC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjC;;OAEG;IACH,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAEzD;;OAEG;IACH,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,IAAI,CAAC;IAE7D;;OAEG;IACH,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE;;OAEG;IACH,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAEhE;;OAEG;IACH,KAAK,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,WAAW,uEAkHrB,CAAC;AAEJ;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CACtB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO;aAoB3C,MAAM,iBAAiB,GAAG,YAAY,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;;;EA+BlF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE;aA7CpC,MAAM,iBAAiB,GAAG,YAAY,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;;;GAwFlF"}
package/dist/store.js ADDED
@@ -0,0 +1,205 @@
1
+ /**
2
+ * CMS Zustand Store
3
+ *
4
+ * 클라이언트 컴포넌트에서 CMS 사용을 위한 상태 관리
5
+ * - 서버에서 초기화된 데이터를 클라이언트로 전달
6
+ * - 클라이언트에서 비동기로 로드 가능
7
+ * - 서버 API와 동일한 패턴 ({ t } 사용)
8
+ */
9
+ 'use client';
10
+ import React from 'react';
11
+ import { create } from 'zustand';
12
+ import { cmsApi } from './client';
13
+ /**
14
+ * 변수 치환 헬퍼 (서버와 동일)
15
+ */
16
+ function replaceVariables(text, replace) {
17
+ return text.replace(/\{(\w+)}/g, (match, key) => {
18
+ const value = replace[key];
19
+ return value !== undefined ? String(value) : match;
20
+ });
21
+ }
22
+ export const useCmsStore = create((set, get) => ({
23
+ sections: {},
24
+ loading: {},
25
+ setSection: (section, data) => {
26
+ set((state) => ({
27
+ sections: {
28
+ ...state.sections,
29
+ [section]: data,
30
+ },
31
+ }));
32
+ },
33
+ setSections: (sections) => {
34
+ set((state) => ({
35
+ sections: {
36
+ ...state.sections,
37
+ ...sections,
38
+ },
39
+ }));
40
+ },
41
+ loadSection: async (section, locale = 'ko') => {
42
+ const state = get();
43
+ // 이미 로드 중이면 스킵
44
+ if (state.loading[section]) {
45
+ return;
46
+ }
47
+ // 이미 로드되어 있으면 스킵
48
+ if (state.sections[section]) {
49
+ return;
50
+ }
51
+ set((state) => ({
52
+ loading: { ...state.loading, [section]: true },
53
+ }));
54
+ try {
55
+ const response = await cmsApi.publishedCache.get({
56
+ query: { sections: section, locale },
57
+ });
58
+ // Check for error response
59
+ if ('error' in response) {
60
+ console.error(`Failed to load section ${section}:`, response.error);
61
+ return;
62
+ }
63
+ // Response is array, get first element
64
+ const data = response[0];
65
+ if (!data) {
66
+ console.warn(`Section ${section} not found`);
67
+ return;
68
+ }
69
+ const sectionData = {
70
+ section: data.section,
71
+ locale: data.locale,
72
+ content: data.content || {},
73
+ version: data.version || 0,
74
+ publishedAt: data.publishedAt || null,
75
+ };
76
+ set((state) => ({
77
+ sections: {
78
+ ...state.sections,
79
+ [section]: sectionData,
80
+ },
81
+ loading: { ...state.loading, [section]: false },
82
+ }));
83
+ }
84
+ catch (error) {
85
+ console.error(`Error loading CMS section ${section}:`, error);
86
+ set((state) => ({
87
+ loading: { ...state.loading, [section]: false },
88
+ }));
89
+ }
90
+ },
91
+ updateLabel: (section, key, value) => {
92
+ set((state) => ({
93
+ sections: {
94
+ ...state.sections,
95
+ [section]: {
96
+ ...state.sections[section],
97
+ content: {
98
+ ...state.sections[section]?.content,
99
+ [`${section}.${key}`]: value,
100
+ },
101
+ },
102
+ },
103
+ }));
104
+ },
105
+ reset: () => {
106
+ set({
107
+ sections: {},
108
+ loading: {},
109
+ });
110
+ },
111
+ }));
112
+ /**
113
+ * 섹션 Hook (서버 API와 동일한 패턴)
114
+ *
115
+ * @param section - 섹션 이름
116
+ * @param options - 옵션 (autoLoad: 자동 로드 여부)
117
+ * @returns { t, data, loading }
118
+ *
119
+ * @example
120
+ * ```tsx
121
+ * 'use client';
122
+ * import { useSection } from '@/lib/cms';
123
+ *
124
+ * export function ClientComponent()
125
+ * {
126
+ * const { t } = useSection('home');
127
+ * return <h1>{t('hero.title')}</h1>;
128
+ * }
129
+ * ```
130
+ */
131
+ export function useSection(section, options = {}) {
132
+ const { autoLoad = false, locale = 'ko' } = options;
133
+ const sectionData = useCmsStore((state) => state.sections[section]);
134
+ const loading = useCmsStore((state) => state.loading[section] ?? false);
135
+ const loadSection = useCmsStore((state) => state.loadSection);
136
+ // 자동 로드 옵션이 켜져있고 데이터가 없으면 로드
137
+ React.useEffect(() => {
138
+ if (autoLoad && !sectionData && !loading) {
139
+ loadSection(section, locale);
140
+ }
141
+ }, [autoLoad, section, locale, sectionData, loading, loadSection]);
142
+ // Translation function (서버와 동일)
143
+ const t = React.useCallback((key, defaultValue, replace) => {
144
+ if (!sectionData) {
145
+ return defaultValue;
146
+ }
147
+ const fullKey = `${section}.${key}`;
148
+ let value = sectionData.content[fullKey];
149
+ if (value === undefined) {
150
+ value = defaultValue;
151
+ }
152
+ // 문자열이고 치환 맵이 있으면 변수 치환
153
+ if (typeof value === 'string' && replace) {
154
+ value = replaceVariables(value, replace);
155
+ }
156
+ return value;
157
+ }, [section, sectionData]);
158
+ return {
159
+ t,
160
+ data: sectionData,
161
+ loading,
162
+ };
163
+ }
164
+ /**
165
+ * 여러 섹션 Hook
166
+ *
167
+ * @param sectionNames - 섹션 이름 배열
168
+ * @returns { [section]: { t, data, loading }, ... }
169
+ *
170
+ * @example
171
+ * ```tsx
172
+ * const sections = useSections(['home', 'why-futureplay']);
173
+ * sections.home.t('hero.title');
174
+ * ```
175
+ */
176
+ export function useSections(sectionNames) {
177
+ const allSections = useCmsStore((state) => state.sections);
178
+ const allLoading = useCmsStore((state) => state.loading);
179
+ const result = {};
180
+ sectionNames.forEach((section) => {
181
+ const sectionData = allSections[section];
182
+ const loading = allLoading[section] ?? false;
183
+ const t = (key, defaultValue, replace) => {
184
+ if (!sectionData) {
185
+ return defaultValue;
186
+ }
187
+ const fullKey = `${section}.${key}`;
188
+ let value = sectionData.content[fullKey];
189
+ if (value === undefined) {
190
+ value = defaultValue;
191
+ }
192
+ if (typeof value === 'string' && replace) {
193
+ value = replaceVariables(value, replace);
194
+ }
195
+ return value;
196
+ };
197
+ result[section] = {
198
+ t,
199
+ data: sectionData,
200
+ loading,
201
+ };
202
+ });
203
+ return result;
204
+ }
205
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
package/dist/sync.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * CMS Sync Utilities
3
+ *
4
+ * 라벨 동기화를 위한 헬퍼 함수들
5
+ */
6
+ import type { SectionDefinition, SyncOptions, SyncResult } from './types';
7
+ /**
8
+ * 섹션 라벨 동기화
9
+ */
10
+ export declare function syncSection(definition: SectionDefinition, options?: SyncOptions): Promise<SyncResult>;
11
+ //# sourceMappingURL=sync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../src/sync.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAG1E;;GAEG;AACH,wBAAsB,WAAW,CAC7B,UAAU,EAAE,iBAAiB,EAC7B,OAAO,GAAE,WAAgB,GAC1B,OAAO,CAAC,UAAU,CAAC,CAoKrB"}