@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.
- package/README.md +399 -50
- package/dist/actions.d.ts +15 -2
- package/dist/actions.js +15 -89
- package/dist/actions.js.map +1 -1
- package/dist/config.d.ts +39 -0
- package/dist/config.js +39 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +149 -0
- package/dist/errors.js +164 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +107 -85
- package/dist/index.js +197 -610
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +41 -148
- package/dist/server.js +473 -1619
- package/dist/server.js.map +1 -1
- package/migrations/0000_medical_ozymandias.sql +44 -0
- package/migrations/meta/0000_snapshot.json +8 -237
- package/migrations/meta/_journal.json +2 -2
- package/package.json +26 -35
- package/dist/actions-BEFWwQsh.d.ts +0 -195
- package/dist/api.d.ts +0 -319
- package/dist/api.js +0 -467
- package/dist/api.js.map +0 -1
- package/dist/client.d.ts +0 -146
- package/dist/client.js +0 -1321
- package/dist/client.js.map +0 -1
- package/dist/index-Dh5FjWzR.d.ts +0 -112
- package/dist/label-sync-generator-B0EmvtWM.d.ts +0 -32
- package/dist/lib/contracts/labels.d.ts +0 -244
- package/dist/lib/contracts/labels.js +0 -269
- package/dist/lib/contracts/labels.js.map +0 -1
- package/dist/lib/contracts/published-cache.d.ts +0 -48
- package/dist/lib/contracts/published-cache.js +0 -49
- package/dist/lib/contracts/published-cache.js.map +0 -1
- package/dist/lib/contracts/values.d.ts +0 -71
- package/dist/lib/contracts/values.js +0 -104
- package/dist/lib/contracts/values.js.map +0 -1
- package/dist/locale.constants-BNkSdNP1.d.ts +0 -108
- package/dist/server/entities/cms-audit-logs.d.ts +0 -158
- package/dist/server/entities/cms-audit-logs.js +0 -78
- package/dist/server/entities/cms-audit-logs.js.map +0 -1
- package/dist/server/entities/cms-draft-cache.d.ts +0 -128
- package/dist/server/entities/cms-draft-cache.js +0 -42
- package/dist/server/entities/cms-draft-cache.js.map +0 -1
- package/dist/server/entities/cms-label-values.d.ts +0 -141
- package/dist/server/entities/cms-label-values.js +0 -81
- package/dist/server/entities/cms-label-values.js.map +0 -1
- package/dist/server/entities/cms-labels.d.ts +0 -192
- package/dist/server/entities/cms-labels.js +0 -46
- package/dist/server/entities/cms-labels.js.map +0 -1
- package/dist/server/entities/cms-published-cache.d.ts +0 -144
- package/dist/server/entities/cms-published-cache.js +0 -40
- package/dist/server/entities/cms-published-cache.js.map +0 -1
- package/dist/server/entities/cms-schema.d.ts +0 -5
- package/dist/server/entities/cms-schema.js +0 -7
- package/dist/server/entities/cms-schema.js.map +0 -1
- package/dist/server/entities/index.d.ts +0 -6
- package/dist/server/entities/index.js +0 -181
- package/dist/server/entities/index.js.map +0 -1
- package/dist/server/generators/index.d.ts +0 -19
- package/dist/server/generators/index.js +0 -727
- package/dist/server/generators/index.js.map +0 -1
- package/dist/server/labels/index.d.ts +0 -1
- package/dist/server/labels/index.js +0 -33
- package/dist/server/labels/index.js.map +0 -1
- package/dist/server/repositories/index.d.ts +0 -212
- package/dist/server/repositories/index.js +0 -414
- package/dist/server/repositories/index.js.map +0 -1
- package/dist/server/routes/labels/[id]/admin/index.js +0 -675
- package/dist/server/routes/labels/[id]/admin/index.js.map +0 -1
- package/dist/server/routes/labels/[id]/index.js +0 -572
- package/dist/server/routes/labels/[id]/index.js.map +0 -1
- package/dist/server/routes/labels/[id]/publish/index.js +0 -716
- package/dist/server/routes/labels/[id]/publish/index.js.map +0 -1
- package/dist/server/routes/labels/[id]/versions/index.js +0 -544
- package/dist/server/routes/labels/[id]/versions/index.js.map +0 -1
- package/dist/server/routes/labels/_id_/admin/index.d.ts +0 -11
- package/dist/server/routes/labels/_id_/index.d.ts +0 -12
- package/dist/server/routes/labels/_id_/publish/index.d.ts +0 -11
- package/dist/server/routes/labels/_id_/versions/index.d.ts +0 -11
- package/dist/server/routes/labels/by-key/[key]/index.js +0 -521
- package/dist/server/routes/labels/by-key/[key]/index.js.map +0 -1
- package/dist/server/routes/labels/by-key/_key_/index.d.ts +0 -10
- package/dist/server/routes/labels/index.d.ts +0 -12
- package/dist/server/routes/labels/index.js +0 -680
- package/dist/server/routes/labels/index.js.map +0 -1
- package/dist/server/routes/published-cache/index.d.ts +0 -11
- package/dist/server/routes/published-cache/index.js +0 -333
- package/dist/server/routes/published-cache/index.js.map +0 -1
- package/dist/server/routes/values/[labelId]/[version]/index.js +0 -453
- package/dist/server/routes/values/[labelId]/[version]/index.js.map +0 -1
- package/dist/server/routes/values/[labelId]/index.js +0 -448
- package/dist/server/routes/values/[labelId]/index.js.map +0 -1
- package/dist/server/routes/values/_labelId_/_version_/index.d.ts +0 -10
- package/dist/server/routes/values/_labelId_/index.d.ts +0 -10
- package/migrations/0000_milky_blockbuster.sql +0 -72
package/dist/index.d.ts
CHANGED
|
@@ -1,116 +1,138 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
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
|
-
*
|
|
6
|
+
* Bind locale to labels, returning locale-specific values
|
|
16
7
|
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
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
|
-
*
|
|
21
|
+
* Type that converts locale records to strings
|
|
24
22
|
*/
|
|
25
|
-
|
|
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
|
-
*
|
|
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
|
-
|
|
29
|
+
type SectionKeys<T> = Extract<keyof T, string>;
|
|
62
30
|
/**
|
|
63
|
-
*
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
*
|
|
68
|
-
|
|
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
|
-
* ```
|
|
72
|
-
*
|
|
73
|
-
*
|
|
74
|
-
* // 앱 초기화 시 (선택적)
|
|
75
|
-
* configureCms({
|
|
47
|
+
* ```ts
|
|
48
|
+
* export const labelConfig = defineLabelConfig({
|
|
49
|
+
* locales: ['en', 'ar'] as const,
|
|
76
50
|
* defaultLocale: 'en',
|
|
77
|
-
*
|
|
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
|
|
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
|
-
* ```
|
|
88
|
-
*
|
|
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
|
-
*
|
|
86
|
+
* // Usage
|
|
87
|
+
* labels.home.slogan;
|
|
88
|
+
* labels.home.hero.title;
|
|
89
|
+
* labels.about.title;
|
|
92
90
|
* ```
|
|
93
91
|
*/
|
|
94
|
-
declare function
|
|
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
|
|
98
|
-
*
|
|
99
|
-
* CMS 패키지에서 사용하는 전역 상수
|
|
100
|
-
*/
|
|
101
|
-
/**
|
|
102
|
-
* 기본 라벨 디렉토리 경로
|
|
96
|
+
* Create CMS client with API, label getters, and format utility
|
|
103
97
|
*
|
|
104
|
-
*
|
|
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
|
-
*
|
|
104
|
+
* // labels.ts - Setup once
|
|
105
|
+
* export const { api, getLabel, getLabels, format } = createCmsClient(labelsDefinition, labelConfig);
|
|
110
106
|
*
|
|
111
|
-
*
|
|
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
|
|
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
|
|
138
|
+
export { type BoundLabelSection, type BoundLabels, type BoundLabelsSections, type SectionKeys, createCmsClient, defineLabelConfig, defineLabels, format };
|