@spfn/cms 0.1.0-alpha.88 → 0.2.0-beta.1

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 (97) hide show
  1. package/README.md +399 -50
  2. package/dist/actions.d.ts +15 -2
  3. package/dist/actions.js +15 -89
  4. package/dist/actions.js.map +1 -1
  5. package/dist/config.d.ts +39 -0
  6. package/dist/config.js +39 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/errors.d.ts +149 -0
  9. package/dist/errors.js +164 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/index.d.ts +107 -85
  12. package/dist/index.js +197 -610
  13. package/dist/index.js.map +1 -1
  14. package/dist/server.d.ts +41 -148
  15. package/dist/server.js +473 -1619
  16. package/dist/server.js.map +1 -1
  17. package/migrations/0000_medical_ozymandias.sql +44 -0
  18. package/migrations/meta/0000_snapshot.json +8 -237
  19. package/migrations/meta/_journal.json +2 -2
  20. package/package.json +26 -35
  21. package/dist/actions-BEFWwQsh.d.ts +0 -195
  22. package/dist/api.d.ts +0 -319
  23. package/dist/api.js +0 -467
  24. package/dist/api.js.map +0 -1
  25. package/dist/client.d.ts +0 -146
  26. package/dist/client.js +0 -1321
  27. package/dist/client.js.map +0 -1
  28. package/dist/index-Dh5FjWzR.d.ts +0 -112
  29. package/dist/label-sync-generator-B0EmvtWM.d.ts +0 -32
  30. package/dist/lib/contracts/labels.d.ts +0 -244
  31. package/dist/lib/contracts/labels.js +0 -269
  32. package/dist/lib/contracts/labels.js.map +0 -1
  33. package/dist/lib/contracts/published-cache.d.ts +0 -48
  34. package/dist/lib/contracts/published-cache.js +0 -49
  35. package/dist/lib/contracts/published-cache.js.map +0 -1
  36. package/dist/lib/contracts/values.d.ts +0 -71
  37. package/dist/lib/contracts/values.js +0 -104
  38. package/dist/lib/contracts/values.js.map +0 -1
  39. package/dist/locale.constants-BNkSdNP1.d.ts +0 -108
  40. package/dist/server/entities/cms-audit-logs.d.ts +0 -158
  41. package/dist/server/entities/cms-audit-logs.js +0 -78
  42. package/dist/server/entities/cms-audit-logs.js.map +0 -1
  43. package/dist/server/entities/cms-draft-cache.d.ts +0 -128
  44. package/dist/server/entities/cms-draft-cache.js +0 -42
  45. package/dist/server/entities/cms-draft-cache.js.map +0 -1
  46. package/dist/server/entities/cms-label-values.d.ts +0 -141
  47. package/dist/server/entities/cms-label-values.js +0 -81
  48. package/dist/server/entities/cms-label-values.js.map +0 -1
  49. package/dist/server/entities/cms-labels.d.ts +0 -192
  50. package/dist/server/entities/cms-labels.js +0 -46
  51. package/dist/server/entities/cms-labels.js.map +0 -1
  52. package/dist/server/entities/cms-published-cache.d.ts +0 -144
  53. package/dist/server/entities/cms-published-cache.js +0 -40
  54. package/dist/server/entities/cms-published-cache.js.map +0 -1
  55. package/dist/server/entities/cms-schema.d.ts +0 -5
  56. package/dist/server/entities/cms-schema.js +0 -7
  57. package/dist/server/entities/cms-schema.js.map +0 -1
  58. package/dist/server/entities/index.d.ts +0 -6
  59. package/dist/server/entities/index.js +0 -181
  60. package/dist/server/entities/index.js.map +0 -1
  61. package/dist/server/generators/index.d.ts +0 -19
  62. package/dist/server/generators/index.js +0 -727
  63. package/dist/server/generators/index.js.map +0 -1
  64. package/dist/server/labels/index.d.ts +0 -1
  65. package/dist/server/labels/index.js +0 -33
  66. package/dist/server/labels/index.js.map +0 -1
  67. package/dist/server/repositories/index.d.ts +0 -212
  68. package/dist/server/repositories/index.js +0 -414
  69. package/dist/server/repositories/index.js.map +0 -1
  70. package/dist/server/routes/labels/[id]/admin/index.js +0 -675
  71. package/dist/server/routes/labels/[id]/admin/index.js.map +0 -1
  72. package/dist/server/routes/labels/[id]/index.js +0 -572
  73. package/dist/server/routes/labels/[id]/index.js.map +0 -1
  74. package/dist/server/routes/labels/[id]/publish/index.js +0 -716
  75. package/dist/server/routes/labels/[id]/publish/index.js.map +0 -1
  76. package/dist/server/routes/labels/[id]/versions/index.js +0 -544
  77. package/dist/server/routes/labels/[id]/versions/index.js.map +0 -1
  78. package/dist/server/routes/labels/_id_/admin/index.d.ts +0 -11
  79. package/dist/server/routes/labels/_id_/index.d.ts +0 -12
  80. package/dist/server/routes/labels/_id_/publish/index.d.ts +0 -11
  81. package/dist/server/routes/labels/_id_/versions/index.d.ts +0 -11
  82. package/dist/server/routes/labels/by-key/[key]/index.js +0 -521
  83. package/dist/server/routes/labels/by-key/[key]/index.js.map +0 -1
  84. package/dist/server/routes/labels/by-key/_key_/index.d.ts +0 -10
  85. package/dist/server/routes/labels/index.d.ts +0 -12
  86. package/dist/server/routes/labels/index.js +0 -680
  87. package/dist/server/routes/labels/index.js.map +0 -1
  88. package/dist/server/routes/published-cache/index.d.ts +0 -11
  89. package/dist/server/routes/published-cache/index.js +0 -333
  90. package/dist/server/routes/published-cache/index.js.map +0 -1
  91. package/dist/server/routes/values/[labelId]/[version]/index.js +0 -453
  92. package/dist/server/routes/values/[labelId]/[version]/index.js.map +0 -1
  93. package/dist/server/routes/values/[labelId]/index.js +0 -448
  94. package/dist/server/routes/values/[labelId]/index.js.map +0 -1
  95. package/dist/server/routes/values/_labelId_/_version_/index.d.ts +0 -10
  96. package/dist/server/routes/values/_labelId_/index.d.ts +0 -10
  97. package/migrations/0000_milky_blockbuster.sql +0 -72
package/dist/index.d.ts CHANGED
@@ -1,116 +1,138 @@
1
- export { L as LOCALE_COOKIE_KEY, e as LOCALE_INFO_MAP, f as LocaleInfo, S as SupportedLocale, a as getAllLocales, d as getDialCode, c as getFlag, g as getLocaleInfo, b as getSupportedLocales, i as isRTL } from './locale.constants-BNkSdNP1.js';
2
- export { SectionAPI, SectionData } from './server.js';
3
- export { F as FlatLabel, a as LabelDefinition, L as LabelType, N as NestedLabels, S as SectionDefinition, b as SyncOptions, c as SyncResult } from './index-Dh5FjWzR.js';
4
- import './server/repositories/index.js';
5
- import './server/entities/cms-labels.js';
6
- import 'drizzle-orm/pg-core';
7
- import './server/entities/cms-label-values.js';
8
- import './server/entities/cms-draft-cache.js';
9
- import './server/entities/cms-published-cache.js';
10
- import './server/entities/cms-audit-logs.js';
11
- import './label-sync-generator-B0EmvtWM.js';
12
- import '@spfn/core/codegen';
1
+ import * as _spfn_core_nextjs from '@spfn/core/nextjs';
2
+ import * as _spfn_core_route from '@spfn/core/route';
3
+ import * as _sinclair_typebox from '@sinclair/typebox';
13
4
 
14
5
  /**
15
- * CMS Configuration Module
6
+ * Bind locale to labels, returning locale-specific values
16
7
  *
17
- * 환경변수 기반 CMS 설정 관리
18
- * - SPFN_CMS_DEFAULT_LOCALE: 기본 언어 (기본값: 'ko')
19
- * - SPFN_CMS_SUPPORTED_LOCALES: 지원 언어 목록, 쉼표로 구분 (기본값: 'ko,en')
20
- * - SPFN_CMS_DETECT_BROWSER_LANGUAGE: 브라우저 언어 자동 감지 (기본값: 'false')
8
+ * @example
9
+ * ```ts
10
+ * const labelsDefinition = defineLabels({
11
+ * home: {
12
+ * title: { en: "Home", ko: "홈" }
13
+ * }
14
+ * });
15
+ *
16
+ * const labels = bindLocale(labelsDefinition, 'ko');
17
+ * labels.home.title // "홈"
18
+ * ```
21
19
  */
22
20
  /**
23
- * CMS 설정 타입
21
+ * Type that converts locale records to strings
24
22
  */
25
- interface CmsConfig {
26
- /**
27
- * 기본 언어 코드
28
- * @example 'ko', 'en', 'ja'
29
- */
30
- defaultLocale: string;
31
- /**
32
- * 프로젝트에서 사용할 언어 목록
33
- * @example ['ko', 'en', 'ja']
34
- */
35
- locales: string[];
36
- /**
37
- * @deprecated Use 'locales' instead
38
- * @internal For backward compatibility
39
- */
40
- supportedLocales: string[];
41
- /**
42
- * 브라우저 언어 자동 감지 여부
43
- * @default true
44
- */
45
- detectBrowserLanguage: boolean;
46
- }
23
+ type BoundLabels<T> = {
24
+ [K in keyof T]: T[K] extends Record<string, any> ? IsLocaleRecord<T[K]> extends true ? string : BoundLabels<T[K]> : T[K];
25
+ };
47
26
  /**
48
- * CMS 설정 조회
49
- *
50
- * @returns 현재 CMS 설정
51
- *
52
- * @example
53
- * ```tsx
54
- * import { getCmsConfig } from '@spfn/cms';
55
- *
56
- * const config = getCmsConfig();
57
- * console.log(config.defaultLocale); // 'en'
58
- * console.log(config.locales); // ['en', 'ko']
59
- * ```
27
+ * Extract section keys from label definition
60
28
  */
61
- declare function getCmsConfig(): Readonly<CmsConfig>;
29
+ type SectionKeys<T> = Extract<keyof T, string>;
62
30
  /**
63
- * CMS 설정 변경 (런타임 오버라이드)
64
- *
65
- * 환경변수 설정을 런타임에 오버라이드합니다.
66
- * 주로 테스트나 특수한 경우에 사용됩니다.
67
- *
68
- * @param config - 변경할 설정 (부분 업데이트 가능)
31
+ * Get content of a single section (without section name wrapper)
32
+ */
33
+ type BoundLabelSection<T, K extends SectionKeys<T>> = BoundLabels<T>[K];
34
+ /**
35
+ * Pick specific sections from bound labels (for multiple sections)
36
+ */
37
+ type BoundLabelsSections<T, K extends SectionKeys<T>> = Pick<BoundLabels<T>, K>;
38
+ /**
39
+ * Check if object is a locale record (has string values only)
40
+ */
41
+ type IsLocaleRecord<T> = T extends Record<string, string> ? true : false;
42
+
43
+ /**
44
+ * Defines a type-safe label configuration.
69
45
  *
70
46
  * @example
71
- * ```tsx
72
- * import { configureCms } from '@spfn/cms';
73
- *
74
- * // 앱 초기화 시 (선택적)
75
- * configureCms({
47
+ * ```ts
48
+ * export const labelConfig = defineLabelConfig({
49
+ * locales: ['en', 'ar'] as const,
76
50
  * defaultLocale: 'en',
77
- * locales: ['en', 'ko', 'ja'],
78
- * detectBrowserLanguage: true,
51
+ * fallbackLocale: 'en', // Optional
79
52
  * });
53
+ *
54
+ * export type LabelConfig = typeof labelConfig;
55
+ * export type AppLocale = typeof labelConfig.locales[number]; // 'en' | 'ar'
80
56
  * ```
81
57
  */
82
- declare function configureCms(config: Partial<CmsConfig>): void;
58
+ declare function defineLabelConfig<const TLocales extends readonly string[]>(config: {
59
+ locales: TLocales;
60
+ defaultLocale: TLocales[number];
61
+ fallbackLocale?: TLocales[number];
62
+ useBrowserLanguage?: boolean;
63
+ }): {
64
+ locales: TLocales;
65
+ defaultLocale: TLocales[number];
66
+ fallbackLocale?: TLocales[number];
67
+ useBrowserLanguage?: boolean;
68
+ };
83
69
  /**
84
- * 설정 초기화 (환경변수에서 재로드)
70
+ * Define nested label structure (tRPC-style)
85
71
  *
86
72
  * @example
87
- * ```tsx
88
- * import { resetCmsConfig } from '@spfn/cms';
73
+ * ```ts
74
+ * export const labels = defineLabels({
75
+ * home: {
76
+ * slogan: { en: "Welcome", ko: "환영합니다" },
77
+ * hero: {
78
+ * title: { en: "Hello", ko: "안녕하세요" }
79
+ * }
80
+ * },
81
+ * about: {
82
+ * title: { en: "About Us", ko: "회사 소개" }
83
+ * }
84
+ * });
89
85
  *
90
- * // 환경변수 설정으로 되돌리기
91
- * resetCmsConfig();
86
+ * // Usage
87
+ * labels.home.slogan;
88
+ * labels.home.hero.title;
89
+ * labels.about.title;
92
90
  * ```
93
91
  */
94
- declare function resetCmsConfig(): void;
92
+ declare function defineLabels<const T>(labels: T): T;
93
+ declare function format(template: string, vars: Record<string, string | number>): string;
95
94
 
96
95
  /**
97
- * CMS Constants
98
- *
99
- * CMS 패키지에서 사용하는 전역 상수
100
- */
101
- /**
102
- * 기본 라벨 디렉토리 경로
96
+ * Create CMS client with API, label getters, and format utility
103
97
  *
104
- * JSON 라벨 파일이 저장되는 기본 디렉토리입니다.
105
- * 프로젝트 루트 기준 상대 경로입니다.
98
+ * @param labelsDefinition - Labels defined using defineLabels()
99
+ * @param config - Label config from defineLabelConfig()
100
+ * @returns API client, getLabel (single), getLabels (multiple), and format utility
106
101
  *
107
102
  * @example
108
103
  * ```typescript
109
- * import { DEFAULT_LABELS_DIR } from '@spfn/cms';
104
+ * // labels.ts - Setup once
105
+ * export const { api, getLabel, getLabels, format } = createCmsClient(labelsDefinition, labelConfig);
110
106
  *
111
- * console.log(DEFAULT_LABELS_DIR); // 'src/lib/labels'
107
+ * // Single section - direct access
108
+ * const label = await getLabel('home');
109
+ * label.hero.title // "Hello" (no section name!)
110
+ *
111
+ * // Multiple sections - with section names
112
+ * const labels = await getLabels(['home', 'about']);
113
+ * labels.home.hero.title // "Hello"
114
+ * labels.about.title // "About Us"
115
+ *
116
+ * // With template variables
117
+ * const greeting = label.hero.greeting; // "Hello {name}"
118
+ * format(greeting, { name: "John" }); // "Hello John"
112
119
  * ```
113
120
  */
114
- declare const DEFAULT_LABELS_DIR = "src/lib/labels";
121
+ declare function createCmsClient<T>(labelsDefinition: T, config: {
122
+ defaultLocale: string;
123
+ fallbackLocale?: string;
124
+ }): {
125
+ api: _spfn_core_nextjs.Client<_spfn_core_route.Router<{
126
+ getLabelCache: _spfn_core_route.RouteDef<{
127
+ query: _sinclair_typebox.TObject<{
128
+ sections: _sinclair_typebox.TArray<_sinclair_typebox.TString>;
129
+ locale: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
130
+ }>;
131
+ }, {}, Record<string, any>>;
132
+ }>>;
133
+ getLabel: <K extends SectionKeys<T>>(section: K) => Promise<BoundLabelSection<T, K>>;
134
+ getLabels: <K extends SectionKeys<T>>(sections: readonly K[]) => Promise<BoundLabelsSections<T, K>>;
135
+ format: typeof format;
136
+ };
115
137
 
116
- export { type CmsConfig, DEFAULT_LABELS_DIR, configureCms, getCmsConfig, resetCmsConfig };
138
+ export { type BoundLabelSection, type BoundLabels, type BoundLabelsSections, type SectionKeys, createCmsClient, defineLabelConfig, defineLabels, format };