@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.
Files changed (176) hide show
  1. package/dist/actions.d.ts +140 -6
  2. package/dist/actions.js +97 -10
  3. package/dist/actions.js.map +1 -1
  4. package/dist/client.d.ts +43 -9
  5. package/dist/client.js +406 -56
  6. package/dist/client.js.map +1 -1
  7. package/dist/contracts/labels.d.ts +149 -0
  8. package/dist/contracts/labels.js +166 -0
  9. package/dist/contracts/labels.js.map +1 -0
  10. package/dist/contracts/published-cache.d.ts +25 -0
  11. package/dist/contracts/published-cache.js +32 -0
  12. package/dist/contracts/published-cache.js.map +1 -0
  13. package/dist/contracts/values.d.ts +69 -0
  14. package/dist/contracts/values.js +100 -0
  15. package/dist/contracts/values.js.map +1 -0
  16. package/dist/entities/cms-audit-logs.d.ts +15 -70
  17. package/dist/entities/cms-audit-logs.js +75 -100
  18. package/dist/entities/cms-audit-logs.js.map +1 -1
  19. package/dist/entities/cms-draft-cache.d.ts +13 -73
  20. package/dist/entities/cms-draft-cache.js +35 -109
  21. package/dist/entities/cms-draft-cache.js.map +1 -1
  22. package/dist/entities/cms-label-values.d.ts +14 -65
  23. package/dist/entities/cms-label-values.js +78 -102
  24. package/dist/entities/cms-label-values.js.map +1 -1
  25. package/dist/entities/cms-label-versions.d.ts +16 -49
  26. package/dist/entities/cms-label-versions.js +73 -77
  27. package/dist/entities/cms-label-versions.js.map +1 -1
  28. package/dist/entities/cms-labels.d.ts +17 -14
  29. package/dist/entities/cms-labels.js +39 -45
  30. package/dist/entities/cms-labels.js.map +1 -1
  31. package/dist/entities/cms-published-cache.d.ts +14 -69
  32. package/dist/entities/cms-published-cache.js +33 -100
  33. package/dist/entities/cms-published-cache.js.map +1 -1
  34. package/dist/entities/index.d.ts +7 -10
  35. package/dist/entities/index.js +217 -9
  36. package/dist/entities/index.js.map +1 -1
  37. package/dist/generators/index.d.ts +8 -7
  38. package/dist/generators/index.js +657 -17
  39. package/dist/generators/index.js.map +1 -1
  40. package/dist/index.d.ts +134 -20
  41. package/dist/index.js +1115 -23
  42. package/dist/index.js.map +1 -1
  43. package/dist/{generators/label-sync-generator.d.ts → label-sync-generator-lQrcVfja.d.ts} +9 -6
  44. package/dist/labels/index.d.ts +31 -4
  45. package/dist/labels/index.js +31 -6
  46. package/dist/labels/index.js.map +1 -1
  47. package/dist/repositories/index.d.ts +205 -6
  48. package/dist/repositories/index.js +435 -8
  49. package/dist/repositories/index.js.map +1 -1
  50. package/dist/routes/labels/[id]/index.js +499 -89
  51. package/dist/routes/labels/[id]/index.js.map +1 -1
  52. package/dist/routes/labels/{[id] → _id_}/index.d.ts +5 -3
  53. package/dist/routes/labels/by-key/[key]/index.js +453 -29
  54. package/dist/routes/labels/by-key/[key]/index.js.map +1 -1
  55. package/dist/routes/labels/by-key/_key_/index.d.ts +10 -0
  56. package/dist/routes/labels/index.d.ts +5 -3
  57. package/dist/routes/labels/index.js +488 -68
  58. package/dist/routes/labels/index.js.map +1 -1
  59. package/dist/routes/published-cache/index.d.ts +5 -3
  60. package/dist/routes/published-cache/index.js +325 -30
  61. package/dist/routes/published-cache/index.js.map +1 -1
  62. package/dist/routes/values/[labelId]/[version]/index.js +467 -41
  63. package/dist/routes/values/[labelId]/[version]/index.js.map +1 -1
  64. package/dist/routes/values/[labelId]/index.js +463 -39
  65. package/dist/routes/values/[labelId]/index.js.map +1 -1
  66. package/dist/routes/values/_labelId_/_version_/index.d.ts +10 -0
  67. package/dist/routes/values/_labelId_/index.d.ts +10 -0
  68. package/dist/server.d.ts +17 -7
  69. package/dist/server.js +263 -252
  70. package/dist/server.js.map +1 -1
  71. package/dist/store.d.ts +8 -14
  72. package/dist/store.js +396 -198
  73. package/dist/store.js.map +1 -1
  74. package/dist/types.d.ts +14 -7
  75. package/dist/types.js +0 -6
  76. package/dist/types.js.map +1 -1
  77. package/migrations/0000_condemned_centennial.sql +89 -0
  78. package/migrations/meta/0000_snapshot.json +687 -0
  79. package/migrations/meta/_journal.json +13 -0
  80. package/package.json +33 -16
  81. package/dist/actions.d.ts.map +0 -1
  82. package/dist/client.d.ts.map +0 -1
  83. package/dist/cms.config.d.ts +0 -77
  84. package/dist/cms.config.d.ts.map +0 -1
  85. package/dist/cms.config.js +0 -111
  86. package/dist/cms.config.js.map +0 -1
  87. package/dist/entities/cms-audit-logs.d.ts.map +0 -1
  88. package/dist/entities/cms-draft-cache.d.ts.map +0 -1
  89. package/dist/entities/cms-label-values.d.ts.map +0 -1
  90. package/dist/entities/cms-label-versions.d.ts.map +0 -1
  91. package/dist/entities/cms-labels.d.ts.map +0 -1
  92. package/dist/entities/cms-published-cache.d.ts.map +0 -1
  93. package/dist/entities/index.d.ts.map +0 -1
  94. package/dist/generators/index.d.ts.map +0 -1
  95. package/dist/generators/label-sync-generator.d.ts.map +0 -1
  96. package/dist/generators/label-sync-generator.js +0 -87
  97. package/dist/generators/label-sync-generator.js.map +0 -1
  98. package/dist/helpers/locale.actions.d.ts +0 -132
  99. package/dist/helpers/locale.actions.d.ts.map +0 -1
  100. package/dist/helpers/locale.actions.js +0 -210
  101. package/dist/helpers/locale.actions.js.map +0 -1
  102. package/dist/helpers/locale.constants.d.ts +0 -10
  103. package/dist/helpers/locale.constants.d.ts.map +0 -1
  104. package/dist/helpers/locale.constants.js +0 -10
  105. package/dist/helpers/locale.constants.js.map +0 -1
  106. package/dist/helpers/locale.d.ts +0 -17
  107. package/dist/helpers/locale.d.ts.map +0 -1
  108. package/dist/helpers/locale.js +0 -20
  109. package/dist/helpers/locale.js.map +0 -1
  110. package/dist/helpers/sync.d.ts +0 -41
  111. package/dist/helpers/sync.d.ts.map +0 -1
  112. package/dist/helpers/sync.js +0 -309
  113. package/dist/helpers/sync.js.map +0 -1
  114. package/dist/index.d.ts.map +0 -1
  115. package/dist/init.d.ts +0 -31
  116. package/dist/init.d.ts.map +0 -1
  117. package/dist/init.js +0 -36
  118. package/dist/init.js.map +0 -1
  119. package/dist/labels/helpers.d.ts +0 -31
  120. package/dist/labels/helpers.d.ts.map +0 -1
  121. package/dist/labels/helpers.js +0 -60
  122. package/dist/labels/helpers.js.map +0 -1
  123. package/dist/labels/index.d.ts.map +0 -1
  124. package/dist/repositories/cms-draft-cache.repository.d.ts +0 -62
  125. package/dist/repositories/cms-draft-cache.repository.d.ts.map +0 -1
  126. package/dist/repositories/cms-draft-cache.repository.js +0 -56
  127. package/dist/repositories/cms-draft-cache.repository.js.map +0 -1
  128. package/dist/repositories/cms-label-values.repository.d.ts +0 -32
  129. package/dist/repositories/cms-label-values.repository.d.ts.map +0 -1
  130. package/dist/repositories/cms-label-values.repository.js +0 -72
  131. package/dist/repositories/cms-label-values.repository.js.map +0 -1
  132. package/dist/repositories/cms-labels.repository.d.ts +0 -53
  133. package/dist/repositories/cms-labels.repository.d.ts.map +0 -1
  134. package/dist/repositories/cms-labels.repository.js +0 -77
  135. package/dist/repositories/cms-labels.repository.js.map +0 -1
  136. package/dist/repositories/cms-published-cache.repository.d.ts +0 -53
  137. package/dist/repositories/cms-published-cache.repository.d.ts.map +0 -1
  138. package/dist/repositories/cms-published-cache.repository.js +0 -54
  139. package/dist/repositories/cms-published-cache.repository.js.map +0 -1
  140. package/dist/repositories/index.d.ts.map +0 -1
  141. package/dist/routes/labels/[id]/contract.d.ts +0 -68
  142. package/dist/routes/labels/[id]/contract.d.ts.map +0 -1
  143. package/dist/routes/labels/[id]/contract.js +0 -84
  144. package/dist/routes/labels/[id]/contract.js.map +0 -1
  145. package/dist/routes/labels/[id]/index.d.ts.map +0 -1
  146. package/dist/routes/labels/by-key/[key]/contract.d.ts +0 -24
  147. package/dist/routes/labels/by-key/[key]/contract.d.ts.map +0 -1
  148. package/dist/routes/labels/by-key/[key]/contract.js +0 -28
  149. package/dist/routes/labels/by-key/[key]/contract.js.map +0 -1
  150. package/dist/routes/labels/by-key/[key]/index.d.ts +0 -8
  151. package/dist/routes/labels/by-key/[key]/index.d.ts.map +0 -1
  152. package/dist/routes/labels/contract.d.ts +0 -59
  153. package/dist/routes/labels/contract.d.ts.map +0 -1
  154. package/dist/routes/labels/contract.js +0 -75
  155. package/dist/routes/labels/contract.js.map +0 -1
  156. package/dist/routes/labels/index.d.ts.map +0 -1
  157. package/dist/routes/published-cache/contract.d.ts +0 -25
  158. package/dist/routes/published-cache/contract.d.ts.map +0 -1
  159. package/dist/routes/published-cache/contract.js +0 -35
  160. package/dist/routes/published-cache/contract.js.map +0 -1
  161. package/dist/routes/published-cache/index.d.ts.map +0 -1
  162. package/dist/routes/values/[labelId]/[version]/contract.d.ts +0 -29
  163. package/dist/routes/values/[labelId]/[version]/contract.d.ts.map +0 -1
  164. package/dist/routes/values/[labelId]/[version]/contract.js +0 -33
  165. package/dist/routes/values/[labelId]/[version]/contract.js.map +0 -1
  166. package/dist/routes/values/[labelId]/[version]/index.d.ts +0 -8
  167. package/dist/routes/values/[labelId]/[version]/index.d.ts.map +0 -1
  168. package/dist/routes/values/[labelId]/contract.d.ts +0 -38
  169. package/dist/routes/values/[labelId]/contract.d.ts.map +0 -1
  170. package/dist/routes/values/[labelId]/contract.js +0 -59
  171. package/dist/routes/values/[labelId]/contract.js.map +0 -1
  172. package/dist/routes/values/[labelId]/index.d.ts +0 -8
  173. package/dist/routes/values/[labelId]/index.d.ts.map +0 -1
  174. package/dist/server.d.ts.map +0 -1
  175. package/dist/store.d.ts.map +0 -1
  176. 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
- export declare const cmsLabelValues: import("drizzle-orm/pg-core").PgTableWithColumns<{
12
+ declare const cmsLabelValues: drizzle_orm_pg_core.PgTableWithColumns<{
11
13
  name: "label_values";
12
14
  schema: string;
13
15
  columns: {
14
- id: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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
- export type CmsLabelValue = typeof cmsLabelValues.$inferSelect;
137
- export type NewCmsLabelValue = typeof cmsLabelValues.$inferInsert;
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
- * CMS Label Values Entity
3
- *
4
- * 라벨의 실제 값을 저장합니다.
5
- * - 다국어 지원 (locale)
6
- * - 반응형 지원 (breakpoint)
7
- * - 버전 관리 (version)
8
- * - JSONB로 유연한 값 저장
9
- */
10
- import { serial, integer, text, jsonb, timestamp, index, unique } from 'drizzle-orm/pg-core';
11
- import { createFunctionSchema } from '@spfn/core/db';
12
- import { cmsLabels } from './cms-labels.js';
13
- // Create isolated schema for @spfn/cms
14
- const schema = createFunctionSchema('@spfn/cms');
15
- export const cmsLabelValues = schema.table('label_values', {
16
- // Primary Key
17
- id: serial('id').primaryKey(),
18
- // Foreign Key: cms_labels
19
- labelId: integer('label_id')
20
- .notNull()
21
- .references(() => cmsLabels.id, { onDelete: 'cascade' }),
22
- // 버전 번호
23
- version: integer('version').notNull().default(1),
24
- // 언어 코드
25
- locale: text('locale').notNull().default('ko'),
26
- // "ko" | "en" | "ja"
27
- // 반응형 브레이크포인트
28
- breakpoint: text('breakpoint'),
29
- // null = 기본값 (모든 화면 크기)
30
- // "sm" | "md" | "lg" | "xl" | "2xl"
31
- // 실제 (JSONB)
32
- value: jsonb('value').notNull(),
33
- // LabelValue 타입:
34
- // - TextValue: { type: "text", content: string }
35
- // - ImageValue: { type: "image", url: string, alt?: string, width?: number, height?: number }
36
- // - VideoValue: { type: "video", url: string, thumbnail?: string, duration?: number }
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
- // UNIQUE 제약: 같은 버전에서 locale + breakpoint 조합은 유일
43
- unique('cms_label_values_locale_breakpoint_unique')
44
- .on(table.labelId, table.version, table.locale, table.breakpoint),
45
- // 인덱스: labelId + version 복합 조회 최적화
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
- * await db.insert(cmsLabelValues).values({
56
- * labelId: 1,
57
- * version: 1,
58
- * locale: 'ko',
59
- * breakpoint: null,
60
- * value: {
61
- * type: 'text',
62
- * content: '미래를 만드는 기업'
63
- * }
64
- * });
65
- *
66
- * // 반응형 이미지 저장 (모바일용)
67
- * await db.insert(cmsLabelValues).values({
68
- * labelId: 2,
69
- * version: 1,
70
- * locale: 'ko',
71
- * breakpoint: 'sm',
72
- * value: {
73
- * type: 'image',
74
- * url: '/uploads/hero-mobile.jpg',
75
- * alt: 'Hero Image',
76
- * width: 640,
77
- * height: 480
78
- * }
79
- * });
80
- *
81
- * // 특정 버전의 한국어 조회
82
- * const values = await db.select()
83
- * .from(cmsLabelValues)
84
- * .where(and(
85
- * eq(cmsLabelValues.labelId, 1),
86
- * eq(cmsLabelValues.version, 2),
87
- * eq(cmsLabelValues.locale, 'ko')
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,"file":"cms-label-values.js","sourceRoot":"","sources":["../../src/entities/cms-label-values.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7F,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,uCAAuC;AACvC,MAAM,MAAM,GAAG,oBAAoB,CAAC,WAAW,CAAC,CAAC;AAEjD,MAAM,CAAC,MAAM,cAAc,GAAG,MAAM,CAAC,KAAK,CAAC,cAAc,EAAE;IACvD,cAAc;IACd,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE;IAE7B,0BAA0B;IAC1B,OAAO,EAAE,OAAO,CAAC,UAAU,CAAC;SACvB,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAE5D,QAAQ;IACR,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC;IAEhD,QAAQ;IACR,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;IAC9C,qBAAqB;IAErB,cAAc;IACd,UAAU,EAAE,IAAI,CAAC,YAAY,CAAC;IAC9B,wBAAwB;IACxB,oCAAoC;IAEpC,eAAe;IACf,KAAK,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;IAC/B,iBAAiB;IACjB,iDAAiD;IACjD,8FAA8F;IAC9F,sFAAsF;IACtF,8EAA8E;IAC9E,wEAAwE;IAExE,QAAQ;IACR,SAAS,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,UAAU,EAAE;CACpF,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;IACV,gDAAgD;IAChD,MAAM,CAAC,2CAA2C,CAAC;SAC9C,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,CAAC;IAErE,mCAAmC;IACnC,KAAK,CAAC,oCAAoC,CAAC;SACtC,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;IAErC,sBAAsB;IACtB,KAAK,CAAC,6BAA6B,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC;CACxD,CAAC,CAAC;AAMH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG"}
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
- export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWithColumns<{
11
+ declare const cmsLabelVersions: drizzle_orm_pg_core.PgTableWithColumns<{
10
12
  name: "label_versions";
11
13
  schema: string;
12
14
  columns: {
13
- id: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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: import("drizzle-orm/pg-core").PgColumn<{
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
- export type CmsLabelVersion = typeof cmsLabelVersions.$inferSelect;
170
- export type NewCmsLabelVersion = typeof cmsLabelVersions.$inferInsert;
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 };