@spfn/cms 0.1.0-alpha.9 → 0.2.0-beta.2
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 +320 -359
- package/dist/actions.d.ts +12 -6
- package/dist/actions.js +25 -10
- package/dist/actions.js.map +1 -1
- package/dist/config.d.ts +39 -0
- package/dist/config.js +39 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +149 -0
- package/dist/errors.js +164 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +138 -20
- package/dist/index.js +212 -23
- package/dist/index.js.map +1 -1
- package/dist/server.d.ts +44 -81
- package/dist/server.js +610 -256
- package/dist/server.js.map +1 -1
- package/migrations/0000_medical_ozymandias.sql +54 -0
- package/migrations/meta/0000_snapshot.json +336 -0
- package/migrations/meta/_journal.json +13 -0
- package/package.json +54 -44
- package/dist/actions.d.ts.map +0 -1
- package/dist/client.d.ts +0 -138
- package/dist/client.d.ts.map +0 -1
- package/dist/client.js +0 -62
- package/dist/client.js.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 +0 -213
- 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 +0 -188
- 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 +0 -192
- 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 +0 -189
- 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 +0 -199
- 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 +0 -132
- package/dist/helpers/locale.actions.d.ts.map +0 -1
- package/dist/helpers/locale.actions.js +0 -210
- package/dist/helpers/locale.actions.js.map +0 -1
- package/dist/helpers/locale.constants.d.ts +0 -10
- package/dist/helpers/locale.constants.d.ts.map +0 -1
- package/dist/helpers/locale.constants.js +0 -10
- package/dist/helpers/locale.constants.js.map +0 -1
- package/dist/helpers/locale.d.ts +0 -17
- package/dist/helpers/locale.d.ts.map +0 -1
- package/dist/helpers/locale.js +0 -20
- package/dist/helpers/locale.js.map +0 -1
- package/dist/helpers/sync.d.ts +0 -41
- package/dist/helpers/sync.d.ts.map +0 -1
- package/dist/helpers/sync.js +0 -309
- package/dist/helpers/sync.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/init.d.ts +0 -31
- package/dist/init.d.ts.map +0 -1
- package/dist/init.js +0 -36
- package/dist/init.js.map +0 -1
- package/dist/labels/helpers.d.ts +0 -31
- package/dist/labels/helpers.d.ts.map +0 -1
- package/dist/labels/helpers.js +0 -60
- package/dist/labels/helpers.js.map +0 -1
- package/dist/labels/index.d.ts +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 +0 -10
- 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 +0 -74
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -7
- package/dist/types.js.map +0 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spfn/cms",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0-beta.2",
|
|
4
4
|
"description": "SPFN CMS - Content Management System with type-safe labels and Next.js integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -8,47 +8,33 @@
|
|
|
8
8
|
"exports": {
|
|
9
9
|
".": {
|
|
10
10
|
"types": "./dist/index.d.ts",
|
|
11
|
-
"import": "./dist/index.js"
|
|
11
|
+
"import": "./dist/index.js",
|
|
12
|
+
"require": "./dist/index.js"
|
|
12
13
|
},
|
|
13
|
-
"./
|
|
14
|
-
"types": "./dist/
|
|
15
|
-
"import": "./dist/
|
|
16
|
-
|
|
17
|
-
"./client": {
|
|
18
|
-
"types": "./dist/client.d.ts",
|
|
19
|
-
"import": "./dist/client.js"
|
|
14
|
+
"./config": {
|
|
15
|
+
"types": "./dist/config.d.ts",
|
|
16
|
+
"import": "./dist/config.js",
|
|
17
|
+
"require": "./dist/config.js"
|
|
20
18
|
},
|
|
21
19
|
"./actions": {
|
|
22
20
|
"types": "./dist/actions.d.ts",
|
|
23
|
-
"import": "./dist/actions.js"
|
|
24
|
-
|
|
25
|
-
"./store": {
|
|
26
|
-
"types": "./dist/store.d.ts",
|
|
27
|
-
"import": "./dist/store.js"
|
|
28
|
-
},
|
|
29
|
-
"./types": {
|
|
30
|
-
"types": "./dist/types.d.ts",
|
|
31
|
-
"import": "./dist/types.js"
|
|
21
|
+
"import": "./dist/actions.js",
|
|
22
|
+
"require": "./dist/actions.js"
|
|
32
23
|
},
|
|
33
|
-
"./
|
|
34
|
-
"types": "./dist/
|
|
35
|
-
"import": "./dist/
|
|
36
|
-
|
|
37
|
-
"./generators": {
|
|
38
|
-
"types": "./dist/generators/index.d.ts",
|
|
39
|
-
"import": "./dist/generators/index.js"
|
|
40
|
-
},
|
|
41
|
-
"./codegen/generators": {
|
|
42
|
-
"types": "./dist/generators/index.d.ts",
|
|
43
|
-
"import": "./dist/generators/index.js"
|
|
24
|
+
"./server": {
|
|
25
|
+
"types": "./dist/server.d.ts",
|
|
26
|
+
"import": "./dist/server.js",
|
|
27
|
+
"require": "./dist/server.js"
|
|
44
28
|
},
|
|
45
|
-
"./
|
|
46
|
-
"types": "./dist/
|
|
47
|
-
"import": "./dist/
|
|
29
|
+
"./errors": {
|
|
30
|
+
"types": "./dist/errors.d.ts",
|
|
31
|
+
"import": "./dist/errors.js",
|
|
32
|
+
"require": "./dist/errors.js"
|
|
48
33
|
}
|
|
49
34
|
},
|
|
50
35
|
"files": [
|
|
51
36
|
"dist",
|
|
37
|
+
"migrations",
|
|
52
38
|
"README.md"
|
|
53
39
|
],
|
|
54
40
|
"keywords": [
|
|
@@ -67,35 +53,59 @@
|
|
|
67
53
|
"directory": "packages/cms"
|
|
68
54
|
},
|
|
69
55
|
"spfn": {
|
|
56
|
+
"prefix": "/_cms",
|
|
70
57
|
"schemas": [
|
|
71
|
-
"./dist/entities/*.js"
|
|
58
|
+
"./dist/server/entities/*.js"
|
|
72
59
|
],
|
|
73
60
|
"routes": {
|
|
74
|
-
"
|
|
75
|
-
|
|
61
|
+
"dir": "./dist/server/routes"
|
|
62
|
+
},
|
|
63
|
+
"migrations": {
|
|
64
|
+
"dir": "./migrations"
|
|
76
65
|
},
|
|
77
|
-
"setupMessage": " 📚 Next steps:\n 1. Import CMS components: import { useLabels } from '@spfn/cms'\n 2. View labels in Drizzle Studio: pnpm spfn db studio\n 3. CMS API available at: http://localhost:8790/
|
|
66
|
+
"setupMessage": " 📚 Next steps:\n 1. Import CMS components: import { useLabels } from '@spfn/cms'\n 2. View labels in Drizzle Studio: pnpm spfn db studio\n 3. CMS API available at: http://localhost:8790/_cms\n 4. Learn more: https://github.com/spfnio/spfn"
|
|
78
67
|
},
|
|
79
68
|
"peerDependencies": {
|
|
80
|
-
"drizzle-orm": "^0.44.
|
|
81
|
-
"next": "^15.0.0",
|
|
69
|
+
"drizzle-orm": "^0.44.7",
|
|
70
|
+
"next": "^15.0.0 || ^16.0.0",
|
|
82
71
|
"react": "^18.0.0 || ^19.0.0",
|
|
83
|
-
"@spfn/core": "0.
|
|
72
|
+
"@spfn/core": "0.2.0-beta.1"
|
|
84
73
|
},
|
|
85
74
|
"dependencies": {
|
|
86
75
|
"@sinclair/typebox": "^0.34.0",
|
|
87
76
|
"jiti": "^2.6.1",
|
|
77
|
+
"lodash": "^4.17.21",
|
|
88
78
|
"zustand": "^5.0.8"
|
|
89
79
|
},
|
|
90
80
|
"devDependencies": {
|
|
81
|
+
"@types/lodash": "^4.17.21",
|
|
82
|
+
"@types/node": "^20.11.0",
|
|
91
83
|
"@types/react": "^19",
|
|
84
|
+
"@vitest/coverage-v8": "^4.0.6",
|
|
85
|
+
"drizzle-kit": "^0.31.6",
|
|
92
86
|
"drizzle-typebox": "^0.1.0",
|
|
93
|
-
"
|
|
94
|
-
"
|
|
87
|
+
"glob": "^11.0.3",
|
|
88
|
+
"madge": "^8.0.0",
|
|
89
|
+
"postgres": "^3.4.0",
|
|
90
|
+
"tsup": "^8.5.0",
|
|
91
|
+
"tsx": "^4.20.6",
|
|
92
|
+
"typescript": "^5.3.3",
|
|
93
|
+
"vitest": "^4.0.6",
|
|
94
|
+
"spfn": "0.2.0-beta.1"
|
|
95
95
|
},
|
|
96
96
|
"scripts": {
|
|
97
|
-
"build": "
|
|
98
|
-
"watch": "
|
|
99
|
-
"clean": "rm -rf dist"
|
|
97
|
+
"build": "pnpm check:circular && tsup",
|
|
98
|
+
"watch": "tsup --watch",
|
|
99
|
+
"clean": "rm -rf dist migrations",
|
|
100
|
+
"db:generate": "drizzle-kit generate",
|
|
101
|
+
"codegen": "node ../cli/bin/spfn.js codegen run",
|
|
102
|
+
"rebuild-cache": "tsx src/scripts/rebuild-published-cache.ts",
|
|
103
|
+
"test": "vitest run",
|
|
104
|
+
"test:coverage": "vitest run --coverage",
|
|
105
|
+
"test:routes": "vitest src/server/routes",
|
|
106
|
+
"docker:test:up": "docker compose -f docker-compose.test.yml up -d",
|
|
107
|
+
"docker:test:down": "docker compose -f docker-compose.test.yml down",
|
|
108
|
+
"docker:test:logs": "docker compose -f docker-compose.test.yml logs -f",
|
|
109
|
+
"check:circular": "madge --circular --extensions ts src/"
|
|
100
110
|
}
|
|
101
111
|
}
|
package/dist/actions.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../src/actions.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACH,SAAS,EACT,SAAS,EACT,UAAU,GACb,MAAM,6BAA6B,CAAC;AAGrC,OAAO,EAAE,iBAAiB,EAAE,MAAM,+BAA+B,CAAC"}
|
package/dist/client.d.ts
DELETED
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @spfn/cms/client
|
|
3
|
-
*
|
|
4
|
-
* Client Components Only
|
|
5
|
-
* 클라이언트 컴포넌트 전용 (브라우저에서 실행)
|
|
6
|
-
*/
|
|
7
|
-
import type { InferContract } from '@spfn/core';
|
|
8
|
-
import { getLabelsContract, createLabelContract } from './routes/labels/contract';
|
|
9
|
-
import { getLabelContract, updateLabelContract, deleteLabelContract } from './routes/labels/[id]/contract';
|
|
10
|
-
import { getPublishedCacheContract } from './routes/published-cache/contract';
|
|
11
|
-
/**
|
|
12
|
-
* CMS API Client
|
|
13
|
-
*/
|
|
14
|
-
export declare const cmsApi: {
|
|
15
|
-
/**
|
|
16
|
-
* Labels API
|
|
17
|
-
*/
|
|
18
|
-
readonly labels: {
|
|
19
|
-
/**
|
|
20
|
-
* GET /cms/labels
|
|
21
|
-
* 라벨 목록 조회 (섹션 필터, 페이지네이션)
|
|
22
|
-
*/
|
|
23
|
-
readonly list: (options?: {
|
|
24
|
-
query?: InferContract<typeof getLabelsContract>["query"];
|
|
25
|
-
}) => Promise<{
|
|
26
|
-
limit: number;
|
|
27
|
-
offset: number;
|
|
28
|
-
labels: {
|
|
29
|
-
section: string;
|
|
30
|
-
id: number;
|
|
31
|
-
key: string;
|
|
32
|
-
type: string;
|
|
33
|
-
publishedVersion: number | null;
|
|
34
|
-
createdBy: string | null;
|
|
35
|
-
createdAt: string;
|
|
36
|
-
updatedAt: string;
|
|
37
|
-
}[];
|
|
38
|
-
total: number;
|
|
39
|
-
}>;
|
|
40
|
-
/**
|
|
41
|
-
* GET /cms/labels/:id
|
|
42
|
-
* 특정 라벨 조회
|
|
43
|
-
*/
|
|
44
|
-
readonly getById: (options: {
|
|
45
|
-
params: InferContract<typeof getLabelContract>["params"];
|
|
46
|
-
}) => Promise<{
|
|
47
|
-
section: string;
|
|
48
|
-
id: number;
|
|
49
|
-
key: string;
|
|
50
|
-
type: string;
|
|
51
|
-
publishedVersion: number | null;
|
|
52
|
-
createdBy: string | null;
|
|
53
|
-
createdAt: string;
|
|
54
|
-
updatedAt: string;
|
|
55
|
-
} | {
|
|
56
|
-
error: string;
|
|
57
|
-
}>;
|
|
58
|
-
/**
|
|
59
|
-
* POST /cms/labels
|
|
60
|
-
* 새 라벨 생성
|
|
61
|
-
*/
|
|
62
|
-
readonly create: (options: {
|
|
63
|
-
body: InferContract<typeof createLabelContract>["body"];
|
|
64
|
-
}) => Promise<{
|
|
65
|
-
section: string;
|
|
66
|
-
id: number;
|
|
67
|
-
key: string;
|
|
68
|
-
type: string;
|
|
69
|
-
publishedVersion: number | null;
|
|
70
|
-
createdBy: string | null;
|
|
71
|
-
createdAt: string;
|
|
72
|
-
updatedAt: string;
|
|
73
|
-
} | {
|
|
74
|
-
key?: string | undefined;
|
|
75
|
-
error: string;
|
|
76
|
-
}>;
|
|
77
|
-
/**
|
|
78
|
-
* PATCH /cms/labels/:id
|
|
79
|
-
* 라벨 업데이트
|
|
80
|
-
*/
|
|
81
|
-
readonly update: (options: {
|
|
82
|
-
params: InferContract<typeof updateLabelContract>["params"];
|
|
83
|
-
body: InferContract<typeof updateLabelContract>["body"];
|
|
84
|
-
}) => Promise<{
|
|
85
|
-
section: string;
|
|
86
|
-
id: number;
|
|
87
|
-
key: string;
|
|
88
|
-
type: string;
|
|
89
|
-
publishedVersion: number | null;
|
|
90
|
-
createdBy: string | null;
|
|
91
|
-
createdAt: string;
|
|
92
|
-
updatedAt: string;
|
|
93
|
-
} | {
|
|
94
|
-
error: string;
|
|
95
|
-
}>;
|
|
96
|
-
/**
|
|
97
|
-
* DELETE /cms/labels/:id
|
|
98
|
-
* 라벨 삭제
|
|
99
|
-
*/
|
|
100
|
-
readonly delete: (options: {
|
|
101
|
-
params: InferContract<typeof deleteLabelContract>["params"];
|
|
102
|
-
}) => Promise<{
|
|
103
|
-
id: number;
|
|
104
|
-
success: boolean;
|
|
105
|
-
} | {
|
|
106
|
-
error: string;
|
|
107
|
-
}>;
|
|
108
|
-
};
|
|
109
|
-
/**
|
|
110
|
-
* Published Cache API
|
|
111
|
-
*/
|
|
112
|
-
readonly publishedCache: {
|
|
113
|
-
/**
|
|
114
|
-
* GET /cms/published-cache
|
|
115
|
-
* 발행된 콘텐츠 캐시 조회
|
|
116
|
-
*/
|
|
117
|
-
readonly get: (options: {
|
|
118
|
-
query: InferContract<typeof getPublishedCacheContract>["query"];
|
|
119
|
-
}) => Promise<{
|
|
120
|
-
section: string;
|
|
121
|
-
locale: string;
|
|
122
|
-
content: {
|
|
123
|
-
[x: string]: any;
|
|
124
|
-
};
|
|
125
|
-
version: number;
|
|
126
|
-
publishedAt: string | null;
|
|
127
|
-
}[] | {
|
|
128
|
-
error: string;
|
|
129
|
-
}>;
|
|
130
|
-
};
|
|
131
|
-
};
|
|
132
|
-
/**
|
|
133
|
-
* Type exports
|
|
134
|
-
*/
|
|
135
|
-
export type CmsApi = typeof cmsApi;
|
|
136
|
-
export { useCmsStore, useSection, useSections } from './store';
|
|
137
|
-
export { InitCms } from './init';
|
|
138
|
-
//# sourceMappingURL=client.d.ts.map
|
package/dist/client.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,OAAO,EACH,iBAAiB,EACjB,mBAAmB,EACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACH,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACtB,MAAM,+BAA+B,CAAC;AAGvC,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAE9E;;GAEG;AACH,eAAO,MAAM,MAAM;IACf;;OAEG;;QAEC;;;WAGG;kCACc;YAAE,KAAK,CAAC,EAAE,aAAa,CAAC,OAAO,iBAAiB,CAAC,CAAC,OAAO,CAAC,CAAA;SAAE;;;;;;;;;;;;;;;QAG7E;;;WAGG;oCACgB;YAAE,MAAM,EAAE,aAAa,CAAC,OAAO,gBAAgB,CAAC,CAAC,QAAQ,CAAC,CAAA;SAAE;;;;;;;;;;;;QAG/E;;;WAGG;mCACe;YAAE,IAAI,EAAE,aAAa,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAA;SAAE;;;;;;;;;;;;;QAG7E;;;WAGG;mCACe;YACd,MAAM,EAAE,aAAa,CAAC,OAAO,mBAAmB,CAAC,CAAC,QAAQ,CAAC,CAAC;YAC5D,IAAI,EAAE,aAAa,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;SAC3D;;;;;;;;;;;;QAGD;;;WAGG;mCACe;YAAE,MAAM,EAAE,aAAa,CAAC,OAAO,mBAAmB,CAAC,CAAC,QAAQ,CAAC,CAAA;SAAE;;;;;;;IAIrF;;OAEG;;QAEC;;;WAGG;gCACY;YAAE,KAAK,EAAE,aAAa,CAAC,OAAO,yBAAyB,CAAC,CAAC,OAAO,CAAC,CAAA;SAAE;;;;;;;;;;;;CAGhF,CAAC;AAEX;;GAEG;AACH,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC;AAGnC,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAG/D,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC"}
|
package/dist/client.js
DELETED
|
@@ -1,62 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @spfn/cms/client
|
|
3
|
-
*
|
|
4
|
-
* Client Components Only
|
|
5
|
-
* 클라이언트 컴포넌트 전용 (브라우저에서 실행)
|
|
6
|
-
*/
|
|
7
|
-
import { client } from '@spfn/core/client';
|
|
8
|
-
// Labels
|
|
9
|
-
import { getLabelsContract, createLabelContract } from './routes/labels/contract';
|
|
10
|
-
import { getLabelContract, updateLabelContract, deleteLabelContract } from './routes/labels/[id]/contract';
|
|
11
|
-
// Published Cache
|
|
12
|
-
import { getPublishedCacheContract } from './routes/published-cache/contract';
|
|
13
|
-
/**
|
|
14
|
-
* CMS API Client
|
|
15
|
-
*/
|
|
16
|
-
export const cmsApi = {
|
|
17
|
-
/**
|
|
18
|
-
* Labels API
|
|
19
|
-
*/
|
|
20
|
-
labels: {
|
|
21
|
-
/**
|
|
22
|
-
* GET /cms/labels
|
|
23
|
-
* 라벨 목록 조회 (섹션 필터, 페이지네이션)
|
|
24
|
-
*/
|
|
25
|
-
list: (options) => client.call('/cms/labels', getLabelsContract, options),
|
|
26
|
-
/**
|
|
27
|
-
* GET /cms/labels/:id
|
|
28
|
-
* 특정 라벨 조회
|
|
29
|
-
*/
|
|
30
|
-
getById: (options) => client.call('/cms/labels/:id', getLabelContract, options),
|
|
31
|
-
/**
|
|
32
|
-
* POST /cms/labels
|
|
33
|
-
* 새 라벨 생성
|
|
34
|
-
*/
|
|
35
|
-
create: (options) => client.call('/cms/labels', createLabelContract, options),
|
|
36
|
-
/**
|
|
37
|
-
* PATCH /cms/labels/:id
|
|
38
|
-
* 라벨 업데이트
|
|
39
|
-
*/
|
|
40
|
-
update: (options) => client.call('/cms/labels/:id', updateLabelContract, options),
|
|
41
|
-
/**
|
|
42
|
-
* DELETE /cms/labels/:id
|
|
43
|
-
* 라벨 삭제
|
|
44
|
-
*/
|
|
45
|
-
delete: (options) => client.call('/cms/labels/:id', deleteLabelContract, options),
|
|
46
|
-
},
|
|
47
|
-
/**
|
|
48
|
-
* Published Cache API
|
|
49
|
-
*/
|
|
50
|
-
publishedCache: {
|
|
51
|
-
/**
|
|
52
|
-
* GET /cms/published-cache
|
|
53
|
-
* 발행된 콘텐츠 캐시 조회
|
|
54
|
-
*/
|
|
55
|
-
get: (options) => client.call('/cms/published-cache', getPublishedCacheContract, options),
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
// Client-side Store & Hooks
|
|
59
|
-
export { useCmsStore, useSection, useSections } from './store';
|
|
60
|
-
// Client-side Initializer
|
|
61
|
-
export { InitCms } from './init';
|
|
62
|
-
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAG3C,SAAS;AACT,OAAO,EACH,iBAAiB,EACjB,mBAAmB,EACtB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACH,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,EACtB,MAAM,+BAA+B,CAAC;AAEvC,kBAAkB;AAClB,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAE9E;;GAEG;AACH,MAAM,CAAC,MAAM,MAAM,GAAG;IAClB;;OAEG;IACH,MAAM,EAAE;QACJ;;;WAGG;QACH,IAAI,EAAE,CAAC,OAAsE,EAAE,EAAE,CAC7E,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,iBAAiB,EAAE,OAAO,CAAC;QAE1D;;;WAGG;QACH,OAAO,EAAE,CAAC,OAAqE,EAAE,EAAE,CAC/E,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,gBAAgB,EAAE,OAAO,CAAC;QAE7D;;;WAGG;QACH,MAAM,EAAE,CAAC,OAAoE,EAAE,EAAE,CAC7E,MAAM,CAAC,IAAI,CAAC,aAAa,EAAE,mBAAmB,EAAE,OAAO,CAAC;QAE5D;;;WAGG;QACH,MAAM,EAAE,CAAC,OAGR,EAAE,EAAE,CACD,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,OAAO,CAAC;QAEhE;;;WAGG;QACH,MAAM,EAAE,CAAC,OAAwE,EAAE,EAAE,CACjF,MAAM,CAAC,IAAI,CAAC,iBAAiB,EAAE,mBAAmB,EAAE,OAAO,CAAC;KACnE;IAED;;OAEG;IACH,cAAc,EAAE;QACZ;;;WAGG;QACH,GAAG,EAAE,CAAC,OAA4E,EAAE,EAAE,CAClF,MAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,yBAAyB,EAAE,OAAO,CAAC;KAC9E;CACK,CAAC;AAOX,4BAA4B;AAC5B,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAE/D,0BAA0B;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC"}
|
package/dist/cms.config.d.ts
DELETED
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CMS Configuration Module
|
|
3
|
-
*
|
|
4
|
-
* 환경변수 기반 CMS 설정 관리
|
|
5
|
-
* - SPFN_CMS_DEFAULT_LOCALE: 기본 언어 (기본값: 'ko')
|
|
6
|
-
* - SPFN_CMS_SUPPORTED_LOCALES: 지원 언어 목록, 쉼표로 구분 (기본값: 'ko,en')
|
|
7
|
-
* - SPFN_CMS_DETECT_BROWSER_LANGUAGE: 브라우저 언어 자동 감지 (기본값: 'false')
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* CMS 설정 타입
|
|
11
|
-
*/
|
|
12
|
-
export interface CmsConfig {
|
|
13
|
-
/**
|
|
14
|
-
* 기본 언어 코드
|
|
15
|
-
* @example 'ko', 'en', 'ja'
|
|
16
|
-
*/
|
|
17
|
-
defaultLocale: string;
|
|
18
|
-
/**
|
|
19
|
-
* 지원하는 언어 목록
|
|
20
|
-
* @example ['ko', 'en', 'ja']
|
|
21
|
-
*/
|
|
22
|
-
supportedLocales: string[];
|
|
23
|
-
/**
|
|
24
|
-
* 브라우저 언어 자동 감지 여부
|
|
25
|
-
* @default false
|
|
26
|
-
*/
|
|
27
|
-
detectBrowserLanguage: boolean;
|
|
28
|
-
}
|
|
29
|
-
/**
|
|
30
|
-
* CMS 설정 조회
|
|
31
|
-
*
|
|
32
|
-
* @returns 현재 CMS 설정
|
|
33
|
-
*
|
|
34
|
-
* @example
|
|
35
|
-
* ```tsx
|
|
36
|
-
* import { getCmsConfig } from '@spfn/cms';
|
|
37
|
-
*
|
|
38
|
-
* const config = getCmsConfig();
|
|
39
|
-
* console.log(config.defaultLocale); // 'ko'
|
|
40
|
-
* console.log(config.supportedLocales); // ['ko', 'en']
|
|
41
|
-
* ```
|
|
42
|
-
*/
|
|
43
|
-
export declare function getCmsConfig(): Readonly<CmsConfig>;
|
|
44
|
-
/**
|
|
45
|
-
* CMS 설정 변경 (런타임 오버라이드)
|
|
46
|
-
*
|
|
47
|
-
* 환경변수 설정을 런타임에 오버라이드합니다.
|
|
48
|
-
* 주로 테스트나 특수한 경우에 사용됩니다.
|
|
49
|
-
*
|
|
50
|
-
* @param config - 변경할 설정 (부분 업데이트 가능)
|
|
51
|
-
*
|
|
52
|
-
* @example
|
|
53
|
-
* ```tsx
|
|
54
|
-
* import { configureCms } from '@spfn/cms';
|
|
55
|
-
*
|
|
56
|
-
* // 앱 초기화 시 (선택적)
|
|
57
|
-
* configureCms({
|
|
58
|
-
* defaultLocale: 'en',
|
|
59
|
-
* supportedLocales: ['en', 'ko', 'ja'],
|
|
60
|
-
* detectBrowserLanguage: true,
|
|
61
|
-
* });
|
|
62
|
-
* ```
|
|
63
|
-
*/
|
|
64
|
-
export declare function configureCms(config: Partial<CmsConfig>): void;
|
|
65
|
-
/**
|
|
66
|
-
* 설정 초기화 (환경변수에서 재로드)
|
|
67
|
-
*
|
|
68
|
-
* @example
|
|
69
|
-
* ```tsx
|
|
70
|
-
* import { resetCmsConfig } from '@spfn/cms';
|
|
71
|
-
*
|
|
72
|
-
* // 환경변수 설정으로 되돌리기
|
|
73
|
-
* resetCmsConfig();
|
|
74
|
-
* ```
|
|
75
|
-
*/
|
|
76
|
-
export declare function resetCmsConfig(): void;
|
|
77
|
-
//# sourceMappingURL=cms.config.d.ts.map
|
package/dist/cms.config.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms.config.d.ts","sourceRoot":"","sources":["../src/cms.config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,MAAM,WAAW,SAAS;IAEtB;;;OAGG;IACH,aAAa,EAAE,MAAM,CAAC;IAEtB;;;OAGG;IACH,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAE3B;;;OAGG;IACH,qBAAqB,EAAE,OAAO,CAAC;CAClC;AAoDD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,YAAY,IAAI,QAAQ,CAAC,SAAS,CAAC,CAGlD;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,IAAI,CAiB7D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAGrC"}
|
package/dist/cms.config.js
DELETED
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* CMS Configuration Module
|
|
3
|
-
*
|
|
4
|
-
* 환경변수 기반 CMS 설정 관리
|
|
5
|
-
* - SPFN_CMS_DEFAULT_LOCALE: 기본 언어 (기본값: 'ko')
|
|
6
|
-
* - SPFN_CMS_SUPPORTED_LOCALES: 지원 언어 목록, 쉼표로 구분 (기본값: 'ko,en')
|
|
7
|
-
* - SPFN_CMS_DETECT_BROWSER_LANGUAGE: 브라우저 언어 자동 감지 (기본값: 'false')
|
|
8
|
-
*/
|
|
9
|
-
/**
|
|
10
|
-
* 환경변수 읽기 헬퍼
|
|
11
|
-
*/
|
|
12
|
-
function getEnvVar(key, defaultValue) {
|
|
13
|
-
return process.env[key] || defaultValue;
|
|
14
|
-
}
|
|
15
|
-
/**
|
|
16
|
-
* 환경변수에서 boolean 읽기
|
|
17
|
-
*/
|
|
18
|
-
function getEnvBoolean(key, defaultValue) {
|
|
19
|
-
const value = process.env[key];
|
|
20
|
-
if (value === undefined)
|
|
21
|
-
return defaultValue;
|
|
22
|
-
return value === 'true' || value === '1';
|
|
23
|
-
}
|
|
24
|
-
/**
|
|
25
|
-
* 환경변수에서 설정 로드
|
|
26
|
-
*/
|
|
27
|
-
function loadConfigFromEnv() {
|
|
28
|
-
const defaultLocale = getEnvVar('SPFN_CMS_DEFAULT_LOCALE', 'en');
|
|
29
|
-
const supportedLocalesStr = getEnvVar('SPFN_CMS_SUPPORTED_LOCALES', 'en,ko');
|
|
30
|
-
const detectBrowserLanguage = getEnvBoolean('SPFN_CMS_DETECT_BROWSER_LANGUAGE', true);
|
|
31
|
-
const supportedLocales = supportedLocalesStr
|
|
32
|
-
.split(',')
|
|
33
|
-
.map(locale => locale.trim())
|
|
34
|
-
.filter(locale => locale.length > 0);
|
|
35
|
-
// 기본 언어가 지원 목록에 없으면 추가
|
|
36
|
-
if (!supportedLocales.includes(defaultLocale)) {
|
|
37
|
-
supportedLocales.unshift(defaultLocale);
|
|
38
|
-
}
|
|
39
|
-
return {
|
|
40
|
-
defaultLocale,
|
|
41
|
-
supportedLocales,
|
|
42
|
-
detectBrowserLanguage,
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* 현재 설정 (환경변수에서 초기화)
|
|
47
|
-
*/
|
|
48
|
-
let currentConfig = loadConfigFromEnv();
|
|
49
|
-
/**
|
|
50
|
-
* CMS 설정 조회
|
|
51
|
-
*
|
|
52
|
-
* @returns 현재 CMS 설정
|
|
53
|
-
*
|
|
54
|
-
* @example
|
|
55
|
-
* ```tsx
|
|
56
|
-
* import { getCmsConfig } from '@spfn/cms';
|
|
57
|
-
*
|
|
58
|
-
* const config = getCmsConfig();
|
|
59
|
-
* console.log(config.defaultLocale); // 'ko'
|
|
60
|
-
* console.log(config.supportedLocales); // ['ko', 'en']
|
|
61
|
-
* ```
|
|
62
|
-
*/
|
|
63
|
-
export function getCmsConfig() {
|
|
64
|
-
return currentConfig;
|
|
65
|
-
}
|
|
66
|
-
/**
|
|
67
|
-
* CMS 설정 변경 (런타임 오버라이드)
|
|
68
|
-
*
|
|
69
|
-
* 환경변수 설정을 런타임에 오버라이드합니다.
|
|
70
|
-
* 주로 테스트나 특수한 경우에 사용됩니다.
|
|
71
|
-
*
|
|
72
|
-
* @param config - 변경할 설정 (부분 업데이트 가능)
|
|
73
|
-
*
|
|
74
|
-
* @example
|
|
75
|
-
* ```tsx
|
|
76
|
-
* import { configureCms } from '@spfn/cms';
|
|
77
|
-
*
|
|
78
|
-
* // 앱 초기화 시 (선택적)
|
|
79
|
-
* configureCms({
|
|
80
|
-
* defaultLocale: 'en',
|
|
81
|
-
* supportedLocales: ['en', 'ko', 'ja'],
|
|
82
|
-
* detectBrowserLanguage: true,
|
|
83
|
-
* });
|
|
84
|
-
* ```
|
|
85
|
-
*/
|
|
86
|
-
export function configureCms(config) {
|
|
87
|
-
currentConfig = {
|
|
88
|
-
...currentConfig,
|
|
89
|
-
...config,
|
|
90
|
-
};
|
|
91
|
-
// 기본 언어가 지원 목록에 있는지 확인
|
|
92
|
-
if (config.defaultLocale && !currentConfig.supportedLocales.includes(config.defaultLocale)) {
|
|
93
|
-
console.warn(`[CMS Config] Default locale '${config.defaultLocale}' not in supported locales, adding automatically.`, `Supported locales: [${currentConfig.supportedLocales.join(', ')}]`);
|
|
94
|
-
currentConfig.supportedLocales.unshift(config.defaultLocale);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* 설정 초기화 (환경변수에서 재로드)
|
|
99
|
-
*
|
|
100
|
-
* @example
|
|
101
|
-
* ```tsx
|
|
102
|
-
* import { resetCmsConfig } from '@spfn/cms';
|
|
103
|
-
*
|
|
104
|
-
* // 환경변수 설정으로 되돌리기
|
|
105
|
-
* resetCmsConfig();
|
|
106
|
-
* ```
|
|
107
|
-
*/
|
|
108
|
-
export function resetCmsConfig() {
|
|
109
|
-
currentConfig = loadConfigFromEnv();
|
|
110
|
-
}
|
|
111
|
-
//# sourceMappingURL=cms.config.js.map
|
package/dist/cms.config.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cms.config.js","sourceRoot":"","sources":["../src/cms.config.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA0BH;;GAEG;AACH,SAAS,SAAS,CAAC,GAAW,EAAE,YAAoB;IAEhD,OAAO,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,YAAY,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,GAAW,EAAE,YAAqB;IAErD,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC/B,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC;IAC7C,OAAO,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,GAAG,CAAC;AAC7C,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB;IAEtB,MAAM,aAAa,GAAG,SAAS,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC;IACjE,MAAM,mBAAmB,GAAG,SAAS,CAAC,4BAA4B,EAAE,OAAO,CAAC,CAAC;IAC7E,MAAM,qBAAqB,GAAG,aAAa,CAAC,kCAAkC,EAAE,IAAI,CAAC,CAAC;IAEtF,MAAM,gBAAgB,GAAG,mBAAmB;SACvC,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;SAC5B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAEzC,uBAAuB;IACvB,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,aAAa,CAAC,EAC7C,CAAC;QACG,gBAAgB,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO;QACH,aAAa;QACb,gBAAgB;QAChB,qBAAqB;KACxB,CAAC;AACN,CAAC;AAED;;GAEG;AACH,IAAI,aAAa,GAAc,iBAAiB,EAAE,CAAC;AAEnD;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,YAAY;IAExB,OAAO,aAAa,CAAC;AACzB,CAAC;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,YAAY,CAAC,MAA0B;IAEnD,aAAa,GAAG;QACZ,GAAG,aAAa;QAChB,GAAG,MAAM;KACZ,CAAC;IAEF,uBAAuB;IACvB,IAAI,MAAM,CAAC,aAAa,IAAI,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,CAAC,aAAa,CAAC,EAC1F,CAAC;QACG,OAAO,CAAC,IAAI,CACR,gCAAgC,MAAM,CAAC,aAAa,mDAAmD,EACvG,uBAAuB,aAAa,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACtE,CAAC;QAEF,aAAa,CAAC,gBAAgB,CAAC,OAAO,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACjE,CAAC;AACL,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,UAAU,cAAc;IAE1B,aAAa,GAAG,iBAAiB,EAAE,CAAC;AACxC,CAAC"}
|