@spfn/cms 0.1.0-alpha.8 → 0.1.0-alpha.81

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 (233) hide show
  1. package/README.md +28 -416
  2. package/dist/{helpers/locale.actions.d.ts → actions-BEFWwQsh.d.ts} +70 -7
  3. package/dist/actions.d.ts +2 -9
  4. package/dist/actions.js +99 -10
  5. package/dist/actions.js.map +1 -1
  6. package/dist/api.d.ts +319 -0
  7. package/dist/api.js +467 -0
  8. package/dist/api.js.map +1 -0
  9. package/dist/client.d.ts +135 -127
  10. package/dist/client.js +1318 -59
  11. package/dist/client.js.map +1 -1
  12. package/dist/{types.d.ts → index-Dh5FjWzR.d.ts} +45 -7
  13. package/dist/index.d.ts +112 -16
  14. package/dist/index.js +625 -23
  15. package/dist/index.js.map +1 -1
  16. package/dist/label-sync-generator-B0EmvtWM.d.ts +32 -0
  17. package/dist/lib/contracts/labels.d.ts +244 -0
  18. package/dist/lib/contracts/labels.js +269 -0
  19. package/dist/lib/contracts/labels.js.map +1 -0
  20. package/dist/lib/contracts/published-cache.d.ts +48 -0
  21. package/dist/lib/contracts/published-cache.js +49 -0
  22. package/dist/lib/contracts/published-cache.js.map +1 -0
  23. package/dist/lib/contracts/values.d.ts +71 -0
  24. package/dist/lib/contracts/values.js +104 -0
  25. package/dist/lib/contracts/values.js.map +1 -0
  26. package/dist/locale.constants-BNkSdNP1.d.ts +108 -0
  27. package/dist/{entities → server/entities}/cms-audit-logs.d.ts +15 -70
  28. package/dist/server/entities/cms-audit-logs.js +78 -0
  29. package/dist/server/entities/cms-audit-logs.js.map +1 -0
  30. package/dist/{entities → server/entities}/cms-draft-cache.d.ts +13 -73
  31. package/dist/server/entities/cms-draft-cache.js +38 -0
  32. package/dist/server/entities/cms-draft-cache.js.map +1 -0
  33. package/dist/{entities → server/entities}/cms-label-values.d.ts +16 -67
  34. package/dist/server/entities/cms-label-values.js +81 -0
  35. package/dist/server/entities/cms-label-values.js.map +1 -0
  36. package/dist/{entities → server/entities}/cms-labels.d.ts +17 -14
  37. package/dist/server/entities/cms-labels.js +42 -0
  38. package/dist/server/entities/cms-labels.js.map +1 -0
  39. package/dist/{entities → server/entities}/cms-published-cache.d.ts +14 -69
  40. package/dist/server/entities/cms-published-cache.js +36 -0
  41. package/dist/server/entities/cms-published-cache.js.map +1 -0
  42. package/dist/server/entities/index.d.ts +6 -0
  43. package/dist/server/entities/index.js +185 -0
  44. package/dist/server/entities/index.js.map +1 -0
  45. package/dist/server/generators/index.d.ts +19 -0
  46. package/dist/server/generators/index.js +731 -0
  47. package/dist/server/generators/index.js.map +1 -0
  48. package/dist/server/labels/index.d.ts +1 -0
  49. package/dist/server/labels/index.js +33 -0
  50. package/dist/server/labels/index.js.map +1 -0
  51. package/dist/server/repositories/index.d.ts +212 -0
  52. package/dist/server/repositories/index.js +418 -0
  53. package/dist/server/repositories/index.js.map +1 -0
  54. package/dist/server/routes/labels/[id]/admin/index.js +679 -0
  55. package/dist/server/routes/labels/[id]/admin/index.js.map +1 -0
  56. package/dist/server/routes/labels/[id]/index.js +576 -0
  57. package/dist/server/routes/labels/[id]/index.js.map +1 -0
  58. package/dist/server/routes/labels/[id]/publish/index.js +720 -0
  59. package/dist/server/routes/labels/[id]/publish/index.js.map +1 -0
  60. package/dist/server/routes/labels/[id]/versions/index.js +548 -0
  61. package/dist/server/routes/labels/[id]/versions/index.js.map +1 -0
  62. package/dist/server/routes/labels/_id_/admin/index.d.ts +11 -0
  63. package/dist/{routes/labels/[id] → server/routes/labels/_id_}/index.d.ts +5 -3
  64. package/dist/server/routes/labels/_id_/publish/index.d.ts +11 -0
  65. package/dist/server/routes/labels/_id_/versions/index.d.ts +11 -0
  66. package/dist/server/routes/labels/by-key/[key]/index.js +525 -0
  67. package/dist/server/routes/labels/by-key/[key]/index.js.map +1 -0
  68. package/dist/server/routes/labels/by-key/_key_/index.d.ts +10 -0
  69. package/dist/server/routes/labels/index.d.ts +12 -0
  70. package/dist/server/routes/labels/index.js +684 -0
  71. package/dist/server/routes/labels/index.js.map +1 -0
  72. package/dist/server/routes/published-cache/index.d.ts +11 -0
  73. package/dist/server/routes/published-cache/index.js +337 -0
  74. package/dist/server/routes/published-cache/index.js.map +1 -0
  75. package/dist/server/routes/values/[labelId]/[version]/index.js +457 -0
  76. package/dist/server/routes/values/[labelId]/[version]/index.js.map +1 -0
  77. package/dist/server/routes/values/[labelId]/index.js +452 -0
  78. package/dist/server/routes/values/[labelId]/index.js.map +1 -0
  79. package/dist/server/routes/values/_labelId_/_version_/index.d.ts +10 -0
  80. package/dist/server/routes/values/_labelId_/index.d.ts +10 -0
  81. package/dist/server.d.ts +77 -7
  82. package/dist/server.js +1747 -247
  83. package/dist/server.js.map +1 -1
  84. package/migrations/0000_init.sql +3 -0
  85. package/migrations/0001_far_lady_vermin.sql +86 -0
  86. package/migrations/0002_heavy_the_enforcers.sql +2 -0
  87. package/migrations/0003_rare_runaways.sql +1 -0
  88. package/migrations/meta/0000_snapshot.json +15 -0
  89. package/migrations/meta/0001_snapshot.json +687 -0
  90. package/migrations/meta/0002_snapshot.json +686 -0
  91. package/migrations/meta/0003_snapshot.json +563 -0
  92. package/migrations/meta/_journal.json +34 -0
  93. package/package.json +55 -36
  94. package/dist/actions.d.ts.map +0 -1
  95. package/dist/client.d.ts.map +0 -1
  96. package/dist/cms.config.d.ts +0 -77
  97. package/dist/cms.config.d.ts.map +0 -1
  98. package/dist/cms.config.js +0 -111
  99. package/dist/cms.config.js.map +0 -1
  100. package/dist/entities/cms-audit-logs.d.ts.map +0 -1
  101. package/dist/entities/cms-audit-logs.js +0 -103
  102. package/dist/entities/cms-audit-logs.js.map +0 -1
  103. package/dist/entities/cms-draft-cache.d.ts.map +0 -1
  104. package/dist/entities/cms-draft-cache.js +0 -112
  105. package/dist/entities/cms-draft-cache.js.map +0 -1
  106. package/dist/entities/cms-label-values.d.ts.map +0 -1
  107. package/dist/entities/cms-label-values.js +0 -105
  108. package/dist/entities/cms-label-values.js.map +0 -1
  109. package/dist/entities/cms-label-versions.d.ts +0 -207
  110. package/dist/entities/cms-label-versions.d.ts.map +0 -1
  111. package/dist/entities/cms-label-versions.js +0 -80
  112. package/dist/entities/cms-label-versions.js.map +0 -1
  113. package/dist/entities/cms-labels.d.ts.map +0 -1
  114. package/dist/entities/cms-labels.js +0 -48
  115. package/dist/entities/cms-labels.js.map +0 -1
  116. package/dist/entities/cms-published-cache.d.ts.map +0 -1
  117. package/dist/entities/cms-published-cache.js +0 -103
  118. package/dist/entities/cms-published-cache.js.map +0 -1
  119. package/dist/entities/index.d.ts +0 -10
  120. package/dist/entities/index.d.ts.map +0 -1
  121. package/dist/entities/index.js +0 -10
  122. package/dist/entities/index.js.map +0 -1
  123. package/dist/generators/index.d.ts +0 -19
  124. package/dist/generators/index.d.ts.map +0 -1
  125. package/dist/generators/index.js +0 -19
  126. package/dist/generators/index.js.map +0 -1
  127. package/dist/generators/label-sync-generator.d.ts +0 -33
  128. package/dist/generators/label-sync-generator.d.ts.map +0 -1
  129. package/dist/generators/label-sync-generator.js +0 -86
  130. package/dist/generators/label-sync-generator.js.map +0 -1
  131. package/dist/helpers/locale.actions.d.ts.map +0 -1
  132. package/dist/helpers/locale.actions.js +0 -210
  133. package/dist/helpers/locale.actions.js.map +0 -1
  134. package/dist/helpers/locale.constants.d.ts +0 -10
  135. package/dist/helpers/locale.constants.d.ts.map +0 -1
  136. package/dist/helpers/locale.constants.js +0 -10
  137. package/dist/helpers/locale.constants.js.map +0 -1
  138. package/dist/helpers/locale.d.ts +0 -17
  139. package/dist/helpers/locale.d.ts.map +0 -1
  140. package/dist/helpers/locale.js +0 -20
  141. package/dist/helpers/locale.js.map +0 -1
  142. package/dist/helpers/sync.d.ts +0 -41
  143. package/dist/helpers/sync.d.ts.map +0 -1
  144. package/dist/helpers/sync.js +0 -309
  145. package/dist/helpers/sync.js.map +0 -1
  146. package/dist/index.d.ts.map +0 -1
  147. package/dist/init.d.ts +0 -31
  148. package/dist/init.d.ts.map +0 -1
  149. package/dist/init.js +0 -36
  150. package/dist/init.js.map +0 -1
  151. package/dist/labels/helpers.d.ts +0 -31
  152. package/dist/labels/helpers.d.ts.map +0 -1
  153. package/dist/labels/helpers.js +0 -60
  154. package/dist/labels/helpers.js.map +0 -1
  155. package/dist/labels/index.d.ts +0 -7
  156. package/dist/labels/index.d.ts.map +0 -1
  157. package/dist/labels/index.js +0 -7
  158. package/dist/labels/index.js.map +0 -1
  159. package/dist/repositories/cms-draft-cache.repository.d.ts +0 -62
  160. package/dist/repositories/cms-draft-cache.repository.d.ts.map +0 -1
  161. package/dist/repositories/cms-draft-cache.repository.js +0 -56
  162. package/dist/repositories/cms-draft-cache.repository.js.map +0 -1
  163. package/dist/repositories/cms-label-values.repository.d.ts +0 -32
  164. package/dist/repositories/cms-label-values.repository.d.ts.map +0 -1
  165. package/dist/repositories/cms-label-values.repository.js +0 -72
  166. package/dist/repositories/cms-label-values.repository.js.map +0 -1
  167. package/dist/repositories/cms-labels.repository.d.ts +0 -53
  168. package/dist/repositories/cms-labels.repository.d.ts.map +0 -1
  169. package/dist/repositories/cms-labels.repository.js +0 -77
  170. package/dist/repositories/cms-labels.repository.js.map +0 -1
  171. package/dist/repositories/cms-published-cache.repository.d.ts +0 -53
  172. package/dist/repositories/cms-published-cache.repository.d.ts.map +0 -1
  173. package/dist/repositories/cms-published-cache.repository.js +0 -54
  174. package/dist/repositories/cms-published-cache.repository.js.map +0 -1
  175. package/dist/repositories/index.d.ts +0 -8
  176. package/dist/repositories/index.d.ts.map +0 -1
  177. package/dist/repositories/index.js +0 -9
  178. package/dist/repositories/index.js.map +0 -1
  179. package/dist/routes/labels/[id]/contract.d.ts +0 -68
  180. package/dist/routes/labels/[id]/contract.d.ts.map +0 -1
  181. package/dist/routes/labels/[id]/contract.js +0 -84
  182. package/dist/routes/labels/[id]/contract.js.map +0 -1
  183. package/dist/routes/labels/[id]/index.d.ts.map +0 -1
  184. package/dist/routes/labels/[id]/index.js +0 -96
  185. package/dist/routes/labels/[id]/index.js.map +0 -1
  186. package/dist/routes/labels/by-key/[key]/contract.d.ts +0 -24
  187. package/dist/routes/labels/by-key/[key]/contract.d.ts.map +0 -1
  188. package/dist/routes/labels/by-key/[key]/contract.js +0 -28
  189. package/dist/routes/labels/by-key/[key]/contract.js.map +0 -1
  190. package/dist/routes/labels/by-key/[key]/index.d.ts +0 -8
  191. package/dist/routes/labels/by-key/[key]/index.d.ts.map +0 -1
  192. package/dist/routes/labels/by-key/[key]/index.js +0 -32
  193. package/dist/routes/labels/by-key/[key]/index.js.map +0 -1
  194. package/dist/routes/labels/contract.d.ts +0 -59
  195. package/dist/routes/labels/contract.d.ts.map +0 -1
  196. package/dist/routes/labels/contract.js +0 -75
  197. package/dist/routes/labels/contract.js.map +0 -1
  198. package/dist/routes/labels/index.d.ts +0 -10
  199. package/dist/routes/labels/index.d.ts.map +0 -1
  200. package/dist/routes/labels/index.js +0 -73
  201. package/dist/routes/labels/index.js.map +0 -1
  202. package/dist/routes/published-cache/contract.d.ts +0 -25
  203. package/dist/routes/published-cache/contract.d.ts.map +0 -1
  204. package/dist/routes/published-cache/contract.js +0 -35
  205. package/dist/routes/published-cache/contract.js.map +0 -1
  206. package/dist/routes/published-cache/index.d.ts +0 -8
  207. package/dist/routes/published-cache/index.d.ts.map +0 -1
  208. package/dist/routes/published-cache/index.js +0 -33
  209. package/dist/routes/published-cache/index.js.map +0 -1
  210. package/dist/routes/values/[labelId]/[version]/contract.d.ts +0 -29
  211. package/dist/routes/values/[labelId]/[version]/contract.d.ts.map +0 -1
  212. package/dist/routes/values/[labelId]/[version]/contract.js +0 -33
  213. package/dist/routes/values/[labelId]/[version]/contract.js.map +0 -1
  214. package/dist/routes/values/[labelId]/[version]/index.d.ts +0 -8
  215. package/dist/routes/values/[labelId]/[version]/index.d.ts.map +0 -1
  216. package/dist/routes/values/[labelId]/[version]/index.js +0 -45
  217. package/dist/routes/values/[labelId]/[version]/index.js.map +0 -1
  218. package/dist/routes/values/[labelId]/contract.d.ts +0 -38
  219. package/dist/routes/values/[labelId]/contract.d.ts.map +0 -1
  220. package/dist/routes/values/[labelId]/contract.js +0 -59
  221. package/dist/routes/values/[labelId]/contract.js.map +0 -1
  222. package/dist/routes/values/[labelId]/index.d.ts +0 -8
  223. package/dist/routes/values/[labelId]/index.d.ts.map +0 -1
  224. package/dist/routes/values/[labelId]/index.js +0 -42
  225. package/dist/routes/values/[labelId]/index.js.map +0 -1
  226. package/dist/server.d.ts.map +0 -1
  227. package/dist/store.d.ts +0 -87
  228. package/dist/store.d.ts.map +0 -1
  229. package/dist/store.js +0 -205
  230. package/dist/store.js.map +0 -1
  231. package/dist/types.d.ts.map +0 -1
  232. package/dist/types.js +0 -7
  233. package/dist/types.js.map +0 -1
@@ -1,309 +0,0 @@
1
- /**
2
- * CMS Sync Utilities
3
- *
4
- * JSON 파일 기반 라벨 동기화
5
- */
6
- import { existsSync, readdirSync, readFileSync, statSync } from 'fs';
7
- import { basename, extname, join } from 'path';
8
- import { extractLabels } from '../labels/index.js';
9
- import { cmsLabelsRepository, cmsPublishedCacheRepository } from '../repositories/index.js';
10
- /**
11
- * 여러 섹션 동기화
12
- */
13
- export async function syncAll(sections, options = {}) {
14
- const results = [];
15
- for (const definition of sections) {
16
- const result = await syncSection(definition, options);
17
- results.push(result);
18
- }
19
- return results;
20
- }
21
- /**
22
- * JSON 파일에서 라벨 로드
23
- */
24
- export function loadLabelsFromJson(labelsDir) {
25
- const sections = [];
26
- if (!existsSync(labelsDir)) {
27
- console.warn(`[CMS] Labels directory not found: ${labelsDir}`);
28
- return sections;
29
- }
30
- try {
31
- const entries = readdirSync(labelsDir);
32
- for (const entry of entries) {
33
- const sectionPath = join(labelsDir, entry);
34
- const stat = statSync(sectionPath);
35
- if (stat.isDirectory()) {
36
- const sectionName = entry;
37
- const labels = loadSectionLabels(sectionPath);
38
- if (Object.keys(labels).length > 0) {
39
- sections.push({ section: sectionName, labels });
40
- }
41
- }
42
- }
43
- }
44
- catch (error) {
45
- console.warn(`[CMS] Could not scan labels directory: ${labelsDir}`);
46
- }
47
- return sections;
48
- }
49
- function loadSectionLabels(sectionPath) {
50
- const labels = {};
51
- try {
52
- const files = readdirSync(sectionPath);
53
- for (const file of files) {
54
- if (extname(file) === '.json') {
55
- const filePath = join(sectionPath, file);
56
- const categoryName = basename(file, '.json');
57
- try {
58
- const content = readFileSync(filePath, 'utf-8');
59
- labels[categoryName] = JSON.parse(content);
60
- }
61
- catch (error) {
62
- console.warn(`[CMS] Failed to parse ${filePath}`);
63
- }
64
- }
65
- }
66
- }
67
- catch (error) {
68
- console.warn(`[CMS] Could not read section directory: ${sectionPath}`);
69
- }
70
- return labels;
71
- }
72
- /**
73
- * 섹션 라벨 동기화
74
- */
75
- export async function syncSection(definition, options = {}) {
76
- const { dryRun = false, updateExisting = false, removeUnused = false, verbose = false, } = options;
77
- const { section } = definition;
78
- const result = {
79
- section,
80
- created: 0,
81
- updated: 0,
82
- deleted: 0,
83
- unchanged: 0,
84
- errors: [],
85
- };
86
- try {
87
- const definedLabels = extractLabels(definition);
88
- const definedKeys = new Set(definedLabels.map((l) => l.key));
89
- const existingLabels = await cmsLabelsRepository.findBySection(section);
90
- const existingMap = new Map(existingLabels.map((l) => [l.key, l]));
91
- if (verbose) {
92
- console.log(`\n[${section}] Found ${definedLabels.length} labels in definition`);
93
- console.log(`[${section}] Found ${existingLabels.length} labels in DB`);
94
- }
95
- // 생성 및 업데이트
96
- for (const label of definedLabels) {
97
- const existing = existingMap.get(label.key);
98
- if (!existing) {
99
- if (verbose)
100
- console.log(` [CREATE] ${label.key}`);
101
- if (!dryRun) {
102
- try {
103
- const defaultValue = typeof label.defaultValue === 'object'
104
- ? JSON.stringify(label.defaultValue)
105
- : label.defaultValue;
106
- await cmsLabelsRepository.create({
107
- section,
108
- key: label.key,
109
- type: 'text',
110
- defaultValue,
111
- description: label.description,
112
- });
113
- }
114
- catch (error) {
115
- result.errors.push({
116
- key: label.key,
117
- error: error instanceof Error ? error.message : String(error),
118
- });
119
- continue;
120
- }
121
- }
122
- result.created++;
123
- }
124
- else if (updateExisting) {
125
- const newDefaultValue = typeof label.defaultValue === 'object'
126
- ? JSON.stringify(label.defaultValue)
127
- : label.defaultValue;
128
- const hasChanged = existing.defaultValue !== newDefaultValue;
129
- if (hasChanged) {
130
- if (verbose) {
131
- console.log(` [UPDATE] ${label.key}`);
132
- console.log(` Old: "${existing.defaultValue}"`);
133
- console.log(` New: "${newDefaultValue}"`);
134
- }
135
- if (!dryRun) {
136
- try {
137
- await cmsLabelsRepository.updateById(existing.id, {
138
- defaultValue: newDefaultValue,
139
- description: label.description,
140
- });
141
- }
142
- catch (error) {
143
- result.errors.push({
144
- key: label.key,
145
- error: error instanceof Error ? error.message : String(error),
146
- });
147
- continue;
148
- }
149
- }
150
- result.updated++;
151
- }
152
- else {
153
- result.unchanged++;
154
- }
155
- }
156
- else {
157
- result.unchanged++;
158
- }
159
- }
160
- // 사용되지 않는 라벨 삭제
161
- if (removeUnused) {
162
- for (const existing of existingLabels) {
163
- if (!definedKeys.has(existing.key)) {
164
- if (verbose)
165
- console.log(` [DELETE] ${existing.key}`);
166
- if (!dryRun) {
167
- try {
168
- await cmsLabelsRepository.deleteById(existing.id);
169
- }
170
- catch (error) {
171
- result.errors.push({
172
- key: existing.key,
173
- error: error instanceof Error ? error.message : String(error),
174
- });
175
- continue;
176
- }
177
- }
178
- result.deleted++;
179
- }
180
- }
181
- }
182
- // Published cache 업데이트
183
- if (!dryRun && (result.created > 0 || result.updated > 0 || result.deleted > 0)) {
184
- if (verbose)
185
- console.log(` [CACHE] Updating published cache for section: ${section}`);
186
- await updatePublishedCache(section);
187
- }
188
- }
189
- catch (error) {
190
- result.errors.push({
191
- key: '__section__',
192
- error: error instanceof Error ? error.message : String(error),
193
- });
194
- }
195
- return result;
196
- }
197
- /**
198
- * Published Cache 업데이트
199
- */
200
- async function updatePublishedCache(section) {
201
- const labels = await cmsLabelsRepository.findBySection(section);
202
- const localesSet = new Set();
203
- const labelsByLocale = {};
204
- labels.forEach((label) => {
205
- try {
206
- const parsed = JSON.parse(label.defaultValue || '{}');
207
- if (typeof parsed === 'object' && !Array.isArray(parsed)) {
208
- // Multilingual
209
- Object.keys(parsed).forEach((locale) => localesSet.add(locale));
210
- Object.entries(parsed).forEach(([locale, value]) => {
211
- if (!labelsByLocale[locale])
212
- labelsByLocale[locale] = {};
213
- labelsByLocale[locale][label.key] = value;
214
- });
215
- }
216
- else {
217
- // Single value
218
- if (!labelsByLocale.ko)
219
- labelsByLocale.ko = {};
220
- labelsByLocale.ko[label.key] = label.defaultValue;
221
- localesSet.add('ko');
222
- }
223
- }
224
- catch {
225
- // Plain string
226
- if (!labelsByLocale.ko)
227
- labelsByLocale.ko = {};
228
- labelsByLocale.ko[label.key] = label.defaultValue;
229
- localesSet.add('ko');
230
- }
231
- });
232
- const timestamp = new Date();
233
- for (const locale of localesSet) {
234
- await cmsPublishedCacheRepository.upsert({
235
- section,
236
- locale,
237
- content: labelsByLocale[locale] || {},
238
- publishedAt: timestamp,
239
- publishedBy: 'system',
240
- });
241
- }
242
- }
243
- /**
244
- * Initialize label sync for server startup
245
- *
246
- * Call this in your server.config.ts beforeRoutes hook
247
- *
248
- * @param options - Sync options
249
- * @param options.labelsDir - Path to labels directory (default: 'src/cms/labels')
250
- *
251
- * @example
252
- * ```typescript
253
- * import { initLabelSync } from '@spfn/cms';
254
- *
255
- * export default {
256
- * beforeRoutes: async (app) => {
257
- * await initLabelSync({ verbose: true });
258
- * },
259
- * } satisfies ServerConfig;
260
- * ```
261
- */
262
- export async function initLabelSync(options = {}) {
263
- const isDevelopment = process.env.NODE_ENV === 'development';
264
- const verbose = options.verbose ?? isDevelopment;
265
- const labelsDir = options.labelsDir ?? 'src/cms/labels';
266
- if (verbose) {
267
- console.log('\n🔄 Initializing label sync...\n');
268
- }
269
- // Load labels from JSON files
270
- const sections = loadLabelsFromJson(labelsDir);
271
- if (sections.length === 0) {
272
- if (verbose) {
273
- console.log('⚠️ No labels found in', labelsDir);
274
- console.log('');
275
- }
276
- return;
277
- }
278
- const results = await syncAll(sections, {
279
- updateExisting: true, // 🔄 항상 업데이트 (프로덕션 포함)
280
- ...options,
281
- verbose,
282
- });
283
- const totalCreated = results.reduce((sum, r) => sum + r.created, 0);
284
- const totalUpdated = results.reduce((sum, r) => sum + r.updated, 0);
285
- const totalUnchanged = results.reduce((sum, r) => sum + r.unchanged, 0);
286
- const totalErrors = results.reduce((sum, r) => sum + r.errors.length, 0);
287
- if (verbose) {
288
- console.log('✅ Label sync completed\n');
289
- console.log(` Sections: ${results.length}`);
290
- console.log(` Created: ${totalCreated}`);
291
- console.log(` Updated: ${totalUpdated}`);
292
- console.log(` Unchanged: ${totalUnchanged}`);
293
- if (totalErrors > 0) {
294
- console.log(` Errors: ${totalErrors}\n`);
295
- }
296
- else {
297
- console.log('');
298
- }
299
- }
300
- // Log errors
301
- if (totalErrors > 0) {
302
- results.forEach((result) => {
303
- result.errors.forEach((error) => {
304
- console.error(`[${result.section}] ${error.key}: ${error.error}`);
305
- });
306
- });
307
- }
308
- }
309
- //# sourceMappingURL=sync.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/helpers/sync.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAErB;;;;;;;GAOG;AAGH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC7E,YAAY,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAGjD,cAAc,UAAU,CAAC;AACzB,YAAY,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAGxD,cAAc,gBAAgB,CAAC;AAG/B,cAAc,YAAY,CAAC;AAG3B,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAGzF,cAAc,UAAU,CAAC;AAGzB,OAAO,EAAE,wBAAwB,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC;AAGjG,mBAAmB,SAAS,CAAC"}
package/dist/init.d.ts DELETED
@@ -1,31 +0,0 @@
1
- /**
2
- * CMS Store Initializer
3
- *
4
- * 서버 컴포넌트에서 로드한 섹션 데이터를 클라이언트 store에 초기화
5
- */
6
- import type { SectionAPI } from './server';
7
- interface InitCmsProps {
8
- /**
9
- * 서버에서 로드한 섹션 데이터
10
- * { home: { t, data }, ... }
11
- */
12
- sections: Record<string, SectionAPI>;
13
- }
14
- /**
15
- * CMS Store 초기화 컴포넌트
16
- *
17
- * 서버 컴포넌트에서 로드한 데이터를 클라이언트 store에 주입
18
- * 이후 하위 클라이언트 컴포넌트에서 useSection() 사용 가능
19
- *
20
- * @param props - InitCmsProps
21
- * @param props.sections - 서버에서 로드한 섹션 데이터
22
- *
23
- * @example
24
- * // Server Component
25
- * const home = await getSection('home');
26
- * <InitCms sections={{ home }} />
27
- * // 이후 하위 클라이언트 컴포넌트에서 useSection('home') 사용 가능
28
- */
29
- export declare function InitCms({ sections }: InitCmsProps): null;
30
- export {};
31
- //# sourceMappingURL=init.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../src/init.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,UAAU,YAAY;IAElB;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;CACxC;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,OAAO,CAAC,EAAE,QAAQ,EAAE,EAAE,YAAY,QAiBjD"}
package/dist/init.js DELETED
@@ -1,36 +0,0 @@
1
- /**
2
- * CMS Store Initializer
3
- *
4
- * 서버 컴포넌트에서 로드한 섹션 데이터를 클라이언트 store에 초기화
5
- */
6
- 'use client';
7
- import { useEffect } from 'react';
8
- import { useCmsStore } from './store';
9
- /**
10
- * CMS Store 초기화 컴포넌트
11
- *
12
- * 서버 컴포넌트에서 로드한 데이터를 클라이언트 store에 주입
13
- * 이후 하위 클라이언트 컴포넌트에서 useSection() 사용 가능
14
- *
15
- * @param props - InitCmsProps
16
- * @param props.sections - 서버에서 로드한 섹션 데이터
17
- *
18
- * @example
19
- * // Server Component
20
- * const home = await getSection('home');
21
- * <InitCms sections={{ home }} />
22
- * // 이후 하위 클라이언트 컴포넌트에서 useSection('home') 사용 가능
23
- */
24
- export function InitCms({ sections }) {
25
- const setSections = useCmsStore((state) => state.setSections);
26
- useEffect(() => {
27
- // SectionAPI → SectionData 변환
28
- const sectionsData = {};
29
- Object.entries(sections).forEach(([key, { data }]) => {
30
- sectionsData[key] = data;
31
- });
32
- setSections(sectionsData);
33
- }, [sections, setSections]);
34
- return null;
35
- }
36
- //# sourceMappingURL=init.js.map
package/dist/init.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../src/init.tsx"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,YAAY,CAAC;AAEb,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAYtC;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,OAAO,CAAC,EAAE,QAAQ,EAAgB;IAE9C,MAAM,WAAW,GAAG,WAAW,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IAE9D,SAAS,CAAC,GAAG,EAAE;QAEX,8BAA8B;QAC9B,MAAM,YAAY,GAAwB,EAAE,CAAC;QAC7C,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE;YAEjD,YAAY,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,WAAW,CAAC,YAAY,CAAC,CAAC;IAC9B,CAAC,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC,CAAC;IAE5B,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -1,31 +0,0 @@
1
- /**
2
- * CMS Label Helpers
3
- *
4
- * Utilities for processing label definitions from JSON files
5
- */
6
- import type { SectionDefinition, NestedLabels, FlatLabel } from '../types.js';
7
- /**
8
- * 중첩된 라벨을 플랫화
9
- *
10
- * @param labels - 중첩된 라벨 객체
11
- * @returns 플랫화된 라벨 배열
12
- *
13
- * @example
14
- * ```ts
15
- * flattenLabels({
16
- * nav: {
17
- * home: { key: 'layout.nav.home', defaultValue: 'Home' },
18
- * },
19
- * });
20
- * // => [{ key: 'layout.nav.home', defaultValue: 'Home' }]
21
- * ```
22
- */
23
- export declare function flattenLabels(labels: NestedLabels): FlatLabel[];
24
- /**
25
- * 섹션 정의에서 모든 라벨 추출
26
- *
27
- * @param definition - 섹션 정의
28
- * @returns 플랫화된 라벨 배열
29
- */
30
- export declare function extractLabels(definition: SectionDefinition): FlatLabel[];
31
- //# sourceMappingURL=helpers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/labels/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,iBAAiB,EAAE,YAAY,EAAE,SAAS,EAAmB,MAAM,aAAa,CAAC;AAE/F;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,YAAY,GAAG,SAAS,EAAE,CAwC/D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,UAAU,EAAE,iBAAiB,GAAG,SAAS,EAAE,CAGxE"}
@@ -1,60 +0,0 @@
1
- /**
2
- * CMS Label Helpers
3
- *
4
- * Utilities for processing label definitions from JSON files
5
- */
6
- /**
7
- * 중첩된 라벨을 플랫화
8
- *
9
- * @param labels - 중첩된 라벨 객체
10
- * @returns 플랫화된 라벨 배열
11
- *
12
- * @example
13
- * ```ts
14
- * flattenLabels({
15
- * nav: {
16
- * home: { key: 'layout.nav.home', defaultValue: 'Home' },
17
- * },
18
- * });
19
- * // => [{ key: 'layout.nav.home', defaultValue: 'Home' }]
20
- * ```
21
- */
22
- export function flattenLabels(labels) {
23
- const result = [];
24
- function isLabelDefinition(obj) {
25
- return ('key' in obj &&
26
- 'defaultValue' in obj &&
27
- typeof obj.key === 'string' &&
28
- (typeof obj.defaultValue === 'string' || typeof obj.defaultValue === 'object'));
29
- }
30
- function traverse(obj) {
31
- if (isLabelDefinition(obj)) {
32
- // LabelDefinition인 경우
33
- result.push({
34
- key: obj.key,
35
- defaultValue: obj.defaultValue,
36
- description: obj.description,
37
- });
38
- }
39
- else {
40
- // NestedLabels인 경우
41
- Object.values(obj).forEach((value) => {
42
- if (typeof value === 'object' && value !== null) {
43
- traverse(value);
44
- }
45
- });
46
- }
47
- }
48
- traverse(labels);
49
- return result;
50
- }
51
- /**
52
- * 섹션 정의에서 모든 라벨 추출
53
- *
54
- * @param definition - 섹션 정의
55
- * @returns 플랫화된 라벨 배열
56
- */
57
- export function extractLabels(definition) {
58
- return flattenLabels(definition.labels);
59
- }
60
- //# sourceMappingURL=helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/labels/helpers.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,aAAa,CAAC,MAAoB;IAE9C,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,SAAS,iBAAiB,CAAC,GAAmC;QAE1D,OAAO,CACH,KAAK,IAAI,GAAG;YACZ,cAAc,IAAI,GAAG;YACrB,OAAO,GAAG,CAAC,GAAG,KAAK,QAAQ;YAC3B,CAAC,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,IAAI,OAAO,GAAG,CAAC,YAAY,KAAK,QAAQ,CAAC,CACjF,CAAC;IACN,CAAC;IAED,SAAS,QAAQ,CAAC,GAAmC;QAEjD,IAAI,iBAAiB,CAAC,GAAG,CAAC,EAC1B,CAAC;YACG,sBAAsB;YACtB,MAAM,CAAC,IAAI,CAAC;gBACR,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,YAAY,EAAE,GAAG,CAAC,YAAY;gBAC9B,WAAW,EAAE,GAAG,CAAC,WAAW;aAC/B,CAAC,CAAC;QACP,CAAC;aAED,CAAC;YACG,mBAAmB;YACnB,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;gBAEjC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAC/C,CAAC;oBACG,QAAQ,CAAC,KAAK,CAAC,CAAC;gBACpB,CAAC;YACL,CAAC,CAAC,CAAC;QACP,CAAC;IACL,CAAC;IAED,QAAQ,CAAC,MAAM,CAAC,CAAC;IACjB,OAAO,MAAM,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,UAA6B;IAEvD,OAAO,aAAa,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;AAC5C,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * CMS Labels Helpers
3
- *
4
- * 라벨 정의를 위한 헬퍼 함수들
5
- */
6
- export { extractLabels, flattenLabels } from './helpers.js';
7
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/labels/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
@@ -1,7 +0,0 @@
1
- /**
2
- * CMS Labels Helpers
3
- *
4
- * 라벨 정의를 위한 헬퍼 함수들
5
- */
6
- export { extractLabels, flattenLabels } from './helpers.js';
7
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/labels/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC"}
@@ -1,62 +0,0 @@
1
- /**
2
- * CMS Draft Cache Repository
3
- *
4
- * 관리자별 초안 캐시 관리 (동시 편집 지원)
5
- */
6
- import { type NewCmsDraftCache } from '../entities/index.js';
7
- /**
8
- * 섹션 + 언어 + 사용자로 초안 캐시 조회
9
- */
10
- export declare function findByUser(section: string, locale: string, userId: string): Promise<{
11
- section: string;
12
- id: number;
13
- updatedAt: Date;
14
- locale: string;
15
- content: unknown;
16
- userId: string;
17
- } | null>;
18
- /**
19
- * 초안 캐시 생성 또는 업데이트 (UPSERT)
20
- */
21
- export declare function upsert(data: NewCmsDraftCache): Promise<{
22
- section: string;
23
- id: number;
24
- updatedAt: Date;
25
- locale: string;
26
- content: unknown;
27
- userId: string;
28
- }>;
29
- /**
30
- * 특정 사용자의 모든 초안 조회
31
- */
32
- export declare function findAllByUser(userId: string): Promise<{
33
- section: string;
34
- id: number;
35
- updatedAt: Date;
36
- locale: string;
37
- content: unknown;
38
- userId: string;
39
- }[]>;
40
- /**
41
- * 초안 삭제
42
- */
43
- export declare function deleteByUser(section: string, locale: string, userId: string): Promise<void>;
44
- /**
45
- * 오래된 초안 정리 (30일 이상 미사용)
46
- */
47
- export declare function cleanupOldDrafts(daysOld?: number): Promise<{
48
- section: string;
49
- id: number;
50
- updatedAt: Date;
51
- locale: string;
52
- content: unknown;
53
- userId: string;
54
- }[]>;
55
- export declare const cmsDraftCacheRepository: {
56
- findByUser: typeof findByUser;
57
- upsert: typeof upsert;
58
- findAllByUser: typeof findAllByUser;
59
- deleteByUser: typeof deleteByUser;
60
- cleanupOldDrafts: typeof cleanupOldDrafts;
61
- };
62
- //# sourceMappingURL=cms-draft-cache.repository.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cms-draft-cache.repository.d.ts","sourceRoot":"","sources":["../../src/repositories/cms-draft-cache.repository.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,OAAO,EAAiB,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE5E;;GAEG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;;;;;;;UAU/E;AAED;;GAEG;AACH,wBAAsB,MAAM,CAAC,IAAI,EAAE,gBAAgB;;;;;;;GASlD;AAED;;GAEG;AACH,wBAAsB,aAAa,CAAC,MAAM,EAAE,MAAM;;;;;;;KAKjD;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,iBAUjF;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,GAAE,MAAW;;;;;;;KAS1D;AAED,eAAO,MAAM,uBAAuB;;;;;;CAMnC,CAAC"}
@@ -1,56 +0,0 @@
1
- /**
2
- * CMS Draft Cache Repository
3
- *
4
- * 관리자별 초안 캐시 관리 (동시 편집 지원)
5
- */
6
- import { findOne, findMany, deleteOne, deleteMany, upsert as upsertHelper } from '@spfn/core/db';
7
- import { eq, and, lt } from 'drizzle-orm';
8
- import { cmsDraftCache } from '../entities/index.js';
9
- /**
10
- * 섹션 + 언어 + 사용자로 초안 캐시 조회
11
- */
12
- export async function findByUser(section, locale, userId) {
13
- return findOne(cmsDraftCache, and(eq(cmsDraftCache.section, section), eq(cmsDraftCache.locale, locale), eq(cmsDraftCache.userId, userId)));
14
- }
15
- /**
16
- * 초안 캐시 생성 또는 업데이트 (UPSERT)
17
- */
18
- export async function upsert(data) {
19
- return upsertHelper(cmsDraftCache, data, {
20
- target: [cmsDraftCache.section, cmsDraftCache.locale, cmsDraftCache.userId],
21
- set: {
22
- content: data.content,
23
- updatedAt: new Date(),
24
- }
25
- });
26
- }
27
- /**
28
- * 특정 사용자의 모든 초안 조회
29
- */
30
- export async function findAllByUser(userId) {
31
- return findMany(cmsDraftCache, {
32
- where: eq(cmsDraftCache.userId, userId)
33
- });
34
- }
35
- /**
36
- * 초안 삭제
37
- */
38
- export async function deleteByUser(section, locale, userId) {
39
- await deleteOne(cmsDraftCache, and(eq(cmsDraftCache.section, section), eq(cmsDraftCache.locale, locale), eq(cmsDraftCache.userId, userId)));
40
- }
41
- /**
42
- * 오래된 초안 정리 (30일 이상 미사용)
43
- */
44
- export async function cleanupOldDrafts(daysOld = 30) {
45
- const cutoffDate = new Date();
46
- cutoffDate.setDate(cutoffDate.getDate() - daysOld);
47
- return deleteMany(cmsDraftCache, lt(cmsDraftCache.updatedAt, cutoffDate));
48
- }
49
- export const cmsDraftCacheRepository = {
50
- findByUser,
51
- upsert,
52
- findAllByUser,
53
- deleteByUser,
54
- cleanupOldDrafts,
55
- };
56
- //# sourceMappingURL=cms-draft-cache.repository.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"cms-draft-cache.repository.js","sourceRoot":"","sources":["../../src/repositories/cms-draft-cache.repository.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,IAAI,YAAY,EAAE,MAAM,eAAe,CAAC;AACjG,OAAO,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAyB,MAAM,sBAAsB,CAAC;AAE5E;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,OAAe,EAAE,MAAc,EAAE,MAAc;IAE5E,OAAO,OAAO,CACV,aAAa,EACb,GAAG,CACC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,EAClC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CACnC,CACJ,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAsB;IAE/C,OAAO,YAAY,CAAC,aAAa,EAAE,IAAI,EAAE;QACrC,MAAM,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,aAAa,CAAC,MAAM,EAAE,aAAa,CAAC,MAAM,CAAC;QAC3E,GAAG,EAAE;YACD,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,IAAI,EAAE;SACxB;KACJ,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,MAAc;IAE9C,OAAO,QAAQ,CAAC,aAAa,EAAE;QAC3B,KAAK,EAAE,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC;KAC1C,CAAC,CAAC;AACP,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,OAAe,EAAE,MAAc,EAAE,MAAc;IAE9E,MAAM,SAAS,CACX,aAAa,EACb,GAAG,CACC,EAAE,CAAC,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,EAClC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAChC,EAAE,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CACnC,CACJ,CAAC;AACN,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,UAAkB,EAAE;IAEvD,MAAM,UAAU,GAAG,IAAI,IAAI,EAAE,CAAC;IAC9B,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC;IAEnD,OAAO,UAAU,CACb,aAAa,EACb,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,UAAU,CAAC,CAC1C,CAAC;AACN,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAAG;IACnC,UAAU;IACV,MAAM;IACN,aAAa;IACb,YAAY;IACZ,gBAAgB;CACnB,CAAC"}