@spfn/cms 0.1.0-alpha.65 → 0.1.0-alpha.66

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/server.js CHANGED
@@ -1,13 +1,39 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropNames = Object.getOwnPropertyNames;
3
- var __esm = (fn, res) => function __init() {
4
- return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
5
- };
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
1
+ // src/server.ts
2
+ import { cache } from "react";
3
+ import { client } from "@spfn/core/client";
4
+
5
+ // src/lib/contracts/published-cache.ts
6
+ import { Type } from "@sinclair/typebox";
7
+ var SectionData = Type.Object({
8
+ section: Type.String(),
9
+ locale: Type.String(),
10
+ content: Type.Record(Type.String(), Type.Any()),
11
+ version: Type.Number(),
12
+ publishedAt: Type.Union([Type.String(), Type.Null()])
13
+ });
14
+ var getPublishedCacheContract = {
15
+ method: "GET",
16
+ path: "/published-cache",
17
+ query: Type.Object({
18
+ sections: Type.Union([
19
+ Type.String({ description: "\uB2E8\uC77C \uC139\uC158 \uC774\uB984 (\uC608: home)" }),
20
+ Type.Array(Type.String(), { description: '\uC5EC\uB7EC \uC139\uC158 \uC774\uB984 (\uC608: ["home", "footer"])' })
21
+ ]),
22
+ locale: Type.Optional(Type.String({ default: "ko", description: "\uC5B8\uC5B4 \uCF54\uB4DC" }))
23
+ }),
24
+ response: Type.Union([
25
+ // 성공: 항상 배열로 반환
26
+ Type.Array(SectionData),
27
+ // 에러
28
+ Type.Object({
29
+ error: Type.String()
30
+ })
31
+ ])
9
32
  };
10
33
 
34
+ // src/server/helpers/locale.actions.ts
35
+ import { cookies, headers } from "next/headers";
36
+
11
37
  // src/server/config/cms.config.ts
12
38
  function getEnvVar(key, defaultValue) {
13
39
  return process.env[key] || defaultValue;
@@ -31,18 +57,546 @@ function loadConfigFromEnv() {
31
57
  detectBrowserLanguage: detectBrowserLanguage2
32
58
  };
33
59
  }
60
+ var currentConfig = loadConfigFromEnv();
34
61
  function getCmsConfig() {
35
62
  return currentConfig;
36
63
  }
37
- var currentConfig;
38
- var init_cms_config = __esm({
39
- "src/server/config/cms.config.ts"() {
40
- "use strict";
41
- currentConfig = loadConfigFromEnv();
42
- }
43
- });
44
64
 
45
65
  // src/lib/constants/locale.constants.ts
66
+ var LOCALE_COOKIE_KEY = "spfn-locale";
67
+ var LOCALE_INFO_MAP = {
68
+ // 한국어
69
+ ko: {
70
+ locale: "ko",
71
+ countryCode: "KR",
72
+ flag: "🇰🇷",
73
+ dialCode: "+82",
74
+ nativeName: "\uD55C\uAD6D\uC5B4",
75
+ englishName: "Korean",
76
+ currencyCode: "KRW",
77
+ dateFormat: "YYYY.MM.DD"
78
+ },
79
+ // 영어 (미국)
80
+ en: {
81
+ locale: "en",
82
+ countryCode: "US",
83
+ flag: "🇺🇸",
84
+ dialCode: "+1",
85
+ nativeName: "English",
86
+ englishName: "English",
87
+ currencyCode: "USD",
88
+ dateFormat: "MM/DD/YYYY"
89
+ },
90
+ // 일본어
91
+ ja: {
92
+ locale: "ja",
93
+ countryCode: "JP",
94
+ flag: "🇯🇵",
95
+ dialCode: "+81",
96
+ nativeName: "\u65E5\u672C\u8A9E",
97
+ englishName: "Japanese",
98
+ currencyCode: "JPY",
99
+ dateFormat: "YYYY/MM/DD"
100
+ },
101
+ // 중국어 (간체)
102
+ zh: {
103
+ locale: "zh",
104
+ countryCode: "CN",
105
+ flag: "🇨🇳",
106
+ dialCode: "+86",
107
+ nativeName: "\u7B80\u4F53\u4E2D\u6587",
108
+ englishName: "Chinese (Simplified)",
109
+ currencyCode: "CNY",
110
+ dateFormat: "YYYY-MM-DD"
111
+ },
112
+ // 중국어 (번체, 대만)
113
+ "zh-TW": {
114
+ locale: "zh-TW",
115
+ countryCode: "TW",
116
+ flag: "🇹🇼",
117
+ dialCode: "+886",
118
+ nativeName: "\u7E41\u9AD4\u4E2D\u6587",
119
+ englishName: "Chinese (Traditional)",
120
+ currencyCode: "TWD",
121
+ dateFormat: "YYYY/MM/DD"
122
+ },
123
+ // 스페인어
124
+ es: {
125
+ locale: "es",
126
+ countryCode: "ES",
127
+ flag: "🇪🇸",
128
+ dialCode: "+34",
129
+ nativeName: "Espa\xF1ol",
130
+ englishName: "Spanish",
131
+ currencyCode: "EUR",
132
+ dateFormat: "DD/MM/YYYY"
133
+ },
134
+ // 프랑스어
135
+ fr: {
136
+ locale: "fr",
137
+ countryCode: "FR",
138
+ flag: "🇫🇷",
139
+ dialCode: "+33",
140
+ nativeName: "Fran\xE7ais",
141
+ englishName: "French",
142
+ currencyCode: "EUR",
143
+ dateFormat: "DD/MM/YYYY"
144
+ },
145
+ // 독일어
146
+ de: {
147
+ locale: "de",
148
+ countryCode: "DE",
149
+ flag: "🇩🇪",
150
+ dialCode: "+49",
151
+ nativeName: "Deutsch",
152
+ englishName: "German",
153
+ currencyCode: "EUR",
154
+ dateFormat: "DD.MM.YYYY"
155
+ },
156
+ // 이탈리아어
157
+ it: {
158
+ locale: "it",
159
+ countryCode: "IT",
160
+ flag: "🇮🇹",
161
+ dialCode: "+39",
162
+ nativeName: "Italiano",
163
+ englishName: "Italian",
164
+ currencyCode: "EUR",
165
+ dateFormat: "DD/MM/YYYY"
166
+ },
167
+ // 포르투갈어 (브라질)
168
+ pt: {
169
+ locale: "pt",
170
+ countryCode: "BR",
171
+ flag: "🇧🇷",
172
+ dialCode: "+55",
173
+ nativeName: "Portugu\xEAs",
174
+ englishName: "Portuguese",
175
+ currencyCode: "BRL",
176
+ dateFormat: "DD/MM/YYYY"
177
+ },
178
+ // 러시아어
179
+ ru: {
180
+ locale: "ru",
181
+ countryCode: "RU",
182
+ flag: "🇷🇺",
183
+ dialCode: "+7",
184
+ nativeName: "\u0420\u0443\u0441\u0441\u043A\u0438\u0439",
185
+ englishName: "Russian",
186
+ currencyCode: "RUB",
187
+ dateFormat: "DD.MM.YYYY"
188
+ },
189
+ // 아랍어
190
+ ar: {
191
+ locale: "ar",
192
+ countryCode: "SA",
193
+ flag: "🇸🇦",
194
+ dialCode: "+966",
195
+ nativeName: "\u0627\u0644\u0639\u0631\u0628\u064A\u0629",
196
+ englishName: "Arabic",
197
+ rtl: true,
198
+ currencyCode: "SAR",
199
+ dateFormat: "DD/MM/YYYY"
200
+ },
201
+ // 힌디어
202
+ hi: {
203
+ locale: "hi",
204
+ countryCode: "IN",
205
+ flag: "🇮🇳",
206
+ dialCode: "+91",
207
+ nativeName: "\u0939\u093F\u0928\u094D\u0926\u0940",
208
+ englishName: "Hindi",
209
+ currencyCode: "INR",
210
+ dateFormat: "DD/MM/YYYY"
211
+ },
212
+ // 태국어
213
+ th: {
214
+ locale: "th",
215
+ countryCode: "TH",
216
+ flag: "🇹🇭",
217
+ dialCode: "+66",
218
+ nativeName: "\u0E44\u0E17\u0E22",
219
+ englishName: "Thai",
220
+ currencyCode: "THB",
221
+ dateFormat: "DD/MM/YYYY"
222
+ },
223
+ // 베트남어
224
+ vi: {
225
+ locale: "vi",
226
+ countryCode: "VN",
227
+ flag: "🇻🇳",
228
+ dialCode: "+84",
229
+ nativeName: "Ti\u1EBFng Vi\u1EC7t",
230
+ englishName: "Vietnamese",
231
+ currencyCode: "VND",
232
+ dateFormat: "DD/MM/YYYY"
233
+ },
234
+ // 인도네시아어
235
+ id: {
236
+ locale: "id",
237
+ countryCode: "ID",
238
+ flag: "🇮🇩",
239
+ dialCode: "+62",
240
+ nativeName: "Bahasa Indonesia",
241
+ englishName: "Indonesian",
242
+ currencyCode: "IDR",
243
+ dateFormat: "DD/MM/YYYY"
244
+ },
245
+ // 터키어
246
+ tr: {
247
+ locale: "tr",
248
+ countryCode: "TR",
249
+ flag: "🇹🇷",
250
+ dialCode: "+90",
251
+ nativeName: "T\xFCrk\xE7e",
252
+ englishName: "Turkish",
253
+ currencyCode: "TRY",
254
+ dateFormat: "DD.MM.YYYY"
255
+ },
256
+ // 폴란드어
257
+ pl: {
258
+ locale: "pl",
259
+ countryCode: "PL",
260
+ flag: "🇵🇱",
261
+ dialCode: "+48",
262
+ nativeName: "Polski",
263
+ englishName: "Polish",
264
+ currencyCode: "PLN",
265
+ dateFormat: "DD.MM.YYYY"
266
+ },
267
+ // 네덜란드어
268
+ nl: {
269
+ locale: "nl",
270
+ countryCode: "NL",
271
+ flag: "🇳🇱",
272
+ dialCode: "+31",
273
+ nativeName: "Nederlands",
274
+ englishName: "Dutch",
275
+ currencyCode: "EUR",
276
+ dateFormat: "DD-MM-YYYY"
277
+ },
278
+ // 중국어 (홍콩)
279
+ "zh-HK": {
280
+ locale: "zh-HK",
281
+ countryCode: "HK",
282
+ flag: "🇭🇰",
283
+ dialCode: "+852",
284
+ nativeName: "\u7E41\u9AD4\u4E2D\u6587 (\u9999\u6E2F)",
285
+ englishName: "Chinese (Hong Kong)",
286
+ currencyCode: "HKD",
287
+ dateFormat: "YYYY/MM/DD"
288
+ },
289
+ // 말레이어
290
+ ms: {
291
+ locale: "ms",
292
+ countryCode: "MY",
293
+ flag: "🇲🇾",
294
+ dialCode: "+60",
295
+ nativeName: "Bahasa Melayu",
296
+ englishName: "Malay",
297
+ currencyCode: "MYR",
298
+ dateFormat: "DD/MM/YYYY"
299
+ },
300
+ // 영어 (영국)
301
+ "en-GB": {
302
+ locale: "en-GB",
303
+ countryCode: "GB",
304
+ flag: "🇬🇧",
305
+ dialCode: "+44",
306
+ nativeName: "English (UK)",
307
+ englishName: "English (United Kingdom)",
308
+ currencyCode: "GBP",
309
+ dateFormat: "DD/MM/YYYY"
310
+ },
311
+ // 영어 (캐나다)
312
+ "en-CA": {
313
+ locale: "en-CA",
314
+ countryCode: "CA",
315
+ flag: "🇨🇦",
316
+ dialCode: "+1",
317
+ nativeName: "English (Canada)",
318
+ englishName: "English (Canada)",
319
+ currencyCode: "CAD",
320
+ dateFormat: "YYYY-MM-DD"
321
+ },
322
+ // 영어 (호주)
323
+ "en-AU": {
324
+ locale: "en-AU",
325
+ countryCode: "AU",
326
+ flag: "🇦🇺",
327
+ dialCode: "+61",
328
+ nativeName: "English (Australia)",
329
+ englishName: "English (Australia)",
330
+ currencyCode: "AUD",
331
+ dateFormat: "DD/MM/YYYY"
332
+ },
333
+ // 영어 (뉴질랜드)
334
+ "en-NZ": {
335
+ locale: "en-NZ",
336
+ countryCode: "NZ",
337
+ flag: "🇳🇿",
338
+ dialCode: "+64",
339
+ nativeName: "English (New Zealand)",
340
+ englishName: "English (New Zealand)",
341
+ currencyCode: "NZD",
342
+ dateFormat: "DD/MM/YYYY"
343
+ },
344
+ // 스페인어 (멕시코)
345
+ "es-MX": {
346
+ locale: "es-MX",
347
+ countryCode: "MX",
348
+ flag: "🇲🇽",
349
+ dialCode: "+52",
350
+ nativeName: "Espa\xF1ol (M\xE9xico)",
351
+ englishName: "Spanish (Mexico)",
352
+ currencyCode: "MXN",
353
+ dateFormat: "DD/MM/YYYY"
354
+ },
355
+ // 스페인어 (아르헨티나)
356
+ "es-AR": {
357
+ locale: "es-AR",
358
+ countryCode: "AR",
359
+ flag: "🇦🇷",
360
+ dialCode: "+54",
361
+ nativeName: "Espa\xF1ol (Argentina)",
362
+ englishName: "Spanish (Argentina)",
363
+ currencyCode: "ARS",
364
+ dateFormat: "DD/MM/YYYY"
365
+ },
366
+ // 스페인어 (콜롬비아)
367
+ "es-CO": {
368
+ locale: "es-CO",
369
+ countryCode: "CO",
370
+ flag: "🇨🇴",
371
+ dialCode: "+57",
372
+ nativeName: "Espa\xF1ol (Colombia)",
373
+ englishName: "Spanish (Colombia)",
374
+ currencyCode: "COP",
375
+ dateFormat: "DD/MM/YYYY"
376
+ },
377
+ // 스웨덴어
378
+ sv: {
379
+ locale: "sv",
380
+ countryCode: "SE",
381
+ flag: "🇸🇪",
382
+ dialCode: "+46",
383
+ nativeName: "Svenska",
384
+ englishName: "Swedish",
385
+ currencyCode: "SEK",
386
+ dateFormat: "YYYY-MM-DD"
387
+ },
388
+ // 노르웨이어
389
+ no: {
390
+ locale: "no",
391
+ countryCode: "NO",
392
+ flag: "🇳🇴",
393
+ dialCode: "+47",
394
+ nativeName: "Norsk",
395
+ englishName: "Norwegian",
396
+ currencyCode: "NOK",
397
+ dateFormat: "DD.MM.YYYY"
398
+ },
399
+ // 덴마크어
400
+ da: {
401
+ locale: "da",
402
+ countryCode: "DK",
403
+ flag: "🇩🇰",
404
+ dialCode: "+45",
405
+ nativeName: "Dansk",
406
+ englishName: "Danish",
407
+ currencyCode: "DKK",
408
+ dateFormat: "DD-MM-YYYY"
409
+ },
410
+ // 핀란드어
411
+ fi: {
412
+ locale: "fi",
413
+ countryCode: "FI",
414
+ flag: "🇫🇮",
415
+ dialCode: "+358",
416
+ nativeName: "Suomi",
417
+ englishName: "Finnish",
418
+ currencyCode: "EUR",
419
+ dateFormat: "DD.MM.YYYY"
420
+ },
421
+ // 우크라이나어
422
+ uk: {
423
+ locale: "uk",
424
+ countryCode: "UA",
425
+ flag: "🇺🇦",
426
+ dialCode: "+380",
427
+ nativeName: "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430",
428
+ englishName: "Ukrainian",
429
+ currencyCode: "UAH",
430
+ dateFormat: "DD.MM.YYYY"
431
+ },
432
+ // 체코어
433
+ cs: {
434
+ locale: "cs",
435
+ countryCode: "CZ",
436
+ flag: "🇨🇿",
437
+ dialCode: "+420",
438
+ nativeName: "\u010Ce\u0161tina",
439
+ englishName: "Czech",
440
+ currencyCode: "CZK",
441
+ dateFormat: "DD.MM.YYYY"
442
+ },
443
+ // 헝가리어
444
+ hu: {
445
+ locale: "hu",
446
+ countryCode: "HU",
447
+ flag: "🇭🇺",
448
+ dialCode: "+36",
449
+ nativeName: "Magyar",
450
+ englishName: "Hungarian",
451
+ currencyCode: "HUF",
452
+ dateFormat: "YYYY.MM.DD."
453
+ },
454
+ // 루마니아어
455
+ ro: {
456
+ locale: "ro",
457
+ countryCode: "RO",
458
+ flag: "🇷🇴",
459
+ dialCode: "+40",
460
+ nativeName: "Rom\xE2n\u0103",
461
+ englishName: "Romanian",
462
+ currencyCode: "RON",
463
+ dateFormat: "DD.MM.YYYY"
464
+ },
465
+ // 불가리아어
466
+ bg: {
467
+ locale: "bg",
468
+ countryCode: "BG",
469
+ flag: "🇧🇬",
470
+ dialCode: "+359",
471
+ nativeName: "\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438",
472
+ englishName: "Bulgarian",
473
+ currencyCode: "BGN",
474
+ dateFormat: "DD.MM.YYYY"
475
+ },
476
+ // 크로아티아어
477
+ hr: {
478
+ locale: "hr",
479
+ countryCode: "HR",
480
+ flag: "🇭🇷",
481
+ dialCode: "+385",
482
+ nativeName: "Hrvatski",
483
+ englishName: "Croatian",
484
+ currencyCode: "HRK",
485
+ dateFormat: "DD.MM.YYYY."
486
+ },
487
+ // 세르비아어
488
+ sr: {
489
+ locale: "sr",
490
+ countryCode: "RS",
491
+ flag: "🇷🇸",
492
+ dialCode: "+381",
493
+ nativeName: "\u0421\u0440\u043F\u0441\u043A\u0438",
494
+ englishName: "Serbian",
495
+ currencyCode: "RSD",
496
+ dateFormat: "DD.MM.YYYY."
497
+ },
498
+ // 슬로바키아어
499
+ sk: {
500
+ locale: "sk",
501
+ countryCode: "SK",
502
+ flag: "🇸🇰",
503
+ dialCode: "+421",
504
+ nativeName: "Sloven\u010Dina",
505
+ englishName: "Slovak",
506
+ currencyCode: "EUR",
507
+ dateFormat: "DD.MM.YYYY"
508
+ },
509
+ // 슬로베니아어
510
+ sl: {
511
+ locale: "sl",
512
+ countryCode: "SI",
513
+ flag: "🇸🇮",
514
+ dialCode: "+386",
515
+ nativeName: "Sloven\u0161\u010Dina",
516
+ englishName: "Slovenian",
517
+ currencyCode: "EUR",
518
+ dateFormat: "DD.MM.YYYY"
519
+ },
520
+ // 리투아니아어
521
+ lt: {
522
+ locale: "lt",
523
+ countryCode: "LT",
524
+ flag: "🇱🇹",
525
+ dialCode: "+370",
526
+ nativeName: "Lietuvi\u0173",
527
+ englishName: "Lithuanian",
528
+ currencyCode: "EUR",
529
+ dateFormat: "YYYY-MM-DD"
530
+ },
531
+ // 라트비아어
532
+ lv: {
533
+ locale: "lv",
534
+ countryCode: "LV",
535
+ flag: "🇱🇻",
536
+ dialCode: "+371",
537
+ nativeName: "Latvie\u0161u",
538
+ englishName: "Latvian",
539
+ currencyCode: "EUR",
540
+ dateFormat: "DD.MM.YYYY."
541
+ },
542
+ // 에스토니아어
543
+ et: {
544
+ locale: "et",
545
+ countryCode: "EE",
546
+ flag: "🇪🇪",
547
+ dialCode: "+372",
548
+ nativeName: "Eesti",
549
+ englishName: "Estonian",
550
+ currencyCode: "EUR",
551
+ dateFormat: "DD.MM.YYYY"
552
+ },
553
+ // 그리스어
554
+ el: {
555
+ locale: "el",
556
+ countryCode: "GR",
557
+ flag: "🇬🇷",
558
+ dialCode: "+30",
559
+ nativeName: "\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC",
560
+ englishName: "Greek",
561
+ currencyCode: "EUR",
562
+ dateFormat: "DD/MM/YYYY"
563
+ },
564
+ // 페르시아어
565
+ fa: {
566
+ locale: "fa",
567
+ countryCode: "IR",
568
+ flag: "🇮🇷",
569
+ dialCode: "+98",
570
+ nativeName: "\u0641\u0627\u0631\u0633\u06CC",
571
+ englishName: "Persian",
572
+ rtl: true,
573
+ currencyCode: "IRR",
574
+ dateFormat: "YYYY/MM/DD"
575
+ },
576
+ // 히브리어
577
+ he: {
578
+ locale: "he",
579
+ countryCode: "IL",
580
+ flag: "🇮🇱",
581
+ dialCode: "+972",
582
+ nativeName: "\u05E2\u05D1\u05E8\u05D9\u05EA",
583
+ englishName: "Hebrew",
584
+ rtl: true,
585
+ currencyCode: "ILS",
586
+ dateFormat: "DD/MM/YYYY"
587
+ },
588
+ // 스와힐리어
589
+ sw: {
590
+ locale: "sw",
591
+ countryCode: "KE",
592
+ flag: "🇰🇪",
593
+ dialCode: "+254",
594
+ nativeName: "Kiswahili",
595
+ englishName: "Swahili",
596
+ currencyCode: "KES",
597
+ dateFormat: "DD/MM/YYYY"
598
+ }
599
+ };
46
600
  function getLocaleInfo(locale) {
47
601
  return LOCALE_INFO_MAP[locale];
48
602
  }
@@ -58,557 +612,8 @@ function getDialCode(locale) {
58
612
  function isRTL(locale) {
59
613
  return LOCALE_INFO_MAP[locale]?.rtl ?? false;
60
614
  }
61
- var LOCALE_COOKIE_KEY, LOCALE_INFO_MAP;
62
- var init_locale_constants = __esm({
63
- "src/lib/constants/locale.constants.ts"() {
64
- "use strict";
65
- LOCALE_COOKIE_KEY = "spfn-locale";
66
- LOCALE_INFO_MAP = {
67
- // 한국어
68
- ko: {
69
- locale: "ko",
70
- countryCode: "KR",
71
- flag: "🇰🇷",
72
- dialCode: "+82",
73
- nativeName: "\uD55C\uAD6D\uC5B4",
74
- englishName: "Korean",
75
- currencyCode: "KRW",
76
- dateFormat: "YYYY.MM.DD"
77
- },
78
- // 영어 (미국)
79
- en: {
80
- locale: "en",
81
- countryCode: "US",
82
- flag: "🇺🇸",
83
- dialCode: "+1",
84
- nativeName: "English",
85
- englishName: "English",
86
- currencyCode: "USD",
87
- dateFormat: "MM/DD/YYYY"
88
- },
89
- // 일본어
90
- ja: {
91
- locale: "ja",
92
- countryCode: "JP",
93
- flag: "🇯🇵",
94
- dialCode: "+81",
95
- nativeName: "\u65E5\u672C\u8A9E",
96
- englishName: "Japanese",
97
- currencyCode: "JPY",
98
- dateFormat: "YYYY/MM/DD"
99
- },
100
- // 중국어 (간체)
101
- zh: {
102
- locale: "zh",
103
- countryCode: "CN",
104
- flag: "🇨🇳",
105
- dialCode: "+86",
106
- nativeName: "\u7B80\u4F53\u4E2D\u6587",
107
- englishName: "Chinese (Simplified)",
108
- currencyCode: "CNY",
109
- dateFormat: "YYYY-MM-DD"
110
- },
111
- // 중국어 (번체, 대만)
112
- "zh-TW": {
113
- locale: "zh-TW",
114
- countryCode: "TW",
115
- flag: "🇹🇼",
116
- dialCode: "+886",
117
- nativeName: "\u7E41\u9AD4\u4E2D\u6587",
118
- englishName: "Chinese (Traditional)",
119
- currencyCode: "TWD",
120
- dateFormat: "YYYY/MM/DD"
121
- },
122
- // 스페인어
123
- es: {
124
- locale: "es",
125
- countryCode: "ES",
126
- flag: "🇪🇸",
127
- dialCode: "+34",
128
- nativeName: "Espa\xF1ol",
129
- englishName: "Spanish",
130
- currencyCode: "EUR",
131
- dateFormat: "DD/MM/YYYY"
132
- },
133
- // 프랑스어
134
- fr: {
135
- locale: "fr",
136
- countryCode: "FR",
137
- flag: "🇫🇷",
138
- dialCode: "+33",
139
- nativeName: "Fran\xE7ais",
140
- englishName: "French",
141
- currencyCode: "EUR",
142
- dateFormat: "DD/MM/YYYY"
143
- },
144
- // 독일어
145
- de: {
146
- locale: "de",
147
- countryCode: "DE",
148
- flag: "🇩🇪",
149
- dialCode: "+49",
150
- nativeName: "Deutsch",
151
- englishName: "German",
152
- currencyCode: "EUR",
153
- dateFormat: "DD.MM.YYYY"
154
- },
155
- // 이탈리아어
156
- it: {
157
- locale: "it",
158
- countryCode: "IT",
159
- flag: "🇮🇹",
160
- dialCode: "+39",
161
- nativeName: "Italiano",
162
- englishName: "Italian",
163
- currencyCode: "EUR",
164
- dateFormat: "DD/MM/YYYY"
165
- },
166
- // 포르투갈어 (브라질)
167
- pt: {
168
- locale: "pt",
169
- countryCode: "BR",
170
- flag: "🇧🇷",
171
- dialCode: "+55",
172
- nativeName: "Portugu\xEAs",
173
- englishName: "Portuguese",
174
- currencyCode: "BRL",
175
- dateFormat: "DD/MM/YYYY"
176
- },
177
- // 러시아어
178
- ru: {
179
- locale: "ru",
180
- countryCode: "RU",
181
- flag: "🇷🇺",
182
- dialCode: "+7",
183
- nativeName: "\u0420\u0443\u0441\u0441\u043A\u0438\u0439",
184
- englishName: "Russian",
185
- currencyCode: "RUB",
186
- dateFormat: "DD.MM.YYYY"
187
- },
188
- // 아랍어
189
- ar: {
190
- locale: "ar",
191
- countryCode: "SA",
192
- flag: "🇸🇦",
193
- dialCode: "+966",
194
- nativeName: "\u0627\u0644\u0639\u0631\u0628\u064A\u0629",
195
- englishName: "Arabic",
196
- rtl: true,
197
- currencyCode: "SAR",
198
- dateFormat: "DD/MM/YYYY"
199
- },
200
- // 힌디어
201
- hi: {
202
- locale: "hi",
203
- countryCode: "IN",
204
- flag: "🇮🇳",
205
- dialCode: "+91",
206
- nativeName: "\u0939\u093F\u0928\u094D\u0926\u0940",
207
- englishName: "Hindi",
208
- currencyCode: "INR",
209
- dateFormat: "DD/MM/YYYY"
210
- },
211
- // 태국어
212
- th: {
213
- locale: "th",
214
- countryCode: "TH",
215
- flag: "🇹🇭",
216
- dialCode: "+66",
217
- nativeName: "\u0E44\u0E17\u0E22",
218
- englishName: "Thai",
219
- currencyCode: "THB",
220
- dateFormat: "DD/MM/YYYY"
221
- },
222
- // 베트남어
223
- vi: {
224
- locale: "vi",
225
- countryCode: "VN",
226
- flag: "🇻🇳",
227
- dialCode: "+84",
228
- nativeName: "Ti\u1EBFng Vi\u1EC7t",
229
- englishName: "Vietnamese",
230
- currencyCode: "VND",
231
- dateFormat: "DD/MM/YYYY"
232
- },
233
- // 인도네시아어
234
- id: {
235
- locale: "id",
236
- countryCode: "ID",
237
- flag: "🇮🇩",
238
- dialCode: "+62",
239
- nativeName: "Bahasa Indonesia",
240
- englishName: "Indonesian",
241
- currencyCode: "IDR",
242
- dateFormat: "DD/MM/YYYY"
243
- },
244
- // 터키어
245
- tr: {
246
- locale: "tr",
247
- countryCode: "TR",
248
- flag: "🇹🇷",
249
- dialCode: "+90",
250
- nativeName: "T\xFCrk\xE7e",
251
- englishName: "Turkish",
252
- currencyCode: "TRY",
253
- dateFormat: "DD.MM.YYYY"
254
- },
255
- // 폴란드어
256
- pl: {
257
- locale: "pl",
258
- countryCode: "PL",
259
- flag: "🇵🇱",
260
- dialCode: "+48",
261
- nativeName: "Polski",
262
- englishName: "Polish",
263
- currencyCode: "PLN",
264
- dateFormat: "DD.MM.YYYY"
265
- },
266
- // 네덜란드어
267
- nl: {
268
- locale: "nl",
269
- countryCode: "NL",
270
- flag: "🇳🇱",
271
- dialCode: "+31",
272
- nativeName: "Nederlands",
273
- englishName: "Dutch",
274
- currencyCode: "EUR",
275
- dateFormat: "DD-MM-YYYY"
276
- },
277
- // 중국어 (홍콩)
278
- "zh-HK": {
279
- locale: "zh-HK",
280
- countryCode: "HK",
281
- flag: "🇭🇰",
282
- dialCode: "+852",
283
- nativeName: "\u7E41\u9AD4\u4E2D\u6587 (\u9999\u6E2F)",
284
- englishName: "Chinese (Hong Kong)",
285
- currencyCode: "HKD",
286
- dateFormat: "YYYY/MM/DD"
287
- },
288
- // 말레이어
289
- ms: {
290
- locale: "ms",
291
- countryCode: "MY",
292
- flag: "🇲🇾",
293
- dialCode: "+60",
294
- nativeName: "Bahasa Melayu",
295
- englishName: "Malay",
296
- currencyCode: "MYR",
297
- dateFormat: "DD/MM/YYYY"
298
- },
299
- // 영어 (영국)
300
- "en-GB": {
301
- locale: "en-GB",
302
- countryCode: "GB",
303
- flag: "🇬🇧",
304
- dialCode: "+44",
305
- nativeName: "English (UK)",
306
- englishName: "English (United Kingdom)",
307
- currencyCode: "GBP",
308
- dateFormat: "DD/MM/YYYY"
309
- },
310
- // 영어 (캐나다)
311
- "en-CA": {
312
- locale: "en-CA",
313
- countryCode: "CA",
314
- flag: "🇨🇦",
315
- dialCode: "+1",
316
- nativeName: "English (Canada)",
317
- englishName: "English (Canada)",
318
- currencyCode: "CAD",
319
- dateFormat: "YYYY-MM-DD"
320
- },
321
- // 영어 (호주)
322
- "en-AU": {
323
- locale: "en-AU",
324
- countryCode: "AU",
325
- flag: "🇦🇺",
326
- dialCode: "+61",
327
- nativeName: "English (Australia)",
328
- englishName: "English (Australia)",
329
- currencyCode: "AUD",
330
- dateFormat: "DD/MM/YYYY"
331
- },
332
- // 영어 (뉴질랜드)
333
- "en-NZ": {
334
- locale: "en-NZ",
335
- countryCode: "NZ",
336
- flag: "🇳🇿",
337
- dialCode: "+64",
338
- nativeName: "English (New Zealand)",
339
- englishName: "English (New Zealand)",
340
- currencyCode: "NZD",
341
- dateFormat: "DD/MM/YYYY"
342
- },
343
- // 스페인어 (멕시코)
344
- "es-MX": {
345
- locale: "es-MX",
346
- countryCode: "MX",
347
- flag: "🇲🇽",
348
- dialCode: "+52",
349
- nativeName: "Espa\xF1ol (M\xE9xico)",
350
- englishName: "Spanish (Mexico)",
351
- currencyCode: "MXN",
352
- dateFormat: "DD/MM/YYYY"
353
- },
354
- // 스페인어 (아르헨티나)
355
- "es-AR": {
356
- locale: "es-AR",
357
- countryCode: "AR",
358
- flag: "🇦🇷",
359
- dialCode: "+54",
360
- nativeName: "Espa\xF1ol (Argentina)",
361
- englishName: "Spanish (Argentina)",
362
- currencyCode: "ARS",
363
- dateFormat: "DD/MM/YYYY"
364
- },
365
- // 스페인어 (콜롬비아)
366
- "es-CO": {
367
- locale: "es-CO",
368
- countryCode: "CO",
369
- flag: "🇨🇴",
370
- dialCode: "+57",
371
- nativeName: "Espa\xF1ol (Colombia)",
372
- englishName: "Spanish (Colombia)",
373
- currencyCode: "COP",
374
- dateFormat: "DD/MM/YYYY"
375
- },
376
- // 스웨덴어
377
- sv: {
378
- locale: "sv",
379
- countryCode: "SE",
380
- flag: "🇸🇪",
381
- dialCode: "+46",
382
- nativeName: "Svenska",
383
- englishName: "Swedish",
384
- currencyCode: "SEK",
385
- dateFormat: "YYYY-MM-DD"
386
- },
387
- // 노르웨이어
388
- no: {
389
- locale: "no",
390
- countryCode: "NO",
391
- flag: "🇳🇴",
392
- dialCode: "+47",
393
- nativeName: "Norsk",
394
- englishName: "Norwegian",
395
- currencyCode: "NOK",
396
- dateFormat: "DD.MM.YYYY"
397
- },
398
- // 덴마크어
399
- da: {
400
- locale: "da",
401
- countryCode: "DK",
402
- flag: "🇩🇰",
403
- dialCode: "+45",
404
- nativeName: "Dansk",
405
- englishName: "Danish",
406
- currencyCode: "DKK",
407
- dateFormat: "DD-MM-YYYY"
408
- },
409
- // 핀란드어
410
- fi: {
411
- locale: "fi",
412
- countryCode: "FI",
413
- flag: "🇫🇮",
414
- dialCode: "+358",
415
- nativeName: "Suomi",
416
- englishName: "Finnish",
417
- currencyCode: "EUR",
418
- dateFormat: "DD.MM.YYYY"
419
- },
420
- // 우크라이나어
421
- uk: {
422
- locale: "uk",
423
- countryCode: "UA",
424
- flag: "🇺🇦",
425
- dialCode: "+380",
426
- nativeName: "\u0423\u043A\u0440\u0430\u0457\u043D\u0441\u044C\u043A\u0430",
427
- englishName: "Ukrainian",
428
- currencyCode: "UAH",
429
- dateFormat: "DD.MM.YYYY"
430
- },
431
- // 체코어
432
- cs: {
433
- locale: "cs",
434
- countryCode: "CZ",
435
- flag: "🇨🇿",
436
- dialCode: "+420",
437
- nativeName: "\u010Ce\u0161tina",
438
- englishName: "Czech",
439
- currencyCode: "CZK",
440
- dateFormat: "DD.MM.YYYY"
441
- },
442
- // 헝가리어
443
- hu: {
444
- locale: "hu",
445
- countryCode: "HU",
446
- flag: "🇭🇺",
447
- dialCode: "+36",
448
- nativeName: "Magyar",
449
- englishName: "Hungarian",
450
- currencyCode: "HUF",
451
- dateFormat: "YYYY.MM.DD."
452
- },
453
- // 루마니아어
454
- ro: {
455
- locale: "ro",
456
- countryCode: "RO",
457
- flag: "🇷🇴",
458
- dialCode: "+40",
459
- nativeName: "Rom\xE2n\u0103",
460
- englishName: "Romanian",
461
- currencyCode: "RON",
462
- dateFormat: "DD.MM.YYYY"
463
- },
464
- // 불가리아어
465
- bg: {
466
- locale: "bg",
467
- countryCode: "BG",
468
- flag: "🇧🇬",
469
- dialCode: "+359",
470
- nativeName: "\u0411\u044A\u043B\u0433\u0430\u0440\u0441\u043A\u0438",
471
- englishName: "Bulgarian",
472
- currencyCode: "BGN",
473
- dateFormat: "DD.MM.YYYY"
474
- },
475
- // 크로아티아어
476
- hr: {
477
- locale: "hr",
478
- countryCode: "HR",
479
- flag: "🇭🇷",
480
- dialCode: "+385",
481
- nativeName: "Hrvatski",
482
- englishName: "Croatian",
483
- currencyCode: "HRK",
484
- dateFormat: "DD.MM.YYYY."
485
- },
486
- // 세르비아어
487
- sr: {
488
- locale: "sr",
489
- countryCode: "RS",
490
- flag: "🇷🇸",
491
- dialCode: "+381",
492
- nativeName: "\u0421\u0440\u043F\u0441\u043A\u0438",
493
- englishName: "Serbian",
494
- currencyCode: "RSD",
495
- dateFormat: "DD.MM.YYYY."
496
- },
497
- // 슬로바키아어
498
- sk: {
499
- locale: "sk",
500
- countryCode: "SK",
501
- flag: "🇸🇰",
502
- dialCode: "+421",
503
- nativeName: "Sloven\u010Dina",
504
- englishName: "Slovak",
505
- currencyCode: "EUR",
506
- dateFormat: "DD.MM.YYYY"
507
- },
508
- // 슬로베니아어
509
- sl: {
510
- locale: "sl",
511
- countryCode: "SI",
512
- flag: "🇸🇮",
513
- dialCode: "+386",
514
- nativeName: "Sloven\u0161\u010Dina",
515
- englishName: "Slovenian",
516
- currencyCode: "EUR",
517
- dateFormat: "DD.MM.YYYY"
518
- },
519
- // 리투아니아어
520
- lt: {
521
- locale: "lt",
522
- countryCode: "LT",
523
- flag: "🇱🇹",
524
- dialCode: "+370",
525
- nativeName: "Lietuvi\u0173",
526
- englishName: "Lithuanian",
527
- currencyCode: "EUR",
528
- dateFormat: "YYYY-MM-DD"
529
- },
530
- // 라트비아어
531
- lv: {
532
- locale: "lv",
533
- countryCode: "LV",
534
- flag: "🇱🇻",
535
- dialCode: "+371",
536
- nativeName: "Latvie\u0161u",
537
- englishName: "Latvian",
538
- currencyCode: "EUR",
539
- dateFormat: "DD.MM.YYYY."
540
- },
541
- // 에스토니아어
542
- et: {
543
- locale: "et",
544
- countryCode: "EE",
545
- flag: "🇪🇪",
546
- dialCode: "+372",
547
- nativeName: "Eesti",
548
- englishName: "Estonian",
549
- currencyCode: "EUR",
550
- dateFormat: "DD.MM.YYYY"
551
- },
552
- // 그리스어
553
- el: {
554
- locale: "el",
555
- countryCode: "GR",
556
- flag: "🇬🇷",
557
- dialCode: "+30",
558
- nativeName: "\u0395\u03BB\u03BB\u03B7\u03BD\u03B9\u03BA\u03AC",
559
- englishName: "Greek",
560
- currencyCode: "EUR",
561
- dateFormat: "DD/MM/YYYY"
562
- },
563
- // 페르시아어
564
- fa: {
565
- locale: "fa",
566
- countryCode: "IR",
567
- flag: "🇮🇷",
568
- dialCode: "+98",
569
- nativeName: "\u0641\u0627\u0631\u0633\u06CC",
570
- englishName: "Persian",
571
- rtl: true,
572
- currencyCode: "IRR",
573
- dateFormat: "YYYY/MM/DD"
574
- },
575
- // 히브리어
576
- he: {
577
- locale: "he",
578
- countryCode: "IL",
579
- flag: "🇮🇱",
580
- dialCode: "+972",
581
- nativeName: "\u05E2\u05D1\u05E8\u05D9\u05EA",
582
- englishName: "Hebrew",
583
- rtl: true,
584
- currencyCode: "ILS",
585
- dateFormat: "DD/MM/YYYY"
586
- },
587
- // 스와힐리어
588
- sw: {
589
- locale: "sw",
590
- countryCode: "KE",
591
- flag: "🇰🇪",
592
- dialCode: "+254",
593
- nativeName: "Kiswahili",
594
- englishName: "Swahili",
595
- currencyCode: "KES",
596
- dateFormat: "DD/MM/YYYY"
597
- }
598
- };
599
- }
600
- });
601
615
 
602
616
  // src/server/helpers/locale.actions.ts
603
- var locale_actions_exports = {};
604
- __export(locale_actions_exports, {
605
- getLocale: () => getLocale,
606
- getLocaleWithInfo: () => getLocaleWithInfo,
607
- getLocales: () => getLocales,
608
- getLocalesWithInfo: () => getLocalesWithInfo,
609
- setLocale: () => setLocale
610
- });
611
- import { cookies, headers } from "next/headers";
612
617
  async function detectBrowserLanguage() {
613
618
  try {
614
619
  const headersList = await headers();
@@ -646,91 +651,6 @@ async function getLocale() {
646
651
  }
647
652
  return config.defaultLocale;
648
653
  }
649
- async function setLocale(locale) {
650
- const config = getCmsConfig();
651
- if (!config.supportedLocales.includes(locale)) {
652
- throw new Error(
653
- `Unsupported locale: ${locale}. Supported locales: ${config.supportedLocales.join(", ")}`
654
- );
655
- }
656
- const cookieStore = await cookies();
657
- cookieStore.set(LOCALE_COOKIE_KEY, locale, {
658
- path: "/",
659
- maxAge: 60 * 60 * 24 * 365,
660
- // 1년
661
- sameSite: "lax"
662
- });
663
- }
664
- async function getLocales() {
665
- const config = getCmsConfig();
666
- return config.supportedLocales;
667
- }
668
- async function getLocaleWithInfo() {
669
- const locale = await getLocale();
670
- const info = getLocaleInfo(locale);
671
- return { locale, info };
672
- }
673
- async function getLocalesWithInfo() {
674
- const config = getCmsConfig();
675
- const supportedLocales = config.supportedLocales;
676
- return supportedLocales.map((locale) => getLocaleInfo(locale)).filter((info) => info !== void 0);
677
- }
678
- var init_locale_actions = __esm({
679
- "src/server/helpers/locale.actions.ts"() {
680
- "use strict";
681
- "use server";
682
- init_cms_config();
683
- init_locale_constants();
684
- }
685
- });
686
-
687
- // src/server.ts
688
- import { cache } from "react";
689
- import { client } from "@spfn/core/client";
690
-
691
- // src/lib/contracts/published-cache.ts
692
- import { Type } from "@sinclair/typebox";
693
- var SectionData = Type.Object({
694
- section: Type.String(),
695
- locale: Type.String(),
696
- content: Type.Record(Type.String(), Type.Any()),
697
- version: Type.Number(),
698
- publishedAt: Type.Union([Type.String(), Type.Null()])
699
- });
700
- var getPublishedCacheContract = {
701
- method: "GET",
702
- path: "/published-cache",
703
- query: Type.Object({
704
- sections: Type.Union([
705
- Type.String({ description: "\uB2E8\uC77C \uC139\uC158 \uC774\uB984 (\uC608: home)" }),
706
- Type.Array(Type.String(), { description: '\uC5EC\uB7EC \uC139\uC158 \uC774\uB984 (\uC608: ["home", "footer"])' })
707
- ]),
708
- locale: Type.Optional(Type.String({ default: "ko", description: "\uC5B8\uC5B4 \uCF54\uB4DC" }))
709
- }),
710
- response: Type.Union([
711
- // 성공: 항상 배열로 반환
712
- Type.Array(SectionData),
713
- // 에러
714
- Type.Object({
715
- error: Type.String()
716
- })
717
- ])
718
- };
719
-
720
- // src/server.ts
721
- init_locale_actions();
722
-
723
- // src/server/helpers/locale.ts
724
- init_locale_actions();
725
- init_locale_constants();
726
- import "server-only";
727
- async function isValidLocale(locale) {
728
- const locales = await Promise.resolve().then(() => (init_locale_actions(), locale_actions_exports)).then((m) => m.getLocales());
729
- return locales.includes(locale);
730
- }
731
-
732
- // src/server.ts
733
- init_locale_constants();
734
654
 
735
655
  // src/server/helpers/sync.ts
736
656
  import { existsSync, readdirSync, readFileSync, statSync } from "fs";
@@ -1815,19 +1735,13 @@ export {
1815
1735
  flattenLabels,
1816
1736
  getDialCode,
1817
1737
  getFlag,
1818
- getLocale,
1819
1738
  getLocaleInfo,
1820
- getLocaleWithInfo,
1821
- getLocales,
1822
- getLocalesWithInfo,
1823
1739
  getSection,
1824
1740
  getSections,
1825
1741
  getSupportedLocales,
1826
1742
  initLabelSync,
1827
1743
  isRTL,
1828
- isValidLocale,
1829
1744
  loadLabelsFromJson,
1830
- setLocale,
1831
1745
  syncAll,
1832
1746
  syncSection
1833
1747
  };