@spfn/cms 0.1.0-alpha.6 → 0.1.0-alpha.60
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/actions.d.ts +140 -6
- package/dist/actions.js +97 -10
- package/dist/actions.js.map +1 -1
- package/dist/client.d.ts +43 -9
- package/dist/client.js +406 -56
- package/dist/client.js.map +1 -1
- package/dist/contracts/labels.d.ts +149 -0
- package/dist/contracts/labels.js +166 -0
- package/dist/contracts/labels.js.map +1 -0
- package/dist/contracts/published-cache.d.ts +25 -0
- package/dist/contracts/published-cache.js +32 -0
- package/dist/contracts/published-cache.js.map +1 -0
- package/dist/contracts/values.d.ts +69 -0
- package/dist/contracts/values.js +100 -0
- package/dist/contracts/values.js.map +1 -0
- package/dist/entities/cms-audit-logs.d.ts +15 -70
- package/dist/entities/cms-audit-logs.js +75 -100
- package/dist/entities/cms-audit-logs.js.map +1 -1
- package/dist/entities/cms-draft-cache.d.ts +13 -73
- package/dist/entities/cms-draft-cache.js +35 -109
- package/dist/entities/cms-draft-cache.js.map +1 -1
- package/dist/entities/cms-label-values.d.ts +14 -65
- package/dist/entities/cms-label-values.js +78 -102
- package/dist/entities/cms-label-values.js.map +1 -1
- package/dist/entities/cms-label-versions.d.ts +16 -49
- package/dist/entities/cms-label-versions.js +73 -77
- package/dist/entities/cms-label-versions.js.map +1 -1
- package/dist/entities/cms-labels.d.ts +17 -14
- package/dist/entities/cms-labels.js +39 -45
- package/dist/entities/cms-labels.js.map +1 -1
- package/dist/entities/cms-published-cache.d.ts +14 -69
- package/dist/entities/cms-published-cache.js +33 -100
- package/dist/entities/cms-published-cache.js.map +1 -1
- package/dist/entities/index.d.ts +7 -10
- package/dist/entities/index.js +217 -9
- package/dist/entities/index.js.map +1 -1
- package/dist/generators/index.d.ts +8 -7
- package/dist/generators/index.js +657 -17
- package/dist/generators/index.js.map +1 -1
- package/dist/index.d.ts +134 -20
- package/dist/index.js +1115 -23
- package/dist/index.js.map +1 -1
- package/dist/{generators/label-sync-generator.d.ts → label-sync-generator-lQrcVfja.d.ts} +9 -6
- package/dist/labels/index.d.ts +31 -4
- package/dist/labels/index.js +31 -6
- package/dist/labels/index.js.map +1 -1
- package/dist/repositories/index.d.ts +205 -6
- package/dist/repositories/index.js +435 -8
- package/dist/repositories/index.js.map +1 -1
- package/dist/routes/labels/[id]/index.js +499 -89
- package/dist/routes/labels/[id]/index.js.map +1 -1
- package/dist/routes/labels/{[id] → _id_}/index.d.ts +5 -3
- package/dist/routes/labels/by-key/[key]/index.js +453 -29
- package/dist/routes/labels/by-key/[key]/index.js.map +1 -1
- package/dist/routes/labels/by-key/_key_/index.d.ts +10 -0
- package/dist/routes/labels/index.d.ts +5 -3
- package/dist/routes/labels/index.js +488 -68
- package/dist/routes/labels/index.js.map +1 -1
- package/dist/routes/published-cache/index.d.ts +5 -3
- package/dist/routes/published-cache/index.js +325 -30
- package/dist/routes/published-cache/index.js.map +1 -1
- package/dist/routes/values/[labelId]/[version]/index.js +467 -41
- package/dist/routes/values/[labelId]/[version]/index.js.map +1 -1
- package/dist/routes/values/[labelId]/index.js +463 -39
- package/dist/routes/values/[labelId]/index.js.map +1 -1
- package/dist/routes/values/_labelId_/_version_/index.d.ts +10 -0
- package/dist/routes/values/_labelId_/index.d.ts +10 -0
- package/dist/server.d.ts +17 -7
- package/dist/server.js +263 -252
- package/dist/server.js.map +1 -1
- package/dist/store.d.ts +8 -14
- package/dist/store.js +396 -198
- package/dist/store.js.map +1 -1
- package/dist/types.d.ts +14 -7
- package/dist/types.js +0 -6
- package/dist/types.js.map +1 -1
- package/migrations/0000_condemned_centennial.sql +89 -0
- package/migrations/meta/0000_snapshot.json +687 -0
- package/migrations/meta/_journal.json +13 -0
- package/package.json +33 -16
- package/dist/actions.d.ts.map +0 -1
- package/dist/client.d.ts.map +0 -1
- package/dist/cms.config.d.ts +0 -77
- package/dist/cms.config.d.ts.map +0 -1
- package/dist/cms.config.js +0 -111
- package/dist/cms.config.js.map +0 -1
- package/dist/entities/cms-audit-logs.d.ts.map +0 -1
- package/dist/entities/cms-draft-cache.d.ts.map +0 -1
- package/dist/entities/cms-label-values.d.ts.map +0 -1
- package/dist/entities/cms-label-versions.d.ts.map +0 -1
- package/dist/entities/cms-labels.d.ts.map +0 -1
- package/dist/entities/cms-published-cache.d.ts.map +0 -1
- package/dist/entities/index.d.ts.map +0 -1
- package/dist/generators/index.d.ts.map +0 -1
- package/dist/generators/label-sync-generator.d.ts.map +0 -1
- package/dist/generators/label-sync-generator.js +0 -87
- package/dist/generators/label-sync-generator.js.map +0 -1
- package/dist/helpers/locale.actions.d.ts +0 -132
- package/dist/helpers/locale.actions.d.ts.map +0 -1
- package/dist/helpers/locale.actions.js +0 -210
- package/dist/helpers/locale.actions.js.map +0 -1
- package/dist/helpers/locale.constants.d.ts +0 -10
- package/dist/helpers/locale.constants.d.ts.map +0 -1
- package/dist/helpers/locale.constants.js +0 -10
- package/dist/helpers/locale.constants.js.map +0 -1
- package/dist/helpers/locale.d.ts +0 -17
- package/dist/helpers/locale.d.ts.map +0 -1
- package/dist/helpers/locale.js +0 -20
- package/dist/helpers/locale.js.map +0 -1
- package/dist/helpers/sync.d.ts +0 -41
- package/dist/helpers/sync.d.ts.map +0 -1
- package/dist/helpers/sync.js +0 -309
- package/dist/helpers/sync.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/init.d.ts +0 -31
- package/dist/init.d.ts.map +0 -1
- package/dist/init.js +0 -36
- package/dist/init.js.map +0 -1
- package/dist/labels/helpers.d.ts +0 -31
- package/dist/labels/helpers.d.ts.map +0 -1
- package/dist/labels/helpers.js +0 -60
- package/dist/labels/helpers.js.map +0 -1
- package/dist/labels/index.d.ts.map +0 -1
- package/dist/repositories/cms-draft-cache.repository.d.ts +0 -62
- package/dist/repositories/cms-draft-cache.repository.d.ts.map +0 -1
- package/dist/repositories/cms-draft-cache.repository.js +0 -56
- package/dist/repositories/cms-draft-cache.repository.js.map +0 -1
- package/dist/repositories/cms-label-values.repository.d.ts +0 -32
- package/dist/repositories/cms-label-values.repository.d.ts.map +0 -1
- package/dist/repositories/cms-label-values.repository.js +0 -72
- package/dist/repositories/cms-label-values.repository.js.map +0 -1
- package/dist/repositories/cms-labels.repository.d.ts +0 -53
- package/dist/repositories/cms-labels.repository.d.ts.map +0 -1
- package/dist/repositories/cms-labels.repository.js +0 -77
- package/dist/repositories/cms-labels.repository.js.map +0 -1
- package/dist/repositories/cms-published-cache.repository.d.ts +0 -53
- package/dist/repositories/cms-published-cache.repository.d.ts.map +0 -1
- package/dist/repositories/cms-published-cache.repository.js +0 -54
- package/dist/repositories/cms-published-cache.repository.js.map +0 -1
- package/dist/repositories/index.d.ts.map +0 -1
- package/dist/routes/labels/[id]/contract.d.ts +0 -68
- package/dist/routes/labels/[id]/contract.d.ts.map +0 -1
- package/dist/routes/labels/[id]/contract.js +0 -84
- package/dist/routes/labels/[id]/contract.js.map +0 -1
- package/dist/routes/labels/[id]/index.d.ts.map +0 -1
- package/dist/routes/labels/by-key/[key]/contract.d.ts +0 -24
- package/dist/routes/labels/by-key/[key]/contract.d.ts.map +0 -1
- package/dist/routes/labels/by-key/[key]/contract.js +0 -28
- package/dist/routes/labels/by-key/[key]/contract.js.map +0 -1
- package/dist/routes/labels/by-key/[key]/index.d.ts +0 -8
- package/dist/routes/labels/by-key/[key]/index.d.ts.map +0 -1
- package/dist/routes/labels/contract.d.ts +0 -59
- package/dist/routes/labels/contract.d.ts.map +0 -1
- package/dist/routes/labels/contract.js +0 -75
- package/dist/routes/labels/contract.js.map +0 -1
- package/dist/routes/labels/index.d.ts.map +0 -1
- package/dist/routes/published-cache/contract.d.ts +0 -25
- package/dist/routes/published-cache/contract.d.ts.map +0 -1
- package/dist/routes/published-cache/contract.js +0 -35
- package/dist/routes/published-cache/contract.js.map +0 -1
- package/dist/routes/published-cache/index.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/[version]/contract.d.ts +0 -29
- package/dist/routes/values/[labelId]/[version]/contract.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/[version]/contract.js +0 -33
- package/dist/routes/values/[labelId]/[version]/contract.js.map +0 -1
- package/dist/routes/values/[labelId]/[version]/index.d.ts +0 -8
- package/dist/routes/values/[labelId]/[version]/index.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/contract.d.ts +0 -38
- package/dist/routes/values/[labelId]/contract.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/contract.js +0 -59
- package/dist/routes/values/[labelId]/contract.js.map +0 -1
- package/dist/routes/values/[labelId]/index.d.ts +0 -8
- package/dist/routes/values/[labelId]/index.d.ts.map +0 -1
- package/dist/server.d.ts.map +0 -1
- package/dist/store.d.ts.map +0 -1
- package/dist/types.d.ts.map +0 -1
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* CMS Label Values Entity
|
|
3
5
|
*
|
|
@@ -7,11 +9,11 @@
|
|
|
7
9
|
* - 버전 관리 (version)
|
|
8
10
|
* - JSONB로 유연한 값 저장
|
|
9
11
|
*/
|
|
10
|
-
|
|
12
|
+
declare const cmsLabelValues: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
11
13
|
name: "label_values";
|
|
12
14
|
schema: string;
|
|
13
15
|
columns: {
|
|
14
|
-
id:
|
|
16
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
15
17
|
name: "id";
|
|
16
18
|
tableName: "label_values";
|
|
17
19
|
dataType: "number";
|
|
@@ -28,7 +30,7 @@ export declare const cmsLabelValues: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
28
30
|
identity: undefined;
|
|
29
31
|
generated: undefined;
|
|
30
32
|
}, {}, {}>;
|
|
31
|
-
labelId:
|
|
33
|
+
labelId: drizzle_orm_pg_core.PgColumn<{
|
|
32
34
|
name: "label_id";
|
|
33
35
|
tableName: "label_values";
|
|
34
36
|
dataType: "number";
|
|
@@ -45,7 +47,7 @@ export declare const cmsLabelValues: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
45
47
|
identity: undefined;
|
|
46
48
|
generated: undefined;
|
|
47
49
|
}, {}, {}>;
|
|
48
|
-
version:
|
|
50
|
+
version: drizzle_orm_pg_core.PgColumn<{
|
|
49
51
|
name: "version";
|
|
50
52
|
tableName: "label_values";
|
|
51
53
|
dataType: "number";
|
|
@@ -62,7 +64,7 @@ export declare const cmsLabelValues: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
62
64
|
identity: undefined;
|
|
63
65
|
generated: undefined;
|
|
64
66
|
}, {}, {}>;
|
|
65
|
-
locale:
|
|
67
|
+
locale: drizzle_orm_pg_core.PgColumn<{
|
|
66
68
|
name: "locale";
|
|
67
69
|
tableName: "label_values";
|
|
68
70
|
dataType: "string";
|
|
@@ -79,7 +81,7 @@ export declare const cmsLabelValues: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
79
81
|
identity: undefined;
|
|
80
82
|
generated: undefined;
|
|
81
83
|
}, {}, {}>;
|
|
82
|
-
breakpoint:
|
|
84
|
+
breakpoint: drizzle_orm_pg_core.PgColumn<{
|
|
83
85
|
name: "breakpoint";
|
|
84
86
|
tableName: "label_values";
|
|
85
87
|
dataType: "string";
|
|
@@ -96,7 +98,7 @@ export declare const cmsLabelValues: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
96
98
|
identity: undefined;
|
|
97
99
|
generated: undefined;
|
|
98
100
|
}, {}, {}>;
|
|
99
|
-
value:
|
|
101
|
+
value: drizzle_orm_pg_core.PgColumn<{
|
|
100
102
|
name: "value";
|
|
101
103
|
tableName: "label_values";
|
|
102
104
|
dataType: "json";
|
|
@@ -113,7 +115,7 @@ export declare const cmsLabelValues: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
113
115
|
identity: undefined;
|
|
114
116
|
generated: undefined;
|
|
115
117
|
}, {}, {}>;
|
|
116
|
-
createdAt:
|
|
118
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
117
119
|
name: "created_at";
|
|
118
120
|
tableName: "label_values";
|
|
119
121
|
dataType: "date";
|
|
@@ -133,60 +135,7 @@ export declare const cmsLabelValues: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
133
135
|
};
|
|
134
136
|
dialect: "pg";
|
|
135
137
|
}>;
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
*
|
|
141
|
-
* // 텍스트 값 저장
|
|
142
|
-
* await db.insert(cmsLabelValues).values({
|
|
143
|
-
* labelId: 1,
|
|
144
|
-
* version: 1,
|
|
145
|
-
* locale: 'ko',
|
|
146
|
-
* breakpoint: null,
|
|
147
|
-
* value: {
|
|
148
|
-
* type: 'text',
|
|
149
|
-
* content: '미래를 만드는 기업'
|
|
150
|
-
* }
|
|
151
|
-
* });
|
|
152
|
-
*
|
|
153
|
-
* // 반응형 이미지 저장 (모바일용)
|
|
154
|
-
* await db.insert(cmsLabelValues).values({
|
|
155
|
-
* labelId: 2,
|
|
156
|
-
* version: 1,
|
|
157
|
-
* locale: 'ko',
|
|
158
|
-
* breakpoint: 'sm',
|
|
159
|
-
* value: {
|
|
160
|
-
* type: 'image',
|
|
161
|
-
* url: '/uploads/hero-mobile.jpg',
|
|
162
|
-
* alt: 'Hero Image',
|
|
163
|
-
* width: 640,
|
|
164
|
-
* height: 480
|
|
165
|
-
* }
|
|
166
|
-
* });
|
|
167
|
-
*
|
|
168
|
-
* // 특정 버전의 한국어 값 조회
|
|
169
|
-
* const values = await db.select()
|
|
170
|
-
* .from(cmsLabelValues)
|
|
171
|
-
* .where(and(
|
|
172
|
-
* eq(cmsLabelValues.labelId, 1),
|
|
173
|
-
* eq(cmsLabelValues.version, 2),
|
|
174
|
-
* eq(cmsLabelValues.locale, 'ko')
|
|
175
|
-
* ));
|
|
176
|
-
*
|
|
177
|
-
* // Object 타입 값 저장 (재귀 구조)
|
|
178
|
-
* await db.insert(cmsLabelValues).values({
|
|
179
|
-
* labelId: 3,
|
|
180
|
-
* version: 1,
|
|
181
|
-
* locale: 'ko',
|
|
182
|
-
* value: {
|
|
183
|
-
* type: 'object',
|
|
184
|
-
* fields: {
|
|
185
|
-
* title: { type: 'text', content: '특징 1' },
|
|
186
|
-
* icon: { type: 'image', url: '/icons/feature1.svg', alt: 'Icon' },
|
|
187
|
-
* description: { type: 'text', content: '상세 설명...' }
|
|
188
|
-
* }
|
|
189
|
-
* }
|
|
190
|
-
* });
|
|
191
|
-
*/
|
|
192
|
-
//# sourceMappingURL=cms-label-values.d.ts.map
|
|
138
|
+
type CmsLabelValue = typeof cmsLabelValues.$inferSelect;
|
|
139
|
+
type NewCmsLabelValue = typeof cmsLabelValues.$inferInsert;
|
|
140
|
+
|
|
141
|
+
export { type CmsLabelValue, type NewCmsLabelValue, cmsLabelValues };
|
|
@@ -1,105 +1,81 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
// - FileValue: { type: "file", url: string, filename: string, size?: number }
|
|
38
|
-
// - ObjectValue: { type: "object", fields: Record<string, LabelValue> }
|
|
39
|
-
// 생성 시각
|
|
40
|
-
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
|
|
1
|
+
// src/entities/cms-label-values.ts
|
|
2
|
+
import { serial as serial2, integer as integer2, text as text2, jsonb, timestamp as timestamp2, index as index2, unique } from "drizzle-orm/pg-core";
|
|
3
|
+
import { createFunctionSchema as createFunctionSchema2 } from "@spfn/core/db";
|
|
4
|
+
|
|
5
|
+
// src/entities/cms-labels.ts
|
|
6
|
+
import { index, integer, serial, text, timestamp } from "drizzle-orm/pg-core";
|
|
7
|
+
import { createFunctionSchema } from "@spfn/core/db";
|
|
8
|
+
var schema = createFunctionSchema("@spfn/cms");
|
|
9
|
+
var cmsLabels = schema.table("labels", {
|
|
10
|
+
// Primary Key
|
|
11
|
+
id: serial("id").primaryKey(),
|
|
12
|
+
// 라벨 식별자
|
|
13
|
+
key: text("key").notNull().unique(),
|
|
14
|
+
// 예: "home.hero.title", "why-futureplay.hero.subtitle"
|
|
15
|
+
// 구조: {section}.{component}.{property}
|
|
16
|
+
// 섹션 분류 (페이지 단위)
|
|
17
|
+
section: text("section").notNull(),
|
|
18
|
+
// 예: "home", "why-futureplay", "team"
|
|
19
|
+
// 값 타입
|
|
20
|
+
type: text("type").notNull(),
|
|
21
|
+
// "text" | "image" | "video" | "file" | "object"
|
|
22
|
+
// 기본값
|
|
23
|
+
defaultValue: text("default_value"),
|
|
24
|
+
// 라벨의 기본값 (sync 시 설정)
|
|
25
|
+
// 설명
|
|
26
|
+
description: text("description"),
|
|
27
|
+
// 라벨에 대한 설명 (optional)
|
|
28
|
+
// 현재 발행된 버전 번호
|
|
29
|
+
publishedVersion: integer("published_version"),
|
|
30
|
+
// null = 미발행 상태
|
|
31
|
+
// 1, 2, 3... = 발행된 버전 번호
|
|
32
|
+
// 생성자 추적
|
|
33
|
+
createdBy: text("created_by"),
|
|
34
|
+
// 타임스탬프
|
|
35
|
+
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
|
36
|
+
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow()
|
|
41
37
|
}, (table) => [
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
index('cms_label_values_label_version_idx')
|
|
47
|
-
.on(table.labelId, table.version),
|
|
48
|
-
// 인덱스: locale 필터링 최적화
|
|
49
|
-
index('cms_label_values_locale_idx').on(table.locale),
|
|
38
|
+
// 인덱스: 섹션별 조회 최적화
|
|
39
|
+
index("cms_labels_section_idx").on(table.section),
|
|
40
|
+
// 인덱스: key로 조회 최적화 (unique 제약으로 자동 생성되지만 명시)
|
|
41
|
+
index("cms_labels_key_idx").on(table.key)
|
|
50
42
|
]);
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
*
|
|
90
|
-
* // Object 타입 값 저장 (재귀 구조)
|
|
91
|
-
* await db.insert(cmsLabelValues).values({
|
|
92
|
-
* labelId: 3,
|
|
93
|
-
* version: 1,
|
|
94
|
-
* locale: 'ko',
|
|
95
|
-
* value: {
|
|
96
|
-
* type: 'object',
|
|
97
|
-
* fields: {
|
|
98
|
-
* title: { type: 'text', content: '특징 1' },
|
|
99
|
-
* icon: { type: 'image', url: '/icons/feature1.svg', alt: 'Icon' },
|
|
100
|
-
* description: { type: 'text', content: '상세 설명...' }
|
|
101
|
-
* }
|
|
102
|
-
* }
|
|
103
|
-
* });
|
|
104
|
-
*/
|
|
43
|
+
|
|
44
|
+
// src/entities/cms-label-values.ts
|
|
45
|
+
var schema2 = createFunctionSchema2("@spfn/cms");
|
|
46
|
+
var cmsLabelValues = schema2.table("label_values", {
|
|
47
|
+
// Primary Key
|
|
48
|
+
id: serial2("id").primaryKey(),
|
|
49
|
+
// Foreign Key: cms_labels
|
|
50
|
+
labelId: integer2("label_id").notNull().references(() => cmsLabels.id, { onDelete: "cascade" }),
|
|
51
|
+
// 버전 번호
|
|
52
|
+
version: integer2("version").notNull().default(1),
|
|
53
|
+
// 언어 코드
|
|
54
|
+
locale: text2("locale").notNull().default("ko"),
|
|
55
|
+
// "ko" | "en" | "ja"
|
|
56
|
+
// 반응형 브레이크포인트
|
|
57
|
+
breakpoint: text2("breakpoint"),
|
|
58
|
+
// null = 기본값 (모든 화면 크기)
|
|
59
|
+
// "sm" | "md" | "lg" | "xl" | "2xl"
|
|
60
|
+
// 실제 값 (JSONB)
|
|
61
|
+
value: jsonb("value").notNull(),
|
|
62
|
+
// LabelValue 타입:
|
|
63
|
+
// - TextValue: { type: "text", content: string }
|
|
64
|
+
// - ImageValue: { type: "image", url: string, alt?: string, width?: number, height?: number }
|
|
65
|
+
// - VideoValue: { type: "video", url: string, thumbnail?: string, duration?: number }
|
|
66
|
+
// - FileValue: { type: "file", url: string, filename: string, size?: number }
|
|
67
|
+
// - ObjectValue: { type: "object", fields: Record<string, LabelValue> }
|
|
68
|
+
// 생성 시각
|
|
69
|
+
createdAt: timestamp2("created_at", { withTimezone: true }).notNull().defaultNow()
|
|
70
|
+
}, (table) => [
|
|
71
|
+
// UNIQUE 제약: 같은 버전에서 locale + breakpoint 조합은 유일
|
|
72
|
+
unique("cms_label_values_locale_breakpoint_unique").on(table.labelId, table.version, table.locale, table.breakpoint),
|
|
73
|
+
// 인덱스: labelId + version 복합 조회 최적화
|
|
74
|
+
index2("cms_label_values_label_version_idx").on(table.labelId, table.version),
|
|
75
|
+
// 인덱스: locale 필터링 최적화
|
|
76
|
+
index2("cms_label_values_locale_idx").on(table.locale)
|
|
77
|
+
]);
|
|
78
|
+
export {
|
|
79
|
+
cmsLabelValues
|
|
80
|
+
};
|
|
105
81
|
//# sourceMappingURL=cms-label-values.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"
|
|
1
|
+
{"version":3,"sources":["../../src/entities/cms-label-values.ts","../../src/entities/cms-labels.ts"],"sourcesContent":["/**\n * CMS Label Values Entity\n *\n * 라벨의 실제 값을 저장합니다.\n * - 다국어 지원 (locale)\n * - 반응형 지원 (breakpoint)\n * - 버전 관리 (version)\n * - JSONB로 유연한 값 저장\n */\n\nimport { serial, integer, text, jsonb, timestamp, index, unique } from 'drizzle-orm/pg-core';\nimport { createFunctionSchema } from '@spfn/core/db';\nimport { cmsLabels } from './cms-labels';\n\n// Create isolated schema for @spfn/cms\nconst schema = createFunctionSchema('@spfn/cms');\n\nexport const cmsLabelValues = schema.table('label_values', {\n // Primary Key\n id: serial('id').primaryKey(),\n\n // Foreign Key: cms_labels\n labelId: integer('label_id')\n .notNull()\n .references(() => cmsLabels.id, { onDelete: 'cascade' }),\n\n // 버전 번호\n version: integer('version').notNull().default(1),\n\n // 언어 코드\n locale: text('locale').notNull().default('ko'),\n // \"ko\" | \"en\" | \"ja\"\n\n // 반응형 브레이크포인트\n breakpoint: text('breakpoint'),\n // null = 기본값 (모든 화면 크기)\n // \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\"\n\n // 실제 값 (JSONB)\n value: jsonb('value').notNull(),\n // LabelValue 타입:\n // - TextValue: { type: \"text\", content: string }\n // - ImageValue: { type: \"image\", url: string, alt?: string, width?: number, height?: number }\n // - VideoValue: { type: \"video\", url: string, thumbnail?: string, duration?: number }\n // - FileValue: { type: \"file\", url: string, filename: string, size?: number }\n // - ObjectValue: { type: \"object\", fields: Record<string, LabelValue> }\n\n // 생성 시각\n createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n}, (table) => [\n // UNIQUE 제약: 같은 버전에서 locale + breakpoint 조합은 유일\n unique('cms_label_values_locale_breakpoint_unique')\n .on(table.labelId, table.version, table.locale, table.breakpoint),\n\n // 인덱스: labelId + version 복합 조회 최적화\n index('cms_label_values_label_version_idx')\n .on(table.labelId, table.version),\n\n // 인덱스: locale 필터링 최적화\n index('cms_label_values_locale_idx').on(table.locale),\n]);\n\n// 타입 추론\nexport type CmsLabelValue = typeof cmsLabelValues.$inferSelect;\nexport type NewCmsLabelValue = typeof cmsLabelValues.$inferInsert;\n\n/**\n * 사용 예시:\n *\n * // 텍스트 값 저장\n * await db.insert(cmsLabelValues).values({\n * labelId: 1,\n * version: 1,\n * locale: 'ko',\n * breakpoint: null,\n * value: {\n * type: 'text',\n * content: '미래를 만드는 기업'\n * }\n * });\n *\n * // 반응형 이미지 저장 (모바일용)\n * await db.insert(cmsLabelValues).values({\n * labelId: 2,\n * version: 1,\n * locale: 'ko',\n * breakpoint: 'sm',\n * value: {\n * type: 'image',\n * url: '/uploads/hero-mobile.jpg',\n * alt: 'Hero Image',\n * width: 640,\n * height: 480\n * }\n * });\n *\n * // 특정 버전의 한국어 값 조회\n * const values = await db.select()\n * .from(cmsLabelValues)\n * .where(and(\n * eq(cmsLabelValues.labelId, 1),\n * eq(cmsLabelValues.version, 2),\n * eq(cmsLabelValues.locale, 'ko')\n * ));\n *\n * // Object 타입 값 저장 (재귀 구조)\n * await db.insert(cmsLabelValues).values({\n * labelId: 3,\n * version: 1,\n * locale: 'ko',\n * value: {\n * type: 'object',\n * fields: {\n * title: { type: 'text', content: '특징 1' },\n * icon: { type: 'image', url: '/icons/feature1.svg', alt: 'Icon' },\n * description: { type: 'text', content: '상세 설명...' }\n * }\n * }\n * });\n */","/**\n * CMS Labels Entity\n *\n * 라벨의 메타데이터와 현재 발행 상태를 관리합니다.\n * - 라벨 식별 (id, key)\n * - 섹션 분류 (section)\n * - 타입 정의 (type)\n * - 발행 상태 (publishedVersion)\n */\n\nimport { index, integer, serial, text, timestamp } from 'drizzle-orm/pg-core';\nimport { createFunctionSchema } from '@spfn/core/db';\n\n// Create isolated schema for @spfn/cms\nconst schema = createFunctionSchema('@spfn/cms');\n\nexport const cmsLabels = schema.table('labels', {\n // Primary Key\n id: serial('id').primaryKey(),\n\n // 라벨 식별자\n key: text('key').notNull().unique(),\n // 예: \"home.hero.title\", \"why-futureplay.hero.subtitle\"\n // 구조: {section}.{component}.{property}\n\n // 섹션 분류 (페이지 단위)\n section: text('section').notNull(),\n // 예: \"home\", \"why-futureplay\", \"team\"\n\n // 값 타입\n type: text('type').notNull(),\n // \"text\" | \"image\" | \"video\" | \"file\" | \"object\"\n\n // 기본값\n defaultValue: text('default_value'),\n // 라벨의 기본값 (sync 시 설정)\n\n // 설명\n description: text('description'),\n // 라벨에 대한 설명 (optional)\n\n // 현재 발행된 버전 번호\n publishedVersion: integer('published_version'),\n // null = 미발행 상태\n // 1, 2, 3... = 발행된 버전 번호\n\n // 생성자 추적\n createdBy: text('created_by'),\n\n // 타임스탬프\n createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),\n}, (table) => [\n // 인덱스: 섹션별 조회 최적화\n index('cms_labels_section_idx').on(table.section),\n\n // 인덱스: key로 조회 최적화 (unique 제약으로 자동 생성되지만 명시)\n index('cms_labels_key_idx').on(table.key),\n]);\n\n// 타입 추론\nexport type CmsLabel = typeof cmsLabels.$inferSelect;\nexport type NewCmsLabel = typeof cmsLabels.$inferInsert;"],"mappings":";AAUA,SAAS,UAAAA,SAAQ,WAAAC,UAAS,QAAAC,OAAM,OAAO,aAAAC,YAAW,SAAAC,QAAO,cAAc;AACvE,SAAS,wBAAAC,6BAA4B;;;ACDrC,SAAS,OAAO,SAAS,QAAQ,MAAM,iBAAiB;AACxD,SAAS,4BAA4B;AAGrC,IAAM,SAAS,qBAAqB,WAAW;AAExC,IAAM,YAAY,OAAO,MAAM,UAAU;AAAA;AAAA,EAE5C,IAAI,OAAO,IAAI,EAAE,WAAW;AAAA;AAAA,EAG5B,KAAK,KAAK,KAAK,EAAE,QAAQ,EAAE,OAAO;AAAA;AAAA;AAAA;AAAA,EAKlC,SAAS,KAAK,SAAS,EAAE,QAAQ;AAAA;AAAA;AAAA,EAIjC,MAAM,KAAK,MAAM,EAAE,QAAQ;AAAA;AAAA;AAAA,EAI3B,cAAc,KAAK,eAAe;AAAA;AAAA;AAAA,EAIlC,aAAa,KAAK,aAAa;AAAA;AAAA;AAAA,EAI/B,kBAAkB,QAAQ,mBAAmB;AAAA;AAAA;AAAA;AAAA,EAK7C,WAAW,KAAK,YAAY;AAAA;AAAA,EAG5B,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AAAA,EAChF,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AACpF,GAAG,CAAC,UAAU;AAAA;AAAA,EAEV,MAAM,wBAAwB,EAAE,GAAG,MAAM,OAAO;AAAA;AAAA,EAGhD,MAAM,oBAAoB,EAAE,GAAG,MAAM,GAAG;AAC5C,CAAC;;;AD3CD,IAAMC,UAASC,sBAAqB,WAAW;AAExC,IAAM,iBAAiBD,QAAO,MAAM,gBAAgB;AAAA;AAAA,EAEvD,IAAIE,QAAO,IAAI,EAAE,WAAW;AAAA;AAAA,EAG5B,SAASC,SAAQ,UAAU,EACtB,QAAQ,EACR,WAAW,MAAM,UAAU,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA;AAAA,EAG3D,SAASA,SAAQ,SAAS,EAAE,QAAQ,EAAE,QAAQ,CAAC;AAAA;AAAA,EAG/C,QAAQC,MAAK,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA;AAAA,EAI7C,YAAYA,MAAK,YAAY;AAAA;AAAA;AAAA;AAAA,EAK7B,OAAO,MAAM,OAAO,EAAE,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS9B,WAAWC,WAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AACpF,GAAG,CAAC,UAAU;AAAA;AAAA,EAEV,OAAO,2CAA2C,EAC7C,GAAG,MAAM,SAAS,MAAM,SAAS,MAAM,QAAQ,MAAM,UAAU;AAAA;AAAA,EAGpEC,OAAM,oCAAoC,EACrC,GAAG,MAAM,SAAS,MAAM,OAAO;AAAA;AAAA,EAGpCA,OAAM,6BAA6B,EAAE,GAAG,MAAM,MAAM;AACxD,CAAC;","names":["serial","integer","text","timestamp","index","createFunctionSchema","schema","createFunctionSchema","serial","integer","text","timestamp","index"]}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* CMS Label Versions Entity
|
|
3
5
|
*
|
|
@@ -6,11 +8,11 @@
|
|
|
6
8
|
* - 발행 정보 (publishedAt, publishedBy)
|
|
7
9
|
* - 버전 노트
|
|
8
10
|
*/
|
|
9
|
-
|
|
11
|
+
declare const cmsLabelVersions: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
10
12
|
name: "label_versions";
|
|
11
13
|
schema: string;
|
|
12
14
|
columns: {
|
|
13
|
-
id:
|
|
15
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
14
16
|
name: "id";
|
|
15
17
|
tableName: "label_versions";
|
|
16
18
|
dataType: "number";
|
|
@@ -27,7 +29,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
27
29
|
identity: undefined;
|
|
28
30
|
generated: undefined;
|
|
29
31
|
}, {}, {}>;
|
|
30
|
-
labelId:
|
|
32
|
+
labelId: drizzle_orm_pg_core.PgColumn<{
|
|
31
33
|
name: "label_id";
|
|
32
34
|
tableName: "label_versions";
|
|
33
35
|
dataType: "number";
|
|
@@ -44,7 +46,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
44
46
|
identity: undefined;
|
|
45
47
|
generated: undefined;
|
|
46
48
|
}, {}, {}>;
|
|
47
|
-
version:
|
|
49
|
+
version: drizzle_orm_pg_core.PgColumn<{
|
|
48
50
|
name: "version";
|
|
49
51
|
tableName: "label_versions";
|
|
50
52
|
dataType: "number";
|
|
@@ -61,7 +63,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
61
63
|
identity: undefined;
|
|
62
64
|
generated: undefined;
|
|
63
65
|
}, {}, {}>;
|
|
64
|
-
status:
|
|
66
|
+
status: drizzle_orm_pg_core.PgColumn<{
|
|
65
67
|
name: "status";
|
|
66
68
|
tableName: "label_versions";
|
|
67
69
|
dataType: "string";
|
|
@@ -78,7 +80,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
78
80
|
identity: undefined;
|
|
79
81
|
generated: undefined;
|
|
80
82
|
}, {}, {}>;
|
|
81
|
-
publishedAt:
|
|
83
|
+
publishedAt: drizzle_orm_pg_core.PgColumn<{
|
|
82
84
|
name: "published_at";
|
|
83
85
|
tableName: "label_versions";
|
|
84
86
|
dataType: "date";
|
|
@@ -95,7 +97,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
95
97
|
identity: undefined;
|
|
96
98
|
generated: undefined;
|
|
97
99
|
}, {}, {}>;
|
|
98
|
-
publishedBy:
|
|
100
|
+
publishedBy: drizzle_orm_pg_core.PgColumn<{
|
|
99
101
|
name: "published_by";
|
|
100
102
|
tableName: "label_versions";
|
|
101
103
|
dataType: "string";
|
|
@@ -112,7 +114,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
112
114
|
identity: undefined;
|
|
113
115
|
generated: undefined;
|
|
114
116
|
}, {}, {}>;
|
|
115
|
-
notes:
|
|
117
|
+
notes: drizzle_orm_pg_core.PgColumn<{
|
|
116
118
|
name: "notes";
|
|
117
119
|
tableName: "label_versions";
|
|
118
120
|
dataType: "string";
|
|
@@ -129,7 +131,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
129
131
|
identity: undefined;
|
|
130
132
|
generated: undefined;
|
|
131
133
|
}, {}, {}>;
|
|
132
|
-
createdBy:
|
|
134
|
+
createdBy: drizzle_orm_pg_core.PgColumn<{
|
|
133
135
|
name: "created_by";
|
|
134
136
|
tableName: "label_versions";
|
|
135
137
|
dataType: "string";
|
|
@@ -146,7 +148,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
146
148
|
identity: undefined;
|
|
147
149
|
generated: undefined;
|
|
148
150
|
}, {}, {}>;
|
|
149
|
-
createdAt:
|
|
151
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
150
152
|
name: "created_at";
|
|
151
153
|
tableName: "label_versions";
|
|
152
154
|
dataType: "date";
|
|
@@ -166,42 +168,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
166
168
|
};
|
|
167
169
|
dialect: "pg";
|
|
168
170
|
}>;
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
*
|
|
174
|
-
* // 새 버전 생성 (draft)
|
|
175
|
-
* await db.insert(cmsLabelVersions).values({
|
|
176
|
-
* labelId: 1,
|
|
177
|
-
* version: 2,
|
|
178
|
-
* status: 'draft',
|
|
179
|
-
* notes: '문구 개선',
|
|
180
|
-
* createdBy: 'editor@futureplay.com'
|
|
181
|
-
* });
|
|
182
|
-
*
|
|
183
|
-
* // 버전 발행
|
|
184
|
-
* await db.update(cmsLabelVersions)
|
|
185
|
-
* .set({
|
|
186
|
-
* status: 'published',
|
|
187
|
-
* publishedAt: new Date(),
|
|
188
|
-
* publishedBy: 'admin@futureplay.com'
|
|
189
|
-
* })
|
|
190
|
-
* .where(and(
|
|
191
|
-
* eq(cmsLabelVersions.labelId, 1),
|
|
192
|
-
* eq(cmsLabelVersions.version, 2)
|
|
193
|
-
* ));
|
|
194
|
-
*
|
|
195
|
-
* // 라벨의 모든 버전 조회
|
|
196
|
-
* const versions = await db.select()
|
|
197
|
-
* .from(cmsLabelVersions)
|
|
198
|
-
* .where(eq(cmsLabelVersions.labelId, 1))
|
|
199
|
-
* .orderBy(desc(cmsLabelVersions.version));
|
|
200
|
-
*
|
|
201
|
-
* // 발행된 버전만 조회
|
|
202
|
-
* const published = await db.select()
|
|
203
|
-
* .from(cmsLabelVersions)
|
|
204
|
-
* .where(eq(cmsLabelVersions.status, 'published'))
|
|
205
|
-
* .orderBy(desc(cmsLabelVersions.publishedAt));
|
|
206
|
-
*/
|
|
207
|
-
//# sourceMappingURL=cms-label-versions.d.ts.map
|
|
171
|
+
type CmsLabelVersion = typeof cmsLabelVersions.$inferSelect;
|
|
172
|
+
type NewCmsLabelVersion = typeof cmsLabelVersions.$inferInsert;
|
|
173
|
+
|
|
174
|
+
export { type CmsLabelVersion, type NewCmsLabelVersion, cmsLabelVersions };
|