@spfn/cms 0.1.0-alpha.73 → 0.1.0-alpha.75

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 (32) hide show
  1. package/dist/api.d.ts +82 -6
  2. package/dist/api.js +93 -8
  3. package/dist/api.js.map +1 -1
  4. package/dist/client.js +92 -7
  5. package/dist/client.js.map +1 -1
  6. package/dist/lib/contracts/labels.d.ts +71 -1
  7. package/dist/lib/contracts/labels.js +77 -0
  8. package/dist/lib/contracts/labels.js.map +1 -1
  9. package/dist/server/generators/index.js.map +1 -1
  10. package/dist/server/repositories/index.d.ts +5 -0
  11. package/dist/server/repositories/index.js +9 -0
  12. package/dist/server/repositories/index.js.map +1 -1
  13. package/dist/server/routes/labels/[id]/index.js +77 -0
  14. package/dist/server/routes/labels/[id]/index.js.map +1 -1
  15. package/dist/server/routes/labels/[labelId]/admin/index.js +658 -0
  16. package/dist/server/routes/labels/[labelId]/admin/index.js.map +1 -0
  17. package/dist/server/routes/labels/[labelId]/publish/index.js +851 -0
  18. package/dist/server/routes/labels/[labelId]/publish/index.js.map +1 -0
  19. package/dist/server/routes/labels/_labelId_/admin/index.d.ts +11 -0
  20. package/dist/server/routes/labels/_labelId_/publish/index.d.ts +11 -0
  21. package/dist/server/routes/labels/by-key/[key]/index.js +76 -0
  22. package/dist/server/routes/labels/by-key/[key]/index.js.map +1 -1
  23. package/dist/server/routes/labels/index.js +76 -0
  24. package/dist/server/routes/labels/index.js.map +1 -1
  25. package/dist/server/routes/published-cache/index.js.map +1 -1
  26. package/dist/server/routes/values/[labelId]/[version]/index.js +9 -0
  27. package/dist/server/routes/values/[labelId]/[version]/index.js.map +1 -1
  28. package/dist/server/routes/values/[labelId]/index.js +9 -0
  29. package/dist/server/routes/values/[labelId]/index.js.map +1 -1
  30. package/dist/server.js +9 -0
  31. package/dist/server.js.map +1 -1
  32. package/package.json +3 -3
package/dist/api.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { InferContract } from '@spfn/core';
2
2
  import { saveValuesContract, getValuesContract } from './lib/contracts/values.js';
3
3
  import { getPublishedCacheContract, upsertPublishedCacheContract } from './lib/contracts/published-cache.js';
4
- import { getLabelByKeyContract, getLabelsContract, createLabelContract, getLabelContract, updateLabelContract, deleteLabelContract } from './lib/contracts/labels.js';
4
+ import { getAdminLabelContract, publishLabelContract, getLabelByKeyContract, getLabelsContract, createLabelContract, getLabelContract, updateLabelContract, deleteLabelContract } from './lib/contracts/labels.js';
5
5
  export { client } from '@spfn/core/client';
6
6
  import '@sinclair/typebox';
7
7
 
@@ -11,7 +11,7 @@ import '@sinclair/typebox';
11
11
  * Generated by @spfn/core codegen
12
12
  * DO NOT EDIT MANUALLY
13
13
  *
14
- * @generated 2025-11-02T14:38:21.625Z
14
+ * @generated 2025-11-03T05:36:08.366Z
15
15
  */
16
16
 
17
17
  type SaveValuesResponse = InferContract<typeof saveValuesContract>['response'];
@@ -27,7 +27,7 @@ type GetValuesParams = InferContract<typeof getValuesContract>['params'];
27
27
  * Generated by @spfn/core codegen
28
28
  * DO NOT EDIT MANUALLY
29
29
  *
30
- * @generated 2025-11-02T14:38:21.624Z
30
+ * @generated 2025-11-03T05:36:08.365Z
31
31
  */
32
32
 
33
33
  type GetPublishedCacheResponse = InferContract<typeof getPublishedCacheContract>['response'];
@@ -41,7 +41,32 @@ type UpsertPublishedCacheBody = InferContract<typeof upsertPublishedCacheContrac
41
41
  * Generated by @spfn/core codegen
42
42
  * DO NOT EDIT MANUALLY
43
43
  *
44
- * @generated 2025-11-02T14:38:21.624Z
44
+ * @generated 2025-11-03T05:36:08.365Z
45
+ */
46
+
47
+ type GetAdminLabelResponse = InferContract<typeof getAdminLabelContract>['response'];
48
+ type GetAdminLabelParams = InferContract<typeof getAdminLabelContract>['params'];
49
+
50
+ /**
51
+ * Auto-generated API Client
52
+ *
53
+ * Generated by @spfn/core codegen
54
+ * DO NOT EDIT MANUALLY
55
+ *
56
+ * @generated 2025-11-03T05:36:08.364Z
57
+ */
58
+
59
+ type PublishLabelResponse = InferContract<typeof publishLabelContract>['response'];
60
+ type PublishLabelParams = InferContract<typeof publishLabelContract>['params'];
61
+ type PublishLabelBody = InferContract<typeof publishLabelContract>['body'];
62
+
63
+ /**
64
+ * Auto-generated API Client
65
+ *
66
+ * Generated by @spfn/core codegen
67
+ * DO NOT EDIT MANUALLY
68
+ *
69
+ * @generated 2025-11-03T05:36:08.364Z
45
70
  */
46
71
 
47
72
  type GetLabelByKeyResponse = InferContract<typeof getLabelByKeyContract>['response'];
@@ -53,7 +78,7 @@ type GetLabelByKeyParams = InferContract<typeof getLabelByKeyContract>['params']
53
78
  * Generated by @spfn/core codegen
54
79
  * DO NOT EDIT MANUALLY
55
80
  *
56
- * @generated 2025-11-02T14:38:21.623Z
81
+ * @generated 2025-11-03T05:36:08.363Z
57
82
  */
58
83
 
59
84
  type GetLabelsResponse = InferContract<typeof getLabelsContract>['response'];
@@ -78,6 +103,7 @@ declare const cmsApi: {
78
103
  labels: {
79
104
  defaultValue?: any;
80
105
  section: string;
106
+ description: string | null;
81
107
  id: number;
82
108
  key: string;
83
109
  type: string;
@@ -109,6 +135,7 @@ declare const cmsApi: {
109
135
  params: GetLabelParams;
110
136
  }) => Promise<{
111
137
  section: string;
138
+ description: string | null;
112
139
  id: number;
113
140
  key: string;
114
141
  type: string;
@@ -124,6 +151,7 @@ declare const cmsApi: {
124
151
  body: UpdateLabelBody;
125
152
  }) => Promise<{
126
153
  section: string;
154
+ description: string | null;
127
155
  id: number;
128
156
  key: string;
129
157
  type: string;
@@ -146,6 +174,7 @@ declare const cmsApi: {
146
174
  params: GetLabelByKeyParams;
147
175
  }) => Promise<{
148
176
  section: string;
177
+ description: string | null;
149
178
  id: number;
150
179
  key: string;
151
180
  type: string;
@@ -157,6 +186,53 @@ declare const cmsApi: {
157
186
  key?: string | undefined;
158
187
  error: string;
159
188
  }>;
189
+ readonly publishLabel: (options: {
190
+ params: PublishLabelParams;
191
+ body: PublishLabelBody;
192
+ }) => Promise<{
193
+ version: number;
194
+ labelId: number;
195
+ success: boolean;
196
+ message: string;
197
+ } | {
198
+ error: string;
199
+ }>;
200
+ readonly getAdminLabel: (options: {
201
+ params: GetAdminLabelParams;
202
+ }) => Promise<{
203
+ status: "published" | "default-only" | "unpublished" | "modified";
204
+ label: {
205
+ section: string;
206
+ description: string | null;
207
+ id: number;
208
+ key: string;
209
+ type: string;
210
+ publishedVersion: number | null;
211
+ createdBy: string | null;
212
+ createdAt: string;
213
+ updatedAt: string;
214
+ };
215
+ draft: {
216
+ locale: string;
217
+ version: null;
218
+ id: number;
219
+ value: any;
220
+ createdAt: string;
221
+ labelId: number;
222
+ breakpoint: string | null;
223
+ }[];
224
+ published: {
225
+ locale: string;
226
+ version: number;
227
+ id: number;
228
+ value: any;
229
+ createdAt: string;
230
+ labelId: number;
231
+ breakpoint: string | null;
232
+ }[];
233
+ } | {
234
+ error: string;
235
+ }>;
160
236
  readonly getPublishedCache: (options: {
161
237
  query?: GetPublishedCacheQuery;
162
238
  }) => Promise<{
@@ -211,4 +287,4 @@ declare const cmsApi: {
211
287
  }>;
212
288
  };
213
289
 
214
- export { type CreateLabelBody, type CreateLabelResponse, type DeleteLabelParams, type DeleteLabelResponse, type GetLabelByKeyParams, type GetLabelByKeyResponse, type GetLabelParams, type GetLabelResponse, type GetLabelsQuery, type GetLabelsResponse, type GetPublishedCacheQuery, type GetPublishedCacheResponse, type GetValuesParams, type GetValuesQuery, type GetValuesResponse, type SaveValuesBody, type SaveValuesParams, type SaveValuesResponse, type UpdateLabelBody, type UpdateLabelParams, type UpdateLabelResponse, type UpsertPublishedCacheBody, type UpsertPublishedCacheResponse, cmsApi };
290
+ export { type CreateLabelBody, type CreateLabelResponse, type DeleteLabelParams, type DeleteLabelResponse, type GetAdminLabelParams, type GetAdminLabelResponse, type GetLabelByKeyParams, type GetLabelByKeyResponse, type GetLabelParams, type GetLabelResponse, type GetLabelsQuery, type GetLabelsResponse, type GetPublishedCacheQuery, type GetPublishedCacheResponse, type GetValuesParams, type GetValuesQuery, type GetValuesResponse, type PublishLabelBody, type PublishLabelParams, type PublishLabelResponse, type SaveValuesBody, type SaveValuesParams, type SaveValuesResponse, type UpdateLabelBody, type UpdateLabelParams, type UpdateLabelResponse, type UpsertPublishedCacheBody, type UpsertPublishedCacheResponse, cmsApi };
package/dist/api.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // src/api/index.ts
2
- import { client as client5 } from "@spfn/core/client";
2
+ import { client as client7 } from "@spfn/core/client";
3
3
 
4
4
  // src/api/cms-labels.ts
5
5
  import { client } from "@spfn/core/client";
@@ -21,6 +21,7 @@ var getLabelsContract = {
21
21
  key: Type.String(),
22
22
  section: Type.String(),
23
23
  type: Type.String(),
24
+ description: Type.Union([Type.String(), Type.Null()], { description: "\uB77C\uBCA8 \uC124\uBA85" }),
24
25
  publishedVersion: Type.Union([Type.Number(), Type.Null()]),
25
26
  createdBy: Type.Union([Type.String(), Type.Null()]),
26
27
  createdAt: Type.String(),
@@ -82,6 +83,7 @@ var getLabelContract = {
82
83
  key: Type.String(),
83
84
  section: Type.String(),
84
85
  type: Type.String(),
86
+ description: Type.Union([Type.String(), Type.Null()]),
85
87
  publishedVersion: Type.Union([Type.Number(), Type.Null()]),
86
88
  createdBy: Type.Union([Type.String(), Type.Null()]),
87
89
  createdAt: Type.String(),
@@ -114,6 +116,7 @@ var updateLabelContract = {
114
116
  key: Type.String(),
115
117
  section: Type.String(),
116
118
  type: Type.String(),
119
+ description: Type.Union([Type.String(), Type.Null()]),
117
120
  publishedVersion: Type.Union([Type.Number(), Type.Null()]),
118
121
  createdBy: Type.Union([Type.String(), Type.Null()]),
119
122
  createdAt: Type.String(),
@@ -152,6 +155,7 @@ var getLabelByKeyContract = {
152
155
  key: Type.String(),
153
156
  section: Type.String(),
154
157
  type: Type.String(),
158
+ description: Type.Union([Type.String(), Type.Null()]),
155
159
  publishedVersion: Type.Union([Type.Number(), Type.Null()]),
156
160
  createdBy: Type.Union([Type.String(), Type.Null()]),
157
161
  createdAt: Type.String(),
@@ -163,6 +167,77 @@ var getLabelByKeyContract = {
163
167
  })
164
168
  ])
165
169
  };
170
+ var publishLabelContract = {
171
+ method: "POST",
172
+ path: "/_cms/labels/:labelId/publish",
173
+ params: Type.Object({
174
+ labelId: Type.String({ description: "\uB77C\uBCA8 ID" })
175
+ }),
176
+ body: Type.Object({
177
+ notes: Type.Optional(Type.String({ description: "\uBC1C\uD589 \uB178\uD2B8 (\uBC84\uC804 \uC124\uBA85)" })),
178
+ publishedBy: Type.Optional(Type.String({ description: "\uBC1C\uD589\uC790 ID" }))
179
+ }),
180
+ response: Type.Union([
181
+ Type.Object({
182
+ success: Type.Boolean(),
183
+ labelId: Type.Number(),
184
+ version: Type.Number(),
185
+ message: Type.String()
186
+ }),
187
+ Type.Object({
188
+ error: Type.String()
189
+ })
190
+ ])
191
+ };
192
+ var getAdminLabelContract = {
193
+ method: "GET",
194
+ path: "/_cms/labels/:labelId/admin",
195
+ params: Type.Object({
196
+ labelId: Type.String({ description: "\uB77C\uBCA8 ID" })
197
+ }),
198
+ response: Type.Union([
199
+ Type.Object({
200
+ label: Type.Object({
201
+ id: Type.Number(),
202
+ key: Type.String(),
203
+ section: Type.String(),
204
+ type: Type.String(),
205
+ description: Type.Union([Type.String(), Type.Null()]),
206
+ publishedVersion: Type.Union([Type.Number(), Type.Null()]),
207
+ createdBy: Type.Union([Type.String(), Type.Null()]),
208
+ createdAt: Type.String(),
209
+ updatedAt: Type.String()
210
+ }),
211
+ draft: Type.Array(Type.Object({
212
+ id: Type.Number(),
213
+ labelId: Type.Number(),
214
+ version: Type.Null(),
215
+ locale: Type.String(),
216
+ breakpoint: Type.Union([Type.String(), Type.Null()]),
217
+ value: Type.Any(),
218
+ createdAt: Type.String()
219
+ })),
220
+ published: Type.Array(Type.Object({
221
+ id: Type.Number(),
222
+ labelId: Type.Number(),
223
+ version: Type.Number(),
224
+ locale: Type.String(),
225
+ breakpoint: Type.Union([Type.String(), Type.Null()]),
226
+ value: Type.Any(),
227
+ createdAt: Type.String()
228
+ })),
229
+ status: Type.Union([
230
+ Type.Literal("default-only"),
231
+ Type.Literal("unpublished"),
232
+ Type.Literal("published"),
233
+ Type.Literal("modified")
234
+ ])
235
+ }),
236
+ Type.Object({
237
+ error: Type.String()
238
+ })
239
+ ])
240
+ };
166
241
 
167
242
  // src/api/cms-labels.ts
168
243
  var getLabels = (options) => client.call(getLabelsContract, options);
@@ -175,8 +250,16 @@ var deleteLabel = (options) => client.call(deleteLabelContract, options);
175
250
  import { client as client2 } from "@spfn/core/client";
176
251
  var getLabelByKey = (options) => client2.call(getLabelByKeyContract, options);
177
252
 
178
- // src/api/cms-published-cache.ts
253
+ // src/api/cms-labels-publish.ts
179
254
  import { client as client3 } from "@spfn/core/client";
255
+ var publishLabel = (options) => client3.call(publishLabelContract, options);
256
+
257
+ // src/api/cms-labels-admin.ts
258
+ import { client as client4 } from "@spfn/core/client";
259
+ var getAdminLabel = (options) => client4.call(getAdminLabelContract, options);
260
+
261
+ // src/api/cms-published-cache.ts
262
+ import { client as client5 } from "@spfn/core/client";
180
263
 
181
264
  // src/lib/contracts/published-cache.ts
182
265
  import { Type as Type2 } from "@sinclair/typebox";
@@ -224,11 +307,11 @@ var upsertPublishedCacheContract = {
224
307
  };
225
308
 
226
309
  // src/api/cms-published-cache.ts
227
- var getPublishedCache = (options) => client3.call(getPublishedCacheContract, options);
228
- var upsertPublishedCache = (options) => client3.call(upsertPublishedCacheContract, options);
310
+ var getPublishedCache = (options) => client5.call(getPublishedCacheContract, options);
311
+ var upsertPublishedCache = (options) => client5.call(upsertPublishedCacheContract, options);
229
312
 
230
313
  // src/api/cms-values.ts
231
- import { client as client4 } from "@spfn/core/client";
314
+ import { client as client6 } from "@spfn/core/client";
232
315
 
233
316
  // src/lib/contracts/values.ts
234
317
  import { Type as Type3 } from "@sinclair/typebox";
@@ -330,8 +413,8 @@ var getValuesContract = {
330
413
  };
331
414
 
332
415
  // src/api/cms-values.ts
333
- var saveValues = (options) => client4.call(saveValuesContract, options);
334
- var getValues = (options) => client4.call(getValuesContract, options);
416
+ var saveValues = (options) => client6.call(saveValuesContract, options);
417
+ var getValues = (options) => client6.call(getValuesContract, options);
335
418
 
336
419
  // src/api/index.ts
337
420
  var cmsApi = {
@@ -341,13 +424,15 @@ var cmsApi = {
341
424
  updateLabel,
342
425
  deleteLabel,
343
426
  getLabelByKey,
427
+ publishLabel,
428
+ getAdminLabel,
344
429
  getPublishedCache,
345
430
  upsertPublishedCache,
346
431
  saveValues,
347
432
  getValues
348
433
  };
349
434
  export {
350
- client5 as client,
435
+ client7 as client,
351
436
  cmsApi
352
437
  };
353
438
  //# sourceMappingURL=api.js.map
package/dist/api.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/api/index.ts","../src/api/cms-labels.ts","../src/lib/contracts/labels.ts","../src/api/cms-labels-by-key.ts","../src/api/cms-published-cache.ts","../src/lib/contracts/published-cache.ts","../src/api/cms-values.ts","../src/lib/contracts/values.ts"],"sourcesContent":["/**\n * Auto-generated API Client\n *\n * Generated by @spfn/core codegen\n * DO NOT EDIT MANUALLY\n *\n * @generated 2025-11-02T14:38:21.625Z\n */\n\nexport { client } from '@spfn/core/client';\n\nexport type { GetLabelsResponse, GetLabelsQuery, CreateLabelResponse, CreateLabelBody, GetLabelResponse, GetLabelParams, UpdateLabelResponse, UpdateLabelParams, UpdateLabelBody, DeleteLabelResponse, DeleteLabelParams } from './cms-labels.js';\nexport type { GetLabelByKeyResponse, GetLabelByKeyParams } from './cms-labels-by-key.js';\nexport type { GetPublishedCacheResponse, GetPublishedCacheQuery, UpsertPublishedCacheResponse, UpsertPublishedCacheBody } from './cms-published-cache.js';\nexport type { SaveValuesResponse, SaveValuesParams, SaveValuesBody, GetValuesResponse, GetValuesQuery, GetValuesParams } from './cms-values.js';\n\nimport { getLabels, createLabel, getLabel, updateLabel, deleteLabel } from './cms-labels.js';\nimport { getLabelByKey } from './cms-labels-by-key.js';\nimport { getPublishedCache, upsertPublishedCache } from './cms-published-cache.js';\nimport { saveValues, getValues } from './cms-values.js';\n\n/**\n * Type-safe API client\n */\nexport const cmsApi = {\n getLabels,\n createLabel,\n getLabel,\n updateLabel,\n deleteLabel,\n getLabelByKey,\n getPublishedCache,\n upsertPublishedCache,\n saveValues,\n getValues\n} as const;\n","/**\n * Auto-generated API Client\n *\n * Generated by @spfn/core codegen\n * DO NOT EDIT MANUALLY\n *\n * @generated 2025-11-02T14:38:21.623Z\n */\n\nimport { client } from '@spfn/core/client';\nimport type { InferContract } from '@spfn/core';\n\nimport { getLabelsContract, createLabelContract, getLabelContract, updateLabelContract, deleteLabelContract } from '@/lib/contracts/labels';\n\n// ============================================\n// Types\n// ============================================\n\nexport type GetLabelsResponse = InferContract<typeof getLabelsContract>['response'];\nexport type GetLabelsQuery = InferContract<typeof getLabelsContract>['query'];\n\nexport type CreateLabelResponse = InferContract<typeof createLabelContract>['response'];\nexport type CreateLabelBody = InferContract<typeof createLabelContract>['body'];\n\nexport type GetLabelResponse = InferContract<typeof getLabelContract>['response'];\nexport type GetLabelParams = InferContract<typeof getLabelContract>['params'];\n\nexport type UpdateLabelResponse = InferContract<typeof updateLabelContract>['response'];\nexport type UpdateLabelParams = InferContract<typeof updateLabelContract>['params'];\nexport type UpdateLabelBody = InferContract<typeof updateLabelContract>['body'];\n\nexport type DeleteLabelResponse = InferContract<typeof deleteLabelContract>['response'];\nexport type DeleteLabelParams = InferContract<typeof deleteLabelContract>['params'];\n\n// ============================================\n// API Functions\n// ============================================\n\n/**\n * GET /_cms/labels\n */\nexport const getLabels = (options: { query?: GetLabelsQuery }) => client.call(getLabelsContract, options);\n\n/**\n * POST /_cms/labels\n */\nexport const createLabel = (options: { body: CreateLabelBody }) => client.call(createLabelContract, options);\n\n/**\n * GET /_cms/labels/:id\n */\nexport const getLabel = (options: { params: GetLabelParams }) => client.call(getLabelContract, options);\n\n/**\n * PATCH /_cms/labels/:id\n */\nexport const updateLabel = (options: { params: UpdateLabelParams, body: UpdateLabelBody }) => client.call(updateLabelContract, options);\n\n/**\n * DELETE /_cms/labels/:id\n */\nexport const deleteLabel = (options: { params: DeleteLabelParams }) => client.call(deleteLabelContract, options);\n\n","import { Type } from '@sinclair/typebox';\nimport type { RouteContract } from '@spfn/core/route';\n\n/**\n * CMS Labels Contracts\n *\n * 라벨 메타데이터 관리 API\n */\n\n/**\n * GET /_cms/labels - 라벨 목록 조회\n */\nexport const getLabelsContract = {\n method: 'GET' as const,\n path: '/_cms/labels',\n query: Type.Object({\n section: Type.Optional(Type.String({ description: '섹션으로 필터링 (예: home, why-futureplay)' })),\n limit: Type.Optional(Type.Number({ minimum: 1, maximum: 100, default: 20, description: '페이지당 항목 수' })),\n offset: Type.Optional(Type.Number({ minimum: 0, default: 0, description: '시작 오프셋' })),\n includeDefaultValues: Type.Optional(Type.Boolean({ description: '기본값 포함 여부', default: false }))\n }),\n response: Type.Object({\n labels: Type.Array(Type.Object({\n id: Type.Number(),\n key: Type.String(),\n section: Type.String(),\n type: Type.String(),\n publishedVersion: Type.Union([Type.Number(), Type.Null()]),\n createdBy: Type.Union([Type.String(), Type.Null()]),\n createdAt: Type.String(),\n updatedAt: Type.String(),\n defaultValue: Type.Optional(Type.Any({ description: '라벨 정의 파일의 기본값' }))\n })),\n total: Type.Number(),\n limit: Type.Number(),\n offset: Type.Number()\n })\n} as const satisfies RouteContract;\n\n/**\n * POST /_cms/labels - 새 라벨 생성\n */\nexport const createLabelContract = {\n method: 'POST' as const,\n path: '/_cms/labels',\n body: Type.Object({\n key: Type.String({\n description: '고유 키 (예: home.hero.title)',\n pattern: '^[a-z0-9-]+\\\\.[a-z0-9-]+\\\\.[a-z0-9-]+$'\n }),\n section: Type.String({\n description: '섹션 이름 (예: home, why-futureplay)',\n pattern: '^[a-z0-9-]+$'\n }),\n type: Type.Union([\n Type.Literal('text'),\n Type.Literal('image'),\n Type.Literal('video'),\n Type.Literal('file'),\n Type.Literal('object')\n ], { description: '값 타입' }),\n createdBy: Type.Optional(Type.String({ description: '생성자 ID' }))\n }),\n response: Type.Union([\n Type.Object({\n id: Type.Number(),\n key: Type.String(),\n section: Type.String(),\n type: Type.String(),\n publishedVersion: Type.Union([Type.Number(), Type.Null()]),\n createdBy: Type.Union([Type.String(), Type.Null()]),\n createdAt: Type.String(),\n updatedAt: Type.String()\n }),\n Type.Object({\n error: Type.String(),\n key: Type.Optional(Type.String())\n })\n ])\n} as const satisfies RouteContract;\n\n/**\n * GET /_cms/labels/:id - 라벨 단건 조회\n */\nexport const getLabelContract = {\n method: 'GET' as const,\n path: '/_cms/labels/:id',\n params: Type.Object({\n id: Type.String({ description: '라벨 ID' })\n }),\n response: Type.Union([\n Type.Object({\n id: Type.Number(),\n key: Type.String(),\n section: Type.String(),\n type: Type.String(),\n publishedVersion: Type.Union([Type.Number(), Type.Null()]),\n createdBy: Type.Union([Type.String(), Type.Null()]),\n createdAt: Type.String(),\n updatedAt: Type.String()\n }),\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;\n\n/**\n * PATCH /_cms/labels/:id - 라벨 메타데이터 수정\n */\nexport const updateLabelContract = {\n method: 'PATCH' as const,\n path: '/_cms/labels/:id',\n params: Type.Object({\n id: Type.String({ description: '라벨 ID' })\n }),\n body: Type.Object({\n section: Type.Optional(Type.String({ description: '섹션 변경' })),\n type: Type.Optional(Type.Union([\n Type.Literal('text'),\n Type.Literal('image'),\n Type.Literal('video'),\n Type.Literal('file'),\n Type.Literal('object')\n ]))\n }),\n response: Type.Union([\n Type.Object({\n id: Type.Number(),\n key: Type.String(),\n section: Type.String(),\n type: Type.String(),\n publishedVersion: Type.Union([Type.Number(), Type.Null()]),\n createdBy: Type.Union([Type.String(), Type.Null()]),\n createdAt: Type.String(),\n updatedAt: Type.String()\n }),\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;\n\n/**\n * DELETE /_cms/labels/:id - 라벨 삭제\n */\nexport const deleteLabelContract = {\n method: 'DELETE' as const,\n path: '/_cms/labels/:id',\n params: Type.Object({\n id: Type.String({ description: '라벨 ID' })\n }),\n response: Type.Union([\n Type.Object({\n success: Type.Boolean(),\n id: Type.Number()\n }),\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;\n\n/**\n * GET /_cms/labels/by-key/:key - Key로 라벨 조회\n */\nexport const getLabelByKeyContract = {\n method: 'GET' as const,\n path: '/_cms/labels/by-key/:key',\n params: Type.Object({\n key: Type.String({ description: '라벨 Key (예: home.hero.title)' })\n }),\n response: Type.Union([\n Type.Object({\n id: Type.Number(),\n key: Type.String(),\n section: Type.String(),\n type: Type.String(),\n publishedVersion: Type.Union([Type.Number(), Type.Null()]),\n createdBy: Type.Union([Type.String(), Type.Null()]),\n createdAt: Type.String(),\n updatedAt: Type.String()\n }),\n Type.Object({\n error: Type.String(),\n key: Type.Optional(Type.String())\n })\n ])\n} as const satisfies RouteContract;","/**\n * Auto-generated API Client\n *\n * Generated by @spfn/core codegen\n * DO NOT EDIT MANUALLY\n *\n * @generated 2025-11-02T14:38:21.624Z\n */\n\nimport { client } from '@spfn/core/client';\nimport type { InferContract } from '@spfn/core';\n\nimport { getLabelByKeyContract } from '@/lib/contracts/labels';\n\n// ============================================\n// Types\n// ============================================\n\nexport type GetLabelByKeyResponse = InferContract<typeof getLabelByKeyContract>['response'];\nexport type GetLabelByKeyParams = InferContract<typeof getLabelByKeyContract>['params'];\n\n// ============================================\n// API Functions\n// ============================================\n\n/**\n * GET /_cms/labels/by-key/:key\n */\nexport const getLabelByKey = (options: { params: GetLabelByKeyParams }) => client.call(getLabelByKeyContract, options);\n\n","/**\n * Auto-generated API Client\n *\n * Generated by @spfn/core codegen\n * DO NOT EDIT MANUALLY\n *\n * @generated 2025-11-02T14:38:21.624Z\n */\n\nimport { client } from '@spfn/core/client';\nimport type { InferContract } from '@spfn/core';\n\nimport { getPublishedCacheContract, upsertPublishedCacheContract } from '@/lib/contracts/published-cache';\n\n// ============================================\n// Types\n// ============================================\n\nexport type GetPublishedCacheResponse = InferContract<typeof getPublishedCacheContract>['response'];\nexport type GetPublishedCacheQuery = InferContract<typeof getPublishedCacheContract>['query'];\n\nexport type UpsertPublishedCacheResponse = InferContract<typeof upsertPublishedCacheContract>['response'];\nexport type UpsertPublishedCacheBody = InferContract<typeof upsertPublishedCacheContract>['body'];\n\n// ============================================\n// API Functions\n// ============================================\n\n/**\n * GET /_cms/published-cache\n */\nexport const getPublishedCache = (options: { query?: GetPublishedCacheQuery }) => client.call(getPublishedCacheContract, options);\n\n/**\n * POST /_cms/published-cache\n */\nexport const upsertPublishedCache = (options: { body: UpsertPublishedCacheBody }) => client.call(upsertPublishedCacheContract, options);\n\n","import { Type } from '@sinclair/typebox';\nimport type { RouteContract } from '@spfn/core/route';\n\nconst SectionData = Type.Object({\n section: Type.String(),\n locale: Type.String(),\n content: Type.Record(Type.String(), Type.Any()),\n version: Type.Number(),\n publishedAt: Type.Union([Type.String(), Type.Null()]),\n});\n\n/**\n * GET /_cms/published-cache\n * 발행된 콘텐츠 캐시 조회 (단일 또는 여러 섹션)\n */\nexport const getPublishedCacheContract = {\n method: 'GET' as const,\n path: '/_cms/published-cache',\n query: Type.Object({\n sections: Type.Union([\n Type.String({ description: '단일 섹션 이름 (예: home)' }),\n Type.Array(Type.String(), { description: '여러 섹션 이름 (예: [\"home\", \"footer\"])' })\n ]),\n locale: Type.Optional(Type.String({ default: 'ko', description: '언어 코드' })),\n }),\n response: Type.Union([\n // 성공: 항상 배열로 반환\n Type.Array(SectionData),\n // 에러\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;\n\n/**\n * POST /_cms/published-cache\n * 발행된 콘텐츠 캐시 업데이트/생성 (upsert)\n */\nexport const upsertPublishedCacheContract = {\n method: 'POST' as const,\n path: '/_cms/published-cache',\n body: Type.Object({\n section: Type.String({ description: '섹션 이름 (예: home)' }),\n locale: Type.String({ description: '언어 코드 (예: ko, en, ja)' }),\n content: Type.Record(Type.String(), Type.Any(), { description: '발행할 콘텐츠 (key-value 형태)' }),\n version: Type.Number({ description: '버전 번호' })\n }),\n response: Type.Union([\n SectionData,\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;","/**\n * Auto-generated API Client\n *\n * Generated by @spfn/core codegen\n * DO NOT EDIT MANUALLY\n *\n * @generated 2025-11-02T14:38:21.625Z\n */\n\nimport { client } from '@spfn/core/client';\nimport type { InferContract } from '@spfn/core';\n\nimport { saveValuesContract, getValuesContract } from '@/lib/contracts/values';\n\n// ============================================\n// Types\n// ============================================\n\nexport type SaveValuesResponse = InferContract<typeof saveValuesContract>['response'];\nexport type SaveValuesParams = InferContract<typeof saveValuesContract>['params'];\nexport type SaveValuesBody = InferContract<typeof saveValuesContract>['body'];\n\nexport type GetValuesResponse = InferContract<typeof getValuesContract>['response'];\nexport type GetValuesQuery = InferContract<typeof getValuesContract>['query'];\nexport type GetValuesParams = InferContract<typeof getValuesContract>['params'];\n\n// ============================================\n// API Functions\n// ============================================\n\n/**\n * POST /_cms/values/:labelId\n */\nexport const saveValues = (options: { params: SaveValuesParams, body: SaveValuesBody }) => client.call(saveValuesContract, options);\n\n/**\n * GET /_cms/values/:labelId/:version\n */\nexport const getValues = (options: { params: GetValuesParams, query?: GetValuesQuery }) => client.call(getValuesContract, options);\n\n","import { Type } from '@sinclair/typebox';\nimport type { RouteContract } from '@spfn/core/route';\n\n/**\n * Label Value 타입 정의\n */\nconst LabelValueSchema = Type.Object({\n type: Type.Union([\n Type.Literal('text'),\n Type.Literal('image'),\n Type.Literal('video'),\n Type.Literal('file'),\n Type.Literal('object')\n ]),\n content: Type.Optional(Type.String()), // text type\n url: Type.Optional(Type.String()), // image, video, file types\n alt: Type.Optional(Type.String()), // image type\n width: Type.Optional(Type.Number()), // image type\n height: Type.Optional(Type.Number()), // image type\n thumbnail: Type.Optional(Type.String()), // video type\n duration: Type.Optional(Type.Number()), // video type\n filename: Type.Optional(Type.String()), // file type\n size: Type.Optional(Type.Number()), // file type\n fields: Type.Optional(Type.Any()) // object type - recursive structure\n});\n\n/**\n * POST /_cms/values/:labelId - 라벨 값 저장\n * - version: null → Draft 저장 (덮어쓰기)\n * - version: number → Published 버전 생성 (불변)\n */\nexport const saveValuesContract = {\n method: 'POST' as const,\n path: '/_cms/values/:labelId',\n params: Type.Object({\n labelId: Type.String({ description: '라벨 ID' })\n }),\n body: Type.Object({\n version: Type.Union([\n Type.Null({ description: 'Draft 저장 (덮어쓰기)' }),\n Type.Number({ description: '버전 번호 (불변)', minimum: 1 })\n ]),\n values: Type.Array(\n Type.Object({\n locale: Type.String({ description: '언어 코드 (ko, en, ja)', default: 'ko' }),\n breakpoint: Type.Optional(Type.Union([\n Type.Literal('sm'),\n Type.Literal('md'),\n Type.Literal('lg'),\n Type.Literal('xl'),\n Type.Literal('2xl'),\n Type.Null()\n ], { description: '반응형 브레이크포인트' })),\n value: LabelValueSchema\n })\n )\n }),\n response: Type.Union([\n Type.Object({\n success: Type.Boolean(),\n saved: Type.Number(),\n version: Type.Union([Type.Null(), Type.Number()])\n }),\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;\n\n/**\n * GET /_cms/values/:labelId/:version - 특정 버전의 값 조회\n */\nexport const getValuesContract = {\n method: 'GET' as const,\n path: '/_cms/values/:labelId/:version',\n params: Type.Object({\n labelId: Type.String({ description: '라벨 ID' }),\n version: Type.String({ description: '버전 번호' })\n }),\n query: Type.Object({\n locale: Type.Optional(Type.String({ description: '언어 코드 (ko, en, ja)' })),\n breakpoint: Type.Optional(Type.String({ description: '반응형 브레이크포인트' }))\n }),\n response: Type.Union([\n Type.Object({\n labelId: Type.Number(),\n version: Type.Number(),\n values: Type.Array(\n Type.Object({\n id: Type.Number(),\n locale: Type.String(),\n breakpoint: Type.Union([Type.String(), Type.Null()]),\n value: Type.Any(),\n createdAt: Type.String()\n })\n )\n }),\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;"],"mappings":"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","names":["client","client","client","client","Type","client","client","Type","client"]}
1
+ {"version":3,"sources":["../src/api/index.ts","../src/api/cms-labels.ts","../src/lib/contracts/labels.ts","../src/api/cms-labels-by-key.ts","../src/api/cms-labels-publish.ts","../src/api/cms-labels-admin.ts","../src/api/cms-published-cache.ts","../src/lib/contracts/published-cache.ts","../src/api/cms-values.ts","../src/lib/contracts/values.ts"],"sourcesContent":["/**\n * Auto-generated API Client\n *\n * Generated by @spfn/core codegen\n * DO NOT EDIT MANUALLY\n *\n * @generated 2025-11-03T05:36:08.366Z\n */\n\nexport { client } from '@spfn/core/client';\n\nexport type { GetLabelsResponse, GetLabelsQuery, CreateLabelResponse, CreateLabelBody, GetLabelResponse, GetLabelParams, UpdateLabelResponse, UpdateLabelParams, UpdateLabelBody, DeleteLabelResponse, DeleteLabelParams } from './cms-labels.js';\nexport type { GetLabelByKeyResponse, GetLabelByKeyParams } from './cms-labels-by-key.js';\nexport type { PublishLabelResponse, PublishLabelParams, PublishLabelBody } from './cms-labels-publish.js';\nexport type { GetAdminLabelResponse, GetAdminLabelParams } from './cms-labels-admin.js';\nexport type { GetPublishedCacheResponse, GetPublishedCacheQuery, UpsertPublishedCacheResponse, UpsertPublishedCacheBody } from './cms-published-cache.js';\nexport type { SaveValuesResponse, SaveValuesParams, SaveValuesBody, GetValuesResponse, GetValuesQuery, GetValuesParams } from './cms-values.js';\n\nimport { getLabels, createLabel, getLabel, updateLabel, deleteLabel } from './cms-labels.js';\nimport { getLabelByKey } from './cms-labels-by-key.js';\nimport { publishLabel } from './cms-labels-publish.js';\nimport { getAdminLabel } from './cms-labels-admin.js';\nimport { getPublishedCache, upsertPublishedCache } from './cms-published-cache.js';\nimport { saveValues, getValues } from './cms-values.js';\n\n/**\n * Type-safe API client\n */\nexport const cmsApi = {\n getLabels,\n createLabel,\n getLabel,\n updateLabel,\n deleteLabel,\n getLabelByKey,\n publishLabel,\n getAdminLabel,\n getPublishedCache,\n upsertPublishedCache,\n saveValues,\n getValues\n} as const;\n","/**\n * Auto-generated API Client\n *\n * Generated by @spfn/core codegen\n * DO NOT EDIT MANUALLY\n *\n * @generated 2025-11-03T05:36:08.363Z\n */\n\nimport { client } from '@spfn/core/client';\nimport type { InferContract } from '@spfn/core';\n\nimport { getLabelsContract, createLabelContract, getLabelContract, updateLabelContract, deleteLabelContract } from '@/lib/contracts/labels';\n\n// ============================================\n// Types\n// ============================================\n\nexport type GetLabelsResponse = InferContract<typeof getLabelsContract>['response'];\nexport type GetLabelsQuery = InferContract<typeof getLabelsContract>['query'];\n\nexport type CreateLabelResponse = InferContract<typeof createLabelContract>['response'];\nexport type CreateLabelBody = InferContract<typeof createLabelContract>['body'];\n\nexport type GetLabelResponse = InferContract<typeof getLabelContract>['response'];\nexport type GetLabelParams = InferContract<typeof getLabelContract>['params'];\n\nexport type UpdateLabelResponse = InferContract<typeof updateLabelContract>['response'];\nexport type UpdateLabelParams = InferContract<typeof updateLabelContract>['params'];\nexport type UpdateLabelBody = InferContract<typeof updateLabelContract>['body'];\n\nexport type DeleteLabelResponse = InferContract<typeof deleteLabelContract>['response'];\nexport type DeleteLabelParams = InferContract<typeof deleteLabelContract>['params'];\n\n// ============================================\n// API Functions\n// ============================================\n\n/**\n * GET /_cms/labels\n */\nexport const getLabels = (options: { query?: GetLabelsQuery }) => client.call(getLabelsContract, options);\n\n/**\n * POST /_cms/labels\n */\nexport const createLabel = (options: { body: CreateLabelBody }) => client.call(createLabelContract, options);\n\n/**\n * GET /_cms/labels/:id\n */\nexport const getLabel = (options: { params: GetLabelParams }) => client.call(getLabelContract, options);\n\n/**\n * PATCH /_cms/labels/:id\n */\nexport const updateLabel = (options: { params: UpdateLabelParams, body: UpdateLabelBody }) => client.call(updateLabelContract, options);\n\n/**\n * DELETE /_cms/labels/:id\n */\nexport const deleteLabel = (options: { params: DeleteLabelParams }) => client.call(deleteLabelContract, options);\n\n","import { Type } from '@sinclair/typebox';\nimport type { RouteContract } from '@spfn/core/route';\n\n/**\n * CMS Labels Contracts\n *\n * 라벨 메타데이터 관리 API\n */\n\n/**\n * GET /_cms/labels - 라벨 목록 조회\n */\nexport const getLabelsContract = {\n method: 'GET' as const,\n path: '/_cms/labels',\n query: Type.Object({\n section: Type.Optional(Type.String({ description: '섹션으로 필터링 (예: home, why-futureplay)' })),\n limit: Type.Optional(Type.Number({ minimum: 1, maximum: 100, default: 20, description: '페이지당 항목 수' })),\n offset: Type.Optional(Type.Number({ minimum: 0, default: 0, description: '시작 오프셋' })),\n includeDefaultValues: Type.Optional(Type.Boolean({ description: '기본값 포함 여부', default: false }))\n }),\n response: Type.Object({\n labels: Type.Array(Type.Object({\n id: Type.Number(),\n key: Type.String(),\n section: Type.String(),\n type: Type.String(),\n description: Type.Union([Type.String(), Type.Null()], { description: '라벨 설명' }),\n publishedVersion: Type.Union([Type.Number(), Type.Null()]),\n createdBy: Type.Union([Type.String(), Type.Null()]),\n createdAt: Type.String(),\n updatedAt: Type.String(),\n defaultValue: Type.Optional(Type.Any({ description: '라벨 정의 파일의 기본값' }))\n })),\n total: Type.Number(),\n limit: Type.Number(),\n offset: Type.Number()\n })\n} as const satisfies RouteContract;\n\n/**\n * POST /_cms/labels - 새 라벨 생성\n */\nexport const createLabelContract = {\n method: 'POST' as const,\n path: '/_cms/labels',\n body: Type.Object({\n key: Type.String({\n description: '고유 키 (예: home.hero.title)',\n pattern: '^[a-z0-9-]+\\\\.[a-z0-9-]+\\\\.[a-z0-9-]+$'\n }),\n section: Type.String({\n description: '섹션 이름 (예: home, why-futureplay)',\n pattern: '^[a-z0-9-]+$'\n }),\n type: Type.Union([\n Type.Literal('text'),\n Type.Literal('image'),\n Type.Literal('video'),\n Type.Literal('file'),\n Type.Literal('object')\n ], { description: '값 타입' }),\n createdBy: Type.Optional(Type.String({ description: '생성자 ID' }))\n }),\n response: Type.Union([\n Type.Object({\n id: Type.Number(),\n key: Type.String(),\n section: Type.String(),\n type: Type.String(),\n publishedVersion: Type.Union([Type.Number(), Type.Null()]),\n createdBy: Type.Union([Type.String(), Type.Null()]),\n createdAt: Type.String(),\n updatedAt: Type.String()\n }),\n Type.Object({\n error: Type.String(),\n key: Type.Optional(Type.String())\n })\n ])\n} as const satisfies RouteContract;\n\n/**\n * GET /_cms/labels/:id - 라벨 단건 조회\n */\nexport const getLabelContract = {\n method: 'GET' as const,\n path: '/_cms/labels/:id',\n params: Type.Object({\n id: Type.String({ description: '라벨 ID' })\n }),\n response: Type.Union([\n Type.Object({\n id: Type.Number(),\n key: Type.String(),\n section: Type.String(),\n type: Type.String(),\n description: Type.Union([Type.String(), Type.Null()]),\n publishedVersion: Type.Union([Type.Number(), Type.Null()]),\n createdBy: Type.Union([Type.String(), Type.Null()]),\n createdAt: Type.String(),\n updatedAt: Type.String()\n }),\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;\n\n/**\n * PATCH /_cms/labels/:id - 라벨 메타데이터 수정\n */\nexport const updateLabelContract = {\n method: 'PATCH' as const,\n path: '/_cms/labels/:id',\n params: Type.Object({\n id: Type.String({ description: '라벨 ID' })\n }),\n body: Type.Object({\n section: Type.Optional(Type.String({ description: '섹션 변경' })),\n type: Type.Optional(Type.Union([\n Type.Literal('text'),\n Type.Literal('image'),\n Type.Literal('video'),\n Type.Literal('file'),\n Type.Literal('object')\n ]))\n }),\n response: Type.Union([\n Type.Object({\n id: Type.Number(),\n key: Type.String(),\n section: Type.String(),\n type: Type.String(),\n description: Type.Union([Type.String(), Type.Null()]),\n publishedVersion: Type.Union([Type.Number(), Type.Null()]),\n createdBy: Type.Union([Type.String(), Type.Null()]),\n createdAt: Type.String(),\n updatedAt: Type.String()\n }),\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;\n\n/**\n * DELETE /_cms/labels/:id - 라벨 삭제\n */\nexport const deleteLabelContract = {\n method: 'DELETE' as const,\n path: '/_cms/labels/:id',\n params: Type.Object({\n id: Type.String({ description: '라벨 ID' })\n }),\n response: Type.Union([\n Type.Object({\n success: Type.Boolean(),\n id: Type.Number()\n }),\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;\n\n/**\n * GET /_cms/labels/by-key/:key - Key로 라벨 조회\n */\nexport const getLabelByKeyContract = {\n method: 'GET' as const,\n path: '/_cms/labels/by-key/:key',\n params: Type.Object({\n key: Type.String({ description: '라벨 Key (예: home.hero.title)' })\n }),\n response: Type.Union([\n Type.Object({\n id: Type.Number(),\n key: Type.String(),\n section: Type.String(),\n type: Type.String(),\n description: Type.Union([Type.String(), Type.Null()]),\n publishedVersion: Type.Union([Type.Number(), Type.Null()]),\n createdBy: Type.Union([Type.String(), Type.Null()]),\n createdAt: Type.String(),\n updatedAt: Type.String()\n }),\n Type.Object({\n error: Type.String(),\n key: Type.Optional(Type.String())\n })\n ])\n} as const satisfies RouteContract;\n\n/**\n * POST /_cms/labels/:labelId/publish - 라벨 발행 (Draft → Published)\n */\nexport const publishLabelContract = {\n method: 'POST' as const,\n path: '/_cms/labels/:labelId/publish',\n params: Type.Object({\n labelId: Type.String({ description: '라벨 ID' })\n }),\n body: Type.Object({\n notes: Type.Optional(Type.String({ description: '발행 노트 (버전 설명)' })),\n publishedBy: Type.Optional(Type.String({ description: '발행자 ID' }))\n }),\n response: Type.Union([\n Type.Object({\n success: Type.Boolean(),\n labelId: Type.Number(),\n version: Type.Number(),\n message: Type.String()\n }),\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;\n\n/**\n * GET /_cms/labels/:labelId/admin - 관리자용 라벨 조회 (Draft + Published + Status)\n */\nexport const getAdminLabelContract = {\n method: 'GET' as const,\n path: '/_cms/labels/:labelId/admin',\n params: Type.Object({\n labelId: Type.String({ description: '라벨 ID' })\n }),\n response: Type.Union([\n Type.Object({\n label: Type.Object({\n id: Type.Number(),\n key: Type.String(),\n section: Type.String(),\n type: Type.String(),\n description: Type.Union([Type.String(), Type.Null()]),\n publishedVersion: Type.Union([Type.Number(), Type.Null()]),\n createdBy: Type.Union([Type.String(), Type.Null()]),\n createdAt: Type.String(),\n updatedAt: Type.String()\n }),\n draft: Type.Array(Type.Object({\n id: Type.Number(),\n labelId: Type.Number(),\n version: Type.Null(),\n locale: Type.String(),\n breakpoint: Type.Union([Type.String(), Type.Null()]),\n value: Type.Any(),\n createdAt: Type.String()\n })),\n published: Type.Array(Type.Object({\n id: Type.Number(),\n labelId: Type.Number(),\n version: Type.Number(),\n locale: Type.String(),\n breakpoint: Type.Union([Type.String(), Type.Null()]),\n value: Type.Any(),\n createdAt: Type.String()\n })),\n status: Type.Union([\n Type.Literal('default-only'),\n Type.Literal('unpublished'),\n Type.Literal('published'),\n Type.Literal('modified')\n ])\n }),\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;","/**\n * Auto-generated API Client\n *\n * Generated by @spfn/core codegen\n * DO NOT EDIT MANUALLY\n *\n * @generated 2025-11-03T05:36:08.364Z\n */\n\nimport { client } from '@spfn/core/client';\nimport type { InferContract } from '@spfn/core';\n\nimport { getLabelByKeyContract } from '@/lib/contracts/labels';\n\n// ============================================\n// Types\n// ============================================\n\nexport type GetLabelByKeyResponse = InferContract<typeof getLabelByKeyContract>['response'];\nexport type GetLabelByKeyParams = InferContract<typeof getLabelByKeyContract>['params'];\n\n// ============================================\n// API Functions\n// ============================================\n\n/**\n * GET /_cms/labels/by-key/:key\n */\nexport const getLabelByKey = (options: { params: GetLabelByKeyParams }) => client.call(getLabelByKeyContract, options);\n\n","/**\n * Auto-generated API Client\n *\n * Generated by @spfn/core codegen\n * DO NOT EDIT MANUALLY\n *\n * @generated 2025-11-03T05:36:08.364Z\n */\n\nimport { client } from '@spfn/core/client';\nimport type { InferContract } from '@spfn/core';\n\nimport { publishLabelContract } from '@/lib/contracts/labels';\n\n// ============================================\n// Types\n// ============================================\n\nexport type PublishLabelResponse = InferContract<typeof publishLabelContract>['response'];\nexport type PublishLabelParams = InferContract<typeof publishLabelContract>['params'];\nexport type PublishLabelBody = InferContract<typeof publishLabelContract>['body'];\n\n// ============================================\n// API Functions\n// ============================================\n\n/**\n * POST /_cms/labels/:labelId/publish\n */\nexport const publishLabel = (options: { params: PublishLabelParams, body: PublishLabelBody }) => client.call(publishLabelContract, options);\n\n","/**\n * Auto-generated API Client\n *\n * Generated by @spfn/core codegen\n * DO NOT EDIT MANUALLY\n *\n * @generated 2025-11-03T05:36:08.365Z\n */\n\nimport { client } from '@spfn/core/client';\nimport type { InferContract } from '@spfn/core';\n\nimport { getAdminLabelContract } from '@/lib/contracts/labels';\n\n// ============================================\n// Types\n// ============================================\n\nexport type GetAdminLabelResponse = InferContract<typeof getAdminLabelContract>['response'];\nexport type GetAdminLabelParams = InferContract<typeof getAdminLabelContract>['params'];\n\n// ============================================\n// API Functions\n// ============================================\n\n/**\n * GET /_cms/labels/:labelId/admin\n */\nexport const getAdminLabel = (options: { params: GetAdminLabelParams }) => client.call(getAdminLabelContract, options);\n\n","/**\n * Auto-generated API Client\n *\n * Generated by @spfn/core codegen\n * DO NOT EDIT MANUALLY\n *\n * @generated 2025-11-03T05:36:08.365Z\n */\n\nimport { client } from '@spfn/core/client';\nimport type { InferContract } from '@spfn/core';\n\nimport { getPublishedCacheContract, upsertPublishedCacheContract } from '@/lib/contracts/published-cache';\n\n// ============================================\n// Types\n// ============================================\n\nexport type GetPublishedCacheResponse = InferContract<typeof getPublishedCacheContract>['response'];\nexport type GetPublishedCacheQuery = InferContract<typeof getPublishedCacheContract>['query'];\n\nexport type UpsertPublishedCacheResponse = InferContract<typeof upsertPublishedCacheContract>['response'];\nexport type UpsertPublishedCacheBody = InferContract<typeof upsertPublishedCacheContract>['body'];\n\n// ============================================\n// API Functions\n// ============================================\n\n/**\n * GET /_cms/published-cache\n */\nexport const getPublishedCache = (options: { query?: GetPublishedCacheQuery }) => client.call(getPublishedCacheContract, options);\n\n/**\n * POST /_cms/published-cache\n */\nexport const upsertPublishedCache = (options: { body: UpsertPublishedCacheBody }) => client.call(upsertPublishedCacheContract, options);\n\n","import { Type } from '@sinclair/typebox';\nimport type { RouteContract } from '@spfn/core/route';\n\nconst SectionData = Type.Object({\n section: Type.String(),\n locale: Type.String(),\n content: Type.Record(Type.String(), Type.Any()),\n version: Type.Number(),\n publishedAt: Type.Union([Type.String(), Type.Null()]),\n});\n\n/**\n * GET /_cms/published-cache\n * 발행된 콘텐츠 캐시 조회 (단일 또는 여러 섹션)\n */\nexport const getPublishedCacheContract = {\n method: 'GET' as const,\n path: '/_cms/published-cache',\n query: Type.Object({\n sections: Type.Union([\n Type.String({ description: '단일 섹션 이름 (예: home)' }),\n Type.Array(Type.String(), { description: '여러 섹션 이름 (예: [\"home\", \"footer\"])' })\n ]),\n locale: Type.Optional(Type.String({ default: 'ko', description: '언어 코드' })),\n }),\n response: Type.Union([\n // 성공: 항상 배열로 반환\n Type.Array(SectionData),\n // 에러\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;\n\n/**\n * POST /_cms/published-cache\n * 발행된 콘텐츠 캐시 업데이트/생성 (upsert)\n */\nexport const upsertPublishedCacheContract = {\n method: 'POST' as const,\n path: '/_cms/published-cache',\n body: Type.Object({\n section: Type.String({ description: '섹션 이름 (예: home)' }),\n locale: Type.String({ description: '언어 코드 (예: ko, en, ja)' }),\n content: Type.Record(Type.String(), Type.Any(), { description: '발행할 콘텐츠 (key-value 형태)' }),\n version: Type.Number({ description: '버전 번호' })\n }),\n response: Type.Union([\n SectionData,\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;","/**\n * Auto-generated API Client\n *\n * Generated by @spfn/core codegen\n * DO NOT EDIT MANUALLY\n *\n * @generated 2025-11-03T05:36:08.366Z\n */\n\nimport { client } from '@spfn/core/client';\nimport type { InferContract } from '@spfn/core';\n\nimport { saveValuesContract, getValuesContract } from '@/lib/contracts/values';\n\n// ============================================\n// Types\n// ============================================\n\nexport type SaveValuesResponse = InferContract<typeof saveValuesContract>['response'];\nexport type SaveValuesParams = InferContract<typeof saveValuesContract>['params'];\nexport type SaveValuesBody = InferContract<typeof saveValuesContract>['body'];\n\nexport type GetValuesResponse = InferContract<typeof getValuesContract>['response'];\nexport type GetValuesQuery = InferContract<typeof getValuesContract>['query'];\nexport type GetValuesParams = InferContract<typeof getValuesContract>['params'];\n\n// ============================================\n// API Functions\n// ============================================\n\n/**\n * POST /_cms/values/:labelId\n */\nexport const saveValues = (options: { params: SaveValuesParams, body: SaveValuesBody }) => client.call(saveValuesContract, options);\n\n/**\n * GET /_cms/values/:labelId/:version\n */\nexport const getValues = (options: { params: GetValuesParams, query?: GetValuesQuery }) => client.call(getValuesContract, options);\n\n","import { Type } from '@sinclair/typebox';\nimport type { RouteContract } from '@spfn/core/route';\n\n/**\n * Label Value 타입 정의\n */\nconst LabelValueSchema = Type.Object({\n type: Type.Union([\n Type.Literal('text'),\n Type.Literal('image'),\n Type.Literal('video'),\n Type.Literal('file'),\n Type.Literal('object')\n ]),\n content: Type.Optional(Type.String()), // text type\n url: Type.Optional(Type.String()), // image, video, file types\n alt: Type.Optional(Type.String()), // image type\n width: Type.Optional(Type.Number()), // image type\n height: Type.Optional(Type.Number()), // image type\n thumbnail: Type.Optional(Type.String()), // video type\n duration: Type.Optional(Type.Number()), // video type\n filename: Type.Optional(Type.String()), // file type\n size: Type.Optional(Type.Number()), // file type\n fields: Type.Optional(Type.Any()) // object type - recursive structure\n});\n\n/**\n * POST /_cms/values/:labelId - 라벨 값 저장\n * - version: null → Draft 저장 (덮어쓰기)\n * - version: number → Published 버전 생성 (불변)\n */\nexport const saveValuesContract = {\n method: 'POST' as const,\n path: '/_cms/values/:labelId',\n params: Type.Object({\n labelId: Type.String({ description: '라벨 ID' })\n }),\n body: Type.Object({\n version: Type.Union([\n Type.Null({ description: 'Draft 저장 (덮어쓰기)' }),\n Type.Number({ description: '버전 번호 (불변)', minimum: 1 })\n ]),\n values: Type.Array(\n Type.Object({\n locale: Type.String({ description: '언어 코드 (ko, en, ja)', default: 'ko' }),\n breakpoint: Type.Optional(Type.Union([\n Type.Literal('sm'),\n Type.Literal('md'),\n Type.Literal('lg'),\n Type.Literal('xl'),\n Type.Literal('2xl'),\n Type.Null()\n ], { description: '반응형 브레이크포인트' })),\n value: LabelValueSchema\n })\n )\n }),\n response: Type.Union([\n Type.Object({\n success: Type.Boolean(),\n saved: Type.Number(),\n version: Type.Union([Type.Null(), Type.Number()])\n }),\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;\n\n/**\n * GET /_cms/values/:labelId/:version - 특정 버전의 값 조회\n */\nexport const getValuesContract = {\n method: 'GET' as const,\n path: '/_cms/values/:labelId/:version',\n params: Type.Object({\n labelId: Type.String({ description: '라벨 ID' }),\n version: Type.String({ description: '버전 번호' })\n }),\n query: Type.Object({\n locale: Type.Optional(Type.String({ description: '언어 코드 (ko, en, ja)' })),\n breakpoint: Type.Optional(Type.String({ description: '반응형 브레이크포인트' }))\n }),\n response: Type.Union([\n Type.Object({\n labelId: Type.Number(),\n version: Type.Number(),\n values: Type.Array(\n Type.Object({\n id: Type.Number(),\n locale: Type.String(),\n breakpoint: Type.Union([Type.String(), Type.Null()]),\n value: Type.Any(),\n createdAt: Type.String()\n })\n )\n }),\n Type.Object({\n error: Type.String()\n })\n ])\n} as const satisfies RouteContract;"],"mappings":"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","names":["client","client","client","client","client","client","client","client","Type","client","client","Type","client"]}
package/dist/client.js CHANGED
@@ -5,7 +5,7 @@ import React from "react";
5
5
  import { create } from "zustand";
6
6
 
7
7
  // src/api/index.ts
8
- import { client as client5 } from "@spfn/core/client";
8
+ import { client as client7 } from "@spfn/core/client";
9
9
 
10
10
  // src/api/cms-labels.ts
11
11
  import { client } from "@spfn/core/client";
@@ -27,6 +27,7 @@ var getLabelsContract = {
27
27
  key: Type.String(),
28
28
  section: Type.String(),
29
29
  type: Type.String(),
30
+ description: Type.Union([Type.String(), Type.Null()], { description: "\uB77C\uBCA8 \uC124\uBA85" }),
30
31
  publishedVersion: Type.Union([Type.Number(), Type.Null()]),
31
32
  createdBy: Type.Union([Type.String(), Type.Null()]),
32
33
  createdAt: Type.String(),
@@ -88,6 +89,7 @@ var getLabelContract = {
88
89
  key: Type.String(),
89
90
  section: Type.String(),
90
91
  type: Type.String(),
92
+ description: Type.Union([Type.String(), Type.Null()]),
91
93
  publishedVersion: Type.Union([Type.Number(), Type.Null()]),
92
94
  createdBy: Type.Union([Type.String(), Type.Null()]),
93
95
  createdAt: Type.String(),
@@ -120,6 +122,7 @@ var updateLabelContract = {
120
122
  key: Type.String(),
121
123
  section: Type.String(),
122
124
  type: Type.String(),
125
+ description: Type.Union([Type.String(), Type.Null()]),
123
126
  publishedVersion: Type.Union([Type.Number(), Type.Null()]),
124
127
  createdBy: Type.Union([Type.String(), Type.Null()]),
125
128
  createdAt: Type.String(),
@@ -158,6 +161,7 @@ var getLabelByKeyContract = {
158
161
  key: Type.String(),
159
162
  section: Type.String(),
160
163
  type: Type.String(),
164
+ description: Type.Union([Type.String(), Type.Null()]),
161
165
  publishedVersion: Type.Union([Type.Number(), Type.Null()]),
162
166
  createdBy: Type.Union([Type.String(), Type.Null()]),
163
167
  createdAt: Type.String(),
@@ -169,6 +173,77 @@ var getLabelByKeyContract = {
169
173
  })
170
174
  ])
171
175
  };
176
+ var publishLabelContract = {
177
+ method: "POST",
178
+ path: "/_cms/labels/:labelId/publish",
179
+ params: Type.Object({
180
+ labelId: Type.String({ description: "\uB77C\uBCA8 ID" })
181
+ }),
182
+ body: Type.Object({
183
+ notes: Type.Optional(Type.String({ description: "\uBC1C\uD589 \uB178\uD2B8 (\uBC84\uC804 \uC124\uBA85)" })),
184
+ publishedBy: Type.Optional(Type.String({ description: "\uBC1C\uD589\uC790 ID" }))
185
+ }),
186
+ response: Type.Union([
187
+ Type.Object({
188
+ success: Type.Boolean(),
189
+ labelId: Type.Number(),
190
+ version: Type.Number(),
191
+ message: Type.String()
192
+ }),
193
+ Type.Object({
194
+ error: Type.String()
195
+ })
196
+ ])
197
+ };
198
+ var getAdminLabelContract = {
199
+ method: "GET",
200
+ path: "/_cms/labels/:labelId/admin",
201
+ params: Type.Object({
202
+ labelId: Type.String({ description: "\uB77C\uBCA8 ID" })
203
+ }),
204
+ response: Type.Union([
205
+ Type.Object({
206
+ label: Type.Object({
207
+ id: Type.Number(),
208
+ key: Type.String(),
209
+ section: Type.String(),
210
+ type: Type.String(),
211
+ description: Type.Union([Type.String(), Type.Null()]),
212
+ publishedVersion: Type.Union([Type.Number(), Type.Null()]),
213
+ createdBy: Type.Union([Type.String(), Type.Null()]),
214
+ createdAt: Type.String(),
215
+ updatedAt: Type.String()
216
+ }),
217
+ draft: Type.Array(Type.Object({
218
+ id: Type.Number(),
219
+ labelId: Type.Number(),
220
+ version: Type.Null(),
221
+ locale: Type.String(),
222
+ breakpoint: Type.Union([Type.String(), Type.Null()]),
223
+ value: Type.Any(),
224
+ createdAt: Type.String()
225
+ })),
226
+ published: Type.Array(Type.Object({
227
+ id: Type.Number(),
228
+ labelId: Type.Number(),
229
+ version: Type.Number(),
230
+ locale: Type.String(),
231
+ breakpoint: Type.Union([Type.String(), Type.Null()]),
232
+ value: Type.Any(),
233
+ createdAt: Type.String()
234
+ })),
235
+ status: Type.Union([
236
+ Type.Literal("default-only"),
237
+ Type.Literal("unpublished"),
238
+ Type.Literal("published"),
239
+ Type.Literal("modified")
240
+ ])
241
+ }),
242
+ Type.Object({
243
+ error: Type.String()
244
+ })
245
+ ])
246
+ };
172
247
 
173
248
  // src/api/cms-labels.ts
174
249
  var getLabels = (options) => client.call(getLabelsContract, options);
@@ -181,8 +256,16 @@ var deleteLabel = (options) => client.call(deleteLabelContract, options);
181
256
  import { client as client2 } from "@spfn/core/client";
182
257
  var getLabelByKey = (options) => client2.call(getLabelByKeyContract, options);
183
258
 
184
- // src/api/cms-published-cache.ts
259
+ // src/api/cms-labels-publish.ts
185
260
  import { client as client3 } from "@spfn/core/client";
261
+ var publishLabel = (options) => client3.call(publishLabelContract, options);
262
+
263
+ // src/api/cms-labels-admin.ts
264
+ import { client as client4 } from "@spfn/core/client";
265
+ var getAdminLabel = (options) => client4.call(getAdminLabelContract, options);
266
+
267
+ // src/api/cms-published-cache.ts
268
+ import { client as client5 } from "@spfn/core/client";
186
269
 
187
270
  // src/lib/contracts/published-cache.ts
188
271
  import { Type as Type2 } from "@sinclair/typebox";
@@ -230,11 +313,11 @@ var upsertPublishedCacheContract = {
230
313
  };
231
314
 
232
315
  // src/api/cms-published-cache.ts
233
- var getPublishedCache = (options) => client3.call(getPublishedCacheContract, options);
234
- var upsertPublishedCache = (options) => client3.call(upsertPublishedCacheContract, options);
316
+ var getPublishedCache = (options) => client5.call(getPublishedCacheContract, options);
317
+ var upsertPublishedCache = (options) => client5.call(upsertPublishedCacheContract, options);
235
318
 
236
319
  // src/api/cms-values.ts
237
- import { client as client4 } from "@spfn/core/client";
320
+ import { client as client6 } from "@spfn/core/client";
238
321
 
239
322
  // src/lib/contracts/values.ts
240
323
  import { Type as Type3 } from "@sinclair/typebox";
@@ -336,8 +419,8 @@ var getValuesContract = {
336
419
  };
337
420
 
338
421
  // src/api/cms-values.ts
339
- var saveValues = (options) => client4.call(saveValuesContract, options);
340
- var getValues = (options) => client4.call(getValuesContract, options);
422
+ var saveValues = (options) => client6.call(saveValuesContract, options);
423
+ var getValues = (options) => client6.call(getValuesContract, options);
341
424
 
342
425
  // src/api/index.ts
343
426
  var cmsApi = {
@@ -347,6 +430,8 @@ var cmsApi = {
347
430
  updateLabel,
348
431
  deleteLabel,
349
432
  getLabelByKey,
433
+ publishLabel,
434
+ getAdminLabel,
350
435
  getPublishedCache,
351
436
  upsertPublishedCache,
352
437
  saveValues,