@spfn/cms 0.1.0-alpha.8 → 0.1.0-alpha.81
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +28 -416
- package/dist/{helpers/locale.actions.d.ts → actions-BEFWwQsh.d.ts} +70 -7
- package/dist/actions.d.ts +2 -9
- package/dist/actions.js +99 -10
- package/dist/actions.js.map +1 -1
- package/dist/api.d.ts +319 -0
- package/dist/api.js +467 -0
- package/dist/api.js.map +1 -0
- package/dist/client.d.ts +135 -127
- package/dist/client.js +1318 -59
- package/dist/client.js.map +1 -1
- package/dist/{types.d.ts → index-Dh5FjWzR.d.ts} +45 -7
- package/dist/index.d.ts +112 -16
- package/dist/index.js +625 -23
- package/dist/index.js.map +1 -1
- package/dist/label-sync-generator-B0EmvtWM.d.ts +32 -0
- package/dist/lib/contracts/labels.d.ts +244 -0
- package/dist/lib/contracts/labels.js +269 -0
- package/dist/lib/contracts/labels.js.map +1 -0
- package/dist/lib/contracts/published-cache.d.ts +48 -0
- package/dist/lib/contracts/published-cache.js +49 -0
- package/dist/lib/contracts/published-cache.js.map +1 -0
- package/dist/lib/contracts/values.d.ts +71 -0
- package/dist/lib/contracts/values.js +104 -0
- package/dist/lib/contracts/values.js.map +1 -0
- package/dist/locale.constants-BNkSdNP1.d.ts +108 -0
- package/dist/{entities → server/entities}/cms-audit-logs.d.ts +15 -70
- package/dist/server/entities/cms-audit-logs.js +78 -0
- package/dist/server/entities/cms-audit-logs.js.map +1 -0
- package/dist/{entities → server/entities}/cms-draft-cache.d.ts +13 -73
- package/dist/server/entities/cms-draft-cache.js +38 -0
- package/dist/server/entities/cms-draft-cache.js.map +1 -0
- package/dist/{entities → server/entities}/cms-label-values.d.ts +16 -67
- package/dist/server/entities/cms-label-values.js +81 -0
- package/dist/server/entities/cms-label-values.js.map +1 -0
- package/dist/{entities → server/entities}/cms-labels.d.ts +17 -14
- package/dist/server/entities/cms-labels.js +42 -0
- package/dist/server/entities/cms-labels.js.map +1 -0
- package/dist/{entities → server/entities}/cms-published-cache.d.ts +14 -69
- package/dist/server/entities/cms-published-cache.js +36 -0
- package/dist/server/entities/cms-published-cache.js.map +1 -0
- package/dist/server/entities/index.d.ts +6 -0
- package/dist/server/entities/index.js +185 -0
- package/dist/server/entities/index.js.map +1 -0
- package/dist/server/generators/index.d.ts +19 -0
- package/dist/server/generators/index.js +731 -0
- package/dist/server/generators/index.js.map +1 -0
- package/dist/server/labels/index.d.ts +1 -0
- package/dist/server/labels/index.js +33 -0
- package/dist/server/labels/index.js.map +1 -0
- package/dist/server/repositories/index.d.ts +212 -0
- package/dist/server/repositories/index.js +418 -0
- package/dist/server/repositories/index.js.map +1 -0
- package/dist/server/routes/labels/[id]/admin/index.js +679 -0
- package/dist/server/routes/labels/[id]/admin/index.js.map +1 -0
- package/dist/server/routes/labels/[id]/index.js +576 -0
- package/dist/server/routes/labels/[id]/index.js.map +1 -0
- package/dist/server/routes/labels/[id]/publish/index.js +720 -0
- package/dist/server/routes/labels/[id]/publish/index.js.map +1 -0
- package/dist/server/routes/labels/[id]/versions/index.js +548 -0
- package/dist/server/routes/labels/[id]/versions/index.js.map +1 -0
- package/dist/server/routes/labels/_id_/admin/index.d.ts +11 -0
- package/dist/{routes/labels/[id] → server/routes/labels/_id_}/index.d.ts +5 -3
- package/dist/server/routes/labels/_id_/publish/index.d.ts +11 -0
- package/dist/server/routes/labels/_id_/versions/index.d.ts +11 -0
- package/dist/server/routes/labels/by-key/[key]/index.js +525 -0
- package/dist/server/routes/labels/by-key/[key]/index.js.map +1 -0
- package/dist/server/routes/labels/by-key/_key_/index.d.ts +10 -0
- package/dist/server/routes/labels/index.d.ts +12 -0
- package/dist/server/routes/labels/index.js +684 -0
- package/dist/server/routes/labels/index.js.map +1 -0
- package/dist/server/routes/published-cache/index.d.ts +11 -0
- package/dist/server/routes/published-cache/index.js +337 -0
- package/dist/server/routes/published-cache/index.js.map +1 -0
- package/dist/server/routes/values/[labelId]/[version]/index.js +457 -0
- package/dist/server/routes/values/[labelId]/[version]/index.js.map +1 -0
- package/dist/server/routes/values/[labelId]/index.js +452 -0
- package/dist/server/routes/values/[labelId]/index.js.map +1 -0
- package/dist/server/routes/values/_labelId_/_version_/index.d.ts +10 -0
- package/dist/server/routes/values/_labelId_/index.d.ts +10 -0
- package/dist/server.d.ts +77 -7
- package/dist/server.js +1747 -247
- package/dist/server.js.map +1 -1
- package/migrations/0000_init.sql +3 -0
- package/migrations/0001_far_lady_vermin.sql +86 -0
- package/migrations/0002_heavy_the_enforcers.sql +2 -0
- package/migrations/0003_rare_runaways.sql +1 -0
- package/migrations/meta/0000_snapshot.json +15 -0
- package/migrations/meta/0001_snapshot.json +687 -0
- package/migrations/meta/0002_snapshot.json +686 -0
- package/migrations/meta/0003_snapshot.json +563 -0
- package/migrations/meta/_journal.json +34 -0
- package/package.json +55 -36
- package/dist/actions.d.ts.map +0 -1
- package/dist/client.d.ts.map +0 -1
- package/dist/cms.config.d.ts +0 -77
- package/dist/cms.config.d.ts.map +0 -1
- package/dist/cms.config.js +0 -111
- package/dist/cms.config.js.map +0 -1
- package/dist/entities/cms-audit-logs.d.ts.map +0 -1
- package/dist/entities/cms-audit-logs.js +0 -103
- package/dist/entities/cms-audit-logs.js.map +0 -1
- package/dist/entities/cms-draft-cache.d.ts.map +0 -1
- package/dist/entities/cms-draft-cache.js +0 -112
- package/dist/entities/cms-draft-cache.js.map +0 -1
- package/dist/entities/cms-label-values.d.ts.map +0 -1
- package/dist/entities/cms-label-values.js +0 -105
- package/dist/entities/cms-label-values.js.map +0 -1
- package/dist/entities/cms-label-versions.d.ts +0 -207
- package/dist/entities/cms-label-versions.d.ts.map +0 -1
- package/dist/entities/cms-label-versions.js +0 -80
- package/dist/entities/cms-label-versions.js.map +0 -1
- package/dist/entities/cms-labels.d.ts.map +0 -1
- package/dist/entities/cms-labels.js +0 -48
- package/dist/entities/cms-labels.js.map +0 -1
- package/dist/entities/cms-published-cache.d.ts.map +0 -1
- package/dist/entities/cms-published-cache.js +0 -103
- package/dist/entities/cms-published-cache.js.map +0 -1
- package/dist/entities/index.d.ts +0 -10
- package/dist/entities/index.d.ts.map +0 -1
- package/dist/entities/index.js +0 -10
- package/dist/entities/index.js.map +0 -1
- package/dist/generators/index.d.ts +0 -19
- package/dist/generators/index.d.ts.map +0 -1
- package/dist/generators/index.js +0 -19
- package/dist/generators/index.js.map +0 -1
- package/dist/generators/label-sync-generator.d.ts +0 -33
- package/dist/generators/label-sync-generator.d.ts.map +0 -1
- package/dist/generators/label-sync-generator.js +0 -86
- package/dist/generators/label-sync-generator.js.map +0 -1
- package/dist/helpers/locale.actions.d.ts.map +0 -1
- package/dist/helpers/locale.actions.js +0 -210
- package/dist/helpers/locale.actions.js.map +0 -1
- package/dist/helpers/locale.constants.d.ts +0 -10
- package/dist/helpers/locale.constants.d.ts.map +0 -1
- package/dist/helpers/locale.constants.js +0 -10
- package/dist/helpers/locale.constants.js.map +0 -1
- package/dist/helpers/locale.d.ts +0 -17
- package/dist/helpers/locale.d.ts.map +0 -1
- package/dist/helpers/locale.js +0 -20
- package/dist/helpers/locale.js.map +0 -1
- package/dist/helpers/sync.d.ts +0 -41
- package/dist/helpers/sync.d.ts.map +0 -1
- package/dist/helpers/sync.js +0 -309
- package/dist/helpers/sync.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/init.d.ts +0 -31
- package/dist/init.d.ts.map +0 -1
- package/dist/init.js +0 -36
- package/dist/init.js.map +0 -1
- package/dist/labels/helpers.d.ts +0 -31
- package/dist/labels/helpers.d.ts.map +0 -1
- package/dist/labels/helpers.js +0 -60
- package/dist/labels/helpers.js.map +0 -1
- package/dist/labels/index.d.ts +0 -7
- package/dist/labels/index.d.ts.map +0 -1
- package/dist/labels/index.js +0 -7
- package/dist/labels/index.js.map +0 -1
- package/dist/repositories/cms-draft-cache.repository.d.ts +0 -62
- package/dist/repositories/cms-draft-cache.repository.d.ts.map +0 -1
- package/dist/repositories/cms-draft-cache.repository.js +0 -56
- package/dist/repositories/cms-draft-cache.repository.js.map +0 -1
- package/dist/repositories/cms-label-values.repository.d.ts +0 -32
- package/dist/repositories/cms-label-values.repository.d.ts.map +0 -1
- package/dist/repositories/cms-label-values.repository.js +0 -72
- package/dist/repositories/cms-label-values.repository.js.map +0 -1
- package/dist/repositories/cms-labels.repository.d.ts +0 -53
- package/dist/repositories/cms-labels.repository.d.ts.map +0 -1
- package/dist/repositories/cms-labels.repository.js +0 -77
- package/dist/repositories/cms-labels.repository.js.map +0 -1
- package/dist/repositories/cms-published-cache.repository.d.ts +0 -53
- package/dist/repositories/cms-published-cache.repository.d.ts.map +0 -1
- package/dist/repositories/cms-published-cache.repository.js +0 -54
- package/dist/repositories/cms-published-cache.repository.js.map +0 -1
- package/dist/repositories/index.d.ts +0 -8
- package/dist/repositories/index.d.ts.map +0 -1
- package/dist/repositories/index.js +0 -9
- package/dist/repositories/index.js.map +0 -1
- package/dist/routes/labels/[id]/contract.d.ts +0 -68
- package/dist/routes/labels/[id]/contract.d.ts.map +0 -1
- package/dist/routes/labels/[id]/contract.js +0 -84
- package/dist/routes/labels/[id]/contract.js.map +0 -1
- package/dist/routes/labels/[id]/index.d.ts.map +0 -1
- package/dist/routes/labels/[id]/index.js +0 -96
- package/dist/routes/labels/[id]/index.js.map +0 -1
- package/dist/routes/labels/by-key/[key]/contract.d.ts +0 -24
- package/dist/routes/labels/by-key/[key]/contract.d.ts.map +0 -1
- package/dist/routes/labels/by-key/[key]/contract.js +0 -28
- package/dist/routes/labels/by-key/[key]/contract.js.map +0 -1
- package/dist/routes/labels/by-key/[key]/index.d.ts +0 -8
- package/dist/routes/labels/by-key/[key]/index.d.ts.map +0 -1
- package/dist/routes/labels/by-key/[key]/index.js +0 -32
- package/dist/routes/labels/by-key/[key]/index.js.map +0 -1
- package/dist/routes/labels/contract.d.ts +0 -59
- package/dist/routes/labels/contract.d.ts.map +0 -1
- package/dist/routes/labels/contract.js +0 -75
- package/dist/routes/labels/contract.js.map +0 -1
- package/dist/routes/labels/index.d.ts +0 -10
- package/dist/routes/labels/index.d.ts.map +0 -1
- package/dist/routes/labels/index.js +0 -73
- package/dist/routes/labels/index.js.map +0 -1
- package/dist/routes/published-cache/contract.d.ts +0 -25
- package/dist/routes/published-cache/contract.d.ts.map +0 -1
- package/dist/routes/published-cache/contract.js +0 -35
- package/dist/routes/published-cache/contract.js.map +0 -1
- package/dist/routes/published-cache/index.d.ts +0 -8
- package/dist/routes/published-cache/index.d.ts.map +0 -1
- package/dist/routes/published-cache/index.js +0 -33
- package/dist/routes/published-cache/index.js.map +0 -1
- package/dist/routes/values/[labelId]/[version]/contract.d.ts +0 -29
- package/dist/routes/values/[labelId]/[version]/contract.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/[version]/contract.js +0 -33
- package/dist/routes/values/[labelId]/[version]/contract.js.map +0 -1
- package/dist/routes/values/[labelId]/[version]/index.d.ts +0 -8
- package/dist/routes/values/[labelId]/[version]/index.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/[version]/index.js +0 -45
- package/dist/routes/values/[labelId]/[version]/index.js.map +0 -1
- package/dist/routes/values/[labelId]/contract.d.ts +0 -38
- package/dist/routes/values/[labelId]/contract.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/contract.js +0 -59
- package/dist/routes/values/[labelId]/contract.js.map +0 -1
- package/dist/routes/values/[labelId]/index.d.ts +0 -8
- package/dist/routes/values/[labelId]/index.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/index.js +0 -42
- package/dist/routes/values/[labelId]/index.js.map +0 -1
- package/dist/server.d.ts.map +0 -1
- package/dist/store.d.ts +0 -87
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -205
- package/dist/store.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -7
- package/dist/types.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/contracts/labels.ts"],"sourcesContent":["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 includeDefaultValues: Type.Optional(Type.Boolean({ description: '기본값 포함 여부' }))\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 })\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/:id/publish - 라벨 발행 (Draft → Published)\n */\nexport const publishLabelContract = {\n method: 'POST' as const,\n path: '/_cms/labels/:id/publish',\n params: Type.Object({\n id: 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 id: 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/:id/admin - 관리자용 라벨 조회 (Draft + Published + Status)\n */\nexport const getAdminLabelContract = {\n method: 'GET' as const,\n path: '/_cms/labels/:id/admin',\n params: Type.Object({\n id: 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\n/**\n * GET /_cms/labels/:id/versions - 라벨 버전 히스토리 조회\n */\nexport const getLabelVersionsContract = {\n method: 'GET' as const,\n path: '/_cms/labels/:id/versions',\n params: Type.Object({\n id: Type.String({ description: '라벨 ID' })\n }),\n response: Type.Union([\n Type.Object({\n versions: Type.Array(Type.Object({\n version: Type.Number({ description: '버전 번호' }),\n publishedAt: Type.String({ description: '발행 시각 (ISO 8601)' }),\n publishedBy: Type.Union([Type.String(), Type.Null()], { description: '발행자 ID' }),\n notes: Type.Union([Type.String(), Type.Null()], { description: '발행 노트' }),\n values: Type.Array(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":[]}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as _sinclair_typebox from '@sinclair/typebox';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* GET /_cms/published-cache
|
|
5
|
+
* 발행된 콘텐츠 캐시 조회 (단일 또는 여러 섹션)
|
|
6
|
+
*/
|
|
7
|
+
declare const getPublishedCacheContract: {
|
|
8
|
+
readonly method: "GET";
|
|
9
|
+
readonly path: "/_cms/published-cache";
|
|
10
|
+
readonly query: _sinclair_typebox.TObject<{
|
|
11
|
+
sections: _sinclair_typebox.TUnion<[_sinclair_typebox.TString, _sinclair_typebox.TArray<_sinclair_typebox.TString>]>;
|
|
12
|
+
locale: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
|
|
13
|
+
}>;
|
|
14
|
+
readonly response: _sinclair_typebox.TUnion<[_sinclair_typebox.TArray<_sinclair_typebox.TObject<{
|
|
15
|
+
section: _sinclair_typebox.TString;
|
|
16
|
+
locale: _sinclair_typebox.TString;
|
|
17
|
+
content: _sinclair_typebox.TRecord<_sinclair_typebox.TString, _sinclair_typebox.TAny>;
|
|
18
|
+
version: _sinclair_typebox.TNumber;
|
|
19
|
+
publishedAt: _sinclair_typebox.TUnion<[_sinclair_typebox.TString, _sinclair_typebox.TNull]>;
|
|
20
|
+
}>>, _sinclair_typebox.TObject<{
|
|
21
|
+
error: _sinclair_typebox.TString;
|
|
22
|
+
}>]>;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* POST /_cms/published-cache
|
|
26
|
+
* 발행된 콘텐츠 캐시 업데이트/생성 (upsert)
|
|
27
|
+
*/
|
|
28
|
+
declare const upsertPublishedCacheContract: {
|
|
29
|
+
readonly method: "POST";
|
|
30
|
+
readonly path: "/_cms/published-cache";
|
|
31
|
+
readonly body: _sinclair_typebox.TObject<{
|
|
32
|
+
section: _sinclair_typebox.TString;
|
|
33
|
+
locale: _sinclair_typebox.TString;
|
|
34
|
+
content: _sinclair_typebox.TRecord<_sinclair_typebox.TString, _sinclair_typebox.TAny>;
|
|
35
|
+
version: _sinclair_typebox.TNumber;
|
|
36
|
+
}>;
|
|
37
|
+
readonly response: _sinclair_typebox.TUnion<[_sinclair_typebox.TObject<{
|
|
38
|
+
section: _sinclair_typebox.TString;
|
|
39
|
+
locale: _sinclair_typebox.TString;
|
|
40
|
+
content: _sinclair_typebox.TRecord<_sinclair_typebox.TString, _sinclair_typebox.TAny>;
|
|
41
|
+
version: _sinclair_typebox.TNumber;
|
|
42
|
+
publishedAt: _sinclair_typebox.TUnion<[_sinclair_typebox.TString, _sinclair_typebox.TNull]>;
|
|
43
|
+
}>, _sinclair_typebox.TObject<{
|
|
44
|
+
error: _sinclair_typebox.TString;
|
|
45
|
+
}>]>;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export { getPublishedCacheContract, upsertPublishedCacheContract };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
// src/lib/contracts/published-cache.ts
|
|
2
|
+
import { Type } from "@sinclair/typebox";
|
|
3
|
+
var SectionData = Type.Object({
|
|
4
|
+
section: Type.String(),
|
|
5
|
+
locale: Type.String(),
|
|
6
|
+
content: Type.Record(Type.String(), Type.Any()),
|
|
7
|
+
version: Type.Number(),
|
|
8
|
+
publishedAt: Type.Union([Type.String(), Type.Null()])
|
|
9
|
+
});
|
|
10
|
+
var getPublishedCacheContract = {
|
|
11
|
+
method: "GET",
|
|
12
|
+
path: "/_cms/published-cache",
|
|
13
|
+
query: Type.Object({
|
|
14
|
+
sections: Type.Union([
|
|
15
|
+
Type.String({ description: "\uB2E8\uC77C \uC139\uC158 \uC774\uB984 (\uC608: home)" }),
|
|
16
|
+
Type.Array(Type.String(), { description: '\uC5EC\uB7EC \uC139\uC158 \uC774\uB984 (\uC608: ["home", "footer"])' })
|
|
17
|
+
]),
|
|
18
|
+
locale: Type.Optional(Type.String({ default: "ko", description: "\uC5B8\uC5B4 \uCF54\uB4DC" }))
|
|
19
|
+
}),
|
|
20
|
+
response: Type.Union([
|
|
21
|
+
// 성공: 항상 배열로 반환
|
|
22
|
+
Type.Array(SectionData),
|
|
23
|
+
// 에러
|
|
24
|
+
Type.Object({
|
|
25
|
+
error: Type.String()
|
|
26
|
+
})
|
|
27
|
+
])
|
|
28
|
+
};
|
|
29
|
+
var upsertPublishedCacheContract = {
|
|
30
|
+
method: "POST",
|
|
31
|
+
path: "/_cms/published-cache",
|
|
32
|
+
body: Type.Object({
|
|
33
|
+
section: Type.String({ description: "\uC139\uC158 \uC774\uB984 (\uC608: home)" }),
|
|
34
|
+
locale: Type.String({ description: "\uC5B8\uC5B4 \uCF54\uB4DC (\uC608: ko, en, ja)" }),
|
|
35
|
+
content: Type.Record(Type.String(), Type.Any(), { description: "\uBC1C\uD589\uD560 \uCF58\uD150\uCE20 (key-value \uD615\uD0DC)" }),
|
|
36
|
+
version: Type.Number({ description: "\uBC84\uC804 \uBC88\uD638" })
|
|
37
|
+
}),
|
|
38
|
+
response: Type.Union([
|
|
39
|
+
SectionData,
|
|
40
|
+
Type.Object({
|
|
41
|
+
error: Type.String()
|
|
42
|
+
})
|
|
43
|
+
])
|
|
44
|
+
};
|
|
45
|
+
export {
|
|
46
|
+
getPublishedCacheContract,
|
|
47
|
+
upsertPublishedCacheContract
|
|
48
|
+
};
|
|
49
|
+
//# sourceMappingURL=published-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/contracts/published-cache.ts"],"sourcesContent":["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;"],"mappings":";AAAA,SAAS,YAAY;AAGrB,IAAM,cAAc,KAAK,OAAO;AAAA,EAC5B,SAAS,KAAK,OAAO;AAAA,EACrB,QAAQ,KAAK,OAAO;AAAA,EACpB,SAAS,KAAK,OAAO,KAAK,OAAO,GAAG,KAAK,IAAI,CAAC;AAAA,EAC9C,SAAS,KAAK,OAAO;AAAA,EACrB,aAAa,KAAK,MAAM,CAAC,KAAK,OAAO,GAAG,KAAK,KAAK,CAAC,CAAC;AACxD,CAAC;AAMM,IAAM,4BAA4B;AAAA,EACrC,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,OAAO,KAAK,OAAO;AAAA,IACf,UAAU,KAAK,MAAM;AAAA,MACjB,KAAK,OAAO,EAAE,aAAa,wDAAqB,CAAC;AAAA,MACjD,KAAK,MAAM,KAAK,OAAO,GAAG,EAAE,aAAa,sEAAmC,CAAC;AAAA,IACjF,CAAC;AAAA,IACD,QAAQ,KAAK,SAAS,KAAK,OAAO,EAAE,SAAS,MAAM,aAAa,4BAAQ,CAAC,CAAC;AAAA,EAC9E,CAAC;AAAA,EACD,UAAU,KAAK,MAAM;AAAA;AAAA,IAEjB,KAAK,MAAM,WAAW;AAAA;AAAA,IAEtB,KAAK,OAAO;AAAA,MACR,OAAO,KAAK,OAAO;AAAA,IACvB,CAAC;AAAA,EACL,CAAC;AACL;AAMO,IAAM,+BAA+B;AAAA,EACxC,QAAQ;AAAA,EACR,MAAM;AAAA,EACN,MAAM,KAAK,OAAO;AAAA,IACd,SAAS,KAAK,OAAO,EAAE,aAAa,2CAAkB,CAAC;AAAA,IACvD,QAAQ,KAAK,OAAO,EAAE,aAAa,iDAAwB,CAAC;AAAA,IAC5D,SAAS,KAAK,OAAO,KAAK,OAAO,GAAG,KAAK,IAAI,GAAG,EAAE,aAAa,iEAAyB,CAAC;AAAA,IACzF,SAAS,KAAK,OAAO,EAAE,aAAa,4BAAQ,CAAC;AAAA,EACjD,CAAC;AAAA,EACD,UAAU,KAAK,MAAM;AAAA,IACjB;AAAA,IACA,KAAK,OAAO;AAAA,MACR,OAAO,KAAK,OAAO;AAAA,IACvB,CAAC;AAAA,EACL,CAAC;AACL;","names":[]}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import * as _sinclair_typebox from '@sinclair/typebox';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* POST /_cms/values/:labelId - 라벨 값 저장
|
|
5
|
+
* - version: null → Draft 저장 (덮어쓰기)
|
|
6
|
+
* - version: number → Published 버전 생성 (불변)
|
|
7
|
+
*/
|
|
8
|
+
declare const saveValuesContract: {
|
|
9
|
+
readonly method: "POST";
|
|
10
|
+
readonly path: "/_cms/values/:labelId";
|
|
11
|
+
readonly params: _sinclair_typebox.TObject<{
|
|
12
|
+
labelId: _sinclair_typebox.TString;
|
|
13
|
+
}>;
|
|
14
|
+
readonly body: _sinclair_typebox.TObject<{
|
|
15
|
+
version: _sinclair_typebox.TUnion<[_sinclair_typebox.TNull, _sinclair_typebox.TNumber]>;
|
|
16
|
+
values: _sinclair_typebox.TArray<_sinclair_typebox.TObject<{
|
|
17
|
+
locale: _sinclair_typebox.TString;
|
|
18
|
+
breakpoint: _sinclair_typebox.TOptional<_sinclair_typebox.TUnion<[_sinclair_typebox.TLiteral<"sm">, _sinclair_typebox.TLiteral<"md">, _sinclair_typebox.TLiteral<"lg">, _sinclair_typebox.TLiteral<"xl">, _sinclair_typebox.TLiteral<"2xl">, _sinclair_typebox.TNull]>>;
|
|
19
|
+
value: _sinclair_typebox.TObject<{
|
|
20
|
+
type: _sinclair_typebox.TUnion<[_sinclair_typebox.TLiteral<"text">, _sinclair_typebox.TLiteral<"image">, _sinclair_typebox.TLiteral<"video">, _sinclair_typebox.TLiteral<"file">, _sinclair_typebox.TLiteral<"object">]>;
|
|
21
|
+
content: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
|
|
22
|
+
url: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
|
|
23
|
+
alt: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
|
|
24
|
+
width: _sinclair_typebox.TOptional<_sinclair_typebox.TNumber>;
|
|
25
|
+
height: _sinclair_typebox.TOptional<_sinclair_typebox.TNumber>;
|
|
26
|
+
thumbnail: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
|
|
27
|
+
duration: _sinclair_typebox.TOptional<_sinclair_typebox.TNumber>;
|
|
28
|
+
filename: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
|
|
29
|
+
size: _sinclair_typebox.TOptional<_sinclair_typebox.TNumber>;
|
|
30
|
+
fields: _sinclair_typebox.TOptional<_sinclair_typebox.TAny>;
|
|
31
|
+
}>;
|
|
32
|
+
}>>;
|
|
33
|
+
}>;
|
|
34
|
+
readonly response: _sinclair_typebox.TUnion<[_sinclair_typebox.TObject<{
|
|
35
|
+
success: _sinclair_typebox.TBoolean;
|
|
36
|
+
saved: _sinclair_typebox.TNumber;
|
|
37
|
+
version: _sinclair_typebox.TUnion<[_sinclair_typebox.TNull, _sinclair_typebox.TNumber]>;
|
|
38
|
+
}>, _sinclair_typebox.TObject<{
|
|
39
|
+
error: _sinclair_typebox.TString;
|
|
40
|
+
}>]>;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* GET /_cms/values/:labelId/:version - 특정 버전의 값 조회
|
|
44
|
+
*/
|
|
45
|
+
declare const getValuesContract: {
|
|
46
|
+
readonly method: "GET";
|
|
47
|
+
readonly path: "/_cms/values/:labelId/:version";
|
|
48
|
+
readonly params: _sinclair_typebox.TObject<{
|
|
49
|
+
labelId: _sinclair_typebox.TString;
|
|
50
|
+
version: _sinclair_typebox.TString;
|
|
51
|
+
}>;
|
|
52
|
+
readonly query: _sinclair_typebox.TObject<{
|
|
53
|
+
locale: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
|
|
54
|
+
breakpoint: _sinclair_typebox.TOptional<_sinclair_typebox.TString>;
|
|
55
|
+
}>;
|
|
56
|
+
readonly response: _sinclair_typebox.TUnion<[_sinclair_typebox.TObject<{
|
|
57
|
+
labelId: _sinclair_typebox.TNumber;
|
|
58
|
+
version: _sinclair_typebox.TNumber;
|
|
59
|
+
values: _sinclair_typebox.TArray<_sinclair_typebox.TObject<{
|
|
60
|
+
id: _sinclair_typebox.TNumber;
|
|
61
|
+
locale: _sinclair_typebox.TString;
|
|
62
|
+
breakpoint: _sinclair_typebox.TUnion<[_sinclair_typebox.TString, _sinclair_typebox.TNull]>;
|
|
63
|
+
value: _sinclair_typebox.TAny;
|
|
64
|
+
createdAt: _sinclair_typebox.TString;
|
|
65
|
+
}>>;
|
|
66
|
+
}>, _sinclair_typebox.TObject<{
|
|
67
|
+
error: _sinclair_typebox.TString;
|
|
68
|
+
}>]>;
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export { getValuesContract, saveValuesContract };
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// src/lib/contracts/values.ts
|
|
2
|
+
import { Type } from "@sinclair/typebox";
|
|
3
|
+
var LabelValueSchema = Type.Object({
|
|
4
|
+
type: Type.Union([
|
|
5
|
+
Type.Literal("text"),
|
|
6
|
+
Type.Literal("image"),
|
|
7
|
+
Type.Literal("video"),
|
|
8
|
+
Type.Literal("file"),
|
|
9
|
+
Type.Literal("object")
|
|
10
|
+
]),
|
|
11
|
+
content: Type.Optional(Type.String()),
|
|
12
|
+
// text type
|
|
13
|
+
url: Type.Optional(Type.String()),
|
|
14
|
+
// image, video, file types (required for these types but optional in schema)
|
|
15
|
+
alt: Type.Optional(Type.String()),
|
|
16
|
+
// image type
|
|
17
|
+
width: Type.Optional(Type.Number()),
|
|
18
|
+
// image type
|
|
19
|
+
height: Type.Optional(Type.Number()),
|
|
20
|
+
// image type
|
|
21
|
+
thumbnail: Type.Optional(Type.String()),
|
|
22
|
+
// video type
|
|
23
|
+
duration: Type.Optional(Type.Number()),
|
|
24
|
+
// video type
|
|
25
|
+
filename: Type.Optional(Type.String()),
|
|
26
|
+
// file type
|
|
27
|
+
size: Type.Optional(Type.Number()),
|
|
28
|
+
// file type
|
|
29
|
+
fields: Type.Optional(Type.Any())
|
|
30
|
+
// object type - recursive structure
|
|
31
|
+
});
|
|
32
|
+
var saveValuesContract = {
|
|
33
|
+
method: "POST",
|
|
34
|
+
path: "/_cms/values/:labelId",
|
|
35
|
+
params: Type.Object({
|
|
36
|
+
labelId: Type.String({ description: "\uB77C\uBCA8 ID" })
|
|
37
|
+
}),
|
|
38
|
+
body: Type.Object({
|
|
39
|
+
version: Type.Union([
|
|
40
|
+
Type.Null({ description: "Draft \uC800\uC7A5 (\uB36E\uC5B4\uC4F0\uAE30)" }),
|
|
41
|
+
Type.Number({ description: "\uBC84\uC804 \uBC88\uD638 (\uBD88\uBCC0)", minimum: 1 })
|
|
42
|
+
]),
|
|
43
|
+
values: Type.Array(
|
|
44
|
+
Type.Object({
|
|
45
|
+
locale: Type.String({ description: "\uC5B8\uC5B4 \uCF54\uB4DC (ko, en, ja)", default: "ko" }),
|
|
46
|
+
breakpoint: Type.Optional(Type.Union([
|
|
47
|
+
Type.Literal("sm"),
|
|
48
|
+
Type.Literal("md"),
|
|
49
|
+
Type.Literal("lg"),
|
|
50
|
+
Type.Literal("xl"),
|
|
51
|
+
Type.Literal("2xl"),
|
|
52
|
+
Type.Null()
|
|
53
|
+
], { description: "\uBC18\uC751\uD615 \uBE0C\uB808\uC774\uD06C\uD3EC\uC778\uD2B8" })),
|
|
54
|
+
value: LabelValueSchema
|
|
55
|
+
// 모든 라벨 값은 객체 형태 (type 필드 필수)
|
|
56
|
+
})
|
|
57
|
+
)
|
|
58
|
+
}),
|
|
59
|
+
response: Type.Union([
|
|
60
|
+
Type.Object({
|
|
61
|
+
success: Type.Boolean(),
|
|
62
|
+
saved: Type.Number(),
|
|
63
|
+
version: Type.Union([Type.Null(), Type.Number()])
|
|
64
|
+
}),
|
|
65
|
+
Type.Object({
|
|
66
|
+
error: Type.String()
|
|
67
|
+
})
|
|
68
|
+
])
|
|
69
|
+
};
|
|
70
|
+
var getValuesContract = {
|
|
71
|
+
method: "GET",
|
|
72
|
+
path: "/_cms/values/:labelId/:version",
|
|
73
|
+
params: Type.Object({
|
|
74
|
+
labelId: Type.String({ description: "\uB77C\uBCA8 ID" }),
|
|
75
|
+
version: Type.String({ description: "\uBC84\uC804 \uBC88\uD638" })
|
|
76
|
+
}),
|
|
77
|
+
query: Type.Object({
|
|
78
|
+
locale: Type.Optional(Type.String({ description: "\uC5B8\uC5B4 \uCF54\uB4DC (ko, en, ja)" })),
|
|
79
|
+
breakpoint: Type.Optional(Type.String({ description: "\uBC18\uC751\uD615 \uBE0C\uB808\uC774\uD06C\uD3EC\uC778\uD2B8" }))
|
|
80
|
+
}),
|
|
81
|
+
response: Type.Union([
|
|
82
|
+
Type.Object({
|
|
83
|
+
labelId: Type.Number(),
|
|
84
|
+
version: Type.Number(),
|
|
85
|
+
values: Type.Array(
|
|
86
|
+
Type.Object({
|
|
87
|
+
id: Type.Number(),
|
|
88
|
+
locale: Type.String(),
|
|
89
|
+
breakpoint: Type.Union([Type.String(), Type.Null()]),
|
|
90
|
+
value: Type.Any(),
|
|
91
|
+
createdAt: Type.String()
|
|
92
|
+
})
|
|
93
|
+
)
|
|
94
|
+
}),
|
|
95
|
+
Type.Object({
|
|
96
|
+
error: Type.String()
|
|
97
|
+
})
|
|
98
|
+
])
|
|
99
|
+
};
|
|
100
|
+
export {
|
|
101
|
+
getValuesContract,
|
|
102
|
+
saveValuesContract
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/contracts/values.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { RouteContract } from '@spfn/core/route';\n\n/**\n * Label Value 타입 정의\n * 모든 타입은 반드시 객체 형태로 저장되어야 함\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 (required for these types but optional in schema)\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 // 모든 라벨 값은 객체 형태 (type 필드 필수)\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":[]}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Locale Constants
|
|
3
|
+
*
|
|
4
|
+
* Server/Client 양쪽에서 사용 가능한 locale 관련 상수
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* Locale 쿠키 키
|
|
8
|
+
*/
|
|
9
|
+
declare const LOCALE_COOKIE_KEY = "spfn-locale";
|
|
10
|
+
/**
|
|
11
|
+
* 지원하는 Locale 타입 (Type-safe)
|
|
12
|
+
*/
|
|
13
|
+
type SupportedLocale = 'ko' | 'ja' | 'zh' | 'zh-TW' | 'zh-HK' | 'hi' | 'th' | 'vi' | 'id' | 'ms' | 'en' | 'en-GB' | 'en-CA' | 'en-AU' | 'en-NZ' | 'es' | 'es-MX' | 'es-AR' | 'es-CO' | 'fr' | 'de' | 'it' | 'pt' | 'nl' | 'sv' | 'no' | 'da' | 'fi' | 'ru' | 'pl' | 'uk' | 'cs' | 'hu' | 'ro' | 'bg' | 'hr' | 'sr' | 'sk' | 'sl' | 'lt' | 'lv' | 'et' | 'el' | 'tr' | 'ar' | 'fa' | 'he' | 'sw';
|
|
14
|
+
/**
|
|
15
|
+
* 국가/지역 정보 타입
|
|
16
|
+
*/
|
|
17
|
+
interface LocaleInfo {
|
|
18
|
+
/** Locale 코드 (ISO 639-1) */
|
|
19
|
+
locale: SupportedLocale;
|
|
20
|
+
/** 국가 코드 (ISO 3166-1 alpha-2) */
|
|
21
|
+
countryCode: string;
|
|
22
|
+
/** 국기 이모지 (HTML/React용) */
|
|
23
|
+
flag: string;
|
|
24
|
+
/** 전화번호 국가 코드 */
|
|
25
|
+
dialCode: string;
|
|
26
|
+
/** 네이티브 이름 (현지어) */
|
|
27
|
+
nativeName: string;
|
|
28
|
+
/** 영어 이름 */
|
|
29
|
+
englishName: string;
|
|
30
|
+
/** RTL (Right-to-Left) 여부 */
|
|
31
|
+
rtl?: boolean;
|
|
32
|
+
/** 통화 코드 (ISO 4217) */
|
|
33
|
+
currencyCode?: string;
|
|
34
|
+
/** 날짜 형식 예시 */
|
|
35
|
+
dateFormat?: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* 사전 정의된 Locale 정보 맵
|
|
39
|
+
*
|
|
40
|
+
* 주요 언어/국가 정보를 포함합니다.
|
|
41
|
+
* 프로젝트에 맞게 추가/수정 가능합니다.
|
|
42
|
+
*/
|
|
43
|
+
declare const LOCALE_INFO_MAP: Record<SupportedLocale, LocaleInfo>;
|
|
44
|
+
/**
|
|
45
|
+
* Locale 정보 가져오기
|
|
46
|
+
*
|
|
47
|
+
* @param locale - Locale 코드 (예: 'ko', 'en', 'ja')
|
|
48
|
+
* @returns LocaleInfo 또는 undefined
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* ```typescript
|
|
52
|
+
* const koInfo = getLocaleInfo('ko');
|
|
53
|
+
* console.log(koInfo.flag); // 🇰🇷
|
|
54
|
+
* console.log(koInfo.dialCode); // +82
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
declare function getLocaleInfo(locale: string): LocaleInfo | undefined;
|
|
58
|
+
/**
|
|
59
|
+
* 시스템이 지원 가능한 모든 Locale 목록 가져오기
|
|
60
|
+
*
|
|
61
|
+
* @returns Locale 코드 배열 (50+ locales available)
|
|
62
|
+
*/
|
|
63
|
+
declare function getAllLocales(): SupportedLocale[];
|
|
64
|
+
/**
|
|
65
|
+
* @deprecated Use getAllLocales() instead
|
|
66
|
+
*/
|
|
67
|
+
declare function getSupportedLocales(): SupportedLocale[];
|
|
68
|
+
/**
|
|
69
|
+
* 국기 이모지만 가져오기
|
|
70
|
+
*
|
|
71
|
+
* @param locale - Locale 코드
|
|
72
|
+
* @returns 국기 이모지 또는 빈 문자열
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* ```typescript
|
|
76
|
+
* getFlag('ko'); // 🇰🇷
|
|
77
|
+
* getFlag('en'); // 🇺🇸
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
declare function getFlag(locale: string): string;
|
|
81
|
+
/**
|
|
82
|
+
* 전화번호 국가 코드 가져오기
|
|
83
|
+
*
|
|
84
|
+
* @param locale - Locale 코드
|
|
85
|
+
* @returns 전화번호 코드 또는 빈 문자열
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* getDialCode('ko'); // +82
|
|
90
|
+
* getDialCode('en'); // +1
|
|
91
|
+
* ```
|
|
92
|
+
*/
|
|
93
|
+
declare function getDialCode(locale: string): string;
|
|
94
|
+
/**
|
|
95
|
+
* RTL (Right-to-Left) 여부 확인
|
|
96
|
+
*
|
|
97
|
+
* @param locale - Locale 코드
|
|
98
|
+
* @returns RTL 여부
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```typescript
|
|
102
|
+
* isRTL('ar'); // true (Arabic)
|
|
103
|
+
* isRTL('ko'); // false (Korean)
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
declare function isRTL(locale: string): boolean;
|
|
107
|
+
|
|
108
|
+
export { LOCALE_COOKIE_KEY as L, type SupportedLocale as S, getAllLocales as a, getSupportedLocales as b, getFlag as c, getDialCode as d, LOCALE_INFO_MAP as e, type LocaleInfo as f, getLocaleInfo as g, isRTL as i };
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* CMS Audit Logs Entity
|
|
3
5
|
*
|
|
@@ -7,11 +9,11 @@
|
|
|
7
9
|
* - 무엇을 (action, changes)
|
|
8
10
|
* - 왜 (metadata)
|
|
9
11
|
*/
|
|
10
|
-
|
|
12
|
+
declare const cmsAuditLogs: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
11
13
|
name: "audit_logs";
|
|
12
14
|
schema: string;
|
|
13
15
|
columns: {
|
|
14
|
-
id:
|
|
16
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
15
17
|
name: "id";
|
|
16
18
|
tableName: "audit_logs";
|
|
17
19
|
dataType: "number";
|
|
@@ -28,7 +30,7 @@ export declare const cmsAuditLogs: import("drizzle-orm/pg-core").PgTableWithColu
|
|
|
28
30
|
identity: undefined;
|
|
29
31
|
generated: undefined;
|
|
30
32
|
}, {}, {}>;
|
|
31
|
-
labelId:
|
|
33
|
+
labelId: drizzle_orm_pg_core.PgColumn<{
|
|
32
34
|
name: "label_id";
|
|
33
35
|
tableName: "audit_logs";
|
|
34
36
|
dataType: "number";
|
|
@@ -45,7 +47,7 @@ export declare const cmsAuditLogs: import("drizzle-orm/pg-core").PgTableWithColu
|
|
|
45
47
|
identity: undefined;
|
|
46
48
|
generated: undefined;
|
|
47
49
|
}, {}, {}>;
|
|
48
|
-
action:
|
|
50
|
+
action: drizzle_orm_pg_core.PgColumn<{
|
|
49
51
|
name: "action";
|
|
50
52
|
tableName: "audit_logs";
|
|
51
53
|
dataType: "string";
|
|
@@ -62,7 +64,7 @@ export declare const cmsAuditLogs: import("drizzle-orm/pg-core").PgTableWithColu
|
|
|
62
64
|
identity: undefined;
|
|
63
65
|
generated: undefined;
|
|
64
66
|
}, {}, {}>;
|
|
65
|
-
userId:
|
|
67
|
+
userId: drizzle_orm_pg_core.PgColumn<{
|
|
66
68
|
name: "user_id";
|
|
67
69
|
tableName: "audit_logs";
|
|
68
70
|
dataType: "string";
|
|
@@ -79,7 +81,7 @@ export declare const cmsAuditLogs: import("drizzle-orm/pg-core").PgTableWithColu
|
|
|
79
81
|
identity: undefined;
|
|
80
82
|
generated: undefined;
|
|
81
83
|
}, {}, {}>;
|
|
82
|
-
userName:
|
|
84
|
+
userName: drizzle_orm_pg_core.PgColumn<{
|
|
83
85
|
name: "user_name";
|
|
84
86
|
tableName: "audit_logs";
|
|
85
87
|
dataType: "string";
|
|
@@ -96,7 +98,7 @@ export declare const cmsAuditLogs: import("drizzle-orm/pg-core").PgTableWithColu
|
|
|
96
98
|
identity: undefined;
|
|
97
99
|
generated: undefined;
|
|
98
100
|
}, {}, {}>;
|
|
99
|
-
changes:
|
|
101
|
+
changes: drizzle_orm_pg_core.PgColumn<{
|
|
100
102
|
name: "changes";
|
|
101
103
|
tableName: "audit_logs";
|
|
102
104
|
dataType: "json";
|
|
@@ -113,7 +115,7 @@ export declare const cmsAuditLogs: import("drizzle-orm/pg-core").PgTableWithColu
|
|
|
113
115
|
identity: undefined;
|
|
114
116
|
generated: undefined;
|
|
115
117
|
}, {}, {}>;
|
|
116
|
-
metadata:
|
|
118
|
+
metadata: drizzle_orm_pg_core.PgColumn<{
|
|
117
119
|
name: "metadata";
|
|
118
120
|
tableName: "audit_logs";
|
|
119
121
|
dataType: "json";
|
|
@@ -130,7 +132,7 @@ export declare const cmsAuditLogs: import("drizzle-orm/pg-core").PgTableWithColu
|
|
|
130
132
|
identity: undefined;
|
|
131
133
|
generated: undefined;
|
|
132
134
|
}, {}, {}>;
|
|
133
|
-
createdAt:
|
|
135
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
134
136
|
name: "created_at";
|
|
135
137
|
tableName: "audit_logs";
|
|
136
138
|
dataType: "date";
|
|
@@ -150,64 +152,7 @@ export declare const cmsAuditLogs: import("drizzle-orm/pg-core").PgTableWithColu
|
|
|
150
152
|
};
|
|
151
153
|
dialect: "pg";
|
|
152
154
|
}>;
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
*
|
|
158
|
-
* // 라벨 생성 로그
|
|
159
|
-
* await db.insert(cmsAuditLogs).values({
|
|
160
|
-
* labelId: 1,
|
|
161
|
-
* action: 'create',
|
|
162
|
-
* userId: 'user123',
|
|
163
|
-
* userName: '김철수',
|
|
164
|
-
* changes: {
|
|
165
|
-
* before: null,
|
|
166
|
-
* after: {
|
|
167
|
-
* key: 'home.hero.title',
|
|
168
|
-
* section: 'home',
|
|
169
|
-
* type: 'text'
|
|
170
|
-
* }
|
|
171
|
-
* },
|
|
172
|
-
* metadata: {
|
|
173
|
-
* ip: '192.168.1.1',
|
|
174
|
-
* userAgent: 'Mozilla/5.0...'
|
|
175
|
-
* }
|
|
176
|
-
* });
|
|
177
|
-
*
|
|
178
|
-
* // 발행 로그
|
|
179
|
-
* await db.insert(cmsAuditLogs).values({
|
|
180
|
-
* labelId: 1,
|
|
181
|
-
* action: 'publish',
|
|
182
|
-
* userId: 'admin123',
|
|
183
|
-
* userName: '관리자',
|
|
184
|
-
* changes: {
|
|
185
|
-
* before: { status: 'draft', publishedVersion: null },
|
|
186
|
-
* after: { status: 'published', publishedVersion: 2 }
|
|
187
|
-
* },
|
|
188
|
-
* metadata: {
|
|
189
|
-
* version: 2,
|
|
190
|
-
* notes: '신규 브랜딩 적용'
|
|
191
|
-
* }
|
|
192
|
-
* });
|
|
193
|
-
*
|
|
194
|
-
* // 라벨별 이력 조회
|
|
195
|
-
* const logs = await db.select()
|
|
196
|
-
* .from(cmsAuditLogs)
|
|
197
|
-
* .where(eq(cmsAuditLogs.labelId, 1))
|
|
198
|
-
* .orderBy(desc(cmsAuditLogs.createdAt))
|
|
199
|
-
* .limit(20);
|
|
200
|
-
*
|
|
201
|
-
* // 사용자별 활동 조회
|
|
202
|
-
* const userActivity = await db.select()
|
|
203
|
-
* .from(cmsAuditLogs)
|
|
204
|
-
* .where(eq(cmsAuditLogs.userId, 'user123'))
|
|
205
|
-
* .orderBy(desc(cmsAuditLogs.createdAt));
|
|
206
|
-
*
|
|
207
|
-
* // 최근 24시간 변경 이력
|
|
208
|
-
* const recent = await db.select()
|
|
209
|
-
* .from(cmsAuditLogs)
|
|
210
|
-
* .where(gte(cmsAuditLogs.createdAt, new Date(Date.now() - 24 * 60 * 60 * 1000)))
|
|
211
|
-
* .orderBy(desc(cmsAuditLogs.createdAt));
|
|
212
|
-
*/
|
|
213
|
-
//# sourceMappingURL=cms-audit-logs.d.ts.map
|
|
155
|
+
type CmsAuditLog = typeof cmsAuditLogs.$inferSelect;
|
|
156
|
+
type NewCmsAuditLog = typeof cmsAuditLogs.$inferInsert;
|
|
157
|
+
|
|
158
|
+
export { type CmsAuditLog, type NewCmsAuditLog, cmsAuditLogs };
|