@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.
Files changed (171) hide show
  1. package/README.md +320 -359
  2. package/dist/actions.d.ts +12 -6
  3. package/dist/actions.js +25 -10
  4. package/dist/actions.js.map +1 -1
  5. package/dist/config.d.ts +39 -0
  6. package/dist/config.js +39 -0
  7. package/dist/config.js.map +1 -0
  8. package/dist/errors.d.ts +149 -0
  9. package/dist/errors.js +164 -0
  10. package/dist/errors.js.map +1 -0
  11. package/dist/index.d.ts +138 -20
  12. package/dist/index.js +212 -23
  13. package/dist/index.js.map +1 -1
  14. package/dist/server.d.ts +44 -81
  15. package/dist/server.js +610 -256
  16. package/dist/server.js.map +1 -1
  17. package/migrations/0000_medical_ozymandias.sql +54 -0
  18. package/migrations/meta/0000_snapshot.json +336 -0
  19. package/migrations/meta/_journal.json +13 -0
  20. package/package.json +54 -44
  21. package/dist/actions.d.ts.map +0 -1
  22. package/dist/client.d.ts +0 -138
  23. package/dist/client.d.ts.map +0 -1
  24. package/dist/client.js +0 -62
  25. package/dist/client.js.map +0 -1
  26. package/dist/cms.config.d.ts +0 -77
  27. package/dist/cms.config.d.ts.map +0 -1
  28. package/dist/cms.config.js +0 -111
  29. package/dist/cms.config.js.map +0 -1
  30. package/dist/entities/cms-audit-logs.d.ts +0 -213
  31. package/dist/entities/cms-audit-logs.d.ts.map +0 -1
  32. package/dist/entities/cms-audit-logs.js +0 -103
  33. package/dist/entities/cms-audit-logs.js.map +0 -1
  34. package/dist/entities/cms-draft-cache.d.ts +0 -188
  35. package/dist/entities/cms-draft-cache.d.ts.map +0 -1
  36. package/dist/entities/cms-draft-cache.js +0 -112
  37. package/dist/entities/cms-draft-cache.js.map +0 -1
  38. package/dist/entities/cms-label-values.d.ts +0 -192
  39. package/dist/entities/cms-label-values.d.ts.map +0 -1
  40. package/dist/entities/cms-label-values.js +0 -105
  41. package/dist/entities/cms-label-values.js.map +0 -1
  42. package/dist/entities/cms-label-versions.d.ts +0 -207
  43. package/dist/entities/cms-label-versions.d.ts.map +0 -1
  44. package/dist/entities/cms-label-versions.js +0 -80
  45. package/dist/entities/cms-label-versions.js.map +0 -1
  46. package/dist/entities/cms-labels.d.ts +0 -189
  47. package/dist/entities/cms-labels.d.ts.map +0 -1
  48. package/dist/entities/cms-labels.js +0 -48
  49. package/dist/entities/cms-labels.js.map +0 -1
  50. package/dist/entities/cms-published-cache.d.ts +0 -199
  51. package/dist/entities/cms-published-cache.d.ts.map +0 -1
  52. package/dist/entities/cms-published-cache.js +0 -103
  53. package/dist/entities/cms-published-cache.js.map +0 -1
  54. package/dist/entities/index.d.ts +0 -10
  55. package/dist/entities/index.d.ts.map +0 -1
  56. package/dist/entities/index.js +0 -10
  57. package/dist/entities/index.js.map +0 -1
  58. package/dist/generators/index.d.ts +0 -19
  59. package/dist/generators/index.d.ts.map +0 -1
  60. package/dist/generators/index.js +0 -19
  61. package/dist/generators/index.js.map +0 -1
  62. package/dist/generators/label-sync-generator.d.ts +0 -33
  63. package/dist/generators/label-sync-generator.d.ts.map +0 -1
  64. package/dist/generators/label-sync-generator.js +0 -86
  65. package/dist/generators/label-sync-generator.js.map +0 -1
  66. package/dist/helpers/locale.actions.d.ts +0 -132
  67. package/dist/helpers/locale.actions.d.ts.map +0 -1
  68. package/dist/helpers/locale.actions.js +0 -210
  69. package/dist/helpers/locale.actions.js.map +0 -1
  70. package/dist/helpers/locale.constants.d.ts +0 -10
  71. package/dist/helpers/locale.constants.d.ts.map +0 -1
  72. package/dist/helpers/locale.constants.js +0 -10
  73. package/dist/helpers/locale.constants.js.map +0 -1
  74. package/dist/helpers/locale.d.ts +0 -17
  75. package/dist/helpers/locale.d.ts.map +0 -1
  76. package/dist/helpers/locale.js +0 -20
  77. package/dist/helpers/locale.js.map +0 -1
  78. package/dist/helpers/sync.d.ts +0 -41
  79. package/dist/helpers/sync.d.ts.map +0 -1
  80. package/dist/helpers/sync.js +0 -309
  81. package/dist/helpers/sync.js.map +0 -1
  82. package/dist/index.d.ts.map +0 -1
  83. package/dist/init.d.ts +0 -31
  84. package/dist/init.d.ts.map +0 -1
  85. package/dist/init.js +0 -36
  86. package/dist/init.js.map +0 -1
  87. package/dist/labels/helpers.d.ts +0 -31
  88. package/dist/labels/helpers.d.ts.map +0 -1
  89. package/dist/labels/helpers.js +0 -60
  90. package/dist/labels/helpers.js.map +0 -1
  91. package/dist/labels/index.d.ts +0 -7
  92. package/dist/labels/index.d.ts.map +0 -1
  93. package/dist/labels/index.js +0 -7
  94. package/dist/labels/index.js.map +0 -1
  95. package/dist/repositories/cms-draft-cache.repository.d.ts +0 -62
  96. package/dist/repositories/cms-draft-cache.repository.d.ts.map +0 -1
  97. package/dist/repositories/cms-draft-cache.repository.js +0 -56
  98. package/dist/repositories/cms-draft-cache.repository.js.map +0 -1
  99. package/dist/repositories/cms-label-values.repository.d.ts +0 -32
  100. package/dist/repositories/cms-label-values.repository.d.ts.map +0 -1
  101. package/dist/repositories/cms-label-values.repository.js +0 -72
  102. package/dist/repositories/cms-label-values.repository.js.map +0 -1
  103. package/dist/repositories/cms-labels.repository.d.ts +0 -53
  104. package/dist/repositories/cms-labels.repository.d.ts.map +0 -1
  105. package/dist/repositories/cms-labels.repository.js +0 -77
  106. package/dist/repositories/cms-labels.repository.js.map +0 -1
  107. package/dist/repositories/cms-published-cache.repository.d.ts +0 -53
  108. package/dist/repositories/cms-published-cache.repository.d.ts.map +0 -1
  109. package/dist/repositories/cms-published-cache.repository.js +0 -54
  110. package/dist/repositories/cms-published-cache.repository.js.map +0 -1
  111. package/dist/repositories/index.d.ts +0 -8
  112. package/dist/repositories/index.d.ts.map +0 -1
  113. package/dist/repositories/index.js +0 -9
  114. package/dist/repositories/index.js.map +0 -1
  115. package/dist/routes/labels/[id]/contract.d.ts +0 -68
  116. package/dist/routes/labels/[id]/contract.d.ts.map +0 -1
  117. package/dist/routes/labels/[id]/contract.js +0 -84
  118. package/dist/routes/labels/[id]/contract.js.map +0 -1
  119. package/dist/routes/labels/[id]/index.d.ts +0 -10
  120. package/dist/routes/labels/[id]/index.d.ts.map +0 -1
  121. package/dist/routes/labels/[id]/index.js +0 -96
  122. package/dist/routes/labels/[id]/index.js.map +0 -1
  123. package/dist/routes/labels/by-key/[key]/contract.d.ts +0 -24
  124. package/dist/routes/labels/by-key/[key]/contract.d.ts.map +0 -1
  125. package/dist/routes/labels/by-key/[key]/contract.js +0 -28
  126. package/dist/routes/labels/by-key/[key]/contract.js.map +0 -1
  127. package/dist/routes/labels/by-key/[key]/index.d.ts +0 -8
  128. package/dist/routes/labels/by-key/[key]/index.d.ts.map +0 -1
  129. package/dist/routes/labels/by-key/[key]/index.js +0 -32
  130. package/dist/routes/labels/by-key/[key]/index.js.map +0 -1
  131. package/dist/routes/labels/contract.d.ts +0 -59
  132. package/dist/routes/labels/contract.d.ts.map +0 -1
  133. package/dist/routes/labels/contract.js +0 -75
  134. package/dist/routes/labels/contract.js.map +0 -1
  135. package/dist/routes/labels/index.d.ts +0 -10
  136. package/dist/routes/labels/index.d.ts.map +0 -1
  137. package/dist/routes/labels/index.js +0 -73
  138. package/dist/routes/labels/index.js.map +0 -1
  139. package/dist/routes/published-cache/contract.d.ts +0 -25
  140. package/dist/routes/published-cache/contract.d.ts.map +0 -1
  141. package/dist/routes/published-cache/contract.js +0 -35
  142. package/dist/routes/published-cache/contract.js.map +0 -1
  143. package/dist/routes/published-cache/index.d.ts +0 -8
  144. package/dist/routes/published-cache/index.d.ts.map +0 -1
  145. package/dist/routes/published-cache/index.js +0 -33
  146. package/dist/routes/published-cache/index.js.map +0 -1
  147. package/dist/routes/values/[labelId]/[version]/contract.d.ts +0 -29
  148. package/dist/routes/values/[labelId]/[version]/contract.d.ts.map +0 -1
  149. package/dist/routes/values/[labelId]/[version]/contract.js +0 -33
  150. package/dist/routes/values/[labelId]/[version]/contract.js.map +0 -1
  151. package/dist/routes/values/[labelId]/[version]/index.d.ts +0 -8
  152. package/dist/routes/values/[labelId]/[version]/index.d.ts.map +0 -1
  153. package/dist/routes/values/[labelId]/[version]/index.js +0 -45
  154. package/dist/routes/values/[labelId]/[version]/index.js.map +0 -1
  155. package/dist/routes/values/[labelId]/contract.d.ts +0 -38
  156. package/dist/routes/values/[labelId]/contract.d.ts.map +0 -1
  157. package/dist/routes/values/[labelId]/contract.js +0 -59
  158. package/dist/routes/values/[labelId]/contract.js.map +0 -1
  159. package/dist/routes/values/[labelId]/index.d.ts +0 -8
  160. package/dist/routes/values/[labelId]/index.d.ts.map +0 -1
  161. package/dist/routes/values/[labelId]/index.js +0 -42
  162. package/dist/routes/values/[labelId]/index.js.map +0 -1
  163. package/dist/server.d.ts.map +0 -1
  164. package/dist/store.d.ts +0 -87
  165. package/dist/store.d.ts.map +0 -1
  166. package/dist/store.js +0 -205
  167. package/dist/store.js.map +0 -1
  168. package/dist/types.d.ts +0 -74
  169. package/dist/types.d.ts.map +0 -1
  170. package/dist/types.js +0 -7
  171. 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.1.0-alpha.9",
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
- "./server": {
14
- "types": "./dist/server.d.ts",
15
- "import": "./dist/server.js"
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
- "./labels": {
34
- "types": "./dist/labels/index.d.ts",
35
- "import": "./dist/labels/index.js"
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
- "./repositories": {
46
- "types": "./dist/repositories/index.d.ts",
47
- "import": "./dist/repositories/index.js"
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
- "basePath": "/cms",
75
- "dir": "./dist/routes"
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/cms\n 4. Learn more: https://github.com/spfnio/spfn"
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.0",
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.1.0-alpha.53"
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
- "tsup": "^8.3.5",
94
- "typescript": "^5"
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": "tsc",
98
- "watch": "tsc --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
  }
@@ -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
@@ -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
@@ -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"}
@@ -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
@@ -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"}
@@ -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
@@ -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"}